Я не думаю, что есть стандартный предикат, который делает это. Но, как вы говорите, было бы очень легко кодировать. Я бы, вероятно, написал что-то вроде этого, которое имеет шаблон, такой как предикат member/2
:
includes_item(Goal, [X|_], X) :-
call(Goal, X).
includes_item(Goal, [_|T], X) :-
includes_item(Goal, T, X).
<ч />
Как указывает @false в комментариях, на самом деле это можно написать более четко, используя member/2
:
includes_item(Goal, List, Item) :-
member(Item, List),
call(Goal, Item).
<ч />
includes_item(:Goal, List, Item)
успешен для каждого Item
в List
, который удовлетворяет :Goal
. Например:
3 ?- includes_item('>'(3), [1,2,3,-2, 4, 5], X).
X = 1 ;
X = 2 ;
X = -2 ;
false.
Затем вы можете использовать once/1
, чтобы получить только первый предмет без точки выбора:
first(Goal, List, Item) :-
once(includes_item(Goal, List, Item)).
А теперь вы получите:
4 ?- first('>'(3), [1,2,3,-2, 4, 5], X).
X = 1.
5 ?-