首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取不在第二列表中的元素

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

Stack Overflow用户
提问于 2017-10-17 15:01:41
回答 2查看 596关注 0票数 0

我想要完成的是得到“组件”没有被使用的东西。因此,我创建了一个包含所有“组件”和“正在使用的组件”的列表。

我的想法是比较这个列表,并创建另一个列表与不匹配的元素。

代码语言:javascript
复制
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‘。

提前谢谢。

示例:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-17 15:25:29

您可以添加一个简单的递归谓词来获取非comp_list成员的元素。

代码语言:javascript
复制
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).

并把它当作:

代码语言:javascript
复制
someRule(R):- comp_list(L1),
              inuse_list(L2), 
              obtain_elements(L1,L2,R).

或者使用findall/3谓词的另一种方式:

代码语言:javascript
复制
someRule(R):- comp_list(L1),
              inuse_list(L2), 
              findall(X,(member(X,L1),\+member(X,L2)),R).
票数 1
EN

Stack Overflow用户

发布于 2017-10-17 18:37:41

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

ununsed(Name) :- component(Name, _), \+ inUse(_, Name).

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46793293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档