Domanda

Utilizzando PYCLIPS, sto cercando di creare regole in clip che recuperano dinamicamente i dati dall'interprete Python.Per fare ciò, registro una funzione esterna come descritto in Il manuale .

Il codice qui sotto è un esempio di giocattolo del problema.Lo sto facendo perché ho un'applicazione con un grande corpus di dati, sotto forma di un database SQL, che voglio ragionare con l'utilizzo di clip.Tuttavia, non voglio perdere tempo a convertire tutti questi dati nelle asserzioni di clip, se riesco semplicemente a "collegare" le clip direttamente nello spazio dei nomi di Python.

Tuttavia, quando provo a creare la regola, ottengo un errore.Cosa sto facendo male?

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

È stato utile?

Soluzione

Ho ricevuto un po 'di aiuto sul gruppo di supporto PYCLIPS.La soluzione è garantire la funzione Python restituisce un oggetto clips.symbol e utilizzare (prova ...) per valutare le funzioni nel LHS delle regole.Anche l'uso del reset () sembra essere necessario attivare determinate regole.

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

Altri suggerimenti

Il tuo problema ha qualcosa a che fare con il (neq (python-call py_getvar user) 'None').Apparentemente clip non piace la dichiarazione annidata.Sembra che il tentativo di avvolgere una chiamata di funzione in una dichiarazione di uguaglianza fa cose brutte.Tuttavia non avrai mai affermato il valore comunque in quanto la funzione restituisce né n. Nil o il valore.Invece quello che vorresti fare è questo:

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

Quindi modificare "(neq (python-call py_getvar user) 'None')" in "(python-call py_getvar user)"

E questo dovrebbe funzionare.Non hanno usato Pyclips prima di scherzarlo proprio ora, ma questo dovrebbe fare ciò che vuoi.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top