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

Главная Форумы Программирование Помощь с решением задач на Prolog Решение головоломок на Prolog Головоломка: Волчонок, мартышка и бегемотик на карусели

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 2 года/лет, 8 мес. назад.

  • Автор
    Сообщения
  • #1866

    questioner
    Участник

    Нужно решить логическую задачу на Prolog:

    Волчонок, мартышка и бегемотик подошли к карусели, на которой кружились машинка и самолетик. Каждый из друзей хотел прокатиться и на том, и на другом. Машинка и самолетик вмещали только по одному пассажиру. За три захода каждый из друзей по разу прокатился на машинке и на самолетике. В первый заход мартышка прокатилась на самолетике, а волчонок — на машинке. Во время второго захода на самолетике катался волчонок.
    Кто и на чем катался по время третьего захода?

  • #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.

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

Для ответа в этой теме необходимо авторизоваться.