Проверка на равенство чисел не выполняется при сопоставлении с образцом CLIPS?

В моем файле 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

Как это возможно ????


person Alexandru Chirila    schedule 05.04.2013    source источник


Ответы (3)


Сопоставление с образцом для этого правила происходит всякий раз, когда утверждается или изменяется факт set-count. Правило активируется через некоторое время после вызова run. Эти два процесса можно сильно разделить во времени. Значение ?*v*, конечно, может измениться в течение этого длительного периода времени.

Ключ состоит в том, чтобы понять, что напечатанные результаты будут отражать значение ?v из эпохи, в течение которой произошло сопоставление с образцом, а ?*total* будет значением, когда результаты будут напечатаны. Поскольку ?*total*, возможно, видел произвольные изменения с момента сопоставления с образцом, нет гарантии, что он будет равен ?v, когда правило действительно сработает.

person Ernest Friedman-Hill    schedule 06.04.2013
comment
Спасибо, это все объясняет. Я исправил это, в конечном итоге потеряв глобальное и заменив его фактом. Еще раз спасибо за отличный ответ. - person Alexandru Chirila; 07.04.2013
comment
Я только что заметил, что вы предложили изменить мой ответ, но он был отклонен, прежде чем я успел его принять. Ваша правка была полностью правильной, чего бы она ни стоила, и я применил ее здесь. - person Ernest Friedman-Hill; 08.04.2013


Наиболее вероятное объяснение состоит в том, что в какой-то момент проверка на равенство выполняется, а затем значение global изменяется до выполнения правила.

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> 
person Gary Riley    schedule 01.05.2013