守破離の破
2018年はISO-Prolog規格にO-Prologを適合させることに追われていました。ISO-Prologには個人的に納得がいかない点が多々ありました。しかし、守破離です。日本には古来、武芸、芸事を習得する方法論として守破離というものがあります。2018年はひらすら守を実践してきました。もう、イイカゲン良いだろうということでElxlogで破をやっています。
パーサの簡素化
ユーザー定義演算子について中置記法の設定、重み設定などを省略しました。述語論理を深く理解したい私には必要がないものだったからです。これにより大幅にパーサは簡素化しています。
また、引数無しの述語を foo() のようにカッコをつけて明示的に表記することとしました。これもまた、パーサの簡素化に寄与しています。
比較演算子の変更
C言語やElixirなど、現在一般的に使われている記法に変更しました。
ISO-Prologではなぜか => =< =/= =:= といった見慣れない記号を用いています。これを一般的な表記の >= <= != == に変更しました。
項の比較の @< などがありますが、これもわかりにくいこと、この上ありません。全面的に排除します。必要とあれば新設します。
カット、if_then_elseの廃止
決定性の述語を表現するためにPrologでは妥協が行われていました。!(カット)や -> ;(if_then_else)です。こういったものはElixirで記述することとし、排除することとしています。この結果、述語論理の本来に姿になっています。
;による選言も排除しています。もともとホーン節の定義からして;は入っていません。わかりにくくする要因と考え、排除しました。
call/1 once/1 などの排除
ISO-Prologでは一階述語論理を飛び越えたものが多くあり、そして、なんと!恐ろしいことにそれらにおいても!(カット)が機能することが要請されていました。わかりにくいこと、この上ありません。責任者呼んでこい!と叫びたい気分でした(笑い)。そんなややこしいことをするなら、普通の手続き型言語で記述した方が遥かにわかりやすいです。これらを排除し、必要ならElixirで記述できるようにしました。
is/2の拡張
X is 1+2+3. の右辺をElixirの関数で記述できるように拡張しました。たとえば竹内関数をtaraiというElixir関数として記述します。そして X is elx_tarai(12,6,0) のように記述できます。こうした記述があればカットに依存する必要性はなくなります。
elixir/1の新設
述語をElixirの関数として記述しこれを呼び出すことができます。elixir(elx_nodiag(X,Y,Z))のように使います。例えばqueens問題の利き筋の判定述語であるnodiag/3は決定性の述語でありElixirで書いた方が末尾再帰最適化が行われ高速となります。
修行は終わったのだよ
ほんと2018年はきつかったです。ISO-Prolog規格は無理難題のてんこ盛りでした。あれこれと「規格に適合していない」と指摘されてきました。守破離の守とぐっとこらえてきたのですが、もう爆発です。(笑い)お蔭で、深く理解できましたし、問題点が多々あることもよくわかりました。こんどは創造的破壊です。破りますよ。(笑い)
あ~~、すっきりした。