LoginSignup
1
0

More than 3 years have passed since last update.

Elxlog シンプルでわかりやすい論理&関数型をめざして

Last updated at Posted at 2019-08-12

守破離の破

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規格は無理難題のてんこ盛りでした。あれこれと「規格に適合していない」と指摘されてきました。守破離の守とぐっとこらえてきたのですが、もう爆発です。(笑い)お蔭で、深く理解できましたし、問題点が多々あることもよくわかりました。こんどは創造的破壊です。破りますよ。(笑い)

あ~~、すっきりした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0