2017-03-15 101 views
1

最近我開始學習邏輯編程和使用Prolog,並且幾天前我發現條件語句也可以在Prolog中使用。
我想知道,如果我有一個謂語必須在這兩種情況下被調用,是正確的這樣寫代碼:以這種方式在Prolog中使用'if'是否正確?

process(args) :- 
    (condition -> process_args1; process_args2), 
    predicateCalledAnyway. 

與其說這是在兩種情況下,像這樣的:

process(args) :- 
    (condition -> process_args1, predicateCalledAnyway; process_args2, predicateCalledAnyway). 

有什麼區別嗎?如果是,那麼爲什麼?對我來說,在兩種情況下,代碼似乎都會產生相同的結果。

回答

3

這些形式寫的代碼是等效

第一個版本是更短並使其更容易辨認的公用部分。

但是請注意,是固有的版本的更基本的問題:(->)/2不純承諾的條件的第一個解決方案,而在一般情況下,如果Cond充分實例化(Cond -> Then ; Else)是隻有聲音。

例如:

 
?- (member(X, [a,b,c]) -> false ; true). 
false. 

然而,添加約束頓時使這個成功:

 
?- X = d, (member(X, [a,b,c]) -> false ; true). 
X = d. 

聲明的方式,我們希望加入約束導致專業化,不是概括的程序!

因此,使用(->)/2非常謹慎:在一般情況下,它會破壞你的Prolog的方案,即他們的關係性質,使您可以使用您的謂詞在多個方向和模式的最寶貴的屬性之一。

如果可能的話,請使用純Prolog的條款,或純if_/3謂語。另見相關構建體(*->)/2if/3(在SICStus中)。

相關問題