ソフトウェアの成果として、「KLIC の Tcl/Tk インターフェース
klitcl
」、研究上の成果として、「グラフ描画アルゴリズムの
改良」「Undo 機能の研究」が挙げられる。以下にその概要を述べる。
klitcl の実装
klitcl
という、KLIC から Tcl/Tk を利用するためのインタフェー
スを制作した。klitcl
を利用することにより、KLIC を用いた
プログラムにGUI を装備することが容易となる。
利用環境としては、以下のバージョンのソフトウェアを使用することをを想定 している。
KLIC: Version2.002 , Tcl: Version 3.7 , Tk:Version 4.0 OS としては、SunOS 4.1.x を想定し、それに基づいて実 装している。
klitcl
は、以下の命令を KLIC に追加する。
tcl_init | Tclインタープリタの初期化を行なう |
tk_init | Tkの初期化を行なう |
tcltk_init | tcl_initとtk_initを一度に行なう |
tcl_ecal(Command, Result) | Tclの文 Command を評価し、結果を Result に返す |
tk_mainloop | Tkのイベント待ちループに入る |
tcl
というモジュールに含まれるような実
装となっているため、実際に用いる際には以下の例のように、最初に
use_module
を用いてモジュールを読みこんでおく必要がある。
:- use_module(tcl). :- module main. main :- tcl:tcl_init, tcl:tk_init, tcl:tcl_eval("button .b -text Exit -command exit",Res1), tcl:tcl_eval("pack .b",Res2), io:outstream([print(Res1),nl,print(Res2),nl]), tcl:tk_mainloop.
これは、以下の Tcl/Tk スクリプトに(ほぼ)対応する。
button .b -text Exit -command exit pack .b
また、Tcl の側から KLIC の述語を呼ぶための手段として、
KLIC
という Tcl 命令を提供する。呼び出し方は、以下の例のよ
うに、「KLIC
<述語名> <引数
>」として呼びだす。
: tcl:tcl_eval("button .b -text Test -command {KLIC test Hello!}",Res1), : test(S) :- io:outstream([print(S),nl]).
これにより、''Test'' と表示されたボタンを押すと、画面には
Hello!
と表示される。
グラフ描画アルゴリズム
現存する各種のグラフ描画アルゴリズムは、グラフの構造が与えられたときに、 それを適切に配置することは可能だが、グラフの初期配置が人間の手によって 与えられ、それをアニメーションさせながら動かすことにより最適な配置まで 持っていくような場合には、あまり適しているとは言えない。
ビジュアルプログラミングシステムを始めとする、インタラクティブなコンピュー タシステムにおいて、情報を的確にユーザに提示する手段として、アニメーショ ンは非常に有効な手段となり得ることを考え、最終的には、GHC の実行の可視 化に用いることを目標として、既存のグラフ描画アルゴリズムを、アニメーショ ンに適した形に改良することにした。
本研究においては、並列論理型言語 GHC のビジュアル化を考えるため、グラ フの描画アルゴリズムとして、「スプリング・モデル」をベースとしたものを 用いることにした。「スプリング・モデル」は、ノードの均一な配置ができる 点などで有利である。
スプリング・モデルの中で、特に Kamadaのアルゴリズム[2]とEades のアルゴリズム[3]をベースに、グラフのアニメーションの実験 を行ってみたところ、これらのアルゴリズムの計算の1ステップをアニメーショ ンの 1 コマに対応させて表示させた場合に、ノードの動きが不連続になって しまい非常に見苦しくなるという現象が見られた。この現象は、両者のアルゴ リズムがアニメーションに適していないことを示しており、改良の必要がある と考えた。
ノードの不自然な動きの原因となっているのは、Kamadaにおいてはノード微小 移動量の算出に用いるニュートン法であり、Eadesにおいては「ノード間斥力 は距離の2乗に反比例する」という、Eadesのアルゴリズムにおける力の定義で ある。
この問題を解決するために、以下の方法をとった[4]。
これにより、改良を加える前に比べて、自然なアニメーションが可能であると いうことが確認できた。
グラフをアニメーションするには、このような方法の他にも、あらかじめ目標 配置を計算し、それに応じてコマ割りをしてアニメーションをする方法がある。 このような方法は、アニメーションそのものの速度を上げることができる反面、 アニメーションの最中にもユーザのグラフに対する操作を許すような場合に、 処理が大変になる。また、再配置およびコマ割りにまとまった時間を必要とす るため、インタラクティブ性を損う恐れがある。
図1に、実際のグラフに対して KamadaとEadesの各アルゴリズムを適用した結果と、これらを改良したアルゴ リズムを適用した結果を示す。図中のドットは、ノードの移動した軌跡を示し ている。
これらを見るとわかるように、改良後の方が、ノードの動きが自然である。特 に、Eades の改良の方では、ノードの動く範囲がある一定の範囲内におさまっ ている。
GHC の実行をグラフを用いてアニメーション化する場合、複数のグラフがさら に互いに接続される状態というのが起り得る。このようなときに、各々のグラ フのノードの移動する範囲がある一定の範囲にあることが保証できれば、その 各々のグラフを「ひとつの大きなノード」とみなすことにより、「グラフ同士 をつないだグラフ」に対してもこの改良したアルゴリズムを適用し、アニメー ションをすることが可能になる。
今後は、この改良したアルゴリズムを利用して、実際にビジュアルなGHC の実 行系を実装する予定である。
Undo 機能についての研究
インタラクティブなシステムにおいて、自分のやった操作を取り消すための 「Undo機能」は非常に重要な位置を占める。これまでに様々なプログラムに Undo 機能が使われているが、それらには、任意の状態に戻すために多くのス テップを経なくてはならなかったり、それまでに通過した全ての状態を保存で きず、ある状態に戻ることができないなどといった欠点があった。
我々は、Undo のインターフェースとして、従来の「ヒストリを前後にたどる もの」の他に、新たに木構造に基いたUndo 機能を実現した。
Undo のインターフェースとして、「ヒストリを前後にたどるもの」「上下左 右に木構造の中を動くもの」のそれぞれについて、「移動キーだけのもの」と 「状態をミニチュアで画面表示し、それを選択するもの」を実現した。また、 「全部の状態のミニチュア表示から選択するもの」「全状態のうちの主要なも のを選んでミニチュア表示をし、そこから選択するもの」を試作し、評価した。
評価結果としては、木構造の中をたどらせる Undo よりも、従来からある、ヒ ストリをたどるような Undo の方が、目的の状態にするためにかかる時間が短 かった。また、ミニチュアを表示するものよりも、表示しないものの方が短い 時間で目的の状態に到達できた[5]。
今後の課題
klitcl
に関しては、さらなる改良を行い、機能の拡張を図り、
klitcl
を用いて、ビジュアルでインタラクティブなGHC 実行系
の実装を行っていく。
ビジュアルプログラミング・システムに関しては、アニメーション技法につい ての研究を、グラフ描画アルゴリズムをベースとして進める。
研究成果についての自己評価
klitcl
の制作、および、ビジュアルプログラミング・システム
の基礎として、グラフ描画アルゴリズムと入力メソッド(特に、Undo機能)につ
いて研究を進めてきた。klitcl
については、これをフリーソフ
トウェアとして発表することにより、多くの KLIC プログラマが GUI を取り
入れたアプリケーションを容易に作成できるようになる。また、グラフ描画ア
ルゴリズムや入力メソッドの改良については、今後開発するビジュアルプログ
ラミング・システムの重要な要素技術となると共に、それぞれ単独でも様々な
応用が考えられる。