ラムダ計算セルフブログリレー3日目です. 今日は異常運転, くまちゃんです. 2日目はこちら.
kumachan-math.hatenablog.jp
あれ, 2日目をさっき書いた気がしなくもないんですけど, まあいいです. 昨日(確かに昨日, うん)は, ラムダ式の簡約について書きましたが, 今日はマクロと不動点結合子, 再帰関数を扱います.
マクロとは, ラムダ式であって自由変数を1つも持たないものをいいます.
3.1. ブーリアン
まず手始めに, を定義しましょう. if文には条件, then節, else節の3つがあればいいです. そこで,
と定義しておきましょう.
これに従うと, 条件であるブーリアンについて次が満たされていれば良いことがわかります.
- trueはthen節とelse節の2つを入力として, then節を返せば良い.
- trueはthen節とelse節の2つを入力として, else節を返せば良い.
すなわち,
とすればいいことがわかります.
さらに , , も一気に定義してしまいましょう.
この , だと, の評価結果に応じて, が評価されたりされなかったりします. すなわち, CやJavaでいうところの2重記号のand(&&)とor(||)に対応することになります. もし必ず両方評価されるもの, すなわち単体のand(&)とor(|)を定義しようとすると, 次のようになるでしょうか.
3.2. 整数
ブーリアンと論流演算が定義できたので, 次に整数と算術演算を定義しておきましょう.
...
は1を足す関数, はゼロだと思ってみてください.
このとき, とは次のように定義されます.
イメージ的には, 0に1をn回足したものに1をm回足せばmとnの和になるよねといった次第です.
はなんと括弧を付け替えただけです. イメージ的には0に「1をn足す操作をしたもの」をm回足す操作をしたものはmとnの積になるよねといった次第です.
最後に指数です. 指数は次のように定義されます.
超単純!ビビるこれはビビる!えーまあみていきましょう.
となります. これを踏まえると,
先のの定義のときにみたように, はを倍したものに対応したのですから, 上の式は
に対応しそうだということが想像できます.
次に確認しておくべきは, この漸化式の出発点
です.
したがって, はを表しうることがわかりました.
3.3. 不動点結合子と再帰関数
次に不動点結合子ですが, 結論からいきましょう.
命題3.1 不動点結合子
は符号点結合子である. すなわち, はの不動点を与え, を満たす.
証明 :
次に, 再帰関数を考えていきましょう. を整数を引数にとり1つ小さい整数を返すマクロとします. 定義は煩雑なので省略します. この時次のラムダ式を考えます.
ここで, は与えられた整数がなら, それより大きければ, を与えるマクロであって次で定義されます
整数の, すなわちゼロのところにを, , すなわち1を足す関数のところに, 問答無用でを返す関数を差し込んだものです.
さて, 上のを不動点結合子を食わせたものは, 階乗関数になります. それは簡単に確認することができます.
は[の不動点ですから,
ところが,
ですから, 結局
を得ました. と, こんな感じで, 不動点結合子を使うと簡単に再帰関数を表現できることになります.
3.4. フラグ回収
ここから先は, 著者と同じ講義を受けている人向けの内輪ネタです. はじめの方の講義で, 木構造を集合として扱ったことを覚えているでしょうか. 木構造を
で再帰的に定義していって,
と膨らませていったものは, の不動点になったのでした. これとラムダ計算の講義資料34ページをよーーーく見比べてみてください. 全く同じことを言っていることがわかるかと思います. さすが頭の良い教員だけあってこの辺りのフラグ建築が一級品ですよね.
演習問題もこれで解きやすくなるかもしれませんね. 発展課題って不動点関連でしたよね. 無限まで考えると不動点になるんですか? やってみましょうかね.
今日は以上です. 明日は, 型体型の話に入ります. それでは!