(Tout d'abord, désolé pour mon anglais :)) J'essaie de créer un système de révision pour mon projet (une simple classification des plantes naturelles), je ne veux pas coller tout mon code , mais seulement les parties importantes, donc je vais essayer d'expliquer ce que le système fait. J'ai fait une fonction (que j'appelle réviser-attribut), quand le système trouve les plantes qui doivent correspondre aux réponses données par l'utilisateur, qui demandent à l'utilisateur s'il veut modifier certains attributs, s'il répond "oui" il peut choisir quels attributs veulent changer, alors le système trouve le fait et la fin des attributs et les rétracte, donc il commence dès le début et devrait réévaluer les règles. Par exemple, j'ai ces deux règles:Clips réviser le système
(defrule month
(not(attribute (name month)))
=>
(bind ?allow (create$ january february march april mamy june july august september october november december))
(bind ?answer (ask-question "what month is it?" ?allow))
(assert (attribute (name month) (value ?answer)))
)
(defrule flowering
(not (attribute (name flowering)))
(attribute (name month) (value ?month))
=>
(assert (attribute (name flowering) (value ?month)))
)
Si, à la fin, l'utilisateur souhaite modifier l'attribut mois, ce dernier sera rétractés et le mois de règle devrait être réévalué et tiré parce qu'il n » est pas t aucun attribut de mois, ainsi de cette manière il peut changer la valeur du mois, cependant l'attribut de floraison devrait être changé aussi, mais ceci n'est pas fait il y a un attribut avec le nom floraison qui a été affirmé. Dans cet esprit, j'ai créé un module qui est « focus » après la fonction revoir:
(defmodule REVISITING (import MAIN ?ALL))
(defrule REVISITING::retract-month
(not (attribute(name month)))
?f <- (attribute(name flowering))
=>
(retract ?f)
)
Donc, si le mois est rétracté, la floraison est escamoté aussi. Cependant, je me demande s'il y a une possibilité de faire la même chose dans une meilleure méthode parce que j'ai un doute pour la règle suivante
(defrule petal-apex-toothed
(not (attribute (name petal-apex-toothed)))
(attribute (name petal-color) (valore blue | unknown))
(attribute (name habitat) (valore sea | montain | edge_of_the_road |camp | unknow))
(attributo (name flowering) (valore may | june | july | august))
=>
(bind ?allow (create$ yes no unknow))
(bind ?answer (ask-question "The petal's apex is toothed?" ?allow))
(assert (attribute (name petal-apex-toothed) (value ?answer)))
)
Par exemple, si l'utilisateur souhaite modifier l'attribut de l'habitat que je pourrais créer la règle suivante dans le module Revisiter
(defrule retract-habitat
(not(attribute(name habitat)))
?f <- (attribute (name petal-apex-toothed)))
=>
(retract ?f)
)
mais si la première valeur entrée par l'utilisateur était la montagne, puis il a changé avec edge_of_road sera rétracté l'attribut pétale-sommet dents trop et re-tiré, mais je chose il pourrait être redondant de demander la question à propos de pétale-apex-denté. Alors, comment puis-je améliorer mon code?
P.S. J'espère avoir été clair, sinon je peux essayer d'expliquer mysef mieux :)