The following table illustrates the difference between the all solutions predicates:
built-in choice pts duplicates sorted pruned *
bagof/3 yes yes no no
coverof/3 yes no no yes
findall/3 no yes no no
setof/3 yes no yes no
* prune_instances/2 used on list of solutions.
If Goal is not a callable term, exceptions are raised in call/2.
Note
1. Even if there are uninstantiated variables in Goal which do not appear in Term, then unlike bagof/3, findall/3 has no choice points i.e. these variables are taken to be existentially quantified.
2. findall/3 never fails; if no solution exists, the empty list is returned.
Success:
% all variables are taken to be existentially quantified:
[eclipse]: findall(Name,current_stream(Name,Mode,Num),L),
> writeq((Name,Mode,Num,L)), nl, fail.
_g72 , _g78 , _g84 , [user, user, error, debug_input, null, ""]
no (more) solution.
[eclipse]: [user].
h(f(1,2)).
h(f(1,2)).
h(f(1,X)).
h(f(X,Y)). % instances of this element...
user compiled 476 bytes in 0.00 seconds
yes.
[eclipse]: findall(X,h(X),L).
X = _g58
L = [f(1, 2), f(1,2), f(1, _g116), f(_g100, _g102)]
yes. % ...all bagged; includes duplicates.
[eclipse]: findall(X,current_built_in(X),L).
X = _g58
L = [findall/3, !/0, delayed_goals/1, delayed_goals/2,
'.'/2, (;)/2, (<)/2, (;)/4, (;)/5, error/2, error/3,
(',')/2, (',')/4, close_window/0, (=)/2, op/3, (>)/2,
array/3, (spied)/1, ... / ..., ...]
yes.
[eclipse]: findall(X,append_strings(X,Y,"abc"),L).
X = _g58
Y = _g66
L = ["", "a", "ab", "abc"]
Fail:
findall(Y,current_stream(X,Y,Z),[strin]).
Error:
findall(X,G,L). (Error 4).
findall(X,"G",L). (Error 5).
findall(X,a,L). (Error 68).
findall(X,a(X),L). (Error 68).