「アリティ付きフラット・ラムダ計算」の記事を書いてみて思ったことを述べます、まったくの雑感です。
ラムダ計算、特に型なしラムダ計算って、適用とラムダ抽象だけでほんとに何でも出来ちゃうんですよね。極端にシンプルな機構であっても万能になるので、「余計な物は持たない」という意味ですごく禁欲的な気がします。
この特徴と機能性を「おー、ビューティフルだ!」と感じる人は多いのでしょうが、僕は「なにもそこまで徹底しなくても」という印象を持ちます。
例えば、型なしラムダ計算の体系では定数記号も関数記号も一切なくてもいいのですが、普通の感覚だと、リテラルと組み込み関数/演算子があったほうが心が落ち着きます。プログラミングの最初の課題が「定数ゼロとサクセッサを定義せよ」とかはちょっと勘弁してよ、という感じ。
アリティ付きフラット・ラムダ計算では、F0, F1, F2, ... という一連の組み込み記号のセットを準備しているので、リテラルや組み込み関数/演算子は最初から準備できます。例えば、
- F0 = {'0', '1'}
- F1 = {'-'}
- F2 = {'+', '*'}
とセットアップすれば、整数のゼロとイチ、単項のマイナス(符号反転)、足し算、掛け算の諸記号を最初から使えます。これらの記号に常識的な算術的意味を持たせれば、算術計算はラムダ式の項書換えではなくて、デルタ変換(またはオラクル)として遂行できます。
再帰的な定義とかモジュールとかも、ラムダ式のなかで頑張れば定式化できますが、普通は式(項)とは別なメカニズムが用意されるので、「再帰的な定義をする式」とか「モジュールを表す式」とかは分かりやすいものではありません。
もちろん、最小限の仮定から出発して何が出来るかを探求することは意味がありますが、現実世界では前もって与えられる素材(リテラル、組み込みの関数/演算子、モジュールなど)をそのままプリミティブとして採用する定式化もあってもいいだろうし、僕はそのような定式化を欲しています。
ラムダ計算には、ものすごい数の方言があるし、方言・変種をいくらでも作れる柔軟性を備えています。「禁欲的なのは嫌いだ」と思えば(冗長でも)組み込み機能を足せばいいですし、意味論も項書換え規則も調整ができます。僕にとっては、超シンプルさよりは、枠組としての柔軟さと使いやすさが魅力的ですね。まー、いずれにしても、ラムダは可愛い。