演習室での環境設定、TIPSなど


実行過程の追跡 (トレース)

次のように入力し、トレースモードにするとPrologの実行過程を 1ステップ単位で調べることができます。 実際にProlog内部で行われている処理を見ることができるのでプログラムの 動作を確認するのにとても役に立ちます。

実際に述語memberを用いて試してみましょう。 基本的なトレースの流れは次のようになります。

  csh% cat mem.pl
  member(X,[X|Tail]).
  member(X,[Head|Tail]) :- member(X,Tail).

  csh% prolog

  | ?- [mem].
  | ?- trace.                                   % トレースモードに移行
  
  |[trace] ?- member(b, [a,b]).                         % ゴールとなる述語を入力

     Call: (7) member(b, [a, b]) ?              % プログラムの内部的な実行過程が表示される
     Call: (8) member(b, [b]) ?                 % この`?'の後にコマンドを入力することができる
     Exit: (8) member(b, [b]) ?
     Exit: (7) member(b, [a, b]) ? 

  yes

  |[debug]  ?- nodebug.                          % トレースモードから通常のモードに戻る
何やら次のような情報が表示されました。では、それぞれ何を意味しているのか見てみましょう。
     Call: (7) member(b, [a, b]) ?
`Call'
PrologにはBoxモデルという、実行の流れを視覚的に考えるためのモデルがあります。 特に、理解しずらいバックトラック中の処理の流れについて理解するのに助けとなるでしょう。 ここで`Call'は、Boxモデルにおけるポートを表しています。 ポートは主にCall, Exit, Redo, Failの4つで構成され、その他にHead, Doneなどがあります。
各ポートについての詳細は以下のサイトを参照。
Boxモデルについて詳しくは次のサイトなどを参照。
`(7)'
トップレベルのゴールから見た現在の呼び出し深さ。つまり、サブゴールが 呼び出されると1プラスされ、終了すると1マイナスされます。
`member(b, [a,b])'
現在の呼び出しを表しています。

トレース中に使用可能なコマンド

トレースモードの基本的なコマンドとして次のものがあります。

creep (RET or c + RET)
1ステップずつ実行する。
  |[trace]  ?- member(b, [a,b]).
     Call: (7) member(b, [a, b]) ? creep
     Call: (8) member(b, [b]) ? creep
     Exit: (8) member(b, [b]) ? creep
     Exit: (7) member(b, [a, b]) ? creep

  Yes
skip (s + RET)
現在実行中の呼び出しのサブゴールに関する情報の表示をスキップする。
  |[trace]  ?- member(X, [a,b]).
     Call: (7) member(_G318, [a, b]) ? skip
     Exit: (7) member(a, [a, b]) ? skip

  X = a ;
     Exit: (7) member(b, [a, b]) ? skip

  X = b ;

  No
nonstop (n + RET)
以降の処理においてトレースを行わない。
help (h + RET)
コマンドのヘルプを表示する。
abort (a + RET)
トレースを途中で中止し、プロンプトに戻る。

その他、今後追加予定。

実行結果のログの取りかた

実行結果が長い場合など、端末からのコピー&ペーストが大変なときは、 次のような方法を参考にしてみて下さい。

演習で使うProlog処理系

演習では、SWI-Prolog Version 5.6.12 を用います.

Prolog関連のファイルは,

  /usr/local/lib/pl-5.6.12
にあります.またProlog本体等の実行ファイルは,
  /usr/local/bin/
にあります.

muleでは標準の設定で prologモードを利用することができると思います.(M-x run-prolog)
特に設定は必要ありませんが,万一利用できない場合は尋ねて下さい.

Prologの起動については,指導書1〜8ページを参照して下さい.

本演習のレポート回収のシステムは,ex世木研究室の 中村智典くんが作ってくれました.