Search code examples
clipsexpert-system

How to use not condition in CLIPS programming language properly?


Here is my code

(deffacts startup                          

               (bird canary) 
               (colour-canary yellow) 

               (bird ostrich) 
               (can-not-fly ostrich) 

)
(defrule r-bird-test
  (bird ?var)  
  (not (bird ostrich))
   =>
  (printout t ?var " ****" crlf)
)

Now, when i (reset) and (run) it doesn't print "canary ****". Am i not using the not condition properly? Can anyone point out what i am missing here? Thanks.


Solution

  • As written the not conditional element prevents the rule from executing if the fact (bird ostrich) is present. Since that fact is present once you perform a (reset), the rule does not execute. If you want the rule to execute for each bird fact where ?var is not ostrich, you need to write the rule this way:

    CLIPS> 
    (deffacts startup
       (bird canary)
       (colour-canary yellow)
       (bird ostrich)
       (can-not-fly ostrich))
    CLIPS> 
    (defrule r-bird-test
       (bird ?var&~ostrich)
       =>
       (printout t ?var " ****" crlf))
    CLIPS> (reset)
    CLIPS> (run)
    canary ****
    CLIPS>