在Prolog中获取谓词的所有解决方案

Kai*_*Kai 5 prolog

我正在Prolog写一个文本冒险游戏,我打印出房间出口.我有以下代码:

exits_from(Room) :-
  connected(Room, X),
  write(X), write('  ').
Run Code Online (Sandbox Code Playgroud)

其中connected/2是:

connected(X, Y) :- path(X, Y).
connected(X, Y) :- path(Y, X).
Run Code Online (Sandbox Code Playgroud)

和路径是:

path(room, hallway).
path(hallway, foyer).
Run Code Online (Sandbox Code Playgroud)

等等.

当我打印一个房间的出口时,它得到第一个,然后想要一个';' 说我想要另一个解决方案.反正是否强制谓词完全计算结果,以便玩家不必继续要求更多退出?

小智 14

一种方法是做一些事情

print_all_solutions :-
  solution(Sol),
  write(Sol),
  fail. % this causes backtracking
print_all_solutions. % succed
Run Code Online (Sandbox Code Playgroud)

另一种是使用特殊谓词forall,如下所示:

forall(solution(Sol), write(Sol))
Run Code Online (Sandbox Code Playgroud)