問題 2.6

(define zero (lambda (f) (lambda (x) x)))

(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x)))))

;これは問題のいみがわからないが、たぶん関数を作用させる数なんだろう。
;よってone,twoの定義は
(define one (lambda (f) (lambda (x) (f x))))
(define two (lambda (f) (lambda (x) (f (f x)))))


;ここで、
(define (inc x) (+ x 1))
((one inc) 0)
;-> 1

;でもこんなのなら、dowbleっていう関数をこの前つくったはずだ。
;1.41で
;(define (double f) (lambda (x) (f (f x))))
;また、1.43で
;(define (repeated f n)
;  (lambda (x) (f (if (<= n 1)
;                     x
;                     ((repeated f (- n 1)) x)))))
;というのも作ったし、
;(define two (lambda (f) (repeated f 2)))とかできるんじゃないか?
;数をつかってはいけないから駄目なのか...

;ではadd-1ってなんだ

(((add-1 one) inc) 0)
;-> 2

;なるほど

;プロセスをかんがえてみると、
;(((add-1 one) inc) 0)
;(((lambda (f) (lambda (x) (f ((one f) x)))) inc) 0)
;((lambda (x) (inc ((one inc) x))) 0)
;(inc ((one inc) 0))
;(inc (inc 0))
;-> 2

;ok,では加算手続きplus
;(((plus one two) inc) 0) -> 3
;とかなるものを作ればよい。

(define (plus n1 n2)
  (lambda (f) (lambda (x) ((n2 f) ((n1 f) x)))))

(((plus one two) inc) 0)
;-> 3

;できた。簡単だ。

;問題とは関係ないけど、加減乗除の減乗除はできるんだろうか??
;やってみる。

;まず掛け算が一番かんたんだろう。
(define (mul n1 n2)
  (lambda (f) (lambda (x) ((n1 (n2 f)) x))))

(((mul one two) inc) 0)
;->2

;できた。

;引き算

;これは難しい。
;もし、関数の始めの一回のみ無視するようにできる関数
;(minus-1 n)があったとするならば、

(define (minus n1 n2)
  (lambda (f) (lambda (x) ((((n2 minus-1) n1) f) x))))

;と定義できるだろう。

;では、(minus-1 n)は定義できないか。
(define (minus-1 n)
  (lambda (f)
    (lambda (x)
      (((n (lambda (p)
             (if p
                 (lambda (y) (f (p y)))
                 (lambda (y) y))))
        #f) x))))

(((minus-1 two) inc) 0)
;->1
;できた。
;プロセスを考えてみると、

#|
(((two (lambda (s)
         (if s
             (lambda (y) (inc (s y)))
             (lambda (y) y))))
  #f) 0)

(((lambda (s)
    (if s
        (lambda (y) (inc (s y)))
        (lambda (y) y)))
  (lambda (y) y)) 0)

((lambda (y) (inc ((lambda (y) y) y))) 0)

-> 1
|#

(define three (lambda (f) (lambda (x) (f (f (f x))))))
(define four (lambda (f) (lambda (x) (f (f (f (f x)))))))

(((minus three two) inc) 0)
;-> 1
(((minus four one) inc) 0)
;-> 3

;以上のがうまくいくとはおもわなかった
;プロセスが思考トレースできない。所詮は文系か...
;とりあえず動いているから良しとする。

;割り算
;ちょっと考えたが無理だ..
;考えついたらまたかく。