检查prolog中的项目和要求列表

时间:2014-11-15 04:53:39

标签: prolog

我有Prolog的问题。如果它是另一种具有命令式范式的语言对我来说会更容易,但这不是重点。 有几个项目,其中一些有要求获得。例如,如果我有项目b意味着我已经有项目a。

to_get(b):-
     need(a).

to_get(a3):-
     need(a2),
     need(a1).

所以,我有一个包含项目的列表。我必须检查哪些项目,然后检查每个项目的要求是否也存在。如果它不存在,那么我必须创建一个新列表并将其添加到那里。并返回这个新列表。

L1 = [b, a1, a3]

b需要a,但在L1中不是,所以这意味着它在新列表中,L2

L2 = [a, a2]

我希望这不是一个如此愚蠢的问题,我只是新手。 感谢

1 个答案:

答案 0 :(得分:4)

您可能认为存在描述项之间依赖关系的关系。以下用途 closure0/3non_member/2

item_needs(b, a).
item_needs(a3, a2).
item_needs(a3, a1).

items_missing(Items, Needed) :-
   member(Item, Items),
   closure0(item_needs, Item, Needed),
   non_member(Needed, Items).    

?- items_missing([b,a1,a3],Missing).
Missing = a ;
Missing = a2 ;
false.

要将其添加到列表中,请使用setof/3

?- setof(M,items_missing([b,a1,a3],M),Ms).
Ms = [a, a2].

更一般地说:

items_missingitems(Items, Ms) :-
   ( ground(Items) -> true
   ; throw(error(instantiation_error,_)) ),    % safety check
   ( length(Items,_) -> true
   ; throw(error(type_error(list,Items),_)) ), % one more
   setof(M, items_missing(Items,M), Ms).