Пролог - отфильтровать список со списком в качестве условия - PullRequest
0 голосов
/ 31 октября 2019

У меня есть следующие факты:

breads([italian_wheat, hearty_italian, honey_oat, parmesan_oregano, multigrain, flatbread]).
sauces([chipotle_southwest, ranch, bbq, chili_sauce, tomato_sauce, mayonnaise, mustard_sauce]).
unhealthy_breads([hearty_italian, honey_oat, parmesan_oregano, flatbread]).
unhealthy_sauces([mayonnaise, chipotle_southwest, ranch]).

Теперь я бы хотел отфильтровать хлеб и соусы по спискам нездоровых хлебов и нездоровых соусов. Я хотел бы создать «функцию», которая работает аналогично этому:

filter(breads,unhealthy_breads,Healthy).

, который дает вывод:

Healthy = [italian_wheat, multigrain]

Есть ли простой способ сделать это?

1 Ответ

0 голосов
/ 31 октября 2019

Примерно так:

breads([italian_wheat, hearty_italian, honey_oat, parmesan_oregano, multigrain, flatbread]).
sauces([chipotle_southwest, ranch, bbq, chili_sauce, tomato_sauce, mayonnaise, mustard_sauce]).
unhealthy_breads([hearty_italian, honey_oat, parmesan_oregano, flatbread]).
unhealthy_sauces([mayonnaise, chipotle_southwest, ranch]).

test(Bad, X) :-
    member(X, Bad).

filter(Data, Bad, Output) :-
   call(Data, Input_1),
   call(Bad, Input_2),

   % Filter elements for which Goal fails. 
   % True if List2 contains those elements Xi of List1 for which call(Goal, Xi) fails.
   exclude(test(Input_2),Input_1, Output).

Пример

?- filter(breads,unhealthy_breads,Healthy).
Healthy = [italian_wheat, multigrain].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...