2017-05-14 4 views
0

Je lis dans this répondu pourCLIPS: modèle un temps correspondant à une valeur d'un multislot

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.

Maintenant j'ai le problème suivant: J'ai un multislot qui reçoit de plus en plus d'articles au fil du temps. J'ai une règle R1 qui se déclenche si "some_value" est contenue dans le multislot. Quand j'ajoute "some_value" au multislot tout fonctionne comme prévu. Toutefois, si j'ajoute un autre élément, dites "another_value" au multislot, R1 à nouveau. C'est cohérent avec ce que j'ai cité plus haut, mais ce n'est pas ce que je veux. Je veux R1 de tirer une seule fois si "some_value" est contenue dans le multislot, et je ne veux pas R1 de tirer à nouveau si une autre valeur est ajoutée à la multislot.

Comment puis-je faire cela?

Je pourrais utiliser de nombreux emplacements au lieu d'un multislot, mais cela ne fonctionnerait pas dans le cas où je ne connais pas le nombre de valeurs possibles.

Répondre

1

Si vous ne pouvez pas affecter les valeurs à des emplacements différents - ce qui correspond normalement à la gestion des règles de déclenchement des modifications sélectionnées -, vous devez suivre les modifications qui ont été traitées. Suivre les règles ou les valeurs qui ont été traitées serait le moyen le plus simple de le faire. Si chaque règle ne traite qu'une seule valeur, le suivi des règles est préférable afin que plusieurs règles puissent être déclenchées pour le même changement de valeur. Voici un exemple où les règles R1 et R2 sont restreintes à une seule modification et la règle R3 présente le comportement que vous rencontrez actuellement:

CLIPS> (clear) 
CLIPS> 
(defclass XAMPL 
    (is-a USER) 
    (multislot properties) 
    (multislot processed)) 
CLIPS>  
(definstances initial 
    ([x1] of XAMPL)) 
CLIPS> 
(defrule add_some_value 
    (declare (salience -1)) 
    ?o <- (object (name [x1]) 
       (properties $?p&:(not (member$ some_value ?p)))) 
    => 
    (modify-instance ?o (properties some_value ?p))) 
CLIPS> 
(defrule add_another_value 
    (declare (salience -2)) 
    ?o <- (object (name [x1]) 
       (properties $?p&:(not (member$ another_value ?p)))) 
    => 
    (modify-instance ?o (properties another_value ?p))) 
CLIPS>  
(defrule R1 
    ?o <- (object (name [x1]) 
       (properties $?properties&:(member$ some_value ?properties)) 
       (processed $?processed&:(not (member$ R1 ?processed)))) 
    => 
    (modify-instance ?o (processed ?processed R1)) 
    (printout t "Rule R1 fires" crlf)) 
CLIPS> 
(defrule R2 
    ?o <- (object (name [x1]) 
       (properties $?properties&:(member$ some_value ?properties)) 
       (processed $?processed&:(not (member$ some_value ?processed)))) 
    => 
    (modify-instance ?o (processed ?processed some_value)) 
    (printout t "Rule R2 fires" crlf)) 
CLIPS> 
(defrule R3 
    (object (name [x1]) 
      (properties $?properties&:(member$ some_value ?properties))) 
    => 
    (printout t "Rule R3 fires" crlf)) 
CLIPS> (reset) 
CLIPS> (run) 
Rule R2 fires 
Rule R1 fires 
Rule R3 fires 
Rule R3 fires 
CLIPS>