Как выразить предикат 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 неравенств AB, AC,..., EF (или, скорее, их исполнение Пролога)?

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]). 
Другие вопросы по тегам