为了账号安全,请及时绑定邮箱和手机立即绑定

查找列表中的唯一项目

查找列表中的唯一项目

阿晨1998 2019-09-06 16:25:38
我正在尝试编写一个规则,该规则决定一个项目是否X恰好出现在列表中L。unique(X, [X|T]):- !, \+ member(X, T).unique(X, [_|T]):- unique(X, T).该规则适用于确定值是否在列表中是唯一的,但是当我尝试使用unique(X, [1,2,3,1,3,2,5,4,3,8]).它在列表中获取唯一值时,返回的只是false.我期望的是这样(例如member(X, list).:X = 5 ;X = 4 ;X = 8 ;我是一个完全的初学者,我不知道我做错了什么。
查看完整描述

3 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

这是一个简单的解决方案nth0/4(或select/3@false指出):


unique(X, L) :-

    nth0(_, L, X, R),

    \+ member(X, R).

nth0/4第四个参数R是删除L元素的列表X。我们只是检查那X不是R。


更好的版本

unique(X, L) :-

    nth0(_, L, X, R),

    maplist(dif(X), R).

这解决了@false指出的问题,但是因为你是初学者我怀疑这对你很感兴趣。


这具有在以下情况下工作的优势:


?- unique(b, [X, Y, a]).

X = b,

dif(Y, b) ;

Y = b,

dif(X, b) ;

false.


查看完整回答
反对 回复 2019-09-06
?
达令说

TA贡献1821条经验 获得超6个赞

这听起来像是一个家庭作业问题。


尝试这样的事情。


unique(M, L) :- member(M, L), count(M, L, 1).  

count(M, [H|T], C) :- M = H, count(M, T, C1), C is C + 1.

...

完成后,这给...


?- unique(X, [1,2,3,1,3,2,5,4,3,8]).

X = 5 ;

X = 4 ;

X = 8 ;

false.


unique(Item, List) :-

  select(Item, List, L2),

  \+ member(Item, L2).


查看完整回答
反对 回复 2019-09-06
  • 3 回答
  • 0 关注
  • 449 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信