如何将相同位置的元素加在一起 ​​CLIPS

How to add together the elements on the same position CLIPS

我是 clips 的新手,我不知道如何正确地遍历列表并将它们相加并将总和放在同一位置。 我有两个定义为事实的列表,我想创建一个列表,该列表将具有相同位置的元素列表的总和。 前任: (事实列表 (列表 1 2 3 4) (列表 1 2 3 4) ) 结果应该是:(listSum 2 4 6 8)

欢迎任何帮助或建议。谢谢!

这是一个合并两个列表的函数:

         CLIPS (6.31 6/12/19)
CLIPS> 
(deffunction add-merge (?m1 ?m2)
   ;; Get the lengths of the multifields
   (bind ?l1 (length$ ?m1))
   (bind ?l2 (length$ ?m2))
   ;; Swap values if the first multifield is not the largest
   (if (> ?l2 ?l1)
      then
      (bind ?tmp ?l1)
      (bind ?l1 ?l2)
      (bind ?l2 ?tmp)
      (bind ?tmp ?m1)
      (bind ?m1 ?m2)
      (bind ?m2 ?tmp))
   ;; Merge the values
   (bind ?rv (create$))
   (loop-for-count (?i ?l2)
      (bind ?rv (create$ ?rv (+ (nth$ ?i ?m1) (nth$ ?i ?m2)))))
   (loop-for-count (?i (+ ?l2 1) ?l1)
      (bind ?rv (create$ ?rv (nth$ ?i ?m1))))
   ?rv)
CLIPS> (add-merge (create$ 1 2 3 4) (create$ 5 6 7 8))
(6 8 10 12)
CLIPS>

使用 CLIPS 中的默认设置,你不能有重复的事实,所以如果你想要两个具有相同值的列表,你需要创建一个插槽,每个列表将包含一个唯一的值:

CLIPS>    
(deftemplate list
   (slot id (default-dynamic (gensym*)))
   (multislot values))
CLIPS>    
(deffacts lists
   (list (id l1) (values 1 2 3 4))
   (list (id l2) (values 1 2 3 4)))
CLIPS>

然后您可以创建一个规则来合并两个列表:

CLIPS>
(defrule merge
   (sum-lists ?l1 ?l2)
   (list (id ?l1) (values $?v1))
   (list (id ?l2) (values $?v2))
   =>
   (assert (list (values (add-merge ?v1 ?v2)))))
CLIPS> (reset)
CLIPS> (assert (sum-lists l1 l2))
<Fact-3>
CLIPS> (run)
CLIPS> (facts)
f-0     (initial-fact)
f-1     (list (id l1) (values 1 2 3 4))
f-2     (list (id l2) (values 1 2 3 4))
f-3     (sum-lists l1 l2)
f-4     (list (id gen1) (values 2 4 6 8))
For a total of 5 facts.
CLIPS>