平成7年度 委託研究ソフトウェアの 成果ソフトウェア |
ある意味で論理型言語は冬の時代を迎えたとも言えます。しかし我々は感傷的 になる必要はありません。イデオロギーに走っていた論理型言語に対する人々 の態度が、ようやく冷静なものになりつつあることを意味していると私は思う からです。今後は、論理型言語の本質を理解した人々によって、論理型言語は 地道に研究されてゆくことでしょう。このことはむしろ喜ぶべきことだと思い ます。
従来、多量のデータ解析、とくに浮動小数点演算を多量に含むような数値計算 に論理型言語が使われた例はあまりありませんでした。そもそも実装された論 理型言語は、大規模な計算機資源を用意して初めてまともに機能する、いささ か扱いにくい処理系であることが多かったのです。当然のことながら高速な処 理がすべてあるような大規模データ解析のような仕事では、論理型言語の処理 系の「重さ」は大きな足枷となることが予想されました。したがって、スピー ド至上主義の人々が論理型言語使った大規模なデータ解析を考えることはまれ であったわけです。
このこと、「足枷」の存在は現在でも本質的には変わっていません。非常にポー タブルな処理系klicでさえ、同一の処理を他の手続き型言語で記述した場合と 比較すると、要求される計算機資源は大きく、処理効率は必ずしも高くありま せん。
しかしながら、これは我々が限られた計算機資源しか持ち得ない場合の話です。 現在、ハードウェアの価格はどんどん下がり、我々は望むだけ多くのハードウェ アを手にすることができます。「ハードウェアはただ」の時代がもうそこまで 来ているのです。このような状況下では、多くの計算機を結合し、処理を分散 させようという考え方が自然に出てきます。しかしこうなると、今度はこのよ うな分散環境で正しく機能するソフトウェアを書く仕事が問題になってきます。 それは決して簡単なことではありません。一般にこのような分散環境で並列動 作するソフトウェアは複雑で、間違いを含みやすいからです。
論理型言語は本質的にこのような並列動作を含むプログラムの記述に向いてい ると考えられます。というのは、手続き的な概念を含まないために、やっかい な同期の問題を意識しないで済むからです^*。物理的な並列処理と理論上の並 列実行可能性を切り離して考えられるのも大きな特徴です。いったん論理型言 語で記述されたプログラムは、様々な並列処理の形態を、アルゴリズムを変え ることなく取ることができるのです。
*論理型言語の動作を手続き的に解釈すると、それは同期を取りながらの並列 動作に他ならないことがわかります(それだけに手続き的な解釈は困難を究め るわけですが)。
どんな高速な計算機も、完成した瞬間から旧式になることを忘れてはいけませ ん。ある時点でチューンナップされた高速計算器用のプログラムを書いても、 その計算機が旧態依然としたものとなれば、そのプログラムの寿命もそこで尽 きてしまいます。むしろそれよりは、ハードウェアに依存性の少ない、より抽 象化されたソフトウェアを書くべきです。そうすればソフトウェアは生物の遺 伝子のように、あるハードウェアが滅んでも、次から次へハードウェアを乗り 換えて生き延びることができます(おそらく進化しながら!)。論理型言語は、 そのような目的にうってつけの言語と言えます。
自然科学の研究において、どのような情報処理が要求されるかは自然科学者自 身にもわかっていないことが多いのです。したがって、彼らは自らの手で、試 行錯誤を経て、データ解析やシミュレーションのためのコードを書くことが多 いのです。彼らの興味は論理であって、実装のためのテクニックではありませ ん。論理がすなわちコードとなる論理型言語の特徴は、実は自然科学の研究に おいてもっとも有用であると考えられます。
DeepForestはこのようなことを踏まえて、おしきせのアプリケーションを提供 するというよりは、進化に興味のある自然科学者が自らプログラムを書く場合 に、有用なモジュール(述語のセット)を提供することに主眼を置いています。
私自身のモットーは「(コンピューターを使うということ)≡(ソフトウェアを書く ということ)」です。
実験科学が主流である生物学において、ひとつだけ例外的な分野があります。 それが進化学です。生命は非常に長い時間をかけてゆっくりと進化してきたと 考えられるので、我々は実験室で進化という現象を再現することができません。 しかし、進化という概念を抜きに生命現象を扱うことは不可能です。なぜなら、 この概念は生命現象の定義のひとつであり、様々な生物種の生命現象を統一的 に扱うための鍵であるからです。
では私達は進化という現象をどう「科学的」に扱ったらよいのでしょうか。た とえばあなたが実験で出したデータに進化的な側面から考察を加えたい場合、 あなたはそのデータをどう処理したらよいのでしょうか。もっとも合理的な方 法は、手元にあるデータと参照可能なデータから、直接は観察することのでき ない進化という現象を「定量的」に推定することでしょう。このような考えの もとに発展してきた学問が分子進化遺伝学です。DeepForestはこの分子進化遺 伝学で培われた様々なデータ解析の手法の中で、特に重要であると考えられる 系統樹の推定手法ををモジュールという形でてユーザに提供します。また、単 なるデータ解析にとどまらず、進化的現象のシミュレーションを行うためのモ ジュールも含んでいます。
DeepForestは実際の分子進化研究の現場で使用されたプログラムをライブラリ としてまとめたものであり、効率や巨大なデータを扱える点に秀でています。
DeepForestは平成7年および8年の二年計画の委託研究により開発されます。今 回、中間報告の意味も兼ねて、DeepForestのプロトタイプ版を公開することに なりました。プロトタイプ版はいくつかのモジュールを結合して作った小さな 最尤系統樹推定プログラムで、go/0と仮称されています。この名前は生命の原 初(=Origin=(time=0))を見てみよう、という意味を含んでいます。
go/0は主にKL1の処理系であるklicの性質(主に浮動小数点演算について)を調 べるために書かれました。実用性はまったく度外視したため、きわめて小さな データしか扱うことができません。さらに単純な再帰構造を多用しているため に、処理速度が遅くなっています。その代わり、実に素直なアルゴリズムを採 用しています。klicのデバッガでgo/0トレースをしてみれば、最尤推定の様子 がよくわかると思います。
advertise.txt DeepForestの紹介 DeepForest.doc 使用説明書 Document この研究の発表先一覧、著作件者氏名など Readme DeepForestに関する一般的な説明(英文) pimos pimos用ディレクトリ unix unix用ディレクトリディレクトリunixは以下のファイルを含んでいます。
-------------------------------------------------------------------- サイズ(bytes) ファイル名 記述 -------------------------------------------------------------------- 2228 calculate.kl1 簡単な数式の値を評価するためのモジュ ールです(go/0では使っていません)。 21391 clike.kl1 条件付き尤度を計算するためのモジュー ルです。 8410 get_seq.kl1 アミノ酸配列データをgo/0が処理できる ように変換します。 2712 get_seq_2.kl1 アミノ酸配列データをgo/0が処理できる ように変換します(go/0では使っていません)。 2708 go.kl1 go/0そのものです。 1969 list.kl1 組み込みのモジュールにはないような、 リストを扱うための述語を含むモジュー ルです。 1479 max.kl1 より大きな値を持つ数式を選択します (go/0では使っていません)。 1457 plot_like.kl1 尤度曲面をプロットします(go/0では使っ ていません)。 3449 remove_gap_site.kl1 ギャップを含むサイトを削除します。 4562 remove_gap_site_2.kl1 ギャップを含むサイトを削除します (go/0では使っていません)。 1168 string.kl1 組み込みのモジュールにはないような、 文字列を扱うための述語を含むモジュー ルです。 837 symbol.kl1 簡単な数式処理をするためのモジュール です(go/0では使っていません)。 1570 termio.kl1 組み込みのモジュールにはないような、 項の入出力を扱うための述語を含むモジュー ルです。 56823 traverse.kl1 枝長の最尤推定をするためのモジュール です。 11837 tree.kl1 木構造を持ったデータを扱うためのモジュ ールです。 --------------------------------------------------------------------ディレクトリpimosは以下のモジュールを含んでいます。
これらのモジュールは、PIMにアクセスできる好運な人々にだけ実行すること ができます。PIM/m(64PE)での動作を確認しています。ただし、核酸の配列デー タのみをサポートしています。
-------------------------------------------------------------------- サイズ(bytes) name 記述 -------------------------------------------------------------------- 26726 contour.kl1 尤度曲面をプロットします。 59915 traverse.kl1 枝長の最尤推定をします。 --------------------------------------------------------------------