Search code examples
clips

CLIPS how can I sum up slots of facts


Lets say I have the following two deftemplates:

(deftemplate total-crop-yield-quality (slot primary_key) (slot quality))
(deftemplate total-fertilizer-quality (slot primary_key) (slot quality))

and the following deffacts:

   (deffacts tQuality 
    (total-crop-yield-quality (primary_key 1) (quality 10))
    (total-crop-yield-quality (primary_key 2) (quality 7))
    (total-crop-yield-quality (primary_key 3) (quality 9))
    (total-crop-yield-quality (primary_key 4) (quality -2)))

   (deffacts fQuality 
    (total-fertilizer-quality (primary_key 1) (quality 4))
    (total-fertilizer-quality (primary_key 2) (quality 0))
    (total-fertilizer-quality (primary_key 3) (quality 2))
    (total-fertilizer-quality (primary_key 4) (quality 5)))

How would I sum up the total for all the qualities of both deffacts into a single variable?

(defrule determine-total-quality
  =>
 //code here to add quality to a variable)

Solution

  •          CLIPS (6.31 2/3/18)
    CLIPS> (deftemplate total-crop-yield-quality (slot primary_key) (slot quality))
    CLIPS> (deftemplate total-fertilizer-quality (slot primary_key) (slot quality))
    CLIPS> 
    (deffacts tQuality 
       (total-crop-yield-quality (primary_key 1) (quality 10))
       (total-crop-yield-quality (primary_key 2) (quality 7))
       (total-crop-yield-quality (primary_key 3) (quality 9))
       (total-crop-yield-quality (primary_key 4) (quality -2)))
    CLIPS> 
    (deffacts fQuality 
       (total-fertilizer-quality (primary_key 1) (quality 4))
       (total-fertilizer-quality (primary_key 2) (quality 0))
       (total-fertilizer-quality (primary_key 3) (quality 2))
       (total-fertilizer-quality (primary_key 4) (quality 5)))
    CLIPS>    
    (defrule determine-total-quality
      =>
      (bind ?sum 0)
      (do-for-all-facts ((?f total-crop-yield-quality)) TRUE
         (bind ?sum (+ ?sum ?f:quality)))
      (printout t "Crop Yield Quality: " ?sum crlf)
      (bind ?sum 0)
      (do-for-all-facts ((?f total-fertilizer-quality)) TRUE
         (bind ?sum (+ ?sum ?f:quality)))
      (printout t "Fertilizer Quality: " ?sum crlf))
    CLIPS> (reset)
    CLIPS> (run)
    Crop Yield Quality: 24
    Fertilizer Quality: 11
    CLIPS>