チャーチ数で対数の世界を作る。
チャーチ数
0 1 2 3 4 5 ...
僕等が普段接している世界は自然数の世界だ。
0 0に1を足して1 0に1を足して1を足して2 0に1を足して1を足して1を足して3
ラムダ計算を生み出したチャーチは、自然数の世界を抽象的に捉えた。
xはzero xにfをしてone xにfをしてfをしてtwo xにfをしてfをしてfをしてthree
schemeに直すとこうだ。
(define zero (lambda (f) (lambda (x) x))) (define one (lambda (f) (lambda (x) (f x)))) (define two (lambda (f) (lambda (x) (f (f x))))) (define three (lambda (f) (lambda (x) (f (f (f x))))))
xにfを何回適用したか。というのがチャーチ数である。
自然数の世界
では、自然数の世界をあたえてみる。
(define (inc n) (+ n 1)) (define (to-s z) ((z inc) 0))
0を基準に、1を足した世界を与えてみた。
実際に見える状態となったので、表示してみる。
(to-s zero) ; 0 (to-s one) ; 1 (to-s two) ; 2 (to-s three) ; 3
展開すると、
0 ; 0 (+ 1 0) ; 1 (+ 1 (+ 1 0)) ; 2 (+ 1 (+ 1 (+ 1 0))) ; 3
こんな世界。
0に1を何回足したかで自然数を表わせた。
対数の世界を作る。
0に1を足す世界が自然数の世界だった。これじゃ面白くないので、1に10を掛けた世界を作りだそう。
(define (mul-10 n) (* n 10)) (define (to-s z) ((z mul-10) 1))
表示してみる。
(to-s zero) ; 1 (to-s one) ; 10 (to-s two) ; 100 (to-s three) ; 1000
何をやったのか?
展開してみる。
1 (* 10 1) (* 10 (* 10 1)) (* 10 (* 10 (* 10 1)))
要するに、
1に10を0回掛けたら1 1に10を1回掛けたら10 1に10を2回掛けたら100 1に10を3回掛けたら1000
そう、作り出したのはの世界だ。言い替えると、の世界。
つまり、対数の世界。
もちろん足し算や掛け算だって出来る。