Я читаю "Семь языков за семь недель", и я озадачен каким-то запросом Пролога, на который я не понимаю ответа "нет".
выглядит файл friends.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
) с grommit
.Зачем?