2014-12-30 44 views
0

我嘗試了一本書中的基本示例,它使「超出本地堆棧」錯誤(我會在代碼後告訴更多)。 這裏是代碼:Prolog超出本地堆棧錯誤

edge(a,b). 
edge(a,e). 
edge(b,d). 
edge(b,c). 
edge(c,a). 
edge(e,b). 
tedge(Node1,Node2) :- 
    edge(Node1,SomeNode), 
    edge(SomeNode,Node2). 
edge(X,Y) :- tedge(X,Y). 

我試圖例如寫查詢邊緣(A,B),並且它返回真,然後輸入我「;」它發生了錯誤。 這裏有什麼問題?

+0

簡短的答案是,它進入無限遞歸。如果你做一個「跟蹤」,你會看到發生了什麼。你爲什麼定義了邊(X,Y): - Tedge(X,Y)。它必然會創建一個循環場景,因爲'edge/2'還定義了'tedge/2'引用的事實。只要把它留在'tedge/2'並且查詢'tedge(a,b).'。 – lurker

回答

2

問題是,您已經定義了循環方式的邊界。雖然從ab的Prolog尋找第二條路徑是通過tedge(a,VAR)edge(a,VAR)tedge(a,VAR)循環等

注意的Prolog會即使您沒有定義您的邊緣是對稱的,即由於循環a -> b -> c -> a循環。

解決方案是跟蹤之前訪問過的頂點和/或邊緣。檢查非循環頂點可以直接使用closure0/3(我從SO用戶學習到的謂詞false)實現。如果您使用的謂詞,您只需要您的edge/2事實和下面的查詢:

?- closure0(edge, a, b). 
+2

什麼是奢侈品,我不再需要輸入答案! – false