Полный листинг программы
ЕСЛИ объект world базируется на предположении о лживости метавысказывания, ТО предположить, что персонаж лжет. Каких-либо предположений об истинности утверждения не делается.
Примечание:
Правило используется только для работы с метавысказываниями, которые не содержат отрицаний. Правило не может обрабатывать метавысказываний вида: А: "В не говорил, что он лжец." или А: "В говорил, что он не лжец.".
(defrule unwrap-false-state ?W ← (world (tag?N) (scope falsity) (task check))?S ← (statement (speaker?X) (claim SAY?Z $?Y) (tag?N) (done 1)) › (printout t crlf "Assuming " F " "?X " and NOT "?Z " says " $?Y " in world "?N ;; "Предполагается " F " "?X " и HE "?Z " говорит ;; " $?Y " в мире "?N t crlf ) ;; Изменить значение в поле scope текущего объекта ;; world. (modify?W (scope falsity) (done 2)) ;; Зафиксировать, что высказывание было распаковано ;; в предположении о лживости, (modify?S (scope falsity) (done 2)) ;; Предположить, что в текущем "мире" персонаж, ;; произнесший метавысказывание, лжец, (assert (claim (content F?X) (reason?N) (scope falsity)))) ;;------------------------------- ;; ЛОГИЧЕСКИЕ ОПЕРАТОРЫ ;; Правила отрицания ;; ЕСЛИ некто не правдолюбец, ;; ТО он лжец. (defrule notl (declare (salience 5)) ?F ← (claim (content NOT Т?P)) › (modify?F (content F?P))) ;; ЕСЛИ некто не лжец, ;; ТО он правдолюбец, (defrule not2 (declare (salience 5)) ?F ← (claim (content NOT F?P)) › (modify?F (content Т?Р))) ;;--------------------- ;; Распространение отрицания на дизъюнкцию, (defrule not-or (declare (salience 5)) ?F ← (claim.(content NOT OR?P?X?Q?Y)) › (modify?F (content AND (flip?P)?X (flip?Q)?Y)) ) ;;------------------------- ;; Распространение отрицания на конъюнкцию, (defrule not-and (declare (salience 5)) ?F ← (claim (content NOT AND?P?X?Q?Y)) › (modify?F (content OR (flip?P)?X (flip?Q)?Y)) ) ;;------------------------------ ;; Устранение конъюнкции, (defrule conj (world (tag?N) (scope?V) (task check) (context?L)) (claim (content AND?P?X?Q?Y) (reason?N) (scope?V) (context?L) › (assert (claim (content?P?X) (reason?N) (scope?V) (context?L)) (assert (claim (content?Q?Y) (reason?N) (scope?V) (context?L)) ;; ОБРАБОТКА ДИЗЪЮНКТИВНЫХ УТВЕРЖДЕНИЙ ) ;; ЕСЛИ мы имеем дело с дизъюнктивным утверждением, ;; т.е .context = 0, ;; ТО сначала проанализировать левый дизъюнкт. ;; ПРИМЕЧАНИЕ. Устанавливается значение 1 как в поле ;; context объекта world, так и в поле context нового ;; объекта claim. (defrule left-disjunct ?W ← (world (tag?N) (task check) (scope?V) (context 0)) (claim (content OR?P?X?Q?Y) (reason?N) (scope?V) (context 0" › (assert (claim (content?P?X) (reason?N) (scope?V) (context 1))) (modify?W (context 1)) )