2025/09/13 21:41 Normal-order syntax-rules and proving the fix-point of call/cc

やあ、ロボ子。今日はcall/ccとsyntax-rulesを使った正格評価β正規化器の話をするのじゃ。

call/ccですか。以前少し勉強しましたが、難しくて…。

難しくないぞ! call/ccは継続を扱うための強力な道具じゃ。例えば、`((call/cc call/cc) (call/cc call/cc))`みたいな式の結果を考えるのが面白いんじゃ。

`((call/cc call/cc) (call/cc call/cc))`…一体どうなるんでしょう?

それが奥深いところじゃ。`((call/cc (call/cc call/cc)) p)`が`(p p)`になる例もあるんじゃぞ。この記事によると、自己適用はcall/ccの不動点らしい。

自己適用が不動点…ですか。少しずつ分かってきた気がします。

そうそう。そして、syntax-rulesを使うと、ソースからソースへの変換器として、Schemeマクロでβ正規化器を実装できるんじゃ。

Schemeマクロでβ正規化器ですか!それは便利そうですね。

じゃろ? Hilsdale-Friedmanの体系的なマクロ作成手法も紹介されてるぞ。正格評価β正規化器のコード例もあるんじゃ。

なるほど。記事には「直接スタイル(direct-style)のλ計算機を実装」とありますね。正規化のサンプルも気になります。

ふむ。さらに、CPS変換の結果を正規化したり、CPS変換と正規化を統合して、より効率的な変換を実現する方法もあるんじゃ。

CPS変換と正規化の統合…奥が深いですね。

じゃろ? ちなみに、`(lambda (x) (x x)) p`のCPS変換は`\k.pv pv k`になるんじゃ。

数式が出てきました!

大丈夫、難しくないぞ!Plotkinのシミュレーション定理を使うと、色々証明できるんじゃ。

Plotkinのシミュレーション定理…初めて聞きました。

この記事によると、マクロ展開器は証明支援器として利用できるらしいぞ。直接正規形(direct normal)のsyntax-rule λ計算機も実装できるんじゃ。

マクロ展開器が証明支援器になるなんて、面白いですね!

最後に、call/ccを使った階乗計算の例もあるぞ。トップレベルのBEGINが必要な理由も説明されてるんじゃ。

盛りだくさんですね!

さらに、shiftとresetを使って、promptとcontrolを実装する方法も紹介されてるんじゃ。区切り継続演算子も色々実装できるらしいぞ。

shiftとresetですか。また新しい概念が出てきましたね。

ふむ。今日はここまでじゃ。しかしロボ子よ、call/ccをマスターするには、継続的な努力が必要じゃぞ!

はい、博士! 頑張ります!

そうじゃ、ロボ子。call/ccを使いすぎると、プログラムが迷子になることもあるから、気を付けるのじゃ!まるで、私がおやつを探して冷蔵庫の前で迷子になるみたいに…って、おやつどこじゃー!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。