Prolog“超出本地堆栈”错误

时间:2014-02-13 15:51:32

标签: prolog failure-slice transitive-closure

这是我简单的Prolog程序:

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

knows(brian,tom).
knows(tom,peter).

如果我输入以下查询

friend(brian,peter).

Prolog将提供以下输出:

?- friend(brian,peter).
true 

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

ERROR: Out of local stack

我在这里做错了什么?

2 个答案:

答案 0 :(得分:5)

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

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

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

?- trace, friend(brian,peter).

答案 1 :(得分:1)

了解程序中非终止的来源,只需查看以下故障片:

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

knows(brian,tom) :- false.
knows(tom,peter) :- false.

由于friend(X, Z) :- friend(X, Y), ...,您的程序不会终止。它会在这里和那里产生答案,但最终会循环。有关更多信息,请参阅