Получение всех решений для предиката в Прологе - PullRequest
5 голосов
/ 11 мая 2009

Я пишу текстовую приключенческую игру на Прологе и распечатываю выходы из комнаты. У меня есть код, который делает:

exits_from(Room) :-
  connected(Room, X),
  write(X), write('  ').

, где подключено / 2:

connected(X, Y) :- path(X, Y).
connected(X, Y) :- path(Y, X).

и путь:

path(room, hallway).
path(hallway, foyer).

и т. Д.

Когда я печатаю выходы для комнаты, она получает первое, затем хочет ';' сказать, что я хочу другое решение. Есть ли способ заставить предикат полностью вычислить результат, чтобы игроку не приходилось просить больше выходов?

1 Ответ

14 голосов
/ 11 мая 2009

Один из способов сделать что-то вроде

print_all_solutions :-
  solution(Sol),
  write(Sol),
  fail. % this causes backtracking
print_all_solutions. % succed

другое - использовать специальный предикат, как показано ниже:

forall(solution(Sol), write(Sol))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...