Я читаю банкомат «Семь языков за семь недель», и меня озадачивает какой-то запрос Пролога, на который я не понимаю ответа «нет».
Друзья . Файл 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
) с втулкой
. Почему?