2015-03-24 8 views
0

lorsque je tente d'appeler un defrule qui ont déjà été utilisé, clips arrêt ..Retournez à la règle ci-dessus dans les clips

certains defrule doivent être utilisés plus d'une fois, est-il possible de le faire

ici est un exemple

(

defrule choice-in-powerPlant2 
(powerPlant2-question) 
=> 
(printout t "Are Filter and Carburetor Air working fine(y/n)?" crlf) 
(bind ?response (check-YNoptions-input)); Get user input on type of questions 
(if (eq ?response y) 
    then 
    (assert (powerPlant1-question) 
    ) 
) 

(if (or(eq ?response q) (eq ?response Q)) 
    then 
(output-exitmessage) 

) 

(if (eq ?response n) 
    then 
     (printout t "Have you fixed this(y/n)?" crlf) 
     (bind ?response (check-YNoptions-input)); Get user input on type of questions 
     (if (eq ?response y) 
      then 
      (assert (powerPlant1-question) 
      ) 
     ) 
     (if (eq ?response n) 
      then 
      (printout req "Please replace Filter and Carburetor Air " crlf) 
      (assert (powerPlant3-question)) 
    ) 
) 
) 

à la règle 2 Je veux revenir à la règle 1 quand je rentre "y" = yes

"exécution arrêtée une fois que j'ai entré" y ""

Répondre

0

Si vous souhaitez redéclencher une règle qui correspond à un fait spécifique, retirez ce fait dans le cadre de l'action de la règle. Si une autre règle affirme alors ce fait spécifique, la règle sera redéclenchée. Par exemple:

(defrule choice-in-powerPlant2 
    ?f <- (powerPlant2-question) 
    => 
    (retract ?f) 
    (printout t "Are Filter and Carburetor Air working fine(y/n)?" crlf) 
     . 
     . 
     . 
) 
+0

Cela fonctionne maintenant !! merci beaucoup so^____^merci Gary^____________^ –

+0

Je veux juste savoir si cela pourrait fonctionner pour tout defrule avec seulement l'écrire une fois? ou je dois écrire ce code pour chaque règle? –

+0

Vous devrez le faire pour chaque règle que vous souhaitez exécuter à plusieurs reprises. –