3

allDifferent(A, B, C, D, E, F)当且仅当 ∀ i , j在 {1, 2, 3, 4, 5, 6} 中,第i个和第j个参数统一当且仅当 i = j时为

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

如何allDifferent/6在 Prolog 中实现?

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

4

1 回答 1

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]). 
于 2017-02-25T14:51:50.460 回答