church函数与区间算术

上一篇随笔漏了练习2.5和2.6,这边补充一下。
练习2.5要求证明如果能够将a和b的序对表示为乘积(2a)*(3b)对应的整数,我们可以只用非负整数和算术运算表示序对。
这个表述有点绕口,我最初理解为用(2a)*(3b)表示任意整数,但这是做不到的(在a和b都为非负整数的情况下);而如果是通过(2a)*(3b)的序对通过算术运算得到整数,又没有什么价值,只要让a、b都为0就可以了。
综上,这个题目的意思应该是有通过(2a)*(3b)计算得到的整数,需要确认a、b的序对。
那就是一个算术问题。

点击查看代码
;定义序对
(define (cons a b)
    (* (expt 2 a) (expt 3 b))
)
;数有几个2
(define (car x)
    (define (iter conuter numbera)
        (if ( = (remainder numbera 2) 0 )
            (iter (+ conuter 1) (/ numbera 2))
            conuter))
    (iter 0 x)
)
;数有几个3
(define (cdr x)
    (define (iter conuter numberb)
        (if ( = (remainder numberb 3) 0 )
            (iter (+ conuter 1) (/ numberb 3))
            conuter))
    (iter 0 x)
)

2.6 习题讲了church函数,主要通过以下两个函数:

点击查看代码
(define zero (lambda (f) (lambad (x) x)))
点击查看代码
(define (add-1 n)
    (lambda (f)(lambda (x)(f ((n f)x))))) 

这两个函数可以在完全没有数的情况下实现0和加一操作。
如果去试验的话,会发现这俩函数无法输出0,也没法输出n+1,那到底是啥意思?
想了半天,我理解church函数的意思就是执行对应次数的给定过程——0函数的意思是接受一个函数后,执行0次(输入什么参数就返回什么参数),n+1函数则是执行n+1次后返回。
在此背景下,定义one和two:

点击查看代码
(define one (lambda (f) (lambda (x) (f x))))
(define two (lambda (f) (lambda (x)(f (f x)))))
给出加法过程+的一个直接定义:
点击查看代码
(define (plus n m)
    (lambda (f)
        (lambda (x)
            ((n f) ((m f)x)))))

回归正题,关于区间算术,书中给了一个背景,在计算并联电路电阻时,需要公式R并=1/((1/R1)+(1/R2)),但电阻具有误差,R1=6.8±0.68,R2=4.7±0.235,因此需要通过各自电阻的上下限进行计算。
计算两个电阻的总区间,很显然是下限是各自的下限相加,上限也是各自的上限相加。

点击查看代码
(define (add-interval x y)
    (make-interval (+ (lower-bound x)(lower-bound y))
                   (+ (upper-bound x)(upper-bound y))))
书中缺失了make-interval的构造过程,以及上下限选择符的定义,很显然过程如下:
点击查看代码
(define (make-interval a b)
(cons a b))
(define (lower-bound x)
(car x))
(define (upper-bound x)
(cdr x))

练习2.8要求参考前面的过程,说明区间差怎么计算。根据上述的推理,这里的区间差和数学上的区间差(取共集)的内涵肯定是不一样的,应该就是两个区间之前取差值的集合。

点击查看代码
(define (sub-interval x y)
    (let ((p1 (abs (- (lower-bound x)(upper-bound y))))
          (p2 (abs (- (lower-bound x)(lower-bound y))))
          (p3 (abs (- (upper-bound x)(lower-bound y))))
          (p4 (abs (- (upper-bound x)(upper-bound y)))))
    (make-interval (min p1 p2 p3 p4)
                   (max p1 p2 p3 p4))))
posted @ 2025-12-09 19:59  檐上落白luckin  阅读(2)  评论(0)    收藏  举报