11 Finding All Answers
You can collect all of the answers to a query using:
bagof(X,Q,L)
where X is a term made of the free variables in Q. This is true if
L is a non-empty list of the X's for which Q is true. There is an
element of L for each proof of Q. This fails if Q has no answers.
cilog: tell p(a,b).
cilog: tell p(b,c).
cilog: tell p(a,d).
cilog: tell p(e,f).
cilog: tell p(e,d).
cilog: ask bagof(X,p(a,X),L).
Answer: bagof(A, p(a, A), [b, d]).
Note that X can be any term. For example, you could ask for the list of pairs:
cilog: ask bagof(ppair(X,Y),p(X,Y),L).
Answer: bagof(ppair(A, B), p(A, B), [ppair(a, b), ppair(b, c), ppair(a, d), ppair(e, f), ppair(e, d)]).
Q can be any body. For example, continuing our example:
cilog: ask bagof(triple(X,Y,Z),p(X,Y)&p(Y,Z),L).
Answer: bagof(triple(A, B, C), p(A, B)&p(B, C), [triple(a, b, c)]).
Runtime since last report: 0 secs.
[ok,more,how,help]: ok.
cilog: tell p(c,e).
cilog: ask bagof(triple(X,Y,Z),p(X,Y)&p(Y,Z),L).
Answer: bagof(triple(A, B, C), p(A, B)&p(B, C),
[triple(a, b, c), triple(b, c, e), triple(c, e, f), triple(c, e, d)]).
Runtime since last report: 0 secs.
[ok,more,how,help]:
If Q contains a variable that doesn't appear in X, then this
returns a list for each value that has a non-empty list of
solutions. For example,
cilog: ask bagof(X,p(Y,X),L).
Answer: bagof(A, p(b, A), [c]).
Runtime since last report: 0 secs.
[ok,more,how,help]: more.
Answer: bagof(A, p(a, A), [b, d]).
Runtime since last report: 0 secs.
[ok,more,how,help]: more.
Answer: bagof(A, p(e, A), [f, d]).
Runtime since last report: 0 secs.
[ok,more,how,help]: more.
Answer: bagof(A, p(c, A), [e]).
Runtime since last report: 0 secs.
[ok,more,how,help]: more.
No more answers.
Runtime since last report: 0 secs.
cilog:
If you want to ask for the X's for which there exists a Y such
that P(Y,X) (i.e., if you don't want an answer for each Y), you can
use the operator V^
Q which means "there exists a V such that Q
is true". [Note that ^
is only defined in the context of
bagof. It doesn't need to be used elsewhere.]
cilog: ask bagof(X,Y^p(Y,X),L).
Answer: bagof(A, B^p(B, A), [b, c, d, f, d, e]).
Runtime since last report: 0 secs.
[ok,more,how,help]: more.
No more answers.
Runtime since last report: 0 secs.
cilog:
©David
Poole, 1998