我正在尝试编写一个规则,该规则决定一个项目是否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.
达令说
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).
- 3 回答
- 0 关注
- 449 浏览
添加回答
举报
0/150
提交
取消