练习2.6 丘奇计数

Posted by
(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)

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注