Получение всех решений для предиката в Prolog
-
21-08-2019 - |
Вопрос
Я пишу текстовую приключенческую игру на прологе и распечатываю выходы из комнат.У меня есть код, который делает:
exits_from(Room) :-
connected(Room, X),
write(X), write(' ').
где connected/2 - это:
connected(X, Y) :- path(X, Y).
connected(X, Y) :- path(Y, X).
и путь - это:
path(room, hallway).
path(hallway, foyer).
и так далее.
Однако, когда я печатаю выходы для комнаты, он получает первый, а затем хочет ';' сказать, что мне нужно другое решение.Есть ли какой-нибудь способ заставить предикат полностью вычислять результат, чтобы игроку не приходилось постоянно запрашивать дополнительные выходы?
Решение
один из способов - сделать что-то вроде
print_all_solutions :-
solution(Sol),
write(Sol),
fail. % this causes backtracking
print_all_solutions. % succed
другой способ заключается в использовании специального предиката forall, например, следующим образом:
forall(solution(Sol), write(Sol))
Не связан с StackOverflow