Упражнение 2
Разработайте самостоятельно правило, которое оперировало бы с объектом claim содержим утверждение в конъюнктивной форме, как показано ниже. (claim (content AND Т A F В) (reason 1) (scope truth)) Это правило должно разделить такое утверждение на два: суть первого — утверждение, что А — правдолюбец, а второго — утверждение, что В — лжец. Новые объекты claim должны существовать в текущем контексте, определенном в объекте world. Далее разработаем правила, чувствительные к контексту, которые будут выявлять наличие противоречий в анализируемых утверждениях. ;; Выявление противоречия между предположением о ;; правдивости и следующими из него фактами ;; в разных контекстах одного и того же объекта world, (defrule contra-truth-scope (declare (salience 10)) (world (tag?N) (scope truth) (context?T)) (claim (content Т?Х) (reason?N) (scope truth) (context?S&:(<?S?T)))?Q <- (claim (content P?x) (reason?N) (scope truth) (context?T)) => (printout t "Disjunct "?T " is inconsistent with earlier truth context. " ;; "Дизъюнкт "?T ;; " противоречит ранее установленному контексту правдивости. " crlf) (retract?Q) ) ;; Выявление противоречия между предположением о ;; лживости и следующими из него фактами ;; в разных контекстах одного и того же объекта world. (defrule contra-falsity-scope (declare (salience 10)) ?W <- (world (tag?N) (scope falsity) (context?T» (claim (content F?X) (reason?N) (scope falsity) (context?S&:(<?S?T)))?Q <- (claim (content Т?Х) (reason?N) (scope falsity) (context?T)) => (printout t "Disjunct "?T " is inconsistent with earlier falsity context." ;; "Дизъюнкт "?T ;; " противоречит ранее установленному контексту лживости. " crlf) (retract?Q)) Нам потребуется модифицировать и прежний вариант правила 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)) Ниже приведено правило разделения операции конъюнкции, которое ранее мы предлагали вам разработать самостоятельно. Обратите внимание на то, что в нем также отслеживается контекст, хотя в данном случае без этого можно было бы и обойтись. (defrule conj (world (tag?N(context?S)) (claim (content AND?P?X?Q?Y) (reason?N) (scope?V)) => (assert (claim (content?P?X) (reason?N) (scope?V) (context?S))) (assert (claim (content?Q?Y) (reason?N) (scope?V) (context?S)))) Прежде чем запустить программу на выполнение, сформируем исходные факты в соответствии с условиями задачи Р4: (deffacts the-facts (world) (statement (speaker A) (claim AND F A F B) (tag 1))) После запуска программы в режиме трассировки интерпретатор сформирует распечатку процесса ее выполнения, приведенную в листинге А.2.
|