2013-04-05 3 views

Répondre

2

Recherche de motif de cette règle se produit chaque fois que le fait set-count est affirmé ou modifié. La règle est déclenchée quelque temps après, lors de l'appel à run. Ces deux processus peuvent être largement séparés dans le temps. La valeur de ?*v* peut bien sûr changer pendant cette longue période de temps. La clé est de réaliser que les résultats imprimés refléteront la valeur de ?v à partir de l'époque pendant laquelle l'appariement de modèle est arrivé, tandis que ?*total* sera la valeur lorsque les résultats sont imprimés. Depuis ?*total* peut avoir vu des changements arbitraires depuis la correspondance de modèle, il n'y a aucune garantie qu'il sera égal à ?v lorsque la règle se déclenche réellement.

+0

Merci, ça l'explique. Je l'ai fixé finalement perdre le global et le remplacer par un fait. Merci encore pour la bonne réponse. –

+0

Je viens de remarquer que vous avez suggéré une modification pour ma réponse, mais elle a été rejetée avant que j'aie eu l'occasion de l'accepter. Votre édition a été tout à fait raison, pour ce que ça vaut, et je l'ai appliqué ici. –

0

trouvé une partie du problème: J'utilise la ?*total* globale et selon les CLIPS Manual

Les variables globales peuvent être consultées dans le cadre du processus motif correspondant, mais les changer n'invoque pas le processus correspondant à .

Mais cela n'explique pas l'échec du test d'égalité

0

L'explication la plus probable est qu'à un moment donné, le test d'égalité est satisfait et que la valeur du global est modifiée avant l'exécution de la règle.

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> 
Questions connexes