;;; salience (defrule fire-first (declare (salience 30)) (priority first) => (printout t "fire me first" crlf) ) (clear) (defrule exemple (declare (salience 99)) (initial-fact) => (printout "J'ai un salience de 99" crlf) ) (reset) ;;; strategie exemple (set-strategy depth) (get-strategy) (defrule rule-A ?f <- (a) => (printout t "Rule A fires with " ?f crlf) ) (defrule rule-X ?f <- (a) => (printout t "Rule A fires with " ?f crlf) ) (defrule rule-B ?f <- (b) => (printout t "Rule B fires with " ?f crlf) ) (defrule rule-A-and-B ?f1 <- (a) ?f2 <- (b) => (printout t "Rule B fires with A =" ?f1 " and B = " ?f2 crlf) ) (assert (a)) (assert (a)) (assert (b)) (set-strategy depth) (set-strategy breadth) (set-strategy lex) (set-strategy mea) (set-strategy complexity) (set-strategy simplicity) (set-strategy random) (set-strategy depth) ;; exemple de utilisation de salience (defrule detection-vers-identification (declare (salience 0)) ?phase <- (phase detection) (panne detecte) ;; conditions de detection du panne => (retract ?phase) (assert (phase identification)) (printout t "il y a une panne!" crlf) ) (defrule identification-vers-recouperation (declare (salience 0)) ?phase <- (phase identification) (panne id ?p) ;; conditions de identification du panne => (retract ?phase) (assert (phase recouperation)) (printout t "panne trouver: id = " ?p crlf) ) (defrule recouperation-vers-detection (declare (salience 0)) ?phase <- (phase recouperation) (panne isole) ;; conditions de identification du panne => (retract ?phase) (assert (phase detection)) (printout t "panne elimine" crlf) ) (defrule trouver-panne ; une triche - on demande (declare (salience 20)) (phase identification) => (printout t "eh alors? c'est quoi cette panne? ") (assert (panne id =(read))) ) (defrule recouperer-du-fault (declare (salience 20)) (phase recouperation) (panne identifie ?p) (recouperation-solution ?p ?remplacement) => (set ?p off) ;; fonction definit par l'utilisateur. (set ?remplacement on) (assert (panne isole)) ) ;;phases. ;; exemple de utilisation des regles ;; (defrule detection-vers-identification ?phase <- (phase detection) (panne detecte) ;; conditions de detection du panne => (retract ?phase) (assert (phase identification)) (printout t "il y a une panne!" crlf) ) (defrule identification-vers-recouperation ?phase <- (phase identification) (panne id ?p) ;; conditions de identification du panne => (retract ?phase) (assert (phase recouperation)) (printout t "panne trouver: id = " ?p crlf) ) (defrule recouperation-vers-detection ?phase <- (phase recouperation) (panne isole) ;; conditions de identification du panne => (retract ?phase) (assert (phase detection)) (printout t "panne elimine" crlf) ) (defrule trouver-panne ; une triche - on demande (declare (salience 20)) (phase identification) => (printout t "eh alors? c'est quoi cette panne? ") (assert (panne id =(read))) ) ;; function factice pour set (deffunction set (?a ?b) (printout t ?a " is set to " ?b crlf)) (set moteur off) (defrule recouperer-du-fault (declare (salience 20)) (phase recouperation) (panne id ?p) (recouperation-solution ?p ?remplacement) => (set ?p off) ;; fonction definit par l'utilisateur. (set ?remplacement on) (assert (panne isole)) ) ;; utilisation des phase definis par les faits (deffacts controle-liste (phase detection) (phase-apres detection identification) (phase-apres identification recouperation) (phase-apres recouperation detection) ) (defrule control-des-phases (declare (salience -10)) ?P <- (phase ?phase) (phase-apres ?phase ?prochaine) => (retract ?P) (assert (phase ?prochaine)) ) (defrule control-des-phases (declare (salience -10)) ?P <- (phase ?phase) (phase-apres ?phase ?prochaine) => (retract ?P) (assert (phase ?prochaine)) ) ;; expertise du domaine (defrule recouperer-du-fault-moteur (phase recouperation) (panne id moteur) => (set moteur off) ;; fonction definit par l'utilisateur. (set back-up-moteur on) (assert (panne isole)) ) (assert (phase detection)) (assert (panne detecte)) ;; Modification pour le cas ou le panne n'est pas traite ;; par l'expertise ;; Placer la transition dans le regle de recuperation (undefrule recouperation-vers-detection) (defrule recouperer-du-fault-moteur ?phase <- (phase recouperation) ?panne <-(panne id moteur) => (set moteur off) ;; fonction definit par l'utilisateur. (set back-up-moteur on) (printout t "panne elimine" crlf) (retract ?phase ?panne) (assert (phase detection)) ) (defrule panne-nonrecouperation-vers-detection (declare (salience -10)) ?phase <- (phase recouperation) => (retract ?phase) (assert (phase hors-service)) (printout t "je ne sais pas recouperer" crlf) (printout t "systeme hors service" crlf) ) (assert (phase detection)) (assert (panne detecte)) ;; explicit definition des phases (deffacts controle-liste (phase detection) (phase-apres detection identification) (phase-apres identification recouperation) (phase-apres recouperation detection) ) (defrule control-des-phases (declare (salience -10)) ?P <- (phase ?phase) (phase-apres ?phase ?prochaine) => (retract ?P) (assert (phase ?prochaine)) ) (assert (phase detection)) ;;; Arbre de Decision (clear) (deffacts arbre (noeud racine decision "Est-ce que un animale de sang-chaud?" n1 n2) (noeud n1 decision "Est-ce que il ronron?" n3 n4) (noeud n2 reponse serpent) (noeud n3 reponse chat) (noeud n4 reponse chien) ) ;; vieux regle d'init (defrule init (initial-fact) => (assert (noeud-actuel racine)) ) ;; Init avec un fichier animal.dat (defrule init (initial-fact) => (assert (noeud-actuel racine)) ) ;; regle de demander pour le noeud de decision (defrule faire-decision ?N <- (noeud-actuel ?nom) (noeud ?nom decision ?q ?oui ?non) => (retract ?N) (format t "%s (oui ou non) " ?q) (bind ?reponse (read)) (if (eq ?reponse oui) then (assert (noeud-actuel ?oui) ) else (assert (noeud-actuel ?non)) ) ) ;; regle de traiter les reponses (defrule faire-reponse ?N <- (noeud-actuel ?nom) (noeud ?nom reponse ?r) => (printout t "Je pense que c'est un " ?r crlf) (printout t "c'est correcte? (oui ou non) ") (bind ?rep (read)) (if (eq ?rep oui) then (assert (phase demande-encore)) (retract ?N) else (assert (phase corrige-reponse)) ) ) ;; regle de essaie encore (defrule esssaie-encore ?phase <- (phase demande-encore) => (retract ?phase) (printout t "essaie encore [oui ou non]?") (bind ?rep (read)) (if (eq ?rep oui) then (printout t "je bien appris ma lecon!" crlf) (assert (noeud-actuel racine)) else (save-facts "animal.dat") ) ) ;; regles d'apprendre un nouvel reponse (defrule corrige-reponse ?P <- (phase corrige-reponse) ?N <- (noeud-actuel ?nom) ?D <- (noeud ?nom reponse ?r) => (retract ?P ?N ?D) ;; demander le bon reponse (printout t "quelle est l'animal? ") (bind ?new (read)) (printout t "quelle question a poser de distinguer ") (printout t "un " ?new " d'un " ?r "? "crlf) (printout t "(reponse oui pour " ?new ")?" ) (bind ?question (readline)) (bind ?newnode1 (gensym*)) (bind ?newnode2 (gensym*)) (assert (noeud ?newnode1 reponse ?new)) (assert (noeud ?newnode2 reponse ?r)) (assert (noeud ?nom decision ?question ?newnode1 ?newnode2)) (assert (phase demande-encore)) ) ;; 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 (noeud-actuel racine)) ) (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 (noeud-actuel racine)) ) ;;;; ;;;; ;; Chainage arriere ;;;; ;;;; (defrule interpret (but ?nom) (not (attribut ?nom ?)) (if ?variable $? then ?nom ? ?) => (assert (but ?variable)) ) (defrule demander-attribut-valeur ?but <- (but ?nom) (not (attribut ?nom ?)) (not (if ?variable $? then ?nom ? ?)) => (retract ?but) (printout t "Quelle est le valeur de " ?nom "? ") (assert (attibut ?nom =(read))) ) > xclips6