IF Computer > IF/Prolog > Manuals > IF/Prolog V4.1 マニュアル > IF/Prolog Interfaces > IF/PrologからC言語へのインタフェ−ス > バックトラックするProlog述語をC言語で書く > バックトラックをするプログラム例 > for_predの説明

for_predの説明

IF/Prolog by Siemens
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.

-・C関数名”Forpred”は、Cboot()関数の中でマクロ定義CPRED()によってIF/Prologに与えられます。

-・プログラムポインタ変数は、マクロ定義COROUTINEによって自動的にユ−ザのプログラムに加えられることに注意して下さい。

-・述語の最初の呼び出しは、プログラムポインタである変数portを0として行われます。これによって、ル−チンのswitch文のcase0を実行し、switch文からぬけ出します。

-・型チェックは、第1引数と第3引数について行われます。もしそれらが整数でない場合、”integer_expected”というエラ−メッセ−ジが出力され、関数はFAILポ−トから外に出ます。

-・それ以外の場合は、カウンタ−iが述語の第1引数(Min_int)の値に初期化され、第3引数の最大値(Max_int)がmaxに記憶されます。そしてwhileル−プを1回実行します。最初のwhileル−プの繰り返しで、カウンタ−i(Min_int)は、述語の第2引数と単一化され、ル−チンは1を返してル−プを出ます。

-・Prologでバックトラックのために2番目の解を必要な場合、ル−チンはプログラムポインタ、portを直前の戻り値1にして、ル−チンを呼び出します。switchはcase1を選び、制御の流れは、実際にwhileル−プの中にあるラベルres1に移されます。whileル−プは実行を続け、カウンタを増やし、カウンタが最大値より小さいので、2回目の繰り返しを始めます。現在のカウンタの値は第2引数と単一化され、1が返されます。

-・Prologで3番目の解が必要な時には、上で述べたものと同じ手続きがとられます。注意:多くのC述語では、返り値は、ここでいう各DETACHとは同じになりません。また制御の流れは、常に同じラベルに到達するわけではありません。

-・Prologで4番目の解が必要な時には、switch文は制御の流れを再びwhileル−プの中のres1に移します。しかし今回は、カウンタが増やされた後カウンタの値が最大値を越えているので、whileル−プは実行を繰り返しません。その代わりに次のステ−トメントFAILが実行されたり、0が返されます。これはもうそれ以上他の解がなく、述語が失敗したことを表しています。

document: http://www.ifcomputer.co.jp/IFProlog/Manuals/v4.1/advanced_feature/c_interface/cpredbw/exampb/exp/print_en.html
published 2008/11/17 update 1995/10/12 (c) 1996-2006 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
Back> managed with ubiCMS