4
我已經將這些語句輸入到prolog解釋器中,並且對結果感到困惑。他們不應該返回相同的東西;真正?is和=有什麼區別?
1 ?- 7 = 5 + 2.
false.
2 ?- 7 is 5 + 2.
true.
我已經將這些語句輸入到prolog解釋器中,並且對結果感到困惑。他們不應該返回相同的東西;真正?is和=有什麼區別?
1 ?- 7 = 5 + 2.
false.
2 ?- 7 is 5 + 2.
true.
沒有,因爲=/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
觸發算術評估
謝謝你,尤其是對簡而言之!我很好奇你爲什麼在/之後加入/ 2並且在你的回答中? –
斜槓將謂詞的名稱與其「arity」分隔開,它接受的參數數量。對於像'is'和'='這樣的中綴運算符來說,這隻會是2,但對於其他謂詞,您可以使用具有不同數量參數的版本使用相同的名稱,所以您需要這樣做以保持'foo/2'的直線從你的'foo/3'或'foo/4'。這只是一個很好的約定。 –