2016-08-01 2 views
1

Avoir un fichier test.clp:CLIPS: modifier instance ne déclenche ltrage

(defclass TestClass (is-a USER) 
    (role concrete) 
    (pattern-match reactive) 
    (slot value) 
    (slot threshold)) 


(definstances TestObjects 
    (Test of TestClass 
    (value 0) 
    (threshold 3))) 

(defrule above-threshold 
    ?test <- (object (is-a TestClass)) 
    (test (> (send ?test get-value) (send ?test get-threshold))) 
    => 
    (printout t "*** Above threshold!! ***" crlf) 
    (refresh below-threshold)) 

(defrule below-threshold 
    ?test <- (object (is-a TestClass)) 
    (test (> (send ?test get-value) (send ?test get-threshold))) 
    => 
    (printout t "*** Back to normal ***" crlf) 
    (refresh above-threshold)) 

je charge le fichier et:

CLIPS> (reset) 
CLIPS> (agenda) 
0  below-threshold: [Test] 
For a total of 1 activation. 
CLIPS> (run) 
*** Back to normal *** 
CLIPS> (modify-instance [Test] (value 8)) 
TRUE 
CLIPS> (agenda) 
CLIPS> 

L'ordre du jour ne montre aucune règle active. Je m'attendrais à ce que la modification (valeur-instance) de la valeur 8 déclenche la correspondance de modèle et que la règle "above-threshold" soit sélectionnée pour être exécutée et mise dans l'agenda. Qu'est-ce que je rate?

Répondre

1

De section 5.4.1.7, pattern-matching avec des modèles d'objet, du Guide de base de la programmation:

Lorsqu'une instance est créée ou supprimée, tous les modèles applicables à cet objet sont mis à jour. Toutefois, lorsqu'un emplacement est modifié, seuls les modèles qui correspondent explicitement à cet emplacement sont affectés.

modifier les règles Donc, pour correspondre explicitement les créneaux horaires que vous souhaitez déclencher la recherche de motifs:

(defrule above-threshold 
    ?test <- (object (is-a TestClass) 
        (value ?value) 
        (threshold ?threshold)) 
    (test (> ?value ?threshold)) 
    => 
    (printout t "*** Above threshold!! ***" crlf) 
    (refresh below-threshold)) 

(defrule below-threshold 
    ?test <- (object (is-a TestClass) 
        (value ?value) 
        (threshold ?threshold)) 
    (test (< ?value ?threshold)) 
    => 
    (printout t "*** Back to normal ***" crlf) 
    (refresh above-threshold))