我的CLIPS文件中有以下规则:
(defrule check-final (declare (salience 12))
?scnt <- (set-count (value ?v) (class ?c))
(test (= ?v ?*total*))
=>
(printout T ?*total* " == " ?v crlf)
)
我得到以下奇怪的输出:
CLIPS>(run)
14 == 9
5 == 2
这怎么可能????
答案 0 :(得分:2)
只要声明或修改事实set-count
,就会发生此规则的模式匹配。在调用run
期间,该规则在一段时间后被触发。这两个过程可以及时分开。 ?*v*
的值当然可以在很长一段时间内发生变化。
关键是要意识到他打印的结果将反映出发生模式匹配的时期?v
的值,而?*total*
将是打印结果时的值。由于?*total*
可能已经看到自模式匹配以来的任意更改,因此无法保证在规则实际触发时它将等于?v
。
答案 1 :(得分:0)
答案 2 :(得分:0)
最可能的解释是,在某些时候,满足相等性测试,然后在规则执行之前更改全局值。
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>