Ответ в теме: Головоломка: Волчонок, мартышка и бегемотик на карусели

      Комментарии к записи Ответ в теме: Головоломка: Волчонок, мартышка и бегемотик на карусели отключены
#1867

В задаче требуется установить соответствие между видом аттракциона и действующим лицом. Задача решается по образцу:

  • объявить варианты объектов, между которыми нужно установить соответствие;
  • описать правила, которым должно соответствовать правильное решение;
  • запустить генерацию объектов, после которой должны выполняться соответствующие проверки корректности.

Имеется три действующих лица и 2 транспортных средства. Однако, нас больше интересуют действия лиц, чем транспортные средства. Доступны три варианта действия, два из которых связаны с эксплуатацией транспортных средств, а третье — пропуск хода.

action(plane).
action(car).
action(shift).

Мы могли бы подобным образом описать действующие лица, но в этом случае получили бы несколько вариантов решения, которые являлись бы перестановками друг друга. Поэтому действующие лица заданы непосредственно в процедуре поиска решение задачи.

solve([passenger(monkey, [X1,X2,X3]), passenger(wolf, [Y1, Y2,Y3]),
passenger(hippo, [Z1, Z2, Z3])]):-
  action(X1), action(Y1), action(Z1), unique([X1, Y1, Z1]),
  action(X2), action(Y2), action(Z2), unique([X2, Y2, Z2]),
  action(X3), action(Y3), action(Z3), unique([X3, Y3, Z3]),
 
  unique([X1, X2, X3]), unique([Y1, Y2, Y3]), unique([Z1, Z2, Z3]),
 
  X1 = plane, Y1 = car,
  Y2 = plane.

В результате решения будет получен список из трех элементов, соответствующих животным, описанным в задаче. Каждый элемент содержит имя животного и трехэлементный список действий. В первых двух строках процедуры solve описан такой список. Задача процедуры — подобрать действия с учетом ограничений задачи.
Генерируются 9 действий с учетом того, что машинка и самолетик — одноместные и лишь одно действующее лицо могло бездействовать. Проверка ограничения осуществляется предикатом unique, описанным в статье.
Правило unique следит за тем, чтобы каждое лицо использовало каждый вид действия единожды.
Часть решения дана (информация о первых двух заходах) и она тоже составляет часть ограничения на правильное решение.

?- solve(X).
X = [passenger(monkey, [plane, shift, car]), passenger(wolf, [car, plane, shift]), passenger(hippo, [shift, car, plane])] ;
false.

Видно, что во время третьего захода обезьяна каталась на автомобиле, волк решил отдохнуть, а бегемот взлетел на самолете.