List 获取不在第二个列表中的元素

List 获取不在第二个列表中的元素,list,prolog,member,List,Prolog,Member,我试图做到的是得到那些没有被使用的“组件”。因此,我创建了一个包含所有“组件”和“在用组件”的列表。 我的想法是比较这些列表并创建另一个列表,其中包含不匹配的元素 component('name 1', 1). component('name 2', 2). component('name 3', 3). component('name 4', 4). component('name 5', 5). inUse(1, 'name 1'). inUse(1, 'name 3'). inUse(1

我试图做到的是得到那些没有被使用的“组件”。因此,我创建了一个包含所有“组件”和“在用组件”的列表。
我的想法是比较这些列表并创建另一个列表,其中包含不匹配的元素

component('name 1', 1).
component('name 2', 2).
component('name 3', 3).
component('name 4', 4).
component('name 5', 5).

inUse(1, 'name 1').
inUse(1, 'name 3').
inUse(1, 'name 5').

comp_list(L):- findall(Comp, component(Comp, _), L).
inuse_list(L):- findall(Comp, inUse(_, Comp), L).
我不知道如何做这样的事情:
member('name comp',List)。
在这里我可以用其他列表的每个元素替换'name comp'

提前谢谢

示例:

L1 = ['name 1', 'name 2', 'name 3', 'name 4', 'name 5'] %comp_list(L).
L2 = ['name 1', 'name 3', 'name 5']                     %inuse_list(L).

someRule(R):- comp_list(L1), inuse_list(L2),    %more code, to obtain a list R with:

R = ['name 2', 'name 4'] (Elements lacking on inuse_list)

您可以添加一个简单的递归谓词来获取
comp\u list
中不属于
inuse\u list
的元素:

obtain_elements([],_,[]).
obtain_elements([H|T],L,[H|T1]):-\+member(H,L),obtain_elements(T,L,T1).
obtain_elements([H|T],L,L2):-member(H,L),obtain_elements(T,L,L2).
然后像这样使用它:

someRule(R):- comp_list(L1),
              inuse_list(L2), 
              obtain_elements(L1,L2,R).
或者使用
findall/3
谓词的另一种方法:

someRule(R):- comp_list(L1),
              inuse_list(L2), 
              findall(X,(member(X,L1),\+member(X,L2)),R).

您可以添加一个简单的递归谓词来获取
comp\u list
中不属于
inuse\u list
的元素:

obtain_elements([],_,[]).
obtain_elements([H|T],L,[H|T1]):-\+member(H,L),obtain_elements(T,L,T1).
obtain_elements([H|T],L,L2):-member(H,L),obtain_elements(T,L,L2).
然后像这样使用它:

someRule(R):- comp_list(L1),
              inuse_list(L2), 
              obtain_elements(L1,L2,R).
或者使用
findall/3
谓词的另一种方法:

someRule(R):- comp_list(L1),
              inuse_list(L2), 
              findall(X,(member(X,L1),\+member(X,L2)),R).

虽然答案是正确的,但如果需要对数据库中的事实和规则进行推理,最好尽可能避免使用列表。在这种情况下,目标未使用组件很容易定义为


未使用(名称):-
组件(名称,u),
\+使用(u,名称)。

这很好地列举了未使用的组件。如果要将它们列在列表中,请使用
findall/3
over
unused/1
。在大多数情况下,
unused/1
的定义更容易与其他纯逻辑关系结合


在大多数情况下,聚合原语(如
findall/3
aggregate/3
)最好延迟到最后或根本不使用。

虽然答案是正确的,但如果需要对数据库中的事实和规则进行推理,最好尽可能避免使用列表。在这种情况下,目标未使用组件很容易定义为


未使用(名称):-
组件(名称,u),
\+使用(u,名称)。

这很好地列举了未使用的组件。如果要将它们列在列表中,请使用
findall/3
over
unused/1
。在大多数情况下,
unused/1
的定义更容易与其他纯逻辑关系结合


在大多数情况下,聚合原语,如
findall/3
aggregate/3
,最好延迟到最后或根本不使用。

您能举一个两个列表的例子,以及您尝试做什么,因为到目前为止还不清楚……您好@coder。我已经添加了这个例子。你能举一个两个列表的例子,以及从现在起你一直在尝试做什么吗?一点也不清楚……Hello@coder。我已经添加了这个例子,我使用了findall谓词,并且工作得很好。非常感谢。我使用了findall谓词,并且工作得非常好。非常感谢你。