発端
N-Prologは私の趣味的な処理系で1980年代を懐かしみつつRUN\PROLOGのコードを動かす目的で作ってます。ところで最近、UWNという人からissuesをもらいました。ISO-Prolog規格との対比を持ち出してきて、それは違うと指摘をもらいました。「ああ、めんどくせ。言語仕様の隅を突くのが大好きな暇人かな?」とテキトーに距離をおいていたのですが、どうもこの傍若無人なコメント、どこかで見たことあるような雰囲気...
何日かして思い出しました。ああ、ISO-Prologの議長のウルリッヒさんだよ。頭文字をとるとUWN、あのお方だ!!!。
言い訳
UWNさんにはN-Prologは1980年代のDEC10-Prologをお手本にしているもので、日本でRUN\PROLOGと呼ばれたいたものの互換でして・・・と言い訳をしたのですが。なんか、考えてるうちにISO-Prologは好きじゃないけど、実装できないのか?と言われるのも悔しい気がしてきました。以前、作っていたO-PrologではISO準拠を目指して頑張ってはみたものの、そのシンタックスのハードルの高さと、その割にはエレガントではないところ、文字列が不満足なところ、モジュールが曖昧なところが嫌になって離脱したのでした。
でも、これもなんかの御縁かもしれません。いっちょやってみますか。
RUN/PROLOG上位互換
というわけでISO-Prologのコアの部分を取り込んで実装を追加したところです。ウルリッヒさんから「ああ、その結果はISOの仕様と違うと言われそうなので、ドキュメントに逃げ口上をたっぷり書いておきました。
今のところ追加したのは下記の述語たちです。
\+ (not)
atom_concat/3
append/3
member/2
between/3
select/3
succ/2
maplist/2
compound/1
ground/1
once/1
atom_codes/2
atom_chars/2
char_code/2
number_codes/2
number_chars/2
predicate_property/2
bagof/3
setof/3
findall/3
existerrors/2
write_canonical/1 /2
atom_length/2
get_char/1 2
get_byte/1 2
put_char/1
flush_output/0
catch/3
throw/1
unify_with_occurs_check/2
current_input/1
current_output/1
set_input/1
set_output/1
use_module/1
module/1
copy_term/2
モジュールはSWI-Prologを参考にしつつも、独自です。ISOはモジュールはゆるくしか定めてないのでセーフでしょう。
案外、楽しいかも
何年か前はほんとISOが苦手で嫌ってました。でも、やってみると案外と楽しいかもしれません。ISOの仕様にとらわれずに自分ならこう考えて、こういう仕様にした、ということをやっています。ChatGPTも相手になってくれるので百人力です。あいつは大学教授並に博識です。本業が忙しいのですが、こんなことをするのも気分転換、リラックスできるのでいいかもしれません。