Обратное прослеживание и множество контекстов
Если обнаружено противоречие между объектами world M и N и объект М создан ранее объекта N, причем анализ М в предположении о лживости соответствующего высказывания не был выполнен, ТО вернуться к анализу объекта М.
(defrule directed-falsity (world (tag?N) (scope falsity) (task contra) (prior?M&"0)) ?W ← (world (tag?M) (scope truth) (task check)) › (modify?W (task back))) ;; Если обнаружено противоречие между ;; объектами world М и N ;; и объект М создан ранее объекта N, причем ;; не был выполнен анализ всех дизъюнктов в М, ;; ТО вернуться к анализу объекта М. (defrule directed-disjunct (world (tag?N) (scope falsity) (task contra) (prior?MS~0)) ?V ← (world (tag?M) (task check) (context 1)) (claim (content OR?P?X?Q?Y) (reason?M) (scope?S)) › ;; Дизъюнкт в ранее покинутом "мире", анализ которого ;; не был выполнен. (assert (claim (content?Q?Y) (reason?M) (scope?S) (context 2))) ;; Зафиксировать необходимость отката в этот "мир". (modify?V (task back)))
Если вы думаете, что эти два правила позволяют справиться со всеми возможными ситуациями, в которых может возникнуть необходимость выполнить откат, то вы ошибаетесь. "Миры" W и V могут конфликтовать, хотя в обоих проанализированы все варианты предположений и все дизъюнкты. А источник конфликта при этом находится в некотором третьем "мире", в котором не был завершен анализ предположений или дизъюнктов (см. пример 4).
Упражнение 4
Проанализируйте следующую головоломку, в которой участвуют персонажи А, В и С.
А: "В лжец". В: "С лжец". С: "В говорит правду".
Как выполнить откат в процессе решения этой задачи. Отыщите "мир", в который нужно выполнить откат, и объясните, почему этот "мир" не удастся определить с помощью приведенных выше правил.
Фактически второе и третье высказывания в этой задаче несовместимы, а потому в ней не существует варианта непротиворечивого распределения ролей между персонажами.
Правила directed – и undirected – можно использовать в комбинации, нр с первого взгляда трудно решить, как именно это сделать. Условные части правил undirected-falsity и directed-falsity одинаковы, а потому нам остается только манипулировать значением параметра salience. Обычно "направленные" варианты правил более эффективны, но в результате их применения может пострадать полнота исследования "миров" в особо хитроумных задачах. "Ненаправленные" варианты работают медленнее, но зато обеспечивают исчерпывающий просмотр всех имеющихся в задаче объектов world.
Я предлагаю читателям самостоятельно поэкспериментировать с обоими вариантами при решении разных задач рассматриваемого класса. Мы же в дальнейшем будем использовать только "ненаправленные" варианты этих правил.