這些子句的問題是,Prolog不會將內聯算術表達式作爲參數對謂詞進行查詢。
所以這個:
even(X) :- X>0, odd(X-1).
odd(X) :- X>1, even(X-1).
如果查詢爲將導致:
2 > 0, % success
odd(2-1). % hmmm
然後odd(2-1)
(這實際上意味着odd('-'(2,1))
)將不匹配odd(1)
,它會去odd(X)
,給:
2-1>1, % This will evaluate, but will fail because 1>1 is false
由於>/2
是一個評估比較,它進行評估。但是這太遲了,因爲選擇了錯誤的條款。所以你會失敗。
你需要事先評估:在比較運算符比較數字
Y is (X+1)/2.
或者,如果:
even(0).
even(X) :- X>0, X1 is X-1, odd(X1).
odd(1).
odd(X) :- X>1, X1 is X-1, even(X1).
的Prolog將評估表達式上的is/2
第二個參數,如。例如,下面將比較之前計算表達式:
Y+7 < X*2
X/2 =:= Y mod 2
注意=/2
不計算表達式。這是一個統一運營商。所以:因爲它試圖統一'-'(X,2)
與'*'(Y,2)
X-2 = Y*2
會失敗。
謝謝,如果我理解正確只有Prolog問題,當我試圖統一Y + 2 = CONST,不是邏輯的,不是嗎?我必須告訴Prolog像「is」這樣的「特殊」運算符,它應該首先評估表達式。 – nomiko
@nomiko在這種情況下你使用統一('=/2'),所以它不會評估'Y + 2'。如果'Y'有一個值,並且你做了'Y + 2 =:= CONST',那麼Prolog將評估'Y + 2',如果'CONST'是一個數值常量,不是一個變量,將會正確地比較它們。 – lurker