我的 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
这怎么可能 ????
我的 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
这怎么可能 ????
set-count
每当断言或修改事实时,都会发生此规则的模式匹配。一段时间后,在调用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>