Теперь, когда вы наверняка уже нашли решение, я хотел бы упомянуть одну вещь:
Классическая версия:
member(Item, [Item|_List]).
member(Item, [_Head|List]) :- member(Item, List).
оставляет точку выбора после нахождения последнего возможного элемента, то есть:
?- member(A, [1, 2, 3]).
A = 1;
A = 2;
A = 3<strong>;
false</strong>.
, а
member2(Item, [Head|List]) :-
member2(List, Item, Head).
member2(_List, Item, Item).
member2([Head|List], Item, _PreviousHead) :-
member2(List, Item, Head).
обрабатывает пустой список одновременно с последним элементом и позволяет оптимизировать:
?- member2(A, [1, 2, 3]).
A = 1;
A = 2;
A = 3.
Это версия, используемая в SWI-Prolog (и, конечно, Jekejeke Prolog и, возможно, других). Автор - Гертьян ван Ноорд.
Это просто напоминание о том, что, хотя упражнение по созданию member/2
отлично подходит для себя, это не должно приводить к тому, что вы впоследствии не будете использовать встроенные модули, они часто хорошо настроены и более эффективны!