猿问

查找列表中的唯一项目

我正在尝试编写一个规则,该规则决定一个项目是否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 ;

我是一个完全的初学者,我不知道我做错了什么。


阿晨1998
浏览 450回答 3
3回答

哆啦的时光机

这是一个简单的解决方案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.

达令说

这听起来像是一个家庭作业问题。尝试这样的事情。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).
随时随地看视频慕课网APP
我要回答