2011-10-21 143 views
3

我正在嘗試製作一個簡單的知識庫。但是,我正在努力讓分類系統正常工作。爲什麼這個prolog程序會導致無限遞歸?

這是迄今爲止該程序:

subset(tomatoes, fruits). 
subset(fruits, food). 
subset(X, Z) :- subset(X, Y), subset(Y, Z), not(X==Y), not(Y==Z), not(X==Z). 
member(X, Z) :- member(X, Y), subset(Y, Z). 
member(t1, tomatoes). 

查詢:

member(t1,tomatoes). 
ERROR: Out of local stack 
    Exception: (1,765,494) member(t1, _G28504) ? abort 
% Execution Aborted 
+0

我對Prolog有點生疏,但是你有沒有試過把你的事實放在第一位?如在移動成員(t1,西紅柿)高於遞歸規則? – acjay

回答

4

遇到你叫現象左遞歸。將目標subset(X, Z)解決爲使用新的未綁定變量Y來解決目標subset(X, Y),並且這導致解決相同的目標subset(X, Z)等,無窮無盡。應該避免左遞歸。

通常的做法是在傳遞封閉的基本事實和規則之間進行切換。你可以嘗試:

subset1(tomatoes, fruits). 
subset1(fruits, food). 

subset(X, Y) :- subset1(X, Y). 
subset(X, Z) :- subset1(X, Y), subset(Y, Z). 

member1(t1, tomatoes). 
member1(t2, tomatoes). 

member(X, Y) :- member1(X, Y). 
member(X, Z) :- member1(X, Y), subset(Y, Z). 

?- member(t1, food).  ===> TRUE 

在這個公式中沒有左遞歸。首先嚐試可以終止遞歸的直接事實。只有在沒有事實的情況下,纔會執行遞歸調用。

相關問題