Ответ в теме: Предикат select для выбора элемента из списка

      Комментарии к записи Ответ в теме: Предикат select для выбора элемента из списка отключены
#2632

Предикат принимает на вход список, отделяет от него первый элемент и хвост. Если значение элемента совпадает с искомым — возвращается значение и хвост. В остальных случаях — хвост обрабатывается рекурсивно, а к полученному результату дописывается первый первый элемент:

select(Elem, [Elem|Tail], Tail).
select(Elem, [Head|Tail], [Head|ResultTail]):-
  	select(Elem, Tail, ResultTail).

Если искомый элемент списка не задан — предикат можно использовать для того, чтобы по очереди перебрать все элемент списка.
Если же элемент задан — с помощью предиката можно удалить первое вхождение элемента из списка:

delete_single_element(List, Element, ListWithoutElement):-
  	select(Element, List, ListWithoutElement), !.