我想在序言中创建一个规则,以检查列表中是否有重复的数字。

例如:

  • 表示[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/

    10-11 00:31
    查看更多