;; JESS backward chaining example ;; ;; adapted from Nilsson, 1980 ;; facts (deftemplate dog (slot name)) (deftemplate cat (slot name)) (deftemplate barking (slot name)) (deftemplate meowing (slot name)) (deftemplate tail-wagging (slot name)) (deftemplate friendly (slot name)) (deftemplate unafraid-of (slot hero) (slot erstwhile-bully)) (deffacts start-state (dog (name Fido)) (tail-wagging (name Fido)) (meowing (name Myrtle))) (do-backward-chaining cat) (do-backward-chaining unafraid-of) (do-backward-chaining friendly) ;; rules ;; This rule established the initial goals (defrule goal-expression "Find a cat unafraid of a dog" (cat (name ?c)) (dog (name ?d)) (unafraid-of (hero ?c) (erstwhile-bully ?d)) => (printout t "The cat " ?c " is not afraid of the dog " ?d "." crlf)) ;; backward chaining rules (defrule a-cat-meows (need-cat) (meowing (name ?c)) => (assert (cat (name ?c)))) (defrule dog-gets-no-respect (need-unafraid-of (hero ?n1) (erstwhile-bully ?n2)) (friendly (name ?n2)) (not (barking (name ?n2))) => (assert (unafraid-of (hero ?n1) (erstwhile-bully ?n2)))) (defrule friendly-dogs (need-friendly (name ?n)) (tail-wagging (name ?n)) (dog (name ?n)) => (assert (friendly (name ?n))))