2013-04-16 102 views
4

我已經將這些語句輸入到prolog解釋器中,並且對結果感到困惑。他們不應該返回相同的東西;真正?is和=有什麼區別?

1 ?- 7 = 5 + 2. 
false. 

2 ?- 7 is 5 + 2. 
true. 

回答

7

沒有,因爲=/2並不意味着在序言分配,而是統一。統一算法對算術,結構完全不瞭解。所以,你可以用在Prolog的算術表達式是相當困難的其他語言的決絕一些有趣的事情:

?- X = 5 + 2. 
X = 5+2. 

它看起來像什麼都沒有發生有,但實際發生的情況是X被賦予值「5 + 2「作爲結構。換句話說:

?- A + B = 5 + 2. 
A = 5, 
B = 2. 

甚至:

?- X = 5 + 2, X =.. [Op|_]. 
X = 5+2, 
Op = (+). 

這最後一個可能會更有意義與整個名單,但:

?- X = 5 + 2, X =.. Y. 
X = 5+2, 
Y = [+, 5, 2]. 

這是非凡的「大學的作用「運算符=../2,它能夠在類似Lisp的列表和Prolog語法之間進行轉換,使您能夠以通用的方式進行有趣的構造和結構分解。

現在,is/2,另一方面,確實瞭解算術。它將其左派論證與其權利的算術簡化結果統一起來。 請注意,它只能在一個方向:

?- 7 is 5 + 2. 
true. 

?- 5 + 2 is 7. 
false. 

可以說,=/2感興趣結構和is/2有興趣的數值相等。但它確實意味着它的不尋常容易教Prolog的代數:

simplify(X * Y + X * Z, X * (Y + Z)). % distributive property 
simplify(X, X). 

?- simplify(A * 3 + A * 4, Q). 
Q = A* (3+4) 

現在,這是不完美的(注意,我們得到了3 + 4,而不是7),它仍然是一個大量的工作,使它真正智能:

?- simplify(3 * A + 4 * A, Q). 
Q = 3*A+4*A. 

但這是另一天的問題。

果殼:

  • =/2觸發統一
  • is/2觸發算術評估
+0

謝謝你,尤其是對簡而言之!我很好奇你爲什麼在/之後加入/ 2並且在你的回答中? –

+0

斜槓將謂詞的名稱與其「arity」分隔開,它接受的參數數量。對於像'is'和'='這樣的中綴運算符來說,這隻會是2,但對於其他謂詞,您可以使用具有不同數量參數的版本使用相同的名稱,所以您需要這樣做以保持'foo/2'的直線從你的'foo/3'或'foo/4'。這只是一個很好的約定。 –