74.420 Expert Systems - University of Manitoba

Download Report

Transcript 74.420 Expert Systems - University of Manitoba

COMP 4200:
Expert Systems
Dr. Christel Kemke
Department of Computer Science
University of Manitoba
© C. Kemke
CLIPS Classes 1
CLIPS – Classes (COOL)
Intro to CLIPS – Classes (COOL)
 class definition
class specification
 slot specification, facets

instance creation
 message-handlers
 Classes and rules

© C. Kemke
CLIPS Classes 2
CLIPS – Example Classes
(defclass person
(is-a USER)
;provides reference to system-defined
;super-class USER
;this class can have instances
(role concrete)
(slot gender (type STRING))
(slot age (type NUMBER)))
;just slots with type
;constraints
(defclass man
(is-a person)
(slot gender (type STRING)(default “male”)))
Try: In the Browse-Menu, for the Defclass-Manager
and check the messagehandlers of these classes.
© C. Kemke
CLIPS Classes 3
CLIPS – Defining Classes
(defclass person
(is-a USER)
;provides reference to system-defined
;super-class USER
(role concrete)
(pattern-match reactive)*
;this class can have instances
;instances of this class can be
;used for pattern-matching in rules
(slot <slot-name>
;slot-specification
(create-accessor read-write) *
;read / write accessor
;created for this slot
(default <default-value>)
... <other facets>* ... ))
;default-value for slot
* Class and Slot descriptions often have defaults, e.g. pattern-match
reactive, or create-accessor read-write. Refer to the CLIPS bpg.
© C. Kemke
CLIPS Classes 4
CLIPS – Defining Instances
(definstances people
(mike of person
(gender “male”)
(age 24)) )
people is a list of instances
of class person; instance
mike is created.
(definstances men
(mark of man
(age 24)) )
men is a list of instances of
class man; here only one
instance named mark.
Note: instance-names in messages have to be put in [ ... ]
Try: (send [mark] get-gender) and (send [mike] get-gender)
Try: (send [mark] put-age 25)
© C. Kemke
CLIPS Classes 5
Message-Handlers
(defmessage-handler
<class-name>
<message-handler-name>
<body>
)
(<parameters>*)
Some message-handlers like get-<slot-name> or put-<slotname> are system pre-defined message-handlers.
© C. Kemke
CLIPS Classes 6
System-defined Message-Handlers
retrieving and storing slot-values
retrieve
 (send [instance] get-slot)
 e.g. (send [Titanic] get-speed)
store
 (send [instance] put-slot value)
 e.g. (send [Titanic] put-speed 20)
© C. Kemke
CLIPS Classes 7
Message-Handler - Example
(defmessage-handler person birthday ()
(send ?self put-age (+ (send ?self get-age) 1))
)
Message-Handler 'birthday' associated with class person (no
parameter) sends a message to ?self to put-age to the current
age + 1. It also works to use 'dynamic-put' which sends a putmessage for the age to the current instance to which the
birthday-message has been sent.
Try: (send [mark] birthday)
Try: substitute (send ?self ...) with dynamic-put or
dynamic-get
© C. Kemke
CLIPS Classes 8
Parameters in Message-Handlers
(defmessage-handler ship set-speed (?x)
(dynamic-put speed ?x))
)
Message-Handler set-speed associated with class ship sets
the speed of the current instance to the value of ?x.
e.g. (send [Titanic] set-speed 20)
sends a message to the instance [Titanic] of ship
which evaluates to (dynamic-put speed 20);
or (send ?self put-speed 20)
© C. Kemke
CLIPS Classes 9
if-then-else in Message-Handlers
Control Structures used in Message-Handlers.
(defmessage-handler ship slow-down ()
(if
(> ?self:speed 30)
then (send ?self put-speed 20))
)
instead of send to self: (dynamic-put speed 20))
instead of ?self:speed (dynamic-get speed))
Message-Handler 'slow-down' associated with class ship tests whether
speed of addressed instance is > 30 and then sends a message to ?self to
put-speed 20. It also works to use 'dynamic-put speed 20' which sends a
put-message for speed to the current instance.
© C. Kemke
CLIPS Classes 10
Classes and Meta-Classes in CLIPS
system
defined
classes
OBJECT
USER
CLASSES
user
defined
classes
Ship
Liner
domain
instances
© C. Kemke
Titanic
INSTANCES
CLIPS Classes 11
Objects and Rules
How to connect objects (instances) with rules?
1.
read slot-values - use object (instance and
slot-values) in condition part of rule
2.
write slot-values - include put-messages in
action-part of rule
© C. Kemke
CLIPS Classes 12
Objects in Condition Part of Rule
Solution 1:
(object (name [<instance-name>])
(<slot-name> <slot-value>)* )
Example 1:
(defrule if-titanic-goes-20-mph
(object (name [titanic]) (speed 20))
=> ... )
Comment: In the 'object'-pattern the name of the addressed
instance is identified as [titanic] and the value for the slot speed
(defined in the class ship) is determined as 20. This information
is used for pattern matching.
© C. Kemke
CLIPS Classes 13
Objects in Condition Part of Rule
Use variables instead of slot-values (corresponding to facts used in
rules, based on templates)
Example 2:
(defrule titanic-goes-at-what-speed
(object (name [titanic]) (speed ?speed))
=>
(printout "Titanic goes at " ?speed " mph." crlf )
)
Comment: In the 'object'-pattern the speed of the referenced object
(instance [titanic]) is bound to variable ?speed which can be
used later in the printout-function.
© C. Kemke
CLIPS Classes 14
Objects in Condition Part of Rule
Use variables instead of instance-names
Example 3:
(defrule any-ship-which-goes-20mph
(object (name ?name) (speed 20mph))
=>
(printout ?name " goes at 20 mph." crlf )
)
Comment: In the 'object'-pattern the variable ?name is bound to the
referenced object (e.g. the instance [titanic]) and thus can be
used later in the action-part.
© C. Kemke
CLIPS Classes 15
Objects in Action Part of Rule
In the action-part of a rule, a message to an instance
can be send, corresponding to messages used in
message-handlers.
(send [<instance-name>] <message>)
Example 4:
(defrule titanic-has-to-slow-down
(object (name [titanic]) (speed ?speed))
(test (> ?speed 30))
=>
(send [titanic] put-speed 20))
© C. Kemke
CLIPS Classes 16
Objects in Action Part of Rule
Use variables instead of instance-names
Example 5:
(defrule ships-over-30mph-have-to-slow-down
(object (name ?name) (speed ?speed))
(test (> ?speed 30))
=>
(send ?name put-speed 20))
Comment: the variable ?name can be bound during pattern
matching to an instance, e.g. [titanic], and a message (to put
the value 20 into the speed-slot) is sent in the action-part to
this instance.
© C. Kemke
CLIPS Classes 17
Objects in Action Part of Rule
Task:
Define a rule which contains instead of a test-condition
a field-constraint with predicate expression to constrain
the matching instances to those whose speed is over 30.
(defrule slow-down-ships-which-go-over-30mph
(object (name ?name) (speed ?speed))
(test (> ?speed 30))
=>
(send ?name put-speed 20))
© C. Kemke
CLIPS Classes 18
CLIPS - Definitions
© C. Kemke
CLIPS Classes 19
DEFCLASS Description
A defclass is a construct for specifying the properties (slots) of a class of
objects.
A defclass consists of four elements:
1) a name,
2) a list of superclasses from which the new class inherits slots and
message-handlers,
3) a specifier saying whether or not the creation of direct instances of the
new class is allowed and
4) a list of slots specific to the new class.
All user-defined classes must inherit from at least one class; COOL provides
predefined system classes for use as a base in the derivation of new
classes.
Any slots explicitly given in the defclass override those gotten from inheritance.
COOL applies rules to the list of superclasses to generate a class precedence
list
for the new class.
Facets further describe slots. Some examples of facets include: default value,
cardinality, and types of access allowed.
© C. Kemke
CLIPS Classes 20
DEFCLASS - Syntax
(defclass <name> [<comment>]
(is-a <superclass-name>+) superclass(es)
[<role>]
can instances be created?
[<pattern-match-role>]
can instances be used in
pattern matching?
<slot>*
slots!
<handler-documentation>*) methods associated with
this class
<handler-documentation> ::= (message-handler <name>
[<handler-type>])
<handler-type> ::= primary | around | before | after
© C. Kemke
CLIPS Classes 21
<role> ::= (role concrete | abstract)
<pattern-match-role> ::= (pattern-match reactive |
non-reactive)
<slot> ::= (slot
(single-slot
(multislot
<name> <facet>*) |
<name> <facet>*) |
<name> <facet>*)
<facet> ::= <default-facet> | <storage-facet> |
<access-facet> | <propagation-facet> |
<source-facet> | <pattern-match-facet> |
<visibility-facet> | <create-accessor-facet>
<override-message-facet> |
<constraint-attributes>
© C. Kemke
CLIPS Classes 22
<default-facet>::= (default ?DERIVE | ?NONE | <expression>)
<pattern-match-facet> ::= (pattern-match reactive | nonreactive)
<visibility-facet> ::= (visibility private | public)
<create-accessor-facet> ::= (create-accessor ?NONE | read |
write | read-write)
<override-message-facet> ::= (override-message ?DEFAULT |
<message-name>)
© C. Kemke
CLIPS Classes 23
DEFINSTANCES
Similar to deffacts, the definstances construct allows the
specification of instances which will be created every time
the reset command is executed.
On every reset all current instances receive a delete
message, and the equivalent of a make-instance function
call is made for every instance specified in the definstances
constructs.
© C. Kemke
CLIPS Classes 24
DEFINSTANCES - Syntax
(definstances
<definstances-name> [<comment>] (<instance-definition>)*)
<instance-definition> ::=
<slot-override> ::=
© C. Kemke
<instance-name-expression>
of <class-name-expression>
<slot-override>*
(<slot-name-expression> <expression>*)
CLIPS Classes 25
DEFMESSAGE HANDLER
Objects are manipulated by sending them messages via the
function send. The result of a message is a useful returnvalue or side-effect.
A defmessage-handler is a construct for specifying the
behavior of a class of objects in response to a particular
message. The implementation of a message is made up of
pieces of procedural code called message-handlers (or
handlers for short).
Each class in the class precedence list of an object's class
can have handlers for a message. In this way, the object's
class and all its superclasses share the labor of handling the
message. Each class's handlers handle the part of the
message which is appropriate to that class.
© C. Kemke
CLIPS Classes 26
DEFMESSAGE HANDLER
A defmessage-handler is comprised of:
•
a class name to which to attach the handler (the class must have been
previously defined),
•
a message name to which the handler will respond,
•
an optional type (the default is primary),
•
an optional comment,
•
a list of parameters that will be passed to the handler during execution,
•
an optional wildcard parameter, and
•
a series of expressions which are executed in order when the handler is
called.
The return-value of a message-handler is the evaluation of the last
expression in the body.
© C. Kemke
CLIPS Classes 27
DEFMESSAGE HANDLER
(defmessage-handler
<class-name> <message-name> [<handlertype>]
[<comment>]
(<parameter>* [<wildcard-parameter>])
<action>*)
<handler-type> ::= around | before | primary | after
<parameter> ::= <single-field-variable>
<wildcard-parameter> ::= <multifield-variable>
© C. Kemke
CLIPS Classes 28
DEFMESSAGE HANDLER
Within a class, the handlers for a particular
message can be further subdivided into four types
or categories:
1. primary,
2. before,
3. after and
4. around.
© C. Kemke
CLIPS Classes 29
CLIPS Example – Pistol Firing
(defclass pistol
(is-a USER)
(role concrete)
(pattern-match reactive)
(slot safety (type SYMBOL) (create-accessor read-write))
(slot slide (type SYMBOL) (create-accessor read-write))
(slot hammer (type SYMBOL) (create-accessor read-write))
(slot chamber (type INTEGER) (create-accessor read-write))
(slot magazine (type SYMBOL) (create-accessor read-write))
(slot rounds (type INTEGER) (create-accessor read-write))
)
© C. Kemke
CLIPS Classes 30
;; We associate message-handlers with ‘safety’ and ‘drop.’
(defmessage-handler pistol safety (?on-off)
(dynamic-put safety ?on-off)
(if (eq ?on-off on)
then (dynamic-put hammer down))
)
;; The ‘drop’ message-handler drops the magazine from the
mag.
(defmessage-handler pistol drop ()
(dynamic-put magazine out)
)
© C. Kemke
CLIPS Classes 31
;; We associate message-handlers with ‘safety’ and
‘drop.’
(defmessage-handler pistol safety (?on-off)
(dynamic-put safety ?on-off)
(if (eq ?on-off on)
then (dynamic-put hammer down))
)
;; The ‘drop’ message-handler drops the magazine from
the mag well.
(defmessage-handler pistol drop ()
(dynamic-put magazine out)
)
© C. Kemke
CLIPS Classes 32