Prolog"超出本地堆栈"错误

Pin*_*ngu 2 prolog transitive-closure failure-slice

这是我简单的Prolog程序:

friend(X,Y):-
   knows(X,Y).
friend(X,Z):-
   friend(X,Y),
   friend(Y,Z).

knows(brian,tom).
knows(tom,peter).
Run Code Online (Sandbox Code Playgroud)

如果我键入以下查询

friend(brian,peter).
Run Code Online (Sandbox Code Playgroud)

Prolog将提供以下输出:

?- friend(brian,peter).
true 
Run Code Online (Sandbox Code Playgroud)

如果再输入一个分号,Prolog会说:

ERROR: Out of local stack
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

Pau*_*ura 5

错误在第二个子句中.它应该是:

friend(X,Z):-
   knows(X,Y),
   friend(Y,Z).
Run Code Online (Sandbox Code Playgroud)

否则,当您向Prolog请求更多解决方案时,您最终会在friend/2没有首先建立knows/2中间关系的情况下以递归方式调用自己.您可以通过跟踪对friend/2谓词的调用来了解有关程序中的错误的更多信息.尝试:

?- trace, friend(brian,peter).
Run Code Online (Sandbox Code Playgroud)