По обвинению в ограблении банка перед судом предстали Иванов, Петров, Сидоров

      Комментарии к записи По обвинению в ограблении банка перед судом предстали Иванов, Петров, Сидоров отключены

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

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

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

    questioner
    Участник

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

    Логическая задача:

    По обвинению в ограблении банка перед судом предстали Иванов, Петров, Сидоров. Следствием установлено следующее:
    1) если Иванов не виновен или Петров виновен, то Сидоров виновен.
    2) если Иванов не виновен, то Сидоров не виновен.
    Виновен ли Иванов?

    Насколько я понял, ее можно классифицировать как задачу на установление соответствия.

  • #1861

    Для решения задачи опишем данные задачи в виде фактов Prolog:

    подсудимый(иванов).
    подсудимый(сидоров).
    подсудимый(петров).
     
    вердикт(виновен).
    вердикт(не_виновен).

    Нам надо заставить программу перебирать все варианты описанных подсудимых и их вердиктов, а также выполнять проверку полученного варианта на соответствие условиям задачи:

    известно_1(Иванов, Петров, Сидоров):-
      (Иванов = не_виновен; Петров = виновен) -> Сидоров = виновен;!.
         
    известно_2(Иванов, _Петров, Сидоров):-
      Иванов = не_виновен, !, Сидоров = не_виновен;!.

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

    Для запуска процесса поиска решения остается запросить у пролога вердикты для трех действующих лиц и подставить их в описанные правила.

    решение(Иванов, Петров, Сидоров):-
      вердикт(Иванов), вердикт(Петров), вердикт(Сидоров),
      известно_1(Иванов, Петров, Сидоров),
      известно_2(Иванов, Петров, Сидоров).

    При любом раскладе Иванов оказывается виновен.

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