| ||||||||||
| 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. CPREDは、STATE複合項のサイズを引数として呼び出されます。IF/Prologが初めてC述語のル−チンを呼び出す時(実体を作る時)、このサイズの変数を生成し、その実体が存在する間は保持し続けます。IF/Prologでは、最初にプログラムポインタ=0で関数を呼び出します。各活性化の間(RESUMEs)、直前の返り値が次のプログラムポインタとして記憶されます。もしそれ以上他の解が見つからないと、次のプログラムポインタとして0が返されます。もしepilog(後処理指令)がある場合、IF/Prologは、epilogを実行するためにプログラムポインタ=−1でそのル−チンを再度呼び出します。以下にその概要を示します。 CALL-create & start: IF/Prologでは、コル−チンのプログラムポインタとSTATEのためにメモリ空間を割り当てます。またプログラムポインタを0に設定し、プログラムポインタとSTATEポインタを引数として関数を呼び出します。この段階でC述語の実体が活性化されます。 EXIT-detach: 関数は新しいプログラムポインタとなる正の値を返します。プログラムポインタとSTATEは、次の活性化に使うために破壊されずに保持されます。 REDO-すでに存在しているコル−チンの再実行: IF/Prologでは、前の活性化で返されたプログラムポインタとSTATEポインタを引数として関数を呼び出します。 FAIL-detach & destroy-内部破壊: 関数は0を返します。そしてプログラムポインタを−1とし、そのプログラムポインタとSTATEポインタを引数として再び関数を呼び出します。 !(カット)またはアボ−ト−外部破壊: プログラムポインタを−1にし、そのプログラムポインタとSTATEポインタを引数として関数を呼び出します。その後、プログラムポインタとSTATEに使われていた領域は開放されます。 コル−チンを作るためには、以下の事項を実現しなければなりません。 -ゴ−ルがresumeする時に必要な、もとのアルゴリズムにあるすべての変数を記憶する方法 -次の活性化を始めるべき場所である、プログラムの停止地点を記憶する方法 IF/Prologでは、各活性化に必要なすべての変数値は、前もって定義された(typedef)構造体STATEに、恒久的に格納されている値に置き換えられなければなりません。正しい地点からゴ−ルにresumeするために、detachはある特定の正の数(N)を返すreturn文から成ります。そしてその返された整数によって再入点を指示するために、その文の直後に、ある特定のラベル(LabelN)が置かれます。コル−チンの最初には、制御を正しい再入点に移すためのコ−ドが置かれます。そのコ−ドは、与えられたプログラムポインタの値(最も最近に返された整数)に基づいて再入点を決めます。 以上のことを実現すると以下のようになります。この時点でかなり複雑になっていることに注意して下さい。この複雑なコ−ドを単純化するために多くのマクロ定義があり、これらについては次章で説明します。
#include int Function(PP, StatePtr) int PP; STATE *StatePtr; { switch(PP) { case 0: break; case 1: goto Label1; case 2: goto Label2; .... }; StatePtr->y =....StatePtr->x ....; .... return 1; Label1: ; .... return 2; Label2: ; .... return 0 } | ||||||||||
|
| Back> |
|