Hello,
i'm writing a simple example to show how Jess do the backward chaining.here my example:
;;****************
;;* DEFFUNCTIONS *
;;****************
(deffunction ask-question (?question $?allowed-values)
(printout t ?question )
(bind ?answer (read))
(if (lexemep ?answer)
then (bind ?answer (lowcase ?answer))
(store answer ?answer) )
(while (eq FALSE (member$ ?answer ?allowed-values)) do
(printout t ?question crlf)
(bind ?answer (read))
(if (lexemep ?answer)
then (bind ?answer (lowcase ?answer))))
(store reponse ?answer))
(deffunction yes-or-no-p (?question)
(bind ?response (ask-question ?question "oui" "non" "o" "n"))
(bind ?reponse (fetch reponse))
(import java.lang.String )
(new
java.lang.String "reponse" )
(if (call (new java.lang.String (fetch reponse) ) startsWith "o")
then TRUE
else FALSE))
;;;***************************
;;;*DEFINITIONS DES DEFTEMPLATE *
;;;***************************
(deftemplate assassin
(slot noma)
(slot nomv)
(slot jour))
(deftemplate p-desire-t
(slot nomdt)
(slot nomdv))
(deftemplate a-interet-t
(slot nomit)
(slot nomiv))
;;;**********************
;;;* REGLES D'INFERENCE *
;;;**********************
(defrule assassinat "R1"
(declare (salience 30))
(possède-arme ?x)
(congé ?x dimanche)
(p-desire-t(nomdt ?x) (nomdv ali))
(suspect ?x)
=>
(assert (assassin(noma ?x)(nomv ali) (jour dimanche)))
(printout t ?x " a tué Ali dimanche" crlf)
(retract 1))
(do-backward-chaining a-interet-t)
(do-backward-chaining p-desire-t)
;(set-strategy breadth)
(defrule nom-suspect "R2"
(declare (salience 10))
=>
(ask-question "Ali a été assassiné dimanche. Qui suspectez vous pouvoir le tuer (karim/sami/mohamed/jamel)?"
"karim" "sami" "mohamed" "jamel")
(if (call (new java.lang.String (fetch reponse) ) startsWith "k")
then (assert(suspect karim))
(if(yes-or-no-p "Est ce que votre suspect possède une arme (oui/non)?")
then (assert(possède-arme karim))
else (retract 1)(printout t " votre suspect ne peut pas être le tueur" crlf crlf)));
(if (call (new java.lang.String (fetch reponse) ) startsWith "s")
then (assert(suspect sami))
(if(yes-or-no-p "Est ce que votre suspect possède
une arme (oui/non)?")
then (assert(possède-arme sami))
else (retract 1)(printout t " votre suspect ne peut pas être le tueur" crlf crlf)))
(if (call (new java.lang.String (fetch reponse) ) startsWith "m")
then (assert(suspect mohamed))
(if(yes-or-no-p "Est ce que votre suspect possède une arme (oui/non)?")
then (assert(possède-arme mohamed))
else (retract 1)(printout t " votre suspect ne peut pas être le tueur" crlf crlf)))
(if (call (new java.lang.String (fetch reponse) ) startsWith "j")
then (assert(suspect jamel))
(if(yes-or-no-p "Est ce que votre suspect possède une arme (oui/non)?")
then (assert(possède-arme jamel))
else (retract 1)(printout t " votre suspect ne peut pas être le tueur" crlf crlf))))
(defrule congé"R3"
(declare (salience 10))
(possède-arme ?x)
(suspect ?x)
=>
(if(yes-or-no-p "Est ce que votre suspect est en congé dimanche le jour du crime (oui/non)?")
then (assert(congé ?x dimanche))
else (retract 1)(printout t " votre suspect ne peut pas être le tueur" crlf crlf)))
(defrule peut-desire-tuer "R4"
(declare (salience 10))
(desire-vonger ?x ali)
(suspect ?x)
=>
(assert(p-desire-t (nomdt ?x) (nomdv ali))))
(defrule peut-desire-tuer "R5"
(declare (salience 10))
(a-interet-t (nomit ?x) (nomiv ali))
(suspect ?x)
=>
(assert(p-desire-t (nomdt ?x) (nomdv ali))))
(defrule des-vonger "R6"
(declare (salience 10))
(suspect ?x)
=>
(if(yes-or-no-p "Est ce que votre suspect désirait se
vonger de Ali (oui/non)?")
then (assert(desire-vonger ?x ali))))
(defrule a-interet-tuer "R7"
(declare (salience 10))
(hérite ?x ali)
(suspect ?x)
=>
(assert(a-interet-t (nomit ?x) (nomiv ali))))
(defrule hérite "R8"
(declare (salience 10))
(suspect ?x)
=>
(if(yes-or-no-p "Est ce que votre suspect hérite de Ali (oui/non)?")
then (assert(hérite ?x ali))))
(defrule a-interet-tuer "R9"
(declare (salience 10))
(doit-argent ?x ali)
(suspect ?x)
=>
(assert(a-interet-t (nomit ?x) (nomiv ali))))
(defrule doit-argent "R10"
(declare (salience 10))
(suspect ?x)
=>
(if(yes-or-no-p "Est ce que votre suspect doit de l'argent à Ali
(oui/non)?")
then (assert(doit-argent ?x ali))))
(defrule a-interet-tuer "R11"
(declare (salience 10))
(vu-commettre-crime ali ?x)
(suspect ?x)
=>
(assert(a-interet-t (nomit ?x) (nomiv ali))))
(defrule voir-commettre "R12"
(declare (salience 10))
(suspect ?x)
=>
(if(yes-or-no-p "Est ce que Ali a vu votre suspect commettre un crime (oui/non)?")
then (assert(vu-commettre-crime ali ?x))))
the example look like:
if A, B, C then Z
if E then C
if F tnen C
if G then F
if H then F
if I then F
KB={A, B}
i want to evaluate Z with a backward chaining .
it run succeffully if i insert a fact" I" that correspond with the rule if F then C , but it fail if i insert the fact H or G .
. is there something wrong in my rules ?
Yahoo! Mail réinvente le mail ! Découvrez le nouveau Yahoo! Mail et son interface révolutionnaire.
