8 Pattern Matching

Variables

(defrule output
    (suggestion ?action)
    =>
    (printout t crlf "I would like to suggest you to "
                crlf ?action crlf crlf) )

Multiple Use of Variables

(defrule eye-color
    (find (eye-color ?eye))
    (person (name ?name) (eye-color ?eye))
    =>
    (printout t crlf ?name
                " has " ?eye " eye." crlf))

Fact Addresses

(defrule process-moved-information
    ?f1 <- (moved (name ?name) (address ?address))
    ?f2 <- (person (name ?name))
    =>
    (retract ?f1)           ;a MUST or infinite loop
    (modify ?f2 (address ?address)))

Single-field Wildcards

(deftemplate person
    (multislot name)
    (slot phone-number))
(defrule print-telephone-number
    (person (name ? ? ?last-name)
            (phone-number ?phone))
    =>
    (printout t ?phone crlf))

Multifield Wildcards

(defrule print-telephone-number
    (person (name $? ?last-name)
            (phone-number ?phone))
    =>
    (printout t ?phone crlf))

Blocks World

  • pseudocode

    knowledge base in Clips

    1. first version
    2. revised version
    3. Web Demo -- in Jess
    4. Web Demo -- in WebClips

    Field Contraints

    Not Field Contraint

    (defrule person-without-brown-hair
        (person (name ?name)
                (hair ~brown))
        =>
        (printout t ?name " does not have brown hair." crlf))
    

    Or Field Contraint

    (defrule person-with-brown-or-black-hair
        (person (name ?name)
                (hair brown|black))
        =>
        (printout t ?name " has dark hair." crlf))
    

    And Field Contraint

    (defrule person-with-brown-or-black-hair
        (person (name ?name)
                (hair ?color&brown|black))
        =>
        (printout t ?name " has " ?color " hair." crlf))
    
    (defrule person-without-brown-nor-black-hair
        (person (name ?name)
                (hair ?color&~brown|~black))
        =>
        (printout t ?name " has " ?color " hair." crlf))
    
    

    Combining Field Contraint

    (defrule complex-eye-hair-match
        (person (name ?name1)
                (eyes ?eyes1&blue|green)
                (hair ?hair1&~black))
        (person (name ?name2&~?name1)
                (eyes ?eyes2&~eyes1)
                (hair ?hair2&red|?hair1))
        =>
        (printout t ?name1 " has " ?eyes1 "eyes and "
                 ?hair1 " hair." crlf)
        (printout t ?name2 " has " ?eyes2 "eyes and "
                 ?hair2 " hair." crlf))
    

    Functions

    Elementary Math Functions

    Variable Number of Aruguments

    bind Function

       (bind ?new-size (- ?size ?choice))
    

    I/O Functions

    read

    (defrule player-select
       (phase choose-player)
       =>
       (printout t "Who moves first (Computer: c "
                   "Human: h)? ")
       (assert (player-select (read))))
    

    open

    (open "input.dat" data "r")
    

    close

    (open "example.dat" xmp "w")
    (printout xmp "green" crlf)
    (printout xmp 7 crlf)
    (close xmp)
    
    (open "example.dat" xmp "r")
    (read xmp)
    (read xmp)
    (close xmp)
    

    format

    (format nil "Name: %-15s Age: %3d"
             "Bob Green" 35)
    (bind ?name
        (format nil "Name: %-15s Age: %3d"
                 "Bob Green" 35))
    (printout t ?name)
    

    readline

    (readline xmp)
    

    Previous Clips Introduction   Up TOC   Next Advanced Pattern Matching