2.デバッグ機能(画面)の説明~トレース履歴の閲覧
AZ-Prologインタプリタではデバッグ機能(トレース/スパイ)を使って動きを確認できますが、AZ-Prolog Eclipse Plug-in(AZDT)でも同じくデバッグ機能を使って動きを確認できます。
ただし、AZ-Prologインタプリタと違いグラフィカルに表示されるため、より理解しやすくなっております。AZDTではこれをGUIトレースモードと呼びます。
本章では、1章で作成しましたプログラム「mortal.pl」を用い、AZ-Prolog Eclipse Plug-in(AZDT)のGUIトレース機能を使って動きの説明をします。
2-1.デバッグ機能(画面)の説明
プログラムのトレースに入る前に、まずはデバッグ機能の説明をします。
下図のデバッグモードにした時の画面です。
各部の名称、および役割は以下の通りです。
①コールスタックビュー
コールスタックに積まれているゴールを全て表示します。
スタックに積まれているゴールについては、ユーザーズマニュアル 6-5-2 コマンド解説のDコマンドを参照してください。
現在ゴールの直上がバックトラック先ですので、強力な確認手段となります。
また、カットオペレータにより省かれるゴールの確認が容易になります。
②エディターエリア
プログラムを表示します。
プログラム作成、修正、スパイポイントの設定がおこなえます。
エディタ内のトークンは色付きで表示されています。
・組込述語:ブラウン*注1 アリティは考慮していない。(例)put([],L,L) <== put/1,put/2が組込
・変数:シアン
・ストリング:レッド (例)q(_):-e_register(0,N,N), puts(“Total = “),write(N).
・クオーテッドアトム:オレンジ(例) ‘No. ‘
・宣言:パープル(例) :- public …
・コメント:グリーン(例) /* …. */
*注1 プロジェクトで作成したライブラリ述語を、組込述語と同様に色付けすることができます。
組込述語のリストが書かれているファイル builtin_list.txt に作成したライブラリ述語を追加します。
builtin_list.txt は以下に格納されています。
AZDTのPreferenceの中のホームディレクトリを<AZ_HOME>とすると
【Windowsの場合】
<AZ_HOME>\doc\builtin_list.txt
(デフォルトなら、C:\Program Files\AZ-PrologXXX\doc\builtin_list.txt)
【Windows以外の場合】
<AZ_HOME>/share/doc/azprolog/builtin_list.txt
(デフォルトなら、/usr/local/share/doc/azprolog/builtin_list.txt
AZDT起動時にbuiltin_list.txtが読み込まれ色付がされます
【注意】 AZ-Prolog9.63以前のバージョンでbuiltin_list.txtが存在しない場合には、今までと同様にAZDTのライブラリの中で登録してあるものをデータとして使用します。
※検索、置換などはEclipseの標準機能を利用できます。[Ctrl+F]
③変数ビュー
トレース時に値束縛または制約された変数を表示します。
制約変数では制約内容の推移が観察できます。
虚変数は区別するため、「 _.1 」のように節内出現順番号が付与された変数名表記となります。
④アウトラインビュー
エディタで開かれているファイルの構造の概要を表示します。
プログラムにエラーがある場合、エラー行情報を表示します。
⑤AZ-Prologコンソールビュー
AZ-Prologコンソール(インタプリタ)を表示します。
⑥デバッグツールバー
各種デバッグ機能が利用できます。詳細は下図で説明いたします。
下図はデバッグツールバーの拡大図です。(実際にはコンテクストに応じてボタンの有効/無効が変わるので、全てが同時にこの有効状態になることはありません。)
注)⑧~⑪のボタンの機能は、ファンクションキーにも割り付けられていますが、コンソールビューがアクティブでないと動作しません。
各ツールバーボタンの機能について解説します。
⑦入力ゴール履歴ボタン
一度入力したゴールの履歴が、下図のように表示され選択する事によって簡易入力が可能になります。
⑧ステップイン(デバッガのcreepに相当)【ファンクションキー F5】
今から呼び出す述語の定義に入り、ワンステップずつゴールを実行します。
⑨ステップオーバー(デバッガのQコマンドに相当)【ファンクションキー F6】
今から呼び出す述語を実行しますが、ステップインと異なり定義のトレースは行いません。
⑩ステップリターン(デバッガのOコマンドに相当)【ファンクションキー F7】
現在の述語を呼び出した親述語に至るまでトレースを表示しません。
⑪連続実行(デバッガのLコマンドに相当)【ファンクションキー F8】
スパイがかかっているゴールに関する処理を行うまでトレースの表示を打ち切ります。
⑫中断(デバッガのAコマンドに相当)
プログラムの実行を強制的に打ち切り、トップレベルに戻ります。
⑬GUIトレースモードへ
⑭CUIモードへ
クリックするとCUIモードに切り替わります。実行中のトレースは中断します。
コンソールのバックグラウンド色が白になりGUIトレースモードと区別できます。
⑮ヒープクリア
現在のヒーププログラム領域をクリアします。同時にプログラム構造データ(後述)もクリアします。
確認ダイアログが表示されますので、誤って押したときは取り消してください。
⑯AZ-Prolog再起動
AZ-Prologインタプリタ(prolog_c)を再起動します。
確認ダイアログが表示されますので、誤って押したときは取り消してください。
2-2.プログラムのトレース
では、「1-2.ファイルの作成」で作成しました「mortal.pl」をトレースしてプログラムの動きを確認してみましょう。
なお前項で各ツールバーボタンの機能を説明いたしましたが、本項ではステップインでトレースした場合の解説をします。
他の機能につきましては、次節以降で説明します。
トレースしたいプログラムファイル(本章では「mortal.pl」)をコンサルト/リコンサルトします。
注)AZ-Prologコンソールで?-[-‘mortal.pl’].を実行してもプログラムはリコンサルトされますが、エディタエリアに現在位置を表示するために必要なプログラム構造データは作成されません。
前項で説明しました「デバッグツールバー」の⑬「GUI Trace Mode」のボタンをクリックするとデバッグモード画面に切り替わります。
AZ-Prologコンソール画面の「||」の後に、実行コマンド(質問)を入力します。
ここでは「?-mortal(X).」と入力してトレースを実行します。
実行(enter押下)すると下図のような画面になります。
この画面の状態は、『「mortal(X)」が実行(Try)され、「mortal(X)」と単一化可能な頭部を持つ節がみつかりました【Match】』 を表します。
ステップ実行を進める毎に、現在実行中の位置にカーソルが移動します。
カーソルの色は各局面に応じて次の色分けがなされます。
Try | |
Match | |
Succ | |
Fail | |
Pop | |
Retry |
以後、ステップイン・ボタンをクリックしてトレースを進めます。
その節の本体のゴール「human(X)」を実行します【Try】
「human(X)」と単一化可能な頭部を持つ節「human(socrates)」が見つかりました【Match】。
「human(X)」の実行に成功したので、そのゴール「human(socrates)」が表示されます。
よって、「変数(X)」に「値(socrates)」が代入された事となります【Succ】。
※変数ビューの変数名と値に「X」と「socrates」が表示されます。
節「human(socrates)」は本体の最後のゴールのため、節の頭部「mortal(socrates)」も成功となります。【Succ】
1つの解が求まったので、AZ-Prologコンソール画面に「X=socrates」と出力されました。
また継続確認のポップアップ画面が表示されますので、終了する場合は「終了」ボタンを続ける場合は「別解へ」ボタンをクリックします。
ここでは「別解へ」ボタンをクリックします
「human(socrates)」で成功しましたがユーザーが別解を要求したので、内部状態を元に戻します(バックトラック)【Pop】。
では、引き続きワンステップ毎に解説いたします。
「human(X)」と単一化可能な頭部を持つ節「human(aristoteles)」が見つかりました【Match】。
「human(X)」の別解が成功したので、そのゴール「human(aristoteles)」が表示されます。
よって、「変数(X)」に「値(aristoteles)」が代入された事となります【Succ】。
※変数ビューの変数名と値に「X」と「aristoteles」が表示されます。
節「human(socrates)」は本体の最後のゴールのため、節の頭部「mortal(aristoteles)」も成功となります。【Succ】
別解が求まったので、AZ-Prologコンソール画面に「X=aristoteles」と出力されました。
また先程同様、継続確認のポップアップ画面が表示されます。
ここではもう一度「別解へ」ボタンをクリックします。
別解がないので、AZ-Prologコンソール内に下図のように表示され実行が終了します。
2-3.スパイポイントのかけ方、はずし方
プログラムを最初からトレースせず、任意の位置から開始させるには、スパイポイントをかけてからゴールを入力し、連続実行ボタンをクリックします。
1行にゴールが1つしかない場合は、設定・解除ダイアログは表示されません。設定・解除の結果はスパイポイントビューに反映されます。
①スパイをかけたいゴールがある行番号をマウス左ダブルクリック。
②”設定・解除ダイアログ”が表示されます。
③スパイをかけるゴールをチェック。スパイを解除するときはチェックを外します。
④OKをクリックします。
スパイのかかっているゴールのある行にはマークが付き、ゴールには水色背景が付きます。
2-4.プログラムのエラーの検出
シンタックスエラーなどのあるプログラムのエラー箇所はリコンサルト時に容易に検出できます。
アウトラインビューに表示されるエラー行番号はエラーを検知した位置 となりますので、その行または、その行の手前にエラー要因があります。
2-5.インタプリタ領域サイズ・トレース情報量の変更
ウィンドウ(W)-設定(P)-AZDTで、インタプリタ起動オプション設定、トレース実行時の表示オプション設定が行えます。
2-6.トレース履歴の閲覧
トレース中に過去の履歴を閲覧する事ができます(トレース履歴参照モード)。
このモードではトレース実行関連のボタンは無効になります。トレース実行を継続するためには、変数履歴ビューを閉じてください。