2012-01-23 1 views
4

J'expérimente avec PyClips et je veux l'intégrer étroitement avec Python, de sorte que lorsqu'une règle est activée, elle appelle une fonction python.Comment activer une règle pour appeler une fonction python, en utilisant PyClips

Voici ce que j'ai jusqu'à présent:

import clips 

def addf(a, b): 
    return a + b 

clips.RegisterPythonFunction(addf) 

clips.Build(""" 
(defrule duck 
    (animal-is duck) 
    => 
    (assert (sound-is quack)) 
    (printout t "it’s a duck" crlf)) 
    (python-call addf 40 2) 
""") 

Cependant, quand j'affirme le fait 'animal est canard', ma fonction python n'est pas appelé:

>>> clips.Assert("(animal-is duck)") 
<Fact 'f-0': fact object at 0x7fe4cb323720> 
>>> clips.Run() 
0 

Qu'est-ce que Je fais mal?

+0

CLIPS! J'ai aimé utiliser ça. Je ne peux rien ajouter d'utile, cela semble correct dans la mesure où les CLIP vont. – Joe

+0

essayez de coller quelque chose de diagnostic dans votre fonction pour être sûr qu'il ne fonctionne pas. 'import pdb; pdb.set_trace()' ou similaire – Joe

Répondre

2

Il y a un support mal placé qui ferme la règle trop tôt en laissant le python-call:

clips.Build(""" 
(defrule duck 
    (animal-is duck) 
    => 
    (assert (sound-is quack)) 
    (printout t "it's a duck" crlf)) 
    (python-call addf 40 2)  ^
""")     ^ | 
          | this one 
          | 
         should go here 

Si vous voulez vérifier que le addf effectivement retourné 42, le résultat pourrait être boudiné imprimé dehors:

clips.Build(""" 
(defrule duck 
    (animal-is duck) 
    => 
    (assert (sound-is quack)) 
    (printout t \"it's a duck\" crlf) 
    (bind ?tot (python-call addf 40 2)) 
    (printout t ?tot crlf)) 
""") 


clips.Assert("(animal-is duck)") 
clips.Run() 
t = clips.StdoutStream.Read() 
print t 
+0

Merci pour vos commentaires. Je ne peux pas croire que j'ai été perplexe par des parenthèses égarées! Pourriez-vous s'il vous plaît modifier l'extrait afin qu'il montre comment passer des variables (types de données simples: bool, entier, float, chaîne) à pyCLIPS (je pense que cela implique 'binding' aux variables CLIPS - mais je ne suis pas sûr) aussi comment passer des variables (type de données simples) de CLIPS à Python. En passant, si je voulais passer un type de données plus compliqué (par exemple, liste ou dict) à pyCLIPS, quelle serait votre recommandation pour le faire? –

+0

@HomunculusReticulli: Je suis désolé, je n'ai jamais vraiment utilisé de clips, donc je ne peux pas vous aider avec ça. Je crains aussi que ce soit hors-sujet ici, mais vous êtes plus que bienvenu pour ouvrir une nouvelle question. –

+0

Hmmm, je ne suis pas sûr si vous avez mal compris ma question. Je veux savoir comment je peux passer des variables de Python à PyClips (et l'inverse). Par exemple de Python à PyCLIPS, je veux savoir comment je peux affirmer un entier Python, double, string (ou peut-être list?) Et voir la règle déclenchée dans PyCLIPS. Pour PyCLIPS -> Python, je veux savoir comment passer une variable 'PyCLIPS' (par exemple, string, int, float) à une variable Python - un peu comme ce que j'ai fait avec la fonction addf Python dans mon exemple d'extrait. –

Questions connexes