Utilizando Python Funções do Sistema Especialista Clips
-
15-09-2020 - |
Pergunta
Usando PyClips, eu estou tentando criar regras em Clips que dinamicamente recuperar dados a partir do interpretador Python.Para fazer isso, eu registrar uma função externa, conforme descrito no o manual.
O código abaixo é um brinquedo exemplo do problema.Eu estou fazendo isso porque eu tenho uma aplicação com um grande volume de dados, na forma de um banco de dados SQL, o que eu quero da razão, com o uso de Clipes.No entanto, eu não quero perder tempo a conversão de todos os dados em Clipes afirmações, se eu posso simplesmente "plug" Clipes diretamente em Python do espaço de nomes.
No entanto, quando tento criar a regra, eu recebo um erro.O que estou fazendo de errado?
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()
Solução
Eu recebido alguma ajuda sobre o PyClips grupo de apoio.A solução é garantir que a sua função em Python retorna um clips.Símbolo objeto e uso (teste ...) para avaliar funções no lado esquerdo das regras.O uso de Reset() também parece ser necessário activar determinadas regras.
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()
Outras dicas
O seu problema tem algo a ver com o (neq (python-call py_getvar user) 'None')
.Aparentemente, clipes de não gostar da aninhadas instrução.Parece que a tentativa de moldar uma chamada de função em uma igualdade instrução faz coisas ruins.No entanto, você nunca vai afirmar o valor de qualquer maneira, pois sua função retorna Nil ou o valor.Em vez disso, o que você vai querer fazer é isso:
def py_getvar(k):
return clips.Symbol('TRUE') if globals.get(k) else clips.Symbol('FALSE')
em seguida, basta alterar "(neq (python-call py_getvar user) 'None')"
para "(python-call py_getvar user)"
E que deve funcionar.Ainda não utilizados pyclips antes de brincar com ela agora, mas que deve fazer o que você quer.
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()
>>>