Предикат участника
Когда вы звоните member(Item, List)
с неослабленным списком Prolog объединяет и возвращает список, содержащий элемент. Я хочу правило, которое возвращает true
/false
и не пытается объединиться. Есть ли такое правило?
2 ответа
Я бы использовал охрану, как
is_member(E, L) :- nonvar(L), memberchk(E, L).
memberchk/2
это детерминированная версия member/2, которая используется для определения, содержит ли список хотя бы 1 вхождение элемента. Не может выступать в роли генератора, но он более эффективен. Охрана требуется в любом случае.
Быстрый ответ: Используйте \+ \+ member(Item, List)
,
Обратите внимание, что такие тесты часто не имеют большого смысла, когда ваши программы представляют логические отношения.
Вы заявили, что member(Item, List)
msgstr "возвращает список". Ну, это не совсем так. List
объединяется с частичными списками, то есть List = [Item|_Rest] ; List = [_,Item|_Rest] ; ...
с _Rest
будучи неопознанной переменной. Цель member(Item, List)
не гарантирует, что (при успехе) List
это список. Вот контрпример: member(Item, List), List = [_|nonlist]