Используйте member/2
дважды для недетерминированного пересечения:
which_icecream(DesiredIngredients, S) :-
icecream(S, Ingredients, _),
member(X, DesiredIngredients),
member(X, Ingredients).
Обратите внимание, что один и тот же результат будет возвращаться несколько раз из-за совпадения множества ингредиентов:
?- which_icecream([vanille,lemon,chocolate,mango], S).
S = number1 ;
S = number1 ;
S = number1 ;
S = number2 ;
S = number2 ;
false.
Удалить дубликаты с setof/3
:
?- setof(S, which_icecream([vanille,lemon,chocolate,mango], S), IceCreams).
IceCreams = [number1, number2].
Альтернативное решение, использующее intersection/3
встроенный:
which_icecream(DesiredIngredients, S) :-
icecream(S, Ingredients, _),
intersection(Ingredients, DesiredIngredients, Intersection),
Intersection \= [].