Немонотонное обоснование
Пара конфликтующих выражений
Приведенная ниже программа на языке CLIPS реализует простой алгоритм отслеживания истинности предположений по отношению к простым атомарным выражениям. Литералы являются атомарными высказываниями, имеющими статус либо включено, либо исключено. Список inlist некоторого выражения включает те выражения, которые должны иметь статус включено для того, чтобы и данное выражение имело статус включено. Список outlist некоторого выражения включает те выражения, которые должны иметь статус исключено, для того, чтобы данное выражение имело статус включено. Как и ранее, пустые списки поддержки по умолчанию имеют значение -1.
;; ШАБЛОНЫ ;; Литерал – атомарное высказывание. (deftemplate literal (field id (type INTEGER}) (field atom (type SYMBOL)) (field status (type SYMBOL) (default unk)) (multifield inlist (type INTEGER) (default -1)) (multifield outlist (type INTEGER) (default -1)) ) ;; Исходная модель мира. (deffacts model (literal (id 0) (atom P) (status in) (outlist 1)) (literal (id 1) (atom Q) (status in) (outlist 0)) ) ;; ПРАВИЛА ;; Если выражение в списке outlist ;; выражения S имеет статус out ;; и выражение S имеет пустой список inlist, ;; то присвоить выражению S статус in. (defrule in (literal (id?A) (status out))?F <- (literal (status out) (inlist -1) (outlist?A)) › (modify?F (status in)) )
Если выражение в списке outlist выражения S имеет статус in, то присвоить выражению S статус out. Обратите внимание на то, что в этом правиле наличие списка inlist для выражения S не имеет значения:
(defrule out (literal (id?A) (status in))?F <- (literal (status in) (outlist?A)) › (modify?F (status out))) ;; Это правило предлагает пользователю удалить ;; выражение и таким образом уладить конфликт, (defrule deny (declare (salience -10)) ?L < – (literal (atom?X) (status in) (inlist -1)) › (printout t crlf "Deny "?X "? ") (bind?ans (read)) (if (eq Pans yes) then (modify PL (status out))) ;; Что произойдет после того, как вы ;;запустите эту программу на выполнение? ;;Как! будет вести себя программа, если ;;в ответ на запрос, сформированный правилом ;; deny, ввести yes? Как будет ;;вести себя программа, получив ответ по?