Узнику на выбор предложили комнаты с принцессой и тиграми

      Комментарии к записи Узнику на выбор предложили комнаты с принцессой и тиграми отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Решение головоломок на Prolog Узнику на выбор предложили комнаты с принцессой и тиграми

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

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

    questioner
    Участник

    Приведите рассуждения и представьте ответ на поставленный вопрос:

    Узнику предложены на выбор три комнаты, в одной из которых находилась принцесса, а в двух других сидели тигры. На дверях комнат были вывешены таблицу со следующими надписями:
    Логическая задача про узника, принцессу и тигров
    Король сообщил узнику что одно из этих утверждений является истинным. В какой по номеру комнате находится принцесса?

  • #1863

    questioner
    Участник

    Опишем возможные состояния комнат:

    содержимое(принцесса).
    содержимое(тигр).

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

    одна_принцесса(Решение):-
      findall(принцесса, member(принцесса, Решение), Принцессы),
      length(Принцессы, 1).

    Встроенный предикат member ищет принцессе в комнатах (решении). Предикат findall запускает поиск всех решений (всех принцесс в комнатах и формирует в результате список найденных принцесс. Тут, в принципе, не важно что будет идти первым аргументом функции findall, т.к. важно лишь количество элементов в результирующем списке. Встроенный предикат length проверят чтобы список содержал ровно один элемент.

    Аналогичным образом можно подсчитать количество правильных утверждений, однако при этом вторым аргументом findall нужно передавать либо функцию, либо составное выражение:

    одно_правильное_утверждение(Утверждения, Решение):-
      findall(
        Утверждение,
        (member(Утверждение, Утверждения), Утверждение = Решение),
        Правильные_Утверждения
      ),
      length(Правильные_Утверждения, 1).

    Для запуска поиска решения остается:

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

    решение(Решение):-
      Решение = [Первая, Вторая, Третья],
      содержимое(Первая), содержимое(Вторая), содержимое(Третья),
     
      одна_принцесса(Решение),
     
      Утверждения = [
        [тигр, _, _],
        [_, принцесса, _],
        [_, тигр, _]
      ],
      одно_правильное_утверждение(Утверждения, Решение).

    Три утверждения помещаются в список, при этом каждое из них также представляет собой список. Список утверждения содержит анонимные переменные (символы подчеркивания), т.к. каждое из них говорит о состоянии лишь одной клетки.

    ?- решение(Решение).
    Решение = [принцесса, тигр, тигр] ;
    false.

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