;; ;; Example of a use of a context element to structure processing. ;; (defrule detection-to-identification (declare (salience 0)) ?context <- (context detection) (fault detected) ;; => (retract ?context) (assert (context identification)) (printout t "Fault detected!" crlf) ) (defrule identification-to-recovery (declare (salience 0)) ?context <- (context identification) (fault id ?p) ; => (retract ?context) (assert (context recovery)) (printout t "fault identified: id = " ?p crlf) ) (defrule recovery-to-detection (declare (salience 0)) ?context <- (context recovery) (fault isolated) ;; conditions de identification du panne => (retract ?context) (assert (context detection)) (printout t "fault repaired" crlf) ) (defrule find-fault (declare (salience 20)) (context identification) => (printout t "So, what broke this time? ") (assert (fault id =(read))) ) (defrule recover-from-fault (declare (salience 20)) (context recovery) (fault identifie ?p) (recovery-solution ?p ?replacement) => (set ?p off) ;; function defined by user. (set ?replacement on) (assert (fault isolated)) ) ;; function to set a component on or off (deffunction set (?a ?b) (printout t ?a " is set to " ?b crlf)) (set motor off) (defrule recover-from-fault (declare (salience 20)) (context recovery) (fault id ?p) (recovery-solution ?p ?replacement) => (set ?p off) (set ?replacement on) (assert (fault isolated)) ) ;;; ;; Encoding context with facts ;;; (deffacts context-list (context detection) (context-after detection identification) (context-after identification recovery) (context-after recovery detection) ) (defrule control-of-contexts (declare (salience -10)) ?P <- (context ?c) (context-after ?c ?next) => (retract ?P) (assert (context ?next)) ) ;; domain knowledge in rules ;; including rule for unable to correct (undefrule recovery-to-detection) (defrule recovery-to-detection ?c <- (context recovery) ?fault <-(fault id motor) => (set motor off) ;; fonction definit par l'utilisateur. (set back-up-motor on) (printout t "fault elimined" crlf) (retract ?context ?c ) (assert (context detection)) ) ;;; ;;; If unable to detect fault ;;; (defrule nonrecovery-to-detection (declare (salience -10)) ?context <- (context recovery) => (retract ?context) (assert (context out-of-service)) (printout t "unable to recover" crlf) (printout t "system out-of-service" crlf) ) (assert (context detection)) (assert (fault detected)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Decision tree - Guess the animals ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (clear) (deffacts tree (node root decision "Is it warm blooded?" n1 n2) (node n1 decision "Does it purr?" n3 n4) (node n2 response serpent) (node n3 response cat) (node n4 response dog) ) ;; old init rule (defrule init (initial-fact) => (assert (current-node root)) ) ;; regle de demander pour le node de decision (defrule make-decision ?N <- (current-node ?name) (node ?name decision ?q ?yes ?no) => (retract ?N) (format t "%s (yes or no) " ?q) (bind ?response (read)) (if (eq ?response yes) then (assert (current-node ?yes) ) else (assert (current-node ?no)) ) ) ;; regle de traiter les responses (defrule make-response ?N <- (current-node ?name) (node ?name response ?r) => (printout t "I think it is a " ?r crlf) (printout t "is this correct? (yes or no) ") (bind ?rep (read)) (if (eq ?rep yes) then (assert (phase ask-again)) (retract ?N) else (assert (phase learn)) ) ) ;; regle de essaie encore (defrule esssaie-encore ?phase <- (phase ask-again) => (retract ?phase) (printout t "essaie encore [yes or no]?") (bind ?rep (read)) (if (eq ?rep yes) then (printout t "je bien appris ma lecon!" crlf) (assert (current-node root)) else (save-facts "animal.dat") ) ) ;; regles d'apprendre un nouvel response (defrule learn ?P <- (phase learn) ?N <- (current-node ?name) ?D <- (node ?name response ?r) => (retract ?P ?N ?D) ;; ask the right answer (printout t "what is the animal? ") (bind ?new (read)) (printout t "what question should I ask ") (printout t "a " ?new " from a " ?r "? "crlf) (printout t "(response yes for " ?new ")?" ) (bind ?question (readline)) (bind ?newnode1 (gensym*)) (bind ?newnode2 (gensym*)) (assert (node ?newnode1 response ?new)) (assert (node ?newnode2 response ?r)) (assert (node ?name decision ?question ?newnode1 ?newnode2)) (assert (phase ask-again)) ) ;; regle d'ouverture et lecture du fichier animal.dat (defrule init (initial-fact) => (assert (file (open "animal.dat" data "r"))) ) (defrule no-file ?f <- (file FALSE) => (retract ?f) (assert (current-node root)) ) (defrule init-file ?f <- (file TRUE) => (bind ?in (readline data)) (printout t ?in crlf) (if (eq ?in EOF) then (assert (eof)) else (assert-string ?in) (retract ?f) (assert (file TRUE)) ) ) (defrule eof (declare (salience 30)) ?f <- (file TRUE) ?eof <- (eof) => (retract ?f ?eof) (close data) (assert (current-node root)) ) ;;;; ;;;; ;; backward chaining? ;;;; ;;;; (defrule interpret (but ?name) (not (attribut ?name ?)) (if ?variable $? then ?name ? ?) => (assert (but ?variable)) ) (defrule demander-attribut-valeur ?but <- (but ?name) (not (attribut ?name ?)) (not (if ?variable $? then ?name ? ?)) => (retract ?but) (printout t "Quelle est le valeur de " ?name "? ") (assert (attibut ?name =(read))) )