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.
名前
ProOpen
ProFetch
ProClose
概要
INT ProOpoen(Goal,Cursor_Ptr)
INT ProFetch(Cursor_Ptr)
INT ProClose(Cursor_Ptr)
TERM Goal;
CURSOR *Cursor_Ptr;
ProOpen() は項を IF/Prologに渡すのに使われ,項はPrologのゴールとして実行さ
れます.そのゴールを実行するためには,ProFetch() を使用しなければなりませ
ん.Cursor_Ptr は事前に確保された CURSOR 型のデータ構造を指していなければ
なりません.このデータ構造は ProOpen() を呼び出すことにより初期化されます.
警告:
C述語と Cプリミティブへの引数が後で使用されるのならば,それらは新しく確保
された変数に保存されなれなければなりません.というのは,Prologのゴールを新
しく呼び出すと,これらの引数が上書きされてしまうからです !!
ProFetch() は事前に open されているゴールを活性化し,その最初の解を返しま
す.それ以降の解は,ProFetch() を繰り返し呼び出すことで,(存在すれば)得ら
れます.ProFetch() は,(それ以降の)解が求められた時には0 以外の値を,それ
以外の場合には 0を返します.もし何も解が見つからない場合には,
Cursor_Ptr->qu_state を調べて,その理由を知ることが出来ます.
qu_state == 0: もうこれ以上解が存在しない.
qu_state == -1: 例外処理(exception)が起動された.
qu_state == -2: ゴールを終了させるために exit が使用された.
最初に ProFetch が呼び出される時は,ProOpen 呼び出されたすぐ後でなくてはな
りません.
ProClose() は, Prologの質問を close します.ProOpen() が呼び出され,すべ
ての欲しい結果が ProFetch() で得られた後で,必ず ProClose() が呼ばれなくて
はなりません.複数の Prolog ゴールが open された場合には,逆順に close さ
れなくてはなりません.
int member(list)
TERM list;
{ TERM X;
CURSOR cursor;
X = MkVariable();
Protect(&x);
ProOpen(MkStructure("member",2,x,list), &cursor);
while (ProFetch(&cursor))
printt("%q is member of %q\n", x, list);
ProClose(&cursor);
UnProtect(&x);
}
|