CPREDは、STATE複合項のサイズを引数として呼び出されます。IF/Prologが初めてC述語のル−チンを呼び出す時(実体を作る時)、このサイズの変数を生成し、その実体が存在する間は保持し続けます。IF/Prologでは、最初にプログラムポインタ=0で関数を呼び出します。各活性化の間(RESUMEs)、直前の返り値が次のプログラムポインタとして記憶されます。もしそれ以上他の解が見つからないと、次のプログラムポインタとして0が返されます。もしepilog(後処理指令)がある場合、IF/Prologは、epilogを実行するためにプログラムポインタ=−1でそのル−チンを再度呼び出します。以下にその概要を示します。...
Move to
Next Prev
Up Top
See also
理論背景 : ボックスモデルとコル−チン
C言語によるコル−チンの実現
IF/Prologによってサポートされるコル−チン
マクロ定義と関数のライブラリ−
バックトラックをするプログラム例
バックトラックをし、Epilogを持つプログラム例
IF Computer > IF/Prolog > Manuals > IF/Prolog V4.1 マニュアル > IF/Prolog Interfaces > IF/PrologからC言語へのインタフェ−ス > バックトラックするProlog述語をC言語で書く > IF/Prologによってサポートされるコル−チン

IF/Prologによってサポートされるコル−チン

MINERVA superseeded IF/Prolog. Please see http://www.ifcomputer.co.jp/MINERVA for details.

We discontinued to sell IF/Prolog Dec 31. 2003. Dedicated technical support for IF/Prolog ended Dec 31 2008. This site is maintained as a community service only.

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 }

read on...
IF/Prolog by Siemens
Language
English
Japanese
German
Server
USA
Japan
Site Access
Local Index
Local Contents
Site Contents
Site Index
Printer Friendly
For imode
For PDA
Search
document: http://www.ifcomputer.co.jp/IFProlog/Manuals/v4.1/advanced_feature/c_interface/cpredbw/corou/home_en.html
published 2010/9/6 update 1995/11/6 (c) 1996-2009 IF Computer Japan
IF Computer 5-28-2 Sendagi, Bunkyo-ku Tel +81-3-5814-3352 start (AT) ifcomputer.com
Customer Support Tokyo 113-0022 Japan   http://www.ifcomputer.com
scroll to top managed with ubiCMS