KI U D LI U PH C H P If worms have the power of acquiring some notion, however rude, of the shape of an object and of their burrows, as seems to be the case, they deserve to be called i
Trang 3CH NG III KI U D LI U PH C H P
If worms have the power of acquiring some notion, however rude, of the shape of an object and of their burrows,
as seems to be the case, they deserve to be called intelligent
Charle R Darwin (Vegetable Mould, 1881)
i u d li u ph c h p trong Scheme g m ki u chu i (string), ki u vect (vector), ki u b đôi (doublet), ki u danh sách Ngoài ra, Scheme còn m t s ki u d li u ph c h p khác
(data abstraction)
III.1 Ki u chu i
”Cha`o ba.n !”
> ”Cha`o ba.n !”
(display ”two \”quotes\” within.”)
> two ”quotes” within
Th vi n Scheme có hàm string cho phép ghép liên ti p các ký t thành m t chu i : (string #\S #\c #\h #\e #\m #\e)
> ”Scheme”
(define greeting ”Scheme ; cha`o ba.n !”)
; Chú ý d u ; trong m t chu i không có vai trò là d u chú thích
Trang 4> Chuoi ”Scheme ; cha`o ba.n ! ” co do dai 21
V t string? dùng đ ki m tra ki u chu i :
s là char, n u không n i dung c a chu i s không đ c xác đ nh
(string-length str)
(string-ref str k)
Tr v ký t th k c a chu i str Giá tr c a k ph i h p l
(string-set! string k char)
t giá tr ký t th k c a chu i str b i char Giá tr c a k ph i h p l
Các v t so sánh chu i :
(string=? str str )
Trang 5(string<? str 1 str 2)
(string>? str 1 str 2)
(string<=? str 1 str 2)
(string>=? str 1 str 2)
tr v #t n u th a mãn quan h th t t v ng =, <, >, <=, >= gi a các chu i (có phân bi t
char-ci>?, char-ci<=?, và char-ci>=?
(string-set! s2 j (string-ref s1 i)))))
(my-substring "Hello, World!" 7 12)
> ”World”
Trong hàm my-substring s d ng c u trúc l p do có cú pháp nh sau :
(do ((var 1 init 1 step 1 )
)
(test expr .) command )
Trang 6C u trúc l p do ho t đ ng t ng t nh l nh do trong các ngôn ng m nh l nh : bi n
có th có ki u b t k , không hoàn toàn ký t M i ph n t c a vect l i có th là m t vect ,
> ’#(”Kiki” ”Kiki” ”Kiki”)
Trang 7III.3 Ki u d li u b đôi
đ c t (specification) b i 4 thành ph n : tên ki u d li u tr u t ng (types), các đ nh ngh a
ph n sau mô t ng ngh a
Thành ph n functions li t kê các khuôn m u hàm (function pattern) M i khuôn m u
đ nh c a hàm M t l i g i hàm không tuân theo đi u ki n đ u đ u d n đ n sai sót (chia cho 0,
(create-rat n d) là m u s d≠0 Thành ph n preconditions có th v ng m t n u
đ y đ và d hi u M i v n d ng hàm có d ng m t m nh đ lôgích h p th c luôn có giá tr
nh C, Pascal
phép toán s h c trên các s nh +, −, *, nh ng ta l i không bi t cách bi u di n chúng
types nat
functions
0 : -> nat ; 0 là s t nhiên đ u tiên, là m t h ng (constant)
+ : nat × nat -> nat
– : nat × nat -> nat
* : nat × nat -> nat
^ : nat × nat -> nat
= : nat × nat -> boolean
Trang 8axioms var X, Y : nat
doublet đ c đ c t nh sau :
types doublet
functions
axioms var a, y : any
Trang 9V t eq? hay đ c dùng đ ki m tra hai b đôi có đ ng nh t v i nhau không Th c ch t,
eq? ki m tra tính đ ng nh t c a hai con tr
Ng ngh a c a hàm này nh sau :
axioms var x, y : doublet ; a, b : any
(x = cons(a, b)) ∧ (y = x) ⇒ (eq?(x) = eq?(y))
Trang 10(eq? x (cons 1 2))
> #f
Nh cons, car, cdr, ta đã đ nh ngh a các b đôi nh là d li u s c p T đó, ta có th
hàm đ t bi n (mutator functions) Gi s ki u b đôi đ c t o ra t hai ki u d li u nào đó
và set-cdr! đ c b sung vào ph n đ c t hàm nh sau :
functions
set-car! : doublet(T1, T2) × T1 → any
set-cdr! : doublet(T1, T2) × T2 → any
Ng ngh a c a các hàm này nh sau :
axioms var x : doublet(T1, T2) ; a, a1 : T1, b, b1 : T2
(x = cons(a, b)) ∧ (set-car!(x, a1)) ⇒ (car(x) = a1)
Ki m tra giá tr c a con tr x :
x
> (3 4)
Trang 11III.3.4 ng d ng b đôi
1 Bi u di n các s h u t
Gi s ta c n xây d ng m t t p h p các hàm cho phép x lý các s h u t nh : c ng (+),
types rational
functions
create-rat : integer × integer −> rational
v t s (numerator) và denom tr v m u s (denominator) c a s h u t là các hàm ti p
nh n Hàm =rat là hàm ki m tra hay chuy n ki u, ki m tra n u hai s h u t là b ng nhau
Khi r là m t s h u t , r=n/d, thì t s c a r là n và m u s là d≠0 Hai s h u t
r1=n1/d1 và r2=n2/d2 b ng nhau khi và ch khi n1.d2 =n2/d1
axioms Ví d các đ nh ngh a trong Scheme sau đây tuy đúng đ n v m t cú pháp, nh ng
Trang 12(define (numer r) (car r))
ng v i các phép toán +, −, *, / ) và hàm chuy n m t s h u t thành s th c rat->real
đ b sung vào ki u d li u tr u t ng rational nh sau :
functions
(create-rat (* (numer x) (numer y))
(* (denom x) (denom y))))
(define (/rat x y)
(create-rat (* (numer x) (denom y))
(* (denom x) (numer y))))
; chuy n m t s h u t thành s th c :
(define (rat->real r) (/ (numer r) (denom r)))
Trang 13− X lý các phép toán trên các s h u t : +rat, -rat, *rat, /rat, =rat
− X lý s kh i trên các s h u t : create-rat, numer, denom
(define (create-rat n d)
(define g (gcd (abs n) (abs d)))
; Chú ý hàm th vi n gcd (greatest common divisor)
(cons (quotient n g) ( quotient d g)))
(define (numer r) (car r))
create-rat v a trình bày là đáng tin c y vì tr c khi g i chúng, ta đã gi thi t r ng đi u
D phòng và kh c ph c nh ng sai sót có th x y ra, trong khi l p trình hay trong quá
Trang 142 Bi u di n hình ch nh t ph ng
pháp l p trình c u trúc : c g ng trì hoãn vi c khai báo d li u trong ch ng m c có th ) Ta xây d ng hàm cons-rectangle đ t o m i m t hình ch nh t theo các thành ph n x, y, y,
H T m t cách bi u di n trong nào đó c a hình ch nh t, ta c n xây d ng các hàm ti p c n
đ n các thành ph n này là value-x, value-y, value-L, value-H Các hàm này th c
(define (in? xo yo R)
(let ((x1 (value-x R))
((y1 (value-y R)) ((L (value-L R)) ((H (value-H R))) (and (<= x1 xo) (<= y1 yo)
(<= xo (+ x1 L)) (<= yo (+ y1 H)))))
Trang 15Bây gi xây d ng v t (inclus? R1 r2) đ ki m tra hình ch nh t R1 có n m bên
(define (inclus? R1 R2)
(let ((x1 (value-x R1))
((y1 (value-y R1)) ((L1 (value-L R1)) ((H1 (value-H R1))) (and (in? x1 y1 R2)
(cons (cons x y) (cons L H)))
(define (value-x R) (car (car R)))
(define (value-y R) (cdr (car R)))
(define (value-L R) (car (cdr R)))
Trang 16III.4.1 Khái ni m danh sách
Friday, Saturday và Sunday thành m t t h p d li u, ng i ta s d ng c u trúc danh sách có
d ng m t s-bi u th c nh sau :
(mon tue wed thu fri sat sun)
(define week-list)
(mon tue wed thu fri sat sun))
> *** ERROR-unbound variable: mon
thì ta g p l i s sai sót v các ký t Scheme xem danh sách này nh là m t l i g i hàm có tên mon v i các tham đ i là tue, sun và, nh đã th y, ta ch a h đ nh ngh a hàm mon
(define week-list
’(mon tue wed thu fri sat sun))
các bi u th c s h c, bi u th c ch a các d li u ký hi u, hay ch a các danh sách l ng nhau
r ng giá tr c a nó chính là v n b n (text) t o ra nó Bi u th c tr c ki n có vai trò là m t
h ng :
> ’(1 2 2 3)
’(one + two = three) ; là m t danh sách g m 5 ký hi u tu ý
> (one + two = three)
Trang 17’() ; danh sách r ng (empty list) không có ph n t nào
(12h an-trua)) (chieu
(14h tham-gia-chuyen-de) (16h den-cuoc-hen))))
d ng các danh sách không thu n nh t (heterogeneous list) v ki u Ch ng h n :
toàn các ký hi u, v.v Th t c a các ph n t xu t hi n trong m t danh sách là có ý ngh a
sách con (sub-list) là m t ph n t c a danh sách đã cho Ph n t này có th là m t danh
sách, hay là m t danh sách con c a m t danh sách con
Ví d , danh sách :
’(a (b c) () ((c)) d)
có các danh sách con là : (b c), (), ((c)) và (c) M t danh sách không có danh sách
này không trong m t danh sách con
a, (b c), (), ((c)), c
đ c đ t m c n-1
sâu (depth) c a m t danh sách là m c c a m t ph n t m c cao nh t Ch ng h n
Trang 18(length ’((a b) (c d) () (e)))
T là ki u ph n t c a danh sách :
types list(T)
functions
() : list(T)
cons : T × list(T) -> list(T)
III.4.2.1 Các phép toán c b n cons, list, car và cdr
Scheme s d ng b xây cons đ t o m t danh sách :
Trang 19(list <e 1 > <e N >) =
(cons <e 1 > (cons <e 2 > (cons <e N > ’()) ))
Trang 20-V i quy c d u g ch trên tên ch đ nh giá tr c a m t bi u th c Trong Scheme, car hay cdr
(define head car)
(define tail cdr)
> (vendredi samedi dimanche)
S đ đ quy tuy n tính :
(define (<fname> <arg>)
(if (null? <arg>)
<init-val>
(<func> (car <arg>) (<fname> (cdr <arg>)))))
S đ l p :
(define (<fname> <arg>)
(define (<i-name> <arg> <result>)
(if (null? <arg>)
Trang 21III.4.2.2 Các hàm x lý danh sách
functions
append : ist(T) × list(T) -> list(T)
1 Các hàm length, append và reverse
Hàm length tr v đ dài c a danh sách đ c đ nh ngh a nh sau :
Hàm append nh n m t s tham đ i tùy ý, m i tham đ i có giá tr là m t danh sách đ
append đ c đ nh ngh a nh sau :
(define (append L1 L2)
(if (null ? L1)
L2 (cons (car L1) (append (cdr L1) L2)))) Hàm append có chi phí tuy n tính theo L1 Ví d :
Trang 22(append (list 1 2 3) (list 4 5 6 7))
(reverse ’(dog cat cock duck pig))
’(pig duck cock cat dog)
(reverse (list 1 2 3))
> (3 2 1)
(reverse (append ’(a b) ’(c d)))
> '(d c b a)
reverse vi t l i là :
(append (reverse (cdr L)) (car L)))) ; quên đ t ti n t list
thì s gây ra l i sai vì (car L) là m t ph n t , không ph i là m t danh sách Ta có th
(reverse (list 1 2 3 4))
> (4 3 2 1)
Chi phí c a hàm reverse v n tu thu c tuy n tính vào L
2 Các hàm tham chi u danh sách
(list-ref L n)
(list-tail L n)
(list? L)
Trang 23Hàm (list-ref L n) tr v ph n t th n c a danh sách L, v i quy c r ng trong
Trang 24Hàm (string->list str) chuy n m t chu i thành m t danh sách Hàm này có th
đ c đ nh ngh a nh sau :
(define (tring->list str)
(do ((i (- (string-length str) 1) (- i 1))
(ls ’() (cons (string-ref str i) ls))) ((< i 0) ls)))
Hàm (list->string L) chuy n m t danh sách thành m t chu i Hàm này có th
đ c đ nh ngh a nh sau :
(define (list->string ls)
(let ((s (make-string (length ls))))
(do ((ls ls (cdr ls)) (i 0 (+ i 1))) ((null? ls) s)
(string-set! s i (car ls))))) (list->string ’())
Hàm (string->number str [radix]) chuy n m t chu i str thành m t s h
Trang 25V t atom? ki m tra n u m t s-bi u th c không ph i là m t danh sách :
tr l i m t ph n c a danh sách L ch a ph n đ u tiên (first ocurrence) c a giá tr s, ho c tr v
#f n u danh sách L không có S so sánh đ c th c hi n nh ki m tra equal? :
(member ’(b) ’(a b c d))
> #f
(member ’(b) ’(a b c (b) d))
> ((b) d)
s , s d ng = và đ so sánh các ký hi u, s d ng eq? Scheme có ba hàm so sánh ho t đ ng
nh sau :
member s d ng phép ki m tra equal?
Trang 26III.4.2.3 D ng case x lý danh sách
n u giá tr cúa s thu c v danh sách L2, v.v
Trang 27nhau c n c vào giá tr delta :
delta > 0, hai nghi m th c phân bi t : (real x1 x2)
delta = 0, nghi m kép :(double x)
delta < 0, nghi m ph c : (complex realpart imaginarypart)
(list ’complex (- b) delta2root)))))) không l n l n các tính toán v i các k t qu in ra, ta vi t th t c solution-
(define (solution-display solution)
(case (car solution)
((real) (display ”2 real roots: ”)
(display (cadr solution)) (display ” and ”)
(display (caddr solution))) ((double) (display ”1 racine reelle double: ”)
(display (cadr solution)))
Trang 28(else (display ” 2 racines complex conjuguees: ”)
(display (cadr solution)) (display ” +/- i ”)
(display (caddr solution))))
> 1 racine reelle double: -1
III.4.2.4 K thu t đ quy x lý danh sách ph ng
đ quy b ng cách chuy n phép tính hàm v tham bi n cdr c a danh sách Sau đây, ta xét
1 Tính t ng các ph n t c a m t danh sách
t c a Lnb sao cho khi danh sách r ng, giá tr tr v là 0 ?
Trang 294 Hàm append có hai tham đ i
Gi s ta không s d ng hàm append ti n đ nh mà t xây d ng m t hàm khác nh hàm
Trang 30(remove ’a ’(a b c a d))
> (b c d)
6 Bài toán tính t ng con
(goodcount (- N (car Lnb)) (cdr Lnb)))) (if partresult
(cons (car Lnb) partresult) (goodcount N (cdr Lnb))))))) (goodcount 21 ’(1 1 3 5 7 10 12 15))
> (1 1 7 12)
7 L p danh sách các s nguyên t
Cho m t s nguyên n, c n tìm các s nguyên t trong kho ng 2 n Có nhi u thu t toán
Thêm prime vào t p h p k t qu S
Lo i tr kh i sieve các b i s c a prime là 2*prime, 3*prime
until sieve = r ng
(define (interval-list m n)
(if (> m n)
Trang 31(cons (car L) (remove-multiples n (cdr L)))))) (if (null? L)
III.4.2.5 K thu t đ quy x lý danh sách b t k
đ quy đ chuy n phép tính c a hàm đang đ nh ngh a đ i v i tham bi n cdr và/ho c car
1 Làm ph ng m t danh sách
bên trong nh sau :
(aflatten ’(a (b c) () ((d)) e))
; N u car c a danh sách đã cho không ph i là m t danh sách,
; thì thêm ph n t này vào đ u k t qu làm ph ng c a cdr
(else (cons (car L) (aflatten (cdr L))))))
Trang 32(Listsum* ’(a (4) 5 ((6 b)) 8))
> 23
3 Lo i b kh i danh sách m t ph n t các m c khác nhau
Cho m t danh sách L và m t bi u th c s C n lo i b kh i L các ph n t có giá tr b ng s
((equal? s (car L)) ; ph n t đ u tiên là s (remove1 s (cdr L)))
(cons (remove1 s (car L)) (remove1 s (cdr L))))
(remove1 s (cdr L)))))) (remove* ’a ’(b a ((a) b) c (a) d))
Trang 33− N u ph n t đ u tiên c a danh sách là m t danh sách, thì ta ngh ch đ o các ph n t
(reverse1 '(a b ((e f) g) c (i j) d))
> '(d (j i) c (g (f e)) b a)
5 So sánh b ng nhau
ho c :
Ki u pair, vector,
(equal? "123" "123") > #t
V t eqv?, hay eq?, dùng đ so sánh các ki u d li u b t k , k t qu s là #t n u
string=?
(eq? 123 123)
> #t
Trang 34(= V1 V2)) ((and (char? V1) (char? V2))
(char=? V1 V2)) ((and (string? V1) (string? V2))
(string=? V1 V2)) ((and (pair? V1) (pair? V2))
(and (equal? (car V1) (car V2))
III.4.3.1 Bi u di n danh sách b i ki u b đôi
(a) chính là b đôi ’(a ()) có ph n t th nh t car là a và ph n t th hai cdr là
m t danh sách r ng M t cách t ng quát, danh sách :
(s1 s2 sn)
đ c bi u di n b i ki u d li u b đôi :
(s1 (s2 ( (sn ( ) ) )
đôi khác Các thành ph n c a m t b đôi c ng có th là các b đôi Ví d :
(define x (cons ’a ’b))
(define y (cons x ’c))
Trang 35Hình III.5 Bi u di n d ng cây các b đôi
sNs2
s1
( )
Hình III.6 Bi u di n danh sách b i các b đôi
Trang 36Hình III.7 Nhi u m i tên cùng bi u di n m t con tr
đôi đ mô hình hoá các đ i t ng có tr ng thái thay đ i theo th i gian
(define X (list 1 2 3 4))
(set-car! X 5) ; thay đ i X mà không nh h ng đ n Y
Trang 37Y
> (6 3 4)
Tuy nhiên, sau khi gán l i ph n cdr c a X cho m t danh sách m i, thì con tr Y v n tr
(set-cdr! X (list 7 8)) ;X và Y đ c l p (không chung nhau b đôi nào)
( )X
1
Hình III.10 t bi n t o danh sách n i vòng có th gây ra qu n vô h n
L1 và L2, ta c n ghép chúng đ nh n đ c m t danh sách m i G i |L1| là đ dài (length)
c a danh sách L1, ta có hai gi i pháp, m t gi i pháp không s d ng đ t bi n, nh sau :
> (1 2 3 4 5)
Cách 2 : s d ng đ t bi n
đôi cu i cùng c a L1 tr t i L2
Trang 38; concat! : List(T) ´ List(T) ® List(T)
(define (concat! L1 L2)
(define (last-doublet L) ; tr v b đôi cu i cùng c a L là null
(if (null? (cdr L))
L (last-doublet (cdr L)))) (set-cdr! (last-doublet L1) L2))
((c1 v1) (cn vn)
(cj vj) đ t o ra m t ph n t c a danh sách k t h p Th vi n Scheme có hàm assq : (assq s alist)
s d ng phép so sánh eq? đ tr v ph n t đ u tiên c a danh sách k t h p alist tho mãn
đi u ki n có car là khóa s N u không tìm th y khoá nào nh v y, giá tr tr v là #f : (assq ’a ’((b 2) (a 1) (c 3) (a 0)))
Do assq s d ng eq? nên có th phép so sánh không thành công :
(assq ’(a) ’((b 2) (a 1) (c 3) ((a) 0)))
Trang 39Chú ý r ng các hàm memq, memv, member, assq, assv, và assoc đ u không có d u
ch m h i (?) phía sau tên vì chúng tr v không ch các giá tr ki u boolean #f và #t mà còn
(define (valof key alist)
(let ((doublet (assq key alist)))
(define (delkey key alist)
(cond ((null? alist) '())
((eq? key (caar alist)) (delkey key (cdr alist))) (else (cons (car alist)
(delkey key (cdr alist)))))) (delkey ’b ’((a 1) (b 2) (c 3) (b 4)))
> ’((a 1) (c 3))
Trang 40(delkey ’d ’((a 1) (b 2) (c 3) (b 4)))
> ’((a 1) (b 2) (c 3) (b 4)))
(define (sublis alist s)
(cond ((pair? s)
(cons (sublis alist (car s)) (sublis alist (cdr s)))) ((null? s) '())
(else (let ((doublet (assoc s alist))) (if doublet
(cdr doublet) s)))))
(sublis
’((mot one) (hai two) (ba three)))
’(mot + hai = ba))
> (one + two = three)
b sung vào danh sách k t h p m t ph n t m i, ta xây d ng hàm acons(s1 s2
d ng t s1 và s2 :
(define (acons s1 s2 alist)
(cons (cons s1 s2) alist))
(acons ’a 1 ’((b 2) (c 3) (b 4)))
> ’((a 1) (b 2) (c 3) (b 4))
III.4.3.3 D ng quasiquote
Ngoài d ng vi t t t ’(quotation mark) c a phép trích d n quote, trong Scheme còn có