Обратное прослеживание и множество контекстов
Подготовка рабочей памяти к выполнению отката
При подготовке к откату нужно выполнить одну из двух возможных операций с рабочей памятью:
- если к противоречию привел выбор определенного дизъюнкта, нужно удалить контекст, созданный в результате этого выбора;
- если к противоречию привело предположение о правдивости персонажа, нужно удалить соответствующий контекст и проанализировать, к чему приведет противное предположение.
В любом случае из рабочей памяти нужно удалить объекты claim. Поскольку откат никогда не выполняется в противоречивом контексте, такое удаление не повлияет на полноту представления информации о задаче. Если потребуется вновь сформировать удаленный контекст при других предположениях, это можно будет выполнить, повторив вычисления с "чистого листа".
;; ЕСЛИ обнаружено противоречие с одним из ;; дизъюнктивных контекстов "мира", ;; ТО удалить все утверждения (объекты claim) ;; этого контекста. ;; ПРИМЕЧАНИЕ: правило будет активизироваться повторно, ;; пока не будут удалены все ненужные объекты, (defrule clean-context (declare (salience SO)) (world (tag?N) (task contra) (prior 0) (context?S&~0)) ?F ← (claim (reason?N) (context?S)) › (retract?F)) ;; ЕСЛИ противоречие обнаружено в текущем "мире" в ;; предположении о правдивости, ;; ТО повторить анализ, предположив лживость персонажа. (defrule switch-context (declare (salience 40)) ;; Если больше нет правых дизъюнктов, ?W ← (world (tag?N)(scope truth) (task contra) (prior 0) (context?S&"1)) › ;; изменить предположение и сформировать новый контекст. (modify?W (scope falsity) (task check) (context 0)) ) ;; Удалить все утверждения (объекты claim), ;; сформированные на основании предположения о ;; правдивости. ;; ПРИМЕЧАНИЕ: правило будет активизироваться повторно, ;; пока не будут удалены все ненужные объекты, (defrule sweep-truth (declare (salience 100)) (world (tag?N) (scope falsity)) ?F ← (claim (reason?N) (scope truth))- › (retract?F))
Последнее правило демонстрирует, как с помощью полей reason и scope можно отслеживать объекты claim. В данной программе используется тот же прием, что и в системах обработки правдоподобия, которые были рассмотрены в главе 19.
Теперь можно приступить к разработке правил, выполняющих откат.