练习2.6 丘奇计数

sicp book math

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

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

刚看到这个定理的时候确实难以理解,花了一些时间去理解后,确实如题目表述的,如雷灌顶.

平时生活和学习上总是会把01234…定义为’’数字’’,但实际上他们只是一个符号,’’数字’’这个概念本来应该是抽象的,用01234….这些符号来表示目的是使这个抽象概念更加形象,但是使用过多后会造成一种定势,使我们认为’’数字’’就是这些符号,这也就是我一时半会儿没看明白这几行代码的原因.

练习2.6就是在重新告诉我们到底什么才是’’数字’’,数学的运算符号又是什么.

我们总是认为’’0’’表达的就是零,实际上许多’’东西’’也可以表达零这个概念,比如说一个没有水的空瓶子就可以表达零,在河流里的一条鱼可以表达一,等等.

练习2.6表达的是,有一个过程,和一个’’东西’’.这个过程在这里叫做f,这个’’东西’’叫做x.如果不对x进行f操作,那么就可以表达零的概念.对一个对象n进行一次f,也就是在对象n上加一了(add-1).

那么one的定义就是(add-1 zero),只需要将(zero)带入(add-1 n),进行展开简化.

(define one
(lambda (f)
(lambda (x)
(f x))))

那么two的定义就是运用两次(add-1( add-1 zero ))

(define two
(lambda (f)
(lambda (x)
(f (f x)))))

对于加法,( plus n m ) 就是在调用n次的基础上再调用m次.

(define (plus first second)
(lambda (f)
(lambda (x)
(( first f )
(( second f ) x)
)
)
)
)

我们还可以将这种定义方法再具体化一些,使它能够表达出我们日常中习惯的’’数字’’概念.实际上这种做法是对这一高级定义的一个弱化.只需要将真是存在的一个过程f和x传送给它.就可以看到我么习惯的数字概念了.比如说这里定义的一个输出过程foo,在((one foo)’1)里就是进行一次输出,在(( ( plus one two) foo ) ‘1)里就是先进行一次加法后再进行输出.

(define (foo x)
(display “哈”))
(( ( plus one two) foo ) ‘1)

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

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

(define one
(lambda (f)
(lambda (x)
(f x))))

(define two
(lambda (f)
(lambda (x)
(f (f x)))))

(define (plus first second)
(lambda (f)
(lambda (x)
(( first f )
(( second f ) x)
)
)
)
)

(define (foo x)
(display “哈”))
(( ( plus one two) foo ) ‘1)