Frage

Mit PyClips versuche ich, Regeln in Clips zu erstellen, die Daten dynamisch vom Python-Interpreter abrufen.Dazu registriere ich eine externe Funktion wie in beschrieben das Handbuch.

Der folgende Code ist ein Spielzeugbeispiel für das Problem.Ich mache das, weil ich eine Anwendung mit einem großen Datenbestand in Form einer SQL-Datenbank habe, die ich mit der Verwendung von Clips begründen möchte.Ich möchte jedoch keine Zeit damit verschwenden, all diese Daten in Clips-Behauptungen umzuwandeln, wenn ich Clips einfach direkt in den Namespace von Python „einbinden“ kann.

Wenn ich jedoch versuche, die Regel zu erstellen, erhalte ich eine Fehlermeldung.Was mache ich falsch?

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()
War es hilfreich?

Lösung

Ich habe in der Pyclips-Support-Gruppe etwas Hilfe erhalten.Die Lösung besteht darin, sicherzustellen, dass Ihre Python-Funktion ein Clips.symbol-Objekt zurückgibt, und verwenden (Test ...), um Funktionen in den Regeln der LHS auszuwerten.Die Verwendung von Reset () scheint auch erforderlich, um bestimmte Regeln zu aktivieren.

generasacodicetagpre.

Andere Tipps

Dein Problem hat etwas damit zu tun (neq (python-call py_getvar user) 'None').Anscheinend gefällt Clips die verschachtelte Anweisung nicht.Es scheint, dass der Versuch, einen Funktionsaufruf in eine Gleichheitsanweisung einzuschließen, schlechte Auswirkungen hat.Sie werden den Wert jedoch sowieso nie bestätigen, da Ihre Funktion entweder Null oder den Wert zurückgibt.Stattdessen sollten Sie Folgendes tun:

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

dann ändere dich einfach "(neq (python-call py_getvar user) 'None')" Zu "(python-call py_getvar user)"

Und das sollte funktionieren.Ich habe Pyclips noch nicht verwendet, bevor ich gerade damit herumgespielt habe, aber das sollte tun, was Sie wollen.

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()
>>>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top