2

这是我的简单 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

我在这里做错了什么?

4

2 回答 2

5

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

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

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

?- trace, friend(brian,peter).
于 2014-02-13T17:15:16.743 回答
1

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

朋友(X,Y):-知道(X,Y)。
朋友(X,Z):-
   朋友(X,Y),朋友(Y,Z)知道(布赖恩,汤姆):-知道(汤姆,彼得):-

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

于 2014-04-14T10:10:07.593 回答