Professional Documents
Culture Documents
Lecture No. 22
Dr. Asad Ali Saf
Assistant Professor,
Department of ComputerScience,
COMSATS Institute of Information Technology (CIIT)
Islamabad,Pakistan.
Summary of Previous
Lecture
Single-feld wildcard
Multirules
Multifeld wildcard
Single-feld variable ? or a multifeld
variable ?$
Anywhere
Single- and multifeld wildcards
Todays Lecture
Deftemplate
Single-slot or multislot
Deftemplate
Deftemplate is similar to a struct defnition in
C. That is, the deftemplate defnes a group of
related felds in a pattern similar to the way
in which a C struct is a group of related data.
A deftemplate is a list of named felds called
slots. Deftemplate allows access by name
rather than by specifying the order of felds.
Deftemplate contributes to good style in
expert systems programs and is a valuable
tool of software engineering.
Single-slot
A slot is a named single-slot or multislot. A singleslot or simply slot contains exactly one feld while a
multislot contains zero or more felds.
Any number of single or multislot slots may be used in
a deftemplate. To write a slot, give the feld name
(attribute) followed by the feld value.
Note that a multislot slot with one value is strictly not
the same as a single-slot. As an analogy, think of a
cupboard (the multislot) that may contain dishes.
A cupboard with one dish is not the same as a dish
(single-slot.)
However, the value of a single-slot slot (or variable)
may match a multislot slot (or multislot variable) that
has one feld.
As an example of a deftemplate
relation, consider the attributes of a
business who might be considered
good for prospect.
Attributes Value
name "Dopey Wonderful"
assets rich
age 99
(assert (prospect))
As you can see, CLIPS has inserted the default
value of the null string, "", for the name feld since
that is the default for a STRING. Likewise, the
assets and age defaults were also inserted by
CLIPS. Different types have different default
symbols such as the null string, "", for STRING; the
integer 0 for INTEGER; the float 0.0 for FLOAT and
so on.
The ?DERIVE keyword selects the appropriate type
of constraint for that slot, e.g., the null string , "",
for a slot of type STRING.
(defrule business-candidate
(prospect (name ?name) (assets ?
net_worth) (age ?months))
=>
(printout t "Prospect: " ?name crlf
?net_worth crlf ?months " months old"
crlf))
(undefrule business-candidate)
(defrule bye-bye
?bad-prospect <- (prospect (assets poor) (name ?name))
=>
(retract ?bad-prospect)
(printout t "bye-bye " ?name crlf))
(reset)
(assert (prospect (name Ali Wonderful") (assets rich)))
(assert (prospect (name Ali Notwonderful") (assets
poor)))
(run)
bye-bye Dopey Notwonderful
Multiple felds
Notice that only single felds were used for the
patterns in the examples so far. That is, the feld
values for name, assets, and age, were all single
values. In some types of rules, you may want
multiple felds.
Deftemplate allows the use of multiple values in a
multislot.
As an example of multislot, suppose that you
wanted to treat the prospect as multiple fields.
This would provide more flexibility in processing
prospects since any part of the name could be
pattern matched.
Shown following is the deftemplate defnition
using multislot and the revised rule to pattern
(deftemplate prospect
(multislot name
(type SYMBOL)
(default ?DERIVE))
(slot assets
(type SYMBOL)
(allowed-symbols poor rich wealthy loaded)
(default rich))
(slot age
(type INTEGER)
(range 80 ?VARIABLE) ; The older the better!!!
(default 80)))
(defrule R1
(prospect (name $?name) (assets ?
net_worth) (age ?months))
=>
(printout t "Prospect: " ?name crlf ; Note:
not ?name ?net_worth crlf ?months "
months old" crlf))
(assert (prospect (name Ali Wonderful)
(assets rich) (age 99))