(deffunction my-function (?x) (printout t "The argument is " ?x crlf) ) (my-function foobar) (deffunction test (?a ?b) (+ ?a ?b) (* ?a ?b)) (test 3 2) (deffunction distance (?x1 ?y1 ?x2 ?y2) (bind ?dx (- ?x1 ?x2)) (bind ?dy (- ?y1 ?y2)) (sqrt (+ (* ?dx ?dx) (* ?dy ?dy))) ) (defrule calculate-distance (point ?x1 ?y1) (point ?x2 ?y2) => (assert (distance (distance ?x1 ?y1 ?x2 ?y2))) ) (defrule ask-user (person) => (printout t "first name? ") (bind ?surname (read)) (printout t "Family name? ") (assert (person ?surname (read))) (printout t "Why are you creating this person? ") (bind ?string (readline)) ) (defrule detection-to-diagnosis ?context <- (context detection) (fault ?f detected) => (retract ?context) (assert (context diagnosis)) (printout t "Fault " ?f " detected!" crlf) ) (defrule diagnosis-to-repair ?context <- (context diagnosis) (fault ?f detected) (fault ?f diagnosis ?d) => (retract ?context) (assert (context repair)) (printout t " Fault " ?f " diagnosis " ?d crlf) ) (defrule repair-to-detection ?c <- (context repair) (fault ?f diagnosis ?d repair ?r) => (retract ?c) (assert (context detection)) (printout t "Fault repaired" crlf) ) (deffacts control-list (context detection) (next-context detection diagnosis) (next-context diagnosis repair) (next-context repair detection) ) (defrule context transition rule. (declare (salience -10)) ?P <- (context ?context) (next-context ?context ?next) => (retract ?P) (assert (context ?next)) ) ;; Representing Frames with Objects (defclass PERSON (is-a USER) (role concrete) (slot FAMILY (create-accessor read-write)) (slot FIRST-NAME (create-accessor read-write)) ) (make-instance of PERSON) (make-instance John of PERSON) (describe-class PERSON) (defclass ENSI (is-a STUDENT) (role concrete) (slot NATIONALITY (default FRENCH)) (slot SCHOOL (default ENSIMAG)) ) (make-instance Jean of ENSI (NAME "Jean")) (defclass PERSON (is-a USER) (slot NAME (create-accessor read-write)) (slot FAMILY (create-accessor read-write)) ) (defclass STUDENT (is-a PERSON) (slot SCHOOL (create-accessor read-write))) (defclass ENSI (is-a STUDENT) (role concrete) (slot NATIONALITY (default FRENCH) (create-accessor read-write)) (slot SCHOOL (default ENSIMAG) (create-accessor read)) ) (make-instance Jean of ENSI (NAME "Jean") (NATIONALITY French)) (send [Jean] put-FAMILY "Dupont") (send [Jean] get-NATIONALITY) (send [Jean] get-SCHOOL) (defmessage-handler get- primary () ?self:) (defmessage-handler put- primary (?value) (bind ?self: ?value) ;; For a multislot (defmessage-handler put- primary ($?value) (bind ?self: $?value) ;; ?self (defclass THING (is-a USER) (role concrete) (slot NAME (create-accessor read-write) (default A)) ) (defmessage-handler THING ask-name () (?self:NAME) ) (defmessage-handler THING return-name () ?self:NAME) (defclass THING (is-a USER) (role concrete) (slot NAME (create-accessor read-write) (default A)) (slot PTR (create-accessor read-write)) ) (make-instance A of THING (NAME A)) (make-instance B of THING (NAME B) (PTR [A])) (defmessage-handler THING return-name () (send ?self:PTR get-NAME) ) (defclass A (is-a USER) (role concrete) (pattern-match reactive) (slot foo (create-accessor write) ) ) (make-instance a of A) (defrule test-for-A ?ins <- (object (is-a A)) => (printout t "Object " ?ins " is a member of class A" crlf) ) ;; We can discover the class name: (defrule test-for-A ?ins <- (object (is-a ?A)) => (printout t "Object " ?ins " is a member of class " ?A crlf) ) (defrule print-A-foo ?ins <- (object (is-a A) (foo ?f&~nil)) => (printout t "Object " ?ins " foo = " ?f crlf) ) (run) (send [a] put-foo bar) (run) (defclass PERSON (is-a USER) (role concrete) (pattern-match reactive) (slot FAMILY (create-accessor read-write)) (slot NAME (create-accessor read-write)) (slot AGR (create-accessor read-write)) (multislot ADDRESS (create-accessor read-write)) ) (defrule Ask-Family-Names ?ins <- (object (is-a PERSON) (FAMILY nil)) => (printout t "What is the family of "?ins "? ") (send ?ins put-FAMILY (read)) ) (defrule demande-fname ?ins <- (object (is-a PERSON) (NAME nil)) => (printout t "What is the First Name of "?ins "? ") (send ?ins put-NAME (read)) ) (make-instance [Fred] of PERSON) (make-instance [Bob] of PERSON (NAME Bob)) (run) (defclass STUDENT (is-a USER) (role concrete) (pattern-match reactive) (slot family (create-accessor read-write)) (slot fname (create-accessor read-write)) (slot age (create-accessor read-write)) (slot option (create-accessor read-write)) (slot promo (create-accessor read-write)) ) (make-instance [Bob] of PERSON (fname Bob) (family Barker) (age 20)) (make-instance [B] of STUDENT (fname Bob) (family Barker)) ;; ;; Determine the class of an objet ;; (defrule determine-class ?o <- (object (is-a ?c)) => (printout t "The object " ?o " is of class "?c "." crlf) ) ;; ;; Rules can complete values for objects. ;; (defrule determine-age ?o1 <- (object (family ?f&~nil) (fname ?p&~nil) (age ?a&~nil)) ?o2 <- (object (is-a ?c) (family ?f) (fname ?p) (age nil)) => (send ?o2 put-age ?a) (printout t "assign age " ?a " for ") (printout t ?c" " ?p " " ?f "." crlf)