2013-04-05 3 views
1

я это следующее правило в моей 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 

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

ответ

2

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

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

+0

Спасибо, что и объясняет. Я исправил это, в конечном счете, потерять глобальное и заменить его фактом. Еще раз спасибо за отличный ответ. –

+0

Я только заметил, что вы предложили изменить для моего ответа, но он был отклонен, прежде чем у меня появился шанс принять его. Ваше правление было совершенно правильным, для чего оно стоит, и я применил его здесь. –

0

Найдено часть проблемы: Я использую глобального ?*total* и в соответствии с CLIPS Manual

Глобальные переменные могут быть доступны как часть процесса сопоставления с образцом, но их изменение не вызывает соответствие шаблону .

Но это не объясняет Тест равенства

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> 
Смежные вопросы