如何使用PyClips使规则激活调用Python函数

5 投票
1 回答
1653 浏览
提问于 2025-04-17 10:54

我正在尝试使用PyClips,并想把它和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 )
""")

但是,当我声明事实“动物是鸭子”时,我的Python函数并没有被调用:

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

我哪里做错了呢?

1 个回答

2

这里有个括号放错地方了,导致规则提前结束,漏掉了 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

撰写回答