Question

À l'aide de PyClips, j'essaie de créer des règles dans Clips qui récupèrent dynamiquement les données de l'interpréteur Python.Pour ce faire, j'enregistre une fonction externe comme indiqué dans Le manuel.

Le code ci-dessous est un exemple ludique du problème.Je fais cela parce que j'ai une application avec un grand corpus de données, sous la forme d'une base de données SQL, que je souhaite raisonner à l'aide de Clips.Cependant, je ne veux pas perdre de temps à convertir toutes ces données en assertions Clips, si je peux simplement "brancher" Clips directement dans l'espace de noms de Python.

Cependant, lorsque j'essaie de créer la règle, j'obtiens une erreur.Qu'est-ce que je fais mal?

import clips

#user = True

#def py_getvar(k):
#    return globals().get(k)
def py_getvar(k):
    return True if globals.get(k) else clips.Symbol('FALSE')

clips.RegisterPythonFunction(py_getvar)

print clips.Eval("(python-call py_getvar user)") # Outputs "nil"

# If globals().get('user') is not None: assert something
clips.BuildRule("user-rule", "(neq (python-call py_getvar user) nil)", "(assert (user-present))", "the user rule")
#clips.BuildRule("user-rule", "(python-call py_getvar user)", "(assert (user-present))", "the user rule")

clips.Run()
clips.PrintFacts()
Était-ce utile?

La solution

J'ai reçu une aide sur le groupe de soutien Pyclips.La solution consiste à assurer que votre fonction Python renvoie un objet Clips.Symbol et utiliser (test ...) pour évaluer les fonctions de la LHS des règles.L'utilisation de la réinitialisation () semble également nécessaire pour activer certaines règles.

import clips
clips.Reset()

user = True

def py_getvar(k):
    return (clips.Symbol('TRUE') if globals().get(k) else clips.Symbol('FALSE'))

clips.RegisterPythonFunction(py_getvar)

# if globals().get('user') is not None: assert something
clips.BuildRule("user-rule", "(test (eq (python-call py_getvar user) TRUE))",
                '(assert (user-present))',
                "the user rule")

clips.Run()
clips.PrintFacts()

Autres conseils

Votre problème a quelque chose à voir avec le (neq (python-call py_getvar user) 'None').Apparemment, clips n'aime pas l'instruction imbriquée.Il semble qu'essayer d'envelopper un appel de fonction dans une déclaration d'égalité fasse de mauvaises choses.Cependant, vous n'affirmerez jamais la valeur de toute façon, car votre fonction renvoie soit Nil, soit la valeur.Au lieu de cela, vous voudrez faire ceci :

def py_getvar(k):
    return clips.Symbol('TRUE') if globals.get(k) else clips.Symbol('FALSE')

alors change juste "(neq (python-call py_getvar user) 'None')" à "(python-call py_getvar user)"

Et ça devrait marcher.Je n'ai pas utilisé pyclips avant de jouer avec, mais cela devrait faire ce que vous voulez.

HTH!

>>> import clips
>>> def py_getvar(k):
...     return clips.Symbol('TRUE') if globals.get(k) else clips.Symbol('FALSE')

...
>>> clips.RegisterPythonFunction(py_getvar)
>>> clips.BuildRule("user-rule", "(python-call py_getvar user)", "(assert (user-
present))", "the user rule")
<Rule 'user-rule': defrule object at 0x00A691D0>
>>> clips.Run()
0
>>> clips.PrintFacts()
>>>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top