如何表达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 非等式 A
≠ B
, A
≠ C
, ..., E
≠ F
(或者更确切地说,他们的 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]).
设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 非等式 A
≠ B
, A
≠ C
, ..., E
≠ F
(或者更确切地说,他们的 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]).