剪辑 - 模式和动作中的相同插槽
clips - same slot in pattern and action
当我们定义 rule 时,我们可以在 pattern
和action
区域(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 事实。在规则的条件和操作中使用相同的插槽不会阻止激活该规则。
当我们定义 rule 时,我们可以在 pattern
和action
区域(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 事实。在规则的条件和操作中使用相同的插槽不会阻止激活该规则。