チャーチ数は、関数 f を x に何回適用したか、で数を表すらしい。 まずは0から、
- zero = λf.λx. x
1進めた数は succ で得られる
- succ = λn.λf.λx. f (n f x)
2つの数 m、n の足し算は、初期値 m にさらに n 回 f を適用すれば得られる
- plus = λm.λn.λf.λx. n f (m f x)
掛け算は、m の加算を n 回行う、ってことかな?
- mult = λm.λn.λf.λx. n (m f) x
ここまではなんとなくわかったんだけど、指数がどうして次のようになるのかわからない:
- exp = λm.λn. n m
手で展開してみる: exp 3 2
2 = λf.λx. f (f x) |
ちゃんと計算はできてる、けどなぜかはわからない…。 n に m を適用するってなんだ?
succ の逆に、-1 する pred もよくわからない:
- pred = λn.λf.λx. n (λg.λh. h (g f)) (λu. x) (λu. u)
引き算は、記述はもっともだけど
- minus = λm.λn. n pred m
なんで計算できるのかはわからない 。なぜかというと、Haskell でテストしようとしてもエラーが出てしまったから:
zero = \f x -> x |
コンパイルは通る:GHCi で
-- チェック用:チャーチ数を整数に変換 |
引き算で、2以上を引こうとすると無限エラーが出る:
> p (minus three zero) |
謎。
いろいろ資料:
- http://winnie.kuis.kyoto-u.ac.jp/~okuno/Lecture/04/IntroAlgDs/Church-numeral.html
- 第16回 すべてのものは関数である | 日経 xTECH(クロステック)
- ラムダ計算 - Wikipedia
- Church encoding - Wikipedia
- http://www5d.biglobe.ne.jp/~y0ka/2006-07-31-6.html
- http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20060423#p02
- The Untyped Lambda-Calculus
- http://blog.bugyo.tk/lyrical/2008/02/y_combinator.html S と K だけでなんでもできる
- 404 Blog Not Found:Y combinator is forbidden in Haskell!?