<jupyter_start><jupyter_text>練習問題2.6ペアを⼿続きとして表現するという考え⽅で頭がごちゃごちゃになっていないとしたら、次のようなことを考えてみよう。  ⼿続きを扱うことができる⾔語では、(少なくとも、⾮負整数に関する限りは) 数値なしでもやっていける。そのためには、0 と、1 を⾜すという演算を次のように実装する。    (define zero (lambda (f) (lambda (x) x)))    (define (add-1 n)        (lambda (f) (lambda (x) (f ((n f) x)))))この表現は、発明者の Alonzo Church にちなんで**チャーチ数**(Church numeral) として知られている。  Alonzo Church はλ-演算を発明した論理学者である。    one と two を直接 (zero と add-1 を使わずに) 定義せよ  (ヒント：置換を使って (add-1 zero) を評価する)。  加算⼿続きの直接的な定義 +(add-1 の繰り返し適⽤は⽤いない)を与えよ。<jupyter_code>(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n)
    (lambda (f) (lambda (x) (f ((n f) x)))))
; チャーチ数がよくわからないので、
; 動かしてみて結果から考えてみる。
(define (func x)
      (begin
        (display x)
        (+ x 1)
    )
  )

((zero func) 0)
;(dispaly ((zero func) 0))
(newline)

(define one (add-1 zero))
((one func) 0)
;(dispaly ((one func) 0))
(newline)

(define two (add-1 one))
((two func) 0)
;(dispaly ((two func) 0))
(newline)

(define three (add-1 two))
((three func) 0)
;(dispaly ((three func) 0))
(newline)<jupyter_output>0
01
012<jupyter_text>上記の結果より、チャーチ数は以下のように考えられる。zero  → 引数に与えた手続きを1度も実行しない。  one   → 引数に与えた手続きを1度実行する。  two   → 引数に与えた手続きを2度実行する。  three → 引数に与えた手続きを3度実行する。<jupyter_code>(define (func x)
      (begin
        (display x)
        (+ x 1)
    )
  )
; oneとtwoを直接定義
(define one 
    (lambda (f) (lambda (x) (f x))))
;(display ((one func) 0))
((one func) 0)
(newline)

(define two 
    (lambda (f) (lambda (x) (f (f x)))))
;(display ((two func) 0))
((two func) 0)
(newline)

(define three
    (lambda (f) (lambda (x) (f (f (f x))))))
;(display ((three func) 0))
((three func) 0)
(newline)
(define (add a b)
    ;(lambda (f) (lambda (x) ((a (b (f x))))))  ; 実行エラーになる
    ;(lambda (f) (a (b f)))  ; これだとaの分のlambda式が増えない
    ;(lambda (f) ((a f) (b f)))   ; 実行エラーになる
    (lambda (f) (lambda (x) ((a f) ((b f) x))))  ; 実行結果が1多い
    ;(lambda (f) (lambda (x) ((a f) (b (f x)))))
  )
((one func) 0)
(newline)
((two func) 0)
(newline)

(define three (add one two))
((three func) 0)
(newline)
(define (func x)
      (begin
        (display '0)
        ;(display x)
        ;(+ x 1)
        ()
    )
  )

(define x (add one two))
;(display ((x func) 0))
((x func) 0)
(newline)

(define x (add two one))
;(display ((x func) 0))
((x func) 0)
(newline)

(define x (add x two))
;(display ((x func) 0))
((x func) 0)
(newline)

((zero func) 0)
(newline)

((one func) 0)
(newline)
((two func) 0)
(newline)<jupyter_output>000
000
00000

0
00
{'fraction_non_alphanumeric': 0.19853836784409257, 'fraction_numerical': 0.027202598457166056, 'mean_word_length': 3.64030131826742, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '503206', 'license': 'CC0-1.0', 'n_tokens_mistral': 1405, 'n_tokens_neox': 1320, 'n_words': 317, 'path': 'exercises/2.06.ipynb', 'repo_name': 'tokits/sicp-study', 'size': '2463'}