双方向変換のための双方向関数

近年、構造をもつデータの双方向変換はいろいろな場で注目されています。われわれの研究室では、2003年度〜2007年度の5年間にわたって文部科学省リーディングプロジェクトe-Societyの「高信頼構造化文書変換技術」の中でXML文書の双方向変換の言語を設計し、それを用いて実用的な「WEBサイト編集支援システムVu-X」を構築しました。

http://www.psdlab.org/vux/index.html

もとのデータベース(構造をもつデータ)から注目する部分を抽出加工して、興味のあるビューを得るといった変換プログラムは多くの場面に見られるでしょう。双方向変換のうちの順方向の変換をこの変換だとすると、逆方向の変換はその逆変換ということになります。このような場面では、この逆変換は、ビューが更新されたときに、その変更をもとのデータベースに反映させるということになるでしょう。関数の逆関数という考え方がありますが、それに似ているといえます。ただし、膨大なデータベースからコンパクトなビューを作ることを考えると、ビューはもとのデータの一部の情報しか含んでいないので、ビュー上の変更だけでもとのデータベースをうまく更新することはできません。したがって、われわれが扱う双方向変換は、逆方向の変換でビューだけでなく、もとのデータベースも使うという形のものです。

Webページを構成するためのXHTMLやXMLによる文書は木構造のデータベースだと見ることができますので、双方向変換の対象は木構造ということになります。もちろん、対象とするデータ構造を枠を広げることも可能で、木構造からグラフ構造に広げる試みも行っているところですが、もう一度、XML文書処理のためのより一般的な仕組みも考え直しています。Vu-Xを開発したときの双方向言語Bi-Xはいわばアセンブリ言語のようなもので、プログラムの構造化の仕組みは存在しないので、変換プログラムの開発や保守にはかなりの熟練を要するものでした。そのために、プロジェクトでは、XML文書の標準的な(一方向)変換言語であるXSLTやXQueryで書かれたコードをBi-Xに変換するツールも開発しました。また、関数プログラミング言語HaskellでXML文書を扱うためのライブラリHaXmlに対する変換ツールも用意しましたが、これらのBi-Xへの変換にはさまざまな制限があって、実用的には課題が残っているというのが実態です。

XML文書の木構造を扱うには関数型言語が適しているでしょう。1999年に公開されたHaXmlは

http://www.cs.york.ac.uk/fp/HaXml/

にありますが、Haskellで書かれた関数群からなるライブラリです。よく整理されていて、単一方向の変換には便利なライブラリだといえます。そこで、それらを双方向変換向けに書き換えれば、単一方向の変換として書いたプログラムがそのままで双方向変換を実現することになって、いわば、タダで双方向変換のメリットを得ることができることになります。

このようにして、HaXmlライブラリを双方向化することを考えているときに、「双方向関数」(bidirectional function) を思いつきました。双方向関数はHaXmlだけではなく、より一般的な対象にも有効な「関数」です。これを用いて、HaXmlライブラリを双方向化したXHaXmlを作りました。このように、双方向関数を使えば、普通に書いたプログラムを簡単に双方化することができるようになるといえます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください