Предикат участника

Когда вы звоните 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]

Другие вопросы по тегам