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.
+--------------------------------------------------+
| コル−チン |
| +----------------------------------------------+ |
| | typedef struct{...} STATE (stores variables) | |
| +----------------------------------------------+ |
| +----------------------------------------------+ |
| | int Function(PP,StatePtr) | |
| | int PP; | |
| | STATE *StatePtr; | |
| | { switch(PP){ | |
| | ... | |
| | return((int)NewPP); | |
| | } | |
| +----------------------------------------------+ |
+--------------------------------------------------+
図C-6
C言語によるコル−チンの実現は、以下のものによって成り立っています。
-整数型関数
-STATEと呼ぶ構造体の定義
-整数変数であるプログラムポインタ(PP)
STATEは、コル−チンが活性化状態にある間、局所変数を格納するのに使われ、関数は、コル−チンの制御の流れを定義します(もちろん、それに加えて、そのル−チンが本来すべき仕事を実行します)。プログラムポインタあるいはPPは、STATEと共に入点/再入点を決定します。
最初にこの関数を呼び出すには、PP=0にします。それはEXITやdetachが実行されるたびに、新しいPPの値として正の数を返します。これは、制御の流れがコル−チンの実体の次のREDOまたはresumeにおいて、行くべき所を示しています。FAILまたはdetach & destroyでは、関数は0を返します。
create & start: PP=0の時、関数を呼びます
detach: 関数は新しいppの値として正の値を返します
resume: PP>0の時、関数を呼びます
detach & destroy: 関数は0を返します
コル−チンの実体を破壊しない、detachによる正の返り値が、プログラムポインタ(PP)の新しい値になります。この返り値は、detachがどこで生じたかを示し、またこのコル−チンの実体を次に活性化するときのパラメ−タPPとなります。(以下に示すコ−ドを参照)普通、プログラムポインタは、何回ゴ−ルを満たす解が見つかったかをかぞえるのに使われます。
上で説明したように、コル−チンとして呼び出された、この簡単なプログラムは、最初に呼び出した時、名前 "alice"を返し、最初のバックトラックで "john"を、2度目のバックトラックで "steve"を返します。もし4度目の活性化をすれば、もうそれ以上他の解は見つからず、失敗します。
NameFunc(PP)
int PP;
{ switch(PP) {
case 0:
UnifyArg(1,StrAt("alice"));
return 1;
case 1:
UnifyArg(1,StrAt("john"));
return 2;
case 2:
UnifyArg(1,StrAt("steve"));
return 3;
case 3:
return 0;
} }
上記の例は、IF/Prologを使ってコル−チンを実現するための基本的な方法を示していますが、多くの”管理情報的”項目がこのプログラムから除外されていることに注意して下さい。これらの項目は簡単なものではありませんが、IF/Prologのユ−ザにとっては、後の章で説明するcpred.hの中にあるマクロ定義によってこれらが単純化されています。
|