Я работаю через Клоксина и Меллиша, чтобы попытаться, наконец, пойти дальше, чем просто баловаться Прологом. FWIW, я использую SWI-Prolog:
SWI-Prolog версии 7.2.3 для x86_64-linux
Во всяком случае, я реализовал предикат diff / 2 как часть упражнения 1.4. Предикат очень прост:
diff(X,Y) :- X \== Y.
И это работает, когда используется в предикате сестра_фона, например:
sister_of(X,Y) :-
female(X),
diff(X,Y),
parents(X, Mum, Dad ),
parents(Y, Mum, Dad ).
в том, предполагая необходимые дополнительные факты, делая это:
?- sister_of(alice,alice).
возвращает false, как и ожидалось. Но вот беда. Если я сделаю это вместо:
?- sister_of(alice, Who).
(опять же, с учетом необходимых дополнительных фактов)
Я получаю
Кто = Эдвард;
Кто = Алиса;
ложь
Хотя, как уже было показано, предикат сестра_ не рассматривает Алису как свою собственную сестру.
С другой стороны, если я использую предикат dif / 2, предоставленный SWI, то все работает так, как я наивно ожидал.
Может кто-нибудь объяснить, почему это происходит именно так и почему моя реализация diff не работает так, как я ожидаю, в случае, когда я запрашиваю дополнительные унификации из этого запроса?
Весь исходный файл, с которым я работаю, можно найти здесь
Любая помощь очень ценится.