Пролог: как проверить, содержит ли список список из многочисленных фактов - PullRequest
0 голосов
/ 05 мая 2018

Я новичок в прологе и пытаюсь выяснить, как решить эту проблему.
Number1, number2 и number3 являются именами тортов.
шоколад, манго, лимон ... это ингредиенты, а цифры - это цены, которые мне не нужны для этого запроса, но они должны быть там.

icecream(number1,  [chocolate,mango,lemon], 1.99).

icecream(number2, [vanille,lemon ], 1.79).

icecream(number3, [almonds, kiwi, walnut], 2.50).

запрос:

which_icecream( [vanille,lemon,chocolate,mango],  S).

      S = number1;

      S = number2.

Спасибо!

1 Ответ

0 голосов
/ 05 мая 2018

Используйте 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 \= [].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...