RunProlog, ResetQueries
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.

関数名 RunProlog ResetQueries 概要 #include "cpro.h"

RunProlog(DESCR) QueryDescr *DESCR;

ResetQueries()

RunProlog(DESCR)は、DESCRに記述されている質問を実行します。DESCRを指定してRunProlog()を呼び出す際には、必ず前もって同一の記述子を指定してParseProlog()を呼び出さなければりません。

RunProlog()は、質問が成功し、ひとつの解が見つかった場合には1を返します。同じDESCRを使って再度RunProlog()を呼び出し、バックトラックすることによってさらに他の解を得ることができます。しかし、これは違う記述子によってParseProlog(),RunProlog()を呼び出す前にしなければなりません。RunProlog()は、もうそれ以上他の解が見つからない場合には0を返します。

実行中にエラ−が生じた場合、RunProlog()は-2を返し、エラ−に関する情報はDESCRのret_code,ret_msgフィ−ルドに示されます。

述語end/0,bye/0,abort/0,exit/1は-3を返し、IF/Prologのアプリケ−ションからの出口を示します。

2つの質問の実行をインタ−リ−ブすることは不可能です。現在のバ−ジョンでは、1度に1つの質問しか実行できません。新しい質問記述子でRunProlog()を呼び出すと、新しい質問が実行される前に、スタックから前の質問に対する他の解が削除されます。

RunProlog(DESCR)は、以下の場合に質問の実行を再開します。

-前回のRunProlog()の呼び出しに対して、もうそれ以上他の解がないことを示す0が返された場合

-前回のRunProlog()の呼び出しが例外を生じた場合

-違う質問記述子によるRunProlog()の呼び出しや、ParseProlog()の呼び出しが質問の実行中にすでに行われていた場合

-IF/Prologのスタックをクリアする、マクロ関数ResetQueries()が呼び出された場合

実行後、QueryDescr構造体の各フィ−ルドは以下のようになります。

フィ−ルド 成功 失敗/例外/出口

qu_id      不変化      不変化 qu_cursor          port$$fail ret_code      1        0,-2,-3 cpu_time      更新された    更新された parse_pos      不変化      不変化 exit_code      0        0またはユ−ザの設定 ret_msg      yes         説明的メッセ−ジ no_vars      不変化      不変化 0 <= i < no_vars var[i].type      Q TERMまたはユ−ザの設定 不変化 var[i].name      不変化      不変化 ユニオンのメンバは以下のいずれかです *var[i].loc.term  TERMの値       未定義 *var[i].loc.ivalue Cのlong int値        未定義 *var[i].loc.dvalue Cの倍精度実数   未定義 *var[i].loc.string Cの文字列ポインタ 未定義

質問中の各変数に対して、そのTERMの値はDesc->var.typeで指定された型に変更されます。それは、Q_TERM, Q_INTEGER, Q_DOUBLE, Q_STRINGのいずれかで、その結果は対応する場所に割り当てられます。


Darueber read on...