330 likes | 637 Views
CLIPS-COOL. By: Dr . Christel Kemke Department of Computer Science University of Manitoba. CLIPS – Classes (COOL). Intro to CLIPS – Classes (COOL) class definition class specification slot specification, facets instance creation message-handlers Classes and rules.
E N D
CLIPS-COOL By: Dr. ChristelKemke Department of Computer Science University of Manitoba
CLIPS – Classes (COOL) Intro to CLIPS – Classes (COOL) • class definition • class specification • slot specification, facets • instance creation • message-handlers • Classes and rules
CLIPS – Example Classes (defclassperson (is-a USER);provides reference to system-defined ;super-class USER (role concrete);this class can have instances (slot gender (type STRING));just slots with type (slot age (type NUMBER)));constraints (defclassman (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.
CLIPS – Defining Classes (defclassperson (is-a USER) ;provides reference to system-defined ;super-class USER (role concrete) ;this class can have instances (pattern-match reactive)* ;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>) ;default-value for slot ... <other facets>* ... )) * Class and Slot descriptions often have defaults, e.g. pattern-match reactive, or create-accessor read-write. Refer to the CLIPS bpg.
CLIPS – Defining Instances (definstancespeoplepeople is a list of instances (mike of personof class person; instance (gender “male”) mikeis created. (age 24)) ) (definstancesmen men is a list of instances of (mark of manclass man; here only one (age 24)) ) 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)
Message-Handlers (defmessage-handler <class-name> <message-handler-name> (<parameters>*) <body> ) Some message-handlers like get-<slot-name> or put-<slot-name> are system pre-defined message-handlers.
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)
Message-Handler - Example (defmessage-handler personbirthday () (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 put-message 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
Parameters in Message-Handlers (defmessage-handlershipset-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 speed20); or (send ?self put-speed20)
if-then-else in Message-Handlers (defmessage-handlershipslow-down () (if (> ?self:speed 30) then (send ?selfput-speed 20)) ) Control Structuresused in Message-Handlers. instead of send to self: (dynamic-putspeed 20)) instead of ?self:speed (dynamic-getspeed)) 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.
Classes and Meta-Classes in CLIPS OBJECT system defined classes USER CLASSES user defined classes Ship Liner domain instances INSTANCES Titanic
Objects and Rules How to connect objects (instances) with rules? • read slot-values - use object (instance and slot-values) in condition part of rule • write slot-values - include put-messagesin action-part of rule
Objects in Condition Part of Rule Solution 1: (object(name [<instance-name>]) (<slot-name> <slot-value>)* ) Example 1: Comment: In the 'object'-pattern thenameof the addressed instance is identified as [titanic] and the value for the slotspeed (defined in the class ship) is determined as 20. This information is used for pattern matching. (defrule if-titanic-goes-20-mph (object (name[titanic]) (speed 20)) => ... )
Objects in Condition Part of Rule Use variables instead of slot-values (corresponding to facts used in rules, based on templates) Example 2: 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. (defrule titanic-goes-at-what-speed (object (name [titanic]) (speed ?speed)) => (printout "Titanic goes at " ?speed " mph." crlf ) )
Objects in Condition Part of Rule Use variables instead of instance-names Example 3: 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. (defrule any-ship-which-goes-20mph (object (name ?name) (speed 20mph)) => (printout ?name " goes at 20 mph." crlf ) )
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 (> ?speed30)) => (send [titanic]put-speed 20))
Objects in Action Part of Rule Use variables instead of instance-names Example 5: 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. (defrule ships-over-30mph-have-to-slow-down (object (name?name) (speed ?speed)) (test (> ?speed30)) => (send ?name put-speed20))
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))
DEFCLASS Description • A defclass is a construct for specifying the properties (slots) of a class of objects. • A defclass consists of four elements: • a name, • a list of superclasses from which the new class inherits slots and • message-handlers, • a specifier saying whether or not the creation of direct instances of the new class is allowed and • 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 slotsexplicitly 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.
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
<role> ::= (roleconcrete | abstract) • <pattern-match-role> ::= (pattern-matchreactive | • non-reactive) • <slot> ::= (slot <name> <facet>*) | (single-slot <name> <facet>*) | (multislot <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>
<default-facet>::= (default?DERIVE | ?NONE | <expression>) <pattern-match-facet> ::= (pattern-matchreactive | non-reactive) <visibility-facet> ::= (visibilityprivate | public) <create-accessor-facet> ::= (create-accessor?NONE | read | write | read-write) <override-message-facet> ::= (override-message?DEFAULT | <message-name>)
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.
DEFINSTANCES - Syntax (definstances <definstances-name> [<comment>] (<instance-definition>)*) <instance-definition> ::= <instance-name-expression> of <class-name-expression> <slot-override>* <slot-override> ::= (<slot-name-expression> <expression>*)
DEFMESSAGE HANDLER Objects are manipulated by sending them messages via the function send. The result of a message is a useful return-value 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.
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.
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>
DEFMESSAGE HANDLER Within a class, the handlers for a particular message can be further subdivided into four types or categories: • primary, • before, • after and • around.
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)) • )
;; 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) • )
;; 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) • )