使用PyClips时,我试图构建一些Clips规则,这些规则可以动态地从Python解释器中检索数据。为此,我按照手册中所述,注册了一个外部函数。
下面的代码是一个问题的示例。我这样做是因为我有一个包含大量数据的应用程序,这些数据以SQL数据库的形式存在,我希望使用Clips进行推理。然而,如果我可以直接将Clips“插入”到Python的命名空间中,我就不想浪费时间将所有这些数据转换成Clips的断言。
然而,当我尝试创建规则时,我得到了一个错误。我做错了什么?
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 somethingclips.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()
回答:
我在PyClips支持小组中获得了一些帮助。解决方案是确保你的Python函数返回一个clips.Symbol对象,并在规则的左侧使用(test …)来评估函数。使用Reset()似乎也是必要的,以激活某些规则。
import clipsclips.Reset()user = Truedef 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 somethingclips.BuildRule("user-rule", "(test (eq (python-call py_getvar user) TRUE))", '(assert (user-present))', "the user rule")clips.Run()clips.PrintFacts()