CLIPS模式匹配中的数字相等测试失败?

时间:2013-04-05 19:37:42

标签: artificial-intelligence expert-system clips jess

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

这怎么可能????

3 个答案:

答案 0 :(得分:2)

只要声明或修改事实set-count,就会发生此规则的模式匹配。在调用run期间,该规则在一段时间后被触发。这两个过程可以及时分开。 ?*v*的值当然可以在很长一段时间内发生变化。

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

答案 1 :(得分:0)

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

  

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

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

答案 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>