В чем разница между == и = в Прологе? - PullRequest
28 голосов
/ 22 ноября 2011

Может кто-нибудь объяснить разницу между оператором == и = в Прологе? Я знаю, что X = Y означает, что X объединяется с Y, и это правда, если X уже объединяется с Y или может быть сделан, но я не понимаю, чем это отличается от ==.

Продолжение: это (см. Принятый ответ) имеет смысл. Еще один вопрос, есть ли когда-нибудь ситуация, когда X \= Y истинно, а X \== Y ложно (или наоборот)? То есть X \= Y проверяет, не могут ли они быть объединены или не объединены в настоящее время?

Ответы [ 2 ]

33 голосов
/ 22 ноября 2011

Оператор = "в" Пролога на самом деле является предикатом (с инфиксной нотацией) = / 2 , который завершается успешно, когда два члена объединены.Таким образом, X = 2 или 2 = X означают одно и то же, цель объединить X с 2.

Оператор == "отличается" тем, что он успешен, только если два термина уже идентичны бездальнейшее объединение.Таким образом, X == 2 имеет значение true, только если переменной X ранее было присвоено значение 2.

Добавлено: Интересно поработать над тем, что происходит, когда "не" смешивается с этимицели, согласно комментарию JohnS ниже.Смотрите хороший набор примеров в Amzi!Пролог документации.

\= означает, что два термина не могут быть объединены, то есть, что объединение не удается.Как и во всех случаях применения отрицания как отказа, «не унифицировано» не приводит (и не может) привести к какому-либо объединению терминов.

\== означает, что оба термина не идентичны.Здесь также не происходит объединения, даже если это удастся.

Наконец, подумайте о том, что будет делать not(not(X = Y)).Внутренняя цель будет успешной, если X и Y (которые могут быть произвольными терминами) могут быть объединены, как и двойное отрицание этого.Однако заключение внутренней цели в двойное отрицание приводит к достижению цели, которая достигает , если эти два термина могут быть объединены , но без объединения этих терминов .

.упражнение для читателя обдумать, имеет ли not(not(X == Y)) аналогичную утилиту.

5 голосов
/ 22 ноября 2011

= означает объединение, это означает, что он будет пытаться связать свободные переменные, чтобы они соответствовали другим членам. например : A = h (X) превратит A в член h (X), если A свободен, и потерпит неудачу, если A скажет 5. унификация хороша, потому что вы можете сопоставить ее с шаблоном, например:

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

даст вам

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

потому что пролог пытается привести X-Y: Z в соответствие выражению 5- [a, b, c]: y. Это очень полезно.

Обратите внимание, что унификация используется, когда вы вызываете предикат, и следуют некоторые методы: скажем, вы хотите вернуть значение аккумулятора в рекурсивном предикате, вы можете сделать это:

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

В первом предложении будет пытаться объединить третий и второй аргументы, поэтому, если третий свободен, он теперь имеет то же значение, что и второй.

== равенство без попытки связать переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...