+--------------------------------------------------+ | コル−チン | | +----------------------------------------------+ | | | 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の中にあるマクロ定義によってこれらが単純化されています。
| scroll to top |
|