1

SICP(例2.6)では、次の関数は「数字なしで通り抜ける」方法として説明されています。私はこれを理解しようとひっかきます。出発点として、これらの関数はどのように呼び出されますか?出力が1になるような方法で実際に適用できますか?(または他の番号?)

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

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

私の最初の試みは成功していません:

Welcome to DrScheme, version 4.1.5 [3m].
Language: Simply Scheme; memory limit: 128 megabytes.
> (add-1 (zero))
. . procedure zero: expects 1 argument, given 0
> (add-1 zero)
#<procedure>
> (add-1 1)
#<procedure>
> ((add-1 1))
. . #<procedure>: expects 1 argument, given 0
> 
4

3 に答える 3

9

数字を表すこれらの関数は、チャーチ数字と呼ばれます(SICP が述べているように)。これらが存在するということは、第一級のオブジェクトとして数値を持たなくても、計算システム (ラムダ計算など) を定義できることを意味します。代わりに、関数をプリミティブ オブジェクトとして使用できます。この事実は、主に理論上の興味深いものです。教会数字は、実際の計算には適していません。

他のオブジェクトを引数として適用することにより、教会の数字の定義の正確さを確認できます。n を表す教会数を関数 f に適用すると、f をその引数に n 回適用する別の関数が得られます。たとえば、n=3 の場合、f(f(f(x))) です。

> (define (double x) (* 2 x))
> (zero double)
#<procedure>
> ((zero double) 1)
1
> ((zero double) 100)
100
> (define one (add-1 zero))
> ((one double) 1)
2
> ((one double) 100)
200
> (define (cons-a x) (cons 'a x))
> ((zero cons-a) '())
()
> (((add-1 one) cons-a) '(1 2 3))
(a a 1 2 3)
于 2009-05-05T20:53:03.157 に答える
3

これは元のラムダ計算であり、数値を生成せず、数値型を関数に完全に置き換えます。

したがって、「ゼロ」関数があり、それを呼び出すadd-1と、1 は得られず、1 を表す別の関数が得られます。ポイントは、生成された関数が基本的な算術公理に準拠しているということです。自然数に相当

于 2009-05-05T20:52:33.000 に答える
0
(define (as-primitive-num church-num)
    (define (inc a) (+ a 1))
    ((church-num inc) 0))

;testing:
(define one (add-1 zero))
(define two (add-1 one))

(display (as-primitive-num one)) (newline)
(display (as-primitive-num two)) (newline)

そして出力:

    1
    2
于 2012-09-06T10:32:43.580 に答える