Чего мне не хватает в равенстве и объединении в Прологе? - PullRequest
0 голосов
/ 06 июля 2018

Я работаю через Клоксина и Меллиша, чтобы попытаться, наконец, пойти дальше, чем просто баловаться Прологом. 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 не работает так, как я ожидаю, в случае, когда я запрашиваю дополнительные унификации из этого запроса?

Весь исходный файл, с которым я работаю, можно найти здесь

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 06 июля 2018

Как вы заметили, проблема связана с взаимодействием между равенством (или, скорее, неравенством) и объединением. Заметьте, что в вашем определении sister_of сначала вы найдете подходящее значение для X, , а затем попытайтесь ограничить Y, но Y по-прежнему является необоснованной логической переменной, и проверка всегда будет успешной, как diff(alice, Y). Следующие ограничения, включая последнее, которое дает конкретное значение для Y, приходят слишком поздно.

В общем, вам нужно убедиться, что к моменту проверки неравенства все переменные будут созданы. Отрицание - это нелогичная особенность Пролога, поэтому оно потенциально опасно, но проверка того, не равны ли два наземных члена , является безопасной.

...