1

我的 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

这怎么可能 ????

4

3 回答 3

2

set-count每当断言或修改事实时,都会发生此规则的模式匹配。一段时间后,在调用run. 这两个过程可以在时间上广泛分开。的值?*v*当然可以在很长一段时间内发生变化。

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

于 2013-04-06T12:48:28.313 回答
0

发现部分问题:我正在使用全局?*total*并根据 CLIPS 手册

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

但这并不能解释相等性测试失败

于 2013-04-05T20:14:44.977 回答
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> 
于 2013-05-01T19:06:58.077 回答