Search code examples
clips

How do I retrieve fact index in clips in a deffunction?


(deffunction up ()
     ?fact <- u
    (retract ?fact)
    (assert (u green))

)

I'm trying to get something like this to work, a function to alter the states of facts, but with this it gives me an error of like ?fact is not defined. But I have done this in a defrule. Why is this not working?


Solution

  • Functions receive input through their parameters. Rules receive input through their patterns. If you want to pattern match, use a rule:

    (defrule up
       ?fact <- (u)
       =>
       (retract ?fact)
       (assert (u green)))
    

    Alternately if you need to iterate over the existing set of facts for a deftemplate, you can use the fact set query functions (do-for-fact, do-for-all-facts, ...):

    (deffunction up ()
       (do-for-fact ((?fact u)) TRUE
          (retract ?fact))
       (assert (u green)))