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
typedef struct{ int x; int y;... } STATE;
Cboot() { CPRED(PredicateName, Arity, Function, sizeof(STATE));}
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
}
|