Prolog Cafeで組込述語を作る方法 〜Prolog言語で実装する場合〜
Prolog CafeはJavaで実装されたPrologの処理系です。
組込述語の作り方をメモしておきます。
インタプリタの起動
以下のコマンドでPrologのインタプリタが起動します。
$ java -cp plcafe.jar jp.ac.kobe_u.cs.prolog.lang.PrologMain jp.ac.kobe_u.cs.prolog.builtin:cafeteria
Prolog Cafe 1.2.5 (mantis)
Copyright(C) 1997-2009 M.Banbara and N.Tamura
| ?- halt.
Prolog Cafeにはインタプリタを起動するためのスクリプトも同梱されていますがここではJavaコマンドを使って素で実行しています。
このコマンドではクラスパスにplcafe.jarを入れてjp.ac.kobe_u.cs.prolog.lang.PrologMainのメインメソッドを実行しています。
jp.ac.kobe_u.cs.prolog.lang.PrologMainは引数に与えられたゴールを実行します。
引数に与えられた述語jp.ac.kobe_u.cs.prolog.builtin:cafeteriaはPrologの対話型インタフェースを起動します。終了するにはhalt/0を実行します。
ちなみに、Prolog Cafeではパッケージ名:述語名という形式で述語に名前空間を持たせることができます。これはJavaのパッケージの仕組みを流用しています。
組込述語の作成
Prolog言語で記述する場合
ソースコードの作成
まず以下に示す簡単な述語を記述してみます。example/0は標準出力にhelloと改行を出力するだけの述語です。
example :-
write(hello), nl.
普通に読み込んで呼び出し
次に、普通に読み込んで呼び出してみます。
$ java -cp plcafe.jar jp.ac.kobe_u.cs.prolog.lang.PrologMain jp.ac.kobe_u.cs.prolog.builtin:cafeteria
Prolog Cafe 1.2.5 (mantis)
Copyright(C) 1997-2009 M.Banbara and N.Tamura
| ?- ['example.prolog'].
{consulting /Users/masayuki/Dropbox/GitLab/maglog/example.prolog ...}
{/Users/masayuki/Dropbox/GitLab/maglog/example.prolog consulted, 42 msec}
| ?- listing.
example :-
write(hello),
nl.
yes
| ?- example.
hello
yes
| ?- halt.
一応、解説すると['example.prolog']でソースコードを読み込んで節としてデータベースに格納します。listing/0で格納された節をリストアップします。example/0で述語として呼び出します。最後にhalt/0で終了します。
Prolog言語からJava言語への変換
ソースコードをProlog言語からJava言語に変換し、クラスファイルへコンパイルして、Prolog Cafeのインタプリタの起動時にそれをクラスパスへ配置しておくことで、先ほど記述した述語を組込述語として呼ぶことができます。
Prolog言語のソースコードをJava言語へ変換するにはjp.ac.kobe_u.cs.prolog.compiler.Compailerのメインメソッドの引数にProlog言語のソースコードを与えて実行します。
$ java -cp plcafe.jar jp.ac.kobe_u.cs.prolog.compiler.Compailer example.prolog
$ ls PRED_*.java
PRED_example_0.java
PRED_example_0.javaというJavaのソースコードが生成されました。Prolog Cafeのコンパイラでは名前/アリティという述語は、PRED_名前_アリティ.javaという命名規則でJavaのクラスに変換されます。
ちなみに、Prolog言語で記述されたソースコード内に複数の述語が定義されている場合は、それぞれクラスに変換され、複数のjavaファイルが生成されます。ループへの変換が伴う場合などはさらに増えます。
次に、変換されたjavaファイルをclassファイルにコンパイルします。この時、クラスパスにplcafe.jarを入れておく必要があります。
$ javac -cp plcafe.jar PRED_example_0.java
$ ls PRED_*.class
PRED_example_0.class
クラスパスへの追加と呼び出し
そして、先ほど生成されたclassファイルをクラスパスに入れてPrologインタプリタを起動します。ここでは./をクラスパスに追加しています。
$ java -cp ./:plcafe.jar jp.ac.kobe_u.cs.prolog.lang.PrologMain jp.ac.kobe_u.cs.prolog.builtin:cafeteria
Prolog Cafe 1.2.5 (mantis)
Copyright(C) 1997-2009 M.Banbara and N.Tamura
| ?- example.
hello
yes
| ?- halt.
これでconsultしなくても組込述語として呼び出せるようになります。