2013-04-08 2 views
1

Je développe un système expert qui prendra des décisions d'admission en utilisant PyClips. Cependant, le code a continué à générer des erreurs de «mémoire insuffisante». Je pense avoir isolé mon problème. C'est un problème avec mon fichier CLIPS. En espérant que quelqu'un puisse voir ce que je fais de mal ici. C'est la version la plus simple du code .... J'ai simplifié pour le déboguer: Voici donc mon modèle, et pour l'argumentation, il n'y a qu'une seule règle: si la transcription est reçue, alors l'application complète attribut est marqué comme TRUE.CLIPS faits infinis

; template for application facts 
(deftemplate application "structure of an application" 
(slot app-id (type INTEGER)) 
(slot app-complete (type SYMBOL)) 
(slot transcript-received (type SYMBOL)) 
) 


(defrule complete "rule for app completeness" 

?f <- (application 
     (transcript-received Yes)  
    ) 
=> 
    (modify ?f 
     (app-complete TRUE) 
    ) 
) 
; end. 

Alors, quand je fais (assert (application (app-id 123) (transcript-received Yes))) , je fait est ajouté. Lorsque je clique sur Exécuter quand même .... la fenêtre dans CLIPS commence à être surchargée de milliers de faits ... l'attribut app-complete semble être marqué comme VRAI, cependant, les faits continuent de boucler et de boucler, sans arrêt. Quand il y a trop de faits, je parle de 100K ou de quelque chose ... alors CLIPS se retire ... Une idée de ce que je fais mal ici? Ma syntaxe est en quelque sorte foirée? Mes intentions sont alors d'avoir un sqlite db pour être capable de lire les 'faits' de la base de données pour que le système soit capable de prendre des décisions .... mais je ne peux pas dépasser cela!

Répondre

1

Le point important à retenir est que lorsque vous modifiez un fait deftemplate, le fait est rétracté et un nouveau fait (modifié) est affirmé. Votre règle correspond également au fait modifié, qui est à nouveau modifié et mis en correspondance, etc., ce qui entraîne une boucle infinie. Si vous deviez regarder les faits et les activations lorsque vous exécutez votre code, vous voyez quelque chose comme ceci:

<== f-1  (application (app-id 123) (app-complete nil) (transcript-received Yes)) 
==> f-2  (application (app-id 123) (app-complete TRUE) (transcript-received Yes)) 
==> Activation 0  complete: f-2 
<== f-2  (application (app-id 123) (app-complete TRUE) (transcript-received Yes)) 
==> f-3  (application (app-id 123) (app-complete TRUE) (transcript-received Yes)) 
==> Activation 0  complete: f-3 
<== f-3  (application (app-id 123) (app-complete TRUE) (transcript-received Yes)) 
==> f-4  (application (app-id 123) (app-complete TRUE) (transcript-received Yes)) 
==> Activation 0  complete: f-4 
(etc.) 

Vous pouvez éviter cela en seulement les applications correspondant qui ne sont pas déjà complète. Voici une version modifiée de votre code qui ajoute une valeur par défaut FALSE à la fente app-complete et correspond uniquement à des applications qui ne sont pas complètes:

(deftemplate application "structure of an application" 
    (slot app-id (type INTEGER)) 
    (slot app-complete (type SYMBOL) (default FALSE)) 
    (slot transcript-received (type SYMBOL))) 

(defrule complete "rule for app completeness" 
    ?f <- (application (transcript-received Yes) (app-complete FALSE)) 
    => 
    (modify ?f (app-complete TRUE))) 

Maintenant, si vous regardez les faits et les activations, vous devriez voir ce qui suit lorsque vous affirmer votre fait et exécuter:

CLIPS> (assert (application (app-id 123) (transcript-received Yes))) 
==> f-0  (application (app-id 123) (app-complete FALSE) (transcript-received Yes)) 
==> Activation 0  complete: f-0 
<Fact-0> 
CLIPS> (run) 
<== f-0  (application (app-id 123) (app-complete FALSE) (transcript-received Yes)) 
==> f-1  (application (app-id 123) (app-complete TRUE) (transcript-received Yes)) 
CLIPS> 
+0

Merci @bogatron! – engr007

+0

une idée à propos de celui-ci? http://stackoverflow.com/questions/15963202/how-to-combine-these-two-rules-with-clips – engr007

+0

Il semble quelque peu lié à cette question. Si ma réponse à cette question est acceptable, alors s'il vous plaît cliquez sur le lien Accepter donc je sais que c'est correct et toute personne effectuant une recherche liée à votre question saura que c'est une solution acceptable. Ensuite, nous pouvons passer à la question connexe. – bogatron