prolog中的项目和要求检查表

prolog中的项目和要求检查表,prolog,Prolog,我对Prolog有问题。如果它是另一种带有命令式范例的语言,对我来说会更容易,但这不是重点。 有几个项目,其中一些有需要获得的要求。例如,如果我有项目b,意味着我已经有了项目a to_get(b):- need(a). to_get(a3):- need(a2), need(a1). 所以,我有一个项目清单。我必须检查哪些项目在那里,然后检查每个项目的需求是否也在那里。如果它不在那里,那么我必须创建一个新列表并将其添加到那里。并返回此新列表 L1 = [b, a

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

to_get(b):-
     need(a).

to_get(a3):-
     need(a2),
     need(a1).
所以,我有一个项目清单。我必须检查哪些项目在那里,然后检查每个项目的需求是否也在那里。如果它不在那里,那么我必须创建一个新列表并将其添加到那里。并返回此新列表

L1 = [b, a1, a3]
b需要a,但a不在L1中,所以这意味着它在新列表L2中

L2 = [a, a2]
我希望这不是一个愚蠢的问题,我只是一个新手。
谢谢

您可能认为描述项目之间的依赖关系是有关系的。以下用途 和

要将其放入列表,请使用
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).

未定义的过程:非成员/2错误:但是,有关于:错误:非成员/2的定义。我现在得到这个错误。@false如果没有丢失的项目,是否缩进以失败?例如,
?-缺失项([a],X)
。在这种情况下,空列表可能更为自然。@WouterBeek:这是一个古老的否定问题:两种方法都有其道理。
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).