剪辑 - 模式和动作中的相同插槽

clips - same slot in pattern and action

当我们定义 rule 时,我们可以在 patternaction 区域(assert 在哪里)?我用下面的代码举例:

(deftemplate b1
    (slot s1) 
    (slot s2))

(deftemplate b2
    (slot s1) 
    (slot s2)) 

(deftemplate b3
    (slot r1)
    (slot r2))

(deftemplate b4
    (slot r1)
    (slot r2))

; Facts
(deffacts F 
    (b1 (s1 2)(s2 5))
    (b2 (s1 7)(s2 9)))


; Rules
(defrule R1 
    (b1 (s1 ?x1)(s2 ?y1))
    (b2 (s1 ?x2)(s2 ?y2))
=>
    (assert (b4(r1 (* ?x1 ?x2))(r2 (* ?y1 ?y2))))

    (printout t)    
)

(defrule R2 
    (b2 (s1 ?x1)(s2 ?y1))
    (b3 (r1 ?x2)(r2 ?y2))
=>
    (assert (b3(r1 (* ?x1 ?x2))(r2 (* ?y1 ?y2))))

    (printout s)
)

我描述的情况位于代码的R2规则中。当我 运行 程序时,我看到只有规则 R1 被执行。这是因为这条线吗?

    (b3 (r1 ?x2)(r2 ?y2))
=>
    (assert (b3(r1 (* ?x1 ?x2))(r2 (* ?y1 ?y2))))

因为我们使用了 r1 两次,正如我之前所说的。

仅当 b2 和 b3 事实都存在时,规则 R2 才会执行。只有当规则被不同的 b3 事实激活时,才会根据规则 R2 的动作断言 b3 事实。在规则的条件和操作中使用相同的插槽不会阻止激活该规则。