You are on page 1of 227

TS.

PHAN HUY KHNH

Lp trnh hm

NH XUT BN KHOA HC V K THUT

Mc lc
CHNG I. NGUYN L LP TRNH HM ......................................................... 1
I.1
I.1.1.
I.1.2.
I.1.3.
I.1.4.
I.1.5.
I.2
I.2.1.
I.2.2.
I.2.3.
I.2.4.
I.2.5.
I.2.6.
I.2.7.
I.2.8.
I.2.9.
1.
2.
3.
4.
I.3

M u v ngn ng lp trnh ............................................................... 1


Vi nt v lch s...................................................................................... 1
nh ngha mt ngn ng lp trnh ........................................................... 2
Khi nim v chng trnh dch................................................................ 4
Phn loi cc ngn ng lp trnh............................................................... 5
Ngn ng lp trnh mnh lnh .................................................................. 7
C s ca cc ngn ng hm ................................................................. 8
Tnh khai bo ca cc ngn ng hm ........................................................ 8
nh ngha hm ...................................................................................... 11
Danh sch............................................................................................... 13
Php so khp .......................................................................................... 16
Phng php currying (tham i ho tng phn) .................................... 17
Khi nim v bc ca hm...................................................................... 18
Kiu v tnh a kiu................................................................................ 20
Tnh hm theo kiu khn ngoan.............................................................. 22
Mt s v d ........................................................................................... 25
Loi b nhng phn t trng nhau ......................................................... 25
Sp xp nhanh quicksort......................................................................... 25
Bi ton tm qun hu............................................................................ 26
Bi ton hamming .................................................................................. 27
Kt lun ................................................................................................ 29

CHNG II. NGN NG SCHEME..................................................................... 33


II.1
II.2
II.2.1.
II.2.1.1.
II.2.1.2.
II.2.1.3.
II.2.2.
II.2.3.
II.3
II.3.1.
II.3.2.
II.3.2.1.
II.3.2.2.
II.3.2.3.
II.3.2.4.

Gii thiu Scheme................................................................................. 33


Cc kiu d liu ca Scheme................................................................ 34
Cc kiu d liu n gin ....................................................................... 34
Kiu s ................................................................................................... 34
Kiu lgch v v t ................................................................................ 36
K hiu................................................................................................... 38
Khi nim v cc biu thc tin t .......................................................... 39
S-biu thc ............................................................................................. 41
Cc nh ngha trong Scheme .............................................................. 41
nh ngha bin ...................................................................................... 41
nh ngha hm ...................................................................................... 42
Khi nim hm trong Scheme ................................................................. 42
Gi hm sau khi nh ngha .................................................................... 43
S dng cc hm b tr .......................................................................... 44
Tnh khng nh kiu ca Scheme .......................................................... 45

ii

LP TRNH HM

II.3.3.
II.3.3.1.
II.3.3.2.
1.
2.
3.
II.3.3.3.
II.3.4.
II.3.4.1.
II.3.4.2.
1.
2.
3.
4.
II.3.4.3.
II.3.4.4.
II.3.4.5.
II.3.5.
1.
2.
3.

Cu trc iu khin................................................................................. 45
Dng iu kin if .................................................................................... 45
Bin cc b............................................................................................. 47
nh ngha bin cc b nh dng let ...................................................... 47
Phm vi t ng ca dng let ................................................................. 48
Lin kt bin theo dy : dng let* ........................................................... 48
nh ngha cc v t................................................................................ 49
S quy v s lp....................................................................... 50
S quy........................................................................................... 50
V d ...................................................................................................... 51
Tnh tng bnh phng cc s t 1 n n ................................................ 51
Tnh giai tha......................................................................................... 51
Hm fibonacci ........................................................................................ 51
Tnh cc h s nh thc........................................................................... 52
Tnh dng ca li gi quy .................................................................. 52
Chng minh tnh dng............................................................................ 54
S lp ................................................................................................ 54
Vo/ra d liu......................................................................................... 56
c vo d liu : read............................................................................ 56
In ra d liu : write v display................................................................ 56
Xy dng vng lp c menu.................................................................... 57

CHNG III. KIU D LIU PHC HP ........................................................... 61


III.1
Kiu chui............................................................................................. 61
III.2
Kiu d liu vect................................................................................. 64
III.3
Kiu d liu b i ............................................................................... 64
III.3.1.
Khi nim tru tng ho d liu ........................................................... 64
III.3.2.
nh ngha b i................................................................................... 66
III.3.3.
t bin trn cc b i.......................................................................... 68
III.3.4.
ng dng b i..................................................................................... 69
1.
Biu din cc s hu t........................................................................... 69
2.
Biu din hnh ch nht phng ............................................................... 72
III.4
Kiu d liu danh sch......................................................................... 74
III.4.1.
Khi nim danh sch .............................................................................. 74
III.4.2.
ng dng danh sch ............................................................................... 76
III.4.2.1. Cc php ton c bn cons, list, car v cdr .............................................. 76
III.4.2.2. Cc hm x l danh sch ........................................................................ 79
1.
Cc hm length, append v reverse ........................................................ 79
2.
Cc hm tham chiu danh sch .............................................................. 80
3.
Cc hm chuyn i kiu........................................................................ 81
4.
Cc hm so snh danh sch.................................................................... 83
III.4.2.3. Dng case x l danh sch...................................................................... 84
III.4.2.4. K thut quy x l danh sch phng................................................... 86
1.
Tnh tng cc phn t ca mt danh sch ............................................... 86
2.
Danh sch cc s nguyn t 0 n n ....................................................... 86
3.
Nghch o mt danh sch...................................................................... 87
4.
Hm append c hai tham i.................................................................. 87
5.
Loi b cc phn t khi danh sch........................................................ 87
6.
Bi ton tnh tng con ............................................................................ 88

MC LC

iii

7.
Lp danh sch cc s nguyn t ............................................................. 88
III.4.2.5. K thut quy x l danh sch bt k................................................... 89
1.
Lm phng mt danh sch ...................................................................... 89
2.
Tnh tng cc s c mt trong danh sch ................................................ 90
3.
Loi b khi danh sch mt phn t cc mc khc nhau ..................... 90
4.
Nghch o danh sch ............................................................................ 90
5.
So snh bng nhau ................................................................................. 91
III.4.3.
Biu din danh sch................................................................................ 92
III.4.3.1. Biu din danh sch bi kiu b i........................................................ 92
III.4.3.2. Danh sch kt hp .................................................................................. 96
1.
Khi nim danh sch kt hp.................................................................. 96
2.
S dng danh sch kt hp ..................................................................... 97
III.4.3.3. Dng quasiquote ..................................................................................... 98
III.4.4.
Mt s v d ng dng danh sch ........................................................... 99
1.
Tm phn t cui cng ca danh sch..................................................... 99
2.
Lit k cc v tr mt k hiu c trong danh sch................................... 100
3.
Tm tng con ln nht trong mt vector ................................................ 100
4.
Bi ton sp xp dy vin bi ba mu..................................................... 101
5.
Sp xp nhanh quicksort....................................................................... 102
CHNG IV. K THUT X L HM.............................................................. 107
IV.1
IV.1.1.
IV.1.2.
IV.1.3.
IV.2
IV.2.1.
IV.2.2.
IV.2.3.
IV.2.4.
IV.2.5.
1.
2.
3.
4.
5.
IV.2.6.
IV.2.7.
IV.3
IV.3.1.
1.
2.
3.
IV.3.2.
IV.3.3.
IV.3.4.
IV.4
IV.4.1.
IV.4.2.

S dng hm....................................................................................... 107


Dng tn hm lm tham i.................................................................. 107
p dng hm cho cc phn t ca danh sch ........................................ 110
Kt qu tr v l hm............................................................................ 112
Phep tnh lambda ............................................................................... 113
Gii thiu php tnh lambda.................................................................. 113
Biu din biu thc lambda trong Scheme ............................................ 114
nh ngha hm nh lambda................................................................. 115
K thut s dng phi hp lambda ....................................................... 117
nh ngha hm nh tch lu kt qu .................................................... 120
Tnh tng gi tr ca mt hm p dng cho cc phn t danh sch....... 120
Tnh tch gi tr ca mt hm p dng cho cc phn t danh sch ........ 120
nh ngha li hm append ghp hai danh sch ................................... 120
nh ngha li hm map cho hm mt bin h........................................ 120
nh ngha cc hm fold....................................................................... 122
Tham i ho tng phn ....................................................................... 122
nh ngha quy cc b ..................................................................... 123
X l trn cc hm ............................................................................. 125
Xy dng cc php lp ......................................................................... 125
Hm append-map ................................................................................. 125
Hm map-select.................................................................................... 126
Cc hm every v some ........................................................................ 126
Trao i thng ip gia cc hm ......................................................... 127
T hp cc hm .................................................................................... 129
Cc hm c s lng tham i bt k ................................................... 130
Mt s v d ........................................................................................ 132
Phng php xp x lin tip ................................................................ 132
To th tc nh dng ........................................................................... 133

iv

LP TRNH HM

IV.4.3.
X l a thc........................................................................................ 134
IV.4.3.1. nh ngha a thc ............................................................................... 134
IV.4.3.2. Biu din a thc.................................................................................. 134
IV.4.3.3. X l a thc........................................................................................ 135
1.
Nhn a thc vi mt hng s .............................................................. 135
2.
So snh hai a thc .............................................................................. 136
3.
Php cng a thc................................................................................ 136
4.
Php nhn hai a thc.......................................................................... 137
IV.4.3.4. Biu din trong mt a thc.................................................................. 137
IV.4.3.5. a ra a thc ...................................................................................... 138
IV.4.4.
Thut ton quay lui............................................................................... 139
IV.4.4.1. Bi ton tm qun hu .......................................................................... 139
IV.4.4.2. Tm kim cc li gii ............................................................................ 140
IV.4.4.3. T chc cc li gii .............................................................................. 143
CHNG V. CU TRC D LIU .................................................................... 147
V.1

V.2
V.2.1.
V.2.2.
V.2.3.
V.2.4.
V.2.5.

Tp hp............................................................................................... 147
Php hp trn cc tp hp.................................................................... 148
Php giao trn cc tp hp................................................................... 149
Php hiu ca hai tp hp .................................................................... 149
Tm cc tp hp con ca mt tp hp ................................................... 150
Ngn xp ............................................................................................. 150
Kiu d liu tru tng ngn xp ......................................................... 150
Xy dng ngn xp............................................................................... 151
Xy dng trnh son tho vn bn......................................................... 152
Ngn xp t bin ................................................................................ 153
Tnh biu thc s hc dng hu t ........................................................ 156

V.3
V.3.1.
V.3.2.
V.3.3.

Tp ...................................................................................................... 158
Cu trc d liu tru tng kiu tp ..................................................... 158
V d p dng tp ................................................................................. 159
Tp t bin ......................................................................................... 160

V.4
V.4.1.
V.4.1.1.
V.4.1.2.
1.
2.
3.
V.4.1.3.
1.
2.
V.4.1.4.
V.4.2.
V.4.2.1.
V.4.2.2.
1.
2.
V.4.2.3.

Cy...................................................................................................... 162
Cy nh phn ........................................................................................ 163
Kiu tru tng cy nh phn................................................................ 163
Biu din cy nh phn.......................................................................... 164
Biu din tit kim s dng hai php cons............................................. 164
Biu din dng y .......................................................................... 165
Biu din n gin ............................................................................... 165
Mt s v d lp trnh n gin ............................................................. 166
m s lng cc nt c trong mt cy................................................ 166
Tnh cao ca mt cy....................................................................... 166
Duyt cy nh phn ............................................................................... 167
Cu trc cy tng qut .......................................................................... 169
Kiu tru tng cy tng qut............................................................... 169
Biu din cy tng qut ........................................................................ 169
Biu din cy nh mt b i................................................................ 169
Biu din cy n gin qua cc l ........................................................ 170
Mt s v d v cy tng qut ............................................................... 170

1.
2.
3.
4.

MC LC

1.
2.
V.4.2.4.
V.4.3.
V.4.3.1.
V.4.3.2.

m s lng cc nt trong cy ........................................................... 170


Tnh cao ca cy.............................................................................. 171
Duyt cy tng qut khng c x l trung t......................................... 171
ng dng cy tng qut........................................................................ 172
Xy dng cy c php .......................................................................... 172
V d : o hm hnh thc..................................................................... 173

CHNG VI. MI TRNG V CP PHT B NH .................................... 177


VI.1
Mi trng ......................................................................................... 177
VI.1.1.
Mt s khi nim.................................................................................. 177
VI.1.2.
Phm vi ca mt lin kt ...................................................................... 178
VI.1.2.1. Phm vi tnh ......................................................................................... 178
VI.1.2.2. Php ng = biu thc lambda + mi trng......................................... 179
VI.1.2.3. Thay i b nh v php ng.............................................................. 180
VI.1.2.4. Nhn bit hm ...................................................................................... 181
VI.1.2.5. Phm vi ng........................................................................................ 182
VI.1.3.
Thi gian sng ca mt lin kt ............................................................ 184
VI.1.4.
Mi trng ton cc ............................................................................. 184
VI.2
Cp pht b nh................................................................................. 185
VI.2.1.
V d 1 : m phng my tnh b ti ...................................................... 186
VI.2.2.
V d 2 : bi ton cn i ti khon....................................................... 187
VI.3
M hnh s dng mi trng............................................................. 189
VI.4
Vo/ra d liu..................................................................................... 192
VI.4.1.
Lm vic vi cc tp............................................................................. 192
VI.4.2.
c d liu trn tp .............................................................................. 193
1.
Cc hm c tp................................................................................... 193
2.
Tp vn bn.......................................................................................... 195
VI.4.3.
Ghi ln tp............................................................................................ 196
1.
Cc hm ghi ln tp.............................................................................. 196
2.
Lnh sao chp tp ................................................................................. 197
VI.4.4.
Giao tip vi h thng .......................................................................... 198
PH LC .................................................................................................................. 203
TI LIU THAM KHO .......................................................................................... 205

LI NI U

un sch ny trnh by c s l thuyt v nhng k thut lp trnh c bn theo phong


cch lp trnh hm (Functional Programming). y l kt qu bin son t cc
gio trnh sau nhiu nm ging dy bc i hc v sau i hc ngnh cng ngh thng tin
ca tc gi ti i hc Nng.
Cun sch gm su chng c ni dung nh sau :

Chng 1 gii thiu qu trnh pht trin v phn loi cc ngn ng lp trnh, nhng
c im c bn ca phong cch lp trnh mnh lnh. Phn chnh ca chng
trnh by nhngnguyn l lp trnh hm s dng ngn ng minh ho Miranda.

Chng 2 trnh by nhng kin thc m u v ngn ng Scheme : cc khi nim v


cc kiu d liu c s, cch nh ngha hm, biu thc, k thut s dng quy v
php lp.

Chng 3 trnh by cc kiu d liu phc hp ca Scheme nh chui, vect, danh


sch v cch vn dng cc kiu d liu tru tng trong nh ngha hm.

Chng 4 trnh by nhng kin thc nng cao v k thut lp trnh hm, nh ngha
hm nh php tnh lambda, ng dng thut ton quay lui, truyn thng ip...

Chng 5 trnh by chi tit hn k thut lp trnh nng cao vi Scheme s dng cc
cu trc d liu : tp hp, ngn xp, hng i, cy v tp.

Chng 6 trnh by khi nim mi trng, cch t chc v cp pht b nh, cch
vo/ra d liu ca Scheme vi th gii bn ngoi.

Phn ph lc gii thiu vn tt ngn ng lp trnh WinScheme48, hng dn cch


ci t v s dng phn mm ny.

Cun sch ny lm ti liu t kho cho sinh vin cc ngnh cng ngh thng tin v
nhng bn c mun tm hiu thm v k thut lp trnh cho lnh vc tr tu nhn to,
giao tip h thng, x l k hiu, tnh ton hnh thc, cc h thng ho...
Trong sut qu trnh bin son, tc gi nhn c t cc bn ng nghip nhiu
ng gp b ch v mt chuyn mn, nhng ng vin khch l v mt tinh thn, s gip
tn tnh v bin tp cun sch c ra i. Do mi xut bn ln u tin, ti liu tham
kho ch yu l ting nc ngoi, chc chn rng ni dung ca cun sch vn cn bc l
nhiu thiu st, nht l cc thut ng dch ra ting Vit.
Tc gi xin c by t y lng bit n su sc v mi kin ph bnh ng gp ca
bn c gn xa.
Nng, ngy 06/09/2004
Tc gi.

PHAN HUY KHNH

L P
T R N H
HM
Functional Programming

p trnh hm l phong cch lp trnh da trn nh ngha hm s dng php tnh lambda
(-calculus). Lp trnh hm khng s dng cc lnh gn bin v khng gy ra hiu ng
ph nh vn gp trong lp trnh mnh lnh. Trong cc ngn ng lp trnh hm, hm (th tc,
chng trnh con) ng vai tr trung tm, thay v thc hin lnh, my tnh tnh biu thc. c
rt nhiu ngn ng hm c pht trin v ng dng nh Miranda, Haskell, ML, cc ngn ng
h Lisp : Scheme, Common Lisp...
Phn u cun sch ny trnh by c s l thuyt v nhng khi nim c bn ca
lp trnh hm s dng ngn ng minh ho l Miranda, mt ngn ng thun tu hm
do D. Turner xut 1986. Phn chnh trnh by k thut lp trnh hm trong Scheme,
mt ngn ng do Guy Lewis Steele Jr. v G. Jay Sussman xut 1975.
Ngn ng Scheme c tnh s phm cao, gii quyt thch hp cc bi ton ton hc v
x l k hiu. Scheme c c php n gin, d hc, d lp trnh. Mt chng trnh Scheme l
mt dy cc nh ngha hm gp li nh ngha mt hoc nhiu hm phc tp hn. Scheme
lm vic theo ch thng dch, tng tc vi ngi s dng.
Cun sch ny rt thch hp cho sinh vin cc ngnh cng ngh thng tin v
nhng bn c mun tm hiu v k thut lp trnh ng dng trong lnh vc tr tu
nhn to, giao tip ngi-h thng, x l k hiu, tnh ton hnh thc, thit k cc
h thng ho...
V TC GI :
Tt nghip ngnh Ton My tnh nm 1979 ti trng i hc Bch khoa H Ni.
T 1979 n nay ging dy ti khoa Cng ngh Thng tin, trng i hc Bch khoa,
i hc Nng. Bo v tin s nm 1991 ti Php. Gi chc ch nhim khoa
Cng ngh Thng tin 1995-2000.
Hng nghin cu chnh : x l ngn ng, x l a ng, l thuyt tnh ton.
E-mail: phanhuykhanh@dng.vnn.vn

PH LC

Scheme48 for Windows


Hin nay c nhiu phin bn trnh thng dch Scheme cung cp min ph trn Internet.
Trong cun sch ny, tc gi s dng ch yu Scheme48 for Windows, phin bn 0.52,
chy minh ho cc v d trong phn trnh by l thuyt. y l phn mm c pht trin t
nm 1993 bi R. Kelsey v J. Rees, sau c tip tc pht trin ti trng i hc
Northwestern, Chicago, Hoa K. Phin bn mi nht hin nay l WinScheme48 0.57 c
tm thy ti trang web :
http://s48.org/index.html, hoc trang web ca trng i hc Northwestern :
http://www.cs.nwu.edu/groups/su/edwin/.
Bn c c th tm thy nhiu phin bn Scheme khc nh MITScheme, DrScheme,
Nhng phin bn ny khng ngng c cp nht, i mi v c th vin s-lib rt phong
ph. Tuy nhin i vi nhng bn c mi bt u lm quen lp trnh hm vi ngn ng
Scheme, ch nn chy phin bn 0.52 gn nh v tng i n nh trong mi nn
Win98/NT/2K hay XP c ti v t a ch sau :
http://www.cs.nwu.edu/groups/su/Scheme48/program/Scheme48.zip
Tin trnh ci t v thc hin cc thao tc ch nh ng dn rt d dng t tp nn
Scheme48.zip cha b thng dch v ti liu hng dn. Sau khi khi ng, mn hnh lm
vic ca Scheme48 for Windows nh sau :

Hnh 1. Phin bn Scheme48 for Windows 0.52.


WinScheme48 rt d thao tc v d s dng. Ca s lm vic cha du nhc lnh l mt
du ln hn >. Sau mi dng lnh, nu s-biu thc a vo ng n v mt c php,
WinScheme48 s tin hnh thc hin (evaluation) tr v kt qu.

203

PH LC WINSCHEME48

204

xem ti liu hng dn, NSD gi chy chng trnh scheme48.chm c sn trong
th mc ..\Scheme48\doc c t ng to ra sau khi ci t (xem hnh 2).

Hnh 2. Hng dn s dng Scheme48 for Windows 0.52.


Trnh son tho vn bn thng trc ca WinScheme48 tng t NotePad/WordPad ca
Windows nn rt d s dng, nh cc lnh sao chp cut/paste. Khi son tho chng trnh,
cc dng lnh c t ng tht dng (indentation) v thay i mu sc gip NSD d dng
kim tra c php, pht hin li.

Hnh 3. Ca s son tho chng trnh.


Trong ca s son tho, NSD c th nh ngha cc hm, cc bin, cc chui hay a vo
cc dng ch thch. WinScheme48 cung cp b kim tra du ngoc (parenthesis matching),
chng hn phn chng trnh ng trc du chn c mu xanh dng cho bit s-biu thc
tng ng hp thc v mt c php, mu l xy ra li do tha du ngoc. Sau khi son
tho cc hm, c th thc hin chng trnh bng cch:
La (highlight) vng hm (s-biu thc) cn thc hin, hoc t con tr (du chn) ti
mt v tr bn trong.

Nhn t hp phm Ctrl+Alt+X hoc gi lnh Scheme-Eval ((evaluate) trn thanh


lnh n (menu bar).

Ti liu tham kho chnh


[1]
[2]
[3]
[4]
[5]

H. Abdulrab. de Common Lisp la programmation objet.


Editions HERMES, Paris 1990.
D. Appleby & J.J.VandeKopple. Programming Language: Paradigm and
Pratice. THE MCGRAWHILL COMPANIES, INC., 1997.
J. Arsac. Nhp mn lp trnh. inh Vn Phong v Trn Ngc Tr dch.
Trung tm H thng Thng tin ISC, H Ni 1991.
H. E. Bal & D. Grune. Programming Language Essentials.
ADDITION-WESLEY PUBLISHING COMPANY INC., 1994.
J. Bentley. Nhngvin ngc trong k thut lp trnh. L Minh Trung v Nguyn
Vn Hiu dch, Trung tm Tin hc v in t Phng ng xut bn, 1992.

[6]

J. Chazarain. Programmer avec Scheme de la pratique la thorie.


INTERNATIONAL THOMSON PUBLISHING, Paris 1996.

[7]

W. Clinger, J. Rees & all. Revised5. Prport on the Algorithmic Language


Scheme. Ti liu Internet : http://www.swiss.ai.mit.edu/~jaffer/r5rs_toc.html
H. Farrency & M. Ghallab. Elment dintlligence artificielle.
Editions HERMES, Paris 1990.

[8]
[9]
[10]
[11]
[12]
[13]
[14]
[15]
[16]
[17]
[18]

Ch. Froidevaux v cc tc gi khc. Types de Donnes et Algorithmes.


EDISCIENCE international, Paris 1994.
Phan Huy Khnh. Gio trnh lp trnh hm.
Gio trnh xut bn ni b, i hc Nng 2002.
Phan Huy Khnh & Phan Ch Tng. Nhp mn Tin hc.
Nh Xut bn Gio dc, 1997.
Xun Li. Cu trc d liu v gii thut. Nh Xut bn Gio dc, 1993.
Ch. Rapin. Programmation Dclarative. Springer Verlag 1993.
Y. Rouzaud. Algorithmique et Programmation en Scheme. Ti liu ni b,
ENSIMAG, Grenoble 1996.
D. A. Turner. An Overview of Miranda. Springer Lecture Notes in Computer
Science, vol 201, 1986.
Ng Trung Vit. Kin thc c bn v lp trnh.
Nh Xut bn Giao thng Vn ti, 1995.
N. Wirth. "Algorithms + Data Structures = Programs", Prentice-Hall 1976.
J. Malenfant. Smantique des langages de programmation.
Ti liu ly t internet : Universit de Bretagne-Sud, Php.

205

CHNG I.

NGUYN L LP TRNH HM

The primary purpose of a programming language


is to help the programmer in the practice of his art
Charle A. Hoare (Hints on programming language design, 1973)

I.1

M u v ngn ng lp trnh

I.1.1. Vi nt v lch s
Bui ban u

hng ngn ng lp trnh (programming language) u tin trn my tnh in t l


ngn ng my (machine language), t hp ca cc con s h hai, hay h nh phn, hay
cc bit (vit tt ca binary digit) 0 v 1. Ngn ng my ph thuc hon ton vo kin
trc phn cng ca my tnh v nhng quy c kht khe ca nh ch to. gii cc bi
ton, ngi lp trnh phi s dng mt tp hp cc lnh iu khin rt s cp m mi lnh l
mt t hp cc s h hai nn gp rt nhiu kh khn, mt nhc, rt d mc phi sai st, nhng
li rt kh sa li.
T nhng nm 1950, gim nh vic lp trnh, ngi ta a vo k thut chng trnh
con (sub-program hay sub-routine) v xy dng cc th vin chng trnh (library) khi
cn th gi n hoc dng li nhng on chng trnh vit.

Ngn ng my tin gn n ngn ng t nhin


Cng t nhng nm 1950, ngn ng hp dch, hay hp ng (assembly) hay cng cn
c gi l ngn ng biu tng (symbolic) ra i. Trong hp ng, cc m lnh v a ch
cc ton hng c thay th bi cc t ting Anh gi nh (mnemonic) nh ADD, SUB, MUL,
DIV, JUMP... tng ng vi cc php ton s hc + - /, php chuyn iu khin, v.v...
Do my tnh ch hiu ngn ng my, cc chng trnh vit bng hp ng khng th chy
ngay c m phi qua giai on hp dch (assembler) thnh ngn ng my. Tuy nhin, cc
hp ng vn cn ph thuc vo phn cng v xa l vi ngn ng t nhin (natural language),
ngi lp trnh vn cn gp nhiu kh khn khi gii cc bi ton trn my tnh.
Nm 1957, hng IBM a ra ngn ng FORTRAN (FORmula TRANslator). y l ngn
ng lp trnh u tin gn gi ngn ng t nhin vi cch din t ton hc. FORTRAN cho
php gii quyt nhiu loi bi ton khoa hc, k thut v sau c nhanh chng ng dng
rt rng ri cho n ngy nay vi kho tng th vin thut ton rt s v tin dng. Tip
theo l s ra i ca cc ngn ng ALGOL 60 (ALGOrithmic Language) nm 1960, COBOL
(Comon Business Oriented Language) nm 1964, Simula nm 1964, v.v...

LP TRNH HM

Pht trin ca ngn ng lp trnh


Theo s pht trin ca cc th h my tnh, cc ngn ng lp trnh cng khng ngng
c ci tin v hon thin cng ngy cng p ng nhu cu ca ngi s dng v gim
nh cng vic lp trnh. Rt nhiu ngn ng lp trnh ra i trn nn tng l thuyt tnh
ton (theory of computation) v hnh thnh hai loi ngn ng : ngn ng bc thp v ngn
ng bc cao.
Cc ngn ng bc thp (low-level language), hp ng v ngn ng my, thng ch dng
vit cc chng trnh iu khin v kim tra thit b, chng trnh sa li (debugger) hay
cng c...
Cc ngn ng lp trnh bc cao (high-level language) l phng tin gip ngi lm tin
hc gii quyt cc vn thc t nhng ng thi cng l ni m nhng thnh tu nghin
cu mi nht ca khoa hc my tnh c a vo. Lnh vc nghin cu pht trin cc ngn
ng lp trnh va c tnh truyn thng, va c tnh hin i. Ngy nay, vi nhng tin b ca
khoa hc cng ngh, ngi ta c th s dng cc cng c hnh thc cho php gim nh
cng vic lp trnh t lc phn tch, thit k cho n s dng mt ngn ng lp trnh.

I.1.2. nh ngha mt ngn ng lp trnh


Cc ngn ng lp trnh bc cao c xy dng m phng ngn ng t nhin, thng l
ting Anh (hoc ting Nga nhng nm trc y). nh ngha mt ngn ng lp trnh l nh
ngha mt vn phm (grammar) sinh ra cc cu ng ca ngn ng . C th hnh dung
mt vn phm gm bn thnh phn : b k t, b t vng, c php v ng ngha.
1. B k t (character set)
Gm mt s hu hn cc k t (hay k hiu) c php dng trong ngn ng. Trong cc
my tnh c nhn, ngi ta thng s dng cc k t ASCII. C th hiu b k t c vai tr
nh bng ch ci (alphabet) ca mt ngn ng t nhin to ra cc t (word).
2. B t vng (vocabulary)
Gm mt tp hp cc t, hay n v t vng (token), c xy dng t b k t. Cc t
dng to thnh cu lnh trong mt chng trnh v c phn loi tu theo vai tr chc
nng ca chng trong ngn ng. Chng hn chng trnh Pascal sau y :
program P;
var , y : integer;
begin
read(x);
y:=x+2;
write(y)
end.
gm cc n v t vng :
T kho (keyword), hay t dnh ring (reserved word) : program, var, integer,
begin, end.
Tn, hay nh danh (identifier) : read, write, P, x, y.

Hng (constants) : 2
Php ton (operators) : + , :=
Du phn cch (delimiters) : :, (, ), ...

NGUYN L LP TRNH HM

3. C php (syntax)
C php quy nh cch thc kt hp cc k t thnh t, kt hp cc t thnh cu lnh
ng (statement hay instruction), kt hp cc cu lnh ng thnh mt chng trnh hon
chnh v mt vn phm. C th hnh dung cch kt hp ny ging cch t cu trong mt
ngn ng t nhin. Thng ngi ta dng s c php (syntax diagram) hoc dng chun
Backus-Naur (Backus-Naur Form, vit tt BNF), hoc dng chun Backus-Naur m rng
(EBNF Extended Backus-Naur Form) m t c php ca vn phm.
V d I.1.1 : Trong ngn ng Pascal (hoc trong phn ln cc ngn ng lp trnh), tn gi,
hay nh danh (identifier) c s c php nh sau :
tn

s
ch
ch
s

ch
A ... Z

a ...

... 9
a ...

Hnh I.1. S c php tn trong ngn ng Pascal .


Trong mt s c php, cc hnh ch nht ln lt phi c thay th bi cc hnh
trn. Qu trnh thay th thc hin th t theo chiu mi tn cho n khi nhn c cu ng.
Chng hn c th c s trn nh sau : tn phi bt u bng ch, tip theo c th l
ch hoc s tu , ch ch c th l mt trong cc ch ci A..Za..z, s ch c th l mt trong
cc ch s 0..9. Nh vy, Delta, x1, x2, Read, v.v... l cc tn vit ng, cn 1A, , ,
bn knh, v.v... u khng phi l tn v vi phm quy tc c php.
Vn phm BNF gm mt dy quy tcc. Mi quy tc gm v tri, du nh ngha ::= (c
c nh ngha bi) v v phi. V tri l mt k hiu phi c nh ngha, cn v phi l
mt dy cc k hiu, hoc c tha nhn, hoc c nh ngha t trc , tun theo
mt quy c no . EBNF dng cc k t quy c nh sau :
K hiu
ngha
::=, hoc , hoc =
{ }
[]
< >
|

c nh ngha l
chui ca 0 hay nhiu mc lit k tu chn (option)
hoc 0 hoc 1 mc lit k tu chn
mc lit k phi c thay th
hoc (theo ngha loi tr)

Cc quy tc BNF nh ngha tn trong ngn ng Pascal :


<tn> ::= <ch> { <ch> | <s> }
<ch> ::= A | ... | Z | a | ... | z
<s>
::= 0 | ... | 9
V d I.1.2
Vn phm ca mt ngn ng lp trnh n gin dng EBNF nh sau :
<program>
::= program <statement>* end
<statement> ::= <assignment> | <loop>
<assignment> ::= <identifier> := <expression> ;

LP TRNH HM

<loop>

::=
while <expression> do <statement>+ done
<expression> ::=
<value> | <value> + <value> | <value> <= <value>
<value>
::= <identifier> | <number>
<identifier> ::=
<letter>|<identifier><letter>|<identifier><digit>
<number>
::= <digit> | <number><digit>
<letter>
::= A | ... | Z | a | ... | z
<digit>
::= 0 | ... | 9
Mt cu, tc l mt chng trnh n gin, vit trong vn phm trn nh sau :
program
n := 1 ;
while n <= 10 do n := n + 1 ; done
end
4. Ng ngha (semantic)
Cn c vo c php ca ngn ng lp trnh, ngi lp trnh vit chng trnh gm cc cu
lnh theo trnh t cho php gii quyt c bi ton ca mnh. t c mc ch ,
mi cu lnh vit ra khng nhng ng n v mt c php, m cn phi ng n c v mt
ng ngha, hay ngha logic ca cu lnh. Tnh ng n v mt ng ngha cho php gii
quyt c bi ton, chng trnh chy lun lun dng, n nh v cho kt qu ph hp vi
yu cu t ra ban u.

I.1.3. Khi nim v chng trnh dch


Chng trnh c vit trong mt ngn ng lp trnh bc cao, hoc bng hp ng, u
c gi l chng trnh ngun (source program).
Bn thn my tnh khng hiu c cc cu lnh trong mt chng trnh ngun. Chng
trnh ngun phi c dch (translate) thnh mt chng trnh ch (target program) trong
ngn ng my (l cc dy s 0 v 1), my mi c th c hiu v thc hin c. Chng
trnh ch cn c gi l chng trnh thc hin (executable program).
Chng trnh trung gian m nhim vic dch c gi l cc chng trnh dch.
Vic thit k chng trnh dch cho mt ngn ng lp trnh cho l cc k kh khn v
phc tp. Chng trnh dch v nguyn tc phi vit trn ngn ng my gii quyt vn
x l ngn ng v tnh vn nng ca cc chng trnh ngun. Tuy nhin, ngi ta thng s
dng hp ng vit cc chng trnh dch. Bi v vic dch mt chng trnh hp ng ra
ngn ng my n gin hn nhiu. Hin nay, ngi ta cng vit cc chng trnh dch bng
chnh cc ngn ng bc cao hoc cc cng c chuyn dng.
Thng thng c hai loi chng trnh dch, hay hai ch dch, l trnh bin dch v
trnh thng dch, hot ng nh sau :
Trnh bin dch (compilater) dch ton b chng trnh ngun thnh chng trnh ch
ri sau mi bt u tin hnh thc hin chng trnh ch.
Trnh thng dch (interpreter) dch ln lt tng cu lnh mt ca chng trnh ngun
ri tin hnh thc hin lun cu lnh dch , cho ti khi thc hin xong ton b
chng trnh.
C th hiu trnh bin dch l dch gi, trnh thng dch l thng dch vin.

NGUYN L LP TRNH HM

Nhng ngn ng lp trnh cp cao ch bin dch hay gp l : Fortran, Cobol, C,


C++, Pascal, Ada, Basic... ch thng dch hay ch tng tc : Basic,Lisp, Prolog...

I.1.4. Phn loi cc ngn ng lp trnh


Cho n nay, c hng trm ngn ng lp trnh c xut nhng trn thc t, ch c
mt s t ngn ng c s dng rng ri. Ngoi cch phn loi theo bc nh ni trn,
ngi ta cn phn loi ngn ng lp trnh theo phng thc (paradigm), theo mc quan
trng (measure of emphasis), theo th h (generation), v.v...
Cch phn loi theo bc hay mc (level) l da trn mc tru tng so vi cc yu t
phn cng, chng hn nh lnh (instructions) v cp pht b nh (memory allocation).
Mc
Thp
Cao

Lnh
S dng b nh
Lnh my n gin
Truy cp v cp pht trc tip
Biu thc v iu khin Truy cp v cp pht nh cc php
tng minh
ton, chng hn new

Rt cao My tru tng

Truy cp n v t ng cp pht

V d
Hp ng, Autocode
FORTRAN, ALGOL,
Pascal, C, Ada
SELT, Prolog,
Miranda

Hnh I.2. Ba mc ca ngn ng lp trnh.


Nhng nm gn y, ngn ng lp trnh c pht trin theo phng thc lp trnh (cn c gi
l phong cch hay kiu lp trnh). Mt phng thc lp trnh c th c hiu l mt tp hp cc tnh
nng tru tng (abstract features) c trng cho mt lp ngn ng m c nhiu ngi lp trnh
thng xuyn s dng chng. S sau y minh ho s phn cp ca cc phng thc lp trnh :
Phng thc lp trnh
Mnh lnh

Th tc

Hng
X l
i tng song song

Khai bo

Lgic

Hm

C s
d liu

Hnh I.3. Phn cp ca cc phng thc lp trnh.


Sau y l mt s ngn ng lp trnh quen thuc lit k theo phng thc :
Cc ngn ng mnh lnh (imperative) c Fortran (1957), Cobol (1959), Basic (1965),
Pascal (1970), C (1971), Ada (1979)...
Cc ngn ng nh hng i tng (object-oriented) c Smalltalk (1969), C++
(1983), Eiffel (1986), Java (1991), C# (2000), ...
Cc ngn ng hm (functional) c Lisp (1958), ML (1973), Scheme (1975), Caml
(1987), Miranda (1982), ...
Cc ngn ng da logic (logic-based) ch yu l ngn ng Prolog (1970).
Ngn ng thao tc c s d liu nh SQL (1980)...
Cc ngn ng x l song song (parallel) nh Ada, Occam (1982), C-Linda, ...
Ngoi ra cn c mt s phng thc lp trnh ang c pht trin ng dng nh :

LP TRNH HM

Lp trnh phn b (distributed programming).


Lp trnh rng buc (constraint programming).
Lp trnh hng truy cp (access-oriented programming).
Lp trnh theo lung d liu (dataflow programming), v.v...

Vic phn loi cc ngn ng lp trnh theo mc quan trng l da trn ci g (what) s
thao tc c (achieved), hay tnh c (computed), so vi cch thao tc nh th no (how).
Mt ngn ng th hin ci g s thao tc c m khng ch ra cch thao tc nh th no
c gi l ngn ng nh ngha (definitional) hay khai bo (declarative). Mt ngn ng th
hin cch thao tc nh th no m khng ch ra ci g s thao tc c gi l ngn ng thao
tc (operational) hay khng khai bo (non-declarative), l cc ngn ng mnh lnh.

Hnh I.4. Pht trin ca ngn ng lp trnh.


Cc ngn ng lp trnh cng c phn loi theo th h nh sau :
Th h 1 : ngn ng my
Th h 2 : hp ng
Th h 3 : ngn ng th tc
Th h 4 : ngn ng p dng hay hm
Th h 5 : ngn ng suy din hay da logic
Th h 6 : mng n-ron (neural networks)

NGUYN L LP TRNH HM

Trc khi nghin cu lp cc ngn ng lp trnh hm, ta cn nhc li mt s c im


ca lp cc ngn ng lp trnh mnh lnh.

I.1.5. Ngn ng lp trnh mnh lnh


Trong cc ngn ng mnh lnh, ngi lp trnh phi tm cch din t c thut ton,
cho bit lm cch no gii mt bi ton cho. M hnh tnh ton s dng mt tp hp
(hu hn) cc trng thi v s thay i trng thi. Mi trng thi phn nh ni dung cc bin
d liu c khai bo. Trng thi lun b thay i do cc lnh iu khin v cc lnh gn
gi tr cho cc bin trong chng trnh. Chng trnh bin dch cho php lu gi cc trng
thi trong b nh chnh v thanh ghi, ri chuyn cc php ton thay i trng thi thnh cc
lnh my thc hin.
Tn kiu

integer

Tn bin

Kiu :
tp hp gi tr

..., 1, 0, 1, ...

tp hp php ton

+, , , /, ...

cu trc lu tr
bit 14 13
2
2
du

. . .

22

21

20

Mc
ngn ng
Mc
chng
trnh
dch
S
5

biu din theo bit :


0

...

Mc
my

Hnh I.5. Quan h gia tn bin, kiu v gi tr trong ngn ng mnh lnh
Hnh I.5. minh ha cch khai bo d liu trong cc ngn ng mnh lnh v cc mi quan
h theo mc. Ngi ta phn bit ba mc nh sau : mc ngn ng lin quan n tn bin, tn
kiu d liu v cu trc lu tr ; mc chng trnh dch lin quan n phng php t chc
b nh v mc my cho bit cch biu din theo bit v gi tr d liu tng ng. Mi khai
bo bin, v d int i, ni kt (bind) tn bin (i) vi mt cu trc c trng bi tn kiu
(int) v vi mt gi tr d liu c biu din theo bit nh lnh gn i := 5 (hoc nh mt
lnh va khai bo va khi gn int i=5). T hp tn, kiu v gi tr to nn c trng
ca bin.
Cc ngn ng mnh lnh c s dng hiu qu trong lp trnh do ngi lp trnh c th
tc ng trc tip vo phn cng. Tuy nhin, tnh thc dng mnh lnh lm hn ch tr tu
ca ngi lp trnh do phi ph thuc vo cu trc vt l ca my tnh. Ngi lp trnh lun
c khuynh hng suy ngh v nhng v tr lu tr d liu c t tn (nguyn tc a ch
ho) m ni dung ca chng thng xuyn b thay i. Thc t c rt nhiu bi ton cn s
tru tng ho khi gii quyt (ngha l khng ph thuc vo cu trc vt l ca my tnh),
khng nhng i hi tnh thnh tho ca ngi lp trnh, m cn i hi kin thc Ton hc
tt v kh nng tru tng ho ca h.
T nhng l do trn m ngi ta tm cch pht trin nhng m hnh tng tc khng phn
nh mi quan h vi phn cng ca my tnh, m lm d dng lp trnh. tng ca m hnh
l ngi lp trnh cn c t ci g s c tnh ton m khng phi m t cch tnh nh th
no. S khc nhau gia nh th no v ci g, cng nh s khc nhau gia cc ngn ng

LP TRNH HM

mnh lnh v cc ngn ng khai bo, khng phi lun lun r rng. Cc ngn ng khai bo
thng kh ci t v kh vn hnh hn cc ngn ng mnh lnh. Cc ngn ng mnh lnh
thng gn gi ngi lp trnh hn.
Sau y l mt s c trng ca ngn ng lp trnh mnh lnh :
S dng nguyn l tinh ch tng bc hay lm mn dn, x l ln lt cc i tng
d liu c t tn.
Khai bo d liu ni kt mt tn bin c khai bo vi mt kiu d liu v mt
gi tr. Phm vi hot ng (scope) ca cc bin trong chng trnh c xc nh bi
cc khai bo, hoc ton cc (global), hoc cc b (local).
Cc kiu d liu c bn thng dng l s nguyn, s thc, k t v lgic. Cc kiu mi
c xy dng nh cc kiu cu trc. V d kiu mng, kiu bn ghi, kiu tp hp,
kiu lit k,...
Hai kiu d liu c cng tn th tng ng vi nhau, hai cu trc d liu l tng
ng nu c cng gi tr v c cng php ton x l.
Trng thi trong (b nh v thanh ghi) b thay i bi cc lnh gn. Trng thi ngoi
(thit b ngoi vi) b thay i bi cc lnh vo-ra. Gi tr c tnh t cc biu thc.
Cc cu trc iu khin l tun t, chn la (r nhnh), lp v gi chng trnh con.
Chng trnh con thng c hai dng : dng th tc (procedure) v dng hm
(function). S khc nhau ch yu l hm lun tr v mt gi tr, cn th tc th khng
khng nht thit tr v gi tr. Vic trao i tham bin (parameter passing) vi chng
trnh con hoc theo tr (by value) v theo tham chiu (by reference).
S dng chng trnh con thng gy ra hiu ng ph (side effect) do c th lm thay
i bin ton cc.
Mt chng trnh c xy dng theo bn mc : khi (block), chng trinh con, n
th (module/packages) v chng trnh.

I.2

C s ca cc ngn ng hm

I.2.1. Tnh khai bo ca cc ngn ng hm


Trong cc ngn ng mnh lnh, mt chng trnh thng cha ba li gi chng trnh
con (th tc, hm) lin quan n qu trnh a vo d liu, x l d liu v a ra kt qu
tnh ton nh sau :
begin
GetData(...) ;
{ a vo }
ProcessData(...);
{ x l }
OutPutResults(...);
{ xem kt qu }
end
Trong cc ngn ng lp trnh hm, cc li gi chng trnh con c vit thnh biu thc
rt n gin :
(print
(process-data
(get-data (...))))

NGUYN L LP TRNH HM

Cc ngn ng hm l cng cc ngn ng bc cao, mang tnh tru tng hn so vi cc


ngn ng mnh lnh.
Nhng ngi lp trnh hm thng trnh s dng cc bin ton cc, trong khi , hu ht
nhng ngi lp trnh mnh lnh u phi s dng n bin ton cc.
Khi lp trnh vi cc ngn ng hm, ngi lp trnh phi nh ngha cc hm ton hc d
suy lun, d hiu m khng cn quan tm chng c ci t nh th no trong my.
Nhng ngi theo khuynh hng lp trnh hm cho rng cc lnh trong mt chng trnh
vit bng ngn ng mnh lnh lm thay i trng thi ton cc l hon ton bt li. Bi v rt
nhiu phn khc nhau ca chng trnh (chng hn cc hm, cc th tc) tc ng khng trc
tip ln cc bin v do vy lm chng trnh kh hiu. Cc th tc thng c gi s dng
cc phn khc nhau ca chng trnh gi nn rt kh xc nh cc bin b thay i nh th
no sau li gi. Nh vy, s xut hin hiu ng ph lm cn tr vic chng minh tnh ng
n (correctness proof), cn tr ti u ha (optimization), v cn tr qu trnh song song t
ng (automatic parrallelization) ca chng trnh.
Mt ngn ng hm, hay ngn ng p dng (applicative language) da trn vic tnh gi
tr ca biu thc c xy dng t bn ngoi li gi hm. y, hm l mt hm ton hc
thun ty : l mt nh x nhn cc gi tr ly t mt min xc nh (domain) tr v cc gi
tr thuc mt min khc (range hay co-domain).
Mt hm c th c, hoc khng c, cc tham i (arguments hay parameters) sau khi
tnh ton, hm tr v mt gi tr no . Chng hn c th xem biu thc 2 + 3 l hm tnh
tng (php +) ca hai tham i l 2 v 3.
Ta thy rng cc hm khng gy ra hiu ng ph trong trng thi ca chng trnh, nu
trng thi ny c duy tr cho cc tham i ca hm. Tnh cht ny ng vai tr rt quan
trng trong lp trnh hm. l kt qu ca mt hm khng ph vo thi im (when) hm
c gi, m ch ph thuc vo cch gi n nh th no i vi cc tham i.
Trong ngn ng lp trnh mnh lnh, kt qu ca biu thc :
f(x) + f(x)
c th khc vi kt qu :
2 * f(x)
v li gi f(x) u tin c th lm thay i x hoc mt bin no c tip cn bi f. Trong
ngn ng lp trnh hm, c hai biu thc trn lun c cng gi tr.
Do cc hm khng ph thuc nhiu vo cc bin ton cc, nn vic lp trnh hm s d
hiu hn lp trnh mnh lnh. V d gi s mt trnh bin dch cn ti u php tnh :
f(x) + f(x)
thnh :
2 * f(x)
Khi , trnh bin dch mt ngn ng hm lun lun xem hai kt qu l mt, do c tnh
nht qun trong kt qu tr v ca hm. Tuy nhin, mt trnh bin dch ngn ng mnh lnh,
ngn ng Ada1 chng hn, th u tin phi chng minh rng kt qu ca li gi th hai
khng ph thuc vo cc bin b thay i trong qu trnh thc hin bi li gi th nht.
1

Ada l ngn ng lp trnh bc cao c pht trin nm 1983 bi B Quc phng M (US Department of
Defense), cn gi l Ada 83, sau c pht trin bi Barnes nm 1994, gi l Ada 9X. Ngn ng Ada ly tn
ca nh n Ton hc ngi Anh, Ada Augusta Lovelace, con gi ca nh th Lord Byron (17881824). Ngi
ta tn vinh b l ngi lp trnh u tin.

10

LP TRNH HM

Mt trnh bin dch song song s gp phi vn tng t nu trnh ny mun gi hm


theo kiu gi song song.
Bn cnh tnh u vit, ta cng cn xem xt nhng bt li vn c ca lp trnh hm :
nhc im ca ngn ng hm l thiu cc lnh gn v cc bin ton cc, s kh khn trong
vic m t cc cu trc d liu v kh thc hin qu trnh vo/ra d liu.
Tuy nhin, ta thy rng s thiu cc lnh gn v cc bin ton cc khng nh hng hay
khng lm kh khn nhiu cho vic lp trnh. Khi cn, lnh gn gi tr cho cc bin c m
phng bng cch s dng c cu tham bin ca cc hm, ngay c trong cc chng trnh vit
bng ngn ng mnh lnh.
Chng hn ta xt mt hm P s dng mt bin cc b x v tr v mt gi tr c kiu bt
k no (SomeType). Trong ngn ng mnh lnh, hm P c th lm thay i x bi gn
cho x mt gi tr mi. Trong mt ngn ng hm, P c th m phng s thay i ny bi
truyn gi tr mi ca x nh l mt tham i cho mt hm ph tr thc hin phn m cn li
ca P. Chng hn, s thay i gi tr ca bin trong chng trnh P :
function P(n: integer) > SomeType ;
x: integer := n + 7
begin
x := x * 3 + 1
return 5 * g(x)
end ;
ta c th vit li nh sau :
function P(n : integer) > SomeType ;
x: integer := n + 7
begin
return Q(3*x + 1) % m phng x := x * 3 + 1
end ;
trong , hm mi Q c nh ngha nh sau :
function Q(x: integer) > Some Type
begin
return 5 * g(x)
end ;
Ta cng c th s dng k thut ny cho cc bin ton cc. Nh vy, vic m phng lp
trnh mnh lnh trong mt ngn ng hm khng phi l cch mong mun, nhng c th lm
c.
Mt vn ni bt trong ngn ng hm l s thay i mt cu trc d liu. Trong ngn
ng mnh lnh, s thay i mt phn t ca mt mng rt n gin. Trong ngn ng hm,
mt mng khng th b thay i. Ngi ta phi sao chp mng, tr ra phn t s b thay i,
v thay th gi tr mi cho phn t ny. Cch tip cn ny km hiu qu hn so vi php gn
cho phn t.
Mt vn khc ca lp trnh hm l kh nng hn ch trong giao tip gia h thng
tng tc vi h iu hnh hoc vi ngi s dng. Tuy nhin hin nay, ngi ta c xu
hng tng cng th vin cc hm mu x l hng i tng trn cc giao din ho
(GUI-Graphic User Interface). Chng hn cc phin bn thng dch h Lisp nh DrScheme,
MITScheme, WinScheme...

NGUYN L LP TRNH HM

11

Tm li, ngn ng hm da trn vic tnh gi tr ca biu thc. Cc bin ton cc v php
gn b loi b, gi tr c tnh bi mt hm ch ph thuc vo cc tham i. Thng tin trng
thi c a ra tng minh, nh cc tham i ca hm v kt qu.
Sau y ta s xt nhng khi nim c coi l c bn nht trong cc ngn ng hm : hm
(function), danh sch (lists), kiu (type), tnh a kiu (polymorphism), cc hm bc cao
(higherorder functions), tham i ha tng phn (Currying), tnh hm theo kiu khn
ngoan2 (lazy evaluation), phng trnh (equations), so khp (patterm matching).
Cc hm quy (recursive functions) l mt trong nhng khi nim chnh trong ngn ng
hm. Cc hm bc cao v phng php tnh hm theo kiu khn ngoan to th mnh cho lp
trnh hm v ng vai tr quan trng trong vic xy dng cc chng trnh hm dng n th
(modular functional programs). Tnh a kiu b sung tnh mm do cho h thng nh kiu.
Trc khi tm hiu ngn ng Scheme bt u t chng 2, cun sch s dng ngn ng
Miranda trnh by nhng khi nim c bn ca lp trnh hm. Miranda l mt ngn ng
hm c c php d c, d hiu do David Turner pht trin nm 1986. c im ca Miranda
l thun tu hm (purely functional), khng xy ra hiu ng ph. Mt chng trnh Miranda,
c gi l mt script, l mt tp hp cc phng trnh (equation) c nh ngha theo
mt th t tu no (ni chung th t khng quan trng).
Trnh thng dch Miranda chy ch tng tc trong h iu hnh Unix. Sau y, chng
ti khng trnh by y c php ca Miranda m ch qua cc v d ca Miranda minh
ho cc yu t thun tu hm ca lp trnh hm.
V d sau y la mt chng trnh Miranda n gin. Ch cp k hiu || bt u
mt dng ch thch ca Miranda.
z = sq x / sq y
sq n = n * n
x = a + b
y = a - b
a = 10
b = 5

|| z = sq(x)/sq(y) = x2/y2
|| sq(n) = n2

I.2.2. nh ngha hm
Hm l khi nim c bn trong cc ngn ng hm. Mt hm c th nhn t khng n
nhiu tham i vo tnh ton v tr v mt gi tr, gi tr ny ch ph thuc vo cc tham
i nhn m thi.
Trong Miranda, mt hm c nh ngha bi hai phn : phn khai bo v phn nh
ngha hm. Phn khai bo c th vng mt c dng mt nguyn mu hm :
<tn hm> :: <min xc nh> -> <min gi tr>
Phn nh ngha hm c dng mt phng trnh, gm v tri v mt s v phi, mi v
phi c th c mt iu kin ng vai tr lnh gc (guard) phn bit ng cui :
<tn hm> [ <danh sch tham i> ] = <biu thc> [ <iu kin> ]
V d hm i nhit t Fahrenheit (F) sang Celsius (C) c nh ngha trong
Miranda nh sau :
celsius :: num > num
|| khai bo kiu hm
celsius f = (f 32)*5/9
|| i t Fahrenheit sang Celsius
2

Trong cun sch c nhiu thut ng ting Vit do tc gi t dch t ting Anh.

12

LP TRNH HM

Dng u tin khai bo celsius l mt hm nhn mt i s v tr v mt gi tr s.


Dng th hai tnh i nhit . p dng hm celsius nh ngha cho cc i s c th,
ta c :
celsius 68
--> 20
celsius (-40)
--> -40
y, k hiu --> dng ch rng gi tr tr v ca hm l nhng g theo sau k hiu
ny. Chng hn, li gi celsius 68 tr v gi tr 20.
Ngn ng Miranda s dng c php ngn gn v khng s dng cc cp du ngoc
bao bc cc tham i hoc bao bc cc li gi hm.
Cc hm quy ng vai tr quan trng trong cc ngn ng hm. Chng hn, xt mt v
d c in l tnh c s chung ln nht gcd (greatest common divisor) theo thut ton
Euclide :
gcd a b

= gcd (a-b) b,
= gcd a (b-a),
= a,

if a > b
if a < b
if a=b

|| hoc otherwise

Hm gcd c nh ngha nh phng trnh c 3 v phi phn bit, mi v phi cha


mt iu kin (a > b, a < b v a=b hay otherwise). Miranda s thc hin gi quy
cho n khi gp iu kin dng l a=b v cng l kt qu tnh gcd. Ta thy cc lnh gc
trong phng trnh thc hin tng t lnh if trong ngn ng mnh lnh.
Trong cc gio trnh nhp mn Tin hc, ngi ta thng ly v d tnh giai tha ca mt
s nguyn khng m bng phng php quy. Ta s thy ngn ng Miranda tnh giai tha
kiu quy nh sau :
fac :: num > num
fac n = 1, if n = 0
fac x = x * fac (x - 1), otherwise

|| fac 0 = 1
|| li gi quy

so snh, chng trnh di y ch ra cch tnh n! trong mt ngn ng mnh lnh


nhng khng dng quy (ch dng quy khi tht cn thit !).
function fac (n: integer) : integer ;
var i, r: integer ;
% r cha kt qu
begin
r := 1
{ tnh n * (n - 1) * (n - 2) * ... * 1 : }
for i :=n downto 1 do r := r * i;
return r
end;
Hm fac trn y s dng mt bin trng thi r b thay i gi tr trong vng lp for.
Cn chng trnh Miranda khng s dng vng lp for, m s dng mt li gi quy. Mi
li gi quy cho fac tng ng vi mt ln gp ca vng lp for. Do tnh ngn gn ca
li gi quy trong ngn ng hm, nhiu ngi ng h lp trnh hm quan nim rng php
lp trong cc ngn ng mnh lnh l rc ri, lm ngi c kh hiu, kh theo di.
Sau y l mt v d khc tnh nghim mt phng trnh bc hai ax2+bx+c=0 :

NGUYN L LP TRNH HM

13

quadsolve a b c
= error "complex roots",
if delta<0
= [-b/(2*a)],
if delta=0
= [-b/(2*a)] + radix/(2*a),
= [ -b/(2*a) - radix/(2*a)],
where delta = b*b - 4*a*c and radix = sqrt delta
Mnh ca Miranda c th lng nhau (nested) nhiu mc.

I.2.3. Danh sch


Trong hu ht cc ngn ng hm, danh sch (list) l cu trc d liu quan trng nht.
Trong ngn ng Miranda, mt danh sch gm t 0 n nhiu phn t c cng kiu, v d :
[1, 4, 9, 16]
|| danh sch gm 4 s nguyn
[1..10]
|| danh sch 10 s nguyn (1..10)
[u, f, 0]
|| danh sch gm 3 k t
[]
|| danh sch rng (empty list) khng c phn t no
[[2, 4, 6], [0, 3, 6, 9]]
|| danh sch cha hai danh sch cc s
nguyn
week_days = ["Mon","Tue","Wed","Thur","Fri"]
Cc danh sch c th lng nhau (bao hm nhau). Mt im mnh ca Miranda v ca mt
s ngn ng hm khc l cho php nh ngha mt danh sch nh tnh cht d nhn bit ca
cc phn t ca n, tng t cch xc nh mt tp hp trong Ton hc. Mt danh sch c
nh ngha nh vy c gi l nhn bit c hay ngm hiu (list comprehension). V d,
cch vit :
[ n | n <- [1..10] : n mod 2 = 1]
--> [1, 3, 5, 7, 9]
ch nh mt danh sch c th t ca cc s l gia 1 v 10. Danh sch c hiu l gm tt
c cc s n nm gia 1 v 10 tho mn n mod 2 bng 1. Mt v d khc v danh sch nhn
bit c :
[ n*n | n <- [1..100]] || danh sch bnh phng cc s gia 1 v 100
Dng tng qut ca danh sch nhn bit c :
[ body | qualifiers ]
trong mi qualifier hoc l mt b to sinh phn t (generator) c dng nh sau :
var <- exp
k hiu < biu din phn t var thuc () mt tp hp ch nh bi exp, hoc l mt b
lc c dng l mt biu thc lgic thu hp min xc nh ca cc bin c to ra bi b to
sinh. Khi c nhiu thnh phn qualifier cng xut hin th chng c lit k cch nhau
mt du : (du hai chm).
V d sau y tr v danh sch cc hon v ca mt danh sch cho :
perms [] = [[]]
perms L = [ a:T | a <- L : T <- perms (L--[a]) ]
Ta c th nh ngha li hm tnh giai tha nh hm nhn product trong th vin ca
Miranda :

if delt

14

LP TRNH HM

fac n = product [1..n]


Tng t, ta nh ngha hm tnh tng cc s l gia 1 v 100 nh hm sum trong th
vin ca Miranda :
result = sum [1, 3..100]
Ngi ta xy dng nhiu php ton khc nhau trn cc danh sch. Ty theo ngn ng
hm, mt s php ton c th c sn (build-in), mt s php ton khc do ngi s dng t
nh ngha. Cc php ton s cp nht l xy dng (construction) v phn tch
(decomposing) cc danh sch. Chng hn php ton hd (head) ly ra phn t u tin ca
mt danh sch tr v mt phn t. Php ton tl (tail) tr v danh sch cn li (sau khi
ly i phn t u tin).
hd [10, 20, 30]
--> 10
tl [10, 20, 30]
--> [20, 30]
Php ton : (cons) chn mt phn t vo trc cc phn t trong mt danh sch :
5 : []
--> [5]
3 : [4, 5, 6]
--> [3, 4, 5, 6]
0 : [1, 2, 3]
--> [0,1, 2, 3]
Cc php ton khc l : php # (du # t trc danh sch) m s phn t l di
(length) mt danh sch, php ghp (concatenate) ++ (hai du cng lin tip) cc danh sch,
php ! ly t danh sch ra mt s phn t (infix), hm nghch o reverse mt danh sch,
v.v...
[1, 2, 3] ++ [4, 5]
--> [1, 2, 3, 4, 5]

|| ghp hai danh sch

days = week_days ++ ["Sat","Sun"]


days
--> ["Mon", "Tue", "Wed", "Thur", "Fri", "Sat", "Sun"]
# [3..7]
--> 5
|| di mt danh sch
#days
--> 7
days!0
--> "Mon"
Miranda cn c php -- (hai du tr lin tip) tnh hiu ca hai tp hp l hai danh sch :
[1,2,3,4,5] -- [2,4]
--> [1,3,5]
hiu r hn cc lp trnh trong Miranda, sau y ta s vit li mt s hm th vin ca
Miranda. Gi s ta vit hm length tnh di nh sau :

NGUYN L LP TRNH HM

length L = 0, if L = []

15

|| danh sch rng c di 0

|| danh sch khc rng c t nht mt phn t


length L = 1 + length (tl L), otherwise
Tng t, hm concatenate ghp hai danh sch c xy dng nh sau :
concatenate L1 L2 = L2, if L1 = []
concatenate L1 L2
= (hd L1):concatenate (tl L1) L2, otherwise
Hm concatenate c trng cho kiu lp trnh quy ca cc ngn ng hm. Dng
u tin ch cch thot ra khi hm, theo kiu chia tr (divide and conquer). Trong trng
hp ghp mt danh sch rng (if L1 = []) vi mt danh sch bt k khc (L2) th tr v
kt qu chnh l danh sch ny v qu trnh kt thc.
Dng th hai l trng hp tng qut v ghp hai danh sch thnh mt danh sch mi s
dng php ton cons (otherwise) theo kiu quy. Do danh sch th nht L1 [] nn
L1 c t nht mt phn t. Khi danh sch mi (l danh sch kt qu) c to ra bi phn
t u tin ca L1, l (hd L1) ghp vi (php :) mt danh sch cn li. Danh sch cn li
ny li l kt qu ca bi ton ban u nhng nh hn vi tham i th nht l danh sch cn
li ca L1 v tham i th hai l ton b L2. Qu trnh c th tip tc cho n khi danh sch
cn li rng.
Ta c th so snh cch xy dng cc danh sch trong cc ngn ng mnh lnh vi ngn
ng Miranda.
Trong cc ngn ng mnh lnh, danh sch do ngi lp trnh t xy dng thng theo
kiu mc ni s dng bin con tr (pointer) v s dng b nh cp pht ng (dynamic
allocation). Cc php ton trn danh sch l s thao tc mc thp trn cc con tr. Vic cp
pht v gii ta b nh cng do ngi s dng t gii quyt. Thng thng, ngi lp trnh
c xu hng s dng vic cp nht ph hy (destructive updates) trn cc cu trc d liu.
V d, ngi lp trnh Ada ghp danh sch bng cch vit mt th tc cho php mc ni
(hook) hai danh sch vi nhau nh mt php gn con tr, m khng cn xy dng mt danh
sch mi (th ba). Tuy nhin tip cn kiu Ada c th gy ra hiu ng ph nu lm thay i
danh sch th nht.
Trong cc ngn ng hm, ngi lp trnh khng h quan tm n cc con tr v vic cp
pht b nh. Mc du nhng yu t ny l tn ti trong ngn ng hin hnh, nhng chng
c che du mt cch hiu qu i vi ngi lp trnh to nn mt mc tru tng c li
cho ngi lp trnh, gip h trnh c nhng sai st khi lp trnh.
Trong nhng tnh hung nh vy, mt h thng thi gian thc hin RST (Run Time
System) qun l b nh lu tr cc phn t ca danh sch. RTS cho php cp pht b nh khi
cn thit v t ng pht hin nhng khi nh khng cn cn dng n na gii phng
chng.
Ngn ng Miranda cn c kiu d liu tuple tng t kiu bn ghi ca Pascal. l
mt dy phn t khng c cng kiu (danh sch l mt dy phn t c cng kiu tng t
kiu mng array) c vit gia mt cp du ngoc. V d :
employee = ("Kim",True, False , 29)
Cc phn t kiu tuple khng c th t. Vic truy cp n mt phn t ch c th c
thc hin nh php so khp (pattern matching).

16

LP TRNH HM

I.2.4. Php so khp


Nh thy, mt hm trong Miranda c th c nh ngha bng cch s dng nhiu
biu thc v phi khc nhau, theo sau l lnh gc, l cc iu kin nh if x>0,
otherwise hay while. Tuy nhin, Miranda cho php s dng mt c php tng qut
la chn gia cc kh nng da trn cc mu (patterns) dng :
<patterm> = <expression>, <condition>
trong , phn <condition> l ty chn. Mu c th s dng cc tham bin hnh thc, cc
hng v mt s cu trc khc. Khi mt hm c gi, li gi hm gm tn hm v cc tham
i thc s ca n (nu c) s c so khp vi cc mu trong chng trnh. Nu so khp
thnh cng, dng lnh tng ng vi mu c thc hin. Nu c nhiu mu c tm thy,
mu u tin (theo th t vit cc lnh) s c chn.
Sau y l mt s v d n gin minh ha cch nh ngha cc hm s dng php so
khp. Hm cond xt c th vit di dng :
cond true x y = x
cond false x y = y
Hm fac c th vit vi hai dng chng trnh :
fac 0 = 1
fac (n+1) = (n+1) * fac n
Php so khp th nht xy ra nu tham i bng 0. Mu th hai c so ch khi nu tham
i l ln hn hoc bng 1. Khi gi tr ca n c ly gi tr ca tham i tr i 1 mt
cch khn ngoan.
Trng hp tng qut, mt biu thc s xut hin trong mt mu c th c dng V + C,
vi V l mt bin v C l mt trc hng (literal constant). Mu s ch c so nu V c th
nhn mt gi tr khng m. Hm ackerman c nh ngha nh sau :
ack 0 n = n+1
ack (m+1) 0 = ack m 1
ack (m+1) (n+1) = ack m(ack (m+1) n)
Hm tnh s fibonacci th n :
fib 0 = 0
fib 1 = 1
fib (n+2) = fib (n+1) + fib n
Ch : Cc biu thc s tng qut khng th c ly lm cc mu trnh nhp nhng
(ambiguities). V d, mu :
f (n + m) = n * m
l nhp nhng v khng ng. Mt li gi hm, f 9 chng hn, s gy ra kt qu hoc 1*8
hoc 2*7, hoc mt t hp khc tu .
Mu cng c th cha danh sch. V d, hm tnh di ca mt danh sch cho trc
y c th c vit li di dng nh sau :
length [] = 0
length (a : L) = 1 + (length L)
Mu xut hin trong dng th nht tng ng vi danh sch rng, ch c danh sch rng
mi th c so khp c kt qu 0. Dng th hai x l danh sch khc rng. Trong trng
hp ny, mt li gi quy c to ra. Bin a c khp vi phn t u tin ca danh

NGUYN L LP TRNH HM

17

sch tham i v do , L l danh sch cn li tr thnh tham i mi ca hm. Kt qu li


gi quy gim i 1.
Mt s hm x l danh sch khc s dng mu so khp : tnh tng, tch v nghch o
mt danh sch :
sum [] = 0
sum (a:L) = a + sum L
product [] = 1
product (a:x) = a * product x
reverse [] = []
reverse (a:L) = reverse L ++ [a]
truy cp n mt phn t ca kiu bn ghi (tuple), s dng so khp, chng hn bn ghi
c hai phn t :
fst (a, b) = a || truy cp n mt phn t th nht
snd (a, b) = b || truy cp n mt phn t th hai
Sau y nh ngha li hai hm th vin ca Miranda : hm take tr v danh sch n
phn t u tin ca danh sch cho v hm drop tr v phn cn li ca danh sch sau
khi loi b n phn t u tin.
take 0 L = []
take (n+1) [] = []
take (n+1) (a:L) = a : take n L
drop 0 L = L
drop (n+1) [] = []
drop (n+1) (a:L) = drop n L
Ch rng hai hm c nh ngha sao cho ng nht thc sau y tho mn (bao gm
c trng hp oi om l di ca L nh thua n) :
take n L ++ drop n L = L

I.2.5. Phng php currying (tham i ho tng phn)


Mt yu t quan trng khc ca hu ht cc ngn ng hm l phng php currying (ly
tn nh logic hc Haskell B. CURRY.), hay cn c gi l phng php tham i ho tng
phn (partial parametrization).
Thng thng mt hm c thc hin theo kt hp tri, nu vit f x y (hm f tc ng
ln hai i x y), vit quy c (x, y) f(x, y), th cng c xem nh vit (f x) y, ngha l kt
qu ca vic p dng f cho x l mt hm p dng cho y. Ta vit x (y f (x, y)).
Mt cch tng qut cho hm n bin f (x1, x2,..., xn) :
x1 (x2 (x3 ...(xn f (x1, ...,xn)) ...))
Chng hn xt hm mult c nh ngha nh sau :
mult x y = x * y
Nu hm mult c gi vi hai i s, th mult s tnh tch s ca hai i s ny, theo
ngha thng thng. Tuy nhin trong ngn ng Miranda, mult c th c xem nh hm
mt tham i (i th nht x), kt qu s l mt hm khc, p dng cho mt tham i (i
th hai y).

18

LP TRNH HM

Mt cch tng qut, mt hm no c nhiu hn mt tham i c th c tham i


ha tng phn. Chng hn ta nh ngha hm triple nhn 3 mt s :
triple x = 3 * x
Nhng cng c th nh ngha li hm triple theo cch currying :
triple = mult 3
Li gi :
triple 7
cho kt qu l 21 v dn n li gi mult 3 7.

I.2.6. Khi nim v bc ca hm


Trong phn ln cc ngn ng mnh lnh, cc i tng c s (bin v hng) c x l
khc vi hm. Chng c th c c vo (t bn phm, t tp...), a ra (mn hnh, my in,
tp...), trao i gi tr vi nhau, nhng hm ch c th c gi hoc c kch hot (invoke).
Cc i tng c s c gi l c bc 0, cc hm c cc tham i l nhng i tng c
s c gi l cc hm bc 1. Mt hm bc n nhn cc tham i bc nh hn n, c cc
biu thc bc cao hn.
Khi nim v bc c Russel (Russell's Paradox) v Whitehead (Principia Mathematica
~1900) xut nhm loi b nhng nghch l (paradox) thng hay gp trong l thuyt tp hp
ca Cantor, chng hn nghch l v ngi th co (barber paradox), bng cch lm gim tt c
cc kh nng xy ra vng lun qun. Trong lgic v t bc mt, ch c th s dng cc lng t
p dng cho cc c th (cc bin). Cn trong lgic v t bc hai, ngi ta c th lng t ho
cc v t...
Trong cc ngn ng hm, hm lun lun c x l nh nhng i tng c truyn
tham i tr v kt qu v c lu gi trong cc cu trc d liu. Mt hm nhn mt hm
khc nh l mt tham i c gi l hm bc cao. Cc hm bc cao mang li tnh hiu qu
v l nn tng (corner-stone) ca lp trnh hm.
hiu bn cht ca mt hm bc cao, ngi c c th t tm gi tr kt qu ca
answer t cc lnh Miranda sau y :
answer = twice twice twice suc 0
twice f x = f(f x)
suc x = x + 1
Ngn ng Miranda lun xem nhng hm c nhiu hn mt tham i u l cc hm bc
cao. Chng hn t hm th vin member x L kim tra danh sch L c cha phn t x
khng (kt qu l true hoc false), ta c th p dng nh ngha cc hm khc nhau
nh sau :
vowel = member ['a', 'e', 'i', 'o', 'u']
digit =
member ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
month =
member [ "Jan", "Feb", "Mar", "Apr", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec" ]
Cc ngn ng hm u c php ton bao qua phi (foldr right) dng tnh ton trn
cc phn t ca mt danh sch. Miranda c hm foldr c nh ngha nh sau :

NGUYN L LP TRNH HM

19

foldr op k [] = k
foldr op k (a:L) = op a (foldr op k L)
Li gi hm foldr :
foldr (+) 0 [2, 4, 7]
tng ng vi :
(2 + (4 + (7 + 0)))
--> 13
Ch cc php ton trung t trong ngn ng Miranda, nh php cng + trn y, c
xem l tham i v phi c t trong mt cp du ngoc.
Ta c th nh ngha cc hm x l danh sch s dng hm foldr. Chng hn hm tnh
tng tt c cc phn t ca mt danh sch theo kiu currying nh sau :
sumlist = foldr (+) 0
Hm sumlist c mt tham i l danh sch s cung cp ba tham i cho hm foldr
nhng kt qu l do hm op c mt tham i tr v.
sumlist [2, 9, 52]
--> foldr (+) 0 [2, 9, 52]
--> 63
Mt cch tng t ta nh ngha hm tnh tch ca tt c cc phn t trong mt danh
sch :
product = foldr (*) 1
Hm :
and = foldr (&) true
gi php v lgch cho tt c cc phn t ca mt danh sch. Kt qu php gi hm and
L l true nu mi phn t ca danh sch L u l true, kt qu l false nu ngc li.
Hm nghch o mt danh sch :
reverse = foldr postfix []
where postfix a L = L ++ [a]
Cc ngn ng hm c nhiu hm bc cao tin nh, v ngi lp trnh cng c th t nh
ngha nhng hm bc cao mnh v tng qut nh hm foldr va xt.
Mt hm bc cao quan trng khc l map f L vi f l mt hm v L l mt danh sch.
Hm map tr v kt qu l mt danh sch mi gm cc phn t ca L c p dng cho
hm f. V d :
map triple [1, 2, 3, 4]
--> [triple 1, triple 2, triple 3, triple 4]
--> [3, 6, 9, 12]
Hm map gi triple cho tt c cc phn t ca danh sch [1, 2, 3, 4], tr v
danh sch cc s nguyn c nhn ba l [3, 6, 9, 12].

20

LP TRNH HM

I.2.7. Kiu v tnh a kiu


Cc ngn ng hm c mt h thng kiu d liu hon ton khc vi cc ngn ng mnh
lnh. Trong cc ngn ng mnh lnh (nh Pascal, C, Ada..), tnh nh kiu tnh cht ch
(static strong typing) bt buc ngi lp trnh phi m t kiu cho mi bin dng n. Sau khi
khai bo, ngi s dng khng c thay i kiu d liu ca bin trong khi chy chng
trnh.
Cc ngn ng hm thng khng s dng nh kiu. Tuy nhin mt s ngn ng hm li
s dng nh kiu ng (dymamic typing) hoc nh kiu n cht ch (implicit strong typing)
(thng gp trong ngn ng Fortran).
Nh vy, cc ngn ng hm to ra c tnh mm do v cc hm a kiu (polymorphic
functions) vi li gi c cc tham i c cc kiu d liu khc nhau.
Miranda s dng ch nh kiu tnh cht ch tng minh (implicit static strong
typing). Mi bin mi biu thc u c mt kiu c xc nh tnh. C ba kiu tin nh
trong Miranda l num, bool v char. Kiu num khng phn bit s nguyn hay s thc.
Kiu bool c hai gi tr hng l true v false. Kiu char gm cc k t ASCII. Mt
hng k t c t gia cp du nhy n v s dng quy c tng t ngn ng C, nh
x, &, \n, v.v...
Nu T l mt kiu, th [T] l mt kiu danh sch gm cc phn t kiu T. V d danh
sch sau y :
[[1, 2], [2, 3], [4, 5]]
c kiu [[num]] v y l mt danh sch gm cc phn t l danh sch cc s. Mt hng
chui c dng [ char ], chng hn chui bonjour c vit trong Miranda [b,
o, n, j, o, u, r].
Nu T1, ..., Tn l cc kiu no , n>0, th (T1, ..., Tn) l mt kiu bn ghi, hay b n
phn t bt k. V d b 3 (true, Honda, 7331) c kiu (bool, [char], num).
Nu T1 v T2 l hai kiu no , th T1->T2 l mt kiu hm vi tham i c kiu T1
v gi tr tr v c kiu T2. V d hm triple va nh ngha trn y c kiu :
num > num
Ch php > c kt hp phi (right associative).
Ngi lp trnh c th s dng cc khai bo nh ngha hm. V d, hm mult c khai
bo kiu currying nh sau :
mult :: num > (num > num)
C ngha rng mult c xem l hm c mt tham i tr v mt hm khc c kiu :
num > num.
Du :: trong khai bo hm c c c kiu l (is of type). V d :
sq :: num -> num
sq n = n * n
Tuy nhin, vic khai bo kiu hm l khng cn thit. Cc ngn ng hm thng c kh
nng uy din kiu t ng nh mt b kim tra kiu (type checker). Khi khng khai bo kiu
hm, chng hn nu ch nh ngha hm triple bi :
triple x = 3 * x

NGUYN L LP TRNH HM

21

th b kim tra kiu s suy ra rng x phi l mt s, v x l mt tha s trong mt php nhn.
B kim tra kiu cng suy ra c rng kt qu ca triple x phi l mt s, do kiu
ca hm ny phi l :
triple :: num > num
Tnh a kiu l yu t rt quan trng trong nhiu ngn ng hm. Vi mi tham bin hnh
thc (formal parameters), mt hm a kiu c th chp nhn li gi tng ng vi nhiu
tham i thc s (actual parameters) c cc kiu khc nhau. Khc vi cc th tc trong Ada,
mt hm a kiu l mt hm n (single function), khng phi l cc hm bi (multiple
functions) c cng tn. V d xt hm a kiu pair sau y tr v mt danh sch t hai tham
i l hai phn t :
pair x y = [x, y]
Hm ny c th c s dng nh sau :
pair 1 2
--> [1, 2]
pair true false
--> [true, false]
pair [] [2]
--> [[], [2]]
Hm pair c nh ngha n, nhng c th s dng nhiu kiu tham i khc nhau,
nh bool, num, [num], v.v..., sao cho c hai tham i u phi c cng mt kiu. Nh vy,
kiu ca hm pair khng th c din t nh kiu ca hm triple va nh ngha
trn, v rng cc kiu ca cc tham i trong pair l khng c nh. Ngi ta a ra gii
php s dng cc bin kiu c th (generic type variables). Bn trong mt khai bo kiu,
mt bin kiu c th ch nh mt kiu no , cng mt bin kiu cho php ch nh cng
mt kiu xuyn sut c khai bo.
Miranda s dng cc k hiu *, **, *** ch nh kiu tu . V d hm ng nht id
(identity) c nh ngha nh sau :
id x = x
Hm id c khai bo kiu nh sau :
id :: * -> *
c ngha l id c nhiu kiu. Sau y l mt s khai bo kiu ca cc hm c nh
ngha trn y :
fac :: num -> num
ack :: num -> num-> num
sum :: [num] -> num
month :: [char] -> bool
reverse :: [*] -> [*]
fst :: (*, **) -> *
snd :: (*, **)-> **
foldr :: (*-> ** -> **) -> ** -> [*] -> **
perms :: [*] -> [[*]]

22

LP TRNH HM

Cc quy tc nh ngha kiu nh trn lm trnh c sai st khi s dng hm khng ng,
chng hn :
pair 1 true
5 + (pair 1 2)

|| cc tham i phi cng kiu


|| kiu kt qu l mt danh sch, khng l mt s.

Trong v d th hai, Miranda xem rng kiu ca (pair 1 2) l mt danh sch cc s,


nn khng th dng lm s hng cho mt php cng.
D cc hm c tha nhn cc tham i khc kiu v khng cn khai bo kiu mt cch
tng minh, h thng kiu va m t trn y l cht ch v dng tnh. S vi phm cc quy
tc nh kiu s dn n cc thng bo li khi dch (compile time error messages).
Tuy nhin vic thm cc khai bo kiu hm thng lm cho b kim tra kiu d vi phm
sai st khi s dng hm.

I.2.8. Tnh hm theo kiu khn ngoan


Thng thng, khi gi tnh gi tr mt hm, cc tham i c tnh gi tr trc tin, sau
mi tin hnh thc hin tnh ton trong hm. Chng hn, li gi :
mult (fac 3) (fac 4)
yu cu tnh gi tr cc hm giai tha (fac 3) v (fac 4) trc, theo mt th t ty ,
sau mi thc hin hm nhn :
mult 6 24
cho kt qu cui cng l 144. Cch vit rt gn biu thc lc u thnh dng n gin hn
c gi l php rt gn theo th t p dng (applicative order reduction). Ch rng php
rt gn c bt u t cc biu thc trong cng nht (innermost expressions).
Tuy nhin c mt cch khc rt gn mt biu thc l bt u t biu thc ngoi nht
(outermost expression) v khng tnh gi tr cc biu thc con (subexpressions) cho n khi
cn dng n kt qu ca chng.
Ngi ta gi cch ny l rt gn theo th t thng (normal order reduction). Chng hn
biu thc :
mult (fac 3) (fac 4)
s c rt gn thnh :
(fac 3) * (fac 4)
sau thnh :
6 * 24
nhn c kt qu 144.
Nhng ngi lp trnh c kinh nghim trn cc ngn ng mnh lnh c th ngh rng
php rt gn theo th t p dng l thun tin hn, nhng cch ny cng c nhng iu bt
tin.
Gi s rng ta mun xy dng hm cond nhn mt gi tr bool b nh l tham i th
nht v tr v tham i th hai ca n nu b c gi tr true hoc tr v tham i th ba nu
b l false :
cond b x y = x, if b
cond b x y = y, otherwise
hay gn hn :

NGUYN L LP TRNH HM

23

cond true x y = x
cond false x y = y
Nu c ba tham i ca cond c tnh gi tr trc khi hm cond c thc hin, th
s xy ra hai trng hp :
Mt trong cc tham i ca cond tham gia tnh ton mt cch v ch, dn n kt qu
sai, chng hn cond (x=0) 0 (1/x) vi x=0.
Nu vic tnh ton biu thc tham i l v ch v khng kt thc th s gy ra ton b
biu thc b tnh lp v hn ln.
Trng hp th hai c th c minh ha qua v d sau : gi s ta cng s dng hm
cond cho mt nh ngha khc ca hm fac :
fac n = cond (n = 0) 1 (n * fac (n - 1))
Nu tham i th ba ca cond lun lun c tnh, th hm fac s khng bao gi dng.
Bi v li gi fac 1 ko theo li gi fac 0, li gi fac 0 s ko theo li gi fac 1
v c th tip tc.
Nhng vn trn dn n khi nim tnh gi tr theo kiu khn ngoan trong lp trnh
hm s dng php rt gn theo th t thng. tng ca phng php tnh gi tr hm theo
kiu khn ngoan l ch tnh gi tr cc tham i ca mt hm khi cc gi tr ca chng l cn
thit, nhng biu thc no khng cn thit th b qua.
S dng tnh gi tr hm theo kiu khn ngoan, php tnh hm fac 1 s c rt gn
nh c trnh by di y. Vic tnh gi tr kt thc v cho kt qu ng. y ta s dng
biu thc if dng gi ng (pseuclo-notation). Tham i th ba ca cond s khng c
tnh nu n bng 0, v rng trong trng hp ny, khng cn tnh tham i na.
fac 1
--> cond (1=0) 1 (1*fac (1-1))
|| gi fac
--> if (1=0) then 1 else (1*fac (1-1))
--> if false then 1 else (1*fac (1-1))
--> 1*fac (1-1)

|| gi cond
|| tnh 1 = 0

--> 1*(cond (1-1 = 0) 1 ((1-1)-1)))


|| gi fac
--> 1*((if 1-1=0) then 1 else ((1-1)*fac ((1-1)-1)))
|| gi cond
--> 1*((if true then 1 else ((1-1)*fac ((1-1)-1)))
|| tnh 1-1 = 0
--> 1*1
|| tnh 1*1
--> 1
Phng php tnh hm kiu khn ngoan cn th hin mt li ch quan trng khc : cho
php nh ngha cc cu trc d liu v hn theo kiu nim (conceptually infinite). Chng
hn trong Miranda, danh sch cc s nguyn dng c th c nh ngha :
[1.. ]
Danh sch theo kiu nh ngha ny c th tham gia tnh ton nh mi danh sch khc.
Chng hn :
hd [1.. ]
--> 1
hd (tl [1.. ])

|| phn t th nht

24

LP TRNH HM

--> 2
|| phn t th hai
hd (tl (map triple [1.. ]))
--> 6
|| phn t th hai ca danh sch c nhn 3
Thc t, ngn ng Miranda ch cho php xy dng cc danh sch hu hn. Ch khi ton
b cc phn t ca danh sch c yu cu, nh l :
sumlist [1..]
|| cng dn tt c cc s nguyn dng
hoc :
#[1.. ]
|| tnh di ca danh sch v hn
s lm cho h thng ri vo mt vng lp v hn (hoc gy trn b nh). Sau y l mt s v
d khc :
ones = 1 : ones
repeat a = L
where L = a : L
nats = [0.. ]
odds = [1, 3.. ]
squares = [ n*n | n <- [0.. ] ]
perfects = [ n | n <- [1.. ] : sum(factors n) = n ]
|| Tm cc s nguyn t n 2
primes = sieve [ 2.. ]
where sieve (p:x)=p : sieve [n|n<-x: n mod p>0 ]
Mc d phng php tnh gi tr hm theo kiu khn ngoan t ra c nhiu u th nhng
thc t, vic ci t rt tn km. Mt vn xy ra l chin lc rt gn theo th t thng
c th tnh mt biu thc mt nhiu ln, trong khi php rt gn theo th t p dng ch tnh
gi tr cc biu thc ng mt ln. Chng hn, t nh ngha hm double sau y :
double x = x + x
Php rt gn theo th t thng tnh biu thc :
double 23 * 45
nh sau :
double 23 * 45
--> 23 * 45 + 23 * 45
--> 1035 + 23 * 45
--> 1035 + 1035
--> 2070
Trong khi , php rt gn theo th t p dng li tnh n gin hn v hiu qu hn :
double 23 * 45
--> double 1035
--> 1035 + 1035
--> 2070
Vn ny c th c gii quyt bng cch s dng k thut th rt gn (graph
reduction). y l k thut hoc khng tnh, hoc tnh gi tr cc biu thc ng mt ln,
nhng khng tnh nhiu ln.
Mt vn khc l tnh gi tr ca cc tham i trc khi gi hm. Thc t cho thy vic
tnh trc tham i d dng ci t hn l tr hon thc hin chng. Tuy nhin, iu ny lm

NGUYN L LP TRNH HM

25

tng chi ph tnh gi tr hm theo kiu khn ngoan cao hn bnh thng. Hin nay, ngi ta
ang pht trin cc phng php ti u nhm gim tng chi ph ny.
Khng phi mi ngn ng hm u c kiu tnh khn ngoan nh va trnh by. Nhng
ngn ng khng c kh nng ny cho cc hm do ngi s dng t xy dng (user defined
functions) thng c sn mt vi hm vi ng ngha khn ngoan (v d hm cond). Cc
ngn ng mnh lnh cng c nhng yu t mang ng ngha khn ngoan c xy dng sn,
chng hn lnh if. Ngn ng C v Ada c cc php logic (dng short cut) and v or c
bit cho php tnh gi tr tham i th hai ch khi cn thit.

I.2.9. Mt s v d
Sau y ta xt mt s v d khc vit trong Miranda minh ha nhng c trng c bn
ca lp trnh hm va c trnh by trn y : loi b nhng phn t trng nhau trong mt
danh sch c sp xp th t, sp xp nhanh mt danh sch (quicksort), gii bi ton 8
qun hu v tm dy s Hamming.

1. Loi b nhng phn t trng nhau


Ta cn xy dng hm uniq nhn mt danh sch cc phn t c sp xp tr v
mt danh sch loi b nhng phn t trng nhau ng trc, ch gi li mt phn t ng
sau cng. Ta c chng trnh nh sau :
uniq [] = []
|| ca thot (escape hatch) : danh sch rng
uniq (a:(a:L)) = uniq (a:L) || b mt trong hai phn t u tin bng nhau
uniq (a:L) = a : uniq L
|| ch xt danh sch b i phn t u
Dng chng trnh th nht tm thng : danh sch rng xem nh c x l. Dng
th hai s dng kh nng th hin mt bin (a) hai ln trong cng mt v tri. Mt khi dng
ny c tip cn, th mt li gi quy s xut hin vi tham i l danh sch ban u
nhng loi b phn t u (head) do trng nhau. Chng hn danh sch [3, 3, 4] ch
cn li [3, 4] phi x l. Nu nh c hai dng chng trnh u b b qua th dng th ba
c chn. Dng ny ny cng to ra mt li gi quy vi phn t u tin ca danh sch
l ci ra ca n. Chng hn danh sch [3, 4, 5] dn n ch cn phi x l [4, 5].
Cch nh ngha hm uniq trn y s dng cc mu so khp. Mt cch khc l s
dng cc iu kin lnh canh v phi nhng nh vy s lm chng trnh tr nn di
dng hn.
Cui cng, ta thy hm uniq l a kiu. Hm c th c gi vi nhiu kiu khc nhau
ca tham i thc s. Chng hn :
uniq [3, 3, 4, 6, 6, 6, 6, 7]
--> [3, 4, 6, 7]
uniq [a, b, b, c]
--> [a, b, c]

2. Sp xp nhanh quicksort
Thut ton quicksort sp xp nhanh cc phn t ca mt danh sch (thng l cc s)
theo th t khng gim. sp xp, u tin quicksort xc nh gi tr ca phn t u tin
ca danh sch, gi l x. Tip theo, quicksort to ra hai danh sch con, mt danh sch cha
cc gi tr nh hn hoc bng x, v mt danh sch cha gi tr ln hn x. Mi mt danh sch
c sp xp mt cch quy (bng cch gi li quicksort). Cui cng, cc danh sch kt

26

LP TRNH HM

qu v gi tr x c rp li vi nhau v tr v kt qu l danh sch c sp xp. Phn t


c gi l phn t trc (pivot).
Thut ton quicksort c vit nh sau :
quicksort [] = []
|| danh sch rng coi nh c sp xp
quicksort (x:Tail)
|| trng hp tng qut :
= quicksort [a | a<Tail: a<=x ]
|| danh sch con th nht
++ [x]
|| phn t u (head)
++ quicksort [a | a<Tail: a>x ]
|| danh sch con th hai
Dng th nht ca chng trnh x l danh sch rng dng kt thc php quy.
Dng th hai l trng hp tng qut, cho php xy dng hai danh sch con s dng danh
sch nhn bit. V d :
[a | a < Tail : a < = x]
l danh sch tt c cc phn t a ca danh sch Tail c gi tr nh hn hoc bng x. Tip
theo quicksort gi quy cho c hai danh sch con. Cc kt qu v danh sch [x] ch
cha mi phn t x c rp li vi nhau bng cch s dng php ghp danh sch ++.
Thut ton quicksort minh ha kiu lp trnh quy tng qut trong Miranda, cng
nh phn nh tnh u vit ca cc danh sch t nhn bit. Mt khc, hm quicksort l a
kiu, c dng :
quicksort :: [a] > [a]
Ngha l quicksort nhn mt danh sch c kiu bt k lm tham i v tr v mt
danh sch cc phn t sp xp c cng kiu lc u. Chng hn c th gi quicksort
bi nhiu li gi khc nhau nh sau :
quicksort [5, 2, 9, 1]
--> [1, 2, 5, 9]
quicksort [d, a, c, b]
--> [a, b, c, d]

3. Bi ton tm qun hu
Ni dung bi ton tm qun hu (eight queens problem) nh sau : hy tm cch t tm
qun hu ln mt bn c vua (c 88 , lc u khng cha qun c no) sao cho khng c
qun hu no n c qun hu no ? Theo lut c vua, mt qun hu c th n c bt c
qun c (ca i phng) no nm trn cng ct, hay cng hng, hay cng ng cho thun,
hay cng ng cho nghch vi n.

Hnh I.6. Mt li gii ca bi ton tm qun hu.

NGUYN L LP TRNH HM

27

Bi ton tm qun hu c nh Ton hc ngi c Call Friedrich Gauss a ra vo


nm 1850 nhng khng c li gii hon ton theo phng php gii tch. Sau bi ton ny
c nhiu ngi gii trn vn trn my tnh in t, theo nhiu cch khc gii nhau.
tng chung ca mi li gii l phi lm sao t mt qun hu trn mi ct , do vy c
th biu din bn c bi mt danh sch cc s nguyn cho bit v tr hng ca mi qun hu
trong mi ct lin tip. Hm queens n trong chng trnh sau y tr v mi v tr an ton
t cc qun hu trn n ct u tin.
queens 0 = [[]]
queens (n+1)= [q:b | b <- queens n; q <- [0..7]; safe q b]
safe q b = and [ not checks q b i | i <- [0..#b-1] ]
checks q b i = q=b!i or abs(q - b!i) = i+1
Li gi nhn c tt c cc phng n t qun hu l queens 8.

4. Bi ton Hamming
Bi ton Hamming (Hamming problem) sau y minh ha u th ca phng php tnh
gi tr hm theo kiu khn ngoan. Yu cu t ra l to cc s Hamming (Hamming number)
theo th t tng dn (increasing order), mi s c th c vit di dng :
2i 3j 5k
Nh vy, cc s Hamming ch cha cc tha s 2, 3 v 5. Do , kt qu chng trnh
s bt u vi cc s :
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, ...
v chng trnh dng khi ngi s dng khng mun tip tc na.
Thot nhn, ta c th ngh rng bi ton c gii bng cch s dng ba vng lp cho i, j
v k. Tuy nhin, xem xt k th bi ton tr nn hc ba, v rng dy kt qu phi c sp
xp v khng cho php cc s trng nhau.
s Hamming

Qu trnh
2

Qu trnh
3

Qu trnh
5

Trn cc
qu trnh
Hnh I.7. Gii bi ton Hamming nh cc qu trnh gii song song.
C th gii thch bi ton Hamming mt cch tinh t hn bng cch s dng mt m hnh
x l song song nh trong Hnh I.7. M hnh s dng ba qu trnh nhn, mi qu trnh nhn
mt dng gi tr vo ging nhau v to ra mt dng ra phn bit.
Qu trnh th nht nhn cc s a vo vi 2 gi ra dng kt qu. Tng t, qu trnh
th hai nhn cc s vi 3 v qu trnh th ba nhn cc s vi 5 gi ra dng kt qu. Mi

28

LP TRNH HM

mt dng kt qu ra u c sp xp theo th t tng dn. Mt qu trnh th t lm


nhim v trn (merge) ba dng kt qu sao cho cc s a ra c th t tng dn v loi b
mi s trng nhau. Kt qu trn c em quay ngc li thnh dng vo tip tc qu
trnh nhn.
Lc u, gi tr 1 c ly lm dng vo. Nh vy dng vo s cha ng cc s
Hamming theo dy tng dn v khng cha cc s trng nhau.
Gi tr khi u 1 l mt s Hamming, sau c nhn vi 2, 3 hoc 5 cng l nhng s
Hamming, cn cc s khng c to ra theo cch nhn ny s khng phi l cc s
Hamming.
Mc d ngn ng Miranda khng c cc qu trnh song song, nhng m hnh trn y rt
d dng c trin khai trong ngn ng ny, bng cch s dng k thut tnh gi tr hm theo
kiu khn ngoan. Chng trnh Miranda nh sau :
mul :: num > [num] > [num] || nhn cc phn t
mul a s = [a *x | x < s]
|| ca danh sch vi tha s a cho
ham :: [num]
|| to cc s Hamming
ham = 1 : merge3 (mul 2 ham) (mul 3 ham) (mul 5 ham)
Hm mul thc hin php nhn bng cch nhn tt c cc gi tr trong danh sch s vi
mt tha s cho a, l 2, 3 hoc 5. Hm ham xy dng mt danh sch cha gi tr 1 rp vi
cc kt qu ca php trn ba dng tng ng vi ba qu trnh nhn. Hm ham khng c tham
i, nhng chng trnh s c bt u bi li gi ham. Php trn ba dng (3-way merge)
c xem nh l php trn ca hai dng (2-way merge) :
merge3 x y z = merge2 x (merge2 y z)
merge2 (x:xs) (y:ys)
|| trn hai danh sch sp xp
= (x:merge2 xs (y:ys)), if x<y
= (x:merge2 xs ys), if x=y || loi b s trng nhau
= (y:merge2 (x:xs) ys), if x>y
Hm trn hai dng merge3 loi b cc s trng nhau, tng t nh hm trn merge
trong th vin ca ngn ng Miranda.
Chng trnh trn y ch yu da vo k thut tnh gi tr hm theo kiu khn ngoan v
khng th chy c nu khng dng k thut ny. Tht vy, vi ng ngha ngt (strick
semantics), php nhn th nht c bt u vi tha s 2 l (mul 2 ham) s gy ra mt
vng lp v hn. Tuy nhin vi k thut tnh gi tr hm theo kiu khn ngoan, h thng s
tm cch rt gn hm merge3 v ch tnh gi tr cc i s ca n khi thc s cn thit.

NGUYN L LP TRNH HM

I.3

29

Kt lun

Cho n nay, cc ngn ng hm c pht trin l Lisp, ISWIM, FP, Scheme,


Common Lisp, Hope, Standard ML, Miranda, Haskell v Lucid. Phn tip theo ca gio trnh
ny s nghin cu Scheme, mt ngn ng hm c ngun gc t Lisp.
Ngn ng Lisp (List processing languages) c xut bi Mc Carthy t nm 1958.
Rt nhiu khi nim v lp trnh hm c pht trin t ngn ng Lisp. Lisp hin i li
khng phi l ngn ng hm thun ty, m cho php s dng cc php gn cho bin, v do
vy, c th xy ra hiu ng ph.
Tuy nhin, Lisp l ngn ng u tin mang phong cch lp trnh hm. Lisp cho php vit
cc hm quy v cc hm bc cao. Danh sch l cu trc d liu ch yu ca Lisp. Vic cp
pht v gii ta b nh c tin hnh t ng, nh k thut dn rc (garbage collection).
Ngn ng Lisp ch yu c pht trin cho cc ng dng k hiu (symbolic
applications), c bit trong lnh vc tr tu nhn to (artificial intelligence). i vi cc php
tnh s th Lisp s dng khng hiu qu v tc tnh ton chm. Mt im yu khc ca
Lisp l cc chng trnh Lisp thng rt kh c, kh hiu, do c php s dng cc du
ngoc l ch yu. V d, hm factorial tnh giai tha, c vit trong chng trnh Lisp
nh sau :
(defun factorial (n)
(if (<= n 1)
1
(* n (factorial (- n 1)))))
R rng chng trnh ny kh c v kh hiu hn chng trnh Miranda xt trc
y. C php ca Lisp rt n iu (uniform), tuy nhin, iu ny gip cho vic lp trnh v
lu gi cc chng trnh Lisp tr nn d dng nh l d liu chun. Yu t ny cng gip
cho ngi lp trnh d vit cc trnh sa li (debugger) v nhng cng c tin ch ngay trong
Lisp.
Mt vn khc i vi ngn ng Lisp l s thiu vng h thng khai bo kiu. Mt
danh sch c th cha nhiu kiu phn t khc nhau. iu thoi mi ny c th c li trong
mt s trng hp, nhng li gy kh khn cho trnh bin dch khi cn pht hin cc li sai
v s dng kiu d liu. Lisp thng s dng k thut ng cp pht b nh vt l cho
bin (dynamic binding) nn rt d gy ra s ln xn, nhm ln khi s dng bin.
Ngn ng Lisp l t tin trc tip ca nhiu ngn ng khc, c nhiu nh hng n cch
thit k cc ngn ng hm. Cc ngn ng tha k Lisp s dng h thng kiu, cho php s
dng cc k thut tnh gi tr hm theo kiu khn ngoan v so khp.

30

LP TRNH HM

Tm tt chng 1

Lp trnh hm to ra nhng hm nhn cc gi tr vo thuc mt min xc nh cho


ra kt qu l cc gi tr thuc mt min khc, ging nh mt hm ton hc. Cc ngn
ng hm thun ty thiu cc yu t mnh lnh nh php gn v cc lnh lp. Tuy
nhin, cc hm khng gy ra hiu ng ph nh hu ht cc ngn ng mnh lnh gp
phi.
Cc ngn ng hm thun ty c tnh nht qun trong kt qu tr v ca hm, ngha kt
qu ca mt php p dng hm khng ph thuc vo thi im c gi m ch ph
thuc vo cc tham i c cung cp khi gi hm nh th no.
Tnh nht qun khi hm tr v kt qu lm cho mt chng trnh hm d c, d thay
i, d m phng song song v d chng minh tnh ng n.
Nhng khi nim quan trng nht trong cc ngn ng hm l cc hm quy, danh
sch, tnh a kiu, cc hm bc cao, tham i ho tng phn v so khp cc phng
trnh.
Cc ngn ng hm s dng php quy thay cho php lp.
Danh sch l cu trc d liu chnh ca cc ngn ng hm. Nhiu php ton trn danh
sch l tin nh (predefined).
Vic qun l b nh cho cc cu trc d liu c tin hnh t ng. Ngi lp trnh
khng cn quan tm n s c mt ca cc a ch my (machine address) v khng x
l d liu kiu con tr. Vic gii ta b nh khng cn cn dng n na cng c
tin hnh t ng theo k thut dn rc.
Cc ngn ng hm hin i cho php x l cc hm a kiu, mi hm c th nhn
nhiu tham i c kiu khc nhau. Mt s ngn ng hm s dng php nh kiu ngt,
nhng cc kiu lun c suy on (inferred) bi b kim sot kiu v ngi lp trnh
khng cn phi m t trc (nh trong cc ngn ng mnh lnh).
Mt hm bc cao nhn mt hm lm tham i. Cc hm bc cao mang li tnh mm
do ng k cho cc ngn ng hm.
Php rt gn theo th t p dng tnh gi tr cc tham i ca hm trc tin, sau
mi tnh n bn thn hm. Php rt gn theo th t chun li p dng hm cho cc
tham i khng cn tnh gi tr, v ch tnh gi tr cc tham i khi thc s cn thit.
Php rt gn theo th t chun cn c trn k thut tnh gi tr hm theo kiu khn
ngoan, cho php x l cc cu trc d liu v hn nu c th. K thut ny t ra thn
thin hn so vi k thut tnh gi tr c li, nhng kh vn hnh c hiu qu.
Cc ngn ng hm hin i m t cc hm nh mt tp hp cc phng trnh (set of
equations) v s dng k thut so khp la chn cc phng trnh tha mn mt
mu cho.
Cc ngn ng hm khng thun ty (impure functional languages) nh Lisp mang mt
s tnh cht ca ngn ng hm, nhng khng c tnh nht qun khi hm tr v kt qu.

NGUYN L LP TRNH HM

31

Bi tp chng 1
1. Vit cc hm Miranda tnh gn ng gi tr cc hm sau vi chnh xc e = 10-5

1 1 1
= 1 + +...
4
3 5 7

cho n khi

1
<
2n -1

x2
2 x4
2 4 x6
+
+
+ ...
cho n khi phn t th n < e
2
3 4
3 5 6
x2
x3
xn
xn
S = 1 - x +
+ ... + (-1) n
+ ... cho n khi
<
2!
3!
n!
n!

1+

S = 1+

y=

x2 x4 x6
x 2n
+ + +...+
+...
2! 4! 6!
(2n)!

x +

x + ... +

cho n khi

x 2n
< 105
(2n)!

c n > 1 du cn

2. Vit m t chng trnh Miranda tm c s chung l n 4 ca * s nguyn bt k p, q.


3. Cho danh sch cc s nguyn L v mt s nguyn K, hy vit chng trnh bng Miranda
thc hin cc vic sau y :
a) m cc s chia ht cho K trong L ?
b) Kim tra s K c nm trong danh sch L hay khng ?
c) Cho bit v tr phn t u tin trong danh sch L bng K ?
d) Tm tt c cc v tr ca cc phn t bng K trong danh sch L ?
e) Thay phn t bng K trong danh sch L bi phn t K cho ?
4. Vit chng trnh Miranda xa ba phn t u tin v ba phn t cu i cng ca mt
danh sch.
5. Vit chng trnh Miranda xa N phn t u tin c a m t danh sch. Tht bi nu
danh sch khng c N phn t.
6. Vit chng trnh Miranda xa N phn t cui cng ca m t danh sch. Tht bi nu
danh sch khng c N phn t.
7. nh ngha bng Miranda hai hm even_length v odd_length kim tra s cc
phn t c a m t danh sch cho l chn hay l tng ng.
V d danh sch [a, b, c, d ] c di chn,
danh sch [ a, b, c ] c di l.
Vit chng trnh Miranda kim tra mt danh sch c phi l mt tp hp con ca mt
danh sch khc khng ?
8. Vit chng trnh Miranda ly ra phn t th N trong mt danh sch. Tht bi nu
danh sch khng c N phn t.
Vit chng trnh Prolog tm phn t ln nht v phn t nh nht trong mt danh sch
cc s.
9. Vit chng trnh Miranda kim tra hai danh sch c ri nhau (disjoint) khng ?

32

LP TRNH HM

10. Vit m t chng trnh Miranda gii bi ton thp H N i (Tower of Hanoi) : chuyn N
a c kch thc khc nhau t m t cc qua cc th hai l y c c th ba lm cc trung gian,
sao cho lun lun tha mn m i ln ch chuyn m t a t mt c c ny sang mt cc
khc, trn mt cc th a sau nh hn ch ng ln trn a trc l n hn v a ln nht
di cng.
11. Vit m t chng trnh Miranda to ra cc s nguyn t s dng sng Eratosthnes.
Chng trnh c th khng kt thc. Th s d ng k thut tnh gi tr hm theo kiu khn
ngoan c li gii n gin v hiu qu.
12. Cy nh phn (binary tree) c biu din nh l m t mt danh sch gm ba phn t d
liu : nt gc (root node), cy con bn tri (left subtree) v cy con bn phi (right
subtree) ca nt g c. M i cy con li c xem l nhng cy nh phn. Cy, hoc cy con
rng (empty tree) c biu din bi mt danh sch rng. V d cho cy nh phn c 4 nt
[1, [2, [], []], [3, [4, [], []], []]] nh sau :
1
3

2
4

Hnh I.8. Cy nh phn c 4 nt.


Vit ch ng trnh duyt cy ln lt theo th t gia (tri-g c-phi), trc (g c-tri-phi)
v sau (tri- phi-gc) ?

CHNG II. NGN NG SCHEME

A line may take us hours, yet if it does not seem a moment's thought
All our stitching and unstitching has been as nought.
Yeats - Adam's Curse

II.1 Gii thiu Scheme


cheme l mt ngn ng thao tc k hiu (symbolic manipulation) do Guy Lewis
Steele Jr. v Gerald Jay Sussman xut nm 1975 ti MIT (Massachusetts Institute
of Technology, Hoa K), sau c pht trin nhanh chng v ng dng rt ph
bin. Scheme l ngn ng thuc h Lisp v mang tnh s phm cao. Scheme gii quyt thch
hp cc bi ton ton h c v x l k hiu. Theo W. Clinger v J. Rees3 :
... Scheme demonstrate that a very small number of rules for forming expressions, with
no restrictions on how they are composed, suffice to form a pratical and efficient
programming language that is flexible enough to support most of the major programming
paradigms in use today... .
Tng t cc ngn ng hm khc, Scheme c c php rt n gin nn rt d lp trnh.
Cc cu trc d liu c s ca Scheme l danh sch v cy, da trn khi nim v kiu d
liu tru tng (data abstraction type). Mt chng trnh Scheme l mt dy cc nh ngha
hm (hay th t c) gp li nh ngha m t hoc nhiu hm phc tp h n. Hot ng c bn
trong lp trnh Scheme l tnh gi tr cc biu thc. Scheme lm vic theo ch tng tc
(interaction) vi ng i s dng.
Mi vng tng tc xy ra nh sau :
Ng i s dng g vo mt biu thc, sau mi dng nhn enter ().
H thng in ra kt qu (hoc bo li) v qua dng mi.
H thng a ra m t du nh c (prompt character) v ch ngi s d ng a vo mt
biu thc tip theo...

Vic l a ch n du nhc ty theo quy c ca h thng, thng thng l du ln hn (>)


4

hoc du hi (?) .
Mt dy cc php tnh gi tr biu thc trong m t vng tng tc c g i l m t chu
lm vic (session). Sau mi chu, Scheme a ra thi gian v s lng b nh (bytes) s
dng tnh ton.
tin theo di, cun sch s dng cc quy c nh sau :
3
4

Xem ti liu nh ngha ngn ng Scheme ti a ch http://www.swiss.ai.mit.edu/~jaffer/r5rs_toc.html


Trong cun sch ny, tc gi khng ghi ra du nhc h thng (du >) cho d c.

33

34

LP TRNH HM

Kt qu tnh ton c ghi theo sau du m i tn (-->).


Cc thng bo v li sai c t trc bi ba du sao (***).
C php ca mt biu thc c vit theo quy c EBNF kiu ch nghing m.
V d : <e>

tin trnh by ting Vit, mt s phn ch thch v kt qu tnh ton khng in theo
kiu ch Courier.
Ch thch trong Scheme
Ch thch (comment) dng din gii phn chng trnh lin quan gip ngi c d
hiu, d theo di nh ng khng c hiu lc i vi Scheme (Scheme b qua phn ch thch
khi thc hin). Ch thch c bt u bi mt du chm phy (;), c vit trn m t dng
bt k, hoc t u dng, hoc cu i dng. V d :
; this is a comment line
(define x 2) ; nh ngha bin x c gi tr 2
;;; The FACT procedure computes the factorial
;;; of a non-negative integer.
(define fact
(lambda (n)
(if (= n 0)
1 ; Base case: return 1
(* n (fact (- n 1))))))

II.2 Cc kiu d liu ca Scheme


Kiu d liu (data type) l m t tp hp cc gi tr c quan h cng loi vi nhau (related
values). Cc kiu d liu c x l tu theo bn cht ca chng v thng c tnh phn cp.
Trong Scheme c hai loi kiu d liu l kiu n gin (simple data type) v kiu phc hp
(compound data type). Trong chng ny, ta s xt cc kiu d liu n gin trc.

II.2.1. Cc kiu d liu n gin


Cc kiu d liu n gin ca Scheme bao gm kiu s (number), kiu lgch (boolean),
kiu k t (character) v kiu k hiu (symbol).

II.2.1.1. Kiu s
Kiu s ca Scheme c th l s nguyn (integer), s thc (real), s hu t (rational) v
s phc (complex ) nh sau :
Kiu s
s nguyn
s thc
s hu t
s phc

V d
52
3.0, -2.5
6/10, 23/5
3+4i, 3

Scheme khng phn bit s nguyn hay s thc. Cc s khng hn ch v ln, min l
b nh hin ti cho php.

NGN NG SCHEME

35

Vi cc s, Scheme c ng s d ng cc php ton s h c thng d ng +, -, *, /, max, min,

php ly cn bc hai v so snh s h c vi s lng i s tng ng :


(+ x1 ... xn)
--> x1 + ... + xn
(- x1 x2)
--> x1- x2
(* x1 ... xn)
--> x1 * ... * xn
(/ x1 x2)
--> x1/ x2
(quotient x1 x2) --> phn nguyn ca (x1/ x2)
(remainder x1 x2) --> phn d c a php chia nguyn (x1/ x2), ly du x1
(modulo x1 x2)
--> phn d c a php chia nguyn (x1/ x2) , ly du x2
(max x1 ... xn)
--> max (x1, ..., xn)
(min x1 ... xn)
--> min (x1, ..., xn)

(sqrt x)
--> x
Cc php so snh sau y tr v #t nu kt qu so snh ln lt cc gi tr x1, ..., xn c
tho mn, ngc li tr v #f :
(= x1 ... xn)
(< x1 ... xn)
(<= x1 ... xn)
(> x1 ... xn)
(>= x1 ... xn)
V d :
(* 1 2 3 4 5 6 7 8 9)
--> 362880
(= 1 2 3 4 5)
--> #f
(= 1 1 1 1 1)
--> #t
(< 1 2 3 4 5)
--> #t
(> 4 3 2 1)
--> #t
(<= 1 2 3 4 5)
--> #t
(>= 6 5 4 3 2 1)
--> #t

Th tch hnh cu bn knh R :


(* 3 pi R R R)

Nhit Farenheit c biu din qua nhit Celsius C :


(+ 32 (* 9/5 C))

Mt biu thc Scheme c th trn ln ln cc s nguyn v cc s thc :

36

LP TRNH HM

(+ 2.3 5)
--> 7.3

Php tnh trn cc s hu t :


(* 2/3 5/2)
--> 10/6

Cng lc c th g vo nhiu biu thc (trc khi Enter) nhn c nhiu kt qu :


(* 2 3)(+ 1 4)(- 7 9)
--> 6
5
-2
K t
Mt k t (character) ca Scheme c dng #\<char>. V d :
#\a
--> #\a ;ch a thng
#\A
--> #\A ;ch A hoa
#\(
--> #\( du ngoc tri
Chui
Chui (string) l kiu d liu phc hp c a Scheme, gm dy cc k t tu t gia hai
du nhy kp, nhng cc du nhy kp ny vn c gi nguyn trong gi tr c a chu i :
Cho cc bn !
--> Cho cc bn !
Tn
Mi ngn ng lp trnh u s d ng tn ch nh cc i tng cn x l. Trong
Scheme, tn c to thnh t cc ch ci, ch s v cc du c bit, tr # () [] v du
cch (space) dng phn cch cc i tng.
Tn ca Scheme c bt u bi m t ch ci v khng phn bit ch hoa ch thng.
Vit pi hay PI u cng ch m t tn. Nn chn t tn bit ni (mnemonic) v s dng
cc du ni (-). Chng hn cc tn sau y u hp l :
pi
x
soup
lambda

II.2.1.2.

*
+
<=?
V19a

pi-chia-2
a34kTMNs
is-this-a-very-long-name?
list->vector

Kiu lgch v v t

Mi ngn ng lp trnh u s dng cc cu trc iu khin s dng n cc gi tr lgch


v do , cn biu din cc gi tr lgch. Trong Scheme, cc hng c sn kiu lgch l #t
(true) v #f (false).
V t (predicate) l m t hm lun tr v gi tr lgch. Theo quy c, tn cc v t c
kt thc bi mt du chm hi (?).

NGN NG SCHEME

37

Th vin Scheme c sn nhiu v t. Sau y l mt s v t dng kim tra kiu c a


gi tr ca mt biu thc :
(number? s)
--> #t nu s l mt s thc, #f nu khng
(integer? s)
--> #t nu s l mt nguyn, #f nu khng
(string? s)
--> #t nu s l mt chui, #f nu khng
(boolean? s)
--> #t nu s l mt lgch, #f nu khng
(procedure? s) --> #t nu s l mt hm, #f nu khng
V d :
(string? 10)
--> #f
; phi vit 10
(procedure? +)
--> #t
; du + l mt tn hm
(complex? 3+4i)
--> #t
(real? -2.5+0.0i)
--> #t
(real? #e1e10)
--> #t
(rational? 6/10)
--> #t
(integer? 3)
--> #t
Scheme c v t equal? s dng hai tham i so snh cc gi tr :
(equal? s1 s2 )
-> #t nu s1 = s2
i vi cc s thc, v t bng nhau l du = v cc v t so snh l cc du php ton
quan h <, <=, >, >=, zero? :
(< nb1 nb2)
--> #t nu nb1 < nb2, #t nu khng.

Php ton ph nh l not :


(not s)
--> #t nu s c gi tr #f, #f nu khng.
V d :
(zero? 100)
--> #f
(not #f)
--> #t
(not #t)
--> #f
(not Hello, World!)
--> #f

38

LP TRNH HM

II.2.1.3. K hiu
Ngn ng Scheme khng ch x l cc gi tr kiu s, kiu lgch v kiu chui nh
trnh by, m cn c th x l k hiu nh php trch dn. Gi tr k hiu ca Scheme l mt
tn (gi ng tn bin) m khng gn vi mt gi tr no khc. Ch Scheme lun lun in ra cc
k hiu trch dn dng ch th ng.
Kiu trch dn vn hay gp trong ngn ng ni v vit hng ngy. Khi ni vi ai rng
hy vit ra tn anh, th ngi c th hnh ng theo hai cch :
- hoc vit Trng Chi, nu ngi tn l Trng Chi v hiu cu ni l vit ra tn
ca mnh.
- hoc vit tn anh, nu ngi hiu cu ni l phi vit ra cm t tn anh.

Trong ngn ng vit, ngi ta dng cc du nhy (n hoc kp) ch r cho cch tr
li th hai l : hy vit ra tn anh. Khi cn gn mt gi tr k hiu cho mt tn, ngi ta
hay gp sai st. Chng hn, vic gn gi tr k hiu l pierre cho m t bin c tn l
first-name :
(define first-name pierre)
*** ERROR unbound variable: pierre.
y xut hin sai st v Scheme tnh gi tr ca tn pierre, nhng tn ny li khng
c gi tr. ch cho Scheme gi tr chnh l k hiu pierre, ngi ta t trc gi tr
pierre m t php trch dn (quote operator) :
pierre
--> pierre

K t l cch vit tt ca hm quote trong Scheme :


<exp> tng ng vi (quote <exp>)

Hm quote l mt dng c bit tin nh cho php tr v tham i c a n d tham i


l th no m khng tnh gi tr :
(quote pierre)
--> pierre

Khi nim trch dn c tc d ng quan trng : khi nim bng nhau trong ngn ng t
nhin v trong Scheme l khc nhau v mt Ton hc :
1+2=3

nh ng

1 + 2 3

(= (+ 1 2) 3)
--> #t
nhng :
(= (+ 1 2) 3)
--> error !!!!! khng cng gi tr

Ta c th nh ngha kt qu trch dn cho bin :


(define first-name pierre)

By gi, nu cn in ra gi tr c a first-name, ta c :
first-name
--> pierre
(define x 3)

NGN NG SCHEME

39

x
--> 3
x
--> x

H cc ngn ng Lisp rt thun tin cho vic x l k hiu. M t trong nhng p dng
quan tr ng c a Lisp l tnh ton hnh thc (formal computation). Ngi ta c th tnh o
hm ca mt hm, tnh tch phn, tm nghim cc phng trnh vi phn. Nh ng chng trnh
ny c th gii cc bi ton tt hn con ngi, nhanh hn v t xy ra sai st. Trong chng
sau, ta s thy c lm cch no Scheme tnh o hm hnh thc c a x3 l 3x2.
Mt x l k hiu quan tr ng na l x l chng trnh : m t trnh bin dch c cc d
liu l cc ch ng trnh c vit trn mt h thng k hiu l ngn ng lp trnh. Bn thn
mt chng trnh Scheme cng c biu din nh m t danh sch (s xt sau). Chng hn :
(define (add x y)
(+ x y))

l mt danh sch gm ba phn t define, (add x y) v (+ x y) .


Ch :
Trong thc t, ngi ta ch s dng quote trong li gi chnh ca mt hm. nh ngha
ca mt hm ni chung khng cha quote ( l trng hp c a tt c cc hm vit cho
n lc ny), tr khi ngi ta cn x l k hiu.
kim tra gi tr m t biu thc c phi l mt k hiu khng, ngi ta dng v t
symbol? nh sau :
(symbol? pierre)
--> #t
(symbol? #t)
--> #f
(symbol? pierre)
--> #f

V d cui (kt qu l #f) ch ra rng khng nn nhm ln k hiu vi chui, du rng


trong phn ln cc ngn ng, cc chui l phng tin duy nht m hnh ha cc tn gi.

II.2.2. Khi nim v cc biu thc tin t


C nhiu cch biu din cc biu thc s hc. Ngn ng Scheme s d ng mt cch h
thng khi nim dng ngoc tin t. Nguyn tc l vit cc php ton ri mi n cc ton
hng v t tt c trong cp du ngoc.
V d biu thc s h c 4+76 c vit thnh (+ 4 76). Mt cch t ng qut, nu op
ch nh m t php ton hai ngi, mt biu thc s h c c dng :
exp1 op exp2
s c vit di dng ngoc tin t l :
(op ~exp1 ~exp2)

trong , ~expj l dng tin t ca biu thc con expj, j = 1, 2.


i vi cc php ton c s lng ton hng tu , ch cn vit du php ton u cc
ton hng. V d biu thc s h c :
4 + 76 + 19

40

LP TRNH HM

s c vit thnh :
(+ 4 76 19)

Ch t du cch hay khong tr ng (space) gia du php ton v gia m i ton hng.
Ngi ta c th trn ln cc php ton :
34*21 - 5*18*7 c vit thnh (- (* 34 21) (* 5 18 7)),
-(2*3*4)
c vit thnh (- (* 2 3 4)).

Mt trong nhng li ch c a vic s d ng cc cp du ngoc trong biu thc l th t u


tin thc hin ca cc php ton c bo m, khng mp m v khng s b nhm ln.
Dng tin t c s dng cho tt c cc biu thc. V d, p d ng hm f cho cc i s
2, 0 v 18 vit theo dng Ton h c l f(2, 0, 18) v c biu din trong Scheme l (f
2 0 18). y, cc du phy c thay th bi cc du cch phn cch cc thnh
phn.
Cch vit cc biu thc dng ngoc tin t lm tng nhanh s lng cc du ngoc thot
tin lm hoang mang ngi c. Tuy nhin, ngi s dng s nhanh chng lm quen v rt
nhiu phin bn ca Scheme hin nay (trong mi trng ca s v ho) c kh nng kim
tra tnh tng thch gia cc cp du ngoc s d ng trong biu thc.
Cc biu thc c th l ng nhau nhiu mc. Quy tc tnh gi tr theo trnh t p dng (xem
mc II.7, chng 1) nh sau : cc biu thc trong cng nht c tnh gi tr trc, sau
thc hin php ton l cc biu thc bn ngoi tip theo. Lp li qu trnh ny nhiu ln cho
n khi cc biu thc c tnh ht.
(+ (* 2 3) 4)
--> 10

; = (+ 6 4)

R rng cc biu thc l ng nhau lm ngi c kh theo di, chng hn biu thc sau
y kh theo di :
(+ 1 (* 2 3 (- 5 1)) 3) ; = (+ 1 (* 2 3 4) 3) = (+ 1 24 3)

Nn vit biu thc trn nhiu dng khc nhau theo quy c vit tht dng (indentation)
v cn thng ng t ng t cc dng lnh trong cc chng trnh c cu trc (Pascal, C,
Ada...). Biu thc trn c vit li nh sau :
(+ 1
(* 2 3 (- 5 1))
3)
--> 28

Ng i ta thng vit thng ng cc ton hng c a mt hm, th t vo so vi tn hm.


Chng hn biu thc (f a b c) c vit :
(f a
b
c)
Tuy nhin, cch vit ny cn tu thu c vo thi quen (hay s thch) ca ngi lp trnh.
Khi cc ton hng l nhng biu thc ph c tp, ngi ta c th cn thng ng nh va ni,
nhng khi cc biu thc l n gin, ngi ta c th vit cn theo hng ngang cho tin.
Do gi tr ca mt biu thc khng ph thuc vo cch vit nh th no, cc du cch v
cc du qua dng u c cng m t ngha trong Scheme, nn ngi lp trnh c th vn
dng quy c vit th t dng sao cho ph hp vi thi quen ca h.
Chng hn biu thc Ton hc :

NGN NG SCHEME

41

sin(a) + sin(b)
1 + a 2 + b2
c th vit trong Scheme :
(/ (+ (sin a) (sin b))
(sqrt (+ 1 (* a a) (* b b))))

II.2.3. S-biu thc


Ng i ta g i s-biu thc (s-expression, s c ngha l symbolic) l tt c cc kiu d liu
c th g p nhm li v i nhau (lumped together) ng n v mt c php trong Scheme. V
d sau y u l cc s-biu thc c a Scheme :
42
#\A
(1 . 2)
(a b c)
#(a b c)
Hello
(quote pierre)
(string->number 16)
(begin (display Hello, World!) (newline))
Mi s-biu thc khng phi lun lun ng n v mt c php hoc v mt ng ngha,
ngha l s-biu thc khng phi lun lun c mt gi tr. Scheme tnh gi tr ca mt biu
thc ngay khi biu thc ng n v mt c php, hoc thng bo li sai. V d biu
thc sau y vo ng :
(+7
; l du enter
(* 3 4))
--> 19
Sau khi g (+7 r i , Scheme li v u dng tip theo v tip tc ch (con tr nhp
nhy) v biu thc cha ng n v mt c php. Ch khi g tip (* 3 4)) mi lm xut
hin kt qu trn u dng tip theo do biu thc vo ng. Biu thc sau y vo sai v
gy ra l i :
(+ 3 (*6 7))
--> ERROR: unbound variable: *6
; in expression: (... *6 7)
; in top level environment.
; Evaluation took 0 mSec (0 in gc) 11 cells work, 38 bytes other

II.3 Cc nh ngha trong Scheme


II.3.1. nh ngha bin
Bin (variable) l m t tn g i c gn mt gi tr c kiu no . Mt bin ch nh mt
v tr nh lu gi gi tr ny. Cc tn c bit nh define g i l t kha ca ngn ng do
n ch nh mt php ton tin nh. Chng hn, khi mu n ch nh cho tn bin pi m t gi
tr 3.14, ta vit :

42

LP TRNH HM

(define pi 3.14159)
khi , ta c
pi
--> 3.14159

Dng t ng qut ca nh ngha bin nh sau :


(define var expr)

Sau khi nh ngha bin var s nhn gi tr c a biu thc expr.


V d : nh ngha bin root2 :
(define root2 (sqrt 2))
root2
--> 1.4142135623730951
khi root2 c th c s dng nh sau :
(* root2 root2)
--> 2.000000000000000 ; 15 con s 0

Tuy nhin, nu s dng mt tn cha c nh ngha trc , Scheme s thng bo li :


toto
--> *** ERROR-- unbound variable : toto ; cha c gn gi tr
Sheme c sn mt s tn c nh ngha, l cc tn hm c s :
sqrt
; gi tr c a tn sqrt l g ?
--> #[procedure] ; l hm tnh cn bc hai
S tng ng gia mt bin v gi tr ca bin c gi l mt lin kt (link). Tp hp cc
lin kt ca mt chng trnh c g i l mt mi trng (environment). Trong v d trn, ta
nhn c mt mi trng gm cc lin kt gia pi v gi tr ca pi, gia root2 v gi tr ca
root2. Ngi ta cng ni mi trng gm cc lin kt tin nh nh lin kt ca sqrt. Gi tr
ca mt bin c th b thay i do s nh ngha li. Th t cc nh ngha l quan trng khi
chng to nn cc biu thc cha cc bin, v mi bin ny phi c mt gi tr trc khi tnh gi
t biu thc.
(define one 1)
(define two 2)
(define three (+ one two))
Ta c th hon i th t hai nh ngha bin one v two, nhng nh ngha bin three phi t
cui cng. Nu ta quyt nh tip theo thay i gi tr ca one bi (define one 0), th gi tr gn
cho bin three vn khng i cho n khi tnh li n.

II.3.2. nh ngha hm
II.3.2.1. Khi nim hm trong Scheme
Khi cn t tn cho biu thc cha cc tham bin, ta i n khi nim hm. V d ta cn
nh ngha mt hm tnh th tch c a hnh cu bn knh R. Ta s dng dng define c c
php nh sau :
(define (sphereVolume R)
(* 4/3 pi R R R))

NGN NG SCHEME

43

y R l mt tham bin, cn tn gi pi khng phi l mt tham bin v pi c


nh ngha trn y.
Mt cch tng qut, m t nh ngha hm c dng :
(define (func-name x1 ... xk)
body)

Cc xi, i=1..k, c g i l cc tham bin hnh thc (formal parameters), hay g i tt l


tham bin. Trong Scheme, cc tham bin v gi tr tr v c a hm khng cn phi khai bo
kiu. Tn gi ca tham bin khng quan trng. Chng hn ta c th nh ngha li hm
spherevolume bi tn tham bin khc nh sau :
(define (spherevolume x)
(* 4/3 pi x x x))
tin theo di c chng trnh, ngi ta thng s d ng cc quy c vit cc tham
bin gi ra m t cch khng tng minh (implicite) cc kiu c a chng.

Cc tham bin nhn cc s nguyn c vit n, i, j, n1, n2, ...


Cc tham bin nhn cc s thc l r, r1, nb, nb1, ...
M t biu thc bt k s, s1, e, exp, ...

II.3.2.2. Gi hm sau khi nh ngha


Li gi m t hm sau khi ngi lp trnh t nh ngha tng t li g i mt hm c s n
trong th vin ca Scheme. Li gi c dng :
(func-name arg1 arg2 ... argk)

trong , func-name l tn hm c nh ngha, cc argi, i=1..k, c gi l cc


tham i thc s (effective arguments).
Sau khi gi, cc tham i argi c tnh gi tr gn cho mi tham bin hnh thc xi
tng ng. Tip theo, thn hm (body) c tnh gi tr trong mt mi trng cc b (local
environment), trong , cc tham i hnh thc biu din gi tr ca cc tham i thc s.
iu ny khng lm nh hng n mi trng trc . Mt tham i c th l mt biu
thc Scheme no , min l gi tr c a n ph hp vi kiu d kin trong thn hm.
V d , li gi :
(spherevolume (+ 8 4))
gy ra vic tnh gi tr tnh c a thn hm :
(* 4/3 pi r r r)
vi r c tnh t i (+ 8 4) l 12 c kt qu tr v l :
--> 7234.56
Nu ta tnh li pi chnh xc hn :
(define pi 3.14159)
Th vic g i li hm SphereVolum s cho kt qu khc :
(SphereVolime 12)
--> 7238.22

44

LP TRNH HM

II.3.2.3. S dng cc hm b tr
Do tnh th tnh hnh cu cn tnh lp phng c a m t s, do ta c th nh ngha hm
tnh lp phng :
(define (cube nb) (* nb nb nb))

v ta nh ngha li hm tnh th tch :


(define (spherevolume x) (* 4/3 pi (cube x)))
y, ta s dng hm b tr (auxileary functions) cube tham gia nh ngha hm
chnh. Nu nh m t hm ch dng tnh ton trung gian cho m t hm khc, m khng dng
chung, ngi ta c th t n trong hm v khng mu n nhn thy bi cc hm khc.
l khi nim hm c c b i vi m t hm khc. Nh vy, hm c c b c ng l hm b tr.

Khng c quy tc nht nh xc nh th t nh ngha cc hm. Ngi ta c th nh


ngha m t (hoc nhiu) hm chnh trc, r i nh ngha cc hm b tr lm r cc hm
chnh, ri tip tc nh ngha cc hm b tr c a cc hm b tr, v.v... Hoc ngc li, ngi
ta c th bt u bi cc hm b tr trong cng nht trc ri nh ngha n cc hm chnh
sau cng. y ch l vn phong cch lp trnh, c bn l lc no th cn tnh gi tr c a
biu thc, khi cc hm lin quan c nh ngha ri.
V d : Hm sau y tnh cnh huyn c a m t tam gic vung cnh a, b :
(define (hypotenuse a b)
(sqrt (+ (square a) (square b))))
y s dng hm b tr square c nh ngha tip theo :
(define (square x) (* x x))

Thng thng khi lp trnh, ngi ta thng c thi quen nh ngha li cc hm do c sai
st v thit k, thi c a b din dch Scheme l trnh nh ngha li tt c cc hm.
Cc nh ngha hm c th lng nhau. Cc nh ngha bn trong ca mt hm khng th
tip cn c t bn ngoi hm : l nhng nh ngha c tnh cc b (local definitions).
iu ny hon ton c li khi cn nh ngha cc i tng hay cc hm ph thu c nhau.
V d ta cn tnh x4 x2 vi m t hm c nh ngha nh sau :
(define (x4-minus-x2 x)
(define x2 (square x))
(* x2 (- x2 1)))
(x4-minus-x2 2)
--> 12
x2
--> ***ERROR --- unbound variable x2
nh ngha bn trong c a mt hm khc vi lnh gn trong cc ngn ng mnh lnh
(chng hn Pascal) :
(define x 1)
(define (f)
(define x 2) ; nh ngha x trong mi trng c c b i vi f
(+ x 3))
x
--> 1

NGN NG SCHEME

45

(f)
--> 5
x
--> 1
; li g i f khng lm thay i nh ngha ton cc c a x

Ng i ta khuyn khng nn s d ng cc nh ngha hm hay bin cc b bn trong thn


ca m t hm : kt qu nhiu khi khng d kin trc c v ph thuc vo b din dch
Scheme ang s d ng.

II.3.2.4. Tnh khng nh kiu ca Scheme


nh ngha hm ca Scheme khng s dng khai bo kiu cho tham bin v cho kt qu
tr v. S khng tng thch v kiu ch c th c pht hin thi im gi thc hin. Khi
, cc bin khng c nh kiu nhng cc gi tr li c nh kiu. V vy, ngi lp
trnh phi n tnh tng thch v kiu cho cc gi tr ca biu thc. iu ny c li
nhng c ng c nhng bt tin.
Nhn xt :
S mm do v kiu cho php s d ng hm vi nhiu d liu khc nhau. Mi d liu s
dng cho cc php ton trong thn hm u c cng ngha. Khng cng phn bit mt tham
i l s nguyn, s thc hy l m t s phc. Cng m t bin c th biu din lc th mt s,
lc th m t chui, v.v... trong khi cc gi tr th li c nh kiu.
Tuy nhin, khng nh kiu lm mt tnh an ton, chnh ng i lp phi kim tra kiu ch
khng phi l b bin dch. Khng nh kiu c ng lm mt tnh hiu qu, v rng s nhn bit
ban u v kiu ca cc i tng cho php b bin dch s dng cc php ton thch hp.

II.3.3.

Cu trc iu khin

II.3.3.1. Dng iu kin if


Cu trc iu kin c bn nht ca Scheme l if c c php nh sau :
(if e s-then s-else)
Nu gi tr ca biu thc e l #f, dng if tr v gi tr ca biu thc s-else, ngc l i
th s-then. Ngha l #f cvai tr false, cn mi gi tr khc c vai tr true trong php th.
V d :
(define (abs-value nb)
(if (<= 0 nb) nb ( nb)))
Ch dng if ch lun tnh mt trong hai biu thc s-then, hoc s-else. V v y
ngi ta g i if l mt dng c bit m khng phi l mt hm. iu ny cho php nh
ngha hm chia hai s trnh chia cho 0.
(define (div-safe r1 R2)
(if (zero? R2)
Sai: khong the chia cho back !
(/ r1 R2)))
C th s d ng cc dng if lng nhau, chng hn ta nh ngha hm sau y tr v du
ca mt s, 1 nu dng, 1 nu m v 0 nu bng khng :
(defne (sign nb)

46

LP TRNH HM

(if (< 0 nb)


1
(if (zero? nb) 0 -1)))

Php not c th nh ngha tnh khc khng ca mt s. Chng hn :


(define (not-zero nb)
(not (zero? nb)))
Dng iu kin cond

Thay v s d ng cc if l ng nhau, Scheme c dng cond rt thun tin :


(cond (e1 s1)
...
(eN sN)
[ (else sN+1) ] )

Cc biu thc e1, e2, ... c tnh lin tip cho n khi gp mt gi tr ng, gi s ej,
khi gi tr tr v c a cond l gi tr c a s-biu thc sj.
m bo t nht c m t php th thnh cng, ngi ta thng t vo cui t kha
else. Khi , sN+1 c tnh nu mi e1, ... , eN u sai.

V d , hm mention sau y tr v m t kt qu ty theo im thi note :


(define (mention note)
(cond((>= note 8) Gioi)
((>= note 7) Kha)
((>= note 6) Trung binh kha)
((>= note 5) TB)
(else Km)))
Bng cch biu din cc kiu gi tr c bit qua tn gi c a chng, sau y l m t v d
v hm tr v kiu ca mt biu thc Scheme.
(define (type-of s)
(cond ((symbol? s) symbol)
((number? s) number)
((lgch? s) boolean)
((string? s) string)
(else unknowtype)))
(type-of 2376)
--> number
(type-of kiki)
--> symbol
(type-of "c'est une chaine.")
--> string
(type-of (> 1 2))
--> boolean
Cc php ton logic and v or

Cc php ton and v or dng t hp cc biu thc Scheme (tng ng vi cch


tnhngn mch). Gi tr :

NGN NG SCHEME

47

(and s1 s2 ... sN)

nhn c bng cch tnh ln lt dy cc biu thc s1, s2, ... v dng li ngay khi gp mt
gi tr #f v tr v kt qu #f, nu khng, tr v gi tr cui l sN.
V d , nu cc s thc a, b, c l ba cnh ca mt tam gic, th biu thc :
(and (< a (+ b c)) (< b (+ c a)) (c (+ a b))
tr v gi tr #t. Biu thc sau trnh c li chia cho 0 :
(and (< 2 8) (number? yes) (+ 1 (/ 2 0)))
--> #f
Mt cch tng t, gi tr tng t ca :
(or s1 s2 ... sN)

Nhn c bng tnh ln lt biu thc s1, s2, ... v dng li khi gp mt gi tr ng
#t tr v gi tr #t ny, nu khng, tr v gi tr #f.
(or (= 2 3) 10 (number? yes))
--> 10
; v 10 l gi tr u tin khc #f

II.3.3.2.

Bin cc b

1. nh ngha bin cc b nh dng let


Khi tnh mt biu thc, cc kt qu trung gian cn phi c lu gi trnh tnh i tnh li
nhiu ln. V d, khi tnh din tch tam gic cnh a, b, c theo cng thc :

p(p-a) (p-b) (p-c)

vi p l na chu vi, p = (a+b+c)/2

ta cn lu gi gi tr p ch phi tnh m t ln. Nu dng mt hm b tr tnh p th s


khng tin nu nh p ch s d ng tnh din tch tam gic, cc hm khc khng s d ng p
s khng cn bit n p.
Scheme c cc dng c bit let cho php lu gi cc gi tr trung gian trong thn hm
chnh. C php ca let nh sau :
(let link body)

phn lin kt link c dng :


((v1 s1)...(vk sk))

C ngha rng trong sut qu trnh tnh ton, thn hm body, tn bin vj ch nh gi tr
biu thc sj.
V d : Din tch tam gic cnh a, b, c c tnh t na chu vi p nh sau :
(let ((p (/ (+ a b c) 2)))
(sqrt (* p (- p a) (- p b) (- p c))))
Do cn phi nh ngha nhiu lin kt link song song, nn ng i ta t tp hp cc lin
kt (v1 s1)...(vk sk) gia hai du ngoc phn bit vi phn thn hm body. Ngi
ta thng vit dng let theo ct dc v phn thn hm li lch qua tri cho d c :

48

LP TRNH HM

(let ( (v1 s1)


...
(vk sk)
body)

V d :
(let ((a 20) (b (* 4 8)) (c 10)
(* c (- a b)))
--> 120
Ch rng cc biu thc sk c tnh trc v ch khi , cc bin vk mi c nh
ngha.
(define (f x y) (let ((x y) (y x)) (- x y)))
(f 2 5)
--> 3
; khng phi l 0, cng khng phi l 3

2. Phm vi t ng ca dng let


Cn xem xt phm v hot ng c a cc bin nh ngha trong let :
(define a 10)
(let ((a 5) (b (* 2 a)))
(+ a b))
--> 25
Gi tr ton cc c a a c nhn th y trong biu thc nh ngha b, v do b=20,
nhng trong thn (+ a b) th a = 5 do body nhn th y cc vj. Tuy nhin, gi tr c a
bin cc b b li khng xc nh ngoi let :
b
--> *** ERROR - unbound variable: b
Mt cch t ng qut, cc bin vj c nh ngha trong link ca let cc nh ngha
khc ch khi tnh thn body ca let m thi.
Trong thn ca m t nh ngha hm, ta c th s dng let. Chng hn xy dng hm
tnh

a 2 + b 2 , ta tnh a2 v b2 nh let nh sau :

(define (pitagore a b)
(let ((a2 (* a a)) (b2 (* b b)))
(sqrt (+ a2 b2))))
(pitagore 3 4)
--> 5.

3. Lin kt bin theo dy : dng let*


Nu cn lin kt cc bin theo dy, Scheme c dng c bit let* :
(let* ((v1 s1)... (vk sk)) body)

S lin kt c a let* th hin ch gi tr ca vi dng tnh sj, nu i<j (vi ng


trc sj).
(define a 2)

NGN NG SCHEME

(let* ((a
(b
(c
(+ a
--> 64

(* a a))
(* 3 a))
(* a b)))
b c ))

49

; a = 4
; b = 12
; c = 48

Tht v y, trong thn ca let*, bin a=4 do trc , a=2, bin b=12 do a=4, bin
c=48 do a=4 v b=12.
Dng let* thc ra khng tht cn thit v c th c biu din bi cc let l ng nhau.
V d trn y c vit li theo dng let nh sau :
(let ((a (* a a)))
(let ((b (* 3 a)))
(let ((c (* a b)))
(+ a b c))))
--> 64
Dng let lng nhau c dng lm r s ph thuc gia cc biu thc. M t cch
t ng qut, quan h gia let v let* nh sau :
(let ((v1 s1))

(let* ((v1 s1)


(let ((v2 s2))
...
...
(vk sk))
(let ((vk sk))
body)
body) ... ))

II.3.3.3. nh ngha cc v t
Nh ni, tn cc v t trong Scheme u t mt du chm (?) h i sau cng. NSD c
th nh ngha cc v t v c ng phi tun theo quy c ny. Chng hn ta nh ngha li v t
kim tra mt s nguyn l chn (even) hay l (odd) m khng s d ng cc v t even? v
odd? c sn trong th vin ca Scheme :
(define (is-even? n)
(if (= n 0)
#t
(is-odd? (- n 1))))
(define (is-odd? n)
(if (= n 0)
#f
(is-even? (- n 1))))
(is-even? 4)
--> #t
(is-odd? 5)
--> #t

V t sau y kim tra m t s nguyn n trong phm vi 2..100 c l s nguyn t hay


khng ? Ta lp lun nh sau : n khng phi l s nguyn t nu n chia ht (th ng s ln h n
1) cho cc s 2, 3, 5, 7, ... sqrt(n). V y nu 10<n100 th sqrt(100) = 10 v do vy, n khng
th l b i ca cc s 2, 3, 5, 7.
Trc tin ta vit v t kim tra n c l bi c a cc s 2, 3, 5, 7 hay khng :

50

LP TRNH HM

(define (multiple2357? n)
(or (zero? (remainder n
(zero? (remainder n
(zero? (remainder n
(zero? (remainder n

2))
3))
5))
7))))

Cc s 2, 3, 5, 7 v cc s nguyn trong phm vi 100 khng phi l bi ca cc s ny


u l s nguyn t :
(define (prime<=100? n)
(if (or (= n 2)
(= n 3)
(= n 5)
(= n 7)
(not (multiple? n)))
#t #f))

Sau y ta vit v t kim tra mt nm dng lch cho c phi l nm nhun hay
khng ? Mt nm l nhun nu chia ht cho 400 hoc nu khng phi th nm phi
chia ht cho 4 v khng chia ht cho 100. Trc tin ta vit v t kim tra mt s ny c
chia ht mt s khc hay khng.
(define (divisibleBy? number divisor)
(= (remainder number divisor) 0))
(define (isBissextile? year)
(or (divisibleBy? year 400)
(and (divisibleBy? year 4)
(not (divisibleBy? year 100)))))
(isBissextile? 1900)
--> #f
(isBissextile? 2004)
--> #t

II.3.4. S quy v s lp
II.3.4.1. S quy
C nhiu s quy (recursive schema) c ng dng quen thuc trong lp trnh,
ngn ng Scheme s dng s quy nguyn thu (primitive) c c php nh sau :
(define (<name> <arg>)
(if (zero? <arg>)
<init-val>
(<func> <arg> (<name> (- <arg> 1)))))
y, c <init-val> v <func> u cha c nh ngha theo hm <name>.

S quy c gii thch mt cch tng qut nh sau :


C mt ho c nhiu ca ra t ng ng v i iu kin c tho mn d ng qu trnh
quy : nu <arg> = 0 th ca ra ly gi tr tr v <init-val>.
C m t hoc nhiu l i gi quy, ngha l gi li chnh hm , sao cho trong mi
trng hp, gi tr ca tham i <arg> phi hi t v mt trong cc ca ra dng,
thng thng gim dn, chng hn tham i mi l <arg>-1.

NGN NG SCHEME

51

Phng php lp trnh quy mang tnh t ng qut v tnh hiu qu khi gii quyt nhng
bi ton tnh hm c ln d liu pht trin nhanh. p dng k thut quy, lun lun
phi tm cu tr li cho hai cu hi sau y :
1. C tn t i hay khng cc trng hp c bit ca bi ton cho nhn c m t
li gii trc tip dn n kt qu.
2. C th nhn c li gi i ca bi ton cho t li gi i ca cng bi ton ny
nhng i vi cc i tng nh hn theo mt ngha no ?
Nu c cu tr li th c th dng c quy. Sau y l mt s v d.

II.3.4.2. V d
1. Tnh tng bnh phng cc s t 1 n n

Xt hm SumSquare tnh t ng bnh phng cc s t 1 n n :


SumSquare = 1 + 22 + 32 + ... + n2
Bng cch nhm n1 s bnh phng pha bn phi, tc t 1 n (n1)2, ta nhn c
quan h truy hi nh sau :
SumSquare(n) = SumSquare (n1) + n2 ,
Quy c SumSquare (0) = 0, ta nh ngha hm SumSquare trong Scheme nh sau :
(define (SumeSquare n)
(if (zero? n)
0
(+ (SumeSquare (- n 1)) (* n n))))
(SumeSquare 3)
--> 14
nh ngha hm nh trn l quy v hm cn nh ngha li gi li chnh n. l li
gi quy (SumSquare (- n 1)).
2. Tnh giai tha
tnh n ! = 1* 2 * ...* n vi ta c :
0!=1
n ! = n * (n1) ! vi n > 1
T :
(define (fac n)
(if (zero? n) ; hoc (<= n 0) m bo x l mi s n
1
(* n (fac (- n 1)))))
(fac 5)
--> 120
3. Hm Fibonacci

C th cng lc c nhiu li gi quy trong thn hm. Mt hm c in khc thng


c minh ha cho trng hp ny l hm Fibonacci. Hm fib c nh ngha t quan h
truy hi :
f (0) = 0 v f (1) = 1. Vi n 0, th f (n + 2) = f (n + 1) + f (n).
Ng i ta ch ng minh c rng :

52

LP TRNH HM

( n - n )
(1 + 5 )
(1 - 5 )
vi =
~ 1.6,
v =
~ 0.6
2
2
5
y, f c gi l s vng (golden number), vi l nghim ca phng trnh :
f(n) =

x2 = 1 + x.
Hm fib trong Scheme c nh ngha nh sau :
(define (fib n)
(if (<= n 1)
n
(+ (fib (- n 1)) (fib (- n 2)))))

Ta nhn thy rng c nhiu s Fibonacci c tnh nhiu ln :


(fib 4)
; = (+ (fib 3) (fib 2))
; = (+ (+ (fib 2) (fib 1)) (+ (fib 1) (fib 0)))
; = (+ (+ (+ (fib 1) (fib 0)) (fib 1)) (+ (fib 1) (fib 0)))
; = (+ (+ (+ 1 0) 1) (+ 1 0))
; = (+ (+ 1 1) 1)
; = (+ 2 1)
--> 3
4. Tnh cc h s nh thc

Tnh cc h s nh thc hay t hp : s php ch n k trong b n phn t. G i (n k) l h s


nh th c cn tm, vi 0 k n, n 0, ta c :
n!
(n k ) =
(n - k )! * k !
vi :

(n 0) = (n n) = 1
( n + 1 k) = ( n k) + ( n k- 1 )
Chng hn (5 2) = 10. Ta xy dng hm coef-binomial nh sau :

(define (coef-binomial n k)
(cond ((zero? k) 1)
((= k n) 1)
(else (+ (coef-binomial (- n 1) k)
(coef-binomial (- n 1) (- k 1))))))
(coef-binomial 5 2)
--> 10
(coef-binomial 0 0)
--> 1

II.3.4.3. Tnh dng ca li gi quy


Mt li g i quy phi lun lun cha t nht mt ca ra, cn c gi l trng hp c
s, tr v kt qu ca hm m khng phi l m t li gi quy. V nu khng, s x y
ra hin tng gi nhau (lp i lp li) v hn ln. Nh vy cch nh ngha cc hm trong cc
v d trn y l hp l v u c ca ra.

NGN NG SCHEME

53

Chng hn ca ra ca nh ngha hm fac trn y l (fac 0) ng vi 0!=1. Tuy


nhin, m t th tc quy c ca ra (ca ra khng gi quy) cha iu kin kt thc.
minh ho ta hy xt mt cch khc nh ngha hm fac l hm bad-fact nh sau :
(define (bad-fact n)
(if (= n 5)
120
(quotient (bad-fact (+ n 1)) (+ n 1))))

Vi li gi n=3, (n<5), ta c :
(bad-fact 3)
; = (quotient
; = (quotient
; = (quotient
; = (quotient
--> 6

(bad-fact 4) 4)
(quotient (bad-fact 5) 5) 4)
(quotient 120 5) 4)
24 4)

Kt qu ng, nhng vi li g i n=6, (hoc vi mi n>5), ta c :


(bad-fact 6)
; = (quotient (bad-fact 7) 7)
; = (quotient (quotient (bad-fact 8) 8) 7)
; ...

Do vi phm iu kin hm quy gi li chnh n nh ng c gi tr tham i nh hn,


r rng vic tnh giai tha ca hm bad-fact s khng bao gi dng li.
Chng hn, li gi (fac 2) s ko theo li gi (fac 2), ko theo li gi (fac
3), v.v... C hai trng hp u gy ra thng bo l i (hoc treo my) :
*** ERROR Stack overflow

Ch i vi hm fac, nu ly n <0, th cng gy ra m t vng lp v hn. T nhng


quan st trn y, ngi ta t ra ba cu hi sau :
1. C th suy lun ngay trn cc dng lnh ca chng trnh chng minh mt nh
ngha hm l ng n ? Cu tr li l c th.
2. C phi l ngu nhin m hm fac c nh ngha ng cn hm bad-fact th
khng ng ? Cu tr li l khng phi.
3. C tn t i hay khng nhng s lp trnh p dng c cho cc nh ngha hm
ch y ng n ? Cu tr li l c.
Tt c nhng vn trn u da trn khi nim quy np (induction) m php lp l mt
5
trng hp c bit . ch ng minh hm P nh ngha ng (tnh ng) m t hm f no ,
cn phi ch ng minh P tho mn hai iu kin l :
P ng n tng phn (partial correction).
P dng.
Trong trng hp tnh giai tha, ta bit rng 0! = 1, v n! = n*(n1)!. By gi ta c n
ch ng minh tnh ng n tng phn ca fac :
5

chng t rng mt tnh cht P no l ng i vi mi s nguyn n, ngi ta lp lun nh sau :


C s quy np : P(0) l ng.
Gi thit quy np : nu P(n1) l ng, th P(n) cng ng.

54

LP TRNH HM

(fact 0) = 1 = 0!

Nu n > 0, hoc n1 = n1, th do gi thit quy np (fact n1) = n1!, do


(fact n) = (* n (fact n1)) = n * n1! = n!

II.3.4.4. Chng minh tnh dng


Mi li g i quy, cc tham i c dng ti phi nh hn so vi tham i ban u.
Phng php thng dng nht m bo mt hm quy d ng l tm c mt s nguyn
dng gim ngt sau m i ln gi quy. Trong trng hp hm SumSquare, ta ch c n
ch n tham i n.
Hm fib dng v m i li g i ko theo hai li gi quy, mi mt trong chng c tham
i m i lc li nh hn. Vi n 2, cc s nguyn n1 v n2 gim ngt so vi n v u 0.
Trong trng hp hm fac, dy cc gi tr c a n l gim ngt, v (fac n) ch g i
(fact n1) nu n 0, nh vy nu n 0, th n1= n1 0.
T nu gi tr ban u ca n l 0, th dy ny l hu hn. Mt khc, fac ch gi n
nhng hm s cp (primitive) l nhng hm dng.
T suy ra rng (fact n) = n! vi n 0
Chng minh tnh ng n tng phn c a hm bad-fact :
(bad-fact 0) = (quotient (bad-fact 1) 1) = ... = 1
Nu (bad-fact n1) = n1! l ng v i n1 = n + 1, th :
(bad-fact n) = (quotient (bad-fact n1) n1) = n1! / n1 = n!
Ta suy ra rng nu bad-fact dng, th bad-fact tnh ng giai tha cho cc s n
tho mn 0 n 5. Tuy nhin bad-fact khng dng vi mi n > 6.
Thc t, ngi lp trnh khng s d ng cch lp lun trn y v tnh phc tp v di
dng (di hn hm cn chng minh). Tuy nhin ngi lp trnh vn cn phi bit thuyt
phc ngi khc v khng th ch ng minh tnh ng n mt chng trnh qua mt vi v d
minh ho.

II.3.4.5. S lp
Ta ly li php tnh giai tha : tnh fac 3, trc tin b din dch Scheme phi tnh
(fact 2), mun vy cn ghi nh ln sau thc hin php nhn. Tng t, cn phi tnh
(fact 1), trc khi tnh (* 2 (fact 1)). Nh v y c m t chu i cc php tnh
khc nhau, tng tuyn tnh vi n. Ngi ta g i y l qu trnh quy tuyn tnh (linear
recursive processus).
Trong trng hp tnh hm fib, lc u Scheme hon thc hin m t php cng tin
hnh hai li gi quy m khng th tnh ton ng thi. Ngi ta g i y l qu trnh
quy dng cy (tree recursive processus). R rng vi kiu qu trnh ny, hm fib i h i
mt chi ph tnh ton ng k. By gi ta xt m t cch tnh giai tha khc :
(define (fact n)
(define (i-fact p r)
(if (= p 0)
r
(i-fact ( p 1) (* p r))))
(i-fact n 1))

NGN NG SCHEME

55

p dng :
(fact
; =
; =
; =
; =
--> 6

3)
(i-fact
(i-fact
(i-fact
(i-fact

3
2
1
0

1)
3)
6)
6)

Ti m i giai on, khng c php tnh no b hon v do khng cn ghi nh. Ta c th


lm dng qu trnh tnh bng cch ch cn ghi nh m t s gi tr c nh (l p v r), r i dng
li sau .
Ng i ta g i qu trnh tnh trn y l qu trnh lp (iterative processus). Ngi ta cng
ni rng hm l quy kt thc.
S dng qu trnh lp rt c hiu qu v b nh, v v y m trong hu ht cc ngn ng lp
trnh c in, cc ngn ng mnh lnh, ngi ta nh ngha cc cu trc c php cho php
thc hin cc qu trnh lp (cc vng lp while, for...).
B din dch Scheme c kh nng x l mt qu trnh lp trong m t khng gian nh
khng i nn ngi lp trnh nn tn d ng kh nng ny.
Mt qu trnh lp cng c c trng bi mt bt bin (invariant) : l mt quan h gia
cc tham i. Quan h lun c gi khng thay i khi tin hnh cc li g i lin tip. Quan h
ny cho php chng minh tnh ng n ca chng trnh.
Chng hn, ta tnh bt bin c a hm i-fact :
p=0
v
p! * r = constant = p0! * r0
y, p0 v r0 l cc gi tr trong li g i chnh.
Gi s rng li g i quy bo ton quan h ny :
p0! * r0 = (p1)! * (p! *r) = p! * r
H n na, tnh cht ny cn ng trong li gi chnh : hm i-fact dng vi gi tr p = 0
v do vy ta c r = p0! * r0, chnh l kt qu tr v ca i-fact.
Li g i chnh l (i-fact n 1), n=0, kt qu ca (fact n) s l n! * 1 = n!.
Ng i ta lun lun c th chuyn mt hm quy tuyn tnh thnh quy kt thc, bng
cch nh ngha mt hm ph tr c m t tham i b sung dng tch lu cc kt qu trung
gian (bin r trong hm i-fact).
S lp tng qut nh ngha mt hm fname nh sau :
(define (<fname> <arg>)
(define (<i-name <arg> <result>)
(if (zero? <arg>)
<result>
(<i-name> (- <arg> 1) (<func> <arg> <result>))))
(<i-name> <arg> <init-val>))

Ng i ta c ng c th chuyn m t hm quy dng cy thnh quy kt thc, lc ny


thi gian tnh hm c rt g n m t cch ngon mc ! Chng hn ta vit li hm tnh cc s
Fibonacci theo kiu quy kt thc :

56

LP TRNH HM

(define (fib n)
(define (i-fib x y p) ; x=fib(n-p+1), y=fib(n-p)
(if (= p 0)
y
(i-fib (+ x y) x (- p 1))))
(i-fib 1 0 n))
(fib 100)
--> 354224848179261915075
(fib 200)
--> 280571172992510140037611932413038677189525

Ch rng hm tnh Fibonacci by gi c chi ph tuyn tnh !!!

II.3.5. Vo/ra d liu


Cho n lc ny, ta mi to ra cc hm m cha nu ln cch vo/ ra d liu. Thc t ta
li dng vng lp tng tc nh sau :
... c d liu tnh hm in ra kt qu ...

Mt trong nh ng nguyn l c a lp trnh Scheme l trnh tr n ln cc vic in ra kt qu


vi vic tnh ton trong cng m t nh ngha hm. Tuy nhin, trong mt s trng hp, vn
c th tr n ln cc qu trnh vo/ra vo bn trong ca m t hm.
1. c vo d liu : read

Hm (read) c m t d liu bt k ca Scheme t bn phm (l dng vo hin hnh)


v tr v gi tr c c m khng x y ra m t tnh ton no.
(read)

Sau khi thc hin li g i ny, Scheme bt u trng thi ch ngi s d ng g vo t


bn phm. Gi s ngi s dng g vo mt biu thc c cha nhiu du cch tha (gia +
v 2, gia 2 v 3) :
(+ 2 3)

Lp tc, Scheme s tr v kt qu l m t biu thc ng (khng cn du cch tha) m


khng tnh biu thc ny.
--> (+ 2 3)
Dng t ng qut ca hm c d liu c a Scheme c cha m t tham bin ty chn l mt
dng vo (flow) thng c dng khi c cc tp d liu (read [flow]). Khi nim v
cc dng vo/ra s xt chng sau.
2. In ra d liu : write v display
in ra gi tr ca mt s-biu thc bt k ra mn hnh (l dng ra hin hnh), Scheme c
hm (write s) nh sau :
(write Bonjour tout le monde!)
--> Bon jour tout le monde!

Gi tr in ra bi write l m t d liu Scheme v thy c bi read, tuy nhin, d


liu a ra phi ph hp vi thi quen ca ngi c. Chng hn, a ra cc chui k t
khng c du nhy, Sheme c hm display tng t write nh ng i vi cc chu i k t
th khng in ra cc du nhy :

NGN NG SCHEME

57

(display Hello, world!)


--> Hello, world!
qua dng mi, Sheme c hm (newline) khng c tham i :
(newline)
3. Xy dng vng lp c menu

Sau y, ta xy dng mt hm gy ra m t vng lp in ra mt menu, v bng cch tr li


bi g vo mt s, hm thc hin mt cng vic cho n khi ngi ta s dng g 0 kt
thc vng lp. Khi g sai, hm a ra mt cu thng bo yu cu g li.
(define (menu)
(display Enter 0 to quit, 1 to job1, 2 to job2.)
(let ((rd (read)))
(cond ((equal? rd 0) (display Good bye!))
((equal? rd 1) (display I work the job 1.)
(newline ) (menu))
((equal? rd 2) (display I work the job 2.)
(newline) (menu))
(else (display restart :un known command.)
(newline) (menu)))))
(menu)
Enter 0 to quit, 1 to job1, 2 to job2.2
I work the job 2.
Enter 0 to quit, 1 to job1, 2 to job2.1
I work the job 1.
Enter 0 to quit, 1 to job1, 2 to job2.0
Good bye!;Evaluation took 13255 mSec (0 in gc) 27 cells
work, 130 bytes other

Ch cc s 2, 1 v 0 sau du chm l do ngi s d ng g vo. Trong hm menu trn


y, ta thy xut hin hiu ng ph trong thn m t hm, ngha l biu thc khng c s
dng gi tr m ch in ra.

58

LP TRNH HM

Tm tt chng 2

Scheme l mt ngn ng lp trnh hm thu c h Lisp. Ngn ng Scheme rt thch hp


m t cc khi nim tru tng v cc cng c lp trnh.
Scheme c c php n gin, d hiu, d lp trnh. Hot ng c bn trong lp trnh
Scheme l tnh gi tr cc biu thc. Scheme lm vic theo ch tng tc.
Scheme (c ng nh hu ht cc ngn ng h Lisp) rt thun tin khi gii cc bi ton
x l k hiu, tnh ton hnh thc. S d ng Scheme c th tnh o hm c a m t hm,
tnh tch phn, tm nghim cc phng trnh vi phn...
Scheme c hai loi kiu d liu l kiu n gin v kiu phc hp. Kiu d liu n
gin gm kiu s, kiu lgch, kiu k t v kiu k hiu. Kiu d liu phc hp g m
danh sch v cy.
Scheme s dng cch vit biu thc dng tin t. Ngha l vit cc php ton r i mi
n cc ton hng v t tt c trong cp du ngoc.
Scheme tnh gi tr c a mt biu thc ngay khi biu thc ng n v mt c
php, hoc thng bo li sai.
Trong Scheme, ngi ta a vo khi nim s-biu thc l tt c cc kiu d liu c th
nhm li vi nhau ng n v mt c php.
Scheme s dng nhiu kiu nh ngha cho bin, cho hm.
Trong Scheme php quy c s dng trit . Ngi lp trnh c th s dng s
quy hoc php lp nh ngha mt hm. Trong m t s trng hp, s d ng php
lp s c chi ph thp hn.
Mt chng trnh Scheme l m t dy cc nh ngha hm gp li nh ngha mt
hoc nhiu hm phc tp hn.
Trong Scheme, ngi ta thng kh phn bit chng trnh (hm) v d liu (danh
sch) do c chng trnh v d liu u c cch vit s d ng cc cp du ngoc lng
nhau nhiu mc.
Trong mt s phin bn trnh thng dch, mi danh sch hay k hiu thng c t
pha trc mt du nhy n (quote) d phn bit vi hm.
Kh nng vo/ra d liu trong Scheme rt hn ch.

NGN NG SCHEME

59

Bi tp chng 2
1. Gii thch cc biu thc s hc sau y, sau tnh gi tr v so snh kt qu :
(+ 23 (- 55 44 33) (* 2 (/ 8 4)))
(define a 3)
a
(/ 6 a)
(define b (+ a 1))
(+ a b (* a b))
2. Gii thch cc biu thc lgic sau y, sau o tnh gi tr v so snh kt qu (c th s
dng hai bin a v b trong bi tp 1) :
(= 2 3)
(= a b)
(not (or (= 3 4) (= 5 6)))
(+ 2 (if (> a b) a b))
3. Gii thch cc biu thc iu kin sau y, sau o tnh gi tr v so snh kt qu :
(if (= 1 1) waaw brrr)
(if (= 4 4) 5 6)
(if (> a b) a b)
(if (and (> b a) (< b (* a b))) b a)
(+ 2 (if (> a b) a b))
((if (< a b) + -) a b)
(cond ((= 1 1) waaw 1)
((= 2 2) waaw 2)
((= 3 3) waaw once more)
(else waaw final))
(* (cond ((> a b) a)
((< a b) b)
(else -1))
(+ a 1))

4. Vit dng ngoc tin t ca cc biu thc :


a) (pa) (pb) (pc)
b) 1 + 2x2 + 3x3
sin( x + y) cos(x y)
1 + cos(x + y)
c)
5. Cc biu thc sau y c ng v mt c php hay khng?
f (x y z)
(f) (x y z)
(f)
((f f))
()
ff
((a) (b) (c))
6. Gii thch cc s-biu thc sau y, sau o tnh gi tr v so snh kt qu :
(and #f (/ 1 0))
(if #t 2 (/1 0))
(if #f 2 (/ 1 0))
(and #t #t #f (/ 1 0))
(and #t #t #t (/ 1 0))

60

LP TRNH HM

7. Vit hm yu cu ngi s d ng g vo m t s nm gia 0 v 1000 tr v gi tr


bnh phng ca s . t hm ny vo trong mt vng lp vi menu.
8. Vit hm s d ng menu gii h phng trnh i s tuyn tnh :
ax + by = 0
cx + dy = 0
9. Vit hm tnh gi tr tin phi tr t gi tr khng thu (duty-free). Bit rng h s
thu VAT l 18,6%.
10. Vit hm tnh chiu cao h c a tam gic theo cc cnh a, b, c cho bit din tch tam
gic c tnh :
S=

p(p-a) (p-b) (p-c)

vi p l na chu vi (s d ng hm b tr tnh tnh p).


11. Vit biu thc tnh nghim phng trnh bc hai ax2 + bx + c = 0.
12. Cho bit gi tr ca a=10, hy tnh :
(let ((a (* a a)) (b (* 4 5)) (c (* a 5)))
(+ a b c))
13. Tnh gi tr hai biu thc sau :
(let ((x 5))
(let* ((y (+ x 10)) (z (* x y)))
(+ x y z)))
(let ((x 4))
(if (= x 0) 1 (let ((x 10)) (* x x))))
14. Vit biu thc Scheme tnh gi tr :
x2 + y2 1+

x2 + y2 +

x2 - y2
x2 - y2

khi bit gi tr c a x, y

15. Vit hm (sum n) = 1 + 1/2 +...+ 1/n vi n nguyn, n > 0


16. Vit hm (power n x) = xn vi x bt k v n nguyn. Cho xn = x * xn1.
M rng cho trng hp n < 0.
17. Tng t bi tp 16 nh ng s d ng phng php chia i :
2

x0 = 1, xn = x* xn1 nu n l v xn = (xn/2) nu n chn.


18. Vit v t kim tra mt nm cho c phi l nm nhun khng ?
19. Vit hm(nbsec h m s) tnh ra s giy t gi, pht, giy cho. V d :
(nbsec 10 3 45)
--> 36225
20. Vit hm (Hanoi n A B C) gii bi ton Thp H N i. V d :
(Hanoi 2 A B C)
--> Move A to B
Move A to C
Move B to C

Error! Reference source not found.

CHNG I.

NGUYN L LP TRNH HM.....................................................................................1

M U V NGN NG LP TRNH ...................................................................................................1


Vi nt v lch s ...............................................................................................................1
nh ngha mt ngn ng lp trnh .............................................................................2
Khi nim v chng trnh dch ....................................................................................4
Phn loi cc ngn ng lp trnh ..................................................................................5
Ngn ng lp trnh mnh lnh ......................................................................................7
I.2
C S CA CC NGN NG HM ......................................................................................................8
I.2.1.
Tnh khai bo ca cc ngn ng hm ..........................................................................8
I.2.2.
nh ngha hm ...............................................................................................................11
I.2.3.
Danh sch ..........................................................................................................................13
I.2.4.
Php so khp ....................................................................................................................16
I.2.5.
Phng php currying (tham i ho tng phn).................................................17
I.2.6.
Khi nim v bc ca hm ............................................................................................18
I.2.7.
Kiu v tnh a kiu ........................................................................................................20
I.2.8.
Tnh hm theo kiu khn ngoan .................................................................................22
I.2.9.
Mt s v d ......................................................................................................................25
I.1

I.1.1.
I.1.2.
I.1.3.
I.1.4.
I.1.5.

1.
2.
3.
4.

I.3

Loi b nhng phn t trng nhau...................................................................................................25


Sp xp nhanh quicksort ...................................................................................................................25
Bi ton tm qun hu ......................................................................................................................26
Bi ton Hamming..............................................................................................................................27

KT LUN ......................................................................................................................................29

CHNG II.

NGN NG SCHEME...................................................................................................33

GII THIU SCHEME .....................................................................................................................33


CC KIU D LIU CA SCHEME ....................................................................................................34
II.2.1. Cc kiu d liu n gin .............................................................................................34

II.1
II.2

II.2.1.1.
II.2.1.2.
II.2.1.3.

II.2.2.
II.2.3.
II.3

Kiu s .....................................................................................................................................34
Kiu lgch v v t...............................................................................................................36
K hiu.....................................................................................................................................38

Khi nim v cc biu thc tin t .............................................................................39


S-biu thc .......................................................................................................................41

CC NH NGHA TRONG SCHEME .................................................................................................41


nh ngha bin ...............................................................................................................41
nh ngha hm ...............................................................................................................42

II.3.1.
II.3.2.

II.3.2.1.
II.3.2.2.
II.3.2.3.
II.3.2.4.

II.3.3.

Khi nim hm trong Scheme ...........................................................................................42


Gi hm sau khi nh ngha................................................................................................43
S dng cc hm b tr ......................................................................................................44
Tnh khng nh kiu ca Scheme....................................................................................45

Cu trc iu khin ........................................................................................................45

II.3.3.1.
Dng iu kin if.................................................................................................................45
II.3.3.2.
Bin cc b .............................................................................................................................47
1.
nh ngha bin cc b nh dng let................................................................................................47
2.
Phm vi t ng ca dng let ...........................................................................................................48
3.
Lin kt bin theo dy : dng let* ....................................................................................................48
II.3.3.3.
nh ngha cc v t .............................................................................................................49

II.3.4.

S quy v s lp .............................................................................................50

II.3.4.1.
S quy...........................................................................................................................50
II.3.4.2.
V d .........................................................................................................................................51
1.
Tnh tng bnh phng cc s t 1 n n........................................................................................51
2.
Tnh giai tha .....................................................................................................................................51
3.
Hm Fibonacci....................................................................................................................................51
4.
Tnh cc h s nh thc .....................................................................................................................52
II.3.4.3.
Tnh dng ca li gi quy..............................................................................................52
II.3.4.4.
Chng minh tnh dng ........................................................................................................54
II.3.4.5.
S lp..................................................................................................................................54

II.3.5.

Vo/ra d liu ..................................................................................................................56

61

1.
2.
3.

c vo d liu : read .......................................................................................................................56


In ra d liu : write v display ..........................................................................................................56
Xy dng vng lp c menu..............................................................................................................57

CHNG III. KIU D LIU PHC HP


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)

iu d liu phc hp trong Scheme gm kiu chui (string), kiu vect (vector), kiu b
K i
(doublet), kiu danh sch. Ngoi ra, Scheme cn mt s kiu d liu phc hp khc.
Kiu d liu th tc (procedure) ch nh cc bin cha gi tr tr v ca hm. Kiu d liu
cng (port) ch nh cc cng vo-ra tng ng vi cc tp v cc thit b vo-ra (bn phm,
mn hnh). Cui cng, tt c cc kiu d liu va xt trn y, k c kiu n gin, u c
Scheme gom li thnh mt giuc c gi l kiu s-biu thc.
Sau y, ta s ln lt trnh by cc kiu d liu chui, vect, b i v danh sch. Trong
phn trnh by kiu d liu b i, chng ta s nghin cu khi nim tru tng ho d liu
(data abstraction).

III.1

Kiu chui

Chui l mt dy cc k t bt k c vit gia mt cp du nhy i (double-quotes).


Gi tr ca chui chnh l bn thn n. V d sau y l mt chui :
Cha`o ba.n !
--> Cha`o ba.n !
C th a vo trong chui du nhy i, hay du \ (reverse solidus), bng cch t mt
du \ pha trc, chng hn :
(display two \quotes\ within.)
--> two quotes within.
Th vin Scheme c hm string cho php ghp lin tip cc k t thnh mt chui :
(string #\S #\c #\h #\e #\m #\e)
--> Scheme
Ta c th nh ngha mt bin nhn gi tr kiu chui :
(define greeting Scheme ; cha`o ba.n !)
; Ch du ; trong mt chui khng c vai tr l du ch thch.
tip cn n mt k t ca chui mt v tr bt k, cn s dng hm string-ref.
Ch s ch v tr k t l mt s nguyn dng, tnh t 0. Ch s hp l ln nht ca chui
cho l chiu di ca chui tr i 1 :
(string-length greeting)
--> 21
61

62

LP TRNH HM

(string-ref greeting 0)
--> #\S
(string-ref greeting 20)
--> #\!
(define Str
; s dng hm ghp lin tip cc chui
(string-append Chuoi \
greeting
\ co do dai 21.))
(display Str)
--> Chuoi Scheme ; cha`o ba.n ! co do dai 21.
V t string? dng kim tra kiu chui :
(string? greeting)
--> #t
S dng hm make-string, ta c th to ra mt chui c di bt k v cha cc k
t bt k :
(define a-5-long-string (make-string 5))
a-5-long-string
--> ?????
(define a-5-asterisk-string (make-string 5 #\*))
a-5-asterisk-string
--> *****
Hm string-set! dng thay th mt k t trong chui
cho ti mt v tr bt k cho bi ch s :
(string-set! a-5-long-string 0 #\c)
a-5-long-string
--> c????
Trn y ta s dng cc hm x l chui :
(string? Str)
Tr v #t nu str l mt chui, nu khng tr v #f.
(string-append str1 str2 ...)
Tr v chui ghp lin tip cc chui str1, str2.
(make-string k [char])
Tr v mt chui mi c di k. Nu c tham bin char, th tt c cc k t ca chui
s l char, nu khng ni dung ca chui s khng c xc nh.
(string-length str)
Tr v di ca chui str.
(string-ref str k)
Tr v k t th k ca chui str. Gi tr ca k phi hp l.
(string-set! string k char)
t gi tr k t th k ca chui str bi char. Gi tr ca k phi hp l.
Sau y l mt s hm x l chui khc ca Scheme :
Cc v t so snh chui :
(string=? str1 str2)

KIU D LIU PHC HP

63

(string<? str1 str2)


(string>? str1 str2)
(string<=? str1 str2)
(string>=? str1 str2)
tr v #t nu tha mn quan h th t t vng =, <, >, <=, >= gia cc chui (c phn bit
ch hoa ch thng), tr v #f nu khng tha mn. Php so snh da trn cc v t so snh
k t char=?, char<?, char>?, char<=?, v char>=?. Hai chui c xem nh
tng ng v mt t vng nu chng c cng chiu di v bao gm dy cc k t ging
nhau tng ng vi char=?.
Cc v t sau y cng cho kt qu tng t nhng php so snh chui khng phn bit
ch hoa ch thng :
(string-ci=? str1 str2)
(string-ci<? str1 str2)
(string-ci>? str1 str2)
(string-ci<=? str1 str2)
(string-ci>=? str1 str2)
Php so snh c da trn cc v t so snh k t char-ci=?, char-ci<?, charci>?, char-ci<=?, v char-ci>=?.
Hm :
(string-copy str)
tr v chui mi l bn sao (copy) ca str :
(string-copy abc)
--> abc
Hm :
(substring str k l)
tr v bn sao ca str k t k t c ch s k (k c k) n k t c ch s l (khng k l).
Cc gi tr ca k v l phi hp l.
(substring "Hello, World!" 0 1)
--> H
(substring "Hello, World!" 7 12)
--> World
Hm substring c th nh ngha li nh sau :
(define (my-substring s1 m n)
(let ((s2 (make-string (- n m))))
(do ((j 0 (+ j 1)) (i m (+ i 1)))
((= i n) s2)
(string-set! s2 j (string-ref s1 i)))))
(my-substring "Hello, World!" 7 12)
--> World
Trong hm my-substring s dng cu trc lp do c c php nh sau :
(do ((var1 init1 step1)
... )
(test expr ...) command ... )

64

LP TRNH HM

Cu trc lp do hot ng tng t nh lnh do trong cc ngn ng mnh lnh : bin


iu khin var1 nhn gi tr khi ng init1 c bc thay i step1 (nu c) cho mi ln
lp. Khi iu kin lp test cha c tho mn (false), biu thc command (nu c) c
thc hin. Khi test c tho mn (true), cc biu thc expr c tnh (t tri qua phi)
ng thi l gi tr tr v.
(define L '(1 3 5 7 9))
(do ((L L (cdr L))
(sum 0 (+ sum (car L))))
((null? L) sum))
--> 25

III.2

Kiu d liu vect

Vect l kiu d liu gm mt dy cc phn t tng t kiu chui, nhng mi phn t


c th c kiu bt k, khng hon ton k t. Mi phn t ca vect li c th l mt vect,
t to thnh vect c nhiu chiu (multidimensional vector). Trong Scheme, cc phn t
ca vect c t trong mt cp du ngoc (), ngay st trc cp du ngoc c t mt du
# (number sign).
#(999 #\a Kiki (1 2 3) x)
--> #(999 #\a Kiki (1 2 3) x)
S dng hm vector to ra mt vect cc s nguyn nh sau :
(vector 1 2 3 4 5)
--> #(1 2 3 4 5)
(vector x y z)
--> #(x y z)
Hm make-vector to ra mt vect c di n nh trc :
(make-vector 3)
--> #(#{Unspecific} #{Unspecific} #{Unspecific})
(make-vector 3 Kiki)
--> #(Kiki Kiki Kiki)
Tng t kiu chui, cc hm vector-ref v vector-set! dng tip cn v
thay i tng ng tng phn t ca vect. V t vector? dng kim tra kiu vect :
(vector? #(x y z))
--> #t
S dng cu trc do, ta to ra mt vect cc s t nhin nh sau :
(do ((v (make-vector 5))
(i 0 (+ i 1)))
((= i 5) v)
(vector-set! vec i i))
--> #(0 1 2 3 4)

KIU D LIU PHC HP

III.3

65

Kiu d liu b i

III.3.1. Khi nim tru tng ho d liu


Tru tng ho th tc (procedure abstraction) l xy dng cc ng dng phc tp t
nhng thao tc n gin, bng cch che du trong chng mc c th nhng chi tit x l.
Tru tng ho d liu cng nhm mc ch nh ngha mt lp d liu phc tp v cch
thao tc trn cc d liu m khng quan tm n cch biu din v ci t chng trong
my vt l nh th no. Phng php tru tng ho d liu c ng dng rng ri trong
lp trnh hng i tng.
Mt cu trc d liu tru tng hay kiu d liu tru tng c nh ngha, hay c
c t (specification) bi 4 thnh phn : tn kiu d liu tru tng (types), cc nh ngha
hm (functions), cc iu kin u (preconditions) nu c v cc tin (axioms). Hai thnh
phn u m t c php v mt cu trc thuc tnh ca kiu d liu tru tng, hai thnh
phn sau m t ng ngha.
Thnh phn functions lit k cc khun mu hm (function pattern). Mi khun mu
hm, cn c gi l mt k php (signature), c dng mt nh x cho bit kiu ca cc tham
i v ca kt qu nh sau :
Tn-hm : min-xc-nh > min-tr
Ngi ta thng phn bit ba loi hm l hm kin to (constructor) to ra kiu d liu
mi, hm tip nhn (accessor) trch ra cc thuc tnh v hm bin i (transformator)
chuyn kiu d liu.
Do cc hm khng phi lun lun xc nh vi mi d liu nn ngi ta cng phn bit
cc hm ton phn (total functions) v cc hm b phn (partial functions). Trong trng hp
cc hm l b phn, ngi ta cn cung cp cc iu kin u l cc rng buc trn min xc
nh ca hm. Mt li gi hm khng tun theo iu kin u u dn n sai st (chia cho 0,
tnh cn bc hai ca mt s m, v.v...). Chng hn, iu kin u ca hm to s hu t
(create-rat n d) l mu s d0. Thnh phn preconditions c th vng mt nu
khng c iu kin u.
Thnh phn axioms m t cc chc nng vn dng hm, phi c khai bo r rng,
y v d hiu. Mi vn dng hm c dng mt mnh lgch hp thc lun c gi tr
true, ngha l mt hng ng (tautology). Khi cn s dng cc bin, ngi ta s dng t
kho var khai bo trc tn cc bin, tng t trong cc ngn ng lp trnh mnh lnh
nh C, Pascal...
Ch rng kiu tin nh number cng l mt kiu tru tng : bi v ta c th bit cc
php ton s hc trn cc s nh +, , *, ... nhng ta li khng bit cch biu din chng
trong b nh. Chng hn sau y l c t kiu s t nhin (natual number) :
types nat
functions
0 : -> nat ; 0 l s t nhin u tin, l mt hng (constant)
succ : nat -> nat
; hm successor ly phn t k tip
+ : nat nat -> nat
: nat nat -> nat
* : nat nat -> nat
^ : nat nat -> nat
= : nat nat -> boolean

66

LP TRNH HM

axioms var X, Y : nat


X + 0 == X
X + succ(Y) == succ(X + Y)
0 X 0
; ch lm vic vi cc s t nhin
X 0 X
succ(X) succ(Y) X Y
X * 0 0
X * succ(Y) X + (X * Y)
X ^ 0 succ(0)
X ^ succ(Y) X * (X ^ Y)
0 = 0 true
succ(X) = 0 false
0 = succ(X) false
succ(X) = succ(Y) X = Y

III.3.2. nh ngha b i
Trong ngn ng Scheme, mt b i, hay cn c gi l cp c du chm (dotted pair),
l kiu d liu phc hp tng t bn ghi gm mt cp gi tr no c th t. C mt du
chm phn cch hai gi tr lu gi trong b i v cc du cch phn cch gia du
chm v cc gi tr. Phn t (trng) th nht c gi l car, phn t th hai cdr.
1

Cc tn car v cdr xut hin khi John Mc. Carthy xut ngn ng Lisp chy trn
IBM-704 nm 1956 v c gi li theo truyn thng.
Gi s any l mt kiu d liu no ca Scheme, k php ca cu trc b i
doublet c c t nh sau :
types doublet
functions
cons : any any
-> doublet
car : doublet -> any
cdr : doublet -> any
pair? : any
-> boolean
axioms var a, y : any
car(cons(x, y)) = x
cdr(cons(x, y)) = y
T kiu tru tng b i, to ra b i, ngi ta s dng cons :
(cons s1 s2)
--> (<gi tr ca s1> . <gi tr ca s2>)
Sau y l mt v d v mt b i : :
(cons year 2004)
; gm mt k hiu v mt s
-> (year . 2004)
(cons 29 #t)
; gm mt s v mt tr lgch
-> (29 . #t)
nh ngha bin c gi tr l mt b i :
1

car = content of the address register, cdr = content of the decrement register.

KIU D LIU PHC HP

67

(define x (cons 1 2))


x
--> (1 . 2)
(car x)
--> 1
(cdr x)
--> 2
Trong my, b i c bin dch nh mt cp con tr tr n car v cdr.
x
car

cdr
1

Hnh III.1. Biu din cc b i nh con tr.


Cc thnh phn car v cdr ca b i c vai tr i xng nhau : hm car tng ng
vi thnh phn u tin v hm cdr tng ng vi thnh phn th hai. Ta c quan h tng
qut nh sau :
(car (cons a b)) = <gi tr ca a>
(cdr (cons a b)) = <gi tr ca b>
(car x)
--> 1
x = (1 . 2)
(cdr x)
--> 2
(cdr (car y))
--> 2
V t pair? dng kim tra s-biu thc c phi l mt b i hay khng ?
(define x (1 . 2))
(pair? x)
--> #t
; x = (1 . 2) l mt b i
(pair? (cdr x))
--> #f
;(cdr x) = 2 khng phi l mt b i
V t eq? hay c dng kim tra hai b i c ng nht vi nhau khng. Thc cht,
eq? kim tra tnh ng nht ca hai con tr.
Ng ngha ca hm ny nh sau :
axioms var x, y : doublet ; a, b : any
(x = cons(a, b)) (y = x) (eq?(x) = eq?(y))
V d :
(define x (cons 1 2))
(define y x) ; c x v y cng tr n mt b i
(eq? x y)
--> #t
Tuy nhin :

68

LP TRNH HM

(eq? x (cons 1 2))


--> #f
bi v x khng tr n b i mi c to ra bi cons !

III.3.3. t bin trn cc b i


Nh cons, car, cdr, ta nh ngha cc b i nh l d liu s cp. T , ta c th
thay i b i nh cc hm t bin set-car! v set-cdr!. Cc hm ny khng to ra
b i mi, nhng lm thay i b i ang tn ti. Scheme quy c cc hm lm thay i
trng thi mt i tng c tn gi kt thc bi du chm than !. Ngi ta gi l nhng
hm t bin (mutator functions). Gi s kiu b i c to ra t hai kiu d liu no
ca Scheme l T1 v T2, ta vit quy c doublet(T1, T2), khi cc hm set-car!
v set-cdr! c b sung vo phn c t hm nh sau :
functions
set-car! : doublet(T1, T2) T1 any
set-cdr! : doublet(T1, T2) T2 any
Ng ngha ca cc hm ny 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)
(x = cons(a, b)) (set-cdr!(x, b1)) (cdr(x) = b1)
Gi s ta c b i :
(define x (cons 1 2))
x
--> (1 . 2)
x

x
1

2
(a)

4
1

3
(b)

Hnh III.3.1. Biu din cc b i t bin.


Trc (a) v sau khi (b) thay i b i
Khi nu thc hin :
(set-car! x 3)
(set-cdr! x 4)
th gi tr ca con tr x khng thay i, c hai trng hp u cng tr n mt b i. Tuy
nhin trong trng hp sau, ni dung ca b i thay i, lc ny b i cha hai con tr
tr n hai v tr biu din ln lt 3 v 4. Ring hai v tr cha ln lt 1 v 2 vn nh c.
Kim tra gi tr ca con tr x :
x
--> (3 . 4)

KIU D LIU PHC HP

69

III.3.4. ng dng b i
1.

Biu din cc s hu t

Scheme s dng b i biu din kiu d liu danh sch. Trc khi trnh by cc php
x l trn danh sch, ta c th s dng b i minh ho mt cch biu din cc s hu t,
l mt cp s nguyn (trong Scheme, s hu t c dng tin nh n/d).
Gi s ta cn xy dng mt tp hp cc hm cho php x l cc s hu t nh : cng (+),
tr (), ... Gi s kiu s hu t rational c c t nh sau :
types rational
functions
create-rat : integer integer > rational
numer :
rational
> integer
denom :
rational
> integer
=rat :
rational rational
> boolean
var r : rational ; n, n1, n2, d, d1, d2 : integer
preconditions
(r=create-rat(n, d)) (numer(r)*d=denom(r) *n)
(denom(r) 0)
axioms
numer(create-rat(n, d)) = n
denom(create-rat(n, d)) = d
(=rat(create-rat(n1, d1), create-rat(n2, d2)) (n1*d2 =
n2*d1)
Hm create-rat c vai tr to s hu t t t s n v mu s d. Cc hm numer tr
v t s (numerator) v denom tr v mu s (denominator) ca s hu t l cc hm tip
nhn. Hm =rat l hm kim tra hay chuyn kiu, kim tra nu hai s hu t l bng nhau.
Khi r l mt s hu t, r=n/d, th t s ca r l n v mu s l d0. Hai s hu t
r1=n1/d1 v r2=n2/d2 bng nhau khi v ch khi n1.d2 =n2/d1.
Ch rng phn functions mi ch nh ngha c php ca hm, cha xy dng ng
ngha cho n. Cc tn php ton c mt trong k php l cha , m cn c thm phn
axioms. V d cc nh ngha trong Scheme sau y tuy ng n v mt c php, nhng
hon ton khng c ngha s dng i vi kiu tru tng rational :
(define (create-rat n d) n)
(define (numer r) r)
(define (denom r) r)
(define (=rat r1 r2) (= r1 r2))
(create-rat n d) to s hu t t t s n v mu s d
(numer x)
tr v t s (numerator) ca s hu t x
(denom x)
tr v mu s (denominator) ca s hu t x
(=rat r1 r2)
kim tra nu r1 v r2 u cng l mt s hu t
S dng b i, ta nh ngha li bn hm trn y theo cch hot ng c m t trong
thnh phn axioms nh sau :
(define (create-rat n d) (cons n d))

70

LP TRNH HM

(define (numer r) (car r))


(define (denom r) (cdr r))
(define (=rat r1 r2)
(= (* (car r1) (cdr r2))
(* (cdr r1) (car r2))))
V d : Ta p dng cc nh ngha trn to ra cc s hu t nh sau :
(define R1 (create-rat 2 3))
(define R2 (create-rat 4 5))
R1
--> (2 . 3)
R2
(4 . 5)
(numer R1)
--> 2
(denom R2)
--> 5
(=rat R1 R2)
--> #f
Ta tip tc nh ngha cc hm mi trn cc s hu t +rat, -rat, *rat, /rat (tng
ng vi cc php ton +, , *, / ) v hm chuyn mt s hu t thnh s thc rat->real
b sung vo kiu d liu tru tng rational nh sau :
functions
+rat :
rational rational
> rational
-rat :
rational rational
> rational
*rat :
rational rational
> rational
/rat :
rational rational
> rational
rat->real : rational
> real
n y, ngi c c th t mnh vit b sung phn ng ngha cho cc hm mi. Cc
hm ny c nh ngha trong Scheme nh sau :
(define (+rat x y)
(create-rat (+ (* (numer x) (denom y)) (* (denom x) (numer y)))
(* (denom x) (denom y))))
(define (-rat x y)
(create-rat (- (* (numer x) (denom y)) (* (denom x) (numer y)))
(* (denom x) (denom y))))
(define (*rat x y)
(create-rat (* (numer x) (numer y))
(* (denom x) (denom y))))
(define (/rat x y)
(create-rat (* (numer x) (denom y))
(* (denom x) (numer y))))
; chuyn mt s hu t thnh s thc :
(define (rat->real r) (/ (numer r) (denom r)))

KIU D LIU PHC HP

71

(+rat R1 R2)
--> (22 . 15)
(rat->real R1)
--> 0.666666666666667
(rat->real R2)
--> 0.8
V d bi ton x l s hu t dn n nhiu mc lp trnh c tru tng gim dn nh sau :
X l cc s hu t
X l cc php ton trn cc s hu t : +rat, -rat, *rat, /rat, =rat
X l s khi trn cc s hu t : create-rat, numer, denom
X l s khi trn cc b i : cons, car, cdr
Khi thit k chng trnh nh hng cu trc trong phng php tinh ch tng bc,
ngi lp trnh quan tm n cc mc tru tng cao hn, bng cch u tin chc nng x l
nh th no, m chn chm li (tr hon) cch biu din cc cu trc d liu tng ng. i
vi cc s hu t, ta c th biu din chng di dng phn s rt gn nh sau :
(define (create-rat n d)
(define g (gcd (abs n) (abs d)))
; Ch hm th vin gcd (greatest common divisor)
; ch tnh c s chung ln nht cho cc s nguyn dng
(cons (quotient n g) ( quotient d g)))
(define (numer r) (car r))
(define (denom r) (cdr r))
(define (=rat x y)
(and (= (car x) (car y))
(= (cdr x) (cdr y))))
(create-rat 6 14)
--> (3 . 7)
(gcd 12 3)
--> 3
Cc nh ngha hm trn y khng lm thay i tnh cht s hc ca cc s hu t, cng
nh khng lm thay i mc tru tng ca bi ton. Hai cch nh ngha th tc
create-rat va trnh by l ng tin cy v trc khi gi chng, ta gi thit rng iu
kin u (d 0) c tho mn.
D phng v khc phc nhng sai st c th xy ra, trong khi lp trnh hay trong qu
trnh khai thc ca ngi s dng, bng cch kim tra iu kin u, c gi l phng
php lp trnh d phng (defensive programming). Phng php lp trnh ny lm cho
chng trnh tr nn ng tin cy v d thuyt phc ngi s dng.
Ta vit li th tc create-rat nh sau :
(define (create-rat n d)
(if (zero? d) ; kim tra iu kin u
(display ERROR: *** Mu s bng 0 !)
(cons n d)))
(create-rat 4 0)
--> ERROR: *** Mu s bng 0 !

72

2.

LP TRNH HM

Biu din hnh ch nht phng

Gi s cn m hnh ha cc hnh ch nht trong ta phng xoy c cc cnh song song


vi cc trc to , ta c th c nhiu phng php m t hnh ch nht qua ta nh sau :
1. Ta ca hai nh i din.
2. Ta tm im v hai di cnh.
3. Ta ca nh di cng bn tri v hai di cnh.
Ta c th chn phng php th 3. Gi s x, y l ta ca nh A (xem hnh v), y l
di ca cnh song song vi 0x v H l di ca cnh song song vi 0y. Ta cn nh ngha
mt hm nh x mt hnh ch nht thnh mt i tng Scheme, gi l biu din trong
(internal representation) ca hnh ch nht.
L
H
A
y
0

Hnh III.2. Biu din cc thnh phn ca mt hnh ch nht.


n y, ta c th ngh n nhiu cch biu din nh sau :
S dng b i ((x y) . (L H)),
hoc s dng b i ((x . y) . (L . H)),
hoc s dng mt danh sch gm cc thnh phn (x y L H) (cu trc danh sch s
c trnh by trong mc sau),
v. v...
Tm thi ta cha chn cch biu din hnh ch nht (da theo quan im ca phng
php lp trnh cu trc : c gng tr hon vic khai bo d liu trong chng mc c th). Ta
xy dng hm cons-rectangle to mi mt hnh ch nht theo cc thnh phn x, y, y,
H. T mt cch biu din trong no ca hnh ch nht, ta cn xy dng cc hm tip cn
n cc thnh phn ny l value-x, value-y, value-L, value-H. Cc hm ny thc
hin cc php ton trn hnh ch nht mt cch c lp vi biu din trong cho.
u tin, ta cn xy dng v t (in? xo yo R) kim tra nu im M c to xo, yo
c nm bn trong (hay nm trn cc cnh) ca mt hnh ch nht R cho. Ta thy im M
phi c ta ln hn nh di cng bn tri v thp hn nh cui cng bn phi ca R. Ta
c chng trnh nh sau :
(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)))))

KIU D LIU PHC HP

73

By gi xy dng v t (inclus? R1 r2) kim tra hnh ch nht R1 c nm bn


trong hnh ch nht R2 khng ? Nu ng, tr v #t. Mun vy, ch cn R2 cha hai nh i
din ca R1. Ta c chng trnh nh sau :
(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)
(in? (+ x1 L2) (+ y1 H1) R2))))
tnh tin (translate) mt hnh ch nht R theo mt vct V c cc thnh phn a, b, ch
cn tnh tin nh di cng bn tri ca n. Ta c hm tnh tin nh sau :
(define (translate R a b)
(let ((x (value-x R))
((y (value-y R))
((L (value-L R))
((H (value-H R)))
(cons-rectangle (+ x a) (+ y b) L H)))

L
b
H

V
y
0

Hnh III.3. Tnh tin mt hnh ch nht.


Nh trnh by, vic x l trn cc hnh ch nht khng ph thuc vo cch biu din
d liu. Khi cn thay i cch biu din, ch cn vit li cc hm to mi hnh ch nht v
cc hm tip cn n cc thnh phn, m khng cn thay i cc hm in?, inclus?, v
translate.
Chng hn ta c th biu din hnh ch nht bi b i :
((x . y) . (L . H))
Khi , cch biu din trong ca hnh ch nht c xy dng nh sau :
(define (cons-rectangle x y L H)
(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)))
(define (value-H R) (cdr (cdr R)))
V d :
(define R (cons-rectangle 1 2 3 4))
R
--> '((1 . 2) 3 . 4) ; tng ng vi '((1 . 2) . (3 . 4))

74

LP TRNH HM

(value-L R)
--> 3
(value-H R)
--> 4

III.4

Kiu d liu danh sch

III.4.1. Khi nim danh sch


Khi gii mt s bi ton, ngi ta thng phi nhm nhiu d liu thnh mt d liu t
hp duy nht. nhm cc ngy trong tun l Monday, Tuesday, Wednesday, Thursday,
Friday, Saturday v Sunday thnh mt t hp d liu, ngi ta s dng cu trc danh sch c
dng mt s-biu thc nh sau :
(mon tue wed thu fri sat sun)
Tuy nhin, nu nh ngha :
(define week-list)
(mon tue wed thu fri sat sun))
--> *** ERROR-unbound variable: mon
th ta gp li s sai st v cc k t. Scheme xem danh sch ny nh l mt li gi hm c
tn mon vi cc tham i l tue, ... sun v, nh thy, ta cha h nh ngha hm mon
(!). nh ngha danh sch trn, Scheme s dng php ton trch dn :
(define week-list
(mon tue wed thu fri sat sun))
Khi ta c week-list l bin c gi tr l mt danh sch cc k t :
week-list
--> (mon tue wed thu fri sat sun))
x l thun tin, ngi ta s dng bin L ch nh mt danh sch, ta c :
(define L (1 2 3 4 5))
L
--> (1 2 3 4 5)
C th s dng cc danh sch phc tp hn biu din cc biu thc. C th xy dng
cc biu thc s hc, biu thc cha cc d liu k hiu, hay cha cc danh sch lng nhau.
Mt biu thc khi c trch dn c gi l mt biu thc trc kin (literal expression) v
rng gi tr ca n chnh l vn bn (text) to ra n. Biu thc trc kin c vai tr l mt
hng :
Cho trc mt danh sch, khi ta ni di hay s phn t ca danh sch (length) l s
phn t ca danh sch . Sau y l mt s v d :
(1 2 2 3)
; l mt danh sch gm 4 s nguyn
--> (1 2 2 3)
(one + two = three) ; l mt danh sch gm 5 k hiu tu
--> (one + two = three)

KIU D LIU PHC HP

()
--> ()
(* 4 5)
--> (* 4 5)

75

; danh sch rng (empty list) khng c phn t no


; khng phi l mt biu thc tnh c

Nu ta cn biu din cc thng tin v mt trang lch cng tc trong ngy, ta c th s


dng mt danh sch dng :
(define L-congviec-10-10-2000
(thu-hai
(sang
(9h doc-thu)
(9h-30 chuan-bi-len-lop)
(10h len-lop)
(12h an-trua))
(chieu
(14h tham-gia-chuyen-de)
(16h den-cuoc-hen))))
Kiu d liu danh sch cn c th thut c th c vo v in ra. Scheme cho php xy
dng cc danh sch khng thun nht (heterogeneous list) v kiu. Chng hn :
(define L (1 (2 3) x "bonjour"))
(list-ref L 0)
--> 1
(list-ref L 3)
--> "bonjour"
Tr trng hp ngc li, y ta ch nn x l cc danh sch thun nht (homogeneous
list) l danh sch ch cha cng mt kiu d liu T cho : cha ton cc s, hoc ch cha
ton cc k hiu, v.v... Th t ca cc phn t xut hin trong mt danh sch l c ngha.
Mt trong nhng c trng ca cc chng trnh h Lisp l c cng bn cht vi d liu.
Chng hn, nh ngha hm (define...) cng l mt danh sch. Ngi ta gi mt danh
sch con (sub-list) l mt phn t ca danh sch cho. Phn t ny c th l mt danh
sch, hay l mt danh sch con ca mt danh sch con.
V d, danh sch :
(a (b c) () ((c)) d)
c cc danh sch con l : (b c), (), ((c)) v (c). Mt danh sch khng c danh sch
con c gi l mt danh sch phng (plate list).
Ngi ta ni rng mt phn t l mc mt (first level) ca mt danh sch nu phn t
ny khng trong mt danh sch con.
Cc phn t mc mt ca danh sch va nu trn y l :
a, (b c), (), ((c)), c
Ngi ta gi cc phn t mc th n l nhng phn t mc mt ca mt danh sch con
c t mc n-1.
su (depth) ca mt danh sch l mc ca mt phn t mc cao nht. Chng hn
danh sch trn y c su l 3.
di (length) ca mt danh sch l s cc phn t mc th nht, c tnh nh hm
tin nh length ca Scheme :

76

LP TRNH HM

(length ((a b) (c d) () (e)))


--> 4
( a

( b c ) ()

( ( c ) )

d )

danh sch cho

( b c ) ()

( ( c ) )

cc phn t mc 1

b c

( c )

cc phn t mc 2

cc phn t mc 3

Hnh III.4. Biu din cc mc ca mt danh sch phc hp.


nh ngha kiu d liu tru tng danh sch
C th c nhiu cch khc nhau nh ngha mt danh sch. Sau y l c t kiu d
liu tru tng danh sch list(T) s dng cc php ton c bn cons, car v cdr, trong ,
T l kiu phn t ca danh sch :
types list(T)
functions
() : list(T)
null? :
list(T) -> boolean
pair? :
list(T) -> boolean
cons : T list(T) -> list(T)
car : list(T) -> T
cdr : list(T) -> list(T)
preconditions
car(x) ch xc nh vi x 0
cdr(x) ch xc nh vi x 0
axioms var L : list(T), x : T
car(cons (x, L))
= x
cdr(cons (x, L))
= L
null?(())
= true
null?(cons (x, L)) = false
pair?(())
= false
pair?(cons (x, L)) = true

III.4.2. ng dng danh sch


III.4.2.1. Cc php ton c bn cons, list, car v cdr
Scheme s dng b xy cons to mt danh sch :
(cons s L)
tr v mt danh mi bng cch thm gi tr ca s trc danh sch L.
(cons a ())
--> (a)
(cons (+ 5 8) (a b))
--> (13 a b)
Scheme c th nhn bit mt danh sch v a ra theo cch ring :

KIU D LIU PHC HP

77

(cons 1 2)
--> (1 . 2)
(cons 1 ())
; ch du quote do danh sch rng lm tham i
--> (1)
; khng phi (1 . ())
(cons 1 (cons 2 (cons 3 ())))
-> (1 2 3)
; khng phi (1 . (2 . (3 . ())))
xy dng danh sch, Scheme thng s dng hm list. Quan h gia b xy cons
v cu trc list c tm tt bi ng thc sau :
(list <e1> ... <eN>) =
(cons <e1> (cons <e2> ... (cons <eN> ())...))
V d :
(list (cons 1 2) (cons 3 4))
--> ((1 . 2) (3 . 4)) ; (1 . 2) v (3 . 4) l cc b i
Hm list nhn mt s tham i ty l cc s-biu thc tr v mt danh sch mi t
hp t cc gi tr ca cc tham i . V d :
(list 1 2 3)
--> (1 2 3)
(list (a b) (c d) (c d) () ((e)))
--> ((ab) (cd) () (e))
Danh sch sau y gm 3 phn t, phn t th nht l du + :
(+ 1 2)
--> (+ 1 2)
Ch kiu d liu ca cc phn t danh sch :
(list a b c)
--> Error: undefined variable a
(list a b c)
(a b c)
Cc dng car v cdr dng tip cn n cc phn t ca mt danh sch khc rng.
Hm (car L) tr v phn t u tin ca L
(car (a b c))
--> a
(car (1 2 3)) == (car (quote 1 2 3))
--> 1
(car (+ 1 2))
--> +
(car 1)
--> quote
Hm (cdr L) tr v danh sch L ly i phn t u tin
(cdr (a b c))
--> (b c)
Ta cng c cc ng thc sau :
(car (cons s L)) = s(cdr (cons s L)) = L

78

LP TRNH HM

Vi quy c du gch trn tn ch nh gi tr ca mt biu thc. Trong Scheme, car hay cdr
ca mt danh sch rng u dn n mt li sai, trong khi trong cc ngn ng pht trin t Lisp th
thng c kt qu tr v l mt danh sch rng. Nu mun thay i tn cc hm car v cdr
ny, ch cn nh ngha cc hm ng ngha head v tail nh sau :
(define head car)
(define tail cdr)
Tuy nhin, khng nn nh ngha nh vy, v rng s gp kh khn khi cng vic lp trnh
c s tham gia ca nhiu ngi. Bng cch t hp cc hm car hoc cdr, ta c th tip cn
n bt k mt phn t no ca mt danh sch :
(car (cdr week-list))
--> mardi
(car (cdr (cdr week-list))))
--> mercredi
Cch vit t hp trn y s lm ngi c kh theo di. Chnh v vy ngi ta a ra
mt h thng vit tt ch nh s t hp ti a l bn car hay cdr. Scheme quy c :
cx1x2x3x4r

vi xj l mt a hoc mt d, j =1..4

l dy hm ghp : cx1r cx2r cx3r cx4r


Scheme c tt c 28 hm ghp nh vy. V d :.
(caadr (a (b) c d e)) ; l hm carcarcdr
--> b
(cddddr (a (b) c d e)) ; l hm cdrcdrcdrcdr
--> (e)
(cddddr week-list)
--> (vendredi samedi dimanche)
Sau y, ta c th s dng hai s tng qut nh ngha cc hm x l danh sch :
S quy tuyn tnh :
(define (<fname> <arg>)
(if (null? <arg>)
<init-val>
(<func> (car <arg>) (<fname> (cdr <arg>)))))
S lp :
(define (<fname> <arg>)
(define (<i-name> <arg> <result>)
(if (null? <arg>)
<result>
(<i-name> (cdr <arg>)
(<func> (car <arg>) <result>))))
(<i-name> <arg> <init-val>))
V t null? ca Scheme cho php kim tra mt danh sch rng.
(null? '())
--> #t

KIU D LIU PHC HP

79

III.4.2.2. Cc hm x l danh sch


Th vin ca Scheme c sn nhiu hm x l danh sch. Sau y ta c t b sung mt s
hm x l danh sch thng dng vo kiu d liu tru tng list(T) nh sau :
functions
length : list (T)
-> Integer
append : ist(T) list(T) -> list(T)
reverse : list(T)
-> list(T)
1. Cc hm length, append v reverse
Hm length tr v di ca danh sch c nh ngha nh sau :
(define (length L)
(if (null? L)
0
(+ 1 (length (cdr L)))))
Hm length c chi ph tuyn tnh. V d :
(length (list 1 2 3))
--> 3
(= (length (list 1 2 3 4)) 0)
--> #f
Cc danh sch rng c th c to ra bi hm (list) khng c tham i, hoc s
dng trc kin (). V d :
(= (length (list)) 0)
--> #t
(= (length ()) 0)
--> #t
(null? (list 1 2 3 4))
--> #f
(null? (list))
--> #t
(null? ())
--> #t
Scheme khng tha nhn dng () l mt biu thc, m xem () l mt gi tr. V
vy, s dng danh sch rng, ta cn trch dn :
()
--> ()
Hm append nhn mt s tham i ty , mi tham i c gi tr l mt danh sch
tr v mt danh sch mi, l ghp (concatenation) tt c cc danh sch tham i ny. Hm
append c nh ngha nh sau :
(define (append L1 L2)
(if (null ? L1)
L2
(cons (car L1) (append (cdr L1) L2))))
Hm append c chi ph tuyn tnh theo L1. V d :

80

LP TRNH HM

(append (list 1 2 3) (list 4 5 6 7))


--> (1 2 3 4 5 6 7)
(append (a b) (c d) () ((e)))
--> (a b c e (e))
Khng nn nhm ln cch s dng ca cc hm cons, list, v append :
(cons (a b) (c d))
--> ((a b) (c d))
(list (a b) (c d))
--> ((a b) (c d))
(append (a b) (c d))
--> (a b c d)
Hm reverse tr v danh sch nghch o (reverse list) ca tham i, c nh ngha
quy nh sau :
(define (reverse L)
(if (null? L)
() ; hoc (list)
(append (reverse (cdr L)) (list (car L))))
Chi ph ca hm reverse l tuyn tnh theo L. V d :
(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)
Ch ngi lp trnh thng gp li sai v kiu gia car, cdr v list. Nn thng
xuyn thc hin vic phn tch kiu. Chng hn nu dng cui trong nh ngha hm
reverse vit li l :
(append (reverse (cdr L)) (car L)))) ; qun t tin t list
th s gy ra li sai v (car L) l mt phn t, khng phi l mt danh sch. Ta c th
nh ngha li hm reverse nh php lp nh sau :
(define (reverse L)
(define (rev-iter L R)
(if (null? L)
R
(rev-iter (cdr L) (cons (car L) R))))
(rev-iter L ())) ; hoc (list)
(reverse (list 1 2 3 4))
--> (4 3 2 1)
Chi ph ca hm reverse vn tu thuc tuyn tnh vo L.
2. Cc hm tham chiu danh sch
(list-ref L n)
(list-tail L n)
(list? L)

KIU D LIU PHC HP

81

Hm (list-ref L n) tr v phn t th n ca danh sch L, vi quy c rng trong


mt danh sch, cc phn t c nh s t 0.
(define (list-ref L n)
(if (zero? n)
(car L)
(list-ref (cdr L) (- n 1))))
(list-ref '(a b c d e) 3)
--> d
Hm (list-tail L n) tr v phn t cn li ca danh sch L sau khi b i n phn t
u tin :
(define (list-tail L n)
(if (zero? n)
L
(list-tail (cdr L) (- n 1))))
(list-tail (a
--> (a b c)
(list-tail (a
--> (c)
(list-tail (a
--> ()
(list-tail (a
--> (c . d)
(list-tail (a
--> d

b c) 0)
b c) 2)
b c) 3)
b c . d) 2)
b c . d) 3)

(define week-end (list-tail week-list 5))


week-end
--> (samedi dimanche)
V t (list? L) kim tra L c phi l mt danh sch khng :
(list?
--> #t
(list?
--> #t
(list?
--> #f
(list?
--> #f
(list?
--> #f

())
(a b c))
a)
(3 . 4))
3)

3. Cc hm chuyn i kiu
(string->list str)
(list->string L)
(string->number str [radix])

82

LP TRNH HM

Hm (string->list str) chuyn mt chui thnh mt danh sch. Hm ny c th


c nh ngha nh sau :
(define (tring->list str)
(do ((i (- (string-length str) 1) (- i 1))
(ls () (cons (string-ref str i) ls)))
((< i 0) ls)))
(string->list )
--> ()
(string->list abc)
--> (#\a #\b #\c)
(apply char<? (string->list abc))
--> #t
(map char-upcase (string->list abc))
--> (#\A #\B #\C)
(map char-downcase (string->list ABC))
--> (#\a #\b #\c)
Ch hm (char-upcase ch) chuyn mt ch thng thnh ch hoa,
cn hm (char-downcase ch) chuyn mt ch hoa thnh ch thng.
Hm (list->string L) chuyn mt danh sch thnh mt chui. Hm ny c th
c nh ngha 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 ())
-->
(list->string (#\a #\b #\c))
--> abc
(list->string
(map char-upcase
(string->list abc)))
--> ABC
Hm (string->number str [radix]) chuyn mt chui str thnh mt s h
10 (mc nhin). Nu c thm thnh phn radix l mt s nguyn ch c s h m 2, 8, 10
hay 16 th s trong h m tng ng s c i sang h 10 :
(string->number 9999)
--> 100
(string->number 1e3)
--> 1000.0
(string->number "1ABC" 16)
--> 6844

KIU D LIU PHC HP

83

4. Cc hm so snh danh sch


so snh cc danh sch, ngi ta dng v t equal? :
(equal? (a b 3) (list a b (+ 1 2)))
--> #t
(equal? (()) ())
--> #t
Ta gp c cc v t xc nh kiu d liu danh sch ca mt s-biu thc :
(list? s)--> #t
(null? s)--> #t
(pair? s)--> #t

nu gi tr ca biu thc s l mt danh sch bt k


nu gi tr ca biu thc s l mt danh sch rng
nu gi tr ca biu thc s l mt danh sch khc rng.

i khi ngi ta cn kim tra nu mt s-biu thc khng phi l mt danh sch v kim
tra nu mt danh sch c phi c rt gn thnh mt phn t duy nht khng. Ta thm cc
v t sau y vo th vin cc tin ch vn cha c trong th vin tin nh ca Scheme :
V t atom? kim tra nu mt s-biu thc khng phi l mt danh sch :
(define (atom? s)
(not (pair? s)))
V t singleton? kim tra mt danh sch c rt gn thnh mt phn t duy nht :
(define (singleton L)
(null? (cdr L)))
Ngi ta cng thng phi kim tra nu mt i tng l mt phn t mc th nht ca
mt danh sch. Mun vy, ngi ta s dng mt hm tin nh (member S L). Hm ny
tr li mt phn ca danh sch L cha phn u tin (first ocurrence) ca gi tr s, hoc tr v
#f nu danh sch L khng c. S so snh c thc hin nh kim tra equal? :
(member (b) (a b c d))
--> #f
(member (b) (a b c (b) d))
--> ((b) d)
Scheme xem cc gi tr bng nhau cc mc chnh xc khc nhau. V t equal? so
snh cc cu trc nhng khng phi l s so snh tn ca cc i tng. Tn ca cc i
tng c kim tra nh v t eq? v tn ti mt v t so snh t cht ch hn l eqv?.
Nh vy, so snh cc danh sch hoc cc chui, ta s dung equal?, so snh cc
s, s dng = v so snh cc k hiu, s dng eq?. Scheme c ba hm so snh hot ng
nh sau :
member s dng php kim tra equal?
memv
s dng php kim tra eqv?
memq
s dng php kim tra eq?
Sau y l nh ngha ca hm member :
(define (memq s L)
(cond
((null? L) #f)
((eq? (car L) s) L)
(else (memq s (cdr L)))))
V d :

84

LP TRNH HM

(memq (b) (a b c (b) d))


--> #f
(member tue (mon tue wed))
--> (tue wed)
(memq a (b c a d e))
--> (a d e)
(memq a (b c d e g))
--> #f
(memq a (b a c a d a))
--> (a c a d a)
(memv 3.4 (1.2 2.3 3.4 4.5))
--> (3.4 4.5)
(memv 3.4 (1.3 2.5 3.7 4.9))
--> #f
(member (b) ((a) (b) (c)))
--> ((b) (c))
(member (d) ((a) (b) (c)))
--> #f
(member b ("a" "b" "c"))
--> (b c)

III.4.2.3. Dng case x l danh sch


Dng case tng t cond nhng thng c dng so snh trn cc danh sch. C
php ca dng case nh sau :
(case s
(L1 body1)
...
[ (else bodyN) ] )
Khi gp case, s-biu thc s c tnh v c hm memv kim tra nu gi tr ca s
thuc danh sch L1. Nu ng, case tr v gi tr ca body1, nu khng, tip tc kim tra
nu gi tr ca s thuc v danh sch L2, v.v...
Tng t cond, cc c th l nhng dy s-biu thc v elle c th vng mt. V d :
(case (* 2 3)
((2 3 5 7 9) prime)
((1 4 6 8 9 11) composite))
--> composite
(case (car (c d))
((a e i o u) vowel)
((w y) semivowel)
(else consonant))
--> consonant

KIU D LIU PHC HP

85

(case (car (c d))


((a) a)
((b) b))
--> khng tr v kt qu g (unspecified)
V d minh ho sau y nh ngha mt hm dch cc i t nhn xng t ting Php qua
ting Anh :
(define (pronoun-traduit pronounF)
(case pronounF
((je) I)
((tu vous) you)
((il) he)
((elle) she)
((nous) we)
((ils) they)
(else pronoun-inconnu)))
(pronoun-traduit vous)
--> you
Cu trc danh sch ca cc ngn ng h Lisp rt tng qut. Do vy n thng c s
dng m hnh ho tt c cc kiu d liu thuc loi k hiu hoc khng.
Gi s cn tnh nghim phng trnh bc hai x2 + 2bx + c = 0 vi h s thc. Vn l
cn tnh bit thc delta = b2 - c. Ta quy c s dng danh sch biu din cc li gii khc
nhau cn c vo gi tr delta :
delta > 0, hai nghim thc phn bit : (real x1 x2)
delta = 0, nghim kp :(double x)
delta < 0, nghim phc : (complex realpart imaginarypart)
Hm tnh nghim phng trnh bc hai nh sau :
(define (trinomialroot b c)
(let ((delta (- (* b b) c)))
(cond ((< 0 delta)
(let ((delta2root (sqrt delta)))
(list real
(+ (- b) delta2root)
(- (- b) delta2root))))
((zero? delta) (list double (- b)))
(else (let ((delta2root (sqrt (- delta))))
(list complex (- b) delta2root))))))
khng ln ln cc tnh ton vi cc kt qu in ra, ta vit th tc solutiondisplay di y s dng case :
(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)))

86

LP TRNH HM

(else (display 2 racines complex conjuguees: )


(display (cadr solution))
(display +/- i )
(display (caddr solution))))
(newline))
; Qua dng mi
(solution-display (trinomialroot 2 2))
--> 2 real roots: -0.585786 and -3.41421
(solution-display (trinomialroot -1 5))
--> 2 racines complex conjuguees: 1 +/- i 2
(solution-display (trinomialroot 1 1))
--> 1 racine reelle double: -1

III.4.2.4. K thut quy x l danh sch phng


Khi vit mt chng trnh nhn danh sch lm tham bin, ngi ta c th s dng php
quy bng cch chuyn php tnh hm v tham bin cdr ca danh sch. Sau y, ta xt
mt s v d n gin i vi cc danh sch phng (ch c cc phn t mc mt).
1. Tnh tng cc phn t ca mt danh sch
Cho Lnb l mt danh sch cc s. Cn xy dng hm ListSum tnh c tng cc phn
t ca Lnb sao cho khi danh sch rng, gi tr tr v l 0 ?
Nu Lnb=(n 1 n2 n j), th n1+n2 + +nj = n 1 + (n 2 + + nj). T :
(ListSum n1 n2 nj) = n1 + (ListSum (n2 + + nj))
(define (ListSum Lnb)
(if (null? Lnb)
0
(+ (car Lnb) (ListSum (cdr Lnb)))))
(ListSum '(1 2 3 4 5))
--> 15
2. Danh sch cc s nguyn t 0 n n
Thm s n vo cui danh sch cc s nguyn :
(0 ... n-1)
ta nhn c danh sch :
(0 ... n-1 n)
thm phn t s vo cui danh sch L, ta xy dng hm append1 sau y :
(define (append1 s L)
(append L (list s)))
Gi iota l hm tr v danh sch cc s nguyn t 0 n n :
(define (iota n)
(if (zero? n)
(0)
(append1 (iota (- n 1)) n)))

KIU D LIU PHC HP

87

(iota 10)
--> (0 1 2 3 4 5 6 7 8 9 10)
3. Nghch o mt danh sch
Do th vin Scheme c hm nghch o mt danh sch ca l reverse :
(reverse (iota 9))
--> (9 8 7 6 5 4 3 2 1 0)
nn ta c th nh ngha mt hm khc nghch o mt danh sch. Nguyn l hot ng
tng t hm iota : nghch o phn cn li ca danh sch v thm vo cui danh sch
phn t u tin. Hm myreverse c nh ngha nh sau :
(define (myreverse L)
(if (null? L)
()
(append1 (myreverse (cdr L)) (car L))))
(myreverse (a (b c d) e)
--> (e (b c d) a)
4. Hm append c hai tham i
Gi s ta khng s dng hm append tin nh m t xy dng mt hm khc nh hm
cons. Hm append2 ghp hai danh sch L1 v L2 tr v mt danh sch nh sau :
(define (append2 L1 L2)
(if (null? L1)
L2 ; Nu danh sch L1 l rng, th kt qu tr v l L2
; Nu L1 (), t car vo u php ghp phn cn li ca L1 vi L2.
(cons (car L1) (append2 (cdr L1) L2))))
(append2 (a b c) ((c d)))
--> (a b c (c d))
Li gi quy ch c tc dng i vi danh sch L1 (lm di gim dn) nhng m
bo tnh dng. Hm append2 khng gi n hm append. V nguyn tc, ngi lp trnh
c th thay i cc hm tin nh trong th vin, nhng gp nguy c khng qun l ht cc
sai st xy ra.
5. Loi b cc phn t khi danh sch
Cho s-biu thc s v danh sch L, cn xy dng hm remove sao cho loi b ht khi L
mi phn t c gi tr s mc mt. Xy ra ba trng hp nh sau :
Nu danh sch rng, th kt qu tr v cng rng.
Nu danh sch bt u bi mt phn t bng s, th ch cn loi b s khi phn cn li
ca danh sch.
Nu danh sch khng bt u bi mt phn t bng s, th bt u bi vic loi b s
khi phn cn li ca danh sch.
Sau y l hm remove :
(define (remove s L)
(cond ((null? L) ())
((equal? s (car L)) (remove s (cdr L)))
(else (cons (car L) (remove s (cdr L))))))

88

LP TRNH HM

(remove a (a b c a d))
--> (b c d)
6. Bi ton tnh tng con
Cho mt s nguyn N v mt danh sch Lnb gm cc s nguyn dng tng dn. Hy tm
mt tp hp cc phn t ca Lnb c tng bng N.
V d, cho N = 21, t danh sch (1 1 3 5 7 10 12 15), ta c th chn cc phn t
(1 1 7 12). Nu danh sch rng th ta quy c tng tr v bng 0. Cn nu danh sch
khc rng th gi s phn t u tin ca danh sch l x0 (l phn t b nht), ta s xt cc
trng hp sau y :
Nu x0 ln hn N th s khng c li gii v kt qu s l #f.
Nu x0 = N th kt qu tr v s l danh sch ch c mi phn t x0.
Nu x0 nh hn N th ta kim tra x0 c thuc vo li gii hay khng. Mun vy, ta gii li
bi ton ny cho cc phn t khc ca danh sch v vi tng by gi l N x0 :
(a) Nu nhn c mt li gii b phn, ch cn thm vo x0.
(b) Ngc li khng c li gii v tip tc i vi cc phn t khc x0.
Sau y l chng trnh :
(define (goodcount N Lnb)
(cond ((null? Lnb) (if (zero? N) () #f))
((< N (car Lnb)) #f)
((= N (car Lnb)) (list N))
(else (let ((partresult
(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. Lp danh sch cc s nguyn t
Cho mt s nguyn n, cn tm cc s nguyn t trong khong 2..n. C nhiu thut ton
tm s nguyn t, sau y l thut ton c s dng sng (sieve) Eratosthnes vit bng ngn
ng mnh lnh :
1. Khi ng tp hp kt qu S cha cc s nguyn t.
2. Xy dng sng sieve cha danh sch cc s 2..n.
3. Repeat
Tm s nguyn t prime.
Thm prime vo tp hp kt qu S.
Loi tr khi sieve cc bi s ca prime l 2*prime, 3*prime...
until sieve = rng
Sau y l chng trnh Scheme :
(define (interval-list m n)
(if (> m n)
()
(cons m (interval-list (+ 1 m) n))))

KIU D LIU PHC HP

89

(define (sieve L)
(define (remove-multiples n L)
(if (null? L)
()
(if (= (modulo (car L) n) 0)
; division test
(remove-multiples n (cdr L))
(cons (car L)
(remove-multiples n (cdr L))))))
(if (null? L)
()
(cons (car L)
(sieve (remove-multiples (car L) (cdr L))))))
(define (primes<= n)
(sieve (interval-list 2 n)))
(primes<= 500)
--> (2 3 5 7 11
71 73 79 83
149 151 157
227 229 233
307 311 313
389 397 401
467 479 487

13 17 19 23 29 31 37 41 43 47 53 59 61 67
89 97 101 103 107 109 113 127 131 137 139
163 167 173 179 181 191 193 197 199 211 223
239 241 251 257 263 269 271 277 281 283 293
317 331 337 347 349 353 359 367 373 379 383
409 419 421 431 433 439 443 449 457 461 463
491 499)

III.4.2.5. K thut quy x l danh sch bt k


Khi chng trnh nhn mt danh sch tng qut lm tham bin, ta c th s dng k thut
quy chuyn php tnh ca hm ang nh ngha i vi tham bin cdr v/hoc car
ca danh sch. Ta tip tc xt mt s v d n gin sau y.
1. Lm phng mt danh sch
Ta cn xy dng mt danh sch mi t danh sch cho m khng cn cc cp ngoc
bn trong nh sau :
(aflatten (a (b c) () ((d)) e))
--> (a b c d e)
Ta c :
(define (aflatten L)
(cond ((null? L) ())
; Nu car ca danh sch cho l mt danh sch, th lm phng n
; ri ghp kt qu vi kt qu lm phng ca cdr.
((list? (car L)) (append (aflatten (car L))
(aflatten (cdr L))))
; Nu car ca danh sch cho khng phi l mt danh sch,
; th thm phn t ny vo u kt qu lm phng ca cdr.
(else (cons (car L) (aflatten (cdr L))))))
2. Tnh tng cc s c mt trong danh sch
Xy ra bn trng hp sau :

90

LP TRNH HM

Nu danh sch cho l rng, th kt qu cng l danh sch rng


Nu car l mt s, th cng s ny vi tng ca tt c cc s ca cdr.
Nu car l mt danh sch khc rng, th tnh tng ca tt c cc s ca car ri cng
kt qu ny vi tng ca tt c cc s ca cdr.
Nu car l mt danh sch rng hoc l mt i tng khc s th ch tnh tng ca tt
c cc s ca cdr.
Sau y l chng trnh :
(define (Listsum* L)
(cond ((null? L) 0)
((number? (car L)) (+ (car L) (Listsum* (cdr L))))
((pair? (car L)) (+ (Listsum* (car L))
(Listsum* (cdr L))))
(else (Listsum* (cdr L)))))
(Listsum* (a (4) 5 ((6 b)) 8))
--> 23
3.

Loi b khi danh sch mt phn t cc mc khc nhau


Cho mt danh sch L v mt biu thc s. Cn loi b khi L cc phn t c gi tr bng s.
Ta xy dng hm remove1 x l 4 trng hp nh sau :
Nu danh sch cho l rng, th kt qu cng l danh sch rng
Nu phn t u tin l s, th loi b n.
Nu phn t u tin l mt danh sch th x l n v phn cn li cdr sau ghp
kt qu li.
Nu phn t u tin khng phi l s, th x l phn cn li cdr.
Chng trnh nh sau :
(define (remove1 s L)
(cond ((null? L) '())
; danh sch rng khng cha s
((equal? s (car L)) ; phn t u tin l s
(remove1 s (cdr L)))
((list? (car L))
; phn t u tin l mt danh sch
(cons (remove1 s (car L)) (remove1 s (cdr L))))
(else (cons (car L )
; phn t u tin khc s
(remove1 s (cdr L))))))
(remove* a (b a ((a) b) c (a) d))
--> (b (() b) c () d)
4.

Nghch o danh sch


Xy dng hm reverse1 nghch omi phn t mi mc ca mt danh sch :
(reverse1 (a (b c d) e)
--> (e (d c b) a)

Trong v d trn, ta nghch o cc phn t ca danh sch con (b c d). Xy ra ba


trng hp nh sau :
Trng hp danh sch rng th kt qu tr v l ().

KIU D LIU PHC HP

91

Nu phn t u tin ca danh sch l mt danh sch, th ta nghch o cc phn t


ca phn cn li cdr ri ghp kt qu ny vi kt qu nghch o ca phn t u
tin car.
Nu phn t u tin khng phi l mt danh sch, th ta nghch o cc phn t ca
cdr ri ghp kt qu ny vi phn t u tin.
Hm reverse1 gi hm append1 thm mt phn t vo cui danh sch :
(define (reverse1 L)
(cond ((null? L) '())
((list? (car L))
(append1 (reverse1 (car L)) (reverse1 (cdr L))))
(else (append1 (car L) (reverse1 (cdr L))))))
(reverse1 '(a b ((e f) g) c (i j) d))
--> '(d (j i) c (g (f e)) b a)
5.

So snh bng nhau

Kiu tru tng ca dng thc so snh bng nhau (equality) c nh ngha nh sau :
=
: number number
boolean
eq?
: symbol any
boolean
hoc :
eq?
: any symbol
boolean
char=?
: character character boolean
string=? : string string
boolean
Sau y l bng so snh bng nhau theo kiu d liu Scheme.
D liu
Kiu s number
Kiu k t character
Kiu chui string
Kiu bt k :
boolean, symbol,
number, character,
empty list, pair,
vector, string,
procedure
Kiu pair, vector,
string

Php so snh
=, <, <=, >, >=
char=?
string=?

eqv?, eq?

equal?

V d
(= 2 2) --> #t
(char=? #\A #\a)
--> #f
(string=? "123" "123")
--> #t
(eqv? #\A #\A)
--> #t
(eqv? 'toto 'toto)
--> #t
(eqv? "123" "123")
--> #t
(equal? "123" "123")
--> #t

V t eqv?, hay eq?, dng so snh cc kiu d liu bt k, kt qu s l #t nu


chng cng mt i tng. Ring kiu d liu danh sch nn s dng v t so snh
string=?.
(eq? 123 123)
--> #t

92

LP TRNH HM

(eq? 123456789012345678901 123456789012345678901)


--> #f
(eq? (1 . 2) (1 . 2))
--> #t
(define (f L) (eq? L L))
(f '(#\a . #\a))
--> #t
Ta c th li nh ngha v t so snh tng qut equal? mt cch n gin hn nh sau :
(define (equal? V1 V2)
(cond
((eq? V1 V2) ; x l cc trng hp boolean, symbol v ()
#t)
((and (number? V1) (number? V2))
(= 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))
(equal? (cdr V1) (cdr V2))))
(else #f)))
; cc i tng c bn cht khc nhau
(equal?
--> #t
(equal?
--> #t
(equal?
--> #t
(equal?
--> #t

#\a #\a)
"123" "123")
'(1 . 2) '(1 . 2))
'(1 2 3 4 5) '(1 2 3 4 5) )

III.4.3. Biu din danh sch


III.4.3.1. Biu din danh sch bi kiu b i
Mt danh sch khc rng l mt b i c bit : chng hn danh sch c mt phn t
(a) chnh l b i (a . ()) c phn t th nht car l a v phn t th hai cdr l
mt danh sch rng. Mt cch tng qut, danh sch :
(s1 s2 ... sn)
c biu din bi kiu d liu b i :
(s1 . (s2 . ( ... (sn . ( ) ) ... )
Nh vy, mt danh sch hoc c th rng, hoc c th l mt b i c cdr li l mt b
i khc. Cc thnh phn ca mt b i cng c th l cc b i. V d :
(define x (cons a b))
(define y (cons x c))

KIU D LIU PHC HP

93

y ; xem ni dung ca y
--> ((a . b ) . c)
Biu din dng cy (v n gin) ca cc b i nh sau :

B i (a . b)

c
a
b
B i ((a . b) . c)

Hnh III.5. Biu din dng cy cc b i.


Ni cch khc, ta m rng nh ngha ca s-biu thc l nhng b i. Ly li gi tr
ca x = (1 . 2) trong v d trn y l mt b i, ta c :
(pair? y)
-> #t
(pair? ()) ; danh sch rng khng phi l mt b i
-> #f
(pair? (a b))
; danh sch khng rng l mt b i
-> #t
Ngha l phn t ca b i c th kiu b i. in ra n gin, mi ln mt cp to
thnh mt danh sch, Scheme hn ch s du chm a ra :
(a
->
(a
->

. (1 2))
(a 1 2)
. (b . (c . d)))
(a b c . d)

Khi mt danh sch c biu din di dng cy hnh ci co (rake), cc phn t ca


ln lt l trng car ca cc b i, trng cdr l danh sch rng cui cng.

s1
s2
sN

( )

Hnh III.6. Biu din danh sch bi cc b i.


Cc b i c th c tip cn bi nhiu con tr (mi tn) khc nhau. Chng hn, b i
tr bi C trong v d sau y cng c tr bi mt phn t ca b i mi c xy dng
(l 5 v C) do con tr D tr ti :
(define C (cons 1 2))
(define D (cons 3 C))
D ; xem ni dung ca D
--> (3 1 . 2)
Nu xy ra t bin gi tr ca b i tr bi C th cng dn n s t bin d liu tr bi D :

94

LP TRNH HM

(set-car! C 5)
D ; xem ni dung ca D
--> (3 5 . 2)
C
D
1

Hnh III.7. Nhiu mi tn cng biu din mt con tr.


Ta c th lm thay i bt k i tng no c xy dng t kiu d liu b i : mt
danh sch, mt cy, v.v... Trong cc ng dng ca lp trnh hm, ngi ta thng s dng b
i m hnh ho cc i tng c trng thi thay i theo thi gian.
C
D
2

5
Hnh III.8. t bin ca C cng l t bin ca D.
Ngi ta cng c th tit kim c nhiu b nh bng cch biu din mi b i trong
mt n v nh. Sau y ta xt mt v d v kh nng xy ra hiu ng ph khi thc hin cc
php t bin trn cc danh sch.
(define X (list 1 2 3 4))
(define Y (cdr X))
; X v Y c cng danh sch con (2 3 4)
(set-car! X 5) ; thay i X m khng nh hng n Y
X
--> (5 2 3 4)
Y
--> (2 3 4)
X
Y
1
2

3
6

( )
4

Hnh III.9. t bin gy ra hiu ng ph.


(set-car! Y 6) ; t bin gy ra hiu ng ph i vi X
X
--> (5 6 3 4)

KIU D LIU PHC HP

95

Y
--> (6 3 4)
Tuy nhin, sau khi gn li phn cdr ca X cho mt danh sch mi, th con tr Y vn tr
v danh sch c, kng thay i :
(set-cdr! X (list 7 8)) ;X v Y c lp (khng chung nhau b i no)
X
--> (5 7 8)
Y
--> (6 3 4)
S dng hm t bin set-cdr!, ta c th to ra cc danh sch ni vng quanh vi
nhau nh sau :
(define X (list 1))
X
--> (1)
(set-cdr! X X)
(car X)
--> 1
X
--> 1 1 1 1 1 ... 1 1 1 ... ; v hn ln !
Cc hm append, reverse, map (s xt chng sau), ... thng ri vo trng thi
qun nu mt trong cc tham i l mt danh sch ni vng.

X
( )
1
Hnh III.10. t bin to danh sch ni vng c th gy ra qun v hn.
Sau y ta xt mt v d s dng t bin ghp danh sch. Gi s cho hai danh sch
L1 v L2, ta cn ghp chng nhn c mt danh sch mi. Gi |L1| l di (length)
ca danh sch L1, ta c hai gii php, mt gii php khng s dng t bin, nh sau :
Cch 1 : to ra |L1|| b i
; concat : List(T) List(T) List(T)
(define (concat L1 L2)
(if (null? L1)
L2
(cons (car L1) (concat (cdr L1) L2))))
(concat '(1 2) '(3 4 5))
--> (1 2 3 4 5)
Cch 2 : s dng t bin.
Gi s n gin, L1 khc rng v kt qu khng to ra b i mi. Nh t bin, b
i cui cng ca L1 tr ti L2.

96

LP TRNH HM

; concat! : List(T) List(T) List(T)


(define (concat! L1 L2)
(define (last-doublet L) ; tr v b i cui cng ca L l null
(if (null? (cdr L))
L
(last-doublet (cdr L))))
(set-cdr! (last-doublet L1) L2))
(define x (1 2 3))
(define y (4 5))
(concat! x y)
x
--> (1 2 3 4 5)
y
--> (4 5)

III.4.3.2. Danh sch kt hp


1. Khi nim danh sch kt hp
Cc b i thng c dng nh ngha danh sch kt hp (association list), vit tt
l alist. l mt danh sch gm cc phn t c dng b i ng nht nh sau :
((c1 . v1)... (cn . vn)
Cc alist thng c dng biu din cc cu trc d liu nh bng (table), t in
(dictionary), cc hm, v v... Khi mun kt hp mt kha cj vi mt gi tr vj, ngi ta vit
(cj . vj) to ra mt phn t ca danh sch kt hp. Th vin Scheme c hm assq :
(assq s alist)
s dng php so snh eq? tr v phn t u tin ca danh sch kt hp alist tho mn
iu kin c car l kha s. Nu khng tm thy kho no nh vy, gi tr tr v l #f :
(assq a ((b . 2) (a . 1) (c . 3) (a . 0)))
--> (a . 1)
Mt danh sch l mt trng hp c bit ca b i nn kt qu tr v c th l mt
phn t khng phi b i :
(assq a ((b . 2) (a 1) (c 3) (a . 0)))
--> (a 1)
Do assq s dng eq? nn c th php so snh khng thnh cng :
(assq (a) ((b . 2) (a . 1) (c . 3) ((a) . 0)))
--> #f
so snh nh vy, Scheme cn c hm tng t l assv s dng php so snh eqv?
v assoc s dng cc php so snh equal? :
(assv (a) ((b . 2) (a . 1) (c . 3) ((a) . 0)))
--> #f
(assoc (a) ((b . 2) (a . 1) (c . 3) ((a) . 0)))
--> ((a) . 0)

KIU D LIU PHC HP

97

Ch rng cc hm memq, memv, member, assq, assv, v assoc u khng c du


chm hi (?) pha sau tn v chng tr v khng ch cc gi tr kiu boolean #f v #t m cn
tr v cc gi tr kiu khc ca Scheme.
Sau y l mt s v d khc s dng cc hm assq, assv, v assoc tm kim trn
danh sch :
(define e ((a 1) (b 2) (c 3)))
(assq a e)
--> (a 1)
(assq 'b e)
--> (b 2)
(assq 'd e)
--> #f
(assq (list a)(((a)) ((b)) ((c))))
--> #f
(assoc (list a) (((a)) ((b)) ((c))))
--> ((a))
(assq 5 ((2 3) (5 7) (11 13)))
--> (5 7)
(assv 5 ((2 3) (5 7) (11 13)))
--> (5 7)

2. S dng danh sch kt hp


Do assq tr v mt b i, ta xy dng hm valof tm gi tr kt hp (l cdr) vi
kha cn tm (l car) :
(define (valof key alist)
(let ((doublet (assq key alist)))
(if doublet
(cdr doublet)
#f)))
(define L
((pluto . 9) (jerry . 8) (mickey . 10) (pony . 7)
(tom . 8)))
(valof tom L)
--> 8
(valof iago L)
-->#f
Xy dng hm delkey xa b ht cc b i c kho cho trong mt danh sch kt
hp :
(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))

98

LP TRNH HM

(delkey d ((a . 1) (b . 2) (c . 3) (b . 4)))


--> ((a . 1) (b . 2) (c . 3) (b . 4)))
Sau y ta xy dng hm sublis nhn vo hai tham i alist v s thay th cc
xut hin trong biu thc s l kha car trong mi phn t ca alist bi gi tr tng ng :
(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 vo danh sch kt hp mt phn t mi, ta xy dng hm acons(s1 s2
alist) tr v kt qu l danh sch alist c thm vo u mt b i c xy
dng 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. Dng quasiquote


Ngoi dng vit tt (quotation mark) ca php trch dn quote, trong Scheme cn c
dng vit tt ` (grave accent) ca php quasiquote (tm dch tng t trch dn).
(quasiquote s)
--> s
s
--> s
`(a b)
--> (a b)
S khc nhau gia quote v quasiquote lin quan n cc phn t c t du phy
trc trong mt danh sch : nhng phn t c du phy t trc nh vy c tnh ton do
khng cn b trch dn na (unquote).
V d :
(define x 9999)
(define y (a b c))
`(x y ,x ,y)
; ch du phy t trc x v y
--> (x y 9999 (a b c))
Tuy nhin vn c th dng list c cng kt qu nh vy :

KIU D LIU PHC HP

99

(list x y x y)
--> (x y 9999 (a b c))
Nh vy, dng trch dn quote cho s-biu thc khi khng cn tnh gi tr cc thnh phn
ca n, cn khi cn tnh gi tr, cn t mt du phy trc nhng thnh phn ca s-biu thc
cn tnh. Ngha l :
s = `s nu khng tn ti cc du phy trong s.
s `s nu tn ti cc phn t c du phy t trc c tnh trong s.
Chng hn :
`(x y)
--> (x y)
(,a)
--> ((unquote a))
Gi s ta mun tr v gi tr trch dn quote ca mt s-biu thc s, ta vit :
(list quote y)
--> (a b c)
hoc vit gn hn :
`,y
; 3 du lin tip trc y
--> (a b c)
Ta c th vit hm kwote thc hin vic trn nh sau :
(define (kwote s)
`,s)
(kwote y)
--> (a b c)
Trong Scheme cn s dng hai k t lin tip ,@ (du phy ri du commercial at) t
trc mt s phn t trong mt s-biu thc c quasiquote. Khi mt phn t c hai du ny
ng trc, n c tnh gi tr nhng gi tr phn t ny phi l mt danh sch v ni dung
ca danh sch kt qu s thay th n.
`(x y ,x ,@y)
--> (x y 9999 a b c)
K t @ tng trng cho ch a trong append v ta c th nhn c cng mt kt qu
nh append :
(append `(x y ,x) y)
--> (x y 9999 a b c)
K thut ny thng c dng khi cn to sinh cc biu thc hm.

III.4.4. Mt s v d ng dng danh sch


1. Tm phn t cui cng ca danh sch
Xy dng hm tr v phn t cui cng ca mt danh sch, tr v #f nu danh sch rng.
; Cch th nht
(define (last1 L)
; hoc (define last (lambda (L) )

100

LP TRNH HM

(cond ((null? L) #f) ; danh sch rng


; danh sch ch c mt phn t duy nht
((null? (cdr L)) (car L))
(else (last1 (cdr L)))))
(last1 '(1 2 3 -5 -6 0 7 a))
--> a
(last1 '())
--> #f
; Cch th hai : s dng cc hm c sn list-ref v length
; ly phn t cui cng nu danh sch khc rng
(define (last2 L)
(if (null? L)
#f
(list-ref L (- (length L) 1))))
(last2 '(1 2 3 -5 -6 0 7 8))
--> 8

2. Lit k cc v tr mt k hiu c trong danh sch


; Cch th nht : s dng s lp v hm reverse
; V tr cc phn t c tnh t 0 tr i
(define (listocc1 s L)
(define (ilo s L i R)
(cond ((null? L) R)
((equal? (car L) s)
(ilo s (cdr L) (+ i 1) (cons i R)))
(else (ilo s (cdr L) (+ i 1) R))))
(reverse (ilo s L 0 '())))
(listocc1 'a '(1 a 3 a 5 a 7 a))
--> (1 3 5 7)
; Cch th hai : s dng s lp v hm append
(define (listocc2 s L)
(define (ilo s L i R)
(cond ((null? L) R)
((equal? (car L) s)
(ilo s (cdr L) (+ i 1)
(append R (list i))))
(else (ilo s (cdr L) (+ i 1) R))))
(ilo s L 0 '()))
(listocc2 'a '(1 0 a 3 a 5 a 7 2 1 a))
--> (2 4 6 10)

3. Tm tng con ln nht trong mt vector


Cho mt danh sch L gm N s thc, cn tm tng ln nht trong tt c cc tng ca cc
danh sch con ca L (gi tt l tng con ln nht). Chng hn danh sch :
L = (18 -20 35 12 28 -5 -42 30 -50 45)

KIU D LIU PHC HP

101

c tng con ln nht l 75 tng ng vi danh sch con (35 12 28)


Bi ton ny xut hin trong th tc so mu hai chiu x l nh s do Ulf Grenander,
Brown University, xut nm 1977 : cho trc ma trn NN s thc, cn tm ma trn con
c tng ln nht trong tt c cc ma trn con c th.
V phc tp tnh ton qu ln, bi ton c a v bi ton mt chiu. Tuy nhin, bi
ton mt chiu ch t ra n gin khi mi phn t l s dng, khi kt qu chnh l danh
sch cho. Nu mi phn t l s m th kt qu l 0, tng ng vi danh sch rng. Nhng
khi danh sch c c s m v s dng tu , bi ton li tr nn rt phc tp. c nhiu li
gii cho bi ton ny :
Thut ton lp phng vi chi ph O(N3).
2
Thut ton bnh phng vi chi ph O(N ).
Thut ton quy chia tr do M. Shamos xut vi chi ph O(NlogN).
Thut ton qut (tt nht) do Jay Kadane xut vi chi ph tuyn tnh O(N).
tng ca thut ton qut nh sau : tm tng con ln nht ca danh sch L[1..i],
i=1..N, gi thit rng c kt qu ( x l) cho L[1..i-1], l MaxSoFar. Khi , tng con
ln nht ca L[1..i], hoc l MaxSoFar, hoc l tng con ln nht kt thc ti i, gi l
MaxEndingHere (phn gch gch trong hnh v sau y).

MaxSoFar

MaxEndingHere

Hnh III.11. Thut ton qut tm tng con ln nht.


Thut ton qut c vit bng gi ng phng Pascal nh sau :
MaxSoFar := MaxEndingHere := 0
for i := 1 to N do begin
MaxEndingHere max(MaxEndingHere+L[i], 0)
MaxSoFar max(MaxSoFar, MaxEndingHere)
end
Sau y l th tc Scheme tm tng con ln nht ca danh sch s dng php lp :
(define (maxsumlist L)
(define (msl-it L Ms Me)
(if (null? L)
Ms
(let ((m (max (+ Me (car L)) 0)))
(msl-it (cdr L) (max m Ms) m))))
(msl-it L 0 0))
(maxsumlist '(18 -20 35 12 28 -5 -42 30 -50 45))
--> 75

4. Bi ton sp xp dy vin bi ba mu
Bi ton sp xp dy cc vin bi ba mu, hay cn c gi l bi ton c ba mu (drapeau
franais) c pht biu nh sau : Cho trc mt dy cc vin bi nh s t 1 n N, mi
vin bi mang mt mu hoc xanh, hoc trng, hoc . Cn sp xp li cc vin bi theo th t

102

LP TRNH HM

ln lt xanh, n trng, ri n sao cho ch c hon v (i ch cc vin bi) ngay trn


dy cho, hn na, cc hon v phi cng t cng tt.
gii bi ton ny, ta a vo cc v t B (blue), W (white) v R (red) vi quy c B(i),
W(i) v R(i) l ng nu v ch nu vin bi th i (1 i N) l xanh, trng v tng ng.
Ta cng s dng th tc hon v permute(i, j) t vin bi th i thnh j, vin bi th j thnh i,
i, j 1..N, khng loi tr trng hp i = j.
1

bi xanh

bi trng

bi

Vng
cha x l
Hnh III.12. Bi ton sp xp dy cc vin bi ba mu.
S dng 3 ch s b, w v r phn cch 4 vng ca mng (xem hnh), thut ton sp xp
cc vin bi l x l vng cha c sp xp X :
w:= 1; b := 1; r := n;
while w <= r do
if W(w) then w:= w+1 elsif B(w) then begin
permute(b, w); b:= b+1; w:= w+1
end else begin while (R(r) and w < r) then r:= r-1;
permute(r, w); r:= r-1
end
Th tc Scheme sp xp dy cc vin bi ba mu s dng php lp :
(define (threecolor L)
(define (blue? x) (if (equal? 'b x) #t #f))
(define (white? x) (if (equal? 'w x) #t #f))
(define (red? x)
(if (equal? 'r x) #t #f))
(define (threecolor_itr L b w r)
(if (null? L)
(append b w r)
(let ((x (car L)) (y (cdr L)))
(cond
((blue? x)
(threecolor_itr y (cons x b) w r))
((white? x)
(threecolor_itr y b (cons x w) r))
(else
(threecolor_itr y b w (cons x r)))))))
(threecolor_itr L '() '() '()))
(threecolor '(b w w r b r b r w w r b b w))
--> '(b b b b b w w w w w r r r r)

5. Sp xp nhanh quicksort
Trong chng 1, ta xy dng thut ton quicksort sp xp nhanh cc phn t ca mt
danh sch theo th t khng gim vit bng Miranda. Sau y ta s minh ho bng Scheme.

KIU D LIU PHC HP

103

u tin, ta xy dng hm phn chia partition cho php chuyn mt danh sch thnh
mt danh sch khc (theo th t ngc li) m phn t u ca n l danh sch con cha cc
gi tr nh hn hoc bng phn t trc pivot cho, danh sch con cn li cha cc gi tr
ln hn phn t trc. Hm c s dng hai danh sch mi lc u c hai u rng.
(define (partition L pivot Linf Lsup)
(cond ((null? L) (cons Linf Lsup))
((< (car L) pivot)
(partition
(cdr L) pivot (cons (car L) Linf) Lsup))
(else (partition
(cdr L) pivot Linf (cons (car L) Lsup)))))
(partition (6 4 7 8 5 9 2 3) 7 () ())
--> ((3 2 5 4 6) 9 8 7)
By gi xy dng hm quicksort gi quy vic chn phn t trc l phn t u
danh sch p dng hm phn chia, cc danh sch kt qu v phn t trc c rp li vi
nhau v tr v kt qu l danh sch c sp xp.
(define (quicksort L)
(if (or (null? L) (null? (cdr L)))
L
(let* ((pivot (car L))
(L1-L2
(partition (cdr L) pivot () ()))
(L1 (car L1-L2))
(L2 (cdr L1-L2)))
(append (quicksort L1)
(cons pivot (quicksort L2))))))
(quicksort (7 6 4 7 8 5 9 2 3))
--> (2 3 4 5 6 7 7 8 9)

Tm tt chng 3

Kiu d liu phc hp trong Scheme gm kiu chui, kiu vect, kiu b i, kiu
danh sch, kiu d liu th tc v kiu d liu cng.
Tt c cc kiu d liu ca Scheme u c gi l kiu s-biu thc.

C tt c 9 kiu d liu c gi l i tng ca Scheme :

Tn kiu
S
K t
Lgic
K hiu
B i
Chui
Vect
Th tc
Cng

V d
V t kim tra kiu
9
number?
char?
#\a ou #\space
boolean?
#t hoc #f
chip
symbol?
( 5 . 7 )
pair?
"Tom and Jerry"
string?
#( 5 3 12 Mickey 32 ) vector?
procedure?
----port?

104

LP TRNH HM

Trong Scheme cng nh trong ngn ng lp trnh hng i tng, ngi ta c th s


dng kiu d liu tru tng nh ngha cc cu trc d liu phc tp.

Mt kiu d liu tru tng gm 4 thnh phn : tn kiu, cc nh ngha hm, cc iu


kin u nu c v cc tin . Hai thnh phn u m t c php v mt cu trc
thuc tnh ca kiu d liu tru tng, hai thnh phn sau m t ng ngha.

Scheme s dng kiu d liu b i tng t bn ghi gm mt cp phn t no c


th t. Phn t th nht c gi l car, phn t th hai cdr.C mt du chm
phn cch hai gi tr phn t.

Kiu d liu b i c s dng xy dng kiu danh sch : mt danh sch hoc c
th rng, hoc c th l mt b i c cdr li l mt b i khc. Cc thnh phn ca
mt b i cng c th l cc b i.

Kiu danh sch c s dng ph bin trong Scheme. Mt danh sch c xem l mt
cu trc gm hai thnh phn : phn t u v phn danh sch cn li.

Khi x l mt danh sch, ngi ta x l phn t u, sau s dng php quy


x l phn danh sch cn li.

Bi tp chng 3
1. Gii thch cc biu thc sau y, sau tnh gi tr v so snh kt qu :
(cons 1 2)
(car (cons (cons 1 2) (cons 3 4)))
(cons (cons (cons (cons 1 2) 3) 4) 5)
(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 ())))))
(list 1 2 3 4 5)
(car (list 1 2 3 4 5))
(cdr (list 1 2 3 4 5))
(cadr (list 1 2 3 4 5))
(caddr (list 1 2 3 4 5))

2. Vit hm to cc danh sch sau :


(a b c d)
(a ((b c) d (e f)))
(a (b (c d) . e) (f g) . h)
3. Cho bit nhng biu thc no c cng kt qu trong s cc biu thc sau y :
(list 1 (2 3 4))
(append (1) (2 3 4))
(list 1 2 3 4)
(cons 1 (2 3 4))
(cons (1) (2 3 4))
(cons 1 ((2 3 4)))
(append (1) ((2 3 4)))
4. Cho bit gi tr ca cc biu thc sau :
(+ 4 7)
(a b)
5
(cons a ((b c)))

KIU D LIU PHC HP

105

(cdr (a))
(cdr week-list)
(car ((+ 4 1)))
(cdr ((+ 4 1)))
(cdr ((a) b))
(cdr ((a) (b)))
(cdr (a b))
5. Cho bit cc danh sch tng ng vi cc s sau :

a
a

b
d

1)

2)

6. T hm member, hy nh ngha v t member?.


7. nh ngha mt hm ph ht cc ngoc trong mt danh sch.
Chng hn, i vi danh sch ((a b c) (d (e f) g) h (i j))
th hm tr v : (a b c d e f g h i j)
8. Hm concat sau y dng ghp hai danh sch tng t append :
(define (concat list1 list2)
(define (iter response remaining)
(if (null? remaining)
(reverse response)
(iter (cons (car remaining) response)
(cdr remaining))))
(iter list2 list1))
Tuy nhin hm khng tr v kt qu ng, hy vit li cho ph hp, sao cho :
(concat (1 2 3 4 5) (6 7 8 9))
--> (1 2 3 4 5 6 7 8 9)
9. Vit biu thc trch danh sch tr v kt qu l danh sch con (sat, sun) :
(mon tue wed thu fri sat sun).
10. Vit cc hm tr v phn t th hai, th ba v th t ca mt danh sch.
11. Vit dng t hp ca car v cdr nhn c gi tr l k hiu a t cc danh sch :
((b a) (c d)), (() (a d)), (((a)))
12. Cho bit gi tr ca (car a) v (cdr a) (ch hai du quote).
13. Vit nh ngha tng t nh ngha ca kiu list cho kiu plate-list.
14. Vit hm (count s L) m s lng k hiu s l ch ci xut hin trong danh sch
ch ci L. V d :
(count R (T O M A N D J E R R Y))
--> 2
15. Vit hm (double L) nhn vo mt danh sch cc k hiu L tr v danh sch m
cc k hiu c vit lp li. V d :

106

LP TRNH HM

(double (TOM AND JERRY))


--> (TOM TOM AND AND JERRY JERRY)
16. Vit hm (undouble L) nhn vo mt danh sch cc k hiu L trong cc k hiu
u b vit lp li tr v danh sch ch cha mi k hiu mt ln. V d :
(undouble (double (TOM AND JERRY)))
--> (TOM AND JERRY)
17. T v d x l hnh ch nht trnh by trong l thuyt, vit v t disjoint? tr v #t
nu hai hnh ch nht ri nhau, ngha l khng c im no chung.
18. Xy dng cc hm x l hnh ch nht s dng biu din cc thnh phn bi danh sch.
19. Cho bit gi tr cc biu thc dng quasiquode sau y :
`(1 + 2 = ,(+ 1 2))
`(the car of the list (a b) is ,(car (a b)))
`(cons ,(+ 2 5) ,(list a b))
(let ((L (1 2 3)))
`((+ ,@L) = ,(+ 1 2 3)))
20. Dng kiu b i (pair-doublet) biu din s phc (a + bi). Hy tnh cng, nhn v lu
tha bc n nguyn dng ca mt s phc. Cho bit :
Cng:

(a + bi) (c + di) = (a c) + (b d)i

Tr :

(a + bi) (c + di) = (a c) + (b d)i

Nhn :

(a + bi) (c + di) = (ac bd) + (ad bc)i

Chia :

(a + bi)
(ac + bd)
(bc ad)
=
+
i , vi iu kin c2 + d2 0.
2
2
(c + di)
(c + d )
(c2 + d2 )

Lu tha :

(a + bi)n = rn(cosn + isinn ), trong :


r=

a2 + b2 ,

b
a
trong :

= arctg

Cn bc hai : a + bi = x + yi ,

x=

a
+
2

a
b
+ , y=
2
2

Nu a > 0, tnh x v lc , y =

a
+
2

a
b
+
2
2

b
b
x , nu a < 0, tnh y v lc , x = y .
2
2

CHNG IV. K THUT X L HM


hng ny s trnh by chi tit hn mt s k thut s dng v x l hm nh : dng tn
hm lm tham i, dng hm lm gi tr tr v ca mt hm khc, nh ngha hm nh
php tnh lambda, tham i ho tng phn, k thut lp trnh nh trao i thng ip gia
cc hm, k thut quy cc b, phng php t hp cc hm, nh ngha cc hm c s
lng tham i bt k, v.v

IV.1

S dng hm

Cho n lc ny, ta s dng define nh ngha bin v hm Scheme nh sau :


(define v s)
trong : v (variable) l mt bin
s l mt biu thc
(define (f L) s)
trong : L dy t 0.. n bin,
f l tn hm hay tn bin,
s l biu thc ng vai tr thn ca hm
Mt hm trong Scheme c xem nh mt kiu d liu hay mt s-biu thc, do , hm
c th c dng lm tham i v cng c th lm gi tr tr v. Ta s xt ln lt hai kh
nng ny v mt cch khc nh ngha hm nh php tnh lambda (-calculus).

IV.1.1. Dng tn hm lm tham i


Gi s ta nh ngha mt hm tu nh sau :
(define (f x) (list x x))
(f a)
--> (a a)
By gi ta nh ngha hm g qua f nh sau :
(define g f)
Nu ta gi hm g nh l mt bin th s gy ra li sai :

107

108

LP TRNH HM

g
--> ERROR: #{Procedure 6703 f} (bo li trong Scheme48)
Hm g phi c gi tng t hm f c cng kt qu :
(g a)
--> (a a)
Gi s ta nh ngha li hm car bi mt tn khc nh sau :
(define first car)
first
--> ERROR: #<primitive-procedure car>
; sai v first l hm, khng phi bin
(first (list 1 2 3))
--> 1
Nh vy, nu mt hm c mt tham i f1 no c nh ngha trc , th mi
nh ngha dng :
(define (f2 x) (f1 x))
u c th vit ngn gn thnh :
(define f2 f1)
Ta c th m rng cho cc hm nhiu tham i :
(define (g2 x y z) (g1 x y z))
(define (g1 x y z) (+ x y z))
(procedure? g2) ; g2 l mt hm
--> #t
(g2 (+ 1 2) 4 5)
--> 12
Trong kiu d liu tru tng, hai li gi thc hin (* 2 2) v (* 3 3) ca dng
hm nhn (* num num) c ngun gc t khai bo hm :
* : number number number
t ta c nh ngha hm square :
(define (square x) (* x x))
Gi s ta cn xy dng hm sum-integer tnh tng cc s nguyn v hm sumsquare tnh tng cc bnh phng cc s nguyn gia hai s nguyn a v b cho. Ta c :
; Integer Integer Integer
(define (sum-integer a b)
(if (> a b)
0
(+ a (sum-integer (+ a 1) b)))
; Integer Integer Integer
(define (sum-square a b)
(if (> a b)
0
(+ (square a) (sum-square (+ a 1) b))))

K THUT X L HM

109

C hai hm trn u c cng mt giuc l :


(define (sum-any a b)
(if (> a b)
0
(+ (func a) (sum-any (+ a 1) b))))
Ta c th xem hm sum-any s dng func nh l tham i hnh thc ca hm. T
ta c th nh ngha li hm ny nhng c 3 tham i nh sau :
(define (sum-any func a b)
; (Integer Integer) Integer Integer Integer
(if (> a b)
0
(+ (func a) (sum-any func (+ a 1) b))))
(sum-any square 9 16)
--> 1292
(sum-any sqrt 16 25)
--> 45.1646
Do func l mt hm bt k nn ta c th m rng hm sum-any thc hin php
cng cc s thc, c dng tng qut hn nh sau :
(number number) integer integer number
(sum-any sqrt 1.2 4.5) ; tnh tng cc cn bc hai cc s nguyn
--> 6.41693
Hm sum-any cho php nh ngha cc hm ring bit bng cch thm mt nh ngha
hm thc hin chc nng ca func khng s dng func nh l tham i na :
(define (sum-square a b)
(define (square x) (* x x)) ; nh ngha hm func= square
(sum-any square a b))
(sum-square 4 9)
--> 271
(define (sum-integer a b)
(define (id x) x)
; nh ngha hm func= id
(sum-any id a b))
(sum-integer 4 9)
--> 39
(define (sum-sqrt a b)
(sum-any sqrt a b))
(sum-sqrt 4 9)
--> 15.1597
(sum-any sqrt 4 9)
--> 15.1597
Sau y l mt v d khc s dng k thut dng tn hm lm tham i. Gi s ta cn tnh
o hm f ca mt hm f ti mt im x theo cng thc :

f '( x) = lim

dx0

f ( x + dx) - f ( x)
dx

110

LP TRNH HM

S gia dx phi tng i nh sao cho c lng l ng. Hm tnh o hm c nh


ngha nh sau :
; derivative: (number number) = number number number
(define (derivative f x dx)
(/ (- (f (+ x dx)) (f x)) dx))
Trong nh ngha hm derivative, ta s dng tn hm tnh ton mt cch hnh
thc, ch khi c li gi, tn hm mi c nhn hm c th. Tn hm xut hin nh l mt
trong 3 tham i :
(derivative sqrt 5 .00001)
--> 0.223607
(define (cube x) (* x x x))
(derivative cube 5 .00001)
--> 75.0001

IV.1.2. p dng hm cho cc phn t ca danh sch


Gi s cn xy dng hm c cc tham i l kt qu p dng mt hm f no ln cc
phn t xi ca danh sch :
(x1, ... , xn)
tr v gi tr l mt danh sch :
(f(x1) ... f(xn))
ta c th nh ngha hm mapto nh sau :
(define (mapto f L)
(if (null? L)
()
(cons (f (car L))
(mapto f (cdr L)))))
(mapto odd? (4 1 8 5 0 -5 ))
> (#f #t #f #t #f #t)
Th vin Scheme c cc hm map, for-each, apply nhn tham i l kt qu p
dng mt hm no cho cc phn t ca danh sch.
C php hm map nh sau :
; map : (T1T2 ...Tn T)List(T1) ...List(Tn) List(T)
(map f L1 L2 ... )
Hm map a ra li gi p dng mt hm f, hay mt php ton, cho mi phn t ln lt
l ca cc danh sch L1, L2, ... , sau tr v mt danh sch ca tt c cc kt qu. V d :
(map cadr ((a b) (d e) (g h)))
--> (b e h)
(map square (list 1 2 3 4)) ; square tnh bnh phng mt s
--> (1 4 9 16)
(map list (list 1 2 3 4))
--> ((1) (2) (3) (4))

K THUT X L HM

111

(map + (list 1 2 3 4) (list 4 5 6))


--> (5 7 9)
(map append (list) (list))
--> ()
(map cons (1 2 3) (10 20 30))
--> ((1 . 10) (2 . 20) (3 . 30))
(map + '(1 2 3) '(10 20 30))
--> (11 22 33)
Ch rng mt s dng c bit khng th s dng nh hm lm tham i f ca map,
chng hn :
(map or (#f #t #f) (#t #f #t))
--> ERROR
Mun s dng nhng dng c bit nh vy cn s dng biu thc lambda (s xt trong
mc tip theo) :
(map (lambda (x y) (or x y))
(#f #t #f) (#t #f #f))
--> (#t #t #f)
C php ca for-each nh sau :
(for-each f L1 L2 ... )
Hm for-each thc hin tng t map, p dng hm f ln lt cho mi phn t trong
cc danh sch nhng ch khi xy ra hiu ng ph (side-effects).
(for-each display
(list one two buckle my shoe))
--> one two buckle my shoe
C php hm apply :
(apply f L1 L2 ... )
Hm apply ca Scheme cho php p dng mt hm cho mt danh sch cc tham i
(ch tham i u tin phi c vit tch ring) :
(apply + (2 3 5))
--> 10
(apply * 2 (3 5))
--> 30
(apply * (2 3 5))
--> 30
S dng th tc lp map c th tc ng xung cc mc su hn ca mt danh sch.
Chng hn ta cn tnh su ca mt s-biu thc c dng danh sch, ta xy dng hm
depth hot ng nh sau : nu danh sch khc rng, cng 1 vo su ti a ca mi phn
t ca danh sch.
(define (depth s)
(cond ; kiu nguyn t c su 0
((atom? s) 0)
; danh sch phng c su 1
((null? s) 1)
; x l danh sch khc rng

112

LP TRNH HM

(else (+ 1
(apply max (map depth s))))))
(depth a)
> 0
(depth (a))
> 1
(depth (a (b c) ((d (e))) yes ()))
> 4

IV.1.3. Kt qu tr v l hm
Trong Scheme, hm c th c dng nh gi tr kt qu tr v ca mt hm khc. Chng
hn hm tnh o hm f ca mt hm f no va c nh ngha trn y c sa li ch
cn 2 tham i, gm tn hm cn tnh o hm f v s gia dx. Sau khi thc hin, hm tr v
mt hm khc ch tham i th ba, l x :
;derivative: (number number) number (number number)
(define (derivative f dx)
(define (estimation-derivative x)
(/ (- (f (+ x dx)) (f x)) dx))
estimation-derivative) ; ch tham i x mi thc hin tip
(define cube-prime (derivative cube .001))
(cube-prime 5)
--> 75.0150010000254
Tuy nhin ta c th gi trc tip :
((derivative cube .001) 5)
--> 75.0150010000254
Ch rng trong li gi trn, hm derivative c thc hin tr v hm ch
estimation-derivative mt cch d dang. Ch khi c tham i x, n mi thc
hin trn vn. Mt cch tng qut, khi c mt li gi :
(f arg1 ... argn)
th hm f cn c thc hin, f c th l mt dng hm (hay mt th tc) cn tnh ton tr
v mt hm khng cha tham i. Mt hm khng cha tham i c th dng ghi nh mt
php tnh cha thc hin ngay, m ch i sau tu theo yu cu c th gi s dng bng
cch cung cp tham i thc s. Ngi ta gi y l li ha tnh ton (evaluation promise).
Chng hn f l dng hm :
((if (= 1 2) + -) 3 4)
--> -1
((if #t + -) 3 4)
--> 7
y, dng hm (if e1 e2 e3) kim tra biu thc iu kin e1 tr v e2
(tng ng vi php ton + theo ) hoc tr v e3 (tng ng vi php ton ). Gi s
ta cn xy dng hm increment mt tham i x, tr v mt hm gia thm mt lng
vo x nh sau :
; increment: (number number) (number number)

K THUT X L HM

113

(define (increment x)
(define (inc y)
(+ x y))
inc) ; tr v tn hm ch tham bin th hai
((increment -7) 2)
--> -5
((increment 7) -2)
--> 5
Trong hai li gi trn, x ln lt ly cc gi tr 2 v 2, cn y ly 7 v 7.

IV.2

Php tnh lambda

IV.2.1. Gii thiu php tnh lambda


Php tnh lambda (-calculus) do A. Church xut v pht trin vo nhng nm 1930
ca th k trc. Php tnh lambda l mt h thng quy tc nhng c kh nng biu din, cho
php m ho tt c cc hm quy (recursive functions). Php tnh lambda xem mt hm nh
l mt phng php tnh ton, khc vi tip cn truyn thng ca ton hc xem mt hm l
mt tp hp cc im c mi quan h vi nhau. Cng vi l thuyt my Turing, php tnh
lambda l m hnh tnh ton thc hin tnh ton trn lp cc hm tnh c (calculable
functions).
C hai cch tip cn trong php tnh lambda : tip cn thun tu (pure) dng nghin
cu cc chin lc tnh hm v tip cn c nh kiu (typed) dng nh kiu cc biu thc.
Mi cch tip cn u c th dng biu din cch tip cn kia.
V mt c php, php tnh lambda s dng mt tp hp Var gm cc bin : x, y, z, ..., mt
php tru tng k hiu v mt p dng (application) nh ngha cc hng (term).
Ngi ta gi t l mt hng nu :

t = x, vi xVar l mt bin,
t = x.M, vi xVar l mt bin, M l mt hng , c gi l mt tru tng,
t = (M N) vi M v N l cc hng , c gi l mt p dng.

V d sau y l cc hng hay biu thc :


(x x)
x.y.(x (y z))
x.(((x y) (x x))
((x.(x x))(x.(x x)))
Trong ngn ng hnh thc, gi s gi <-t> l mt hng , ta c th nh ngha mt vn
phm G trn bng ch nh sau :
<-t> ::= <x> | <x>.<-t> | (<-t> <-t>)
<x> ::= Var
Mt cch trc gic, php tru tng x.M th hin hm :
xM
cn p dng (M N) th hin vic p dng hm M cho tham i N.

114

LP TRNH HM

Ngi ta cng biu din hng bi mt cy c php. Chng hn hng :


(x.(x y) (x x))
c biu din bi cy c php nh sau (app l cc p dng) :
app

app

app
x

Hnh IV.1. Cy biu din mt biu thc lambda.


Php tru tng lun tc ng ln mt bin duy nht. Khi cn biu din mt hm c
nhiu tham i :
x1, x2, , xn M
ngi ta s dng k thut tham i ho tng phn (currying) a v dng tru tng ch
s dng mt bin :
x1.(x2. ... (xn.M) ... )
thun tin cho vic trnh by v d c cc biu thc lambda, ngi ta thng dng
quy c nh sau :
- Php tru tng l kt hp phi : x.y.z.M c th c vit xyx.M
- Cc p dng l kt hp tri : ((M N) P) c th c vit M N P
V d x.y.((x y) z) c th hin vit : xy.xyz.

IV.2.2. Biu din biu thc lambda trong Scheme


Trong Scheme, biu din theo c php lambda mt hm c hai tham s :
(x, y) x + y
ngi ta vit nh sau :
(lambda (x y) (sqrt (+ x y)))
Mt cch tng qut :
(lambda arg-list body)
trong , body l mt s-biu thc, cn arg-list c th l mt trong cc dng :
x
(x1 ...)
(x1 ... xn-1 . xn)
Gi tr mt biu thc lambda l mt hm nc danh (anonymous function), khi s dng
tnh ton a ra kt qu cn phi cung cp tham i thc s :
((lambda (x y) (sqrt (+ x y))) 3 13)
--> 4.
((lambda (x y L) (cons x (cons y L))) a b (c d))
--> (a b c d)
nh ngha hm hng, ngi ta s dng biu thc lambda khng c tham bin. V d :

K THUT X L HM

115

(lambda ()
(display 1)
(display < = )
(display 2)
(newline))
Khi gi s dng, khng cn a vo tham i thc s :
((lambda ()
(display 1)
(display < = )
(display 2)
(newline)))
--> 1 < 2
Tuy nhin, Scheme c dng c bit begin dng ni kt cc s-biu thc cng cho ra
kt qu tng t :
(begin
(display 1)
(display < = )
(display 2)
(newline))
--> 1 < =2

IV.2.3. nh ngha hm nh lambda


Trong nhiu trng hp, ngi lp trnh thng phi nh ngha cc hm b tr trung
gian, hay nh ngha hm qua nhng hm khc, m tn gi ca chng khng nht thit phi
quan tm ghi nh. Chng hn hm id trong sum-square, hm inc trong increment,
v.v ... thun tin cho ngi lp trnh, Scheme cho php b qua cc tn ny, bng cch s
dng dng c bit lambla. Chng hn nh ngha hm :
(lambda (x) (+ x x))
cho php gp i i s x. Khi gi cn cung cp tham i :
((lambda (x) (+ x x)) 9)
--> 18
Khi s dng define gn mt biu thc lambda cho mt tn bin :
(define f (lambda (x y) (sqrt (+ x y))))
th bin f c gi tr l mt hm, f c th gi tham s :
(f 3 13)
--> 4
Trong Scheme c php nh ngha hm nh lambda nh sau :
(define fname
(lambda (x1 ... xn)
body))
Dng nh ngha hm dng biu thc lambda c li th l khng phn bit mt nh ngha
hm vi mt nh ngha gi tr no ca Scheme. Tuy nhin, ngi ta c th chuyn i t
dng biu thc lambda v dng nh ngha hm trc y. V d :

116

LP TRNH HM

(define (member? s L)
(if (null? L)
#f
(or (equal? s (car L))
(member? s (cdr L)))))
c th vit li nh sau
(define my-member?
(lambda (s L)
(if (null? L)
#f
(or (equal? s (car L))
((define (my-member? s L)
Hm sau y cho php chuyn i t ng dng c thnh dng mi s dng lambda
nh ngha mt hm bt k (ch trong nh ngha hm c s dng quasiquote) :
(define (oldform->newform def-no-lambda)
(let ((fname (caadr def-no-lambda))
(paramlist (cdadr def-no-lambda))
(Lbody (cddr def-no-lambda)))
`(define ,fname (lambda ,paramlist ,@Lbody))))
Vn dng hm oldform->newform, ta c th chuyn hm my-member? trn y v
dng nh ngha nh lambda nh sau :
(oldform->newform
(define (my-member? s L)
(if (null? L)
#f
(or (equal? s (car L))
(my-member? s (cdr L))))))
--> (define my-member? (lambda (s l)
(if (null? l) #f (or (equal? s (car l))
(my-member? s (cdr l))))))
Hm kt qu c th c s dng nh l cc hm thng thng. Chng hn, ta xy dng
li hm sum-integer tnh tng cc s nguyn gia a v b cho v d trc y nh sau :
(define (sum-integer a b)
(sum (lambda (x) x) a b)) ; li gi (sum f x y)
(sum-integer 0 9)
--> 45
(define (increment x)
(lambda (y) (+ x y)))
((lambda (x) (+ x 1)) 2)
--> 3
((lambda (x) (* x 5)) 10)
--> 50
Nh php tnh lambda, nh ngha hm tr nn gn hn v mt c php :
(define (double x) (+ x x))
l tng ng vi nh ngha s dng lambda :

K THUT X L HM

117

(define double
(lambde (x) (+ x x)))
(double 5)
--> 10
V d sau y lit k cc phn t mt danh sch :
(define (display-list L)
(for-each (lambda (x)
(display x) (display )) L))
(display-liste (a b c d e))
--> a b c d e
(display-liste (a (b ()) c (d) e))
--> a (b ()) c (d) e
Ta c th s dng lambda xy dng cc hm t hp mt ngi nh sau :
; compose: (T2 T3) (T1 T2) (T1 T3)
(define (compose f g)
(lambda (x) (f (g x))))
hoc nh ngha cch khc nh sau :
(define compose
(lambda (f g)
(lambda args
(f (apply g args)))))
((compose sqrt *) 12 75)
--> 30
Dng lambda xy dng hm incr nhn mt tham i x, tr v mt hm cho php
gia thm mt lng vo x (xem v d mc trc) :
; incr: (Number Number) (Number Number)
(define (x)
(lambda (y) (+ x y)))
((incr 12) 5)
--> 17
Ta nh ngha hm incr2 cho php tng ln 2 mt tham s :
(define incr2 (incr 2))
(define x 3)
(incr2 5)
--> 7
; Kt qu khng phi l 8.

IV.2.4.

K thut s dng phi hp lambda

Dng let l tng ng vi dng lambda. Chng hn :


(let ((x 1) (y 2)) (+ x y))
--> 3
((lambda (x y) (+ x y)) 1 2)
--> 3

118

LP TRNH HM

Nh vy :
(let ((x1 e1)
...
(xk ek))
body)

((lambda (x1 ... xk)


body)
e1 ... ek)

Ta c th nh ngha mt hm s dng let phi hp vi lambda. Chng hn, tnh biu


thc

a 2 + b 2 , ta c th nh ngha hm b tr x2 nh lambda :

(define (pitagore a b)
(let ((sqr (lambda (x) (* x x))))
(sqrt (t(sqr a) (sqr b)))))
(pitagore 3 4)
--> 5.
Vi lambda, ta cng c th s dng k thut li ha tnh ton. Chng hn m phng
dng if tu theo iu kin thc hin cc vic khc nhau, ta c th nh ngha hm ch
nh sau :
(define (my-if x y z)
(if x (y) (z)))
(my-if (= 1 2) (lambda () #t) (lambda () #f))
--> #f
y cn s dng cc cp du ngoc gi cc li ha y v z.
(define (fact n)
(my-if (= n 0)
(lambda () 1)
(lambda () (* n (fact (- n 1))))))
(fact 5)
--> 120
nh ngha hm nhn :
(define (mult-n n)
(lambda (x) (* n x)))
((mult-n 9) 7)
--> 63
Gi s ta cn vit mt th tc to sinh cc s t nhin :
gennerator: 0 Integer
cho php lit k cc s nguyn ti mi li gi :
(gennerator)
--> 0
(gennerator)
--> 1
(gennerator)
--> 2
v.v..., ta s dng t bin trn cc phn t b i ca danh sch nh sau :
(define gennerator

K THUT X L HM

119

(let ((curr (list -1)))


(lambda ()
(set-car! curr (+ (car curr) 1))
(car curr))))
(gennerator)
--> 0
(gennerator)
--> 1
(gennerator)
--> 2
(gennerator)
--> 3
Danh sch (-1) l gi tr gn cho curr, ch c tnh duy nht mt ln trong th tc.
Tuy nhin nu curr lun lun c tnh li mi ln gi n th tc theo cch nh ngha
nh di y th s gp li sai :
(define (gennerator)
(define curr (-1))
(set-car! curr (+ (car curr) 1))
(car curr))
(gennerator)
--> Error: exception (set-car! '(-1) 0)
Do danh sch (-1) c to ra mt ln cho mi trng hp, khi nh ngha th tc, li
gi set-car! lm thay i cc lnh ca th tc. V mt l thuyt, iu ny khng ng
vi c php ca ngn ng Scheme.
gennerator
--> (lambda () (define curr (-1)) ... )
(gennerator)
--> 0
gennerator
--> (lambda () (define curr (0)) ... )
Nhng sai st kiu ny thng xy ra do v khi lp trnh vi t bin. Gi s ta p dng
hm set! ca Scheme lm thay i ca mt bin c nh ngha trc hin ang
tn ti (hoc c to ra bi define, hoc l tham i ca mt hm khc). Hm set! c
c php nh sau :
(set! v s)
Khi thc hin set!, Scheme thay th gi tr c ca bin v bi s. V d :
(define truc 1)
truc
--> 1
(set! truc 9999)
truc
--> 9999
Ch rng hm set! khng tr v kt qu. nh ngha sau y khng ng v bin
toto cha c.

120

LP TRNH HM

(set! toto 3)
--> ERROR
S dng hm set! trn y nh ngha th tc to sinh cc s t nhin, ta gp li sai,
lun lun cho kt qu 0 :
(define (gennerator_e1)
(define curr -1)
(set! curr (+ curr 1))
curr)
(gennerator_e1)
--> 0
(gennerator_e1)
--> 0
nh ngha sau y cng sai, lun lun cho kt qu 0 :
(define (gennerator_e2)
(define curr (list -1))
(set-car! curr (+ (car curr) 1))
(car curr))
(gennerator_e2)
--> 0
(gennerator_e2)
--> 0

IV.2.5.

nh ngha hm nh tch lu kt qu

Ngi ta thng gp nhiu cu trc lp trnh ging nhau nhng p dng cho nhiu hm
khc nhau. Sau y, ta s xt mt v d p dng k thut tch lu kt qu nh hm list-it.
Ta nh ngha ln lt 4 hm thc hin cc vic sau :
1. Tnh tng gi tr ca mt hm p dng cho cc phn t danh sch
(define (sum h L)
(if (null? L )
0
(+ (h (car L )) (sum h (cdr L)))))
2. Tnh tch gi tr ca mt hm p dng cho cc phn t danh sch
(define (product h L)
(if (null? L)
1
(* (h (car L )) (product h (cdr L)))))
3. nh ngha li hm append ghp hai danh sch
(define (myappend L1 L2)
(if (null? L1)
L2
(cons (car L1) (myappend (cdr L1) L2))))
4. nh ngha li hm map cho hm mt bin h
(define (mymap h L)

K THUT X L HM

121

(if (null? L )
()
(cons (h (car L)) (mymap h (cdr L )))))
Gi s danh sch L = (x0, x1, ... , xn), ta c cu trc chung ca cc hm trn nh sau :
(sum h L)
= (+ (h x0) (+ (h x1) (+ ... (+ h xn) 0) ... )))
(product h L)
= (* (h x0) (* (h x1) (* ... (* h xn) 0) ... )))
(myappend L M)
= (cons x0 (cons x1 (... (cons xn L2) ... )))
(mymap h L)
= (cons (h x0 )(cons (h x1) (...(cons (h xn) ()) ...)))
Bng cch s dng mt hm f c i s th nht l danh sch L v i s th hai l kt
qu tch lu lin tip, gi tr cui cng ca hm s l :
(f x0 (f x1 (... (f xn R) ...)))
vi R l gi tr u.
T ta y dng hm list-it c tnh tng qut nh sau :
(define (list-it f L R)
(if (null? L )
R
(f (car L) (list-it f (cdr L) R))))
Hm list-it thc hin hm f ln lt cho cc phn t ca danh sch L, kt qu c
tch lu bt u t R. S dng hm list-it ny, ta c th gi thc hin tnh ton L ht
cng vic ca bn hm trn nhng c vit li nh sau (dng tip theo l v d p dng) :
; Hm (sum h L )
(list-it (lambda (x y)
(+ (h x) y)) L 0)
(list-it (lambda (x y) (+ (sqrt x) y)) (1 2 3 4 5) 0)
--> 8.38233
; Hm (product h L)
(list-it (lambda (x y)
(* (h x) y)) L 1)
(list-it (lambda (x y) (* (sqrt x) y)) (1 2 3 4 5) 1)
--> 10.9545
; Hm (myappend L1 L2)
(list-it cons L1 L2)
(list-it cons (a b c) (1 2))
--> (a b c 1 2)
; Hm (mymap h L)
(list-it (lambda (x y)
(cons (h x ) y)) L ())
(list-it (lambda (x y)
(cons (sqrt x ) y)) (1 2 3 4 5) ())

122

LP TRNH HM

--> (1 . 1.41421 1.73205 2 . 2.23607)


(map sqrt (1 2 3 4 5))
--> (1 . 1.41421 1.73205 2 . 2.23607)
Ch khi p dng, cn cung cp tham i thc s cho cc tham i l hm h.
5. nh ngha cc hm fold
Trong chng 1, ta nh ngha hm foldr bao qua phi dng tnh ton tch lu
kt qu trn cc phn t ca mt danh sch. Sau y ta nh ngha trong Scheme hai hm
fold l foldl (left) v foldr (right) cng nhn vo mt hm f hai tham i : mt phn t
xut pht a v mt danh sch L, tr v kt qu l p dng lin tip (lu k) hm f cho a v
vi mi phn t ca L. Hai hm khc nhau ch hm foldl ly ln lt cc phn t ca L
t tri qua phi, cn hm foldl ly ln lt cc phn t ca L t phi qua tri :
(define (foldl f a L)
(if (null? L)
a
(foldl f (f a (car L)) (cdr L))))
(define (foldr f a L)
(if (null? L)
a
(f (car L) (foldr f a (cdr L)))))
(foldl cons 0 (1 2 3 4 5))
--> (((((0 . 1) . 2) . 3) . 4) . 5)
(foldr cons 0 (1 2 3 4 5))
--> (1 2 3 4 5 . 0)

IV.2.6.

Tham i ho tng phn

Nh trnh by chng 1 v nguyn l lp trnh hm, k thut tham i ha tng phn


(currying) cho php dng bin truy cp n cc hm c s tham bin bt k f(x1, ... , xn).
Chng hn, hm hai bin f(x, y) c xem l hm mt bin x tr v gi tr l hm y :
x (y f(x, y))
Gi s xt hm max tm s ln nht trong th vin Scheme, vi n=2 :
(max (* 2 5) 10)
--> 10
S dng k thut Currying, ta vit :
(define (curry2 f)
(lambda (x) (lambda (y) (f x y))))
(((curry2 max) (* 2 5)) 10)
--> 10
Vi n=3, ta cng xy dng tng t :
(define (curry3 f)
(lambda (x)
(lambda (y)
(lambda (z) (f x y z)))))

K THUT X L HM

123

((((curry3 max) (* 2 5)) 10) (+ 2 6))


--> 10
T ta c th xy dng cho hm n i bt k. u im ca k thut Currying l c th
c t mt hm ngay khi mi bit gi tr ca tham s th nht, hoc cc tham s u tin cho
cc hm c nhiu hn hai tham i.
i vi hm mt bin, u im ca k thut Currying l ngi ta c th t hp tu cc
hm m khng quan tm n cc tham i ca chng.

IV.2.7.

nh ngha quy cc b

Trong chng trc, ta lm quen vi khi nim hm b tr nh ngha cc hm


Scheme. Hm b tr c th nm ngay trong hm cn nh ngha, c gi l hm cc b.
Ngi ta c th s dng dng hm letrec trong th vin Scheme nh ngha quy mt
hm cc b. Chng hn ta cn xy dng mt danh sch cc s t nhin 0..n vi n cho trc
nh sau :
; iota : number > list(number)
; hoc iota : n > (0 1 2 ... n)
(define (iota n)
(if (zero? n )
(0)
(append (iota (- n 1)) (list n))))
(iota 10)
--> '(0 1 2 3 4 5 6 7 8 9 10)
nh ngha trn y ng n, tuy nhin vic s dng hm ghp danh sch append lm
tn b nh, do lun lun phi thm cc phn t mi vo cui mt danh sch. V vy tng
ci bin l lm ngc li vn : xy dng hm cho php nhn mt s m tr v danh sch
cc s t nhin t m n n l (m m+1 ....n). Thay v s dng hm ghp danh sch, ta s dng
cons xy dng hm b tr nh sau :
(define (m-to-n m n)
(if (< n m)
()
(cons m (m-to-n (+ m 1) n))))
(m-to-n 3 10)
--> (3 4 5 6 7 8 10)
Do hm m-to-n khng dng u khc, nn cn t bn trong hm iota. Sau khi nh
ngha, cn gi vi tham i m=0 :
(define (iota n)
(define (m-to-n m n)
(if (< n m)
()
(cons m (m-to-n (+ m 1) n))))
(m-to-n 0 n))
(iota 10)
--> '(0 1 2 3 4 5 6 7 8 9 10)

124

LP TRNH HM

Gi s thay v nh ngha hm cc b m-to-n, ta s dng dng let to ra ln lt


cc s t nhin k t m. Tuy nhin khng cn dng n tham bin n v n c cp bi hm
iota :
(define (iota n)
(let ((m-to-n (lambda (m)
(if (< m n)
()
(cons m (m-to-n (+ m 1)))))))
(m-to-n 0)))
(iota 10)
--> ()
Ta thy kt qu sai v li gi m-to-n trong hm ch dn n thc hin let mt ln m
khng thc hin gi quy. khc phc, ta s dng dng letrec, l dng let c bit
to ra li gi quy. C php ca letrec ging ht let cng gm phn lin kt v
phn thn :
(letrec ((v1 e1 ) ... (vk eN)) s)
Cc bin vi, i=1..N, c gn gi tr ei sau thc hin phn thn s l mt biu
thc no . Tuy nhin mi php gn bin c th nhn thy ln nhau, ngha l khi tnh biu
thc ei th c th s dng cc bin vi vi i, j tu . Ngha l khng ging hon ton let,
cc bin cc b v1, ... , vN u c nhn thy trong tt c cc biu thc e1, ... , ek. Tuy
nhin, cn ch rng mi biu thc ej c tnh m khng cn tnh gi tr ca bin vj, khi
ej l mt biu thc lambda.
Nh ng ngha ny, dng letrec thng c s dng nh ngha cc th tc quy
tng h (mutually recursive).. Chng hn, cc v t odd? v even? l trng hp in
hnh cho cc hm tha nhn nh ngha quy tng h. Sau y l v d s dng letrec
nh ngha tng h hai th tc cc b kim tra mt s nguyn l chn (even) hay l (odd)
m khng s dng hai hm th vin ca Scheme l even? v odd? :
(letrec
((local-even? (lambda (n)
(if (= n 0)
#t
(local-odd? (- n 1)))))
(local-odd? (lambda (n)
(if (= n 0)
#f
(local-even? (- n 1))))))
(list (local-even? 27) (local-odd? 27)))
--> (#f #t)
By gi hm iota c nh ngha li nh sau :
(define (iota n)
(letrec
((m-to-n (lambda (m)
(if (< n m)
()

K THUT X L HM

125

(cons m (m-to-n (+ m 1 )))))))


(m-to-n 0)))
(iota 10)
> (0 1 2 3 4 5 6 7 8 9 10)
S dng phi hp dng letrec v lambda nh sau :
(lambda (x1 ... xN)
(define f1 e1)
...
(define fN eN)
s)

IV.3
IV.3.1.

(lambda (x1 ... xN)


(letrec (f1 e1)
...
(fN eN))
s))

X l trn cc hm
Xy dng cc php lp

Trong mc trc, ta nh ngha hm list-it s dng k thut tch lu kt qu


to ra mt cu trc lp trnh ging nhau p dng cho nhiu hm khc nhau. Sau y, ta s xy
dng cc hm lp mi l append-map, map-select, every v some m rng th
vin cc hm ca Scheme (vn ch c hai th tc lp c sn l map v for-each).
1.

Hm append-map

Khi mt hm f nhn tham i l cc phn t ca mt danh sch tr v cc gi tr l


danh sch, ngi ta cn ni ghp (concatenation) cc danh sch ny. Ta xy dng hm
append-map nh sau :
(define (append-map f L)
(apply append (map f L)))
p dng hm append-map, ta c th xy dng hm flatting lm phng (co
bng) mt danh sch ph hp khc rng theo nguyn tc : ghp kt qu lm phng cc phn
t ca danh sch mc th nht, kt qu lm phng ca nguyn t l danh sch (thu gn v
nguyn t) :
(define (flatting s)
(if (list? s)
(append-map flatting s)
(list s)))
(flatting (a (b c) ((d (e))) "yes" ()))
> (a b c d e "yes")
(flatting a)
> (a)
(flatting 10)
> (10)

126

LP TRNH HM

(flatting ())
> ()
2.

Hm map-select

Nhiu khi, ngi ta ch mun p dng hm map cho mt s phn t ca mt danh sch
tho mn mt v t p? no m thi, ngha l s dng map c la chn. Ta xy dng hm
map-select vi tng nh sau : s dng append-map v gn gi tr () cho cc phn
t khng tho mn v t, v do vy cc gi tr rng ny khng a vo danh sch kt qu cui
cng khi hm tr v.
(define (map-select f L p?)
(append-map
(lambda (x)
(if (p? x)
(list (f x))
()))
L))
(map-select (lambda (x)(/ 1 x))
(a 3 0 5 7 9)
(lambda (x)
(and (number? x) (not (zero? x)))))
> (1/3 1/5 1/7 1/9)
(map-select sqrt '(1 2 3 4 5) odd?)
> (1. 1.73205 2.23607)
3.

Cc hm every v some

Khi cc i s ca php hi lgic and l cc gi tr ca hm f no , ta c th nh


ngha hm every m rng and nh sau :
(every f (e1 ... eN)) = (and (f e1) ... (f eN))
Tuy nhin ta khng th nh ngha every mt cch trc gic l p dng php and cho
danh sch cc gi tr ca f :
(define (every f L)
(apply and (map f L)))
Bi v hm apply khng nhn and lm tham i. Trong Scheme, and khng phi l
hm m l mt dng c bit. Ta nh ngha every theo cch quy truyn thng nh sau :
(define (every f L)
(if (null? L)
#t
(and (f (car L))
(every f (cdr L)))))
(every even? '(0 2 4 6 8))
> #t
(every number? '(1 3 a 5))
> #f

K THUT X L HM

127

Mt cch tng t, ta xy dng hm some m rng php tuyn lgic or bng cch
thay th and bi or c dng:
(some f (e1 ... eN)) = (or (f e1) ... (f eN))
Hm some nh sau :
(define (some f L)
(if (null? L)
#f
(or (f (car L))
(some f (cdr L)))))
(some number? (1 3 a 5))
> #t
(some odd? (0 2 4 6 8))
> #f

IV.3.2.

Trao i thng ip gia cc hm

Sau khi nh ngha cc hm v ci t cc kiu d liu, ngi s dng c th thao tc trc


tip trn d liu bng cch s dng k thut lp trnh truyn thng ip (message
transmission). Thay v xem d liu nh l mt gi tr kiu n v (mt s nguyn, mt b i,
mt danh sch, v.v ... ), ta c th xem d liu nh l mt hm nhn cc thng ip v thc
hin tnh ton tu thuc vo thng ip nhn. Ngi ta gi y l hm b ghi (switch
function). Nhng hm thy c t bn ngoi ch cn l mt li gi vi mt thng ip c
bit. Ta xt li v d v x l cc s hu t chng trc. Ta khai bo cc hm to s
hu t, xc nh t s v mu s nh sau :
functions
create-rat : integer integer rational
numer :
rational
integer
denom :
rational
integer
By gi ta nh ngha li hm create-rat c dng nh sau :
create-rat : (integer integer) (symbol Integer)
Hm create-rat s to ra mt hm nhn vo mt thng ip (kiu k hiu) tr v
mt s nguyn, tu theo ni dung thng ip cho bit l t s hay mu s :
(define (create-rat x y) ; precondition: y 0
(define g (gcd x y))
; gcd l c s chung ln nht ca x, y
(define N (quotient x g))
(define D (quotient y g))
(lambda (message)
(cond
((eq? message numerator) N)
((eq? message denominator) D)
(else (error unknown message message)))))
((create-rat 9 15) numerator)
--> 3

128

LP TRNH HM

((create-rat 9 15) denominator)


--> 5
((create-rat 9 15) denom)
--> *** Error: "unknown message" (denom)
(create-rat 9 15)
--> *** Error: #{Procedure 6700 (unnamed in create-rat)}
Ta tip tc nh ngha hai hm numer v denom s gi n hm create-rat :
; numer : (integer integer) integer
(define (numer R)
(R numerator))
; denom : (integer integer) integer
(define (denom R)
(R denominator))
(numer (create-rat 9 15))
--> 3
(denom (create-rat 9 15))
--> 5
Vi cch xy dng cc hm x l cc s hu t trn y, ngi s dng ch c th gi n
mt hm nh mt thng ip message : li sai do mt li gi hm no , v tnh hay c
, u khng th xy ra. Trong trng hp mt thng ip cn cc tham i b sung, hm b
ghi s dn v mt hm cn phi thc hin vi nhng tham i ny.
Nu cn thm mt b kim tra =rat, ch cn thm mnh sau y vo iu kin kim
tra message ca hm create-rat (trc else) trn y :
((eq? message =rational)
(lambda(R) (= (* N (denom R)) (* D (numer R)))))
Lc ny, ta c th vit hm =rat tr v mt hm mt tham i l s hu t cn so snh
nh sau :
(define (=rat R1 R2)
((R1 =rational) R2)) ; p dng hm tr v vi R2
(=rat (create-rat 1 3) (create-rat 1 3))
--> #t
(=rat (create-rat 2 3) (create-rat 3 2))
--> #f
K thut lp trnh xem d liu nh l mt hm nhn cc thng ip thc hin tnh ton
thng kh s dng, i hi ngi lp trnh phi qun l tt x l theo ni dung thng
ip. Tt c nhng g l d liu u c th to ra hm nh lambda nhng rt kh nhn bit
c nhng thng ip no s tho mn hm. Chng hn sau y l mt v d s dng b i
nhng thay i hai hm car l cdr :
(define (cons x y)
(lambda (m)
(cond
((eq? m car) x)
((eq? m cdr) y)
(else (error "unknown message")))))
(define (car D) (D car))

K THUT X L HM

129

(define (cdr D) (D cdr))


(cdr (cons tom jerry))
--> jerry
(car (cons 'tom 'jerry))
--> tom
(car (1 2 3))
--> ERROR: attempt to call a non-procedure

IV.3.3.

T hp cc hm

T khi nim hm bc cao, ta c th nh ngha cc hm t hp (function composition)


nh sau :
; gf : (T1 T2) T3
Hoc t hp trc tip ngay trong tn hm :
(define (compofg x ) (g (f x))
chng hn :
(define (cacddddr L)
(car (cddddr L)))
(cacddddr (a b c d e f))
>e
Hoc s dng lambda to ra dng mt li ha :
(define (compos g f)
(lambda (x) (g (f x))))
chng hn :
((compos car cddddr) (a b c d e f g ))
> e
(define fifth
(compos car cddddr))
(fifth (a b c d e f g ))
> e
Nh khi nim bc ca hm, nhiu sai st c th c pht hin. Gi s ta xt cc hm map
v cdr lm vic vi d liu kiu danh sch :
map : (T1 T2) List(T1) List(T2)
cdr : List(T) List(T)
Nu p dng hm map l hm bc 2 c cdr lm tham i s gy ra li :
(map cdr (list 1 2 3))
--> ERROR: cdr: Wrong type in arg1 1
Trong nh ngha hm cdr, danh sch c kiu List(T), nn danh sch (1 2 3) phi
c kiu List(Integer). Nh vy, p dng c hm map, cn phi c :
T1 = List(T) = Integer
nhng iu ny l khng th xy ra. Tng t, t nh ngha hm sau y :

130

LP TRNH HM

f : (Number T1) T2
ta nh ngha hm :
(define (f g) (g 2))
th li gi sau y l sai :
(f f)
--> ERROR: Wrong type to apply: 2
Tuy nhin nhng li gi sau y li cho kt qu ng :
(f list)
--> '(2)

; to danh sch mt phn t

(f sqrt)
--> 1.41421

; tnh cn bc hai mt s nguyn

V d sau l mt nh ngha hm s dng mt hm khc lm tham i nhng thc t,


tham i ny chng ng vai tr g trong vic tnh ton thn hm, ch c mt cho phi
php xt v mt c php :
(define (f g n)
(if (= n 0)
1
(* n (g g (- n 1)))))
(define (mystery n) (f f n))
(mystery 5)
--> 120
(f f 5)
--> 120
Ngi c c th nhn nhn ra ngay mystery l hm tnh giai tha ! Xt v php ton,
nh ngha trn t ra hp l (tnh ng giai tha). Tuy nhin, mi ngn ng c nh kiu
mnh s t chi nh ngha ny, vi khng th xc nh c bc ca hm f v vai tr ca n
trong thn hm. Mt cch tng t, ngi c c nhn xt g khi thay i li nh ngha hm
tnh giai tha nh sau :
(define (fac g h n)
(if (= n 0)
1
(* n (h h h (- n 1)))))
C th thay i dng cui cng thnh (g g g ... ) ?

IV.3.4.

Cc hm c s lng tham i bt k

Khi gi thc hin mt hm, b din dch Scheme t tng ng cc tham i hnh thc
vi cc tham i thc s. Sau y l cc dng nh ngha hm c nhiu tham i tu v
dng s dng php tnh lambda tng ng.
Dng nh ngha 1 :
(define (f x y z) ... )
tng ng vi :
(define f (lambda (x y z) ... )

K THUT X L HM

131

V d vi li gi :
(f 1 (+ 1 2) 4)
cc tham i hnh thc ln lt c nhn gi tr : x=1, y=3, z=4.
Dng nh ngha 2 :
(define (g . L) ... )
(ch g l tn hm, c du cch trc v sau du chm) tng ng vi :
(define g (lambda L ... ))
V d vi li gi :
(g 1 2 3 4 5)
tham i hnh thc l danh sch L c ly gi tr L = (1 2 3 4 5).
Dng nh ngha 3 :
(define (h x y . z) ... )
tng ng vi :
(define h (lambda (x y . z) ... )
V d vi li gi :
(h 1 2 3 4)
cc tham i hnh thc c ly gi tr nh sau : ((x y . z) c so snh vi (1 2 3
4), t , x=1, y=2, z=(3 4)
Trong 3 dng nh ngha trn y, hm f tha nhn ng 3 tham i, hm g c s lng
tham i tu , hm h phi c ti thiu 2 tham i. Ta c th d dng nh ngha hm list
theo dng 2 :
(define (list . L) L)
(list 1 2 3 4 5 6 7 8 9 0)
--> (1 2 3 4 5 7 8 9 0)
Ta c th m rng mt hm hai tham i nh ngha thnh hm c nhiu tham i. V
d, t hm cng + l php ton hai ngi, ta nh ngha hm add cng dn cc phn t ca
tham i l mt dy s nguyn tu :
(define (add . L)
; L : List(Number)
(define (add-bis L R)
(if (null? L)
R
(add-bis (cdr L) (+ (car L) R))))
(add-bis L 0))
(add 2 3 4 5)
--> 14
p dng hm apply, hm add c th nh ngha theo cch khc nh sau :
(define (add . L)
(if (null? L)
0
(+ (car L) (apply add (cdr L )))))
(add 1 2 3 4 5)
--> 15
(define L (1 2 3 4 5))

132

LP TRNH HM

(apply add L)
--> 15
Mt cch tng qut, cc dng nh ngha 2 v 3 c th vit di dng :
(define (f v0 v1 . . vn- 1 .vN) s)
tng ng vi dng lambda :
(define (f)
(lambda (L) s))
trong thn hm s l mt biu thc, L l mt danh sch cc i tu .

IV.4
IV.4.1.

Mt s v d
Phng php xp x lin tip

Nhiu khi, ta cn gii phng trnh c dng :


x = f (x)
(1)
trong f l mt hm c bin s x. Chng hn tm gi tr x t phng trnh :
x2 = 2
ta c th vit li di dng phng trnh (1) :
x = (x2 + 2)/2x
(2)
gii phng trnh (2), ta s dng phng php xp x lin tip nh sau :
x0 = c
xn+1 = (xn2 + 2)/2xn
trong c l mt gi tr no khi ng qu trnh lp. Nu vit li cc phng trnh trn
theo dng (1) v t hng c = f (xo), ta nhn c :
x0 = f (xo)
(3)
xn+1 = f(xn)
Nh vy, li gii tm nghim x t phng trnh (1) l tm gi hn ca dy { xn} theo (3).
Trong ton hc, ngi ta phi chng minh tnh hi t ca dy nhn c x = f(x). p dng
phng php xp x lin tip, ta c th gii hay gii thch cch dng php quy tnh n! :
fac(n) = 1, vi n 0
fac(n) = n * fac(n-1)
T cch tnh lp cc gi tr { xn}, ta xy dng hm xp x lin tip nh sau :
(define (n-iter f x x0)
(if (zero? n)
x0
(f (n-iter f (- n 1) x0))))
V d 1 : tnh

2 nh phng php xp x lin tip x =

(n-iter (lambda (x) (+ (/ x 2)


(/ 1. 0 x))) 10 1)
--> 1. 41421

x 1
+ vi x0 = 1 :
2 x

K THUT X L HM

133

V d 2 : Tnh gn ng x = sin (2x) :


(n-inter (lambda (x) (sin (* 2 x))) 10 1)
--> 0.948362

IV.4.2.

To th tc nh dng

Sau y l m t v d t to m t th tc nh dng format cc kt qu a ra. Th tc


hot ng tng t Common Lisp c dng nh sau :
(define (format format-str . L-args)

trong , format-str l chu i nh dng, cn L-args l cc biu thc tham i (s


lng tu ) c a ra theo cch quy c trong chu i nh dng tng ng.
Chui nh dng a ra mi k t c mt trong , tr ra cc k t c t trc mt k t
c bit ^ c quy c nh sau :
^s hoc ^S

ch v tr write a ra gi tr tham i tng ng

^a hoc ^A

ch v tr display a ra gi tr tham i tng ng

^%

nhy qua dng mi

^^

in k t ^

V d :
(format "Display ^^ with the format:^% x = ^s" (+ 1 2))
--> Display ^ with the format:
x = 3
(format "sin ^s = ^s^%" (/ 3.141592 2) (sin (/ 3.141592 4)))
--> sin 1.5708 = 0.707107
Th tc format-str khng tr v gi tr m tu theo ni dung chu i nh dng a
ra kt qu. Cch hot ng n gin nh sau : th tc duyt chu i nh dng v a ra m i k
t khng t trc m t k t c bit ^. Khi gp ^, th t c s x l ln lt tng trng hp
bi case. Tham s i trong hm b tr format-to ch nh v tr ca k t hin hnh.
(define (format str . L)
(let ((len (string-length str)))
(letrec ((format-to (lambda (i L)
(if (= i len)
(newline) ; 'indefinite
(let ((c (string-ref str i)))
(if (eq? c #\^)
(case (string-ref str (+ 1 i))
((#\a #\A)
(display (car L))
(format-to (+ i 2) (cdr L)))
((#\s #\S)
(write (car L))
(format-to (+ i 2) (cdr L)))
((#\%)
(newline) (format-to (+ i 2) L))
((#\^)
(display #\^)
(format-to (+ i 2) L))

134

LP TRNH HM

(else (display "unknown character")))


(begin (display c)
(format-to (+ i 1) L))))))))
(format-to 0 L))))

IV.4.3.

X l a thc

IV.4.3.1. nh ngha a thc


Ta xt cc a thc (polynomial) bin x h s thc. Mi a thc l tng hu hn cc n
thc (monomial). Mi n thc c th l 0 hoc m t biu thc dng :
axn
vi a l h s thc v n l bc c a x, n nguyn dng v a 0.
Khi n = 0, n thc ax0 tr thnh hng a. n thc 0 khng c bc, i khi ngi ta ni
bc ca n l -.
V d :
9x4+ 7x5 + -10+ -7x5 +27x
l m t a thc c a x. Lc ny du cng c vai tr phn cch cc n thc. Ta cha nh
ngha php cng trn a thc, tuy nhin m t cch trc gic, ta c th rt g n a thc thnh :
9x4 + -10 +27x
x l cc a thc trong Scheme, trc ht ta cn a ra m t cch biu din a thc
thng nht. Ta bit rng php cng cc n thc c cng bc theo nguyn tc nh sau :
axn +bxn = o
nu a+b = 0
nu khng
axn +bxn = (a+b)xn
Bng cch cng tt c cc n thc cng bc v sp xp m t a thc theo bc gim dn,
ta nhn c cch biu din chnh tc (canonical) cho cc a thc nh sau :
apxp + ... +aixi
i vi mt a thc khc 0, n thc c bc cao nht c gi l n thc tri
(dominant), v bc c a n l bc c a a thc, h s ca n l h s nh hng (director) hay
h s tr i. V d a thc trn y c bc l 4 v c vit li l :
9x4 +27x + -10
Ng i ta nh ngha php cng hai a thc :
(apxp + ... +aixi) + (aqxq + ... +ajxj)
bng cch cng cc n thc cng bc v t cc n thc di dng chnh tc, ta nhn c
a thc tng.

IV.4.3.2. Biu din a thc


C hai phng php biu din cc a thc trong Scheme :
1. Biu din y (full representation)
Theo phng php ny, ngi ta to mt danh sch gm tt c cc h s (bng 0 hoc
khc 0), bt u t h s tr i. V d a thc 9x4 +27x + -10 c biu din bi danh sch :
(9 0 0 27 -10)
2. Biu din hng (hollow representation)

K THUT X L HM

135

S dng mt danh sch cc n thc khc 0 theo bc gim dn, m i n thc c xc


nh bi bc v h s tng ng. Ngha l mi a thc P, khc 0, u c dng :
P = cxd + Q
vi cxd l n thc tri c bc d v h s d, Q l a thc cn li c bc thp hn.
Sau y ta chn xt phng php biu din hng cc a thc. Vic s dng nguyn tc
phn tch mt cch chnh tc m t a thc thnh m t n thc tr i v m t a thc cn l i c
bc thp hn cho php nh ngha a thc nh l mt cu trc d liu. Gi thit t lc ny tr
i, mi a thc u c cng bin x v cc hm x l ly tn vi tip u ng poly.
Trc tin, ta tin hnh cc thao tc x l a thc m cha nu ra cch biu din hng
trong Scheme.Ta g i zero-poly l a thc 0, cn cons-poly l hm to a thc khc 0,
c ba tham bin. Hai tham bin th nht v th hai nh ngha n thc tr i gm h s v bc
ca n, tham bin th ba ch nh a thc cn li c bc thp hn (l a thc cho nh ng
b i n thc c bc cao nht) :
poly = zero-poly
hoc :
poly = (cons-poly coeff degree poly) vi iu kin coeff 0
Cc hm tip cn n cc thnh phn a thc l degree-poly, coeff-domin,
remain-poly tha mn cc quan h sau :
(coeff-domin (cons-poly coeff degree poly)) = coeff
(degree-poly (cons-poly coeff degree poly)) = degree
(remain-poly (cons-poly coeff degree poly)) = poly
phn bit cc a thc 0, xy dng v t zero-poly? tha mn quan h :
(zero-poly? zero-poly) = #t
(zero-poly? (cons-poly coeff degree poly)) = #f
duy tr quan im tru tng ho vn , tm thi ta cha nu c th cch xy dng
cc hm to mi a thc v cc hm tip cn n cc thnh phn c a a thc va trnh by
trn y m tip tc s d ng chng trong cc php x l di y.

IV.4.3.3. X l a thc
Cho trc a thc P = cxd + Q, cc php x l trn P bao g m :
Nhn a thc v i mt hng s a*P
So snh hai a thc
P1 ? P2
Cng hai a thc
P1 + P2
Nhn hai a thc
P1 * P2
1. Nhn a thc vi mt hng s
nhn hng s a vi a thc P, l y a nhn vi h s tr i ri sau ly a nhn vi a
thc cn li :
(define (mult-scalar-poly a P)
(cond ((zero? a) zero-poly) ; x l h s =0
((zero-poly? P) zero-poly) ; x l a thc 0
(else

136

LP TRNH HM

(let ((d (degree-poly))


(c (coeff-domin P))
(Q (remain-poly)))
(cons-poly d (* c a)
(mult-scalar-poly a Q))))))
2. So snh hai a thc
So snh hai a thc bng cch so snh hai n thc tr i, sau tip tc so snh hai a
thc cn li :
(define (equal-poly? P1 P2)
(cond ; x l a thc 0
((zero-poly? P1) (zero-poly? P2))
((zero-poly? P2) (zero-poly? P1))
(else; x l a thc 0
(let ((d1 (degree-poly P1))
(d2 (degree-poly P2))
(c1 (coeff-domin P1))
(c2 (coeff-domin P2))
(Q1 (remain-poly P1))
(Q2 (remain-poly P2)))
; hoc so snh hai a thc cn li trc tin theo bc v h s
(and (= d1 d2) (= c1 c2)
; v so snh hai a thc cn li c a hai a thc cn li
(equal-poly? Q1 Q2))))))
3. Php cng a thc
Khi cng hai a thc P1 v P2 cn phn bit hai trng hp :
Nu cc a thc P1 v P2 c cng bc, ch vic c ng cc n thc tr i v xem xt
trng hp chng c trit tiu ln nhau khng.
Nu cc a thc P1 v P2 khng c cng bc, tm a thc c n thc bc cao h n,
sau thc hin php cng cc a thc cn li.
(define (add-poly P1 P2)
(cond
; x l cc a thc 0
((zero-poly? P1) P2)
((zero-poly? P2) P1)
; x l cc a thc 0
(else
(let ((d1 (degree-poly P1))
(d2 (degree-poly P2))
(c1 (coeff-domin P1))
(c2 (coeff-domin P2))
(Q1 (remain-poly P1))
(Q2 (remain-poly P2)))
(cond
((= d1 d2) ; hai a thc c cng bc
(let ((c (+ c1 c2)))

K THUT X L HM

137

(if (zero? c)
(add-poly Q1 Q2)
(cons-poly
d1
c
(add-poly Q1 Q2)))))
((< d1 d2) ; hai a thc khng c cng bc
(cons-poly d2 c2 (add-poly P1 Q2)))
(else
(cons-poly d1 c1 (add-poly Q1 P2))))))))
4. Php nhn hai a thc

Gi s :
P1 = (c1xd1 + Q1) v P2 = (c2xd2 + Q2)
khi , kt qu php nhn hai a thc P1 v P2 l :
(c1xd1 + Q1) (c2xd2 + Q2) = c1c2 x(d1 + d2) + (c1xd1 + Q1) Q2 + Q1 (c2xd2 + Q2)
Hm mul-poly c xy dng nh sau :
(define (mul-poly P1 P2)
(cond ((zero-poly? P1) zero-poly)
((zero-poly? P2) zero-poly)
(else
(let
((d1 (degree-poly P1))
(d2 (degree-poly P2))
(c1 (coeff-domin P1))
(c2 (coeff-domin P2))
(Q1 (remain-poly P1))
(Q2 (remain-poly P2)))
(if (zero-poly? Q1)
; Q1 = 0
(cons-poly (+ d1 d2) (* c1 c2)
(mul-poly P1 Q2))
; Q1 0
(add-poly
(add-poly
(mul-poly
(cons-poly d1 c1 zero-poly) P2)
(mul-poly Q1 Q2))
(mul-poly Q1 P2)))))))

IV.4.3.4. Biu din trong mt a thc


By gi ta tm cch biu din hng cc a thc trong Scheme : m i a thc c biu
din bi m t danh sch cc n thc khc 0 theo th t bc gim dn. Ta ch n cch biu din
mi n thc bi mt b i nh sau :
(degree . coefficient)

Nh v y m i a thc c biu din bi mt danh sch kt hp alist. Chng hn a thc :


9x4 +27x + -10

138

LP TRNH HM

c biu din bi alist :


((4. 3) (1. 20) (0. -10))

Sau y ta xy dng cc hm to mi a thc v cc hm tip cn n cc thnh phn c a


a thc nh sau :
(define (cons-poly degree coeff Q)
(cond
((zero? coeff)
(display
Error: the coefficient cant be zero !))
((zero-poly? Q)
(list (cons degree coeff)))
(else
(cons (cons degree coeff) Q))))
(define degree-poly caar)
(define coeff-domin cdar)
(define (remain-poly Q)
(if (null? (cdr Q))
zero-poly
(cdr Q)))

car
degree

cdr
coefficient

Hnh IV.2. Biu din n thc bi b i.


i vi a thc 0 ta c th biu din ty , Chng hn :
(define zero-poly 0)
(define (zero-poly? P)
(and (number? P) (zero? P)))

IV.4.3.5. a ra a thc
nhn th y cc a thc trn mn hnh, hay trn giy in, ta c th biu din chng nh
cc k t ASCII thng d ng. Chng hn n thc axn s c biu din dng ax^n.

Sau y ta xy dng hm print-poly a ra mt a thc. Hm ny a ra lin tip


cc n thc nh g i n hm print-mono. Trong trng hp bc mt n thc l 1 th
khng in ra dng ax^1 m in ra x (m bo tnh thm m) :
(define (print-poly P)
(if (zero-poly? P)
zero-poly
(let ((c (coeff-domin P))
(d (degree-poly P))
(Q (remain-poly P)))
(print-mono d c)
(if (not (zero-poly? Q))
(begin (display +)

K THUT X L HM

139

(print-poly Q))))))
(define (print-mono degree coeff)
(cond ((zero? degree) (display coeff))
((=1 degree) (display coeff) (display x))
(else (display coeff)
(display x)
(display ^)
(display degree))))
(define P1
(cons-poly 2 9 (cons-poly 1 27 (cons-poly 0 -10 0))))
P1
--> ((2 . 9) (1 . 27) (0 . -10))
(print-poly P1)
--> 9x^2+27x+-10
(add-poly P1 P1)
--> ((2 . 18) (1 . 54) (0 . -20))
(print-poly (add-poly P1 P1))
--> 18x^2+54x+-20
(print-poly (mul-poly P1 P1))
--> 81x^4+486x^3+1278x^2+-1350x+400

Nhng x l k hiu trn cc a thc m ta va trnh by trn y thng c ng dng


trong cc h th ng tnh ton hnh thc (formal calculus).

IV.4.4.

Thut ton quay lui

Khi gii nh ng bi ton t hp (combinatorial problems) hay bi ton tr chi ch


(puzzle) ngi ta thng khng c thut ton trc tip tm ra li gii, m thng p dng
thut ton th sai (try and error). tng ca thut ton l ng i ta phi th lin tip cc
phng n, hoc dn n thnh cng v kt thc, hoc khi tht bi th phi quay lui
(backtracking) tr li phng n la ch n trc tip t c qu trnh.

IV.4.4.1. Bi ton tm qun hu


Mt v d c in l bi ton tm qun hu ( xt chng 1). Yu cu t 8 qun hu
ln bn c vua 88 lc u khng cha qun no sao cho cc qun hu khng n c ln
nhau. Li gii c tin hnh dn dn nh sau :
Gi s g i qun hu l Q, u tin t Q ti ct th nht, sau , tm cch t Q c t th
hai sao cho khng b Q c t trc n v c th tip tc cho cc ct tip theo. C th ti mt
s la ch n no khng cho php t c Q tip theo (ti ct j). Khi , ng i ta phi xem
li s la chn cui cng trc s tht bi ( ct k trc j-1) bt u li. Nu tt c
kh nng cho s la chn cui cng u tht bi, ngi ta li phi quay lui n s la ch n
trc la chn cui cng ( ct j-2), v.v...
K thut quay lui thng c minh ho bi mt cy m mi nt trong l mt trng thi
tm kim li gii v mt ng i t g c n mt l (nt ngoi) no c th l mt li gi i
ca bi ton cho.
Xut pht t nt g c c a cy, l trng thi u, c th tip cn n cc con ca n l cc
la chn c th t n trng thi tip theo. Khi i n m t nt cho bit tht bi, ngi ta

140

LP TRNH HM

phi quay ln nt cha v bt u vi nt con ch a c tip cn. Nu nh c tip cn


ht cc con m m vn tht bi, ngi ta li quay ln nt t tin (cha ca nt cha)v.v... Qu
trnh quay lui c gii quyt trong phng php tm kim theo chiu su trc (depthfirst-search algorithm).
xut pht

thnh cng
thnh cng
Hnh IV.3. Tm li gi i trn cy trng thi.
tng c a thut ton nh sau :
G i thut ton depth-first-search vi trng thi u (nt gc) bit :
Nu trng thi u l ch (goal state), kt thc thnh cng

Ngc li, tip tc cc bc sau cho n khi thnh cng hoc tht bi :
a. T trng thi u cha phi l nt thnh cng, tip cn mt trng thi k tip, gi s
g i l S. Nu khng tip cn c trng thi k tip no, ghi nhn tht bi.
b. Gi li thut ton depth-first-search vi S l trng thi u.
c. Nu thnh cng, kt thc. Ngc li, tip tc vng lp.

IV.4.4.2. Tm kim cc li gii


Ta nh ngha hm a-solution cho php tr m t trng thi cho, tr v m t li gii
k tip trng thi ny hoc #f nu tht bi. Nguyn l hot ng rt n gin nh sau :

Nu l trng thi cui cng (khng cn trng thi k tip), th l mt li gii tr


v, nu khng phi th tr v #f v xem nh tht bi.

Nu ang trng thi trung gian, lit k tt c cc trng thi k tip v bt u s la


chn m t trng thi k tip chng no cha tm ra li gii.

Gi thit ta xy dng c cc hm : hm followingstates cho php lit k tt


c cc trng thi c th tip cn n xut pht t m t trng thi cho, v t finalstate?
kim tra trng thi cu i cng, v t solution? kim tra tnh hp thc ca li gii. Trong
hm a-solution c s dng some l dng or m rng (xem IV.3.1) :
(define (a-solution state)
(if (finalstate? state)
(if (solution? state) state #f)
(some a-solution (followingstates state))))
Trong mt s trng hp, ngi ta mong mun nhn c danh sch tt c cc li gii.
Ta xy dng hm list-of-solutions bng cch g p vo danh sch ln lt cc li gi i
tip theo c th tm c nh sau :
(define (list-of-solutions state)
if (finalstate? state)

K THUT X L HM

141

(if (solution? state)


(list state) ())
(append-map
list-of-solutions
(followingstates state))))

Cui cng, ngi ta mong mu n nhn c mt s li gii ty theo yu cu ca ngi s


dng. Ta xy dng hm some-solutions da theo cch xy dng hm a-solution
nhng khi tm th y mt li gii, my yu cu ngi s dng tr li c tip tc tm li gii
khc khng. V t other-solution? dng duy tr qu trnh tm kim. Sau khi a
ra ht cc li gii tm thy, hm tr v #f.
(define (some-solutions state)
(if (finalstate? state)
(if (solution? state)
(other-solution? state)
#f)
(some-solutions (followingstates state))))
(define (other-solution? state)
(display state)
(newline)
(display Other solution (Y/N)?:)
(eq? (read) n))

Ct j
8
Q
Q
7
Q
6
5
Q
Q
4
Q
3
2
Q
1 Q
1 2 3 4 5 6 7 8

Hng i

Hnh IV.4. Mt li gii ca bi ton 8 qun hu.


Sau khi nh ngha cc hm chnh, ta cn nh ngha cc hm b tr finalstate?,
solution?, followingstates tng ng vi mt cch t chc d liu cho bi ton 8
qun hu. Trc tin ta cn tm cch biu din cc trng thi tm kim l i gii.
Bn c vua c 88 c nh s theo hng 1..8 v theo c t 1..8. Do mi ct ch t
c mt con Q, ta cn bit v tr l to hng tng ng vi mi ct ang xt. Nh vy,
mt trng thi s l mt danh sch cc s nguyn (x1,..., xk) vi xi l s th t hng c a con Q
th i t ct th i, i=1..k, k=1..8.
V d trng thi ca mt li gii c cho trong Error! Reference source not found. l
danh sch y :
(1 5 8 6 3 7 2 4)
Ngha l li gii c tm th y khi trng thi c 8 con Q v m i con Q khng th b
n bi mt con Q no khc trn bn c. T , ta nh ngha v t solution? cng l
finalstate?.

142

LP TRNH HM

(define (finalstate? state)


(= (length state) 8))
(define solution? finalstate?)
lit k cc trng thi tip theo t mt trng thi cho, ta cn xt 8 v tr l 8 hng c
th trn ct tip theo t con Q vo. V tr cho Q mi ny (newqueen) phi c ch n
sao cho khng b n bi cc Q khc trong trng thi ang xt. Ta cn xc dnh hm
admissible? kim tra nu m t v tr cho mt con Q mi l tng thch vi nhng con
Q dt trc .
Q
...
...
Q
...

Q
...
...

... Q
...

... Q

con Q mi ti mt v tr chp nhn c

Hnh IV.5. V tr chp nhn c ca m t qun hu.


Ni cch khc, khng c con Q no nm trn hng, trn c t, trn ng cho thun v
trn ng cho nghch i qua v tr ny. xy dng hm admissible?, ta cn xy dng
mt hm b tr kim tra kh nng chp nhn ca con Q mi vi mt con Q t trc
ti mt khong cch (distance) cho. Tham bin distance l khong cch gia con Q
mi v con Q trc . Cn existing-queens l danh sch trng thi ang xt.
T tng trn, v t admissible? c xy dng nh sau :
(define (admissible? newqueen existing-queens)
(letrec ((admisible-to?
(lambda (existing-queens distance)
(if (null? existing-queens)
#t
(let ((aqueen (car existing-queens)))
; kim tra ln lt tng con hu c mt trong danh sch
(and ; kim tra khng cng ng cho thun
(not (= aqueen (+ newqueen distance)))
; kim tra khng cng hng
(not (= aqueen newqueen))
; kim tra khng cng ng cho nghch
(not (= aqueen (- newqueen distance)))
; tip t c kim tra cc qun hu tip theo
(admisible-to? (cdr existing-queens)
(+ 1 distance))))))))
(admisible-to? existing-queens 1)))
V t admissible? khng kim tra hai qun hu nm trn cng c t. V tr chp nhn
c ca mt con Q c minh ho trn Error! Reference source not found. :
xy d ng danh sch cc trng thi tip theo mt trng thi t c bc trc,
hm followingstates di y tm kim v tr chp nhn c cho mt con Q mi. Nu
tm c v tr tho mn, thm to hng vo cui danh sch trng thi tr v :

K THUT X L HM

143

(define (followingstates state)


(append-map
(lambda (position)
(if (admissible? position state)
(list (cons position state))
()))
(list-1-to-n 8)))

Hm list-1-to-n c mt trong hm followingstates dng lit k danh sch


cc s nguyn t 1.. n c xy dng nh sau :
(define (list-1-to-n n)
(letrec ((loop
(lambda (k L)
(if (zero? k)
L
(loop (- k 1) (cons k L))))))
(loop n ())))
(list-1-to-n 8)
--> (1 2 3 4 5 6 7 8)

IV.4.4.3. T chc cc li gii


Nh vy, ta xy dng xong cc hm chnh v cc hm b tr tm li gii cho bi
ton 8 qun hu. Cc hm chnh l :
(a-solution state)
--> Tm mt li gii.
(list-of-solutions state)
--> Tm tt c cc li gii.
(some-solutions state)
--> Tm ln lt cc li gii theo yu cu.
Lc u, trng thi state l mt danh sch rng, sau khi tm ra li gii, danh sch c
lm y. Cc hm b tr c s dng trong cc hm trn y l :
(finalstate? state)
--> V t kim tra nu mt trng thi tng ng vi m t v tr khng th tip tc.
(solution? state)
--> V t kim tra mt trng thi l m t li gii (tng t hm finalstate?).
(followingstate state)
--> Danh sch tt c cc trng thi tip theo chp nhn c v kh nng xut pht t
m t trng thi cho.
(admissible? newqueen existing-queens)
--> V t kim tra nu v tr c a con Q mi khng b n bi cc con Q khc t ti cc
c t trc trong danh sch trng thi.

By gi ta ch y demo bi ton 8 qun hu v nhn c kt qu nh sau :


(a-solution ())
--> (4 2 7 3 6 8 5 1)

144

LP TRNH HM

(some-solutions '())
--> (4 2 7 3 6 8 5 1)
Other solution (Y/N)?:
(5 2 4 7 3 8 6 1)
Other solution (Y/N)?:
(3 5 2 8 6 4 7 1)
Other solution (Y/N)?:
(3 6 4 2 8 5 7 1)
Other solution (Y/N)?:
(5 7 1 3 8 6 4 2)
Other solution (Y/N)?:
(4 6 8 3 1 7 5 2)
Other solution (Y/N)?:
#t

y
y
y
y
y
n

S lng tt c cc li gii cho bi ton tm qun hu c tnh nh sau :


(length (list-of-solutions '()))
--> 92

Tm tt chng 4

Mt hm trong Scheme c kiu d liu procedure. kim tra tnh hp thc v


kiu ca hm, s dng v t procedure?.

M t hm Scheme cng c kiu s-biu thc, hm c th c dng lm tham i v


cng c th lm gi tr tr v ca mt hm khc.

M t hm Scheme c th c nh ngha theo cch thng thng hoc s dng php


tnh lambda.

Php tnh lambda s d ng cc quy tc biu din hm quy v cho php tnh ton trn
hm tr v kt qu.

Gi tr m t biu thc lambda l m t hm nc danh, khi s dng tnh ton cn phi cung
cp cc tham i thc s tr v kt qu.

Dng let l tng ng vi dng lambda v c th ph i hp nh ngha cc hm.

C nhiu k thut nh ngha hm : nh tch lu kt qu, tham i ho tng ph n


(currying), cc b lp v s lp, s quy v quy cc b , trao i thng ip
gia cc hm, t hp cc hm, hm c s lng tham i bt k, v.v...

K thut lp trnh hm gii quyt hiu qu thut ton quay lui p dng cho bi ton 8
qun hu.

K THUT X L HM

145

Bi tp chng 4
1. Cho bit gi tr c a :
((lambda (x y z) (+ x y z)) 1 (+ 2 5) 3)
((lambda (L) ((lambda (x) (append L (list x))) 0)) '(a))
2. Cho cc nh ngha sau :
(define (f xl x2 x3 x4)
(lambda (m) (m xl x2 x3 x4)))
(define (g i z)
(z (lambda (u v w x)
(cond ((= i 1) u)
((= i 2) v)
((= i v) w)
(else '())))))
(define x (f -2 3 4 20))
(define y (list 3 5))
(define z (cons y (list 3 5)))
Cho bit kt qu tr v c a cc li gi sau y :
(g 0 x)
(g 4 1)
(g 3 x)
(eq? (cadr z) (car y))
(eq? (car z) (cdr z))
3. Cho :
U0 =V0 =1
Un = Un-1 + Vn-1
Vn = Un-1 * Vn-1
Dng letrec tnh gi tr ca U3 *V4 ?
4. Cc hm sau y lm g ? Tm phc tp ca chng ?
(define (mystery1 L)
(if (null? L)
()
(append (mystery1 (cdr L))
(list (car L)))))
(define (mystery2 L)
(if (null? (cdr L))
(car L)
(if (> (car L) (mystery2 (cdr Ll)))
(car L)
(mystery2 (cdr L)))))
5. Cho a thc bc n h s thc (hoc nguyn) m t bin nh sau :
P(x) = a0 + a1x + a2x2 + . . . + anxn
biu din P(x) trong Scheme, ngi ta thng s dng mt danh sch cc h s theo
mt chiu :

146

LP TRNH HM

(a0, a1, a2, . . . an) hoc (an, an1,. . . a1, a0)


Hy vit trong Scheme hm (eval-pol p x) tnh gi tr c a a thc P(x) vi mt
gi tr x s d ng c hai phng php quy v phng php lp, mi phng php x l theo
hai cch biu din h s trn y.
6. Vit hm tnh su c a danh sch :
(profondeur (a (b ( c d)) e))
--> 3
7. Vit hm m s lng cc phn t c gi tr bng phn t cho :
(nb-occurrence* a (e a c a (b c a) (a a))
--> 5

8. Vit hm to danh sch ni vng cho mt danh sch cho.


9. Vit hm kim tra m t danh sch c l tin t ca mt danh sch cho.
10. Vit hm m cc phn t ca mt danh sch ni vng cho.
11. Vit y th tc xc nh danh sch con L[B..A], ngha l tm hai cn B (below), A
(above), 1 A, B N sao cho tng cc phn t c a n l tng con l n nht ca L (xem v
d mc III.4.3.1, 3).
12. Cho mt xu k t c di N, N c xem rt ln. Hy phn loi m i k t theo 4 kiu
nh sau : kiu ch thng, kiu ch hoa, kiu ch s v kiu khc (k t khng thuc ba
kiu trn) ?
13. Cho mt danh sch c N t (word) 32 bit, N c xem rt ln. Hy m s bit bng 1
trong mi t c a danh sch cho ?
14. Cho m t danh sch c N s nguyn. Hy vit cc th tc sp xp m ph ng cc thut ton
sp xp chn v chn.
15. Khi sp xp mt dy, ngi ta thng s d ng hm b tr swap(a, b) hon i gi
tr c a hai bin. Hy cho bit v sao hm sau y khng s dng c ?
(define (swap a b)
(let ((temp a))
(begin (set! a b)
(set! b temp))))
16. p d ng thut ton quay lui gii bi ton m i tun trn bn c vua 88 lc u cha
c qun no : xut pht t mt , mt qun m c th i qua ht tt c cc ca bn c,
mi i qua ng m t ln, tun theo lut c vua.
17. p dng thut ton quay lui gii bi ton qun tnh : tm cch t ti a s qun tnh
( en hoc trng) ln bn c vua 88 lc u ch a c qun no sao cho khng qun tnh
no n c qun no.

CHNG III.

KIU D LIU PHC HP ......................................................................................61

KIU CHUI.............................................................................................................................61
KIU D LIU VECT ...............................................................................................................64
KIU D LIU B I ..............................................................................................................65
III.3.1.
Khi nim tru tng ho d liu .......................................................................65
III.3.2.
nh ngha b i .....................................................................................................66
III.3.3.
t bin trn cc b i .........................................................................................68
III.3.4.
ng dng b i .......................................................................................................69

III.1
III.2
III.3

1.
2.

Biu din cc s hu t...................................................................................................................69


Biu din hnh ch nht phng.......................................................................................................72

KIU D LIU DANH SCH .......................................................................................................74


Khi nim danh sch ...............................................................................................74
ng dng danh sch................................................................................................76

III.4

III.4.1.
III.4.2.

III.4.2.1.
Cc php ton c bn cons, list, car v cdr.................................................................76
III.4.2.2.
Cc hm x l danh sch.................................................................................................79
1.
Cc hm length, append v reverse...............................................................................................79
2.
Cc hm tham chiu danh sch......................................................................................................80
3.
Cc hm chuyn i kiu ................................................................................................................81
4.
Cc hm so snh danh sch ...........................................................................................................83
III.4.2.3.
Dng case x l danh sch..............................................................................................84
III.4.2.4.
K thut quy x l danh sch phng ......................................................................86
1.
Tnh tng cc phn t ca mt danh sch ....................................................................................86
2.
Danh sch cc s nguyn t 0 n n.............................................................................................86
3.
Nghch o mt danh sch .............................................................................................................87
4.
Hm append c hai tham i..........................................................................................................87
5.
Loi b cc phn t khi danh sch...............................................................................................87
6.
Bi ton tnh tng con.....................................................................................................................88
7.
Lp danh sch cc s nguyn t ....................................................................................................88
III.4.2.5.
K thut quy x l danh sch bt k ......................................................................89
1.
Lm phng mt danh sch .............................................................................................................89
2.
Tnh tng cc s c mt trong danh sch......................................................................................89
3.
Loi b khi danh sch mt phn t cc mc khc nhau .........................................................90
4.
Nghch o danh sch.....................................................................................................................90
5.
So snh bng nhau..........................................................................................................................91

III.4.3.

Biu din danh sch ................................................................................................92

III.4.3.1.
Biu din danh sch bi kiu b i .............................................................................92
III.4.3.2.
Danh sch kt hp.............................................................................................................96
1.
Khi nim danh sch kt hp .........................................................................................................96
2.
S dng danh sch kt hp............................................................................................................97
III.4.3.3.
Dng quasiquote................................................................................................................98

III.4.4.
1.
2.
3.
4.
5.

CHNG IV.

Mt s v d ng dng danh sch ........................................................................99


Tm phn t cui cng ca danh sch ...........................................................................................99
Lit k cc v tr mt k hiu c trong danh sch........................................................................100
Tm tng con ln nht trong mt vector......................................................................................100
Bi ton sp xp dy vin bi ba mu ...........................................................................................101
Sp xp nhanh quicksort...............................................................................................................102

K THUT X L HM........................................................................................... 107

S DNG HAM ............................................................................................................................ 107


Dng tn hm lm tham i .................................................................................... 107
p dng hm cho cc phn t ca danh sch .................................................... 110
Kt qu tr v l hm ................................................................................................ 112
IV.2 PHEP TINH LAMBDA ................................................................................................................... 113
IV.2.1. Gii thiu php tnh lambda .................................................................................... 113
IV.2.2. Biu din biu thc lambda trong Scheme ......................................................... 114
IV.2.3. nh ngha hm nh lambda ................................................................................... 115
IV.2.4. K thut s dng phi hp lambda ....................................................................... 117
IV.2.5. nh ngha hm nh tch lu kt qu .................................................................... 120

IV.1

IV.1.1.
IV.1.2.
IV.1.3.

147

148

Error! Reference source not found.


1.
2.
3.
4.
5.

Tnh tng gi tr ca mt hm p dng cho cc phn t danh sch..........................................120


Tnh tch gi tr ca mt hm p dng cho cc phn t danh sch ...........................................120
nh ngha li hm append ghp hai danh sch ........................................................................120
nh ngha li hm map cho hm mt bin h ..............................................................................120
nh ngha cc hm fold ............................................................................................................122

IV.2.6.
IV.2.7.

Tham i ho tng phn .......................................................................................... 122


nh ngha quy cc b ......................................................................................... 123

IV.3

X L TRN CC HM ................................................................................................................. 125


Xy dng cc php lp .............................................................................................. 125

IV.3.1.
1.
2.
3.

Hm append-map..........................................................................................................................125
Hm map-select.............................................................................................................................126
Cc hm every v some ................................................................................................................126

IV.3.2.
IV.3.3.
IV.3.4.

Trao i thng ip gia cc hm.......................................................................... 127


T hp cc hm ........................................................................................................... 129
Cc hm c s lng tham i bt k ................................................................... 130

IV.4

MT S V D ............................................................................................................................. 132
Phng php xp x lin tip................................................................................... 132
To th tc nh dng ............................................................................................... 133
X l a thc................................................................................................................ 134

IV.4.1.
IV.4.2.
IV.4.3.

IV.4.3.1.
nh ngha a thc..........................................................................................................134
IV.4.3.2.
Biu din a thc.............................................................................................................134
IV.4.3.3.
X l a thc.....................................................................................................................135
1.
Nhn a thc vi mt hng s .....................................................................................................135
2.
So snh hai a thc.......................................................................................................................136
3.
Php cng a thc ........................................................................................................................136
4.
Php nhn hai a thc..................................................................................................................137
IV.4.3.4.
Biu din trong mt a thc.........................................................................................137
IV.4.3.5.
a ra a thc .................................................................................................................138

IV.4.4.

Thut ton quay lui .................................................................................................... 139

IV.4.4.1.
IV.4.4.2.
IV.4.4.3.

Bi ton tm qun hu...................................................................................................139


Tm kim cc li gii .......................................................................................................140
T chc cc li gii..........................................................................................................143

CHNG V.

CU TRC D LIU

a bit rng vic lp trnh ph thuc phn ln vo cch m hnh ho d liu ca bi ton
cn gii. Mi quan h gia thut ton v cu trc d liu trong lp trnh c
Niclaus Wirth, tc gi ngn ng lp trnh Pascal, a ra mt cng thc rt ni ting :
Cu trc d liu + Thut ton = Chng trnh
(Data structure + Algorithms = Programs)

Nh thy, thut ton mi ch phn nh cc thao tc cn x l, cn i tng x l


trong my tnh li l d liu. Ni n thut ton l ni n thut ton tc ng ln d liu
no. Cn ni n d liu l ni n d liu y cn c tc ng bi thut ton no a
n kt qu mong mun. D liu biu din thng tin cn thit gii bi ton, gm d liu
a vo, d liu a ra v d liu tnh ton trung gian. Mt cu trc d liu lin quan n ba
yu t : kiu d liu, cc php ton tc ng ln d liu v cch biu din d liu trong b
nh ca my tnh tu theo cng c lp trnh.
Trong chng ny, chng ta s trnh by mt s cu trc d liu tiu biu nh tp hp,
ngn xp, danh sch mc ni, cy...

V.1

Tp hp

Trong ton hc, tp hp (set) l mt nhm hay mt b su tp cc i tng1 phn bit


{x1, x2, , xn}, c gi l cc phn t (elements) ca tp hp. Do mi phn t ca mt tp
hp ch c lit k mt ln v khng c sp xp th t nn ngi ta khng ni n phn
t th nht, phn t th hai, v.v... V d hai tp hp sau y l ng nht :
{ a, b, d, a, d, e, c, d } = { a, b, c, d }
Do tp hp cng l mt danh sch, ngi ta c th s dng cu trc danh sch biu
din tp hp trong Scheme. Nh vy, mt tp hp rng l mt danh sch rng. so snh hai
tp hp c bng nhau khng, ta c th s dng v t equal? nh sau :
(define (setequal? E1 E2)
(cond ; hai tp hp rng th bng nhau
((and (null? E1) (null? E2)) #t)
; hai tp hp c hai phn t u tin bng nhau
1

Khi nim i tng ca tp hp c tnh trc gic, do nh ton hc ngi c G. Cantor a ra t nm 1985.
n nm 1902, nh trit hc ngi Anh B. Russell ch ra nhng nghch l ton hc (paradox) hay nhng
mu thun lgic trong l thuyt tp hp.

147

148

LP TRNH HM

((equal? (car E1) (car E2))


(setequal? (cdr E1) (cdr E2)))
; hai tp hp c hai phn t u tin khc nhau th khc nhau !!!
(else #f)))
(setequal? (1 3 4 5 6) (1 3 4 5 6))
--> #t
hoc :
(define E1 (a b c d e))
(define E2 E1)
(setequal? E1 E2)
--> #t
rng trong v t setequal? trn y, ta cha x l hai tp hp c cc phn t
ging y nhau v c cng s phn t, nhng khng c sp xp th t nh nhau :
(setequal? '(1 5 4 3 6) '(1 3 4 5 6))
--> #f
Sau y ta s s dng thng xuyn hm member x l tp hp. Hm ny kim tra
mt phn t c thuc mt danh sch cho hay khng :
; Trng hp phn t kim tra c kiu n gin
(member c (a b c d e))
--> (c d e)
; Trng hp phn t kim tra c kiu phc hp
(member (list a) (b (a) c))
--> ((a) c)
V t in? kim tra mt phn t c thuc mt tp hp cho hay khng ?
(define (in? x E)
(cond ((null? E) #f) ; danh sch rng
((member x E) #t) ; x l phn t kiu n gin
(else (in? x (cdr E))))) ; x l phn t kiu phc hp
(in? c E1)
--> #t
xy dng mt tp hp t mt danh sch, ngi ta phi loi b cc phn t trng lp.
Hm list->set sau y s dng hm member ln lt kim tra cc phn t ca danh
sch cho. Kt qu tr v ch gi li phn t cui cng i vi nhng phn t trng nhau v
cha sp xp li cc phn t theo th t (xem phng php sp xp nhanh cui chng).
(define (list->set L)
(cond ((null? L) ())
((member (car L) (cdr L))
(list->set (cdr L)))
(else (cons (car L)
(list->set (cdr L)))))
(list->set (a b d a d e c d))
--> (b a e c d)
(define (union2 E1 E2)
(cond ((null? E1) E2)

CU TRC D LIU

149

((member (car E1) E2) (union2 (cdr E1) E2))


(else (cons (car E1) (union2 (cdr E1) E2)))))
1. Php hp trn cc tp hp
Gi s cho hai tp hp E1 v E2, ta cn tm kt qu ca php hp ca hai tp hp E1E2 l
mt tp hp nh sau :
(define (union2 E1 E2)
(cond ; tp hp th nht l rng th kt qu l tp hp th hai
((null? E1) E2)
; nu tp hp th nht c phn t thuc tp hp th hai th b qua
((member (car E1) E2) (union2 (cdr E1) E2))
; tip tc sau khi gim kch thc tp hp th nht
(else (cons (car E1) (union2 (cdr E1) E2)))))
(union2 (1 2 3 7) (2 3 4 5 6))
--> (1 7 2 3 4 5 6)
M rng php hp ca hai tp hp, ta xy dng php hp trn cc tp hp bt k bng
cch s dng hm list-it c nh ngha chng trc :
(define (union . Lset)
(list-it union2 Lset ()))
(union (1 2 3 4) (2 3 4 5 6) (4 5 6 7) (6 7 8))
--> (1 2 3 4 5 6 7 8)
2. Php giao trn cc tp hp
Tng t cch xy dng php hp trn cc tp hp bt k, trc tin ta xy dng php
giao ca hai tp hp E1E2 nh sau :
(define (intersection2 E1 E2)
(cond ; nu mt tp hp l rng th kt qu cng rng
((null? E1) E1)
; chn ra phn t nm c hai tp hp
((member (car E1) E2) (cons (car E1)
(intersection2 (cdr E1) E2)))
; tip tc sau khi gim kch thc tp hp th nht
(else (intersection2 (cdr E1) E2))))
(intersection2 (1 2 3 4)(2 3 4 5 6))
--> (2 3 4)
M rng php giao ca hai tp hp, ta xy dng php giao trn cc tp hp bt k bng
cch s dng hm apply c nh ngha mc Error! Reference source not found. :
(define (intersection . Lset)
(cond ; giao ca cc tp hp rng cng l rng
((null? Lset) ())
; giao ca mt tp hp l chnh n
((null? (cdr Lset)) (car Lset))
; a v thc hin php giao ca hai tp hp
(else (intersection2
(car Lset)
(apply intersection (cdr Lset))))))

150

LP TRNH HM

(intersection (1 2 3 4) (2 3 4 5 6) (4 5 6 7))
--> (4)
3. Php hiu ca hai tp hp
Cho hai tp hp E1 v E2, ta nh ngha php hiu ca hai tp hp E1\E2 nh sau :
(define (difference E1 E2)
(cond ; nu E2 rng th kt qu l E1
((null? E2) E1)
; nu E1 rng th kt qu l rng
((null? E1) ())
; nu E1 c phn t thuc E2 th b qua
((member (car E1) E2)
(difference (cdr E1) E2))
; tip tc sau khi gim kch thc tp hp E1
(else (cons (car E1)
(difference (cdr E1) E2)))))
(difference (1 2 3 4 5) (1 2))
--> (3 4 5)
4. Tm cc tp hp con ca mt tp hp
Cho trc tp hp E, ta cn tm tp hp tt c cc tp hp con (sub-set) ca E, k hiu 2E.
Chng hn cho E={ a, b, c } th 2 E ={ , {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}} c tt c
8 phn t bao gm tp hp rng v bn thn tp hp E.
Nu tp hp E rng, th 2E cng rng. Nu E khc rng, xt mt phn t aE, khi c
cc tp hp con cha a v cc tp hp con khng cha a. u tin xy dng tp hp E\{a},
sau , chn a vo tt c cc tp hp con ca E\{a}. Ta c hm subset nh sau :
(define (subset E)
(if (null? E)
(list ())
(let ((Lremain (subset (cdr E))))
(append Lremain
(map (lambda (L)
(cons (car E) L))
Lremain)))))
(subset (a b c))
--> (() (c) (b) (b c) (a) (a c) (a b) (a b c))

V.2

Ngn xp

Danh sch kiu ngn xp (stack), cn c gi l chng (tng t mt chng a,


mt bng n...), l mt cu trc d liu m php b sung hay loi b mt phn t lun lun
c thc hin mt u gi l nh (top). Nguyn tc hot ng vo sau ra trc ca
ngn xp dn n mt tn gi khc l danh sch kiu LIFO (Last In First Out).
Ngn xp c s dng rt ph bin trong tin hc. Hnh V.1. minh ho hot ng ca mt
ngn xp khi thc hin th tc quy tnh n!.

CU TRC D LIU

V.2.1.

151

Kiu d liu tru tng ngn xp

Sau y l c t cu trc d liu tru tng kiu ngn xp :


Types Stack(T)
functions
empty-stack :
Stack(T)
empty-stack?
: Stack(T) boolean
push-stack : T Stack(T)
Stack(T)
pop-stack : Stack(T)
-/ Stack(T)
top-stack : Stack(T)
-/ T
preconditions
pop-stack(s: Stack(T))
ch xc nh khi v ch khi (not empty-stack?(s))
top-stack(s: Stack(T))
ch xc nh khi v ch khi (not empty-stack?(s))
axioms
var x: T, s : Stack(T)
empty-stack?(empty-stack) = true
empty-stack?(push-stack (x, S)) = false
pop-stack(push-stack (x, S)) = S
top-stack(push-stack (x, S)) = x

fac(0)=1

fac(3)=?
fac(3)= ?

fac(1)=?

1*fac(0)

fac(2)=?

2*fac(1)

2*fac(1)

3*fac(2)

3*fac(2)

3*fac(2)

fac(3)=3*fac(2) fac(2)=2*fac(1) fac(1)=1*fac(0)

1*1
2*fac(1)

2*1

3*fac(2)

3*fac(2)

fac(1)= 1

fac(2)=2*1=2

3*2
fac(3)= 3*2

6
fac(3)= 6

Hnh V.1. Hot ng ca ngn xp thc hin th tc quy tnh n!.


Ta cn xy dng cc hm Scheme thao tc trn ngn xp nh sau :
(empty-stack? (empty-stack))
-- #t

152

LP TRNH HM

(empty-stack? (push-stack x S))


-- #f
(pop-stack (push-stack x S))
--> S
(top-stack (push-stack x S)
--> x

V.2.2. Xy dng ngn xp

b)

...

S
a)

C nhiu cch biu din cu trc d liu kiu ngn xp trong Scheme. Phng php t
nhin hn c l biu din ngn xp di dng mt danh sch m cc thao tc b sung v loi
b mt phn t c thc hin mt u danh sch. Trong Scheme, mi ln b sung mt
phn t vo danh sch ko theo vic to ra mt b i (dotted pair) mi.

Hnh V.2. Hot ng b sung (a) v loi b (b) mt phn t ca ngn xp.
Ta c cc hm Scheme nh sau :
(define (empty-stack) ())
(define empty-stack? null?)
(define (push-stack x S)
(cons x S))
(define (pop-stack S)
(if (empty-stack? S)
(display ERROR: stack is empty!)
(cdr S)))
(define (top-stack S)
(if (empty-stack? S)
(display ERROR: stack is empty!)
(car S)))
Ta thy cc thao tc trn ngn xp tng t i vi danh sch. Sau y l mt s v d
minh ho thao tc trn ngn xp s dng cc hm c ph hp vi ca1c tin trong c t
trn y :
(empty-stack? (push-stack 'a (empty-stack)))
--> #f
(pop-stack (push-stack a (1 2 3)))
--> (1 2 3)

CU TRC D LIU

153

(pop-stack (push-stack a (1 2 3)))


--> (1 2 3)
(top-stack (push-stack a (1 2 3)))
--> a
(top-stack (pop-stack
(push-stack 1 (pop-stack
(push-stack 2 (push-stack 3 (pop-stack
(push-stack 4 (push-stack 5
(empty-stack))))))))))
--> 3

V.2.3. Xy dng trnh son tho vn bn


Sau y l mt v d n gin minh ho ng dng ngn xp xy dng mt trnh son
tho n gin cho php thc hin vo ra tng dng vn bn mt. Hot ng nh sau : hm
nhn dng vo l mt tham bin lu gi trong mt vng nh trung gian (buffer). Dng vo
cha cc k t hn hp m mt k t no c th l mt lnh son tho (edit command).
C bn loi k t nh sau :
Cc k t khc ba k t #, $ v newline u l k t vn bn c lu gi trong
vng nh trung gian.
K t # dng xo k t ng trc trong vng nh trung gian.

K t $ dng xo tt c k t trong vng nh trung gian.

K t qua dng newline kt thc mt dng vo v a ni dung vng nh trung


gian ln mn hnh.

Ta s s dng mt ngn xp biu din vng nh trung gian. Trong chng trnh c s
dng mt hm cc b loop c cc k t lin tip t dng vo. Ch s i l k t ang c
th i.
(define (lineeditor str)
(let ((L (string-length in-str)))
(letrec ((loop
(lambda (i buffer)
(if (< i L)
(let ((readchar (string-ref in-str i)))
(case readchar
((#\#) (loop (+ i 1) (pop-stack buffer)))
((#\$) (loop (+ i 1) (empty-stack)))
((#\.) (map (display (reverse buffer)))
(else (loop (+ i 1)
(begin
(display "ERROR: dot is the end of
command!")
(newline))))))
(loop 0 (empty-stack)))))
(lineeditor "XY$abce#def.")
--> abcdef

154

LP TRNH HM

Ngi c c th pht trin trnh son tho trn y x l cc tnh hung son tho vn
bn phc tp hn.

V.2.4. Ngn xp t bin


Ta mun rng hot ng ca ngn xp gn gi vi cc chng (pile) hn, ngha l vic b
sung loi b phn t ch lin quan n mt chng ta c th gn cho bin. Ta xy dng kiu
d liu tru tng ngn xp t bin (mutable stack) Stack!(T) (sau tn c mt du chm
than) nh sau :
Types Stack!(T)
functions
empty-stack!
empty-stack!?
push-stack!
pop-stack!
top-stack!

:
:
:
:
:

Stack!(T)
Stack!(T)
boolean
T Stack!(T) Stack!(T)
Stack!(T)
-/ T
Stack!(T)
-/ T

phn bit vi cc ngn xp xt, ta thm vo sau cc tn kiu v hm mt du chm


than ! tng t cc t bin. im hot ng khc bit ca ngn xp t binl sau khi loi
b mt phn t th hm tr v phn t trn nh.
Trong chng trc, khi xt mi trng lm vic ca Scheme, ta thy rng khng th s
dng lnh set! thay i ni dung ca ngn xp chng hn nh :
(define (push-stack x s)
(set! s (cons x s)) s)
Ta phi p dng tnh cht t bin ca cc danh sch, bng cch biu din ngn xp rng
(empty stack) bi mt danh sch khc rng sau thay i bi cdr.
(define (empty-stack!) (list stack!))
(define (empty-stack!? S)
(and (pair? S)
(null? (cdr S))
(eq? stack! (car S))))
(define S1 (empty-stack!))
S1
; xem ni dung ca ngn xp
--> (stack!)
(empty-stack!? S1)
--> #t
b sung (push) v loi b (pop) trn ngn xp S, ta gi thit rng bin S lun lun tr
n cng mt b i. Tt c cc thao tc vt l c thc hin nh lnh cdr nh minh ho
trong hnh di y.
Lc ngn xp rng, danh sch S ch cha phn t stack!. Sau khi b sung phn t
bob th phn t ny ng th hai (ngay sau stack!) trong danh sch S.
Ta xy dng hm nh sau :
(define (push-stack! x S)
(set-cdr! S (cons x (cdr S))))

CU TRC D LIU

155

(push-stack! ann S1)


(push-stack! bob S1)
(push-stack! jim S1)

...

stack!

bob
Hnh V.3. Hot ng b sung mt phn t vo ngn xp.
Ta tip tc xy dng hm xem v loi b phn t nh ca ngn xp :
(define (top-stack! S)
(if (empty-stack!? S)
(begin
(display "ERROR: stack! is empty!")
(newline))
(cadr S)))
(top-stack! S1)
--> 'jim
(define (pop-stack! S)
(if (empty-stack!? S)
(begin
(display "ERROR: stack! is empty!") (newline))
(let ((top (cadr S)))
(set-cdr! S (cddr S))
top)))
(pop-stack! S1)
--> 'jim
(top-stack! S1)
--> bob

Thao tc vt l php loi b c minh ho nh sau :


...

stack!
Hnh V.4. Hot ng loi b mt phn t khi ngn xp.
Sau y l mt cch khc s dng k thut truyn thng ip xy dng cc hm x l
cu trc d liu kiu ngn xp trong Scheme.
(define (make-empty-stack!)
(let ((content '()))
(lambda (message . Largt)
(case message

156

LP TRNH HM

((empty-stack!?) (null? content))


((push-stack!)
(set! content
(cons (car Largt) content)) content)
((pop-stack!)
(if (null? content)
(begin
(display "ERROR: stack is empty!")
(newline))
(let ((top (car content)))
(set! content (cdr content))
top)))
((top-stack!)
(if (null? content)
(begin
(display "ERROR: stack is empty!")
(newline))
(car content)))))))
; Kim tra ngn xp rng nh thng ip empty-stack!?
(define (empty-stack!? S) (S empty-stack!?))
; B sung mt phn t vo ngn xp nh thng ip push-stack!
(define (push-stack! x S) (S push-stack! x))
; Loi b mt phn t khi ngn xp nh thng ip pop-stack!
(define (pop-stack! S) (S pop-stack!))
; X l phn t nh ca ngn xp nh thng ip top-stack!
(define (top-stack! S) (S top-stack!))
; nh ngha mt ngn xp mi
(define S2 (make-empty-stack!))
(empty-stack!? S2)
--> #t
(push-stack! ann S2)
--> (ann)
(push-stack! bob S2)
--> (bob ann)
(push-stack! jim S2)
--> (jim bob ann)
(top-stack! S2)
--> jim
(pop-stack! S2)
--> jim
(top-stack! S2)
--> bob

V.2.5. Tnh biu thc s hc dng hu t


Mt biu thc s hc thng c vit di dng trung t, chng hn :

CU TRC D LIU

(9 + 2) *

157

52

Tuy nhin, trong b nh, cc biu thc c biu din dng cy (ta s xt cu trc cy
trong mc tip theo). Khi tnh ton, biu thc s hc dng cy nh phn (cho cc php ton
hay hm, gi chung l ton t, c ti a hai ton hng) c a ra thnh mt chui k t
dng hu t (dng k php Ba Lan) nh sau :

9 2 + 52
*
Lc ny cc du ngoc khng cn na do cc biu thc dng hu t thng khng nhp
nhng (un-ambiguous). Khi c biu thc t tri qua phi, ta gp cc ton hng trc khi gp
mt ton t. Nu p d ng ton t ny cho cc ton hng trc , ta nhn c m t kt qu
l m t ton hng mi v qu trnh tip t c theo ng ch vo trc ra sau. Do vy,
ngi ta s d ng m t ngn xp m phng qu trnh tnh ton biu thc : cc ton hng
(c c t biu thc hu t, ln lt t tri qua phi) c y vo ngn xp cho n khi
gp ton t. Thc hin php ton vi cc ton hng ly ra t ngn xp ri li y kt qu
vo ngn xp cho n khi ht biu thc v ly kt qu nm nh ngn xp.
Sau y ta xy dng hm tnh mt biu thc s hc dng hu t (ngi c c th tm c
cc gio trnh Cu trc d liu v thut ton hiu chi tit h n). Chng trnh s dng
ngn xp t bin x l cc php ton s hc +, -, *, / v hm sqrt :
(define (evaluation postfix-expr)
(let ((pile (make-empty-stack!)))
(letrec ((compute
(lambda (exp)
(if (null? exp)
(top-stack! pile)
(let ((s (car exp)))
(if (number? s)
(push-stack! s pile)
(begin
(case s
((sqrt)
(let ((v (pop-stack! pile)))
(push-stack! (sqrt v) pile)))
((+)
(let ((v2 (pop-stack! pile))
(v1 (pop-stack! pile)))
(push-stack! (+ v1 v2) pile)))
((*)
(let ((v2 (pop-stack! pile))
(v1 (pop-stack! pile)))
(push-stack! (* v1 v2) pile)))
((-)
(let ((v2 (pop-stack! pile))
(v1 (pop-stack! piler)))
(push-stack! (- v1 v2) pile)))
((/)
(let ((v2 (pop-stack! pile))
(v1 (pop-stack! pile)))
(push-stack! (/ v1 v2) pile))))
(compute (cdr exp)))))))))
(compute postfix-expr))))

158

LP TRNH HM

(evaluation (9 2 + 52 sqrt *))


--> 79.3221

V.3

Tp

V.3.1. Cu trc d liu tru tng kiu tp


Cu trc d liu kiu tp (file) m ph ng mt hng i (queue) c ch hot ng theo
kiu vo trc ra trc FIFO (First In First Out). Lc ny php b sung c thc hin
cu i hng (ui), v php loi b c thc hin u hng :
Loi b

u hng

B sung

Cui hng

Hnh V.5. M phng cu trc d liu kiu tp tng t mt hng i.


Ta xy dng File(T) cu trc d liu tru tng kiu tp c cc phn t kiu T bt k c a
Scheme nh sau :
Types File(T)
functions
empty-file :
File(T)
empty-file? : File(T)
boolean
push-file : T File(T) File(T)
pop-file
: File(T)
File(T)
top-file
: File(T)
T
axioms
var s: T, F: File(T)
empty-file?(empty-file) = true
empty-file?(push-file (s, F)) = false
top-file(push-file (s, F)) =
if empty-file?(F) then s else top-file(F))
pop-file(push-file(s, F) =
if empty-file?(F)
then empty-file
else push-file(s, pop-file(F))

Sau y ta xy dng cc hm x l tp s dng kiu danh sch ca Scheme. Vic b sung


phn t c thc hin cu i danh sch v vic loi b thc hin u danh sch.
(define (empty-file) ())
(define empty-file? null?)
(define (push-file s F)
(append F (list s)))
(define (pop-file F)
(if (empty-file? F)

CU TRC D LIU

159

(begin
(display "ERROR: file is empty!")
(newline))
(cdr F)))
(define (top-file F)
(if (empty-file? F)
(begin
(display "ERROR: file is empty!")
(newline))
(car F)))

Ta nhn thy rng vic s dng danh sch l khng hp l khi kch thc tp tng ln v
lnh appenf trong hm push-file s gy ra chi ph tnh ton ln.

V.3.2. V d p dng tp
Sau y ta xt m t v d p d ng cu trc d liu kiu tp va xy dng. Gi s cho trc
mt danh sch L gm cc s nguyn tng ngt v mt s nguyn N, ta cn tnh s lng cc
cp s (x, x + N) vi x v N c mt trong danh sch.
Chng hn nu L = (0 2 3 4 6 7 8 9 10 12 13 14 16 20) v N = 8, th ta tm m c b n
cp s tho mn nh sau : (2, 10), (4, 12), (6, 14) v (12, 20).
Phng php n gin nht c tnh trc quan l vi mi s x ly t L, tin hnh tm kim
cc s x + N trong L . Tuy nhin ph ng php ny c chi ph ln v ta phi duyt qua duyt
li nhiu ln danh sch L. Sau y l phng php ch cn duyt mt ln danh sch L.
Ta s dng tp F c di < N v kim tra mi phn t x ca F :
Nu tp F rng th ta ch vic thm vo phn t x.
Nu top l ph n t u tp v x > top + N, ta chc chn r ng ta khng th cn tm c
phn t y no c a F m y = top + N v do vy ta phi loi b F.
Nu x = top + N, ta lo i b x khi L thm x vo F v m cp tho mn (x, top).
Nu x < top + N, ta ch loi b x khi L thm x vo F.
Ch ng trnh Scheme nh sau :
(define (pair-count L N)
(letrec ((count
(lambda (L result F)
(cond ((null? L) result)
((empty-file? F)
(count
(cdr L)
result
(push-file (car L) F)))
(else
(let
((difference (- (car L) (top-file F))))
(cond
((< N difference)
(count L result (pop-file F)))
((= N difference)

160

LP TRNH HM

(count
(cdr L)
(+ result 1)
(pop-file (push-file (car L) F))))
(else
(count
(cdr L)
result
(push-file (car L) F))))))))))
(count L 0 (empty-file))))
(pair-count '(0 2 3 4 6 7 9 10 12 13 14 16 20) 8)
--> 4

V.3.3. Tp t bin
Gi s gi File !(T) cu trc d liu kiu tp t bin (mutable file), ta c t kiu tru
tng nh sau :
Types File!(T)
functions
empty-file :
File!(T)
empty-file!?
: File!(T) boolean
push-file! : T File!(T)
File!(T)
pop-file! : File!(T)
File!(T)
top-file! : File!(T)
- T
axioms
var s: T, F: File!(T)
empty-file!?(empty-file!) = true
empty-file!?(push-file! (s, F)) = false
top-file!(push-file! (s, F)) =
if empty-file!?(F) then s else top-file!(F))
if empty-file!?(F)
then pop-file!(push-file!(s, F) = s
if not (empty-file!?(F))
then pop-file!(push-file!(s, F) =
push-file!(s, pop-file!(F))

Ta c th p dng k thut xy dng cc ngn xp t bin cho cu trc d liu kiu tp


t bin. Ta s khng s d ng lnh append b sung phn t mi vo tp m s d ng mt
con tr tr n ui c a tp. Vi cch xy dng ny, di tp s khng bit gi hn.
Nh vy, cu trc tp c dng m t b i (dotted pair) m thnh phn car tr n danh
sch cc phn t l n i dung tp, cn thnh phn cdr tr n phn t b i cu i cng c a
danh sch ny.
(define (empty-file!)
(cons '() '()))
(define (empty-file!? file)
(null? (car file)))

CU TRC D LIU

161

(define (push-file! s file)


(let ((doublet (cons s '())))
(if (null? (car file))
(set-car! file doublet)
(set-cdr! (cdr file) doublet))
(set-cdr! file doublet)))
ann

bob

u tp

jim

ui tp

file
a) N i dung tp (ann bob jim)

file
b) Tp r ng

Hnh V.6. Hot ng loi b mt phn t khi ngn xp.


(define (top-file! file)
(if (empty-file!? file)
(begin
(display "ERROR: file is empty!")
(newline))
(caar file)))
(define (pop-file! file)
(if (empty-file!? file)
(begin
(display "ERROR: file is empty!")
(newline))
(begin (set-car! file (cdar file)))))

Sau y l vn dng xy dng tp c ni dung (ann bob jim) :


(define F (empty-file!))
(empty-file!? F)
#t
(push-file! jim F)
(push-file! bob F)
(push-file! ann F)
(top-file! F)
--> jim
(pop-file! F)
(top-file! F)
--> bob

162

V.4

LP TRNH HM

Cy

Cy (tree) gm mt tp hp nt (node) c t chc theo kiu phn cp. Nu cy khng


c nt no th c gi l cy rng (empty tree).
Khi cy khc r ng, nt trn cng, cao nht, l nt gc (root node). Pha di nt gc c
th c nhiu nt con (child node) ni vi n bi cc cnh (edge). Lc ny, nt gc l nt cha
(father node). M i nt con li c th l mt nt cha c nhiu nt con ni vi n, v c th tip
t c. Phn cy to ra t m t nt con bt k l cy con (subtree).
Nhng nt mc thp nht khng c nt con no ni vi n l l (leaf) hay nt ngoi
(exterior node). Mt nt khng phi l l l nt trong (interior node). Cc nt con c cng cha
l cc nt anh em (siblings). Mi nt c a cy c m t cha duy nht (tr nt gc), l hu du
hay con chu (descendant) c a nt gc v l t tin (ancestor) ca cc nt l. M t nhnh
(branch) hay m t ng i (path) l tp hp cc nt v cc nhnh xut pht t mt nt n
mt nt khc.
Trong ton hc, cy l mt th (graph) lin thng khng c chu trnh. Trong m t cy,
lun lun tn ti duy nht mt ng i t nt g c n m t nt bt k, hoc gia hai nt no
cho. Nh v y, m t cy c th rng, hoc ch c mt nt g c, hoc g m m t nt gc v
mt hoc nhiu cy con.
Cu trc cy c ng dng nhiu trong tin h c : t chc th mc ca cc h iu hnh
Unix, MS-DOS, ..., mt chng trnh Scheme, cy gia ph, ...

Gc

Cnh

Nt trong
L
(nt ngoi)

Cy con g c b f

ng i
t a n h,
qua e

Hnh V.7. Hnh nh cy.

Sau y ta s xt cch Scheme x l cc cu trc d liu dng cy, trc tin l cy nh


phn (binary tree), loi cy m mi nt cha ch c th c ti a hai nt con.

V.4.1.
V.4.1.1.

Cy nh phn
Kiu tru tng cy nh phn

Cho trc m t kiu d liu c s T l mt kiu d liu bt k. Cy nh phn kiu T c


nh ngha nh sau :
1. 0 (s khng) l m t cy nh phn kiu T, c g i l cy rng.
2. Nu E l mt phn t kiu T, A1 v A2 l nhng cy nh phn kiu T,
th b ba (E, A1, A2) c ng l nh ng cy nh phn kiu T .
3. Ch nhng i tng c nh ngha bi hai quy tc trn y mi l cc cy nh phn
kiu T.

CU TRC D LIU

163

Nu A = (E, A1, A2) l cy nh phn, th E l nt gc, A1 l cy con bn tri, A2 l cy


con bn phi c a A. Nu A l cy suy bin ch gm mt nt, th nt lun lun l nt g c
ca mt cy con. Ngi ta cn g i A l cy c gn nhn (labelled tree, hay tag tree) bi
cc gi tr trong T. Hnh di y minh ho hai cy nh phn, m t cy biu din biu thc s
hc x+(y-3*z)/4 v m t cy biu din m t s-biu thc nh sau :
+

define

4
quote

cons

a ) x + (y 3*z)/4

quote

a
b
b ) (define L (cons a b))

Hnh V.8. Hai cy nh phn biu din :


a) biu thc s hc ; b) biu thc Scheme.

Ch s lch i x ng c a nh ngha : nu A khng phi l cy r ng, th cy (E, A, 0)


khc vi cy (E, 0, A). Cn phn bit m t nt vi mt gi tr gn cho nt . Cc nt lun
lun ri (phn bit) nhau, cn cc gi tr th c th ging nhau. V d, cy biu din s-biu
thc c a Scheme trong hnh V.9.(b) trn c 7 nt, trong khi ch c 6 gi tr phn bit
nhau gn cho chng. Ng i ta a ra nm loi cy nh phn c bit nh sau :
1. Cy suy thoi (degenerated hay filiform tree) mi nt ch c ng mt con khng rng.
2. Cy hnh lc tri (left comb) c mi con bn phi l mt l.
Cy hnh lc phi (right comb) c m i con bn tri l mt l.
3. Cy y (complete tree) c m i mc ca cy u c lm y
4. Cy hon thin (perfect tree) m i mc ca cy u c lm y, tr mc cu i cng,
nhng cc l l bn tri nht c th.
5. Cy y a phng mi nt c t 0 n 2 con.
Gi s BinTree (T) cu trc d liu kiu cy nh phn, ta c t kiu tru tng nh sau :
Types BinTree (T)
functions
empty-tree : BinTree(T)
empty-tree? : BinTree(T) boolean
create-tree : T BinTree(T) BinTree(T) BinTree(T)
root
: BinTree(T) T
left
: BinTree(T) BinTree(T)
right
: BinTree(T) BinTree(T)
leaf?
: BinTree(T) boolean (c th khng cn)
preconditions
root(A) ch c xc nh nu v ch nu A empty-tree
left(A) ch c xc nh nu v ch nu A empty-tree
right(A) ch c xc nh nu v ch nu A empty-tree
leaf?(A) ch c xc nh nu v ch nu A empty-tree
axioms
empty-tree?(empty-tree) = true

164

LP TRNH HM

empty-tree?(create-tree(E, A1, A2))


= false
root(create-tree(E, A1, A2)) = E
left(create-tree(E, A1, A2)) = A1
right(create-tree(E, A1, A2)) = A2
leaf?(A) <=> empty-tree?(left(A)) v empty-tree?(right(A))

V.4.1.2.

Biu din cy nh phn

1. Biu din tit kim s dng hai php cons


; nh ngha cy rng :
(define empty-tree ())
; hoc
(define empty-tree (list))
; nh ngha v t kim tra cy c r ng khng :
(define empty-tree? null?)
; nh ngha cy khc r ng (E, A1, A2) :
(define (create-tree E A1 A2)
(cons E (cons A1 A2)))
; nh hm tr v nt gc :
(define root car)
; nh hm tr v cy con tri :
(define left cadr)
; nh hm tr v cy con phi :
(define right cddr)
; nh ngha v t kim tra c phi nt l khng :
(define (leaf? A)
(and (null? (cadr A)) (null? (cddr A))))
; V d to mt cy nh phn c 3 nt :
(create-tree 1
(create-tree 2 empty-tree empty-tree)
(create-tree 3 empty-tree empty-tree))
--> (1 (2 ()) 3 ())

V d : Cy A g m 5 nt c cho nh hnh sau y :


1
2
4

3
5

Hnh V.10. Cy nh phn c 5 nt.


c nh ngha nh sau :
(create-tree 1
(create-tree 2
(create-tree 4
(create-tree 5
(create-tree 3
--> (1 (2 (4 ())

empty-tree empty-tree)
empty-tree empty-tree))
empty-tree empty-tree))
5 ()) 3 ())

CU TRC D LIU

165

2. Biu din dng y


d dng x l khi lp trnh, thng thng ngi ta biu din cy dng danh sch, y
cc nt, s d ng 3 php cons :
(define empty-tree ())
(define empty-tree? null?)
(define (create-tree E A1 A2)
(list E A1 A2))
(define root car)
(define left cadr)
(define right caddr)
(define (leaf? A)
(and (null? (cadr A)) (null? (caddr A))))
; V d to mt cy nh phn c 3 nt :
(create-tree 1
(create-tree 2 empty-tree empty-tree)
(create-tree 3 empty-tree empty-tree))
--> (1 (2 () ()) (3 () ()))

Cy A trong Hnh V.10. trn y c nh ngha nh sau :


(create-tree
(create-tree
(create-tree
4
empty-tree
(create-tree
5
empty-tree
(create-tree
3
empty-tree
--> (1 (2) (4 () ()) (5 () ())) (3 () ()))

1
2
empty-tree)
empty-tree))
empty-tree))

Trong dng y , mi nt l A u c biu din dng (A () ()).


3. Biu din n gin

Khi kiu cc phn t khng cha cc b i, k c khng cha danh sch, mt l c th


c biu din n gin bi gi tr c a nt, m khng cn cons. Ta nh ngha li nh sau :
(define empty-tree ())
(define empty-tree? null?)
(define (create-tree E A1 A2)
(if (and (null? A1) (null? A2))
E
(list E A1 A2)))
; hay (cons E (cons A1 A2)) tit kim hn
(define (root A)
(if (pair? A)
(car A )
A))
(define (left A)
(if (pair? A)
(cadr A)
()))
(define (right A)

166

LP TRNH HM

(if (pair? A)
(caddr A)
;hay (cadr A) trong trng hp biu din tit kim
()))
(define (leaf? A)
(not (pair? A)))
; V d to mt cy nh phn c 3 nt :
(create-tree 1
(create-tree 2 empty-tree empty-tree)
(create-tree 3 empty-tree empty-tree))
--> (1 2 3)

Cy A trong Hnh V.10. trn y c nh ngha nh sau :


(create-tree 1
(create-tree 2
(create-tree 4 empty-tree empty-tree)
(create-tree 5 empty-tree empty-tree))
(create-tree 3 empty-tree empty-tree))
--> (1 (2 4 5) 3)
Trong dng n gin ny, cc nt c a cy A c biu din bi gi tr ca nt ln lt
theo th t duyt cy gctriphi.

V.4.1.3.

Mt s v d lp trnh n gin

1. m s lng cc nt c trong mt cy
Xy dng hm size c dng hm nh sau :
; size : BinTree(T) Integer
(define (size A)
(if (empty-tree? A)
0
(+ 1 (size (left A)) (size (right A)))))
; m s lng cc nt c trong cy A Hnh V.10
````:
(size A)
--> 5
2. Tnh cao ca mt cy
cao ca mt cy khc r ng l s cnh t i a ni gc c a cy vi cc l ca n.
Theo quy c, cao ca mt cy rng c th l 1. Xy dng hm height c dng nh sau :
; height : BinTree(T) Integer
(define (height A)
(if (empty-tree? A)
-1
(+ 1 (max (height (left A)) (height (right A))))))
; cao c a cy A Hnh V.10.:

CU TRC D LIU

167

(height A)
--> 2

Kch thc n v cao h c a cy nh phn thng c dng o phc tp tnh ton.


Ta c :
[log2 n] h n 1 (k hiu [x] ch phn nguyn ca x)
Cy y :

n = 2h+1 1

Cy suy thoi :

n=h +1

C tt c

Cn2n
cy nh phn kch thc n,
(n + 1)

vi C np l t hp chp p (cch chn p phn t) c a n (trong s n phn t).


C hai hm size v height trn u c chi ph tuyn tnh theo n.

V.4.1.4.

Duyt cy nh phn

Cy c s d ng ch yu t chc lu tr d liu nn khi cn khai thc ngi ta phi


duyt (traverse) hay thm (visit) n i dung ca cy. C rt nhiu chin lc duyt cy. Do cy
c xy d ng quy, m t cch t nhin, chng trnh duyt cy c th s d ng quy. Mi
chin lc duyt cy u tr v kt qu l danh sch cc nt c duyt qua.
Ta s xt sau y chin lc duyt cy nh phn theo chiu su. Trong trng hp tng
qut, thut ton c d ng nh sau :
(define (run-around A)
(if (empty-tree? A)
<result>
(f (root A)
; duyt nt g c
(run-around (left A ))
; duyt cy con tri
(run-around (right A)))))) ; duyt cy con phi

Trong , <result> l kt qu tr v (thng l mt danh sch rng) v f l hm x l


mt phn t ca cy A (lin quan n n i dung hay nhn ca nt va c duyt). Th t
duyt cy trn y (gc-tri-phi) l th t trc hay cn c g i l th t tin t (prefixe
order). Nu i li th t duyt trn y th ta nhn c :
Th t gia hay trung t (infixe order) nu nt gc c x l gia cc li gi quy
(tri-gc-phi).
Th t sau hay hu t (postfixe order) nu nt gc c x l sau cc li gi quy
(tri-phi-g c).
Tuy nhin, ta cng c th c thm ba th t duyt cy theo hng ngc li l : g c-phitri, ph i-gc-tri v phi-tri-gc.
V d hm nodes sau y duyt cy nh phn tr v danh sch tt c cc nt c a cy
. Do hm s d ng lnh append nn c chi ph bc hai i vi kch thc c a cy.
; nodes: BinTree(T) List(T)
; Duyt cy nh phn theo th t trc :
(define (pre-nodes A)

168

LP TRNH HM

(if (empty-tree? A)
()
(append (list (root A))
(pre-nodes (left A))
(pre-nodes (right A)))))
; Duyt cy nh phn theo th t gia :
(define (inf-nodes A)
(if (empty-tree? A)
()
(append (inf-nodes (left A))
(list (root A))
(inf-nodes (right A)))))
; Duyt cy nh phn theo th t sau :
(define (post-nodes A)
(if (empty-tree? A)
()
(append (post-nodes (left A))
(post-nodes (right A))
(list (root A)))))
minh ho cc thu t ton duyt cy trn y, gi s A l cy c cho nh hnh sau :
1

2
4

3
5

Hnh V.11. Cy nh phn A c 7 nt


Cy A c nh ngha theo kiu n gin :
(define A
(create-tree 1
(create-tree 2
(create-tree 4 empty-tree empty-tree)
(create-tree 5 empty-tree empty-tree))
(create-tree 3
(create-tree 6 empty-tree empty-tree)
(create-tree 7 empty-tree empty-tree)))
--> (1 (2 4 5) (3 6 7))
(pre-nodes A)
--> (1 2 4 5 3 6 7) ; th t trc
(inf-nodes A)
--> (4 2 5 1 6 3 7) ; th t gia
(post-nodes A)
--> (4 5 3 6 7 3 1) ; th t sau

CU TRC D LIU

169

V.4.2. Cu trc cy tng qut


Trong trng hp cy tng qut, m i nt u c gn nhn v c s lng cy con tu
khng hn ch. Mt cch trc gic, cy c gn nhn l m t cu trc d liu gm mt gi tr
nhn v m t danh sch c th rng cc cy con gn nhn. Nh vy cy khng bao gi r ng,
nhng danh sch cc cy con c th rng. Trong trng hp cy ch c m t con, th khng c
khi nim cy con tri hay cy con phi. Ta c ng cn ch rng cu trc cy nh phn khng
phi l trng hp ring ca cy t ng qut.
Ta c nh ngha quy nh sau :
1. M t danh sch cc cy kiu T l m t rng (forest) kiu T.
2. Nu E l m t phn t kiu T v F l mt rng kiu T, th cp (E, F) l m t cy kiu T.
3. Ch nhng i tng c nh ngha quy tc 1 l rng kiu T.
Ch nhng i tng c nh ngha quy tc 2 l cy kiu T.
Cho trc tp hp cc cy kiu T. Vi m i cy T, cc cy T1, ..., Tn c gi l con c a T.
M t nhn e no l gc ca T. S con m i nt l bc (degree) c a nt . Mt nt c c
bc 0 l mt l

V.4.2.1.

Kiu tru tng cy tng qut

Ta xy d ng kiu tru tng ca cy t ng qut gm Tree(T) v Forest(T)=List(Tree(T))


nh sau :
types Tree(T), Forest(T)
functions
()
: Forest(T)
null?
: Forest(T)
boolean
cons
: Tree(T)Forest(T)
Forest(T)
car
: Forest(T)
Tree(T)
cdr
: Forest(T)
Forest(T)
create-tree : T Forest(T) Tree(T)
root
: Tree(T)
T
forest
: Tree(T)
Forest(T)
leaf?
: Tree(T)
boolean
var F: Forest(T); A, E: Tree(T)
preconditions
car(F) v cdr(F) ch xc nh khi v ch khi F ()
axioms (cc tin lin quan n list khng nhc li y)
root(create-tree(E, F)) = E
forest(create-tree(E, F)) = F
leaf?(A) and forest(A)= ()

V.4.2.2.

Biu din cy tng qut

Ta a ra hai cch biu din cy t ng qut nh sau :


1. Biu din cy nh mt b i
(define create-tree cons)
(define root car)

170

LP TRNH HM

(define forest cdr)


(define (leaf? A)
(null? (cdr A)))

V d A l cy t ng qut nh sau :
1
2

3
5

4
6

Hnh V.12. Cy A tng qut c 7 nt


A c biu din b i :
(1 (2) (3 (5)) (4 (6) (7)))
2. Biu din cy n gin qua cc l
Khi kiu cc phn t khng th ch a cc b i (k c cc danh sch), m t l c th c
biu din n gin bi gi tr c a nt.
(define (createe-tree E F)
(if (null? F)
E
(cons E F)))
(define (root A)
(if (pair? A)
(car A)
A))
(define (forest A)
(if (pair? A)
(cdr A)
()))
(define (leaf? A)
(not (pair? A)))

Chng hn cy A trn y c biu din b i :


(1 2 (3 5) (4 6 7))

V.4.2.3.

Mt s v d v cy tng qut

Nguyn tc x l cy tng qut A nh sau : trc tin kim tra danh sch cc cy con l
rng c a A c rng khng ? Nu r ng th dng v tr v kt qu. Nu khc r ng th ln lt
x l cc cy con ca A.
1. m s lng cc nt trong cy
Hm tree-size m s lng cc nt trong cy :
; tree-size : Tree(T) Integer
(define (tree-size A)
(define (size-forest F)

CU TRC D LIU

171

(if (null? F)
1
(+ 1 (tree-size (car F)) (size-forest (cdr F)))))
(size-forest (forest A)))
(define A '(1 2 (3 5) (4 6 7)))
(tree-size A)
--> 13
2. Tnh cao ca cy

Hm tree-height tnh cao ca cy :


; tree-height : Tree(T) Integer
(define (tree-height A)
(define (height-forest F hmax)
(if (null? F)
hmax
(height-forest (cdr F)
(+ 1 (max (tree-height (car F)) hmax)))))
(height-forest (forest A) 0))
(define A '(1 2 (3 5) (4 6 7)))
(tree-height A)
--> 3

V.4.2.4.

Duyt cy tng qut khng c x l trung t

Chin lc duyt cy tng qut tm danh sch cc nt g m php duyt theo th t trc
v php duyt theo th t sau, khng c th t trung t .
Thut ton duyt cy theo th t trc : ti mi bc quy, s d ng lnh append
to danh sch l nt g c v kt qu duyt cc cy con c a rng :
; pre-nodes: Tree(T) List(T)
(define (pre-nodes A)
(define (nodes-forest F)
(if (null? F)
()
(append (pre-nodes (car F))
(nodes-forest (cdr F)))))
(append (list (root A)) (nodes-forest (forest A))))

Thu t ton duyt cy theo th t sau : tng t php duyt theo th t trc nhng php
ghp theo th t ngc li :
; post-nodes: Tree(T) List(T)
(define (post-nodes A)
(define (nodes-forest F)
(if (null? F)
'()
(append (post-nodes (car F))
(nodes-forest (cdr F)))))
(append (nodes-forest (forest A)) (list (root A))))

172

LP TRNH HM

V d cho cy A g m 11 nt s dng phng php biu din cy n gin qua cc l :


1
2
5

3
6

4
7

8
9
10

11

Hnh V.13. Cy A tng qut c 11 nt


ta thc hin hai php duyt cy nh sau :
(define A
(1 (2 5) (3 6 7) (4 (8 (9 10 11)))))
(pre-nodes A)
--> (1 2 5 3 6 7 4 8 9 10 11)
(post-nodes A)
--> (5 2 6 7 3 10 11 9 8 4 1)

V.4.3. ng dng cy tng qut


V.4.3.1.

Xy dng cy c php

Cy c php l cy tng qut sao cho gi tr gn cho mi nt xc nh c s lng cc


con ca nt . S nt ny c th c nh hoc thay i tuy theo trng hp vn d ng. Chng
hn mt chng trnh Scheme ng n chnh l mt cy c php.
Trong qu trnh phn tch c php ( bin d ch m ngu n thnh m ch), ngi ta s
dng mt bng d liu lu gi thng tin lin quan n php ton v tham s tng ng. Bng
ny cung cp cc cp gi tr g m nt v s lng cc cy con tng ng kim tra tnh
ng n ca biu thc.
Thng thng ngi ta s d ng cc gi tr nt dng nguyn t (atom). Ngi ta thng
u tin s d ng cch biu din n gin cy tng qut qua cc l. Khi bit c s lng cc
con c a m t nt, ngi ta dng cc php ton tip cn n cy con th n, tip cn n cc
php ton c s, cng nh tip cn n cc cu trc d liu c nh ngha trong m
ngu n.
Sau y l mt s nh ngha hm to cc cy c php :
; nh ngha cy ch gm m t nt
(define (create0 E) E)
; Cy gm mt nt v m t cy con
(define (create1 E A) (list E A))
; Cy gm mt nt v hai cy con
(define (create2 E A1 A2) (list E A1 A2))

v.v ...
; Hm tr v cy con th nht vi iu kin cy cho c ti thiu 1 con

CU TRC D LIU

173

(define son1 cadr)


; Hm tr v cy con th hai vi iu kin cy cho c t i thiu 2 con
(define son2 caddr)
; Hm tr v cy con th ba vi iu kin cy cho c t i thiu 3 con
(define son3 cadddr)

v.v ...
Chng hn xy dng cy c php cho biu thc Scheme
(define L (list ann tom bob))
nh sau :
(define T
(create2 define L (create3 list ann tom bob)))
T
--> (define L (list ann tom bob))
(son2 (son2 T))
--> tom
define
L

list

ann

tom

bob

Hnh V.14. Cy nh phn biu din biu thc Scheme.

V.4.3.2.

V d : o hm hnh thc

Di y l th t c tnh o hm ca m t biu thc. Cy tng qut biu din biu


thc c quy c nh sau : cc l g m s nguyn v k hiu biu din cc bin hnh thc, cc
nt trong l cc php ton. Trong v d ny, n gin, ch xt php c ng v php nhn.
; type Varable = Symbol
; type Operator = {+, *}
; type Exp = Tree(Integer Variable Operator)
; Ch : kiu Exp c th m t c th hn nh sau :
; type Exp = Integer Variable Operator Exp Exp
; derivative : Exp Variable Exp
; Th tc tr v o hm c a E i vi bin V
(define (derivative E V)
(cond
((leaf? E)
(if (eq? (root E) V) 1 0))
((eq? (root E) +)
(create2 + (derivative (son1 E) V)
(derivative (son2 E) V)))
((eq? (root E) *)

174

LP TRNH HM

(create2 + (create2 * (derivative (son1 E) V)


(son2 E))
(create2 * (son1 E)
(derivative (son2 E) V))))
(else
(error unknown operator (root E)))))
(derivative (+ x (* 2 y)) y)
--> (+ 0 (+ (* 0 y) (* 2 1)))
(derivative (+ (* -3 x x) (* 2 x) 1) x)
--> (+ (+ (* 0 x) (* -3 1)) (+ (* 0 x) (* 2 1)))
(derivative '(* 2 x) 'x)
--> (+ (* 0 x) (* 2 1))

Bi tp chng 5
1. Cho trc m t nh ngha hm nh sau :
(define (less k x)
(cond ((null? x) ())
((< (car x) k) (cons (car x) (less k (cdr x))))
(else (less k (cdr x)))))
Hy cho bit gi tr tr v ca cc li gi sau y, gii thch ti sao :
(less 5 ())
(less 5 (4 5 6))
(less 5 (7 3 6 2))
Vit li hm trn nhng ch s dng if m khng s d ng cons, ng thi loi b biu
thc tha (less k (cdr x)) ?
2. Vit hm chuyn i cc s nh phn (h c s 2) ra thp phn (h c s 10) v ngc l i
(ch cc tham bin l cc s nguyn) theo gi nh sau :
(binary->decimal 10001)
--> 17
(decimal->binary 17)
--> 10001
3. Vit hm chuyn i c s tr v kt qu l hm chuyn i cc s nh phn ra thp
phn v ngc li theo gi nh sau (c th nh ngha cc hm b tr) :
((base-converse 2 10) 10001)
--> 17
((base-converse 10 2) 17)
--> 10001
4. Vit hm (converse P N) chuyn i s thp phn N bt k sang s h c s P, vi
P 36 (s trong h c s P c vit b i P ch s 0..9A..Z) theo gi nh sau :

CU TRC D LIU

175

(converse 16 17)
--> 11
(converse 8 17)
--> 21
(converse 2 17)
--> 10001

5. Xy d ng cu trc d liu kiu ngn xp t bin nhng c kch thc gi hn, ngha l
s phn t c a ngn xp khng vt qu MaxNum. C th biu din ngn xp bi mt
vector, trong s dng m t s nguyn lm ch s nh ca ngn xp.
6. Xy dng hm tnh biu thc s hc d ng hu t s d ng ngn xp thng thng.
7. T cch s d ng k thut truyn thng ip xy d ng cc hm x l ngn xp trong l
thuyt, hy vit thm cc hm cho php a ra xem ni dung c a ngn xp vi thng
ip view-content.
8. Vit li hm nodes khng s d ng lnh append tr v danh sch tt c cc nt c a
cy nh phn.
9. Vit cc thut ton duyt cy nh phn theo chiu rng.
10. Vit cc thut ton duyt cy nh phn theo chiu su.
11. Trong mt nh ga, ngi ta cn sp xp cc toa tu trn cc ng ray nh hnh v di
y. S d ng mt ngn xp biu din ho t ng sp xp cc toa tu trn cc ng
ray, hy cho bit cc thao tc cn phi thc hin sao cho cc toa tu c sp xp theo
th t 5 4 3 2 1 ?
R1

2
R2

Hnh V.15. Sp xp theo th t cc toa tu trn cc ng ray.


12. Xy dng hm (pairlis L1 L1 alist) tr v mt danh sch kt hp b ng cch
thm vo u ca alist cc b i nhn c t cc cp phn t l y t L1 v L2 ln
lt tng ng (gi thit L1 v L2 c cng di).
(pairlis (1 2) (one two) ((3 . three) (4 . four)))
--> ((1. 0ne) (2. two) (3. three) (4. four))
13. Xy d ng hm modival lm thay i gi tr kt hp vi m t kha thnh gi tr mi,
hay thm mi mt b i nu kha cho khng tm thy trong mt danh sch kt hp
cho.
14. T danh sch cc s thc X1, Y1, X2, Y2, X3 tng ng ln lt l to c a ba im A, B,
C trong mt mt phng to . Hy cho bit ba im A, B, C c to thnh mt tam gic
cn, u, vung, thng hay suy bin (dim ng thng) ?

176

LP TRNH HM

15. T danh sch 8 s thc X1, Y1, X2, Y2, X3, Y3, X4, Y4 ln lt l to ca bn im A, B,
C, D tng ng trong mt mt phng to . Hy cho bit ba im A, B, C c lp thnh
m t tam gic khng ? Nu ABC l m t tam gic, hy xt xem :
1. im D c nm bn trong tam gic ny khng ?
2. Tnh din tch v chu vi c a tam gic
3. Tnh khong cch t D n ba im A, B, C.
16. Trong mt phng to , phng trnh ng d c ca mt ng thng c dc m v i
qua im P c to (x1, y1) l : y - y1 = m(x - x1). T danh sch gm d c v to
im c a hai ng thng, hy kim tra xem chng c giao nhau hay song song vi nhau.
Nu chng c giao nhau, kim tra chng c vung gc vi nhau hay khng ?
17. T mt s thc dng R v mt s nguyn d ng MAX, hy tm mt phn s gn s R
nht trong s cc phn s c dng P/Q vi QMAX ?
18. Cho m t ma trn cc s nguyn N N phn t gi s c biu din di d ng m t danh
sch gm N phn t l cc danh sch con, m i danh sch con biu din mt hng N phn
t, lin tip hng n n i tip hng kia. Hy xt xem ma trn cho c l ma trn g :
a) Ma trn tam gic trn-phi (c cc phn t nm pha d i ng cho chnh bng 0) ?
b) Ma trn tam gic di-phi (c cc phn t nm pha trn ng cho chnh b ng 0) ?
c) Ma trn tam gic trn-tri (c cc phn t nm pha di ng cho ph b ng 0) ?
d) Ma trn tam gic di-tri (c cc phn t nm pha trn ng cho ph bng 0) ?
e) Ma trn y (khng ri vo mt trong 4 trng hp tam gic trn) ?
f) Tm mt cch biu din t i u cho cc ma trn tam gic ?

CHNG VI. MI TRNG V CP PHT


B NH

hng ny tp trung nghin cu cc khi nim ph m vi (scope) v tm nhn (visibility)


ca cc bin trong khi thc hin chng trnh. Ta s s d ng b nh m hnh ha
mi lin kt (link) gi a bin v gi tr ca bin qua lnh gn bin b i set!. Ta s nghin cu
khi nim c ch ng (closure) trong m i lin h vi d ng set! v trnh by cch vn d ng
dng lnh lin kt bin letrec.
T khi nim bin t bin (bin thay i gi tr m t cch bt thng) xt, ta i n
khi nim nguyn mu (protype). y l khi nim v t hp cc c ch ng v gn
(assignment) ng gi (encapsulation) cc trng thi ca mt cu trc phc hp v cc x
l trn , tng t khi nim lp i tng trong lp trnh hng i tng.

VI.1
VI.1.1.

Mi trng
Mt s khi nim

Ta xem xt cc quy tc th hin m i lin kt gia m t bin v gi tr ca n. Bin l tn


gi ch nh n mt gi tr, hay lin kt vi mt v tr cha gi tr trong b nh (bound
occurrence). Lin kt mt bin vi mt gi tr c hnh thnh khi tnh m t biu thc kiu
lin kt, ngha l mt biu thc s d ng mt trong cc d ng let, let*, letrec, do,
define, ho c khi g i hm, hoc khi s d ng php tnh lambda.
Khi gi hm, hoc thc hin php tnh lambda, cc tham bin hnh thc c lin kt vi
(c truyn) cc gi tr tham i thc s tng ng.
Khi m t biu thc c tnh, cu hi t ra l : gi tr no s gn cho bin ? Gi tr ny c
th ty thu c vo phm vi ca bin trong on chng trnh v vo thi gian sng (lifetime
hay extend) ca biu thc ang tnh. m t tp hp cc lin kt gia bin ang hot ng
c th tip cn v gi tr ca chng, ngi ta a vo khi nim mi trng (environment).
Mi trng c xem l mt dy cc kh i lin kt. Lin kt ca mt bin l gi tr gn cho
bin trong mi trng.
Chng hn, khi tnh biu thc vi dng let trong m t ng cnh no , mt mi trng
hin hnh c hnh thnh. Dng let c c php nh sau (xem chng 2) :
(let ( (x1 e1)
...
(xn eN))
body)

177

178

LP TRNH HM

u tin, cc biu thc e1, ..., eN c tnh ng thi trong mi trng hin hnh
nhn c cc gi tr v1,..., vN. tng ng. Sau , thn ca let c tnh trong mi trng
mi nhn c b ng cch thm cc khi lin kt x1 v1, ..., xN vN vo mi trng hi n
hnh nh hnh di y :
x1
...
...
y1

v1
...

...
w1

xN

vN

Mi trng hin hnh ca let Mi trng c a thn c a let

Hnh VI.1. Mi trng hin hnh ca dng let.


V d trong lnh gn :
(let ((x (+ 1 2)))
(* x x))
th bin x c lin kt vi 3. Trn y, ta th y rng quan h gia m t bin v gi tr ca n
khng th gii thch m khng ni n b nh (memory). Vic a vo lnh gn lm thay
i khi nim ban u v mi trng.
Mt mi trng khng ch ra gi tr c a m t bin na m ch ra a ch c a n trong b
nh. Ngha l, gi tr c a m t bin ph thuc vo hai hm :
Hm kt hp m t bi n vi m t v tr nh c g i l mi trng .
Hm kt hp m t v tr nh ca bin vi mt gi tr cha trong , gi l b nh.
Gi tr c a bin x c cho bi vic t hp cc hm ny :
(memory (environmet x))
Ta c s nh sau :

Mi trng

B nh
gi tr ca x

x
a ch ca x

Hnh VI.2. Ph thuc ca bin vo mi trng v b nh.

VI.1.2. Phm vi ca mt lin kt


Trong Scheme, phm vi ca mt lin kt cn c gi l vng (region). Phm vi l tnh
(static scope) nu n khng ph thu c vo vic thc hin chng trnh. Trong trng hp
ngc li, ng i ta g i phm vi l ng (dynamic scope). Mt mi trng m khng x y ra
cc php lin kt bin c gi l mi trng mc nh (top level environment). Sau y ta
s xt k h n v hai khi nim phm vi tnh v phm vi ng.

VI.1.2.1. Phm vi tnh


Gi s cho biu thc s dng hai ln dng let :

MI TRNG V CP PHT B NH

179

(let ((a 5))


(let ((f ((lambda (x) (+ a x)))
(a 0))
(f 10)) ; thn let trong
)
--> 15

Khi tnh, bin a l nhn th y c trong thn c a let ngoi, cn hm f l nhn th y c


trong thn ca let trong. Thn c a let trong cng l mi trng ca hm f. Vn t ra
l v sao gi tr c a biu thc tnh c b ng 15 m khng b ng 10 ?
Trong nh ngha hm f, ta thy (f 10) thc hin vic thm 10 vo gi tr ca a, nhng
l gi tr no ca a ?
- Ti thi im nh ngha f, th a = 5 ?
- Ti thi im gi f, th lc ny a = 0 ?
Trong Scheme, ngi ta s d ng gi tr ca a nhn thy c t i thi im nh ngha f.
Vic la ch n ny c gi l phm vi tnh, cn nu la chn gi tr ti thi im g i hm th
c gi l phm vi ng. Vy cu tr li l 15.
i vi cc nh ngha mc nh, ngi ta cng s d ng nguyn tc nh vy. Ta xt
chu lm vic sau :
(define b 10) ; b l bin ton c c
(define (f x)
(* b x))
;b=10 trong mi trng ca nh ngha f
(f 5)
--> 50
;f nhn c gi tr c a b
(let ((b 0)) ;b khng c nhn th y khi gi f
(f 5)) ;f c g i v ch nhn th y b ton cc
--> 50
Ngha l gi tr ca b ti thiim nh ngha f c s dng tnh trong thn hm.

VI.1.2.2. Php ng = biu thc lambda + mi trng


Khi xt phm vi tnh c a bin, ta a vo khi nim bin t do (free occrence) l bi n
xut hin trong mt biu thc nhng khng c lin kt gi tr. V d biu thc :
(lambda (x) (lambda (y) (+ x y a)))

cha cc bin t do l a v +, cc bin lin kt l x v y. Cng mt bin c th va l bi n


lin kt va l bin t do. V d, trong biu thc sau, x va l mt lin kt, va l mt bin t
do :
((lambda (x) (+ x 1)) x)

Vn t ra l khi tnh hm s d ng biu thc lambda, lm sao nh c cc tham bin


c phm vi tnh ti th i im g i m gi tr ca chng c xc nh ti thi im nh
ngha lc cn l bin t do ?
Cch gii quyt n gin l s d ng m t cp con tr kt hp. Con tr th nht c to ra
t nhin nh biu thc lambda nh ngha hm. Con tr th hai dng tr n mi trng
thi im nh ngha hm ny. Cp con tr, m t tr n biu thc lambda v m t tr n mi
trng, c g i l mt php ng (closure) :
(closure = lambda eapression + environment)

180

LP TRNH HM

Nh v y, ti thi im g i hm, cc tham bin hnh thc s c kt vi cc gi tr c a


cc tham i thc s v cc gi tr ca cc bin t do s c tm kim trong mi trng nh
ngha bin nh con tr th hai.
f

Biu thc c a f
Mi trng nh ngha c a f
Hnh VI.3. Cp con tr biu din mt php ng.
Hnh v m t cch biu din bn trong c a nh ngha hm nh php tnh lambda. Vng
nh gn vi m t gi tr ca bin cha hai con tr : con tr a ch c a biu thc lambda nh
ngha hm v a ch ca mi trng nh ngha hm.

VI.1.2.3. Thay i b nh v php ng


B nh bin b thay i khi thc hin cc hm c tn kt thc bi mt du chm than (!)
v b i lnh define. Mi trng b thay i khi gi hm, hay s d ng let, v, v... V d sau
y lm thay i c b nh v mi trng :
(let ((a 10))
(set! a 0)
a)
--> 0

By gi ta t hp lnh gn vi vic to ra mt php ng. Ta nh ngha m t bin cc b


a v mt hm f s d ng a ny :
(let ((a 10))
(let ((f (lambda (x) (+ a x))))
(f 0)))
--> 10
f

Biu thc ca f
(lambda (x)
(+ a x))

Mi trng nh ngha c a f
a

10

Hnh VI.4. Php ng minh ho s dng bin.


By gi nu ta thay i gi tr c a a bi mt lnh set! th gi tr c a a t trong php
ng ca f b thay i :
(let ((a 10))
(let ((f (lambda (x) (+ a x))))
(set! a 0)
(f 0)))
--> 0

MI TRNG V CP PHT B NH

181

C th gii thch hin tng ny nh sau : php ng kt hp vi f ch a m t con tr n


mi trng ny. Do lin kt ny c a a l nhn th y ti thi im ca set! nn c s t bin
ni dung v tr nh ca a, t dn n s thay i gi tr ca php ng kt hp vi f.
Sau y l s gii thch sau khi thc hin set! :
f

Biu thc ca f
(lambda (x)
(+ a x))

Mi trng nh ngha c a f
a

Hnh VI.5. Php ng sau khi thc hin set!.

VI.1.2.4. Nhn bit hm


nhn bit hm, Scheme c v t procedure?
(procedure? car)
--> #t
(procedure? (labda (x) (* a x)))
--> #t
(procedure? (cons a b))
--> #f

Ch rng cons khng phi l mt hm. Mt khc, vic so snh cc hm b i eq? ch


kim tra tnh ng nht vt l ca cc i tng Scheme. V d :
(eq? cadr cadr)
--> #t
(eq? '(lambda (x) x) '(lambda (x) x))
--> #t
((lambda (L) (car L)) '(1 2 3))
--> 1

Tuy nhin :
(eq? car (lambda (L) (car L)))
--> #f
k c khi hai i tng cn so snh t ra y ht nhau :
(eq? (lambda (x) x) (lambda (x) x))
--> #f

Hai hm f v g c gi bng nhau theo ngha rng (extent equal) nu chng c cng
min xc nh v cng nhn nh ng gi tr nh nhau trong min ny. Kiu bng nhau ton h c
ny khng kim nh c khi min xc nh l v hn. V vy, v t so snh equal? cng
khng dng c so snh trn cc hm :
(equal? car (lambda (L) (car L)))
--> #f

182

LP TRNH HM

(equal? (lambda (x) x) (lambda (x) x))


--> #f
(equal? cadr cadr)
--> #t
(eq? '(lambda (x) x) '(lambda (x) x))
--> #t

Ta nhn th y hai v t so snh equal? v eq? c cch dng ging nhau.

VI.1.2.5. Phm vi ng
Gi s ta cn nh ngha cc hm nh sau :
(define (f a)
(+ a (g 5)))
(define (g x)
(+ a x))
Khi gi n f hoc g, sai s u xut hin do bin a khng phi l bin ton c c :
(f 1)
--> ERROR: undefined variable: a
(g 1)
--> ERROR: undefined variable: a

Ti thi im gi (f 1), bin a c lin kt gi tr 1 (tham bin hnh thc nhn gi tr


ca tham i thc s), nh ng lin kt ny khng c nhn bit bi g. Khi li g i (g 5)
gy ra li. Ti thi im nh ngha hm g, bin a l t do v php ng ca g cha con tr
tr n mi trng ton c c nhng a cha c nhn bit trong mi trng ny.
Nh vy, lin kt tnh khng cho php nh ngha cc hm f v g nh trn, m phi c
mt nh ngha bin ton cc cho a :
(define a 10)

Khi , g i n f ho c g u c kt qu :
(f 1)
--> 16
(g 1)
--> 11

Quy tc tm lin kt khi nh ngha mt bin ph thu c vo d ng thc lin kt v ng


ngha c a chng. Trong dng thc s d ng php tnh lambda d i y :
((lambda (x1 ... xN) body)
e1 ... eN)

th phm vi lin kt gia mt tham bin hnh thc xi vi gi tr ei l thn body c a biu thc
lambda, tng t dng let :
(let ((x1 e1)
...
(xN eN))
body)

MI TRNG V CP PHT B NH

183

Trong dng thc s dng letrec :


(letrec ((f1 e1)
...
(fN eN))
body)

th phm vi lin kt gia fi v gi tr ei l thn letrec c thm tt c biu thc ej vi


mi j i.
Cc bin ton c c c nh ngha bi define c phm vi l ton b chu lm vic.
Ngi ta ni phm vi ca mt nh ngha l c hiu lc tr v trc, v rng Scheme s xem
xt cc nh ngha trc trong chu. V du :
(define add-m (lambda (x) (+ m x)))
(define m 10)
(add-m 5)
--> 15

Hm add-m s d ng lin kt cho m, m m c nh ngha sau hm ny. Cch hot ng


ny cho php lp trnh tha k : ngi ta c th nh ngha cc tin ch sau khi nh ngha
cc hm chnh. iu ny khc vi ngn ng nh ML i hi cc nh ngha phi tun theo
mt th t nhn nh.
Mi trng c nh ngha trc

*
-

Hm + c nh ngha

Mi trng c nh ngha trc


1

20

Khi lin kt to ra bi nh ngha


Hm f c nh ngha
Mi trng mc nh
Khi lin kt to ra b i let
Mi trng mc thn ca let

21

22

Kh i lin kt to ra b i let*
Mi trng mc thn ca let*

Hnh VI.1.1. Cc mi trng ca m t chu lm vic.


Thc ra, cch ho t ng trn hon ton ph hp vi khi nim tm nhn. Mt lin kt
trong cng nht c th che d u mt lin kt khc c a m t bin c cng tn. Trong trng hp
ny, l lin kt mi nht cn phi ghi nhn. Thc t, ngi ta tm lin kt theo th t t

184

LP TRNH HM

trong ra ngoi trn cc khi lin kt v ghi nhn lin kt tm th y u tin. C ch ny c


minh ha nh sau :
(define a 1)
;a=1
(define (f x)
(+ x 1))
(let ((x a) (y 20))
;x =1 ;y =20
(let* ((n (+ x y)) ;n =21
(v (+ a n)) ;v =22
(a (f 5))) ;a = 6
(list a (f a) x y n v)))
--> (6 7 1 20 21 22)
a --> 1

Trong chu ny, cc mi trng c to ra nh Hnh VI.1.1. c gi tr c a f mc


thn ca let*, cn phi ngc ln hai kh i. Tri li, gi tr ca a ti im ny c theo b i
mt trong cc lin kt ca let* m n du gi tr c a a nh ngha mc nh (l 1). Lc
ny, gi tr c a a vn l 1.

VI.1.3. Thi gian sng ca mt lin kt


Thi gian sng ca mt lin kt l thi gian lin kt c th s dng c trong khi thc
hin chng trnh (ngay c khi khng tip cn c ti lin kt ny).
Trong Scheme, thi gian sng c a m t lin kt l khng c gii hn. y l c trng ca
ngn ng Scheme v trong nhiu ngn ng khc, thi gian sng ch thu hp lc thc hi n
chng trnh vi kh i lin kt ang xt.
V d xt chu lm vic sau :
(define f ?)
;f c gi tr ?
(let ((a 10))
(set! f (lambda (x) (+ x a))))
(f 5)
--> 15

Lin kt a cho 10 c phm vi trong thn c a let, nh ng trong thn ny, lnh set!
to ra m t php ng ton cc thu np lin kt ny vo trong mi trng c a n.
Sau khi thc hin let, li g i hm f ko theo vic s dng lin kt a cho 10 tnh li
gi tr ca f trong thn hm. c im ny lm cho vic bin dch cc chng trnh
Scheme tr nn rc r i.

VI.1.4. Mi trng ton cc


Ti m t thi im ca chu lm vic, mi trng ton cc (global environment) l tp
hp tt c cc lin kt nhn th y c ti nh ng chu trnh tng tc khc nhau. l ni
cha nh ng i tng Scheme c nh ngha, v tt c nhng bin do ngi dng nh
ngha lc u.
Tuy nhin, gi tr gn vi m i bin trong mi trng ton c c c tnh cht tm thi v c
th b thay i trong chu lm vic.

MI TRNG V CP PHT B NH

185

Chng hn c th thay i li mt s tn hm trong th vin ca Scheme (tuy nhin khng


nn lm nh vy) :
(define head car)

hoc c th thay i car c cng tnh cht nh car c a ngn ng Common Lisp : phn
t u c a mt danh sch rng khng gy ra sai st m tr v mt danh sch rng :
(define car
(lambda (x)
(if (null? x)
()
(head x))))
(car ())
--> ()
(car '(a b c))
--> a

Tn hm (bin) car khng cn hiu lc nh car chu n ca Scheme na nhng khng


phi do tm nhn ca n, m c minh ha qua s sau :
car tng t Commen Lisp

car

car c a Scheme

head

B nh

Hnh VI.6. Thay i car ca Scheme thnh car ca Common Lisp.


Th t c nh ngha car theo Common Lisp khng lm thay i lin kt gia tn car v
v tr lu gi n trong b nh, nh ng lm thay i ni dung nh ny. R rng, nn trnh dng
kiu nh ngha li ny v s gy ra rc r i, nhm ln khi ang c v bo tr chng trnh v
sau. Vic khi ph c li car c tin hnh nh sau :
(define car head)
(car ())
--> ERROR: argument type

VI.2

Cp pht b nh

Cho n lc ny, ta mi ch lm vic vi cc i tng th ng (passive objects), ch a


ni n cch Scheme cp pht b nh nh th no. Chng hn, khi thm m t gi tr mi vo
mt cu trc d liu, ta lm thay i trng thi b nh. Ngi ta gi nh ng i tng thay
i theo thi gian l nh ng i tng ch ng (active objects) hay t bin (mutable data).
Sau y ta xt hai v d minh ho cc i tng ch ng.

186

LP TRNH HM

VI.2.1. V d 1 : m phng my tnh b ti


Trong mt my tnh b ti (calculator), thanh tch lu (accumulator), gi tt l ACC, l
mt b nh dng cho nt M+. Ta m phng cch lm vic v i my tnh nh sau : dng lnh
rtz (reset to zero) t ACC v gi tr 0, lnh add cng thm vo ACC mt s nguyn,
lnh value c gi tr (ni dung) c a ACC. y l mt v d n gin v mt i tng c
mt trng thi l gi tr hin hnh ca ACC.
Yu cu t ra l nh ngha cc hm Scheme tng ng tho mn cc lnh va nu trn :
(rtz)
; t ACC v gi tr 0
(add 5)
; c ng ACC vi gi tr 5
(add 3)
; c ng ACC vi gi tr 3
(value)
; c gi tr hin hnh ca ACC
--> 8
(add 2)
; c ng ACC vi gi tr 2
(value)
; c gi tr hin hnh ca ACC
--> 10
Gi s ch vi lnh nh ngha bin define, ta xy d ng cc hm rtz, add v value
nh sau :
(define
(define
(define
(+
(define

current-value 0)
(rtz) 0)
(add n)
current-value n))
; cha ch y c
(value) current-value)
; lun lun tr v 0

Tuy nhin, khi thc hin cc hm trn th khng tho mn yu cu :


(rtz)
--> 0
(add 5)
--> 5
(add 3)
--> 3
(value)
--> 0

Ta lun lun nhn c kt qu 0 d thc hin bao nhiu ln php c ng m khng lm


thay i gi tr ACC, tc l bin current-value. khc ph c tnh trng ny, ta cn thay
i cch gn gi tr cho bin, b ng cch s d ng lnh set!. By gi ta c th vit li cc
hm cho ACC nh sau :
(define current-value 0)
(define (rtz)
(set! current-value 0))
(define (add n)
(set! current-value (+ n current-value)))
(define (value) current-value)

Lc ny, cc hm rtz, add v value hot ng nh yu cu t ra.

MI TRNG V CP PHT B NH

187

VI.2.2. V d 2 : bi ton cn i ti khon


V d sau y xt bi ton cn i ti kho n ti mt ngn hng. Ta s lm vic vi mt
i tng m trng thi c a n c c trng bi s d , hay s chnh lch (balance). Ta c
th nh ngha kiu tru tng account nh sau :
Types account
operations
create-account
: Integer
Account
balance
: Account
Integer
add!
: Account Integer 0
withdrawal!
: Account Integer 0
preconditions
create-account(n)
ch xc nh nu v ch nu n>0
add!(C, n)
ch xc nh nu v ch nu n>0
withdrawal!(C, n) ch xc nh nu v ch nu balance(C)>n>0

Yu cu t ra l nh ngha cc hm tho mn cc hot ng trao i ti chnh nh sau :


; To m t ti kho n mi cn i vi gi tr khi ng l 1000
(define C1 (create-account 1000))
; Rt s tin 100 khi ti kho n
(withdrawal! C1 100)
; Cn i li ti kho n
(balance C1)
--> 900
; To m t ti kho n khc cn i vi gi tr khi ng l 500
(define C2 (create-account 500))
; Rt tip s tin 100 khi ti khon C1
(withdrawal! C1 100)
; Rt s tin 100 khi ti kho n C2
(withdrawal! C2 100)
; Cn i li ti kho n C1
(balance C1)
--> 800
; Cn i li ti kho n C2
(balance C2)
--> 400
nh ngha cc hm, ta khng th s d ng m t bin ton c c nh trng hp thanh
tch lu trc y (l current-value), v rng m i ti khon s cn m t bin ton cc
nh v y.
y ta s d ng cc bin c c b trong phm vi m t hm. Tuy nhin, cc hm add!,
withdrawal! v balance phi tip cn c ti cc bin c c b ny. Mu n v y, ta c n
s dng k thut lp trnh truyn thng ip v cc hm c nh ngha nh sau :
(define (create-account S)
(define (switch m)

188

LP TRNH HM

(cond
((eq? m balance)
S)
((eq? m add!)
(lambda (n) (set! S (+ S n))))
((eq? m withdrawal!)
(lambda (n)
(if (> n S)
(error withdrawals upper than balance))
(set! S (- S n))))))
switch)
; T ti khon C, g i create-account vi thng ip balance
(define (balance C) (C balance))
; T ti khon C, g i create-account vi thng ip add!
(define (add! C n) ((C add!) n))
; T ti khon C, g i create-account vi thng ip withdrawal!
(define (withdrawal! C n) ((C withdrawal!) n))

Cc hm va nh ngha tho mn yu cu t ra. Sau khi to mi mt ti khon, c th


thc hin ngay vic cn i :
(define C3 (create-account 100))
(balance C3)
--> 100
(define C4 (create-account 0))
(balance C4)
--> 0

Do khng x l cp pht b nh khi thc hin cc php gn bin, cc hm Scheme lun


lun tr v cng kt qu khi c gi cng nhng tham i nh nhau. Php gn bin lm
mt tnh cht thu n li ny. M t trong nhng nguyn nhn sai st chnh ca lp trnh l s vi
phm tnh ng nht thc (identity). Chng hn, ta a ra hai nh ngha cho hai ti khon C1
v C2 nh sau :
(define C1 (create-compte 1000))
(define C2 (create-compte 1000))

Hai i tng C1 v C2 l gi ng ht nhau ? Lc u, C1 v C2 c xy d ng nh nhau,


v nh nhau ch ng no cc tc ng ti chnh trn chng cn ging nhau, nhng vi cc tc
ng ti chnh khc nhau :
(withdrawal! C1 500)
(withdrawal! C1 100)
(withdrawal! C2 100)
(balance C1)
--> 400
(balance C2)
--> 900

th chng tr nn khc nhau. By gi ta xt v d sau :

MI TRNG V CP PHT B NH

189

(define C1 (create-compte 1000))


(define C2 C1)
(withdrawal! C1 100)
--> 900
(balance C2)
--> 900

Ln ny, C1 v C2 ging ht nhau. Nh th, ngi ta c th tip cn n m t i tng


bi nhiu tn gi khc nhau, l nh ng bit hiu (aliasing). Ng i ta g i hiu ng ph l vic
thay i trng thi ca m t i tng nh mt bit hiu : y, li g i (withdrawal! C2
100) gy ra mt hiu ng ph i vi C1.
Trong mt s trng hp, ngi ta cn hiu ng ph, chng hn vic qun l mt ti
kho n chung. Tuy nhin, do cc cc hiu ng ph xy ra ngoi mu n, nn r rng rt kh
pht hin ra ch sai st x l. Cc biu thc Scheme c tnh ton theo m t trnh t c
ngha v i hi mt khng gian nh ng k.
(define x 5)
(define (f) (set! x (- x 1)) x)
(- (f) (f))
--> 1 hay -1 hay ???

Kt qu tnh ton tu thuc vo b din dch Scheme. Chng hn vi Scheme 48 th kt


qu l 1. trnh tnh hu ng ny, cn b o m mt trnh t thc hin th ng nht nh sau :
(define (g)
(define r1 (f))
(define r2 (f))
(- r1 r2))

Lc ny, ta th y gi tr c a f gim d n -1, -2, ... tuy nhin lun lun c :


(- (f) (f))
--> 1
(- (g) (g))
--> 0

VI.3

M hnh s dng mi trng

Sau y ta xy d ng mt m hnh phc tp hn s d ng khi nim mi trng. Mi


trng c xem l mt t in (dictionary) g m mt dy cc khung (frame) (C1, C2, ... ,
Cn). M i khung l mt tp hp cc cp bin = gi tr. Gi tr ca mt bin trong m t mi
trng l gi tr tng ng vi khung bn tri nht trong danh sch cc khung (m t khung Ci
c th che khu t cc bin ca cc khung Cj, j > i).
C th xem mi hm tng ng vi m t khung cc b cha cc nh ngha bn trong hm
v c th c bao bc bi mt s mi trng no . Lc mi khi ng Scheme, mi
trng ton cc cha tt c cc tn hm s khi. Sau , mi trng c cp nht b i cc
nh ngha bin v nh ngha hm c a ngi s d ng.

190

LP TRNH HM

Khi Scheme tm kim m t gi tr tng ng vi mt tn, Scheme s xem xt trc tin


khung tng ng v i cc nh ngha c c b, r i sau , nu cn thit, Scheme s xem xt
khung tng ng vi cc nh ngha ton cc, v.v... Nh vy, mt nh ngha s ct du ti
ch mt nh ngha ton cc.
(define x 1)
(define (f x) x)
(f 2)
--> 2
x
--> 1
(define (g L)
(define car cdr)
(car L))
(g (1 2 3 4 5))
--> (2 3 4 5)

Ta thay i, m t cch cc b, hm tin nh car bi cdr bn trong nh ngha hm g,


iu ny khng nh hng n car khi ngoi hm g :
(car (1 2 3))
--> 1

Tuy nhin ta khng nn thay i cc hm tin nh mi trng ton cc (mc nh), i


lo i nh :
(define car cdr)
Lc ny, hot ng c a car khng cn ng na :
(car (1 2 3))
--> (2 3)
> (cdr (1 2 3))
--> (2 3)

Mi trng ton cc c rt g n v mt khung cha cc bin tin nh ngha (cons,


car, cdr, ... ) v cc bin ca ng i s d ng. Scheme tnh gi tr mt biu thc trong mi
trng ton cc ny.
Mt hm c biu din b i mt cp [I ; E], trong I l danh sch cc lnh ca hm,
cn E l mi trng trong hm c tnh. Khi b d ch Scheme gi m t hm trong mt mi
trng, n to ra mt khung mi C cha cc cp :
(tham i hnh thc, tham i thc s)
Tip theo, b d ch thc hin hm trong mi trng (C, C1, C2, ... , Cn), trong , danh
sch cc khung (C1, C2, ... , Cn) l mi trng x l ca hm. Mi trng ny c th khng
lin quan g n mi trng gi c a n. Khi hm to ra cc bin (nh cc lnh define) bt
u c thc hin, b dch Scheme thm cc cp bin = gi tr tng ng vo trong khung
C. V d :
(define x 1)

MI TRNG V CP PHT B NH

191

(define (f y)
(define x 2)
(+ x y))

Ngoi cc bin nh ngha trc , lc ny khung C ca mi trng ton cc cha cc cp :


x = 1,
f = P, trong P = [I ; E] ,
I = (lambda (y) (define x 2) (+ x y)), v
E = (C)
Li g i (f 5) s gy ra :
To ra khung C = { y = 5}
Thc hin cc lnh I trong (C, C)
Sau khi (define x 2), th C = { x = 2, y = 5}
Thc hin (+ x y), kt qu l 7. y, x v y c nh ngha trong khung C,
hm + c nh ngha trong C.
Do vy li gi (f 5) cho kt qu 7 :
(f 5)
--> 7

By gi ta xt li bi ton cn i ti khon ngn hng (v d 2 mc trc). Li gi :


(define account (create-account 1000))

s gy ra :
Hm create-account c g i trong mi trng (C, C)
C = {S = 1000}, C l khung ton c c
Sau khi thc hin (define (switch m) ... ), th
C = { switch = P, S = 1000 }, vi
P = [ cc lnh ca switch ; (C, C) ]
Hm create-account tr v gi tr ca switch, l P
Bin account c gi tr l hm :

P = [ cc lnh ca switch ; (C, C) ]


Khi c li g i :
(balance account)

cng c ngha l :
(account balance)

b d ch Scheme thc hin cc lnh c a switch trong mi trng :


({m = solde}, C, C)
Gi tr ca S l trong C, tc l 1000. V khi gi :
((withdrawal! account) 100)

cng c ngha l th c hin li g i :


(account withdrawal!)

192

LP TRNH HM

b d ch Scheme thc hin hm to ti khon b i (withdrawal! account), r i gi hm


tham s l 100 :
Cc lnh ca switch c tnh trong mi trng :
E = ({ m = withdrawal!}, C, C)
Thng ip withdrawal! gy ra vic tnh mt hm mi [I ; E],
trong I = (lambla (n) (if ... ) (set! S (- S n)))
Li g i ca hm ny thc hin cc lnh trn trong mi trng :
(C, { m = withdrawal! }, C, C), trong C = { n =100 }
(set! S (- S n)) thay i gi tr c a S trong khung cha S, l C
Khung C b thay i :

C = { switch = P, S = 900 }
s d ng cc x l cn i ti khon sau ny, l add! v withdrawal! trong hm
account, S c gi tr 900.

VI.4

Vo/ra d liu

Cc th tc vo/ra c a Scheme cho php c d liu vo t cng vo (input port) v a


d liu ra c ng ra (output port). C ng c th l bn phm, mn hnh, hay tp (file).
Trong chng trc, chng ta c lm quen vi cc hm read ( c d liu vo t
bn phm), write v display (a d liu ra mn hnh). Cc hm ny xem bn phm, mn
hnh l cc cng vo/ra mc nh (console). Cng vo c gi tr current-input-port
v c ng ra c gi tr current-output-port. Cc c ng vo/ra mc nh ny c th t
lm tham i port trong hm vo/ra. Chng hn :
(define e (read))
(write e)
hay c tham i port :
(define (read (current-input-port)))
(write e (current-output-port))
l hiu qu nh nhau.

VI.4.1. Lm vic vi cc tp
Tp l phng tin lu tr mt dy cc d liu bt k trn mt thit b nh ngoi nh a
mm, a cng, CD-ROM, bng t, v.v... Tp c t tn theo quy c ca h iu hnh
d dng truy cp n trong h thng th mc t chc kiu phn cp. lm vic (c/ghi)
vi tp, cn thit lp s lin kt gia tp vi mt h thng Scheme. S lin kt ny to ra mt
lu ng hay dng d liu (data flow) gia tp v cc hm vo/ra c a Scheme.
Khi c ra (read) m t tp, cn lin kt tp ny v i dng vo (input flow) c a Scheme
cung cp cc hm c. Khi ghi ln (write) mt tp, cn lin kt tp ny vi dng ra (output
flow) c a Scheme cung cp cc hm a (ghi) ra.
Scheme c cc hm lin kt m t dng d liu vi m t tp nh sau :

MI TRNG V CP PHT B NH

193

(open-input-file filename)
--> lin kt dng vo vi tp filename c mt trn thit b nh.
(open-output-file filename)
--> lin kt dng ra vi tp filename cn to ra.

Sau khi s d ng m t dng d liu, cn phi ng li bi :


(close-input-port flow)
--> ng dng vo flow.
(close-output-port flow)
--> ng dng ra flow.
lin kt m t tp vi mt dng, cn s d ng cc hm sau y :
(call-with-input-file filename fct)
(call-with-output-file filename fct)

Cc hm ny s ng t ng cc dng sau khi s d ng xong. Tham bin fct phi l mt


hm c m t tham bin sao cho tham bin ny c lin kt v i dng trong khi thc hin thn
hm v dng s t ng li sau khi thc hin xong.
i vi trng hp call-with-input-file, tp truy cp n c mt trn thit b
nh, cn i vi trng hp call-with-output-file, li gi ny khng c tc dng
nu tp t n ti.

Dng d liu l mt i tng Scheme do n c th c kim tra bi v t :


(input-port ? s)
--> #t nu s l mt dng vo.
(output-port ? s)
--> #t nu s l mt dng ra.

Nh ni trn, dng vo hin hnh cho bi hm (current-input-port), dng


ra hin hnh cho b i hm (current-output-port).

VI.4.2. c d liu trn tp


1. Cc hm c tp

Cc hm c tp ca Scheme c mt tham i tu ch n (optional) l mt dng. Hm :


(read [flow])
c s-biu thc u tin ti v tr u c ca tp lin kt vi dng flow v di u c n
v tr b t u ca s-biu thc tip theo, sau k t cu i cng ca s-biu thc c. Khi u
c i n cu i tp, mt i tng nh du kt thc tp (end of file) c nhn bit b i v
t :
(eof-object ? s)

Gi s ti th m c hin hnh ang lu gi tp mailto.txt c n i dung :


University of Danang
41, Le Duan St., Danang City, Vietnam
Tel: (84.511) 822041, 832678 Fax: (84.511) 823683

194

LP TRNH HM

S dng read c mt s-biu thc nh lin kt dng vo vi tp nh sau :


(define flow (open-input-file mailto.txt))
flow
--> #{Input-port #{Input-channel mailto.txt}}
(define s1 (read flow))
s1
--> university
(define s2 (read flow))
s2
--> of

Ho c s d ng kt tp vi dng vo :
(call-with-input-file mailto.txt
(lambda (flow)
(let ((s (read flow))) s)))
--> university

Ch tham bin th hai ca call-with-input-file l m t hm mt bin, y l


nh ngha hm b i lambda theo bin flow. Hm read thc t l mt b phn tch c php
(syntax analyser) cho cc s-biu thc, b ng cch chuyn cch biu din bn ngoi c a s-biu
thc c mt trn tp thnh biu din bn trong sau c x l b i Scheme.
Tip theo y l mt v d minh ho qu trnh c tp. Ta xy d ng v t kim tra mt sbiu thc s cho (trong trng hp ny l ton b mt nh ngha hm hp thc) c mt
trong mt tp f g m cc s-biu thc hay khng (sf?). V t l s d ng mt vng lp nh
letrec c tng s-biu thc v so snh v i s cho n khi tho mn hoc gp k hiu kt
thc tp.
(define (expr-present? s f) ; f l tn hm s c
(letrec ((loop
; xy dng vng lp cho n khi gp k hiu kt thc tp
(lambda (flow)
(let ((expr-read (read flow)))
(cond ((eof-object? expr-read) #f)
; kim tra b ng nhau hai s-biu thc
((equal? expr-read s) #t)
(else (loop flow)))))))
; lin kt tp f vi dng d liu vo
(call-with-input-file f loop)))
Vic gi v t c thc hin nh sau :
(expr-present? Danang mailto.txt)
--> #t
Scheme cn c cc hm c tng k t trn dng vo. Hm :
(read-char [flow])

c vo m t k t v di chuyn u c sang k t tip theo (ngi c c th tm hiu su


hn trong ti liu Revised(5) Report on the Algorithmic Language Scheme). Hm :
(peek-char [flow])

c vo mt k t nhng khng di chuyn u c sang k t tip theo.

MI TRNG V CP PHT B NH

195

Scheme khng cho php s dng read c mt tp d liu bt k (kiu Pascal), m


phi c tng k t mt bi read-char. Chng hn :
(define flow (open-input-file mailto.txt))
(read-char flow)
--> #\U
Li gi sau y c 4 k t u c a tp mailto.txt :
(call-with-input-file mailto.txt
(lambda (flow)
(let* ((c1 (read-char flow))
(c2 (read-char flow))
(c3 (read-char flow))
(c4 (read-char flow)))
(list c1 c2 c3 c4))))
--> (#\U #\n #\i #\v

Sau y ta xy d ng hm readfile thc hin c v chp ni dung mt tp ln mn


hnh. Hot ng c a readfile tng t v t expr-present? va nh ngha trn y :
s dng mt vng lp nh letrec c ln lt cc k t bi read-char r i a ra
mn hnh cho n khi gp k hiu kt thc tp eof :
(define (read-file f)
(letrec
((loop
(lambda(flow)
(let ((char (read-char flow)))
(if (not (eof-object? char))
(begin (display char)
(loop flow)))))))
(call-with-input-file f loop)))
(read-file mailto.txt)
--> University of Danang
41, Le Duan St., Danang City, Vietnam
Tel: (84.511) 822041, 832678 Fax: (84.511) 823683
2. Tp vn bn

Mt s tp c cu trc l mt chui lin tip cc kh i (block). Chng hn tp vn bn l


mt chui cc dng (line), m i dng l mt khi c kt thc bi du qua dng. Trong
Scheme du qua dng l k t quy c #\newline.
nh du v tr cu i ca m t khi, ngi ta thng s d ng mt hoc nhiu k t
phn cch (separator mark). Vic c c thc hin ln lt cho cc khi c a tp. Di y
l hm read-block c tt c cc kh i trong m t dng ra tr v kt qu l mt chu i k
t. Hm s d ng hai tham i, mt tham i l dng vo lin kt vi tp vn b n v m t tham
i l v t separator? cho php x l c cc k t phn cch khc nhau.

Hm bn trong l m t vng lp tch l y cc k t ca khi v a c vo mt danh sch


sau chuyn i danh sch thnh chu i trc khi t vo cu i chu i kt qu. Trc khi c
mt khi, cn g i hm read-separator xo ht cc k t phn cch :
(define (read-block flow separator?)
(letrec

196

LP TRNH HM
((loop
(lambda (Lcar)
(let ((c (peek-char flow)))
(if (separator? c)
(list->string (reverse Lcar))
(loop (cons (read-char flow) Lcar)))))))
(read-separator separator? flow)
(loop ())))

Nu mun c tng dng trong tp vn b n, ta s dng v t sparator? c nh


ngha nh sau :
(define (separator?)

(lambda(char)
(eq? #\newline char))

Tuy nhin ta c ng c th c tp theo tng t (word). Thng th ng cc t t cch nhau


bi cc k t : khong trng hay d u cch (space), k t thot (escape), nh y c t (tabulation),
du qua dng, d u kt thc trang. Trong Scheme, cc k t ny c nhn bit b i v t
char-whitespace?. Nu s dng cc d u chm cu trong mt vn bn th ch cn b
sung thm cc k t phn cch.
(char-whitespace? #\space)
--> #t

VI.4.3. Ghi ln tp
1. Cc hm ghi ln tp

Cc hm ghi ln tp c lin kt vi m t dng ra :


(write s [flow])
(display s [flow])
(newline [flow])
(write-char char [flow])

Sau khi thc hin ghi ln tp, cc hm trn tr v m t gi tr khng xc nh v khng


a g ln mn hnh. Trong Scheme, vic ghi ln t p bi display lm ngi c d c kt
qu, nhng ghi ln tp b i display th Scheme li d c (d x l) hn. Ta hy so snh
cc li gi sau :
(write #\n)
--> #\n
(display #\n)
--> n
(write tom and jerry)
--> tom and jerry
(display tom and jerry)
--> tom and jerry

Nh vy write gi nguyn tt c cc k t c bit ca chui khi ghi ln tp. Scheme


cn c hm ghi ln tp tng k t trong dng ra. Gi s ta cn to ra trong th mc hin hnh
tp mailto.txt c n i dung sau :
(define flow (open-output-file mailto.txt))
(display University of Danang flow)

MI TRNG V CP PHT B NH

197

(newline flow)
; ghi k t qua dng
(display
41, Le Duan St., Danang City, Vietnam flow)
(newline flow)
; ghi k t qua dng
(display
Tel: (84.511) 822041, 832678 - Fax: (84.511) 823683
flow)
(close-output-port flow)

G i hm readfile xem li ni dung :


(readfile mailto.txt)
University of Danang
41, Le Duan St., Danang City, Vietnam
Tel: (84.511) 822041, 832678 - Fax: (84.511) 823683
Khi to tp, ghi k t qua dng, ta cng c th s d ng hm write-char :
(write-char #\newline flow)
2. Lnh sao chp tp
Sao chp tp (copy) thng xuyn c s d ng khi lm vic vi tp. Ta xy d ng hm
copy-file tng t cc hm c tp read-file. Hm sao chp tp s x l ln lt
tng k t t u tp n cu i tp, cho n khi gp k hiu eof. Trong hm, ta dng m t vng
lp dng do duyt tp.
(define (copy-file source target)
(call-with-input-file source
(lambda (input-flow)
(call-with-output-file target
(lambda (output-flow)
(do
((char
(read-char input-flow)
(read-char input-flow)))
((eof-object? char))
(write-char char output-flow)))))))
(copy-file "mailto.txt" "uodn.txt")
#t

Khi cn lm vic vi cc tp cha cc hm Scheme, ta c th thay th vic c tng k t


bi c nguyn m t s-biu thc. Tuy nhin, theo cch ny, cc dng ch thch s khng c
sao chp. M t cch tng qut, nu ta c m t tp c t chc theo cu trc dng kh i, ta c
th sao chp tng khi bng cch s d ng chc nng c hoc ghi trn khi. Sau y l mt
chng trnh thc hin sao chp trn tp theo khi :
(define (copy-flow flow-in flow-out rd-block wr-block)
(letrec
((loop
(lambda()
(let ((block (rd-bloc flow-in)))
(if (eof-object? block)
undefine
(wr-bloc bloc flow-out))))))
(loop)))

198

LP TRNH HM

VI.4.4. Giao tip vi h thng


Qu trnh giao tip gia NSD v i h thng ph thu c cch ci t cc trnh thng d ch
ca Scheme. Tuy nhin, Scheme chun c hm load cho php ti mt tp cha cc chng
trnh Scheme vo b nh sn sng g i ch y. C php ca hm load nh sau :
(load filename)

V d : Gi s ti th m c hin hnh c cha tp chng trnh li gii bi ton Thp H


Ni, NSD np vo b nh v gi chy nh sau :
(load hanoi.scm)
--> hanoi.scm
(hanoi 3 #\A #\B #\C)
Move one disk from
Move one disk from
Move one disk from
Move one disk from
Move one disk from
Move one disk from
Move one disk from

A
A
B
A
C
C
A

to
to
to
to
to
to
to

B
C
C
B
A
B
B

Ch rng gi tr tr v c a load khng nh hng n gi tr tr v c a currentinput-port v current-output-port.

Bi tp chng 6
1. Cho bit gi tr tr v t :
((lambda (a)
(let ((a 1))
((f (lambda (x) (+ a x))))
(f a))) 5)
--> ?
2. V cc khi lin kt cho chu lm vic sau y
(let*((x 2) (y (+ x x)) (z (* x y)))
(let ((x y) (y x) (+ *))
(+ x y z)))

Ch ra lin kt hin hnh ca cc bin trong (+ x y z) ?


3. Ti sao khng th dng car thay v head nu nh ngha li car trong phn trnh by
l thuyt ? Gii thch v sao ngi ta khng th s dng nh ngha y :
(define car
(lambda (L)
(if (null? L)
()
(car L))))

MI TRNG V CP PHT B NH

199

4. Vit hm :
a) Tnh s lng cc k t trong m t tp ?
b) Tnh s lng cc k t khng phi l k t phn cch (khng phi l cc du cch,
nh y ct, hay qua dng) ?
5. Vit hm so snh hai tp vn b n tr v dng vn b n u tin khc nhau gia hai tp ?
6. T bn s nguyn dng A, B, C, D sao cho 1A31, 1B12, 1000C2000, 1D7
( ngha c a b n s ny l ngy A thng B n m C l ngy th D, trong D=1 l ngy
Ch nht, D=2 l ngy th Hai, ... D=7 l ngy th By) v ba s nguyn dng A1, B1,
C1 tho mn cc iu kin tng ng i vi A, B, C, hy cho bit ngy A1 thng B1 nm
C1 l ngy th m y ? Ch n cc nm nhun.
7. Cho s nguyn d ng n v bin thc x thay i t 0 n 1 vi b c tng l h = 0.01.

Hy tnh tch phn : I =

sin

x dx

Vi cc gi tr c a n c tnh theo cng thc :


n 1
1 3
2 . 4 ... n 2
I=
2 . 4 ... n 1
3 5
n

vi n chn, n 2
vi n l, n 3

8. T danh sch 5 s nguyn a0, a1, a2 , a3, a4, hy tr v m i nghim nguyn c th c a


phng trnh a thc bc 4 h s nguyn :
a0 + a1x + a2 x2 + a3 x3 + a4 x4 = 0
9. Cho s thc x thay i t 0 n 1 vi b c tng l h = 0.01 v n nguyn dng, b ng cch
s d ng c hai phng php quy v lp, tnh gi tr ca a thc Tsebsep bc n c
cho bi cng thc truy h i nh sau :

Tn(x) = 2xTn1(x) Tn2(x)

vi n = 2, 3, 4, ...

Trong : T0(x) = 1, T1(x) = x.

Un+2(x) = xUn+1(x) - 0.25 Un(x)

vi n = 0, 1, 2, ...

Trong : U0(x) = 1, U1(x) = x.


10. Cho s thc x thay i t 0 n 1 vi b c tng l h = 0.01 v n nguyn dng, b ng cch
s d ng c hai phng php quy v lp, tnh gi tr ca a thc Legendre bc n c
cho bi cng thc truy h i nh sau :

Ln+2(x) = xLn+1(x) -

(n + 1)2
Ln (x)
(2n + 1)(2n + 3)

vi n = 0, 1, 2, ...

Trong : L0(x) = 1, L1(x) = x.


11. Cho s thc x thay i t 0 n 1 vi bc tng l h = 0.01. Tnh t ng :
x2
x3
xn
S = 1 - x +
+ ... + (-1) n
+ ...
2!
3!
n!
vi chnh xc cho trc, chng hn = 10-5

200

LP TRNH HM

12. Cho s thc x thay i t 0 n 1 vi bc tng l h = 0.01 v n nguyn dng.


Tnh gi tr :

y=

x +

x + ... +

c n > 1 du cn

13. Cho s thc x thay i t 0 n 1 vi b`c tng l h = 0.01 v n nguyn dng.


Tm nghim phng trnh vi phn :
1
f(x) = cos x x
3 5
, ...
bit rng nghim gia cc im 0 ca hm cos x, ngha l
,
2
2
f(x n )
Dng phng php lp Newton : x n + 1 = x n , vi f (x) l o hm c a f.
f '(x n )

14. Dy Fibonaci c nh ngha nh sau :


f0 = f1 = 1

fn = fn-1 + fn-2 vi n 2
Vit v t kim tra mt s nguyn m cho trc c phi l s Fibonaci khng ?
15. Cho s n nguyn dng, hy tm gi tr an c xc nh t dy s nguyn a1, a2, ..., an
nh sau :
a1 = 5
a2 = 8
an = an-1 + 3 * (n1)
16. Cho s thc x thay i t 0 n 1 vi bc tng l h = 0.01. Tnh t ng :
1+

x2
2 x4
2 4 x6
+
+
+ ...
2
3 4
3 5 6

vi chnh xc cho trc, chng hn = 10-5


17. Tm tt c cc s c 3 ch s sao cho tng lp phng ca cc ch s bng chnh s .
Chng hn g i a, b, c l 3 ch s ca s cn tm, khi iu kin trn c m t :
100a + 10b + c = aaa + bbb + ccc
V d 153 = 13 + 53 + 33.
18. Nhp vo mt s nguyn ngu nhin bt k in ra theo m i hon v ca cc ch s c
th trong s . V d nhp vo 195 th in ra 159, 915, 951, 519, 591.
19. Cho trc mt thng bt k trong nm, hy cho bit thng ny thuc qu no ? Thng ny
c bao nhiu ngy ? Cho trc m t ngy bt k trong nm dd/mm/yyyy, hy cho bit s
ngy k t ngy u nm 01/01/yyyy (ch nm nhun) ?
20. Cho s thc x thay i t 0 n 1 vi bc tng l h = 0.01. Tnh t ng :
1 x3
1 3 x5
1 3 5 x7

+
+
+ ...
2 3
2 4 5
2 4 6 7
vi chnh xc cho trc, chng hn = 10-5.
x+

MI TRNG V CP PHT B NH

201

21. Vit chng trnh tnh s vi chnh xc 10-4 bit rng :

1 1 1
1
= 1 + +... cho n khi
< 10 4
4
3 5 7
2n 1

22. Cho x thc. Tinh tng :


S = 1+

x2 x4 x6
x 2n
+ + +...+
+...
2! 4! 6!
(2n)!

cho n khi

x 2n
< 105
(2n)!

23. Cho s thc x thay i t 0 n 1 vi bc tng l h = 0.01. Hy tnh :


f (x) = e-x sin (2px)
g (x) = e-2xsin (2px ) + cos (2px)
24. Cho s thc x thay i t 0 n 1 vi bc tng l h = 0.01. Xy dng hm log(a, x) tnh
logarit c s a ca x. Dng hm ny tnh gi tr ca biu thc sau :
log 1 x 2 (1 + x 2 ) khi x < 1

y = 0
khi x = 1
log (x 2 1)
khi x > 1
2
25. Dy s nguyn a0, a1, a2... an,... xc nh bng quy np nh sau :
a0 = 1
an = n an-1

nu n chn

an = n + an-1 nu n l

(n = 2, 4, 6...)
(n = 1, 3, 5...)

Cho trc n, hy tm gi tr an.


26. Tm nghim c a h phng trnh :
ax + by + c = 0
px + qy + r = 0
Ch tr v : khng xc nh
v ph thuc tuyn tnh

nu aq - bp = 0
nu

a
b
c
= = .
p
q
r

Cc h s c cho dng danh sch (a b c p q r).


27. Cho cc danh sch phng, s l cc vect n chiu X, Y v Z :
X = (x1, x2, ..., xn)
Y = (y1, y2, ..., yn)
Tnh tch v hng ca hai vect X v Z, vi vect Z c cc thnh phn zi, i = 1..n, c
xc nh nh sau :
zi = 0
nu 0 < xi + yi< A, A > 0
xi + yi

nu xi + yi A

(xi + yi)2

nu xi + yi 0.

28. Tnh a thc Hermit Hn(x) theo cc phng php s quy v s lp :


H0(x) = 1

202

LP TRNH HM

H1(x) = 2x
Hn(x) = 2xHn-1(x) - 2(n-1)Hn-2(x)
29. Cho s thc x thay i t 0 n 1 vi bc tng l h = 0.01 v n nguyn dng, bng cch
s dng c hai phng php quy v lp, tnh gi tr c a a thc Laguerre bc n (a = 0)
c cho bi cng thc truy hi nh sau :
Ln+2(x) = (x 2n 3)Ln+1(x) - (n + 1)2 Ln(x)

vi n = 0, 1, 2, ...

trong : L0(x) = 1, L1(x) = x 1.


30. Cc nghim c a phng trnh bc ba quy v dng chnh tc : x3 + px + q = 0
c tnh theo cng thc :

1
Arc cos(
3

q
2

p3
27

A=2

p
3

x1 = Acos
2

x 2 = Acos +

x 3 = Acos

c vo n nguyn dng v cc cp gi tr pi, qi, i = 1..n.


a ra cc gi tr nghim tng ng x1 , x2 v x3 .
i

31. Cho N l mt s d ng, tnh cn b c hai N theo phng php Newton (khng s d ng
hm sqrt). Ni dung phng php : Nu gi s l gi tr gn ng c a cn b c hai c a n
N

th 0.5* + s l gi tr gn ng hn ca N. Qu trnh tnh ton dng li khi t ti


s

N
chnh xc cn thit. Gi s ch n = 10 6, khi : 2 1 <
s

MC LC

CHNG V.
V.1

CU TRC D LIU .................................................................................................... 147

TP HP ..................................................................................................................................... 147
1.
2.
3.
4.

Php hp trn cc tp hp............................................................................................................149


Php giao trn cc tp hp...........................................................................................................149
Php hiu ca hai tp hp ............................................................................................................150
Tm cc tp hp con ca mt tp hp .........................................................................................150

V.2

NGN XP .................................................................................................................................. 150


Kiu d liu tru tng ngn xp.......................................................................... 151
Xy dng ngn xp .................................................................................................... 152
Xy dng trnh son tho vn bn ......................................................................... 153
Ngn xp t bin ...................................................................................................... 154
Tnh biu thc s hc dng hu t ........................................................................ 156
V.3
TP ............................................................................................................................................ 158
V.3.1.
Cu trc d liu tru tng kiu tp .................................................................... 158
V.3.2.
V d p dng tp........................................................................................................ 159
V.3.3.
Tp t bin ................................................................................................................. 160
V.4
CAY ........................................................................................................................................... 162
V.4.1.
Cy nh phn ................................................................................................................ 162

V.2.1.
V.2.2.
V.2.3.
V.2.4.
V.2.5.

V.4.1.1. Kiu tru tng cy nh phn ...........................................................................................162


V.4.1.2. Biu din cy nh phn........................................................................................................164
1.
Biu din tit kim s dng hai php cons..................................................................................164
2.
Biu din dng y ..................................................................................................................165
3.
Biu din n gin.........................................................................................................................165
V.4.1.3. Mt s v d lp trnh n gin .........................................................................................166
1.
m s lng cc nt c trong mt cy......................................................................................166
2.
Tnh cao ca mt cy...............................................................................................................166
V.4.1.4. Duyt cy nh phn ..............................................................................................................167

V.4.2.

Cu trc cy tng qut .............................................................................................. 169

V.4.2.1. Kiu tru tng cy tng qut..........................................................................................169


V.4.2.2. Biu din cy tng qut ......................................................................................................169
1.
Biu din cy nh mt b i .......................................................................................................169
2.
Biu din cy n gin qua cc l................................................................................................170
V.4.2.3. Mt s v d v cy tng qut ...........................................................................................170
1.
m s lng cc nt trong cy ..................................................................................................170
2.
Tnh cao ca cy ......................................................................................................................171
V.4.2.4. Duyt cy tng qut khng c x l trung t ...............................................................171

V.4.3.

ng dng cy tng qut ........................................................................................... 172

V.4.3.1.
V.4.3.2.

Xy dng cy c php .........................................................................................................172


V d : o hm hnh thc ..................................................................................................173

CHNG VI.
VI.1

MI TRNG V CP PHT B NH ............................................................... 177

MOI TRNG ............................................................................................................................. 177


Mt s khi nim......................................................................................................... 177
Phm vi ca mt lin kt .......................................................................................... 178

VI.1.1.
VI.1.2.

VI.1.2.1.
VI.1.2.2.
VI.1.2.3.
VI.1.2.4.
VI.1.2.5.

VI.1.3.
VI.1.4.

Phm vi tnh......................................................................................................................178
Php ng = biu thc lambda + mi trng .........................................................179
Thay i b nh v php ng .....................................................................................180
Nhn bit hm..................................................................................................................181
Phm vi ng....................................................................................................................182

Thi gian sng ca mt lin kt ............................................................................. 184


Mi trng ton cc................................................................................................... 184

VI.2

CP PHAT B NH ...................................................................................................................... 185


V d 1 : m phng my tnh b ti ....................................................................... 186
V d 2 : bi ton cn i ti khon ....................................................................... 187
VI.3 M HNH S DNG MI TRNG ............................................................................................... 189
VI.4 VO/RA D LIU ....................................................................................................................... 192
VI.4.1. Lm vic vi cc tp ................................................................................................... 192

VI.2.1.
VI.2.2.

TS. Phan Huy Khanh bin soan 12/1999

203

204

Error! Reference source not found.


VI.4.2.

c d liu trn tp ................................................................................................... 193

1.
2.

Cc hm c tp............................................................................................................................193
Tp vn bn...................................................................................................................................195

VI.4.3.

Ghi ln tp .................................................................................................................... 196

1.
2.

Cc hm ghi ln tp ......................................................................................................................196
Lnh sao chp tp .........................................................................................................................197

VI.4.4.

Giao tip vi h thng ............................................................................................... 198

You might also like