はじめに
N-Prologの後継のM-Prologの開発をしています。N-Prologは1980年代のRUN/PROLOG互換として一応の完成をみました。しかし、実行速度に不満がありました。SWI-Prologに比較すると5倍から10倍は遅いのです。N-PrologはPAIPで解説されているProlog処理系のアイディアを元としておりSLDリゾルーションを素朴に実行するタイプです。このためWAMのSWI-Prologなどよりずっと遅いのでした。そこで、この度Prologコードの証明木をC言語で記述する方式を考案してM-Prologというプロジェクトを始めています。
素朴なベンチマーク
まだまだ開発途上ながら単純な次の非決定性述語が動作するところにまで至りました。実行速度について計測しました。失敗継続により10^5回のバックトラックを生じます。さらにこれをbetweenで1000回実行しているものです。
n(1). n(2). n(3). n(4). n(5).
n(6). n(7). n(8). n(9). n(10).
bench :-
n(X),
n(Y),
n(Z),
n(A),
n(B),
fail.
bench.
実行はインテルIcor7マシンのWSL2で行いました。
このようにWAMで動作するPrologの実行速度を超えることがわかりました。
C言語への変換
まだ開発途上ではありますが、次のようにするとコンパイル可能です。第2引数にcを与えるとC言語のソースを生成します。
?- use_module(compiler).
compile_file('./tests/bug',c).
C言語のgotoをつかってバックトラックを実現しています。ご興味ありましたらおためしください。
PLICには及ばない
GNU-PrologにはC言語に変換して高速実行するPLICというコンパイラが装備されています。これで実行すると上記のベンチマークを990ミリ秒程度で完了します。M-Prologの2倍くらい高速です。
さすがにこれには適いません
ようやくSWI-Prologなどの世界水準のProlog処理系並みの速度が出せつつあります。2026年の夏にver1.00を公表する予定です。
https://github.com/sasagawa888/mprolog


