viewPP ユーザーズマニュアル

for viewPP version1.00

・目次

・付録: viewPPに関係する用語集


[BUG] ← この記号で示される段落で,現段階でのバグその他の原因による 不具合についての説明をしています.


1.はじめに

“viewPP”は,並列論理型言語GHCの実行を可視化し, 実行の過程をわかりやすく表現することができる ビジュアルプログラミングシステムである.

GHC には,「実行順序がプログラム記述順序に依存しない」 「並列性を素直に記述できる」などの特徴があるが, 「論理変数が増えると,それらに適切な名前を付けづらくなる」 「実際に並列に動作している様子は目に見えにくい」といった 短所もある.これらの短所は,ビジュアル化によって解決できる ものである.

実際に“viewPP”では,

によって,これらの短所を克服している.

現在の実装では,述語の定義自体は,GHCのサブセットのよう な文法を持ったプログラムファイルを viewPP 上でロード して,その述語を実行フィールド (後述)上に配置し,それに 入力データを接続して実行させることによって,プログラムを 動作させる.


2.本ソフトウェアの構成

viewPP は,以下の3つの実行モジュールから構成される.

viewpp.tcl
GUI およびガードユニフィケーション実行部であり, Tcl/Tk で記述されている.
viewpp
viewPP 本体であり,ファイルロード および,入力 ファイルの構文解析をするルーチンが含まれる. klic で記述されている.実行ファイルは klitcl.kl1 と共にコンパイルされる.つまり,viewpp 本体は viewPP処理部と klitcl の2つの部分から成っている.
klitcld
Tcl/Tk と klic のインタフェースをとるプログラム klitclのコアとなるプログラムであり,Tcl/Tk インタープリタを保持し,klic プログラムからの 要請によって(Tkを通じて)画面描画などを行う. C で記述されている.
(システムダイアグラム)

これらのうち,viewpp および klitcld の2つは実行可能 なバイナリであるので,コンパイルによって生成する必要 がある.これらの生成法およびプログラムの実際の実行方 法については,次章で説明する.


3.インストールおよび実行

viewPP を利用するには,利用しようとする環境に以下の ツール類がインストールされている必要がある.

ただし,以下のことに注意されたい.
  1. バージョン番号については,作者が動作試験を行った 環境のものであり,これよりも古い/新しいものでも 動作する可能性は大きい.ただし,「Tcl/Tkのバージョ ンが古い(特に,Tk が 3.6以前である)」場合は,動か ない可能性が大きいと思われる.
  2. 作者が動作試験で使った OS は SunOS 5.4/5.5.1 である. 他のOSであっても,上記の環境が用意されていれば 動作する可能性は大きいと思われる.
  3. klicについては,コンパイル時に「非同期I/O機能」を 有効にしておく必要がある(Configure時の "Does your system support I/O ready signals?" に yes と答えて いること).
  4. klicが動く環境であれば ANSI Cコンパイラ(大抵は GCC)も 入っているはずである.viewPP を動作させるには ANSI C コンパイラ が必要である.

まず,展開されたファイル群に以下のファイルが含まれて いることを確認する.

参考までに,先に述べた 3 つの実行モジュールが,どの ファイルから生成されるかを以下に記しておく.

viewpp.tcl
これは Tcl/Tk のプログラムであるので,klitcld によって 保持されているインタープリタからそのまま実行される. ただし,内部で viewpp_fileload.tcl viewpp_gardpred.tcl の2つのプログラムを読み込んでいる.
klitcld
klitcld.c および,各自の環境にインストールされている Tcl/Tk ライブラリ(libtcl.aおよびlibtk.a)から生成される.
viewpp
viewpp.kl1 , list.kl1 , klitcl.kl1 の3本のプログラム を klic 処理系でコンパイルすることによって生成される.

コンパイル

コンパイルの前に,Makefile の修正を行なう必要がある. Makefile の先頭付近に書かれた変数の変更が主である. 変更の可能性がある変数名とその内容は以下の通りである.

CC
使用するCコンパイラ
XINCLUDE
X Window 関係のインクルードファイルの位置
XLIB
X Window 関係のライブラリファイルの位置
XRLIB
(同上)
TCLTKINCLUDE
Tcl/Tk 関係のインクルードファイルの位置
TCLTKLIB
Tcl/Tk 関係のライブラリファイルの位置

これらの変数を各自の環境に応じて適切に設定した上で,シェル のプロンプトから

  % make

と入力すれば,2つの実行バイナリ klitcld と viewpp が生成さ れる(GCCを使う場合途中でWarningが出るが気にしなくてよい).

viewPP を動作させる

viewPP の動作にあたって,以下の10個のファイルが実行時のカレント ディレクトリに置かれている必要がある.

この他,実際に使うためには,viewPP 用のプログラムが書かれた 入力ファイルが必要である.これの記述方法については後述する.

viewPP を動かすには,まず klitcld を常駐させる.シェルプロンプト から以下のように入力して,klitcld をバックグラウンド実行させる.

  % ./klitcld &

この後,viewPP 本体を実行させる.

  % ./viewpp

少し待つと,viewPP の実行画面が表示されるはずである. 実際の viewPP の操作については,次章で説明する.


4.viewPP の操作

(viewPP実行画面の図)

viewPPを実行すると,上のような画面が現れる.

viewPPの画面は,大きく3つの部分に分けることができる.

以下で,それぞれについて説明する.

アイコンバー

ここには5つのアイコンがあり,左から「ファイルロードアイコン」 「再配置アイコン」「プログラム実行アイコン」「フィールド消去アイコン」 「viewPP終了アイコン」である.

ファイルロードアイコン
外部プログラムファイルをロードして,viewPP上で使えるようにする
再配置アイコン
実行フィールド上のプログラムを再配置して見やすくする
プログラム実行アイコン
実行フィールド上に作られたプログラムを実行する
フィールド消去アイコン
実行フィールド上のプログラムをすべて消去する
viewPP終了アイコン
viewPPの実行を終了する

これらのうち,「再配置アイコン」「プログラム実行アイコン」 「フィールド消去アイコン」は,マウスでクリックすることにより 即座にそれぞれの動作をする.

残りの「ファイルロードアイコン」「viewPP終了アイコン」については, 以下で説明する.

ファイルロードアイコン

ファイルロードアイコンをクリックすると,以下の図のような ファイル選択ウィンドゥが開く. (ファイル選択ウィンドゥの図)

ウィンドゥの一番上にはカレントディレクトリ名が表示されており, その下に,カレントディレクトリにあるサブディレクトリ名と viewPP入力ファイル名(拡張子が“.vpp”であるもの)が表示されている.
このとき,サブディレクトリ名が“(( ))”で囲まれて表示される ことにより,ファイル名とは区別される.

これらの名前をマウスの左ボタンでクリックして選択し,ウィンドゥ下部にある “Load”ボタンを押す,あるいは,名前をマウスの左ボタンでダブルクリック することによりファイルのロード,あるいはディレクトリの移動ができる.
ファイルのロードが終了すると,ファイル選択ウィンドゥは閉じる.

“Cancel”ボタンを押せば,ファイルをロードせずに ファイル選択ウィンドゥを閉じることができる.

[BUG] klitclとviewPPの通信の不具合により,まれにロードがうまくいか ないことがあります.viewPPを起動した(仮想)端末上にロード中の ファイル名や内部的に使われる述語の番号が表示されていきますが, この述語番号(カッコで括られて表示されています)が連番でない場合 にはロードが失敗しています.

viewPP終了アイコン

viewPP終了アイコンをクリックすると,以下の図のような 終了ダイアログが開く. (終了ダイアログの図)

“Yes”をクリックすれば viewPP は終了する.“No”を クリックすれば,終了ダイアログが閉じて,viewPPの操作を 続けることができる.

viewPPの実行終了後に,klitcld のプロセスがシステムに 残っていないかを psコマンドや jobsコマンドで確認して, もしプロセスが残っていた場合には確実に消去しておくこと.

実行フィールド

ユーザは,このフィールド上に述語やデータ構造を配置 することでプログラムを作る.

viewPPでは,プログラムは「節」と「辺」からなる グラフ構造として表現される.viewPP で使用できる プログラム要素のうち, アトムCONS述語は「節」に 対応し, 論理変数 およびCONSとアトムの関係付けは「辺」に 対応する.以下で,「辺」および「節」の配置の仕方について 説明する.

(アトム・Cons・述語の図)

節 (述語・アトム・CONS) の配置

実行フィールド上の,まだ何も配置されていない部分で マウスの左ボタンをクリックすると,メニューが現われるので, そこで「述語,アトム,CONS のうちのどれを置くか」の選択を する.

述語(Predicate)の配置

メニューから“Predicate”を選択すると,その時点で 登録されている述語名が並んだメニューが現われるので,その 中から配置したい述語を選択する.
選択すると,その場所に述語アイコンが置かれる.

CONSの配置

メニューから“Cons”を選択すると,3つの円が組みあわ された形状の CONSアイコン が置かれる.
左側の白い円が Car を表わし,右側の白い円が Cdr を 表わす.

アトムの配置

メニューから“Atom”を選択すると,水色の円の 中にアトムの名前が書かれた Atomアイコン が置かれ, そのアトムの名前を決定するためのダイアログが現われる.
このダイアログ内でアトムの名称を入力してリターンキーを 押すとアトムの名称が確定する.

一旦確定したアトムの名称を変更したい場合は,そのアトムを マウスの右ボタンでクリックする.アトムの名称を編集するための ダイアログが現われるので,適宜編集する.

辺 (論理変数) の配置

辺は,接続される対象 (常に2つである) を順にマウスで クリックすることで配置される.
接続対象となるのは,以下のものである.

辺の起点となる接続対象をマウスの左ボタンで クリックすると,それが 黒い四角形で囲まれ,選択されたことを示す.この状態から 辺の終点となる接続対象をクリックすることで,辺が配置さ れる (実際は無向グラフなので起点・終点の区別はない).

一度選択されて黒い四角形で囲まれたアイコンをもう一度 マウス左ボタンでクリックすると,選択が取り消されて,黒い 四角形は消える.

節の移動・削除

節を移動させるには,移動させたい節をマウスの 中ボタンでドラッグする.

節を削除するには,削除したい節をマウスでポイントした 状態でキーボードのDeleteキーを押す.
削除された節に継がっている辺もこのとき一緒に削除される.

[BUG] 現在の実装では,辺を削除することはできません.辺の上にマウス カーソルがある状態で Deleteキーを押すとエラーとなります.

[BUG] CONSの移動について,CarおよびCdrタブをドラッグしての移動は できません.

ステータスバー

viewPP実行中の様々な情報が表示される.この部分をユーザが 明示的に操作することはない.


5.入力プログラムファイルの文法

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 は,実際にこのように書かれたプログラムを正常に 受け付ける.

[BUG] 現在の実装では,ガード部に書ける述語は1つだけです.

viewPPに組込まれているガード述語

viewPP には,ガード部で使うために以下の述語が 用意されている.

integer/2
入力が整数アトムであれば成功する.
atomic/2
入力がアトムであれば成功する.
atom/2
入力が記号アトムであれば成功する.
not_integer/2
入力が整数アトムでなければ成功する.
not_atomic/2
入力がアトムでなければ成功する.
not_atom/2
入力がアトムでなければ成功する.

これらはあくまでガード述語であるため, ユーザが実行フィールドに直にこれらを配置することは できない.

引数が2つあるが,第1引数が入力で第2引数が出力であり, 出力には入力と同じものが返る.これは,現在の実装では

  foo(1) :- atomic(1) | foo(1).

のような記述ができないせいである.このよう場合には

  foo(1) :- atomic(1,2) | foo(2).

と書くことによって目的を達成できる.


6.実際の操作例

この章では,viewPP の使い方の例を示す.

アーカイブの展開からコンパイルまでが終了している もとのして,カレントディレクトリ以下に次のファイルが あることを確認してほしい.

すべて揃っていたら,viewPP を起動してみる.シェルプロンプトから,

  % ./klitcld &
  % ./viewpp

と順に入力すると,viewPPの画面が現われる.

この時点では,特定の動作をする述語がまったく定義されていない. よって,外部ファイルから述語を読みこむ必要がある.そのために,まず ファイルロードアイコンをクリックし,ファイル選択ウィンドゥ を表示させる.

マウスで ((sample)) をマウスの左ボタンでダブル クリックするとカレントディレクトリが移動し,sampleディレ クトリ内にあるファイルを選択できる状態になる.ここでは, append.vppをダブルクリックしてロードする.
この操作によって,append という述語が登録され,利用可能となる.

次に,appendプログラムとそれに与える引数を実行フィールドに 配置してみる.

実行フィールド内の適当な所(中心付近が良いだろう)で マウスの左ボタンを押し,メニューを表示させて,その中から Predicate を選ぶ.このメニューはカスケードメニューに なっているので,さらにそこからどの述語を置くかを選択する.
選択肢には result/1append/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