我在试验 单车/单车 而且我想将它与Python紧密集成,这样当一个规则被激活时,它会调用一个python函数。

这是我到目前为止所拥有的:

import clips

def addf(a, b):
    return a + b

clips.RegisterPythonFunction(addf)

clips.Build("""
(defrule duck
  (animal-is duck)
  =>
  (assert (sound-is quack))
  (printout t "it’s a duck" crlf))
  (python-call addf 40 2 )
""")

但是,当我断言事实'animal-is duck'时,我的python函数没有被调用:

>>> clips.Assert("(animal-is duck)")
<Fact 'f-0': fact object at 0x7fe4cb323720>
>>> clips.Run()
0

我做错了什么?

有帮助吗?

解决方案

有一个放错了位置的括号,它过早地关闭了规则,而忽略了 python-call:

clips.Build("""
(defrule duck
  (animal-is duck)
  =>
  (assert (sound-is quack))
  (printout t "it's a duck" crlf))
  (python-call addf 40 2 )       ^
""")                      ^      |
                          |   this one
                          |
                      should go here

如果要验证 addf 实际上返回了42,结果可以绑定并打印出来:

clips.Build("""
(defrule duck
  (animal-is duck)
  =>
  (assert (sound-is quack))
  (printout t \"it's a duck\" crlf)
  (bind ?tot (python-call addf 40 2 ))
  (printout t ?tot crlf))
""")


clips.Assert("(animal-is duck)")
clips.Run()
t = clips.StdoutStream.Read()
print t
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top