Проблема с `\ +` в запросах Prolog с переменными

Я читаю банкомат «Семь языков за семь недель», и меня озадачивает какой-то запрос Пролога, на который я не понимаю ответа «нет».

Друзья . Файл pl выглядит так:

likes(wallace, cheese).
likes(grommit, cheese).
likes(wendolene, sheep).

friend(X, Y) :- \+(X = Y), likes(X, Z), likes(Y, Z).

Я могу выполнить несколько тривиальных запросов, например:

| ?- ['friends'].
compiling /home/marc/btlang-code/code/prolog/friends.pl for byte code...
/home/marc/btlang-code/code/prolog/friends.pl compiled, 12 lines read - 994 bytes written, 8 ms

yes
| ?- friend(wallace,grommit).

yes
| ?- friend(wallace,wendolene).

no

Это все, как ожидалось. Теперь я хочу ввести в запрос переменную. Я хочу, чтобы Пролог предоставил мне список всех друзей Уоллеса. Я ожидаю X = grommit , но получаю no :

| ?- trace.
The debugger will first creep -- showing everything (trace)

yes
{trace}
| ?- friend(wallace,X).
      1    1  Call: friend(wallace,_16) ?
      2    2  Call: \+wallace=_16 ?
      3    3  Call: wallace=_16 ?
      3    3  Exit: wallace=wallace ?
      2    2  Fail: \+wallace=_16 ?
      1    1  Fail: friend(wallace,_16) ?

no
{trace}

Он даже не пытается объединить X ( _16 ) с втулкой . Почему?

5
задан Marc Mutz - mmutz 12 May 2011 в 00:31
поделиться