4

私は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 )
""")

ただし、「animal-is duck」という事実を主張すると、Python関数は呼び出されません。

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

私は何が間違っているのですか?

4

1 に答える 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

実際に返された42を確認する場合はaddf、結果をバインドして出力できます。

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
于 2012-01-26T12:56:34.327 に答える