Artificial intelligence 剪辑模式匹配中的数字相等测试失败?

Artificial intelligence 剪辑模式匹配中的数字相等测试失败?,artificial-intelligence,expert-system,clips,jess,Artificial Intelligence,Expert System,Clips,Jess,我的剪辑文件中有以下规则: (defrule check-final (declare (salience 12)) ?scnt <- (set-count (value ?v) (class ?c)) (test (= ?v ?*total*)) => (printout T ?*total* " == " ?v crlf) ) 这是怎么可能的???发现了部分问题:我正在使用全局?*total*,根据 全局变量可以作为模式匹配的一部分进行访问 过

我的剪辑文件中有以下规则:

(defrule check-final (declare (salience 12))
    ?scnt <- (set-count (value ?v) (class ?c))
    (test (= ?v ?*total*))
    =>
    (printout T ?*total* " == " ?v crlf)
)

这是怎么可能的???

发现了部分问题:我正在使用全局
?*total*
,根据

全局变量可以作为模式匹配的一部分进行访问 过程,但更改它们不会调用模式匹配 过程


但这并不能解释当断言或修改事实
集合计数时,该规则的模式匹配会发生相等性测试失败。在调用
run
的过程中,一段时间后会触发该规则。这两个过程在时间上可以广泛分开。
?*v*
的值在这段长时间内当然会发生变化


关键是要认识到打印结果将反映模式匹配发生时的
?v
值,而
?*total*
将是打印结果时的值。由于自模式匹配以来,
?*total*
可能已看到任意更改,因此无法保证当规则实际触发时,它将等于
?v

最可能的解释是,在某个点上,满足了相等性测试,然后在规则执行之前更改了全局值

CLIPS> (deftemplate set-count (slot value) (slot class))
CLIPS> 
(defglobal ?*total* = 0)
CLIPS> 
(defrule check-final (declare (salience 12))
    ?scnt <- (set-count (value ?v) (class ?c))
    (test (= ?v ?*total*))
    =>
    (printout T ?*total* " == " ?v crlf)
)
CLIPS> (bind ?*total* 9)
9
CLIPS> (assert (set-count (value 9) (class a)))
<Fact-1>
CLIPS> (bind ?*total* 14)
14
CLIPS> (run)
14 == 9
CLIPS> (bind ?*total* 2)
2
CLIPS> (assert (set-count (value 2) (class b)))
<Fact-2>
CLIPS> (bind ?*total* 5)
5
CLIPS> (run)
5 == 2
CLIPS> 
CLIPS>(定义模板集计数(插槽值)(插槽类))
剪辑>
(defglobal?*总计*=0)
剪辑>
(defrule检查最终结果(声明(显著性12))
?scnt
(打印输出T?*总计*“=”?v crlf)
)
剪辑>(绑定?*总计*9)
9
剪辑>(断言(设置计数(值9)(a类)))
剪辑>(绑定?*总计*14)
14
剪辑>(运行)
14 == 9
剪辑>(绑定?*总计*2)
2.
剪辑>(断言(设置计数(值2)(b类)))
剪辑>(绑定?*总计*5)
5.
剪辑>(运行)
5 == 2
剪辑>

谢谢,这就解释了。我修正了它最终会失去全局,并用一个事实取代它。再次感谢你的回答。我刚刚注意到你建议对我的答案进行编辑,但在我有机会接受之前就被拒绝了。你的编辑是完全正确的,值得一提的是,我在这里应用了它。
CLIPS> (deftemplate set-count (slot value) (slot class))
CLIPS> 
(defglobal ?*total* = 0)
CLIPS> 
(defrule check-final (declare (salience 12))
    ?scnt <- (set-count (value ?v) (class ?c))
    (test (= ?v ?*total*))
    =>
    (printout T ?*total* " == " ?v crlf)
)
CLIPS> (bind ?*total* 9)
9
CLIPS> (assert (set-count (value 9) (class a)))
<Fact-1>
CLIPS> (bind ?*total* 14)
14
CLIPS> (run)
14 == 9
CLIPS> (bind ?*total* 2)
2
CLIPS> (assert (set-count (value 2) (class b)))
<Fact-2>
CLIPS> (bind ?*total* 5)
5
CLIPS> (run)
5 == 2
CLIPS>