Как выразить предикат allDifferent/6?
Позволять 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
в прологе?
В частности, есть ли способ выразить это, не требуя перечисления 6-выбрать-2 = 15 неравенств A
≠ B
, A
≠ C
,..., E
≠ F
(или, скорее, их исполнение Пролога)?
1 ответ
Если вы принимаете это allDifferent
получить список значений (вместо шести значений) я могу предложить следующее решение
isDifferent(_, []).
isDifferent(X, [H | T]) :-
X \= H,
isDifferent(X, T).
allDifferent([]).
allDifferent([H | T]) :-
isDifferent(H, T),
allDifferent(T).
-- РЕДАКТИРОВАТЬ --
Как предлагает False, вы можете использовать dif/2
вместо \=
(если ваш Пролог это предоставит) так что главное 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]).