エレファント・ビジュアライザー調査記録

ビジュアルプログラミングで数式の変形を表すことを考えていくブロクです。

論理プログラミング・関数プログラミングの調査

数学とソフトウェアのページで行っている調査は、C#でライブラリを作ろうしたとき、ライブラリに機能を追加することが簡単にできないか、C#には関数プログラミング的な機能があるので、それを利用して自動的にライブラリに機能を追加することはできないか、ということから始めました。最近では関数プログラミングの実行順序のついての考察から、ある順序を導入するということについて主に調べています。


実行順序がないProlog(これをCLPと呼ぶことにします)を考えます(本来のプログラミング言語Prologでは実行順序が決まっています)。CLPのプログラムは論理式を他の論理式に変換するものと考えることができます(これをCLPプログラムの「構文」と呼ぶことにします)。CLPプログラムの「構文」は論理式からなる可換モノイドの自己準同型となるため、CLPプログラムの「構文」の全体はPrologの節の和集合と変換の合成を和と積としてべき等半環となります。CLPプログラムの実行結果や中間の状態をプログラムの「効果」と呼ぶことにします。「効果」は「構文」の極限のようなものとなります。CLPではPrologのパターンマッチの機能を使って分岐や構造(直積、直和のようなもの)を表すことができます。


実行したときに結果が得られるかどうか、などを考えるために、プログラムを分類します。べき等半環のような代数的対象に順序を導入することでプログラムの分類をすることができると考えています。順序は「構文」による変換を何度やったかという順序で、時間の経過を表すとも考えることができます。順序を保存するようなプログラムの変換を考えて、その変換によって分類します。


これについては計算理論的な分類はすでに存在するかもしれませんが、計算理論的な分類については詳しく知りませんし、ある代数的対象を考えることで他の代数的対象の理論が使えるかもしれません。このようなものがどのような分野に属するものかよくわかりませんが、ウェブで検索して見つかる限りではクリーネ代数やべき等半環が近いようです。


分類をすることによって純粋関数型言語の動作がわかりやすくなると考えています。純粋関数型言語では実行順序を考えず計算を進めていくことができますが、結果を得るためには実行順序を考えなければなりません。実際には実行するには時間もかかるし、実行順序もあるので。


プログラミング言語F#は関数型言語的な機能とオブジェクト指向的な機能を持っていますが、実際には両者を相互に連係させて使うことは難しいです。F#にはイテレーター的な機能(yieldなど)があって、これは関数からクラスを自動的に作るものと考えることができます。F#のイテレーター的な機能を使うと関数とクラスの連係ができるのではないかと考えられます。この連係のために分類が使えると考えています。


またブラウザで動作するプログラムとサーバーで動作するプログラムが連係したアプリケーションにも分類が使えると考えています。