SICP 習題2 6之丘奇數

2021-07-11 13:15:57 字數 2301 閱讀 4580

最近一直在閱讀《sicp》,然後下午做其中的習題2.6,對其題意很不理解,於是搜尋了相關資料,不禁如題設所說感到如雷灌頂,特此記錄下來,以供大家閱讀和交流

題目

如果覺得將序對表示最為過程還不足以令人如雷灌頂,那麼請考慮,在乙個可以對程式做各類操作的語言中,我們完全可以沒有數(至少在只考慮非整數的情況下),可以將0和加一操作實現為:

(define zero (lambda

(f)(lambda

(x) x)))

(define

(add-1 n)

(lambda

(f)(lambda

(x)(f

((n f) x)))))

丘奇數

說實話,我一直沒有看懂題目中關於zero和add-1的定義,於是我搜尋了相關資料。下邊就結合資料談一下它的概念。

首先要明確的是丘奇數中的zero,one等並不等同於數值上的0,1,2。你可以理解為它是零這個概念的一種表現形式。換句話說,它就是零的函式式表現形式。我們先來看一下丘奇數中zero,one和two的表現形式

(define zero

(lambda

(f)(lambda

(x) x)))

(define one

(lambda

(f)(lambda

(x)(f x))))

(define two

(lambda

(f)(lambda

(x)(f

(f x)))))

我們會發現zero,one和two都是乙個函式,它接收(f)作為引數,其結果是乙個接收(x)作為引數的函式。大家可能需要注意的是,(f)在這裡顯然也是乙個函式,在lisp中函式是可以作為輸入引數的。然後我們會發現zero,one和two的區別好像就是(f)函式被使用的次數。zero中(f)沒有被使用,one中(f)使用了一次,two中(f)使用了兩次,對就是這個次數來表示0,1,2的概念。

我們可以實驗一下檢驗一下

(define

(inc n)

(+ n 1))

> ((zero inc)0)0

> ((zero inc)1)1

> ((one inc)1)2

> (((add-1 one) inc)

1)3

我們定義乙個過程inc就是數值意義上的加一,然後使用zero,one和add-1發現確實如同我們所想的,zero表示inc過程不會被使用,返回原數值;one表示inc被使用一次,返回加一的數值。

替換法求two

我們來使用替換法通過add-1和zero來求解one吧。

(add-1 zero)

;展開add-1定義

(lambda

(f)(lambda

(x)(f

((zero f) x))))

; 替換zero

(lambda

(f)(lambda

(x)(f

((lambda

(x) x) x))))

; 簡化因為((lambda (x) x) x)就等於x

(lambda

(f)(lambda

(x)(f x)))

加法定義

首先我們要明白丘奇數加法的含義,我們先記其加法為add-church,那麼如下**所示,最後乙個過程得出的值應該是多少呢?

> ((one inc)1)2

> ((two inc)1)3

> (((add-church one two) inc)

1)?

根據猜測,應該是4吧。因為one表示inc對1這個數值使用一次,two標示使用兩次,那麼將二者加起來,那麼就應該是three的含義啦,就是表示inc對1這個數值使用3次,那麼就是4啦。

add-church的實現如下

(define

(add-church m n)

(lambda

(f)(lambda

(x)((m f)

((n f) x)))))

如果你將其與add-1進行對比,你會發現add-1中的f變成了(m f),如果吧add-1中的f記住(one f),你可能就會更加理解。那麼你就會想add-m是如何標示的呢?

參考資料

SICP練習 26 練習1 32

練習1.32 因為遞迴比迭代要更容易實現,因此我先考慮的遞迴。先將sum和product都列出來。define sum term a next b if a b 0 term a sum term next a next b define product term a next b if a b 1...

SICP練習 26 練習1 32

練習1.32 因為遞迴比迭代要更容易實現,因此我先考慮的遞迴。先將sum和product都列出來。define sum term a next b if a b 0 term a sum term next a next b define product term a next b if a b 1...

SICP練習 47 練習2 6

練習2.6 如果這道題還沒有做的請務必要先自己思考並檢驗。如果沒有能夠求出來,也可以在看完我推導的one之後自己再來推導two。一開始我也不懂題目中的兩個式子是什麼意思,甚至連怎麼用都不知道。但我猜測到是不是可以用這兩個式子來構造出one,以及two,還有後面的無數多個。既然有了想法,那麼就開工吧。...