SWI-Prolog

ごく最近になって、SWI-Prolog
  →  http://www.swi-prolog.org/
という処理系を使ってみています。前々からちょーっと気になっていた、Prolog というプログラミング言語の、フリーの処理系。結構面白いです。

Prolog というのは、論理型言語、という分類のプログラミング言語で、ありていに言えば、「事実」や「規則」をどんどん定義していって、それについて問い合わせる、という形でプログラミングをしていきます…と書くと難しいようですが、手続き型言語ばっかりしか扱ったことのない私にも、意外と違和感なく記述できたりします。

char_to_upper(X,Y):- integer(X),!,(97=<X,X=<122,!,Y is (X-32);Y=X).

簡単なところではこんな感じ。文字コード(Unicode)の半角アルファベット小文字を大文字に変える、という規則の定義です。

C++言語で書くと、以下のに近いです。

bool char_to_upper(int x, int &y)
{
    return 97<=x && x<=122 && ((y=x-32),true) || ((y=x),true);
}

実際には、Prolog版の方は、XにもYにも文字コードを渡してやると、X が大文字化されたものが Y に入っているかを判断して、 true / false で返してくる、という動作も、同じ規則で実行できたりします。

つまり、単一の規則で、

bool char_to_upper(int x, int &y)
{
    return 97<=x && x<=122 && (y==x-32) || (y==x);
}

も担っているということです。

こういった動作を実現できるのは、Prologの変数(自由変数、といいます)が、「ただ一度だけ代入可能」という仕様によるものです。
X=Y / Y=X という記述は、Xが代入済み、Yが代入前の状態だと、X の内容を Y に代入し true を返す。XもYも代入済みの場合、両者が等しければ true を、等しくなければ false を返す。
といった具合に動作します。パターンマッチングという動作のひとつですが、Prologの動作詳細については、別のところを参照いただくとしましてあまり突っ込まずに置いときます。

で、この言語、何でいじっているのかというと、簡易データベース的な動作が簡単にできるな、と思って遊んでみたかったからです。いやあ、最近、色々なソフトでSQLiteが使用されている気がしますが、ちょっとしたもの、例えば、レコード数が5000とかその程度のもので、検索対象文字列が1KB以下、複雑な関係性がないというのなら、この手のものの方が早いんじゃないかな、と。

また、Prologだと、そうした向きにフラットなデータ空間を作った場合、データレコードそのものについては、かなり可読性が高い記述ができますし。

item(b, 1, 0, 'ItemName', 'MainData', ['KeyWord1','KeyWord2']).

これも、Prologのソースになります。

タイプがb
アイテム番号1
所属ディレクトリ番号0
名前
データ
[検索用キーワードのリスト]

といった「事実」の定義です。この程度のデータ構造だったら、人間も読むテキスト形式として
も、HTMLとかXMLよりも簡便なんじゃないかと思います。


ちなみに、問い合わせは、

item(b, Id, Dir, Name, Data, Keyword).

といった具合にやります。タイプが b のものだけを検索してきて、それぞれIdやらDirやらの変数(頭文字が大文字なのが変数として解釈される言語仕様)に、検索されてきたデータが格納されます。ループ処理をすればすべて列挙可能です。
これが、たとえばディレクトリ 0 に属しているもの全てを列挙、データ部分とキーワードは要らない、ということであれば、

item(Type, Id, 0, Name, _, _).

とすれば検索できてしまいます。
[PR]

インターネット広告の「トランスメディア」提供スキンアイコン by mikamikanamiyuki | 2008-09-20 02:01 | プログラミング

<< 音楽と料理(結構毒舌な話題) ダメな時はダメ >>