イフコンピュータ > IF/Prolog > マニュアル > IF/Prolog V4.1 マニュアル > IF/Prolog Interfaces > IF/PrologからC言語へのインタフェ−ス > バックトラックするProlog述語をC言語で書く > マクロ定義と関数のライブラリ−

マクロ定義と関数のライブラリ−

IF/Prolog by Siemens
MINERVA superseeded IF/Prolog. Please see http://www.ifcomputer.co.jp/MINERVA for details.

We discontinued to sell IF/Prolog Dec 31. 2003. For current customers, we continue to provide professional support for IF/Prolog until Dec 31, 2008.

以下に述べるマクロ定義と関数のライブラリ−によって、容易にかつ統一的にバックトラックする述語をC言語で書けるようになります。これらのマクロ定義の詳細については、付録のcpred.hのリストを参照して下さい。

COROUTINE(関数名,State,StatePtr) これは関数の中で1番最初にくるマクロ定義でなければなりません。関数名は、CPREDの第3引数,Stateはプログラムの中ですでにtypedefで宣言されたStateと一致しなければなりません。またStatePtrは、各活性化の間に保持されているすべての変数を参照するために、プログラムで使うべきポインタです。たとえば StatePtr->length

RESUME (プログラムポインタ,ラベル) これは再びゴ−ルを満たすために実体が再活性化される時に、IF/Prologが使うラベルを宣言します。プログラムポインタとラベルは、関数の中で後に出てくるDETACHに使われるものと一致しなければなりません。

HASEPILOG これは関数の後ろにepilogがあることを宣言します。これによって必要があれば、Prologがepilogに到達することができます。

BEGIN メインプログラムの命令の開始直前、すべてのRESUMEの後、そしてDETACHの前に置かれなければなりません。

EPILOG これは内部破壊、または外部破壊が生じた時の飛び先のラベルを宣言します。epilogとして実行されるべきコ−ドは、EPILOGの直後になければなりません。

DETACH (プログラムポインタ,ラベル) 返り値として、プログラムポインタを持って関数からでます。そして実体がバックトラックのために再開された場合に"goto"で使われるべきラベルを宣言します。

FAIL Prologに実体を破壊させます。しかし関数実行により生じた副作用の処理は、ユ−ザの責任です。

END  関数の中で1番最後にくるマクロ定義です。これは、もうこれ以上他の解が見つからない、すなわち関数がDETACHを経て出てこないならば、関数がPrologに失敗を返すことを確実にします。

int EnableEpilog(); もし関数にepilogがあるならば、BEGINの後にこれを呼び出さなければなりません。そして、これを呼び出す前に、すべてのエラ−チェックを済ませておかなければなりません。これは Prologの内部フラグをセットします。こうすることによって、カットやバックトラックの後でこの関数を処理しなければならないということをPrologに知らせます。

int Undo(); これは、実体の活性化中になされた単一化を取り消し、1を返します。これが使われる典型的な場合は、関数の中でUnifyArgが2回以上使われた時です。ある単一化が成功し、しかし次の単一化が失敗したならば、前の単一化が無効なので、Undo()を使ってそれを元に戻すことができます。

これらのマクロ定義は、勝手な順序で使ってはいけません。C述語ル−チンに対しては2通りのパタ−ンがあります。1つめはバックトラックのみを扱い、2つめはepilogのあるバックトラックを扱います。(epilogとは失敗した時に後始末をします)この2つめのパタ−ンは、たとえば関数が失敗した時にオ−プンしてあったファイルをクロ−ズしなければならない時に使います。

<バックトラックするEpilogなしのC述語のためのパタ−ン>

#include typedef struct{. . .} State; Cboot() { CPRED( PredicateName, Arity, FunctionName, sizeof(State)); }

COROUTINE( FunctionName, State, StatePtr) RESUME(pp1, Label1); RESUME(pp2, Label2); ... RESUME(ppN, LabelN); BEGIN ( user defined code including use of EXCEPTION and FAIL ) DETACH(pp1, Label1) ( user defined code " ... ) DETACH(pp2, Label2) ... DETACH(ppN, LabelN) END

<バックトラックし、EpilogもあるC述語のためのパタ−ン>

#include

typedef struct{ . . . } State;

Cboot() { CPRED( PredicateName, Arity, FunctionName, sizeof(State)); }

COROUTINE(FunctionName, State, StatePtr) RESUME(pp1, Label1); RESUME(pp2, Label2); ... RESUME(ppN, LabelN); HASEPILOG; BEGIN EnableEpilog(); ( user defined code including use of EXCEPTION and FAIL ) DETACH(pp1, Label1) ( user defined code ... ) DETACH(pp2, Label2) ... DETACH(ppN, LabelN) EPILOG: ( user's code without use of the defines ) END

document: http://www.ifcomputer.co.jp/IFProlog/Manuals/v4.1/advanced_feature/c_interface/cpredbw/libmf/print_jp.html
published 2008/11/17 update 1995/11/6 (c) 1996-2006 IF Computer Japan
IF Computer 〒113-0022 Tel 03-5814-3352 start (AT) ifcomputer.com
Customer Support 東京都文京区千駄木5-28-2   http://www.ifcomputer.co.jp
戻る> managed with ubiCMS