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).