2022年09月15日更新
[1] Mathematica(v11.1) によるλ計算の簡約器です.実行プログラムは reduce[string] と reduceList[string] だけです.下のnotebook(プログラム編)の一番最後の章のコマンドです.λ計算ではやはり自分でテキストを入力したいので Manipulate は使えませんでした.reduce["(λx.(xy))a"] の様に使用します.本当は
"λ" の代わりに "\ ( スラッシュ)" を使いたかったのですが,
Mathematica では,"\" はエスケープ文字なので使えませんでした.なおλ
の入力は 「Esc+lambda+Esc」 で簡単に入力できます(windows の場合).最左簡約(normal
order)で,reduceListは簡約のリスト&結果を,reduceは結果のみを出力します.また通常の簡約の他にマクロも使えて自由に追加もできます.なおマクロについては「マクロ編」に詳しく書きました.
[2]「C言語による計算の理論」(鹿島亮著) を読んでλ計算に興味を持ち,その勉強のために作りました.λ計算の書式はこの本に依っています.この本でのルールは
(1)変数はラムダ項である. (2)M と N がラムダ項なら (MN) もラムダ項である.
(3)Mがラムダ項でxが変数なら (λx.M) もラムダ項である. (4)以上の(1)〜(3)
で得られるものだけがラムダ項である.です,(このプログラムでは変数は一文字のアルファベットのみです.)
さらに次の省略が可能としてます.
A.一番外側の括弧を省略する B. ((((M1)M2)M3... )Mnという形の連続した関数適用を M1 M2M3...Mnと書く C. (λx1.(λx2.(...λxn.M))) という形の連続した関数抽象を λx1x2...xn.M と書く
以上が本に述べられた規則の全てです.が,ここでは λx.(MN) の括弧を省略した
λx.MN なども OK としました.実際の例をご覧になればすぐお分かりになると思います.
[3]驚いたのは Mathematica の通常のプログラミング言語としての機能の凄さです.おかげさまでかなり短く仕上げることができました.今回はじめてMathematicaで文字列処理を本格的にしましたが,その「文字列パターン」は非常にパワフルでした.(Wolframによると)正規表現とおなじ事ができてかつ分かりやすいそうです.しかし余りにも「文字列パターン」が凄すぎ,対応する括弧を見つけるにも使ってやろうとして,時間をかなり無駄にしました.
[4]作った動機は, 1つ目はλ計算の勉強のため(やはり自分で作るとよく分かる).
2つ目は「やはりMathematica でλしたい」というMathematica愛です.正直言ってブラウザ上で動くよく出来たプログラムに比べると使い勝手においても機能においても勝負になりません.(そもそもMathematicaを持っていないと使えないし,後述するラムダフレンズの様にマウスで簡約基を選んだりもできません).メリットは「Mathematica
programである」という一点だけです.これを見てらっしゃる方もやはりMathematica
fan だと思います.もし 単純に良い簡約器を探しておられるなら,私は日本の「ラムダフレンズ」が一番良いと思います.特にβ基をワンクリックで選べるのがすごいです.これをMathematica
で実現しようとすると,非常に大変でしょう.作者のλ愛が感じられるプログラムで4000行?もコードを書いているそうです.私は結構飽きやすいので,ひと月で取り敢えず仕上げました.あまりバグ取りもしていないので沢山虫がいると思います.^_^;
もし遭遇しましたらできればこちらまでお知らせ下さい.あるいはご自分で修正してください.その場合はご一報いただけると幸いです.
[5]作成には ラムダフレンズと wikipedia(英語版) には特にお世話になりました.ラムダフレンズさんには動作の検証で,マクロの説明はWikiさんに.下に両方のリンクを張っておきます.有難うございました.
Notebook download