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.
この章では、デ−タベ−スに以下のような内容が含まれていることを仮定しています。(前章のユーザガイドでの例を使用しています。)
?- listing.
'White' reports_to 'Jones'.
'McDonald' reports_to 'Jones'.
'Newman' reports_to 'Smith'.
'Nixon' reports_to 'Smith'.
'Smith' reports_to 'New'.
'Jones' reports_to 'New'.
_G21 is_subordinate_to _G22 :- /*1*/
_G21 reports_to _G22.
_G21 is_subordinate_to _G22 :- /*2*/
_G21 reports_to _G23,
_G23 is_subordinate_to _G22.
yes
?- _
手続き"is_subordinate_to"をデバッグしてみましょう。debug/0述語を使用し、以下のようにタイプしてデバッガを起動させて下さい。
?- debug.
yes
debug ?- _
ここでデバッガに必要な節はすべてロ−ドされます。少し時間がかかりますが、次にデバッガを起動させた時には、必要な節がすべて読み込まれているのですぐに使うことができます。以下のような質問を入力して下さい。
debug ?- 'White' is_subordinate_to 'New'.
------
|IF/Prolog r_.5.1.0.txtebugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
------
|execute( 'White' is_subordinate_to 'New' ) :-
|CALL 'White' is_subordinate_to 'New'
|
------
|command: _
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
注意:カ−ソル"_"は、デバッガがデバッガのコマンド行でコマンドを待っていることを示しています。スクリ−ンは4つの論理的ウィンドウに分割されています。これはすぐにはわからないでしょうが、以下のようにデバッガを使うとすぐにわかります。
------
|debugger status line (デバッガーの現在行)
------
|debugger display area (デバッガーの表示エリア)
------
|debugger command line _ (デバッガーのコマンド行)
------
|user i/o area (ユーザ入出力)
------
1行目はデバッガの状態表示行です。
IF/Prolog debugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
デバッガを有効に利用するためには、Prologの「ボックスモデル」による解釈について理解しておく必要があります。このモデルでは、Prologの述語が「ボックス」として視覚化され、4つの「ポート」、CALL・EXIT・REDO・ FAILを通して制御が出たり入ったりします。ボックスモデルについては、W.F.ClocksinとC.S.Mellishの共著"Programming in Prolog"に詳しい説明がなされています。また、IF/PrologマニュアルのCインタフェースに関する章にも短い説明があります。
デバッガの現在行では、現在活性化されているポ−トが大文字で表示されています。また、現在のスパイポイントが活性化されているかどうか、プリントレベルモ−ド、デバッガーモードを表示しています。 デフォルト値は次のようになります。ポ−トは、CALL, FAIL, LASTで活性化されています(LASTは直前のサブゴ−ルのEXITを表示することを意味します)。
スパイポイントはデバッガの上級機能で、特に選ばれた述語とポートでの実行を干渉することができます。この機能については、次節で説明します。スパイポイントは、最初非活性化されています。これは、小文字の"spy"で示されています。
プリントレベルは、項が表示される入れ子構造の深さを示す番号です。最初は5に設定されています。
デバッガーモードについては、後ほど詳しく説明します。これは、実行に関するグローバルな表示がモニターされます。CREEPINGとは、デバッガがあらゆるステップでいったん停止することを意味しています。
デバッガの表示領域は、現在実行されている節を示します。ここではヘッド(満足するゴール)とサブゴールを示します。実行開始から現在位置まで、変数に対してどう値が与えられるかも同様に示されます。
------
|execute( 'White' is_subordinate_to 'New' ) :-
|CALL 'White' is_subordinate_to 'New'
|
------
表示領域のインジケ−タは以下の通りです。
execute 現在実行されているゴールです。この場合、'excecute'は、ユーザの質問を満たすために、Prologのトップレベルにより呼び出されました。
CALL 次に満たされるべきゴ−ルを示します
EXIT サブゴ−ルを満たすのに成功しました
REDO ゴ−ルが再び試行されていることを示します。(バックトラッキングの結果として)
FAIL このゴールが失敗したことを示します
# 最後の選択点を含むサブゴール、つまり、制御がバックトラッキングのところで改行される最後の選択点を含むサブゴールを示します。
第3番目の領域は以下のようにコマンドを待ち受けています(各コマンドについては後で解説します)。
------
|command : _
------
ユ−ザの入出力領域は、デバッガを使用する直前のインタプリタの状態を示しています。一般に、走らせるプログラムにより生成される入出力のスクリーンも、ここにあります。
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
デバッギングを続ける前に、デバッガのコマンドリストをご覧下さい。デバッガのコマンド行に、"h"と入力し改行して下さい(もうデバッガのコマンド行にいます)。
------
|IF/Prolog debugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
------
|'White' is_subordinate_to 'New' :-
|CALL 'White' reports_to 'New'
|
------
|command : h
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
------
|<RETURN> - continue - continue as indicated by subgoal
|L - enter LEAP mode
|C - enter CREEP mode
|S - enter SWEEP mode
|N - enter NO STOP mode
|h - prints this information
|f - back to FAIL port
|e - skip to EXIT port
|r - back to REDO port
|s - toggle SPY mode
|c - back to CALL port
|p - show PARENT box
|sg - show SUBGOAL box
|A - abort to top level loop
|B - new prolog loop
|+ - scroll forward
|- - scroll backward
|++ - scroll to bottom of debug screen
|-- - scroll to top of debug screen
|PC - toggle CALL port
|PR - toggle REDO port
|PE - toggle EXIT port
|PF - toggle FAIL port
|PL - toggle LAST port
|0-99 - set zoom level
|
|type <RETURN> to get back to debugger
------
デバッガは使用可能な述語をすべて表示しました。(あなたのターミナルのサイズに応じて、複数のスクリーンに分けて表示します。) デバッガに再び戻るには改行して下さい。
以下はデバッガのセッション間を変更することのできるモードです。
C CREEPING 各活性化ポートにて、サブゴ−ルの実行を表示します。
L LEAPING 現時点のレベルにおける呼び出しと実行されたゴールの結果を示し、サブゴ−ルの実行は"飛び越えて"しまいます。
S SWEEPING スパイポイントと節の終りで止まります。(次の章を見て下さい。)
N NOSTOP スパイポイントのみで止まります。
実行のステップを順々に見たい場合には、デバッガをCREEPINGモードで実行させて下さい。
重要事項:表示されているモ−ドでデバッギングを続けたい場合には、単に改行して下さい。
質問の実行をする次のステップに進むために、改行をして下さい。
------
|IF/Prolog debugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
------
|'White' is_subordinate_to 'New' :-
|CALL 'White' reports_to 'New'
|
------
|command : _
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
デバッガの表示領域を見て、実行を続けるために改行をして下さい。
手続き"is_subordinate_to"の最初の変数が値が与えられた後、IF/Prologは値が与えられたサブゴ−ル"reports_to"に一致する事実を探さなければなりません。サブゴ−ル"'White' reports_to 'New'"に一致する事実が存在しないので失敗となり、バックトラッキングが開始されます。
------
|IF/Prolog debugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
------
|'White' is_subordinate_to 'New' :-
|FAIL 'White' reports_to 'New'
|
------
|command : _
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
改行して下さい。
次に代わりの規則(規則/*2*/)が手続き"is_subordinate_to"のために使われますが、その変数にはすでに値が与えられています。"CALL"は、規則/*2*/の満たされなければならない最初のゴ−ルを示します。
------
|IF/Prolog debugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
------
|'White' is_subordinate_to 'New' :-
|CALL 'White' reports_to C3
| C3 is_subordinate_to 'New'
|
------
|command : _
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
実行を続けるために改行して下さい。一致する事実が見つかりました。
------
|IF/Prolog debugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
------
|'White' reports_to 'Jones' :-
|CALL true.
|
------
|command : _
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
改行して下さい。
サブゴ−ルを満たすことができます。
------
|IF/Prolog debugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
------
|'White' reports_to 'Jones' :-
|LAST true.
|
------
|command : _
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
実行を続けるために改行して下さい。コントロールは、report_toの親ゴールまで戻ります。
これで手続き"is_subordinate_to"に対する規則/*2*/の最初のサブゴ−ルが成功しました。規則/*2*/の2番目のサブゴ−ルにおいて"'Jones'"の値を与えられます。
CALLは、次に満たされるべき規則/*2*/の2番目のサブゴ−ルを示します。
------
|IF/Prolog debugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
------
|'White' is_subordinate_to 'New' :-
| 'White' reports_to 'Jones',
|CALL 'Jones' is_subordinate_to 'New'
|
------
|command : _
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
改行して下さい。
次にデバッガは、手続き"is_subordinate_to"に対する規則/*2*/の第2番目のサブゴ−ルを満たそうとします。
このサブゴ−ルは、"'Jones' reports_to 'New'"という事実に依存します。
------
|IF/Prolog debugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
------
|'Jones' is_subordinate_to 'New' :-
|CALL 'Jones' reports_to 'New'
|
------
|command : _
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
改行して下さい。
IF/Prologは、事実"'Jones' reports_to 'New'"が真であることを見つけました。
------
|IF/Prolog debugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
------
|'Jones' reports_to 'New' :-
|CALL true.
|
------
|command : _
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
改行して下さい。
サブゴ−ル"'Jones' reports_to 'New'"は真(成功)です。
------
|IF/Prolog debugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
------
|'Jones' reports_to 'New' :-
|LAST true.
|
------
|command : _
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
改行して下さい。
こうして手続き"is_subordinate_to"に対する規則/*2*/の第2番目のサブゴ−ルは、成功しました。
------
|IF/Prolog debugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
------
|'Jones' is_subordinate_to 'New' :-
|LAST 'Jones' reports_to 'New'
|
------
|command : _
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
改行して下さい。
------
|IF/Prolog debugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
------
|'White' is_subordinate_to 'New' :-
| 'White' reports_to 'Jones'
|LAST # 'Jones' is_subordinate_to 'New'
|
------
|command : _
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
#のマークは、今成功した第2のサブゴールに、選択点が残っていることを示しています。これは、is_subordinate_toの第2の呼び出しが第1節で成功し、第2の節にバックトラッキングの可能性が残っているからです。意図していない選択点をトラックすることはPrologプログラムの効率を高めるので、デバッガはこの目的で非常に力があると言えます。
実行を続けるために改行して下さい。
------
|IF/Prolog debugger_CALL_exit_redo_FAIL_LAST_spy_5_CREEPING
------
|execute( 'White' is_subordinate_to 'New' ) :-
|LAST # 'White' is_subordinate_to 'New'
|
------
|command : _
------
|?- debug.
|
|yes
|debug ?- 'White' is_subordinate_to 'New'.
------
デバッギングは終了しました。Mr.'White'が Mr.'New'の部下ですかという質問の答えは真でした。
改行して下さい。 インタプリタのデバッグモ−ド・プロンプト("debug ?-")が表示されます。次のPrologのゴ−ルの入力を待っています。
nodebugと入力して下さい。デバッガとウインドウ管理が終了します。
------
|debug ?- 'White' is_subordinate_to 'New'.
|
|yes
|debug ?- nodebug.
|
|yes
|?- _
------
もちろんCREEPINGよりも便利なコマンドがあります。レファレンスマニュアルのデバッガの項を参照して下さい。あなたのPrologプログラムでそれらを試してみて下さい。デバッガは、プログラムの実行中に起動できるということに注意して下さい。述語debug_goal(+Goal)を使えば、任意のサブゴ−ルについてデバッガを作動させ、Goalを実行することができます。
特定の述語をデバッギングをしないようにすることもできます。例えば、ある述語が適切に働くことを知っている場合には、こうします。レファレンスマニュアルのdebug_mode/4の説明を参照して下さい。
|