[Next]プロパティ [Previous]トレース [Up]PoPの使用方法 [Top]
コールバック
Prologプログラムの実行中に,Pythonプログラムを呼び出す(コールバックする)ことができます.
呼び出されたプログラムの中では,
- Prologプログラム中の変数値の参照
- Prologプログラム中の変数の束縛
- PoPに無関係な任意の処理
を行うことができます.
コールバックの設定
コールバックは,assertメソッドに対してbodyキーワードを使用して,
pop.assertz(head, body=callable_obj)
と宣言することにより登録します.
ここで,callable_objは,一つの引数を持つ呼出し可能な(callable)オブジェクトでなければなりません.
呼出し可能なオブジェクトには,
- 関数
- メソッド
- __call__メソッドを持つインスタンス
などがあります.
コールバックのタイミング
設定されたコールバックは,当該述語の呼出し/再呼出し時と,バックトラック時に呼び出されます.
バックトラック時にも呼び出されますので,注意してください.
コールバックの引数
コールバックには,コールバック・マネジャというオブジェクトが渡されます.
このオブジェクトのメソッドを呼び出すことにより,どちらのタイミングで呼び出されたのかを知ることや,変数値の参照,変数の束縛などが行えます.
コールバックの結果
呼出し/再呼出し時には,コールバックが返却する値により,評価の成功/失敗が決定されます.
コールバックから非0の値が返されれば成功,それ以外は,失敗と判定されます.
バックトラック時には,コールバックの結果は無視されます.
呼出しタイミングの取得
コールバック・マネジャのcallingメソッドを呼び出すことにより取得します.
呼出し/再呼出し時は非0,バックトラック時は0が返されます.
def callback(mgr):
if mgr.calling():
print 'CALL or REDO'
else:
print 'BACKTRACK'
return 1
変数値の参照
コールバック・マネジャのvariablesメソッドを呼び出すことにより,変数に束縛されている値が返されます.
形式は,inquireメソッドの結果と同じです.
変数の束縛
束縛されていない変数を束縛することができます.
束縛できる値はPoPオブジェクトです.ただし,(束縛されているかにかかわらず)変数を含んでいてはなりません.
変数の束縛は,コールバック・マネジャのbindメソッドを呼び出して行います.
この第2引数は,暗黙的にPoPオブジェクトに変換されます.
def callback(mgr):
if mgr.calling():
mgr.bind('x', 3)
return 1
例外
コールバック・マネジャの呼出しで発生する例外は,標準例外およびFail例外です.
コールバック・マネジャのメソッドについては,リファレンスを参照してください.
[Next]プロパティ [Previous]トレース [Up]PoPの使用方法 [Top]