Расширение набора правил – работа с составными высказываниями
Нам потребуется модифицировать и прежний вариант правила centra-truth.
;; Выявление противоречия между предположением о ;; правдивости и следующими из него фактами ;; в одном и том же контексте одного и того же объекта world. (defrule contra-truth (declare (salience 10)) ?W ← (world (tag?N) (scope truth)) ?P ← (claim (content Т?Х) (reason?N) (context?S) (scope truth))?Q ← (claim (content F?X) (reason?N) (context?S) (scope truth)) › (printout t "Statement is inconsistent if "?X " is a knight" ;; "Высказывание противоречиво, если "? X ;; " правдолюбец. " crlf) (retract?Q) (retract?P) (modify?W (scope falsity) (context 0) ;; Выявление противоречия между предположением о ;; лживости и следующими из него фактами ;; в одном и том же контексте одного и того же объекта world. (defrule contra-falsity (declare (salience 10)) ?W ← (world (tag?N) (scope falsity)) ?P ← (claim (content F?X) (reason?N) (context?S) (scope falsity)) ?Q ← (claim (content Т?Х) (reason?N) (context?S)(scope falsity)) › (printout t "Statement is inconsistent whether "?X " is knight or knave." ;; "Высказывание противоречиво, независимо от того," ;; "является ли "?Х " правдолюбцем или лжецом." crlf) (modify?W (scope contra))
Поскольку теперь постановка задачи усложнилась по сравнению с вырожденным случаем, имеет смысл включить в программу распечатку предположений о характеристиках персонажей, упомянутых в высказываниях.
(defrule consist-truth (declare (salience – 10)) ?W ← (world (tag?N) (scope truth)) (statement (speaker?Y) (tag?N)) › (printout t "Statement is consistent:" ;; "Высказывание непротиворечиво:" crlf) (modify?W (scope consist) ) (defrule consist-falsity (declare (salience – 10))?W ← (world (tag?N) (scope falsity)) (statement (speaker?Y) (tag?N)) › (printout t "Statement is consistent:" ;; "Высказывание непротиворечиво:" crlf) (modify?W (scope consist) ) (defrule true-knight (world (tag?N) (scope consist)) ?C ← (claim (content T?X) (reason?N) › (printout t ?X "is a knight";;?X " – правдолюбец" crlf) (retract?C) ) (defrule false-knave (world (tag?M) (scope consist)) ?C ← (claim (content F?X) (reason?N)) (printout t ?X " is a knave";;?X " – лжец" crlf) (retract?C))