Class and Inheritance

COOL -- CLIPS Object Oriented Language

Defining Classes

(defclass CAR (is-a USER)           ; user-defined class
    (role concrete)                 ; instances can be made
    (slot id)
    (multislot owner)
    (slot color)
    (slot value) )

(defclass JALOPY (is-a CAR)
    (slot color (allowed-values grey rust blue))
    (slot value (range 0.0 1000.0)) )

(defclass LUXURY (is-a CAR)
    (slot color (allowed-values grey red green))
    (slot value (range 0.0 100000.0)) )

Class Functions

(list-defclasses)
(browse-classes)        ;shows classes' hierachy
(superclassp CAR LUXURY)
(subclassp CAR LUXURY)
(ppdefclass CAR)
(undefclass CAR)
(describe-class CAR)
(class-abstractp CAR)

Object Instances

Instance Initiation

definstances set up initial instances at reset.
(definstances Cars
    (c1 of CAR (value 5000.0))
    (c2 of LUXURY (color red) (value 15000.)))

Definstances Functions

(instances)
(list-definstances)
(ppdefinstances Cars)
(undefinstances Cars)

Make/Unmake Instances

(make-instance c3 of CAR)
(unmake-instance c3 of CAR)

Modifying Instances

(modify-instance c1 (value 5500.0))

Object Pattern Matching

Class Specifiers
  1. abstract or concrete class
  2. reactive or non-reactive class
Objects of a reactive class can match object patterns in a rule. An abstract class cannot be reactive.
(defclass CAR (is-a USER)
    (role concrete)
    (pattern-match reactive)
    (slot id )
    (multislot owner)
    (slot color)
    (slot value) )

(defrule mix-and-match
    (object (is-a CAR) (name ?id)
            (color red|blue|green)
            (value ?val) )
    =>
    (printout t crlf "car " ?id " value = " ?val) )

Get and Put Slot Values

(defclass CAR (is-a USER)
    (role concrete)
    (pattern-match reactive)
    (slot color
          (create-accessor read-write))     ;to create message handlers automatically
    (slot value
          (create-accessor read-write)) )

(definstances Cars
    (c1 of CAR (value 5000.0))
    (c2 of CAR (color red)))

Now both color and value slots have get- and put- message handlers to use. create-accessor can be also read or write only.

(send [c1] put-color (send [c2] get-color))     ;c1 has set same color as c2

Example: cars.clp

Other Slot Facets

Predefined Handlers

(defmessage-handler USER init primary () )
(defmessage-handler USER delete primary () )
(defmessage-handler USER print primary () )

(send [c1] print)
(send [c1] delete)

Slot Default

(defclass CAR (is-a USER)
    (role concrete)
    (pattern-match reactive)
    (slot id
          (create-accessor read-write)
          (default (gensym*)))
    (slot color
          (create-accessor read-write))
    (slot value
          (create-accessor read-write)) )

(definstances Cars
    (c1 of CAR (value 5000.0))
    (c2 of CAR (color red)) )

(send [c1] print)
(send [c2] print)

Both [c1] and [c2] will have the same id, because the slot default facet is static. The default value is set when the class is defined and never changed. Change the default facet to dynamic-deault facet will solve this problem.

(defclass CAR (is-a USER)
    (role concrete)
    (slot id
          (create-accessor read-write)
          (default-dynamic (gensym*)))
      ... )

Example: cars-default.clp


Go to COOL Summary

Previous Procedural Programming   Up TOC   Next Message Handlers