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)

Upvotes: 1

Views: 483

Answers (1)

Gary Riley
Gary Riley

Reputation: 10757

         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> 

Upvotes: 1

Related Questions