Если у вас есть набор фактов, таких как:
man(a).
man(b).
Как было указано в комментариях, вы можете найти все решения с помощью findall
:
| ?- findall(X, man(X), Solutions).
Solutions = [a, b]
Вы также можете изменить исходную программу, чтобы использовать цикл с ошибкой. fail
в Прологе делает именно это: он терпит неудачу и поэтому заставляет Пролог вернуться назад. Как только man(X)
не сможет найти больше решений, то первое предложение main
в конечном итоге приведет к отказу Пролога во втором предложении, которое просто завершится успешно без дальнейших действий:
main :-
man(X),
write(X),
nl,
fail.
main.
Теперь, если вы запросите main
, вы получите:
| ?- main.
a
b
yes
| ?-
В контексте более широкой программы, findall/3
может быть предпочтительным, так как она захватывает решения для вас, тогда как вышесказанное просто «печатает» их, не собирая их. Хотя бывают моменты, когда это все, что нужно.