簡體   English   中英

Prolog中==和=的區別是什么?

[英]What is the difference between == and = in Prolog?

有人可以解釋 Prolog 中===運算符之間的區別嗎? 我知道X = Y意味着 X 與 Y 統一,如果 X 已經與 Y 統一或可以實現,則為真,但我不明白這與==有何不同。

跟進:那(見接受的答案)是有道理的。 還有一個問題,是否存在X \\= Y為真而X \\== Y為假(或反之亦然)的情況? 也就是說, X \\= Y測試它們是否無法統一或當前未統一?

Prolog 中的= "operator" 實際上是一個謂詞(帶有中綴表示法) =/2 ,當這兩個術語統一時它會成功。 因此, X = 22 = X等於同一件事,目標是將X與 2 統一起來。

== “運算符”的不同之處在於它僅在兩個術語已經相同而無需進一步統一時才成功。 因此X == 2只有在變量X之前被賦值為 2 時才為真。

補充:根據下面 JohnS 的評論,研究當“不”混入這些目標時會發生什么是很有趣的。 請參閱 Amzi 中的一不錯的示例 序言文檔。

\\=表示兩個項不能統一,即統一失敗。 與所有否定作為失敗的應用一樣,“不統一”不會(也不能)導致術語之間的任何統一。

\\==表示這兩個術語不相同。 即使成功,這里也不會發生統一。

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

留給讀者練習思考not(not(X == Y))是否有任何類似的效用。

= 代表統一,這意味着它將嘗試綁定自由變量以使它們與其他成員匹配。 例如:如果 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

因為 prolog 試圖使 XY:Z 適合表達式 5-[a, b, c]:y。 這是非常有用的。

請注意,當您調用謂詞時會使用統一,並且會出現一些技術:假設您想在遞歸謂詞中返回累加器的值,您可以這樣做:

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

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

== 是不嘗試綁定變量的相等性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM