2.1.3 資料意味著什麼
我們開始有理數的實現,在2.1.1部分,通過使用三個未特定的程式make-rat,numer,denom,
實現了add-rat,sub-rat等等.在那一點上,我們認為操作被定義在資料物件分子,分母和有理數。
它們的行為被這三個程式指定。
但是資料的準確的含義是什麼呢? 說能被指定的選擇子和組裝子實現的東西是不充分的。
這三個程式的集合是清楚的,不是隨意的。這個集合能作為乙個有理數的實現的合適的基礎。
我們需要保證的是,如果我們組裝了乙個有理數x,用整數n和d的數對,然後抽取x的分子和分母,
並且除它們,應該和n/d得到相同的結果。換句話說,對於任何整數n 和非0的整數d,如果x是
(make-rat n d),那麼 (numer x)/(denom x)=n/d.
在事實上,對於有理數形成乙個合適的基本的表示形式,它的唯一的條件是
make-rat,numer,denom滿足上述的公式。總之,我們能認為資料能被一些選擇子和組裝子定義。
以及為了成為乙個有效的表示方式,這些程式必須滿足特定的條件。
從這個視點,能嚴格定義的不僅是高層次的資料物件,例如有理數,也包括低層次的物件。
考慮一下數對的概念,這是我們用來定義有理數的。我們根本沒有說乙個數對是什麼。
僅僅是語言提供了運算元對的cons,car,cdr.但是關於這三個操作,我們僅需要知道,
如果我們要把兩個物件粘在一起,就使用cons,取出其中的物件,就使用car和cdr。
也就是說,操作滿足的條件是對於任何的x,y,如果z=(cons x y)那麼 (car z)=x
和(cdr z)=y。的確,我們提到的這三個程式是語言中的原生程式。
然而,任何其它的滿足上述條件的三個程式能被用來作為實現數對的基礎。這一點被如下的
事實所展現出來。這個事實就是我們能實現cons,car,cdr僅使用程式,而不使用任何資料結構。
這是如下的定義:
(define (cons x y)
(define (dispatch m)
(cond ((= m 0) x)
((= m 1) y)
(else (error "argument not 0 or 1 --- cons" m))))
dispatch
)(define (car z) (z 0))
(define (cdr z) (z 1))
這個程式的使用不符合我們對資料是什麼的直覺。然而,我們需要做的所有的顯示出
這是一種有效的表示數對的方式。驗證這些程式滿足上述條件。
注意到的微妙的一點是(cons x y)返回的值是乙個程式。是內部定義的程式dispatch.
這個dispatch需要乙個引數,返回x或者是y,依賴於引數是0或者是1。相對應的是,
(car z)被定義應用z,到0。因此,如果z是由(cons x y)形成的程式,那麼z應用到0,返回x.
所以我們顯示出(car (cons x y))返回x,正如預期那樣。相似的,(cdr (cons x y))應用
程式1,返回y. 因此 這個數對的程式實現是乙個有效的實現,如果我們訪問數對,僅使用
cons,car,cdr,我們不能區別這個實現和使用真實資料結構的那樣實現。
展示數對的程式化表示的要點不在於我們的語言以這種方式工作,而是它可以以這種方式工作。
(為了效率,scheme和lisp等系統直接實現數對) 。這種程式化表示,儘管有點奇怪,
但它是完美的,充分的表示數對的方式,因為它滿足了數對需要滿足的僅有的條件。這個例子也展示出
操作程式作為物件的能力,自動地提供了表示復合資料的能力。現在這可能似乎有一點奇特,但是資料
資料的程式化表示,在我們的程式設計領域中,起著核心的作用。 這種程式設計風格常常被叫做訊息傳遞,
在第三章中,當我們定位模型化和模擬的問題時,我們使用它作為乙個基本的工具。
練習2.4
這有乙個數對的可選的程式化表示。對於這個表示,對於任何的x和y物件,驗證
(car (cons xy ) 返回x.
練習2.5
如果我們要表示乙個數對,2^a和3^b的乘積,其中a和b的整數,顯示出我們能顯示非負整數的
數對僅使用資料和算術操作。給出car,cdr,cons程式的定義。
練習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)(提示使用評估(add-1 zero)的替換式子)
給出乙個加法的直接的定義(而不是乙個add-1的重複使用)
SICP學習筆記 2 1 3 資料意味著什麼
練習2.4 define new cons x y lambda m m x y define new car z z lambda p q p 使用代換模型,new car new cons x y 的變換過程如下 new car new cons x y new car lambda m m x...
Ubuntu PC意味著什麼?
5月1 日,世界 pc領導廠商 dell 經由 direct2dell 正式宣布 1 dell 與canonical 公司建立夥伴關係 2 dell 即將 ubuntu pc 此事,意味著什麼?自今年五月底起,ubuntu pc 在美國境內銷售 5 月2日,cnet 科技資訊網刊載文章,題為 二次擁...
生活意味著什麼?
生活主要是心態,就然我們在這個世界上,就要學著感恩,體會生活的美好,相信生活,路還很長,邊走邊看沿途的風景。史鐵生說,生活裡有些許問題本來就不是問題,存在即存在,沒有緣由。所以我們不要問我們為什麼存在這類的問題。生,很難.活,也很難.想要生活更難.如果你覺得天天都沒有意思的話,那我告訴你,你就是對自...