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

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

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

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

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

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

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

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

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

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