| Všetky odpovede Pomocou mechanizmu spätného chodu môžeme po jednom generovať všetky objekty, ktoré spĺňajú určitý ciel. Vždy, keď sa generuje nové riešenie, predchádzajúce sa stratí a nie je už prístupné. Niekedy je však užitočné mat všetky vygenerované objekty prístupné spolu - napr. zozbierané do zoznamu. Na tieto účely sú definované štandardné predikáty  
 predikát zozbiera do zoznamu bez vyradenia duplicitných prvkov všetky inštancie termu 
 to isté ako predikát 
 podobá sa predikátu Uvažujme takýto program: trieda(a, samohlaska). trieda(b, spoluhlaska). trieda(c, spoluhlaska). trieda(d, spoluhlaska). trieda(e, samohlaska). trieda(f, spoluhlaska). A teraz dopyty: ?- bagof(Pismeno, trieda(Pismeno, spoluhlaska), Pismena). Pismena = [b,c,d,f] yes ?- bagof(Pismeno, trieda(Pismeno, Trieda), Pismena). Trieda = samohlaska Pismena = [a,e] ; Trieda = spoluhlaska Pismena = [b,c,d,f] ; no ?- findall(Pismeno, trieda(Pismeno, Trieda), Pismena). Pismena = [a,b,c,d,e,f] yes Predikát  Riešenie: 
findall(X, Goal, XList) :-
      call(Goal),             % nájdi riešenie
      assertz(stack(X) ),     % ulož riešenie
      fail                    % skús nájsť ďalšie riešenie
      ;
      collect(XList).         % zozbieraj riešenia
collect([X|Rest]) :-
      retract(stack(X)), !,   % vyber ďalšie riešenie
      collect(Rest).          % zozbieraj zvyšok
collect([]).                  % koniec riešení
 |  |  | 
 | ||||||||||||||||||||||||||||||||||||||||||||
| 
 |  | 
 | |||||||||||||||||||||||||||||||||||||||||||||