从剪辑专家系统使用Python函数

时间:2010-07-14 15:47:12

标签: python machine-learning expert-system clips

使用PyClips,我正在尝试在Clips中构建规则,从Python解释器中动态检索数据。为此,我按照the manual中所述注册了一个外部函数。

以下代码是问题的玩具示例。我这样做是因为我有一个带有大量数据的应用程序,以SQL数据库的形式,我想使用Clips推理。但是,我不想浪费时间将所有这些数据转换为Clips断言,如果我可以简单地将Clips“直接”插入到Python的命名空间中。

但是,当我尝试创建规则时,出现错误。我做错了什么?

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

2 个答案:

答案 0 :(得分:3)

我在PyClips支持小组上收到了一些帮助。解决方案是确保您的Python函数返回一个clips.Symbol对象并使用(test ...)来评估规则的LHS中的函数。使用Reset()似乎也是激活某些规则所必需的。

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

答案 1 :(得分:1)

您的问题与(neq (python-call py_getvar user) 'None')有关。显然,剪辑不喜欢嵌套语句。看起来试图在一个相等的语句中包装函数调用会带来不好的事情。但是,当函数返回Nil或值时,您永远不会断言值。相反,你要做的就是:

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

然后只需将"(neq (python-call py_getvar user) 'None')"更改为"(python-call py_getvar user)"

这应该有效。在刚刚搞砸之前没有使用pyclips,但那应该做你想要的。

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