Что означают результаты типа Z = [_G305] в прологе? - PullRequest
3 голосов
/ 05 ноября 2010

У меня есть следующие определения:

memberx(X, [X|_]).
memberx(X, [_|T]) :- memberx(X, T).

intersectionx([], _, []).
intersectionx([H|T], Y, [_|Z]) :- memberx(H, Y), !, intersectionx(T, Y, Z).
intersectionx([_|T], Y, Z) :- intersectionx(T, Y, Z).

Я получаю следующий результат:

?- intersectionx([1], [1], Z).
Z = [_G305].

Почему это не приводит к Z = [1] ??

1 Ответ

5 голосов
/ 05 ноября 2010

Z = [_G305].

означает, что этот ответ верен для всех терминов.То есть это верно не только для Z = [1] - как вы ожидаете, но и для Z = [2].

Очевидно, это не то, что вы ожидали.

Так где же ошибка?Простой способ обнаружить это - следить за анонимными переменными, обозначенными _.

. Рассмотрим:

intersectionx([H|T], Y, [_|Z]) :- memberx(H, Y), !, intersectionx(T, Y, Z).
                        ^^^

То, что вы написали, означает, что пересечение списка, начинающегося с H, и другого спискабудет (при условии, что цели с правой стороны верны) списком, начинающимся с чего угодно ... Заменить что-либо на это H!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...