Реферат: Программирование на языке CLIPS
(done 0))
=>
(printout
t crlf
“Assuming “ T ?X “ and “ ?Z “ says “ $?Y
“ in world “ ?N
;; “Предполагается “ Т ?Х “ и “ ? Z “ говорит “ $?Y
;; “ в мире “ ?N
t crlf
)
;; Зафиксировать, что высказывание было распаковано
;; в предложении о его правдивости.
(modify ?S (tag ?N) (done 1))
;; Предположим, что персонаж в текущем «мире» является
;; правдолюбцем.
(assert (claim (content T ?X) (reason ?N)
(scope truth)))
;; Зафиксировать в объекте world для внедрённого
;; высказывания и зафиксировать, что этот объект
;; является внутренним по отношению к объекту ?N.
(assert (world (tag (+ ?N 1)) (scope truth) (upper ?N)))
;; Зафиксировать внедрённое высказывание в новом
;; объекте world.
(assert (statement (speaker ?Z) (claim $?Y)
(reason ?N)))
)
;;----------------------------------------------------------------------
;; ЕСЛИ объект world базируется на предполодении о
;; лживости высказывания,
;; ТО предположить, что персонаж лжёт и что
;; высказывание ложно.
;; ПРИМЕЧАНИЕ. Это правило не используется для
;; распаковки метавысказываний.
(defrule unwrap-false
?W <- (world (tag ?N) (scope falsity) (task check))
?S <- (statement (speaker ?X)
(claim ?P&: (not (eq ?P NOT) (eq ?P SAY))) $?Y)
(tag ?N) (done 1))
=>
(printout
t crlf
“Assuming “ F ?X “ and NOT “ in world “ ?N
;; “ Предполагается “ F ?X “ и НЕ “ ?P $?Y “ в мире “ ?N
t crlf
)
;; Зафиксировать, что высказывание анализируется
;; в предположении о его лживости.
(modify ?S (scope falsity) (done 2))
;; Зафиксировать в объекте world, что анализируется
;; лживость высказывания.
(modify ?W (done 2))
;; Предположим, что персонаж лжец.
(assert (claim (content F ?X) (reason ?N)
(scope falsity)))
;; Сформировать отрицание утверждения.
(assert (claim (content NOT ?P $?Y) (reason ?N)
(scope falsity)))
)
;;----------------------------------------------------------------------
;; ЕСЛИ объект 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 “ и НЕ “ ?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 not1
(declare (salience 5))
?F <- (claim content NOT T ?P))
=>
(modify ?F (content F ?P))
)
;;----------------------------------------------------------------------
;; ЕСЛИ некто не лжец,
;; ТО он правдолюбец.
(defrule not2
(declare (salience 5))
?F <- (claim content NOT F ?P))
=>
(modify ?F (content T ?P))
)
;;----------------------------------------------------------------------
;; Распространение отрицания на дизъюнкцию.
(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-or
(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) (content ?L))
)
;;----------------------------------------------------------------------
;; ОБРАБОТКА ДИЗЪЮНКТИВНЫХ УТВЕРЖДЕНИЙ
;;----------------------------------------------------------------------
;; ЕСЛИ мы имеем дело с дизъюнктивным утверждением,
;; т.е. context = 0,
;; ТО сначала проанализировать левый дизъюнкт.
;; ПРИМЕЧАНИЕ. Устанавливается значение 1 как в поле
;; context объекта world, так и в поле context нового
;; объекта claim.
(defrule left-disjunct
?W <- (world (tag ?N) (task check) (scope ?V)
(content 0))
(claim (content OR ?P ?X ?Q ?Y) (reason ?N)
(scope ?V) (content 0))
=>
(assert (claim (content ?P ?X) (reason ?N)
(scope ?V) (context 1))
)
;;----------------------------------------------------------------------
;; ЕСЛИ при анализе левого дизъюнкта обнаружено
;; противоречие,
;; ТО проанализировать правый дизъюнкт.
(defrule right-disjunct
?W <- (world (tag ?N) (task contra) (context 1))
(claim (content OR ?P ?X ?Q ?Y) (reason ?N)
(scope ?V))
=>
(assert (claim (content ?Q ?Y) (reason ?N)
(scope ?V) (context 2)))
(modify ?W (task check) (context 2))
)
;;----------------------------------------------------------------------
;; ЕСЛИ выполнен откат к анализу правого дизъюнкта,
;; ТО установить соответствующий контекст.
(defrule resume-disjunct
?W <- (world (tag ?N) (task back) (context 1))
(claim (content OR ?P ?X ?Q ?Y) (reason ?N)
(scope ?V))
=>
(assert (claim (content ?Q ?Y) (reason ?N)
(scope ?V) (context 2)))
(modify ?W (task check) (context 2))
)
;;----------------------------------------------------------------------
;; ЕСЛИ анализ обоих дизъюнктов в предположении о
;; правдивости персонажа привёл к противоречию
;; в том же самом «мире»,
;; ТО выполнить анализ, предполагая, что персонаж лжёт.
(defrule false-disjuncts
?W <- (world (tag ?M) (scope truth) (task contra)
(prior 0) (context 2))
(not (claim (reason ?M) (context 2)))
=>
(modify ?W (scope falsity) (task check) (context 0))
)
;;----------------------------------------------------------------------
;; ЕСЛИ аналих в предположении о правдивости персонажа
;;привёл к противоречию с другим «миром»,
;; ТО выполнить анализ, предполагая, что персонаж лжёт.
(defrule other-world
?W <- (world (tag ?N) (scope truth) (task contra)
(prior ?M&~0) (context 0))
=>
(modify ?W (scope falsity) (task check))
)
;;----------------------------------------------------------------------
;; ОБРАБОТКА ПРОТИВОРЕЧИЙ
;;----------------------------------------------------------------------
;; ЕСЛИ обнаруживается противоречие между предположением
;; и производными от него фактами в пределах одного и
;; того же мира и в одном и том же контексте,
;; ТО зафиксировать противоречия и удалить
;; противоречивые утверждения (объект claim)
;; из базы фактов.
(defrule contradiction
(declare (salience 100))
?W <- (world (tag ?N) (task check) (scope ?V)
(context ?S))
?P <- (claim (content ?F ?X) (scope ?V) (reason ?N)
(context ?S))
?Q <- (claim (content ?G&: (not (eq ?G ?F)) ?X)
(scope ?V) (reason ?N) (context ?S))
=>
(printout
t crlf
“CONTRADICTION: “ ?F ?X “ versus “
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14