检查列表中列表中的所有数字是否不同

use*_*250 6 prolog

我想在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)

  • -1表示不尝试自己的答案。谓词必须以小写字符开头。 (3认同)