我想在序言中创建一个规则,以检查列表中是否有重复的数字。
例如:
[1,2,3,4]
,它将返回true
。 [1,2,3,3]
,它将返回false
,因为3
重复了我想出了这条规则,但是没有用
Different([]).
Different([H|T]):-
Member(H,T),
Different(T).
有任何想法吗?
最佳答案
一个紧凑的定义可能是
all_diff(L) :- \+ (select(X,L,R), memberchk(X,R)).
也就是说,如果我们不能窥视一个元素并在其余元素中找到它,那么所有元素都是不同的...
编辑
让我们(略微)提高效率:检查X是否是前缀子列表的成员是没有用的,所以:
all_diff(L) :- \+ (append(_,[X|R],L), memberchk(X,R)).
关于prolog - 检查列表中的所有数字在序言中是否都不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20131904/