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í
|
|||||||||||||||||||||||||||||||||||||||||||||||
|
|