如何比较 CLIPS 中 2 个多字段变量之间的符号



问题是比较两个类型为SYMBOL的多字段变量。下面是我尝试开发的代码示例。

CLIPS>(defrule r       
=>
(printout t "Input A: ")
(bind $?A (explode$ (readline)))
(printout t "Input B: ")
(bind $?B (explode$ (readline)))
(if (member$ $?A $?B) then (printout t " Something ..." crlf)))
CLIPS> (run)
Input A: 1 2 3 4 5
Input B: 7 3 2 1 6
CLIPS> 

我想比较 $ 的每个参数(或值(?A 的每个参数为 $?B 并且如果两者中至少有一个参数在 $ 中?A 还是 $?B,if 测试变为 TRUE。

您可以编写一个函数来测试两个多字段值的交集:

CLIPS> 
(deffunction intersectionp (?m1 ?m2)
   (foreach ?i1 ?m1
      (foreach ?i2 ?m2
         (if (eq ?i1 ?i2)
            then (return TRUE))))
   (return FALSE))
CLIPS> 
(defrule r       
   =>
   (printout t "Input A: ")
   (bind ?A (explode$ (readline)))
   (printout t "Input B: ")
   (bind ?B (explode$ (readline)))
   (if (intersectionp ?A ?B) then (printout t " Something ..." crlf)))
CLIPS> (run)
Input A: 1 2 3 4 5
Input B: 7 3 2 1 6
 Something ...
CLIPS> (reset)
CLIPS> (run)
Input A: 1 2 3
Input B: 4 5 6
CLIPS> 

或者,您可以使用模式匹配来测试交集:

CLIPS> (clear)
CLIPS>    
(defrule r       
   =>
   (printout t "Input A: ")
   (bind ?A (explode$ (readline)))
   (assert (A ?A))
   (printout t "Input B: ")
   (bind ?B (explode$ (readline)))
   (assert (B ?B)))
CLIPS> 
(defrule intersect
   (exists (A $? ?v $?)
           (B $? ?v $?))
   =>
   (printout t " Something ..." crlf))
CLIPS> (reset)
CLIPS> (run)
Input A: 1 2 3 4 5
Input B: 7 3 2 1 6
 Something ...
CLIPS> (reset)
CLIPS> (run)
Input A: 1 2 3
Input B: 4 5 6
CLIPS> 

最新更新