findall/[3,4] [ISO]findall(+Template, +Generator, -List)
findall(+Template, +Generator, -List, +Remainder)
List is the list of all the instances of Template for which the goal Generator succeeds, appended to Remainder. Remainder defaults to the empty list.
A goal to be proved as if by call/1.
A special case of bagof/3, where all free variables in the
generator are taken to be existentially quantified, as if by means of
the ‘^’ operator. Contrary to bagof/3 and setof/3,
if there are no instances of Template such that
Generator succeeds, then List = Remainder.
Because findall/[3,4] avoids the relatively expensive variable
analysis done by bagof/3, using findall/[3,4] where
appropriate rather than bagof/3 can be considerably more
efficient.
Please note: If the instances being gathered contain
attributed variables (see lib-atts) or suspended goals
(see ref-sem-sec), those variables are replaced by brand new
variables, without attributes, in List. To retain the
attributes, you can use copy_term/3 (see ref-lte-cpt).
bagof/3 can succeed nondeterminately, generating alternative
values for Set corresponding to different instantiations of the
free variables of Generator.
Call errors (see ref-sem-exc).
To illustrate the differences among
findall/3, setof/3, and bagof/3:
| ?- [user].
| foo(1,2).
| foo(1,2).
| foo(2,3).
|
% user compiled in module user, 0.100 sec 352 bytes
yes
| ?- bagof(X, foo(X,Y), L).
Y = 2,
L = [1,1] ? ;
Y = 3,
L = [2] ? ;
no
| ?- bagof(X, Y^foo(X,Y), L).
L = [1,1,2] ? ;
no
| ?- findall(X, foo(X,Y), L).
L = [1,1,2] ? ;
no
| ?- findall(X, foo(X,Y), L, S).
L = [1,1,2|S] ? ;
no
| ?- setof(X, foo(X,Y), L).
X = _3342,
Y = 2,
L = [1] ;
X = _3342,
Y = 3,
L = [2] ;
no
findall/3 is part of the ISO Prolog standard; findall/4 is not.
bagof/3, setof/3, ^/2, ref-all.