理系学生日記

おまえはいつまで学生気分なのか

問題2-4

(define (cons x y)
  (lambda (m) (m x y)))

(define (car z)
  (z (lambda (p q) p)))

以上の定義によって(car (cons x y))がxを生じることの証明、なんていわれてもアレですね。証明恐怖症++。


consは「2変数引数の関数」を引数として、それに対してx、yを渡した結果を返す関数になっている。それじゃ(car (cons x y))が何をしているかというと、置き換えれば分かる。

(car (cons x y))
->((lambda (m) (m x y)) (lambda (p q) p))
->((lambda (p q) p) x y)
->(x)

carはconsに対して、2つの引数のうち後ろの引数を返すような関数を渡している。


というわけでcdrについては、前の引数を返すような関数を、引数としてconsに渡してやればいいので、

(define (cdr z)
  (z (lambda (p q) q)))

でおk。