2014-04-01 91 views
1

我想學習Prolog考試。序言:算術表達式和常量的統一

根據我的幻燈片,算術表達式不與常量一致。 是否有原因?

例如

even(0). 
even(X) :- X>0, odd(X-1). 

odd(1). 
odd(X) :- X>1, even(X-1). 

    ?-even(2). 
=> false. 

0不與(X-1)統一。

所以我的問題是:在某些情況下,如果常量和算術表達式之間存在統一性,會出現問題嗎?

回答

3

這些子句的問題是,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 

會失敗。

+0

謝謝,如果我理解正確只有Prolog問題,當我試圖統一Y + 2 = CONST,不是邏輯的,不是嗎?我必須告訴Prolog像「is」這樣的「特殊」運算符,它應該首先評估表達式。 – nomiko

+0

@nomiko在這種情況下你使用統一('=/2'),所以它不會評估'Y + 2'。如果'Y'有一個值,並且你做了'Y + 2 =:= CONST',那麼Prolog將評估'Y + 2',如果'CONST'是一個數值常量,不是一個變量,將會正確地比較它們。 – lurker