setof(X,P,L)
produces a list (L
) of X
for each possible solution of the goal P
. If P
contains uninstantiated variables, other than X
, it is possible that setof
can be successfully evaluated multiple times - for each possible values of the uninstantiated variables. The elements in L
will appear in sorted order and will not include duplicates. Fails if P
has no solutions.
Examples
z(r).
z(t).
z(y).
x(a,b,c).
x(q,X,e) :- z(X).
x(1,2,3).
x(w,b,c).
x(d,b,c).
x(a,b,c).
?- setof(X,x(X,Y,Z),L).
L = [a,d,w]
X = UNINSTANTIATED VARIABLE
Y = b
Z = c
yes;
L = [q]
X = UNINSTANTIATED VARIABLE
Y = r
Z = e
yes;
L = [q]
X = UNINSTANTIATED VARIABLE
Y = t
Z = e
yes;
L = [q]
X = UNINSTANTIATED VARIABLE
Y = y
Z = e
yes;
L = [1]
X = UNINSTANTIATED VARIABLE
Y = 2
Z = 3
yes
?- setof(X,x(X,y,z),L).
no
?- setof(Y, (member(X,[6,3,7,2,5,4,3]), X<4, Y is X*X), L).
L = [9]
X = 3
Y = UNINSTANTIATED VARIABLE
yes;
L = [4]
X = 2
Y = UNINSTANTIATED VARIABLE
yes
p(a,1).
p(b,2).
p(c,3).
p(d,2).
p(d,2).
?- setof(X, p(X,Y), List).
List = [a]
X = UNINSTANTIATED VARIABLE
Y = 1
yes;
List = [b,d]
X = UNINSTANTIATED VARIABLE
Y = 2
yes;
List = [c]
X = UNINSTANTIATED VARIABLE
Y = 3
yes
TODO setof(X, Y ^ p(X,Y), List)