首页 > 解决方案 > Prolog - 以列表为条件过滤列表

问题描述

我有以下事实:

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]

有没有一种简单的方法可以做到这一点?

标签: prolog

解决方案


类似的东西:

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].

推荐阅读