2009-05-05 17 views
1

SICP(例2.6)では、以下の関数は「番号なしで取得」の方法として記述されています。私はこれを理解しようとしている。開始点として、これらの関数はどのように起動されますか?出力が1になる何らかの方法で実際に適用できますか? (?それとも他の番号)SICPからスキーム番号関数を呼び出すには

(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 
> 
+0

あなたはhttp://en.wikipedia.org/wiki/Lambda_calculus#Arithmetic_in_lambda_calculusを見てwan'tかもしれません –

答えて

3

、それは完全に番号を置き換えます機能付きのタイプ。

したがって、0の関数があり、add-1を呼び出すと1は得られません。1を表す別の関数が得られます。生成される関数は、基本的な算術公理それらは自然数と等価です

9

数字を表すこれらの関数は、教会の数字(SICP州として)と呼ばれます。それらの存在は、ファーストクラスのオブジェクトとして数値を持たずに計算システム(ラムダ計算など)を定義できることを意味します。代わりに関数をプリミティブオブジェクトとして使用できます。この事実は主に理論上の関心事である。教会の数字は実用的な計算には適していません。

教会の数字の定義の正確さは、他のオブジェクトと一緒に引数として適用することでわかります。関数fにnを表す教会数字を適用すると、引数nにfを適用する別の関数、たとえばn = 3のf(f(f)))が得られます。

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

ペンローズは皇帝の中でこれを含み新しい心、別のフォントを使うのは単なる言い訳だと思う。 (本ではアウトライン書体の数字として "ゼロ"と "1"を表しています) –

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 
関連する問題