我有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]
我希望这不是一个如此愚蠢的问题,我只是新手。 感谢
答案 0 :(得分:4)
您可能认为存在描述项之间依赖关系的关系。以下用途
closure0/3
和non_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).