2011-11-21 130 views
26

有人可以解釋在Prolog中===運算符之間的區別嗎?我知道X = Y意味着X與Y相結合,如果X已經與Y相結合或者可以與Y相結合,則爲真,但我不明白這與==有什麼不同。在Prolog中==和= =有什麼區別?

後續行動:那(看接受答案)是有道理的。還有一個問題,是否存在X \= Y爲真並且X \== Y爲假(或反之亦然)?也就是說,X \= Y測試它們是否不能統一或者它們目前是不是統一的?

+1

「這是有道理的。」:你可以添加一些有意義的東西,或者將其從問題中刪除,並最終將其添加爲答案的評論? –

+0

@moose:「後續」(將否定與'='和'=='組合)開始作爲對我的答案的評論。我懷疑「這是有道理的」是指我的前兩段,之後我作出了進一步的迴應。看看我的Edit是否足以清除這種感覺。 – hardmath

回答

29

Prolog中的=「操作符」實際上是謂詞(帶中綴符號)=/2當兩個術語統一時成功。因此X = 22 = X或量的同樣的事情,一個目標統一X與2.

的==「經營者」不同之處在於它成功只有當這兩個術語都已經無需進一步統一相同。因此X == 2是真實的,只有當變量X此前被分配值2

補充:有趣通過時「而不是」被約翰斯低於混合到這些目標,每個評論發生了什麼工作。在Amzi看到漂亮的set of examples! Prolog文檔。

\=表示這兩個術語不能統一,即統一失敗。與所有的否定作爲失敗的應用一樣,「不統一」不會(並且不能)導致術語之間的統一。

\==表示兩個術語不相同。即使這樣做也沒有統一。

最後想想not(not(X = Y))會做什麼。如果X和Y(可以是任意的項)可以統一,那麼內在的目標就會成功,對此的雙重否定也是如此。然而,將雙重否定的內在目標包裹在內產生一個成功的目標如果這兩個術語可以統一但沒有統一這些術語

作爲練習,讀者可以考慮not(not(X == Y))是否有類似的用途。

+0

這是有道理的。還有一個問題,是否存在「X \ = Y」爲真,「X \ == Y」爲假(或反之亦然)的情況?也就是說,'X'= Y'測試它們是不是統一的,還是它們目前不統一? – JohnS

+0

@JohnS:請注意,'X \ = Y'與'not(X = Y)'相同,或者像某些Prolog實現中那樣,'\ +(X = Y)'。請參閱我的答案的添加部分以獲得進一步的評論。 – hardmath

+0

「因此,只有變量X先前被賦值爲2,X == 2才爲真。」是非常重要的要注意,因爲你可以有兩個計算與相同的結果不通過'=='。例如'2/2 * 2 == *(2,(/(2,2)))。「,因爲左邊的術語實際上並沒有被分解爲算術術語,直到它被評估爲止。 –

5

=表示統一,表示它會嘗試綁定自由變量以使其與其他成員相匹配。例如: 例如: 如果A是空閒的,A = h(X)將使A變成期限h(X),並且如果A被約束爲5將失敗。 統一是很好的,因爲你可以對它進行模式匹配,例如:

X-Y:Z = 5-[a, b, c]:y 

會給你

X = 5, Y = [a, b, c] and Z = y 

因爲序言試圖使XY位:Z適合表達5- [A,b,C]:Y。 這非常有用。

需要注意的是,當你調用一個謂詞和一些技術接踵而至統一使用: 說你要返回遞歸謂詞累加器的值,你可以這樣做:

recursive_predicate([], Accumulator, Accumulator). 
recursive_predicate(Input, Accumulator, Output) :- %recursive stuff. 

第一條將試圖統一第三和第二個參數,所以如果第三個參數是空閒的,它現在與第二個參數具有相同的值。

==是沒有試圖綁定變量的相等。