SICP

SICP を読んでみる #34 第二章 p.52

今日から復習も兼ねて MIT の SICP コースのムービーもみてみることにしました。
とりあえずは一日一本、学習がおわっているところまでみてみるつもりです。

ムービーをみた感じ、授業では SICP の中の細かいところまでは突っ込んでいない感じです。自分が理解する範囲も SICP で言及されている内容が最大で、そこから外れている部分は目を瞑るっていう感じがいいのかも。問2.6 であれば SICP で提示されている add-1 の導出まで手をつけるのはやりすぎたかなという感じ。

問題解答

問2.6
今日こそは片をつけたい Curch 数。

SUCC の求め方についてはひとまず横に置いておいて、問題に集中する。

・(zero と add-1 を使わずに)one と two を直接定義せよ.

(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))))))

・(add-1 の繰り返し作用させず)加算手続き + を直接定義せよ.

結局わからなかったので先人の知恵を拝借しつつ回答。

a+b
((two inc) ((three inc) 0))

three を計算した結果に two 追加して演算する : (f f) (f f f)

a*b
((two (three inc)) 0)

(three inc) という関数を用いて two という演算をする : (f f f) (f f f)

b^a
(((two three) inc) 0)

three という関数を用いて two という演算をする : ((f f f) (f f f))

言語化するともやっとする。ちゃんと理解できていないんだろうなぁ。

(define (sum a b)
  (lambda (f) (lambda (x) (a f) ((b f) x))))

(((sum two three) inc) 0)

(define (pow a b)
  (lambda (f) (lambda (x) (((b a) f) x))))

(((pow two three) inc) 0)

(define (mult a b)
  (lambda (f) (lambda (x) ((a (b f)) x))))

(((mult two three) inc) 0)

とりあえず課題はおわり。ただ、全く消化しきれている気がしない。
λ計算と展開あたりがかなりダメな予感。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です