获取不在第二个列表中的元素
Get elements which are not in second list
我想要完成的是获得 'Components' 未被使用的内容。所以我创建了一个包含所有 'Components' 和 'In Use Components'.
的列表
我的想法是比较这个列表并用不匹配的元素创建另一个列表。
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_list
中不属于 inuse_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).
虽然答案是正确的,但如果您需要对数据库中的事实和规则进行推理,最好尽可能避免使用列表。在这种情况下,目标未使用的组件很容易定义为
ununsed(Name) :-
component(Name, _),
\+ inUse(_, Name).
这很好地列举了未使用的组件。如果您希望它们出现在列表中,请使用 findall/3
而不是 unused/1
。在大多数情况下,unused/1
的定义更容易与其他纯逻辑关系结合。
在大多数情况下,聚合原语如findall/3
、aggregate/3
等,最好延迟到最后或根本不使用。
我想要完成的是获得 'Components' 未被使用的内容。所以我创建了一个包含所有 'Components' 和 'In Use Components'.
的列表
我的想法是比较这个列表并用不匹配的元素创建另一个列表。
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_list
中不属于 inuse_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).
虽然答案是正确的,但如果您需要对数据库中的事实和规则进行推理,最好尽可能避免使用列表。在这种情况下,目标未使用的组件很容易定义为
ununsed(Name) :-
component(Name, _),
\+ inUse(_, Name).
这很好地列举了未使用的组件。如果您希望它们出现在列表中,请使用 findall/3
而不是 unused/1
。在大多数情况下,unused/1
的定义更容易与其他纯逻辑关系结合。
在大多数情况下,聚合原语如findall/3
、aggregate/3
等,最好延迟到最后或根本不使用。