2014-02-13 23 views
1

這裏是我的簡單的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

錯誤在第二個子句中。它應該是代替:

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

否則,當你問的Prolog更多的解決方案,最終不得不在friend/2謂詞遞歸調用本身沒有首先建立一個knows/2中間的關係。通過跟蹤friend/2謂詞,可以瞭解更多關於程序中的錯誤的信息。嘗試:

?- trace, friend(brian,peter). 
+0

它的工作原理,謝謝! – Pingu

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), ...你的程序將不會終止。它會在這裏和那裏產生答案,但最終會循環。有關更多信息,請參閱