Получение всех решений для предиката в Prolog

StackOverflow https://stackoverflow.com/questions/846145

  •  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))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top