如何表达allDifferent/6谓词?

How to express the allDifferent/6 predicate?

allDifferent(A, B, C, D, E, F)为真当且仅当∀i, j in {1, 2, 3, 4 , 5, 6},第 i-th 和 j-th 参数统一 if 和 only if i = j.

因此allDifferent(3, 1, 4, 1, 5, 9)为假,但allDifferent(3, 1, 4, 2, 5, 9)为真。

如何在 Prolog 中实现 allDifferent/6

特别是,有没有一种表达方式不需要列出 6-choose-2 = 15 非等式 AB, AC, ..., EF(或者更确切地说,他们的 Prolog 演绎版)?

如果您接受 allDifferent 收到值列表(而不是六个值),我可以提出以下解决方案

isDifferent(_, []).

isDifferent(X, [H | T]) :-
  X \= H,
  isDifferent(X, T).

allDifferent([]).

allDifferent([H | T]) :-
  isDifferent(H, T),
  allDifferent(T).

-- 编辑--

根据 False 的建议,您可以使用 dif/2 而不是 \=(如果您的 Prolog 提供了它),因此主要的 isDifferent/2 可以是

isDifferent(X, [H | T]) :-
  dif(X, H),
  isDifferent(X, T).

无论如何......希望这是显而易见的......但是如果你真的想要一个allDifferent/6而不是一个接收列表的allDifferent/1,你可以定义你的allDifferent/6如下

allDifferent(A, B, C, D, E, F) :-
  allDifferent([A, B, C, D, E, F]).