Lec03 CLIPS
Lec03 CLIPS
1
Objectives
• Learn about field constraints
• Learn how to use functions and expressions
• Learn how to perform summing values using rules
• Learn how to use the bind function
• Learn how to use I/O functions
• Learn how to use the test conditional element
• Learn how to use the predicate field constraint and the return value constraint
• Examine the or, and, not, exists, forall logical elements.
2
Field Constraints
• In addition to pattern matching capabilities and variable bindings, CLIPS has more
powerful pattern matching operators.
• Consider writing a rule for all people who do not have brown hair:
• We could write a rule for every type of hair color that is not brown.
• This involves testing the condition in a roundabout manner – tedious, but effective.
3
Field Constraints
• The technique for writing a rule for all non-brown hair colors implies that we have
the ability to supply all hair colors – virtually impossible.
Red, green,
purple, yellow,
pink…etc???
• An alternative is to use a field constraint to restrict the values a field may have on
the LHS – the THEN part of the rule.
4
Connective Constraints
• Connective constraints are used to connect variables and other constraints.
• Not connective – the ~ acts on the one constraint or variable that immediately
follows it.
• Or constraint – the symbol | is used to allow one or more possible values to match a
field or a pattern.
• And constraint – the symbol & is useful with binding instances of variables and on
conjunction with the not constraint.
5
Finding People with Blue Eyes
(deftemplate person
(slot name)
(slot eyes)
(slot hair))
(deffacts people
(person (person
(name Jane) (name Jack)
(eyes blue) (eyes blue)
(hair red) (hair black)
) )
(person (person
(name Joe) (name Jeff)
(eyes green) (eyes green)
(hair brown) (hair brown)
) ))
6
Finding People
Find a person with blue eyes.
(defrule find-blue-eyes
(person
(name ?name) Variable
(eyes blue)
)
=>
(printout t ?name " has blue eyes." crlf)
)
7
Finding People
Find a person without brown hair.
(defrule find-without-brown-hair
(person
(name ?name)
(hair ~brown) Not brown
)
=>
(printout t ?name " does not have brown hair")
)
8
Finding People
Find a person with either black or brown hair.
(defrule find-black-or-brown-hair
(person
(name ?name)
(hair black | brown )
)
=>
(printout t ?name " has dark hair” crlf)
)
9
Finding People
• Find a person with either black or brown hair.
Specify the color of the hair.
(defrule find-black-or-brown-hair
(person
(name ?name)
(hair ?color& black | brown)
)
=>
(printout t ?name " has “ ?color " hair" )
)
10
Finding People
Find a person with neither black nor brown hair.
Specify the color of the hair.
(defrule find-black-nor-brown-hair
(person
(name ?name)
(hair ?color&~ black &~ brown)
)
=>
(printout t ?name " has " ?color " hair" )
)
11
Functions and Expressions
• CLIPS has the capability to perform calculations.
12
Numeric Expressions in CLIPS
• Numeric expressions are written in CLIPS in LISP-style – using prefix form – the
operator symbol goes before the operands to which it pertains.
• Example #1:
• 5 + 8 (infix form) → + 5 8 (prefix form)
• Example #2:
• (infix) (y2 – y1) / (x2 – x1) > 0
• (prefix) (> ( / ( - y2 y1 ) (- x2 x1 ) ) 0)
13
Return Values
• Most functions (addition) have a return value that can be an integer, float, symbol,
string, or multivalued value.
• Some functions (facts, agenda commands) have no return values – just side effects.
• Return values for +, -, and * will be integer if all arguments are integer, but if at least
one value is floating point, the value returned will be float.
14
Variable Numbers of Arguments
• Many CLIPS functions accept variable numbers of arguments.
• Example:
• CLIPS> (- 3 5 7) returns 3 - 5 = -2 - 7 = -9
• There is no built-in arithmetic precedence in CLIPS – everything is evaluated from
left to right.
• To compensate for this, precedence must be explicitly written.
15
Embedding Expressions
• Expressions may be freely embedded within other expressions:
16
Summing Values Using Rules
• Suppose you wanted to sum the areas of a group of rectangles.
• The heights and widths of the rectangles can be specified using the
deftemplate:
• The sum of the rectangle areas could be specified using an ordered fact such as:
(sum 20)
Ordered fact = facts with a
relation name that does not
have a corresponding
deftemplate.
17
Summing Values
• A deffacts containing sample information is:
(deffacts initial-information
(rectangle (height 10) (width 6))
(rectangle (height 7) (width 5))
(rectangle (height 6) (width 8))
(rectangle (height 2) (width 5))
(sum 0))
Initialize sum = 0
18
Summing Values
(defrule sum-rectangles
(rectangle (height ?height) (width ?width))
?sum <- (sum ?total)
=>
(retract ?sum)
(assert (sum (+ ?total (* ?height ?width)))))
Computer Computer
hangs!!! hangs!!!
19
Summing Values
20
The Bind Function
• Sometimes it is advantageous to store a value in a temporary variable to avoid
recalculation.
• The bind function can be used to bind the value of a variable to the value of an
expression using the following syntax:
21
I/O Functions
• When a CLIPS program requires input from the user of a program, a read function
can be used to provide input from the keyboard:
CLIPS>(defrule get-name
=>
(printout t “what is your name? “)
(bind ?response (read))
(assert (user’s-name ?response)))
CLIPS>(run)
22
Read Function from Keyboard
• The read function can only input a single field at a time.
• Characters entered after the first field up to the are discarded.
• To input, say a first and last name, they must be delimited with quotes, “xxx xxx”.
• Data must be followed by a carriage return to be read.
23
Readline Function
• To read an entire line of input, the readline function can be
used:
(readline [<logical-name>])
• Example:
(defrule get-name
=>
(printout t “What is your name? “
(bind ?response (readline))
(assert (user’s-name ?response)))
24
Readline Function
• Continue from previous slide, if we type (reset) then (run),
CLIPS> (reset)
CLIPS> (run)
What is your name? CY Ting
CLIPS>(facts)
f-0 (initial-fact)
f-1 (user’s-name “CY Ting”)
25
Predicate Functions
• A predicate function is defined to be any function that returns:
• TRUE
• FALSE
• Any value other than FALSE is considered TRUE.
• We say the predicate function returns a Boolean value.
26
I/O from/to Files
• Input can also come from external files.
• Output can be directed to external files.
• Before a file can be accessed, it must be opened using the open function:
Example:
(open “mydata.dat” data “r”)
27
I/O from/to Files
• data – is the logical name that CLIPS associates with the file
• “r” – represents the mode – how the file will be used – here read access
• The open function acts as a predicate function
• Returns true if the file was successfully opened
• Returns false otherwise
28
File Access Modes
29
Close Function
• Once access to the file is no longer needed, it should be closed.
• Failure to close a file may result in loss of information.
• General format of the close function:
• (close [<file-ID>])
30
Reading / Writing to a File
• Which logical name used, depends on where information will be written – logical
name t refers to the terminal (standard output device).
31
Formatting
• Output sent to a terminal or file may need to be formatted – enhanced in
appearance.
• To do this, we use the format function which provides a variety of formatting styles.
• General format:
(format <logical-name> <control-string> <parameters>*)
32
Formatting
• Logical name – t – standard output device; or logical name associated with a file.
• Control string:
• Must be delimited with quotes
• Consists of format flags to indicate how parameters should be printed
• 1 – 1 correspondence between flags and number of parameters – constant values or expressions
• Return value of the format function is the formatted string – nil can be used to suppress printing.
33
Formatting
Example:
(format nil “Name: %-15s Age: %3d” “Bob Green” 35)
34
Specifications of Format Flag
• %-M.Nx
35
Display Format Specifications
36
The Test Conditional Element
• Processing of information often requires a loop.
• Sometimes a loop needs to terminate automatically as the result of an arbitrary
expression.
• The test condition provides a powerful way to evaluate expressions on the LHS of a
rule.
• Rather than pattern matching against a fact in a fact list, the test CE evaluates an
expression – outermost function must be a predicate function.
37
Test Condition
• A rule will be triggered only if all its test CEs are satisfied along with other patterns.
(test <predicate-function>)
Example:
38
Test Condition: Example
CLIPS> (defrule testing
(amount ?value)
(test (> ?value 2))
=>
(printout t "bigger!" crlf))
CLIPS> (assert (amount 5))
<Fact-1>
CLIPS> (run)
Bigger!
39
Predicate Field Constraint
• The predicate field constraint : allows for performing predicate tests directly within
patterns.
• The predicate field constraint is more efficient than using the test CE.
• It can be used just like a literal field constraint – by itself or part of a complex field.
• The predicate field constraint is always followed by a function for evaluation
(predicate function).
• Example:
(pizza-size ?size)
(pizza-size ?size&:(> ?size 1))
(test (> ?size 1)
40
Return Value Constraint
• The return value constraint = allows the return value of a function to be used for
comparison inside a pattern.
• The return value constraint must be followed by a function (not necessarily a
predicate function).
• The function must have a single-field return value.
41
Return Value Constraint
CLIPS> (clear)
CLIPS> (deftemplate data (slot x) (slot y))
CLIPS> (defrule twice
(data (x ?x) (y =(* 2 ?x)))
=>)
CLIPS> (assert (data (x 2) (y 4)) ; f-0
(data (x 3) (y 9))) ; f-1
<Fact-1>
CLIPS> (agenda)
0 twice: f-0
For a total of 1 activation.
42
The OR Conditional Element
• Consider the two rules:
43
OR Conditional Element
• These two rules can be combined into one rule – or CE requires
only one CE be satisfied:
44
The And Conditional Element
• The and CE is opposite in concept to the or CE – requiring all
the CEs be satisfied:
45
Not Conditional Element
• When it is advantageous to activate a rule based on the
absence of a particular fact in the list, CLIPS allows the
specification of the absence of the fact in the LHS of a rule
using the not conditional element:
46
Not Conditional
• We can implement this as follows:
47
The Exists Conditional Element
• The exists CE allows one to pattern match based on the existence of at least one fact
that matches a pattern without regard to the total number of facts that actually
match the pattern.
• This allows a single partial match or activation for a rule to be generated based on
the existence of one fact out of a class of facts.
48
Exists Conditional
49
Exists
• When more than one emergency fact is asserted, the message
to the operators is printed more than once. The following
modification prevents this:
50
Exists
• This assumes there was already an alert – triggered by an
operator-emergency rule. What if the operators were merely
placed on alert to a drill:
51
Exists
• Now consider how the rule has been modified using the exists CE:
(defrule operator-alert-for-emergency
(exists (emergency))
(not (operator-alert))
=>
(printout t “Emergency: Operator Alert” crlf)
(assert (operator-alert))))
52
Forall / Logical
Conditional Elements
• The forall CE allows one to pattern match based on a set of CEs that are satisfied for
every occurrence of another CE.
• The logical CE allows one to specify that the existence of a fact depends on the
existence of another fact or group of facts.
53
Forall / Logical
Conditional Elements
• Each fact matching the <first-CE> must also have facts that match all of the
<remaining-CEs>.
(deftemplate emergency (slot type) (slot location))
(deftemplate fire-squad (slot name) (slot location))
(deftemplate evacuated (slot building))
(defrule all-fires-being-handled
(forall (emergency (type fire) (location ?where))
(fire-squad (location ?where))
(evacuated (building ?where)))
=>
(printout t “All buildings that are on fire “ crlf
“have been evacuated and” crlf
“have firefighters on location” crlf))
54
Forall / Logical
Conditional Elements
55
Forall / Logical
Conditional Elements