python machine-learning expert-system clips

Uso de las funciones de Python del sistema experto de clips



machine-learning expert-system (2)

Al usar PyClips, intento crear reglas en Clips que recuperen datos dinámicamente del intérprete de Python. Para hacer esto, registro una función externa como se describe en el manual .

El siguiente código es un ejemplo de juguete del problema. Lo hago porque tengo una aplicación con un gran corpus de datos, en forma de una base de datos SQL, que quiero razonar con Clips. Sin embargo, no quiero perder el tiempo convirtiendo todos estos datos en afirmaciones de Clips, si simplemente puedo "conectar" Clips directamente en el espacio de nombres de Python.

Sin embargo, cuando intento crear la regla, aparece 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()


Recibí algo de ayuda en el grupo de soporte de PyClips. La solución es garantizar que su función de Python devuelva un clip. Símbolo de objeto y uso (prueba ...) para evaluar funciones en el LHS de reglas. El uso de Restablecer () 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()


Su problema tiene algo que ver con el (neq (python-call py_getvar user) ''None'') . Aparentemente, a los clips no les gusta la declaración anidada. Parece que intentar envolver una llamada de función en una declaración de igualdad hace cosas malas. Sin embargo, nunca hará valer el valor de todos modos ya que su función devuelve Nil o el valor. En cambio, lo que querrás hacer es esto:

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

entonces simplemente cambie "(neq (python-call py_getvar user) ''None'')" to "(python-call py_getvar user)"

Y eso debería funcionar No he usado las pastillas antes de meterme con ellas ahora, pero eso debería hacer lo que quieras.

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