我想在prolog中创建一个规则来检查列表中是否有重复的数字.
例如:
[1,2,3,4]它会回来true.[1,2,3,3]它将返回false,因为3重复我想出了这个规则,但它不起作用
Different([]).
Different([H|T]):-
Member(H,T),
Different(T).
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
Cap*_*liC 10
一个紧凑的定义可能是
all_diff(L) :- \+ (select(X,L,R), memberchk(X,R)).
Run Code Online (Sandbox Code Playgroud)
即如果我们不能偷看并在其余部分找到它,所有元素都是不同的...
编辑
让(稍微)提高效率:检查X是否是前缀子列表的成员是没用的,所以:
all_diff(L) :- \+ (append(_,[X|R],L), memberchk(X,R)).
Run Code Online (Sandbox Code Playgroud)
JSF*_*des -3
这不是很有效,但是对于每个数字,您可以检查它是否稍后再次出现。就像这样:
Different([H|T]):-
CheckSingle(H, [T]),
Different([T]).
Checksingle(_,[]).
Checksingle(Elem, [H, T]):-
Elem != H,
Checksingle(Elem, [T]).
Run Code Online (Sandbox Code Playgroud)