如何表达allDifferent / 6谓词?

时间:2017-02-25 14:38:37

标签: prolog prolog-dif

当且仅当{1,2,3,4,5,6}中的∀ i j 时,allDifferent(A, B, C, D, E, F)为真em> i -th和 j -th参数统一if和仅当 i = j

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

如何在Prolog中实现allDifferent/6

特别是,有没有办法表达它不需要列出6-choose-2 = 15个非等式ABA≠{{1 },...,CE(或者更确切地说,是他们的Prolog演绎)?

1 个答案:

答案 0 :(得分:2)

如果您接受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]).