・目次
・付録: viewPPに関係する用語集
← この記号で示される段落で,現段階でのバグその他の原因による
不具合についての説明をしています.
“viewPP”は,並列論理型言語GHCの実行を可視化し, 実行の過程をわかりやすく表現することができる ビジュアルプログラミングシステムである.
GHC には,「実行順序がプログラム記述順序に依存しない」 「並列性を素直に記述できる」などの特徴があるが, 「論理変数が増えると,それらに適切な名前を付けづらくなる」 「実際に並列に動作している様子は目に見えにくい」といった 短所もある.これらの短所は,ビジュアル化によって解決できる ものである.
実際に“viewPP”では,
現在の実装では,述語の定義自体は,GHCのサブセットのよう な文法を持ったプログラムファイルを viewPP 上でロード して,その述語を実行フィールド (後述)上に配置し,それに 入力データを接続して実行させることによって,プログラムを 動作させる.
viewPP は,以下の3つの実行モジュールから構成される.
これらのうち,viewpp および klitcld の2つは実行可能 なバイナリであるので,コンパイルによって生成する必要 がある.これらの生成法およびプログラムの実際の実行方 法については,次章で説明する.
viewPP を利用するには,利用しようとする環境に以下の ツール類がインストールされている必要がある.
まず,展開されたファイル群に以下のファイルが含まれて いることを確認する.
参考までに,先に述べた 3 つの実行モジュールが,どの ファイルから生成されるかを以下に記しておく.
コンパイルの前に,Makefile の修正を行なう必要がある. Makefile の先頭付近に書かれた変数の変更が主である. 変更の可能性がある変数名とその内容は以下の通りである.
これらの変数を各自の環境に応じて適切に設定した上で,シェル のプロンプトから
% make
と入力すれば,2つの実行バイナリ klitcld と viewpp が生成さ れる(GCCを使う場合途中でWarningが出るが気にしなくてよい).
viewPP の動作にあたって,以下の10個のファイルが実行時のカレント ディレクトリに置かれている必要がある.
この他,実際に使うためには,viewPP 用のプログラムが書かれた 入力ファイルが必要である.これの記述方法については後述する.
viewPP を動かすには,まず klitcld を常駐させる.シェルプロンプト から以下のように入力して,klitcld をバックグラウンド実行させる.
% ./klitcld &
この後,viewPP 本体を実行させる.
% ./viewpp
少し待つと,viewPP の実行画面が表示されるはずである. 実際の viewPP の操作については,次章で説明する.
viewPPを実行すると,上のような画面が現れる.
viewPPの画面は,大きく3つの部分に分けることができる.
以下で,それぞれについて説明する.
ここには5つのアイコンがあり,左から「ファイルロードアイコン」 「再配置アイコン」「プログラム実行アイコン」「フィールド消去アイコン」 「viewPP終了アイコン」である.
これらのうち,「再配置アイコン」「プログラム実行アイコン」 「フィールド消去アイコン」は,マウスでクリックすることにより 即座にそれぞれの動作をする.
残りの「ファイルロードアイコン」「viewPP終了アイコン」については, 以下で説明する.
ファイルロードアイコンをクリックすると,以下の図のような
ファイル選択ウィンドゥが開く.
ウィンドゥの一番上にはカレントディレクトリ名が表示されており,
その下に,カレントディレクトリにあるサブディレクトリ名と
viewPP入力ファイル名(拡張子が“.vpp”であるもの)が表示されている.
このとき,サブディレクトリ名が“(( ))”で囲まれて表示される
ことにより,ファイル名とは区別される.
これらの名前をマウスの左ボタンでクリックして選択し,ウィンドゥ下部にある
“Load”ボタンを押す,あるいは,名前をマウスの左ボタンでダブルクリック
することによりファイルのロード,あるいはディレクトリの移動ができる.
ファイルのロードが終了すると,ファイル選択ウィンドゥは閉じる.
“Cancel”ボタンを押せば,ファイルをロードせずに ファイル選択ウィンドゥを閉じることができる.
klitclとviewPPの通信の不具合により,まれにロードがうまくいか
ないことがあります.viewPPを起動した(仮想)端末上にロード中の
ファイル名や内部的に使われる述語の番号が表示されていきますが,
この述語番号(カッコで括られて表示されています)が連番でない場合
にはロードが失敗しています.
viewPP終了アイコンをクリックすると,以下の図のような
終了ダイアログが開く.
“Yes”をクリックすれば viewPP は終了する.“No”を クリックすれば,終了ダイアログが閉じて,viewPPの操作を 続けることができる.
viewPPの実行終了後に,klitcld のプロセスがシステムに 残っていないかを psコマンドや jobsコマンドで確認して, もしプロセスが残っていた場合には確実に消去しておくこと.
ユーザは,このフィールド上に述語やデータ構造を配置 することでプログラムを作る.
viewPPでは,プログラムは「節」と「辺」からなる グラフ構造として表現される.viewPP で使用できる プログラム要素のうち, アトム・ CONS・ 述語は「節」に 対応し, 論理変数 およびCONSとアトムの関係付けは「辺」に 対応する.以下で,「辺」および「節」の配置の仕方について 説明する.
実行フィールド上の,まだ何も配置されていない部分で マウスの左ボタンをクリックすると,メニューが現われるので, そこで「述語,アトム,CONS のうちのどれを置くか」の選択を する.
メニューから“Predicate”を選択すると,その時点で
登録されている述語名が並んだメニューが現われるので,その
中から配置したい述語を選択する.
選択すると,その場所に述語アイコンが置かれる.
メニューから“Cons”を選択すると,3つの円が組みあわ
された形状の CONSアイコン が置かれる.
左側の白い円が Car を表わし,右側の白い円が Cdr を
表わす.
メニューから“Atom”を選択すると,水色の円の
中にアトムの名前が書かれた Atomアイコン が置かれ,
そのアトムの名前を決定するためのダイアログが現われる.
このダイアログ内でアトムの名称を入力してリターンキーを
押すとアトムの名称が確定する.
一旦確定したアトムの名称を変更したい場合は,そのアトムを マウスの右ボタンでクリックする.アトムの名称を編集するための ダイアログが現われるので,適宜編集する.
辺は,接続される対象 (常に2つである) を順にマウスで
クリックすることで配置される.
接続対象となるのは,以下のものである.
辺の起点となる接続対象をマウスの左ボタンで クリックすると,それが 黒い四角形で囲まれ,選択されたことを示す.この状態から 辺の終点となる接続対象をクリックすることで,辺が配置さ れる (実際は無向グラフなので起点・終点の区別はない).
一度選択されて黒い四角形で囲まれたアイコンをもう一度 マウス左ボタンでクリックすると,選択が取り消されて,黒い 四角形は消える.
節を移動させるには,移動させたい節をマウスの 中ボタンでドラッグする.
節を削除するには,削除したい節をマウスでポイントした
状態でキーボードのDeleteキーを押す.
削除された節に継がっている辺もこのとき一緒に削除される.
現在の実装では,辺を削除することはできません.辺の上にマウス
カーソルがある状態で Deleteキーを押すとエラーとなります.
CONSの移動について,CarおよびCdrタブをドラッグしての移動は
できません.
viewPP実行中の様々な情報が表示される.この部分をユーザが 明示的に操作することはない.
viewPP に入力するためのプログラムファイルは,GHC の サブセットのような文法を持ったテキストファイルであり, “.vpp”という拡張子を持つ (言うまでもなく,ViewPP の略である) .
通常のGHCと大きく異なるのは以下の点である.
例えばこれらの制限の下で,リストの連結を行なう append と いう述語を記述してみると,以下のようになる.
append(1,2,:,3) :- 1=[]|3=2. append(1,2,:,3) :- 1=[4|5]|append(5,2,6),3=[4|6].
viewPP は,実際にこのように書かれたプログラムを正常に 受け付ける.
現在の実装では,ガード部に書ける述語は1つだけです.
viewPP には,ガード部で使うために以下の述語が 用意されている.
これらはあくまでガード述語であるため, ユーザが実行フィールドに直にこれらを配置することは できない.
引数が2つあるが,第1引数が入力で第2引数が出力であり, 出力には入力と同じものが返る.これは,現在の実装では
foo(1) :- atomic(1) | foo(1).
のような記述ができないせいである.このよう場合には
foo(1) :- atomic(1,2) | foo(2).
と書くことによって目的を達成できる.
この章では,viewPP の使い方の例を示す.
アーカイブの展開からコンパイルまでが終了している もとのして,カレントディレクトリ以下に次のファイルが あることを確認してほしい.
すべて揃っていたら,viewPP を起動してみる.シェルプロンプトから,
% ./klitcld & % ./viewpp
と順に入力すると,viewPPの画面が現われる.
この時点では,特定の動作をする述語がまったく定義されていない. よって,外部ファイルから述語を読みこむ必要がある.そのために,まず ファイルロードアイコンをクリックし,ファイル選択ウィンドゥ を表示させる.
マウスで ((sample)) をマウスの左ボタンでダブル
クリックするとカレントディレクトリが移動し,sampleディレ
クトリ内にあるファイルを選択できる状態になる.ここでは,
append.vppをダブルクリックしてロードする.
この操作によって,append という述語が登録され,利用可能となる.
次に,appendプログラムとそれに与える引数を実行フィールドに 配置してみる.
実行フィールド内の適当な所(中心付近が良いだろう)で
マウスの左ボタンを押し,メニューを表示させて,その中から
Predicate を選ぶ.このメニューはカスケードメニューに
なっているので,さらにそこからどの述語を置くかを選択する.
選択肢には result/1 と append/3 の2つがある
はずなので,ここでは append/3 の方を選択する.
入力引数に必要なリストと,出力を保持するための特殊な述語で ある result を配置しよう.
viewPPには,あるプログラムを実行させた結果として 得られるデータを保持するための特別な述語である result/1 が 用意されている.これを,先に append を配置したのと同様な方法で 配置する.位置は,append よりも下が良い.これは,viewPPの述語 アイコンでは入力タブがアイコン上部に,出力タブがアイコン下部に 配置されていることによる.これによって,「入力→出力」が 「上→下」という方向の自然な流れにマッピングされることになる ということによる.
次に,入力引数を配置しよう. ここでは,第1引数には [a,b],第2引数には [c] を入れるようにする.
これらを作るには,CONSアイコンが3つとAtomが5つ必要である (リスト終端の [] を考慮すること).まず,先に配置した append/3 の上部の適当な位置に CONS を2つ置く.実行フィールド 内の何も配置されていない部分でマウスの左ボタンを押し,出てきた メニューから Cons を選択すればよい.
アトムを配置するには,実行フィールド内でマウスの左ボタンを 押すことによって出るメニューから Atom を選択する. すると,その位置にアトムが配置され,アトムの内容を変更する ためのダイアログが出る.デフォルトは [] になっている ので,適宜変更する.
一旦配置されたアトムの内容は,そのアトムの上でマウスの右ボタン を押すことによってダイアログが現われるので,そこで変更する.
すべて揃ったら,各アイコンをマウスの中ボタンドラッグによって 適当な位置に移動させる.以下の図のような感じになるだろう.
次に,これらのアイコンの間を線で継いでいく.
線によるアイコン間の接続は,始点と終点を順にマウスの左ボタンで
クリックすることによって行う.
片方をクリックすると,そのアイコンが黒い四角形で囲まれ,選択され
ていることがわかる.その状態でもう片方をクリックすると線が引かれる.
これを繰り返して,以下の図のように結線する.
append の左側の入力タブに接続されている部分が [a,b] というリストを示しており,右側に接続されている部分が [c] というリストを示している.
いよいよ,プログラムを実行させる.各アイコンが正しく接続され ていることを確認したら,ウィンドゥの上の方にある プログラム実行アイコンを押すと実行が開始される.
しばらく画面内をアイコンが動きまわったあと,以下のような 状態になってプログラムの実行が停止する.
Result に接続されている構造は,[a,b,c] というリスト を示しており,これが [a,b] と [c] を append した結果となっている.
結果に満足したら,右上のviewPP終了アイコンを押して viewPPを終了させる.
終了後,念のためにバックグラウンドで実行させていた klitcld が 終了していることを
% jobs
によって確認し,プロセスが残っていたら kill コマンドに よって確実に消去しておくこと.
Copyright (C) 1997 Jun Nagumo