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()
Foi útil?

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()
>>>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top