Иллюстрированный самоучитель по введению в экспертные системы

Полный листинг программы

ЕСЛИ объект 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))
)
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.