当且仅当{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个非等式A
≠B
,A
≠{{1 },...,C
≠E
(或者更确切地说,是他们的Prolog演绎)?
答案 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]).