Expert Systems Chapter 7 Introduction to CLIPS
Entering and Exiting CLIPS A> CLIPS CLIPS (V6.5 09/01/97) CLIPS> exit exit CLIPS> (+ 3 4) 7 CLIPS> (exit) A> 7.5
Facts A “chunk” of information in CLIPS is called a fact. Facts consists of a relation name followed by zero or more slots and their associated values. (person (name “John Q. Public”) (age 23) (eye-color blue) (hair-color black)) The order in which slots are specified is irrelevant. 7.6
Deftemplate Construct Defining the list of valid slots for a given relation name. Analogous to a record structure in Pascal. Format: (deftemplate [ ] *) : (slot | ( multislot )
Defining “ person ” fact (deftemplate person “An example deftemplate” (slot name) (slot age) (slot eye-color) (slot hair-color)) (person (name “John Q. Public”) (age 23) (eye-color blue) (hair-color black)) The “person” template The fact following the format of “person” template
Multifield Slots Slots of a fact that have been specified with the slot keyword in their deftemplates are allowed to contain only one value. Which specified with multislot keyword are allowed to contain zero or more values.
Defining “ person ” fact with multislot (deftemplate person “An example deftemplate” (multislot name) (slot age) (slot eye-color) (slot hair-color)) (person (name John Q. Public) (age 23) (eye-color blue) (hair-color brown)) Multislot Specifying multislot
Ordered Facts Facts with a relation name that has a corresponding deftemplate are called deftemplate facts. Facts with a relation name that does not have a corresponding deftemplate are called ordered facts. Whenever CLIPS encounters an ordered fact it automatically creates an implied deftemplate for that fact (as opposed to an explicit deftemplate, created using the deftemplate construct).
Example: (number-list ) is equivalent to defining (deftemplate number-list (multislot values)) and then defining the fact as (number-list (values ))
Cases where Ordered Facts are useful Case 1: Facts consisting of just a relation name are useful as flags and look identical regardless of whether a deftemplate has been defined. (all-orders-processed) Case 2: For facts containing a single slot, the slot name is usually synonymous with the relation name. (time (value 8:45)) can be changed to (time 8:45)
CONSTRUCT DEFTEMPLATE IMPLIED DEFTEMPLATE EXPLICIT DEFTEMPLATE FACT ORDERED FACT DEFTEMPLATE FACT (number-list ) (person (name John Q. Public) (age 23) (eye-color blue) (hair-color brown)) (deftemplate person (multislot name) (slot age) (slot eye-color) (slot hair-color)) Is-a IS-A Creates Is-a Creates Is-a
CONSTRUCT DEFTEMPLATE IMPLIED DEFTEMPLATE EXPLICIT DEFTEMPLATE FACT ORDERED FACT DEFTEMPLATE FACT (number-list ) (person (name John Q. Public) (age 23) (eye-color blue) (hair-color brown)) (deftemplate person (multislot name) (slot age) (slot eye-color) (slot hair-color)) Is-a IS-A Creates Is-a Creates Is-a Relation Name
CONSTRUCT DEFTEMPLATE IMPLIED DEFTEMPLATE EXPLICIT DEFTEMPLATE FACT ORDERED FACT DEFTEMPLATE FACT (number-list ) (person (name John Q. Public) (age 23) (eye-color blue) (hair-color brown)) (deftemplate person (multislot name) (slot age) (slot eye-color) (slot hair-color)) Is-a IS-A Creates Is-a Creates Is-a Fields
CONSTRUCT DEFTEMPLATE IMPLIED DEFTEMPLATE EXPLICIT DEFTEMPLATE FACT ORDERED FACT DEFTEMPLATE FACT (number-list ) (person (name John Q. Public) (age 23) (eye-color blue) (hair-color brown)) (deftemplate person (multislot name) (slot age) (slot eye-color) (slot hair-color)) Is-a IS-A Creates Is-a Creates Is-a Slots Slot Name Slot Value (a field)
CONSTRUCT DEFTEMPLATE IMPLIED DEFTEMPLATE EXPLICIT DEFTEMPLATE FACT ORDERED FACT DEFTEMPLATE FACT (number-list ) (person (name John Q. Public) (age 23) (eye-color blue) (hair-color brown)) (deftemplate person (multislot name) (slot age) (slot eye-color) (slot hair-color)) Is-a IS-A Creates Is-a Creates Is-a Multifield Slot Single-field Slot
Adding Facts Syntax: (assert +) Example: CLIPS> (deftemplate person (slot name) (slot age) (slot eye-color) (slot hair-color)) CLIPS> (assert (person (name “John Q. Public”) (age 23) (eye-color blue) (hair-color black))) CLIPS> 7.7
Display the facts Syntax: (facts) Example: CLIPS> (facts) f-0 (person (name “John Q. Public”) (age 23) (eye-color blue) (hair-color black)) For a total of 1 fact. CLIPS> Fact identifier, 0: fact index
Asserting multiple facts with single assert (assert (person (name “John Q. Public”) (age 23) (eye-color blue) (hair-color black)) (person (name “Jane Q. Public”) (age 26) (eye-color green) (hair-color red)))
Removing Facts Syntax: (retract +) Example: John Q. Public can be removed from the fact list with the command (retract 0) and Jane can be removed by (retract 1) Attempting to retract a nonexistent fact will produce an error.
Modifying Facts Syntax: (modify +) Example: CLIPS> (modify 0 (age 24)) CLIPS> (facts) f-2(person (name “John Q. Public”) (age 24) (eye-color blue) (hair-color black)) For a total of 1 fact. CLIPS> A new fact index is generated for a modified fact. 7.8
Duplicating Facts Works the same with modify but not retracting the original fact. Syntax: (duplicate +)
Example: CLIPS> (duplicate 2 (name “Jack S. Public”)) CLIPS> (facts) f-2(person (name “John Q. Public”) (age 24) (eye-color blue) (hair-color black)) f-3 (person (name “Jack S. Public”) (age 24) (eye-color blue) (hair-color black)) For a total of 2 facts. CLIPS>
Debugging Syntax: (watch ) The is one of the symbols facts, rules, activations, statistics, compilations, focus, or all. By default, when CLIPS is first started, compilations are watched and the remaining watch items are not watched. 7.9
Example: CLIPS> (facts 3 3) f-3 (person (name “Jack S. Public”) (age 24) (eye-color blue) (hair-color black)) For a total of 1 fact. CLIPS> (watch facts) CLIPS> (modify 3 (age 25)) f-4 (person (name “Jack S. Public”) (age 25) (eye-color blue) (hair-color black)) CLIPS> Indicating that the fact is being retracted. Indicating that the fact is being asserted.
Defining Initial Knowledge It is convenient to be able to automatically assert a set of facts instead of typing in the same assertions from the top level. Initial knowledge: facts that are known to be true before running a program. Groups of facts that represent initial knowledge can be defined using the deffacts construct. 7.10
Deffacts Construct Syntax: (deffacts [ ] *) Example: (deffacts people “Some people we know” (person (name “John Q. Public”) (age 24) (eye-color blue) (hair-color black)) (person (name “Jack S. Public”) (age 24) (eye-color blue) (hair-color black)) (person (name “Jane Q. Public) (age 36) (eye-color green) (hair-color red)))
Reset The reset command removes all facts from the fact list and then asserts the facts from existing deffacts statement. CLIPS> (unwatch facts) CLIPS> (reset) CLIPS> (facts) f-0(initial-fact) f-1 (person (name “John Q. Public”) (age 24) (eye-color blue) (hair-color black)) f-2 (person (name “Jack S. Public”) (age 24) (eye-color blue) (hair-color black)) f-3 (person (name “Jane Q. Public) (age 36) (eye-color green) (hair-color red)) For a total of 4 facts. CLIPS>
Initial Fact A new fact generated by the reset command called initial-fact. Upon startup, CLIPS automatically defines the following two constructs: (deftemplate initial-fact) (deffacts initial-fact (initial-fact)) Even if no any deffacts statements defined, a reset will assert the fact (initial-fact).
Rules Rules can be typed directly into CLIPS or loaded in from a file of rules created by an editor. Example: pseudocode of plant monitoring IF the emergency is a fire THEN the response is to activate the sprinkler system Representing emergency: (deftemplate emergency (slot type)) Representing response: (deftemplate response (slot action)) 7.11
Rule Representation General format of a rule: (defrule [ ] * ;Left-hand side (LHS) => *) ;Right-hand side (RHS) Representing the rule: (defrule fire-emergency “An example rule” (emergency (type fire)) => (assert (response (action activate-sprinkler-system))))
Conditional Elements After the rule header are zero or more conditional elements (CEs). The simplest type of CE is a pattern CE or simply pattern. Each pattern consists of one or more constraints intended to match the fields of a deftemplate fact.
Example (defrule fire-emergency “An example rule” (emergency (type fire)) (emergency (type flood)) => (assert (response (action activate-sprinkler-system)))) pattern Conditional Elements
Rule without Pattern If a rule has no patterns, the special pattern (initial-fact) will be added as a pattern for the rule. Since the initial-fact deffacts is automatically defined, any rules with no patterns on their LHSs will be activated when a reset command is performed since the (initial-fact) fact will automatically be asserted. Thus any rule without LHS patterns will be placed on the agenda when a reset is performed
Program Execution Syntax: (run [ ]) limit: maximum number of rules to be fired The facts asserted by a reset satisfy the patterns of one or more rules and place activations of these rules on the agenda. Issuing the run command then begins execution of the program. 7.12
Displaying the Agenda Syntax: (agenda) Example: CLIPS> (reset) CLIPS> (assert (emergency (type fire))) CLIPS> (agenda) 0fire-emergency: f-1 For a total of 1 activation. CLIPS>
Run (Example continue) CLIPS> (run) CLIPS> (facts) f-0(initial-fact) f-1(emergency (type fire)) f-2(response action activate-sprinkler-system)) For a total of 3 facts. CLIPS>
Refraction Refraction: Rules in CLIPS won’t fire more than once for a specific set of facts. Without refraction, expert systems would always be caught in trivial loops. If necessary, the rule can be made to fire again by retracting the fact (emergency (type fire)) and asserting it again.
Refresh Command Used to make the rule fire again. Syntax: (refresh ) Example: CLIPS> (agenda) CLIPS> (refresh fire-emergency) CLIPS> (agenda) 0fire-emergency: f-1 For a total of 1 activation. CLIPS>
Watching Activations Example: CLIPS> (reset) CLIPS> (watch activations) CLIPS> (assert (emergency (type fire))) ==> Activation 0fire-emergency: f-1 CLIPS> (agenda) 0fire-emergency: f-1 For a total of 1 activation. CLIPS> (retract 1) (agenda) CLIPS>
Watching Rules CLIPS will print a message whenever a rule is fired. Example: CLIPS> (reset) CLIPS> (watch rules) CLIPS> (assert (emergency (type fire))) ==> Activation 0fire-emergency: f-1 CLIPS> (run) FIRE1 fire-emergency: f-1 CLIPS> (agenda) CLIPS>
Displaying Construct List Example: CLIPS> (list-defrules) fire-emergency For a total of 1 rule. CLIPS> (list-deftemplates) initial-fact emergency response For a total of 3 deftemplates. CLIPS> (list-deffacts) initial-fact For a total of 1 deffacts. CLIPS>
Pretty Print Example: CLIPS> (ppdefrule fire-emergency) (defrule MAIN::fire-emergency “An example rule” (emergency (type fire)) => (assert (response (action activate-sprinkler-system)))) CLIPS> (ppdeftemplate response) (deftemplate MAIN::response (slot action)) CLIPS> (ppdeffacts initial-fact) CLIPS> (deffacts start-fact (start-fact)) CLIPS> (ppdeffacts start-fact) (deffacts MAIN::start-fact (start-fact)) CLIPS>
Deleting Constructs Example: CLIPS> (undeffacts start-fact) CLIPS> (list-deffacts) initial-fact For a total of 1 deffacts. CLIPS> (undefrule fire-emergency) CLIPS> (list-defrules) CLIPS>
Clearing all Constructs Syntax: (clear) Example: CLIPS> (list-deffacts) CLIPS> (list-deftemplates) emergency response start-fact For a total of 3 deftemplates. CLIPS> (clear) CLIPS> (list-deffacts) initial-fact For a total of 1 deffacts. CLIPS> (list-deftemplates) initial-fact For a total of 1 deftemplate. CLIPS> After clearing, it adds the initial-facts deffacts to the environment.
Printout Syntax: (printout *) Example: (defrule fire-emergency (emergency (type fire)) => (printout t “Activate the sprinkler system” crlf)) Output: “Activate the sprinkler system” Stands for the standard output device of terminal. Carriage return/Line feed
Multiple Rules (defrule fire-emergency (emergency (type fire)) => (printout t “Activate the sprinkler system” crlf)) (defrule flood-emergency (emergency (type flood)) => (printout t “Shut down electrical equipment” crlf)) 7.15
Rules with Multiple Patterns (deftemplate extinguisher-system (slot type) (slot status)) (defrule class-A-fire-emergency (emergency (type class-A-fire)) (extinguisher-system (type water-sprinkler) (status off)) => (printout t “Activate water sprinkler” crlf)) (defrule class-B-fire-emergency (emergency (type class-B-fire)) (extinguisher-system (type carbon-dioxide) (status off)) => (printout t “Use carbon dioxide extinguisher” crlf))
Loading Constructs Syntax: (load ) Example: CLIPS> (load “fire.clp”) Defining deftemplate: emergency Defining deftemplate: response Defining defrule: fire-emergency +j TRUE CLIPS> If compilations are not being watched, then the character *, %, and $ will be used for defrules, deftemplates, and deffacts. 7.17
Saving Constructs Syntax: (save ) Example: (save “B:fire.clp”)
Comments ;* Programmer: G. D. Riley ; Deftemplates here (deftemplate emergency (slot type)) ; ;The purpose of this rule is to activate ; the sprinkler system if there is a fire (defrule fire-emergency ; There is a fire emergency (emergency (type fire)) => ; Activate the sprinkler system (printout t “Activate the sprinkler system” crlf))