Обработка метавысказываний
;;Теперь разработаем правило, которое будет ;;"распаковывать" высказывание о высказывании. ;; ЕСЛИ объект world базируется на предположении о ;; правдивости метавысказывания, ;; ТО предположить, что персонаж говорит правду и что ;; высказывание истинно. (defrule unwrap-true-state ?W ← (world (tag?N) (scope truth) (task check) (done 0))?S ← (statement (speaker?X) (claim SAY?Z $?Y) (done 0)) › (printout t crlf "Assuming " Т?X " and "?Z " says " $?Y " in world "?N ;; "Предполагается " Т?X " и "?Z " говорит " $?Y ;; "в мире "?N t crlf ) ;; Зафиксировать, что высказывание было распаковано ;; в предположении о его правдивости, (modify?S (tag?N) (done 1)) ;; Предположим, что персонаж в текущем "мире" является ;; правдолюбцем. (assert (claim (content T?X) (reason?N) (scope truth))) ;; Зафиксировать в объекте world, что высказывание ;; распаковано, (modify?W (done 1)) ;; Сформировать новый объект world для внедренного ;; высказывания и зафиксировать, что этот объект ;; является внутренним по отношению к объекту?N. (assert (world (tag (+?N 1)) (scope truth) (upper?N))) ;; Зафиксировать внедренное высказывание в новом ;; объекте world. (assert (statement (speaker?Z) (claim $?Y) (reason?N))) ) ;; ЕСЛИ объект 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))))
Чтобы облегчить себе жизнь, будем считать, что в метавысказывании не может быть отрицания, т.е. мы не будем рассматривать метавысказывания вида:
А: "В не говорил, что он правдолюбец".
Более того, если А говорит, что В заявил нечто, то по условиям, принятым в головоломках этого класса, для того чтобы доказать, что А лжец, требуется только показать, что не существует непротиворечивого "мира", в котором В мог бы сделать правдивое утверждение.
Таким образом, нам не придется обрабатывать отрицания в метавысказываниях и анализировать их непротиворечивость. Указанные условия нашли свое отражение в правиле unwrap-false-state. В этом правиле которое активизируется, когда предположение о правдивости персонажа не срабатывает, просто предполагается, что этот персонаж лжет, а более глубокий анализ не проводится.