这是我简单的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
我在这里做错了什么?
答案 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), ...
,您的程序不会终止。它会在这里和那里产生答案,但最终会循环。有关更多信息,请参阅failure-slice。