チャーチ数で対数の世界を作る。

チャーチ数

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

そう、作り出したのは10^nの世界だ。言い替えると、\log_{10}nの世界。

つまり、対数の世界。

もちろん足し算や掛け算だって出来る。

まとめ

自然数の世界を抽象的にしたら対数の世界も作り出すことも可能になった。

チャーチ数おもろいね。