フィンチの嘴

今日はジョナサン・ワイナー『フィンチの嘴』(ハヤカワ文庫)を読み終わった. 生物学の専門書ではなくピュリッツァー賞を受賞するような本だから, そのデータの解釈が本当にその記述で科学的に妥当なのかどうか疑問に思うことが多々あった. ただ, 進化論を一般に向けて語った本としてはエキサイティングなので, いろいろ思うこともある. 異なるモデル生物の話を切り貼りするのでただのSFにしかならないけれど, そのデータの背後には実はこういう数学的・情報学的・分子生物学的・遺伝的背景があって… というネタは貯まりに貯まっているので, a fictional story inspired by scientific backgroundsぐらいは作られそう.

 

ところで, この自然数nに対してある2分木を返すSchemeの関数ct, 何をしたいのか分かりますか? 今日作って感動しました.

 

(define (node t1 n t2)

  (list 'Node t1 n t2))

 

(define (emp? t) (equal? t 'Emp))

 

(define (left t)

  (if (emp? t) 'Emp

      (car (cdr t))))

 

(define (nvalue t)

  (if (emp? t) 'Emp

      (car (cdr (cdr t)))))

 

(define (right t)

  (if (emp? t) 'Emp

      (car (cdr (cdr (cdr t))))))

 

(define (tm f t)

  (if (emp? t) 'Emp

      (node (tm f (left t)) (f (nvalue t)) (tm f (right t)))))

 

(define (pow n m)

  (if (zero? m)

         1

        (* n (pow n (- m 1)))))

 

(define (ct n)

  (if (= n 1) (node 'Emp 0 'Emp)

  (node (tm (lambda (x) (+ x (- (pow 2 (- n 1)) 1))) (ct (- n 1)))

   (- (pow 2 n) 2)

   (ct (- n 1)))))