2012-01-23 5 views
4

私はPyClipsを実験しています。ルールをアクティブにするとPython関数を呼び出すように、Pythonと密接に統合したいと思います。ここでPyClipsを使用して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 

何午前私は間違っている?

+0

CLIPS!私はそれを愛していました。私は何か役に立つものを寄付することはできません.CLIPsが行っている限り正しいです。 – Joe

+0

あなたの関数に何か診断を貼り付けて、実行していないことを確認してください。 'import pdb; pdb.set_trace()'など – Joe

答えて

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 
+0

フィードバックに感謝します。私は間違った括弧で困惑したとは信じられません!スニペットを修正して、pyCLIPSに変数(単純なデータ型:bool、integer、float、string)を渡す方法を示してもらえますか(これはCLIPS変数へのバインディングを含むと思いますが、わかりません)。 CLIPSから(単純データ型)変数をPythonに戻す方法についても説明します。余談ですが、pyCLIPSにもっと複雑なデータ型(例えば、リストやdict)を渡したいのであれば、そうすることをお勧めしますか? –

+0

@HomunculusReticulli:申し訳ありませんが、クリップを実際に使用したことはありません。私はそれがここでは話題になるのではないかと懸念していますが、あなたは新しい質問をもっと歓迎します。 –

+0

うん、あなたが私の質問を誤解しているかどうか分からない。私は、PythonからPyClipsに変数を渡す方法を知りたいと思います。例えばPythonからPyCLIPSまで、私はPythonの整数、二重、文字列(あるいは多分?)を表明し、PyCLIPSでトリガされたルールをどのようにアサートできるかを知りたいと思います。 PyCLIPS - > Pythonについては、PyClipsの変数(例:string、int、float)をPython変数に渡す方法を知りたいと思います。私のサンプルスニペットのaddf Python関数のようなものです。 –