2012-02-06 61 views
2

我有以下序言代碼:循環的Prolog

equiAngularTriangle(T) :- 
    equiLateralTriangle(T). 

equiLateralTriangle(T) :- 
    equiAngularTriangle(T). 

有沒有辦法讓翻譯從問同樣的問題兩次?例如,如果我詢問equiAngularTriangle(t),那麼它將詢問equiLateralTriangle(t),然後詢問equiLateralTriangle(t),但它應該知道不要再追求最後一個,因爲同樣的問題在「查詢棧」上。

是否有一個選項或一些特殊的語法讓Prolog按照我想要的方式工作?

+2

如何檢查該陳述是否屬實?你是否也有一個規則來完成這個查詢?否則:它是如何知道它是否是其中之一? – Marnix 2012-02-06 19:39:42

回答

1

如果prolog實現支持製表或您正在使用XSB,那麼您可以使用它並獲得所需的行爲。

你也可以添加一個狀態參數:

%State = [Checked_for_equiAngular, Checked_for_equiLateral] 

equiAngularTriangle(T, [_,false]) :- 
    equiLateralTriangle(T, [true,true]). 

equiLateralTriangle(T, [false,_]) :- 
    equiAngularTriangle(T, [true,true]). 

你當然需要修改條款的其餘部分。

最後(也是最好的選擇)選項是重寫謂詞。我想,你的代碼將類似於此示例:

ang(T):- 
    foo(T). 
ang(T):- 
    lat(T). 

lat(T):- 
    bar(T). 
lat(T):- 
    ang(T). 

所以你可以簡單的寫:

ang(T):- 
    foo(T). 
ang(T):- 
    bar(T). 

lat(T):- 
    ang(T). 

通常你會使用一些包裝謂詞如果不是富(T)你有foo1( T),foo2(T)等

1

嘗試XSB Prolog。它實現了表格,這將在您的情況下進行短路評估。儘管如此,你需要告訴它哪些謂詞應該被放置。