Если я хочу убедиться, что две переменные не создают экземпляр для одного и того же термина, каков предпочтительный способ сделать это?
Скажем, мне нужно найти направленные ребра в графе, а node не может иметь ребра для себя:
node(a, x, y). node(b, z, x). node(c, y, y).
(ребра здесь → c, b → a, но не c → c)
Следующие работы:
edge(A, B) :- node(A, _, X), node(B, X, _), A \== B.
Это тоже работает [swi-prolog]:
edge(A, B) :- dif(A, B), node(A, _, X), node(B, X, _).
Это не работает, по-видимому (потому что ни A, ни B не созданы еще?):
edge(A, B) :- A \== B, node(A, _, X), node(B, X, _).
Я думаю, что моя проблема с первым решением заключается в том, что с более сложным предикатом node
может возникнуть много ненужных унификаций до того, как edge
завершится сбой. С другой стороны, dif
находится в библиотеке, которая предполагает, что он не предназначен для использования в таком простом случае (хотя у него есть точная функция, которую я, похоже, ищу).