Z Prologiem dostarczonych jest kilka predykatów przydatnych przy obróbce wyników wyszukiwania.
Predykat bagof/3, użyty jako bagof(X,P,L)
buduje listę L
, złożoną z takich X
, że spełnione jest P
.
Podobnie działa setof/3, jednak powstała lista jest posortowana i nie zawiera ew. duplikatów.
Specjalny operator ^
pozwala na modyfikowanie zapytania i jest równoważny kwantyfikacji egzystencjalnej, np. zakładając istnienie bazy faktów zdefiniowanej za pomocą predykatu a/2
:
bagof(X,Y^a(X,Y),L)
spowoduje znalezienie listy L na ktorej beda znajdować się wartości X niezależnie od tego jaką wartość przyjmuje Y (dokładnie jedno rozwiązanie).
bagof(X,a(X,Y),L)
spowoduje znalezienie listy L na ktorej beda znajdować się wartości X dla konkretnej (znalezionej) wartości Y (wiele rozwiązań, lista dla każdej wartości Y).
Predykat findall/3 wymusza wyszukanie wszystkich możliwych wyników.
Ćwiczenie:
Wczytać program z 1. zajęć rodzina1.pl
Sprawdzić działanie:
?- rodzic(X,robert).
?- bagof(X,rodzic(X,robert),L).
Sprawdzić działanie:
?- bagof(X,ojciec(tomek,X),L).
?- setof(X,ojciec(tomek,X),L).
Następnie:
?- bagof(X,Y^ojciec(X,Y),L).
?- setof(X,Y^ojciec(X,Y),L).
Oraz:
?- bagof(X,ojciec(X,Y),L).
?- findall(X,ojciec(X,Y),L).