Prologは使えるか?

あけましておめでとうございます。2009年最初の記事です。たいそうなタイトルがついていますが、答えはいうまでもなく「使える」です。なんでもPrologのユーザ数はここ20年ほぼ横ばいとか。真偽は不明ですが、根強い人気があるのでしょう。ここでは、建築屋にも使う価値あるのか?という限定した話です。

さて、現在の研究室ではRDB(PostgreSQL)を積極的に使っていますが、かなり以前(本学に異動するずっと前のことです)には高速に動作するRDBとしてPrologを使っていました。懐かしい。SWI-Prologがいろんな意味ですごいという話をネットで見かけて、冬休みの頭の体操に現代のPrologをちょっと触ってみることにしました。


(全部読むには 全文表示 をクリックしてください。)

Prolog言語は人工知能(AI)の分野でよく使われているそうです。どの教科書でも自然言語処理の簡単な例題に必ず言及しています。ただ、全体としてテキストベースのアプリケーション例ばかりでグラフィカルなものはみたことがありません。こういう状況だと私を含めて建築屋さんはあまり興味を持てないでしょうね。建築屋のPrologユーザはかなり少ないと想像します。

でも、内容をよく見ると、8-Queenやハノイの塔などのパズルを解くプログラムも必ず紹介されていますから、もしパズルを解く過程をグラフィカルに表示したらPrologへのイメージも変わって建築屋の利用者も増えるかもしれません。

というわけで、SWI-PrologとOpenGLを使ってハノイの塔の解答を表示するプログラムを書いてみました。まずは7枚の円盤の場合をご覧ください。見やすくするため円盤を移動させる毎に0.5秒のsleep/1を挟んでいます。次に64枚の円盤を解いて世界を終焉させよう...、といいたいところですが不可能ですので、14枚の円盤の解答を見てください。こちらにはsleep/1は挟んでいません。結構なスピードで動きますね。Core2Duo3.0GhzのVista64でVMWarePlayer(CPUの個数設定は1)のゲストOS Ubuntu7.10を走らせてそこで実行しています。

(コーデックはXvidをつかっています。DivX互換です。)

仕組みを簡単に説明しますと、OpenGL(GLUT)のglutMainLoop()に入る前に、Prolog側であらかじめ用意した述語が呼び出されるようにglutDisplayFunc()やglutReshapeFunc()の引数に設定しておきます。この操作はC側で記述します。そして、glutMainLoop()以後は先に設定したPrologの述語がCから呼び出される形になります。ちょっと複雑ですね。

p_display_function :- p_display_function(pattern1).
p_display_function(pattern1) :-
    p_glClear(g_GL_COLOR_BUFFUR_BIT \/ g_GL_DEPTH_BUFFER_BIT),
    p_glCallList(1),
    p_glutSwapBuffers.
p_display_function(pattern2) :-
    ...
    ...
 上の例だと、glutDisplayFunc()にp_display_functionを呼び出すように設定しておいて、Prolog側でp_display_functionをいろいろと書き換えることでビジュアルを変更するわけです。

やっていて悩ましいと思ったのは、Prolog側にどの程度OpenGLの関数の呼び出しを定義するかでした。RDBの代替でよいならば、推論部分のみをPrologにまかせ描画関係はすべてOpenGLで処理するのが素直でしょうが、今回はglutInitWindowsPos()からglutSwapBuffers()のようなものまでPrologから呼び出せるように作りました。

正直なところ、このくらいならPrologでパズルの解答をファイルに一旦書き出した後、そのファイルをC言語側で再度読み込んでOpenGLで3D表示する仕組みでもよいでしょう。今回はSWI-PrologでのProlog⇔C相互の呼び出し方に興味があったのでこのようなごちゃごちゃした仕組みになってしまいました。OpenGLのインタプリタProlog版のようなものがあっても面白いでしょうし、もしかしたらそういうニーズもあるかもしれませんしね。

研究室での利用ですが、アルゴリズミックデザインで使えるかもしれません。シェイプグラマー、スキーマグラマーあたりがキーワードでしょうか。Prologで書いて絵を直接出せれば楽しいでしょう。

謝辞
この記事は、以下のリンクを参考にしました。
http://gollem.science.uva.nl/twiki/pl/bin/view/Library/OpenGL

コメント (0件)


HLAB
http://www.hlab-arch.jp/article.php/20090104232105965