Pregunta

El uso de PyClips, estoy tratando de construir reglas en Clips que dinámicamente recuperar los datos desde el intérprete de Python.Para hacer esto, puedo registrar una función externa como se indica en el manual.

El código siguiente es un juguete ejemplo del problema.Estoy haciendo esto porque tengo una aplicación con un gran corpus de datos, en la forma de una base de datos SQL, lo que quiero razonar con el uso de Clips.Sin embargo, no quiero perder el tiempo de la conversión de todos los datos en los Clips de afirmaciones, si puedo "plug" de los Clips directamente en Python del espacio de nombres.

Sin embargo, cuando intento crear la regla, me da un error.¿Qué estoy haciendo 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()
¿Fue útil?

Solución

Recibí ayuda en el grupo de apoyo de PCYLIPS.La solución es garantizar que su función Python devuelva un objeto de clips.symbol y use (prueba ...) para evaluar las funciones en las LHS de las reglas.El uso de reinicio () también parece ser necesario para activar ciertas reglas.

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()

Otros consejos

El problema tiene algo que ver con el (neq (python-call py_getvar user) 'None').Al parecer, los clips no le gusta el anidado de instrucción.Parece que tratando de terminar una llamada a una función en una declaración sobre igualdad hace cosas malas.Sin embargo, usted nunca va a afirmar el valor de todas maneras como su función devuelve Nil o el valor.En lugar de lo que usted querrá hacer es esto:

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

a continuación, sólo cambio "(neq (python-call py_getvar user) 'None')" a "(python-call py_getvar user)"

Y que deben trabajar.No he utilizado pyclips antes de jugar con él ahora mismo, pero que debe hacer lo que quiera.

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()
>>>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top