documentgt

Upload: duong-minh-hieu

Post on 18-Jul-2015

1.495 views

Category:

Documents


1 download

TRANSCRIPT

I HC NNG TRNG I HC BCH KHOA

KHOA CNG NGH THNG TIN

GIO TRNH

LP TRNH HM V LP TRNH LGIC

PGS.TS. PHAN HUY KHNH bin son

NNG 3/2009

LP TRNH HM V LP TRNH LGIC

2

Mc lcCHNG 1 I. CC NGN NG LP TRNH..................................................................5 M U V NGN NG LP TRNH ............................................................ 5 I.1. Vi nt v lch s.......................................................................................................5 I.2. nh ngha mt ngn ng lp trnh ......................................................................6 I.3. Khi nim v chng trnh dch ...........................................................................8 PHN LOI CC NGN NG LP TRNH.................................................... 9 NGN NG LP TRNH MNH LNH ......................................................... 11 C S CA CC NGN NG HM.............................................................. 12 NGN NG SCHEME ..............................................................................17 GII THIU SCHEME ..................................................................................... 17 CC KIU D LIU CA SCHEME .............................................................. 18 II.1. Cc kiu d liu n gin .....................................................................................18 II.1.1. Kiu s ................................................................................. 18 II.1.2. Kiu lgch v v t.............................................................. 20 II.1.3. K hiu................................................................................. 21 II.2. Khi nim v cc biu thc tin t .....................................................................23 II.3. S-biu thc ................................................................................................................24 CC NH NGHA TRONG SCHEME ........................................................... 25 III.1. nh ngha bin .......................................................................................................25 III.2. nh ngha hm .......................................................................................................26 III.2.1. Khi nim hm trong Scheme.............................................. 26 III.2.2. Gi hm sau khi nh ngha ................................................. 26 III.2.3. S dng cc hm b tr ....................................................... 27 III.2.4. Tnh khng nh kiu ca Scheme....................................... 28 III.3. Cu trc iu khin.................................................................................................29 III.3.1. Dng iu kin if.................................................................. 29 III.3.2. Bin cc b .......................................................................... 30 III.3.3. nh ngha cc v t............................................................. 32 III.4. S quy v s lp .....................................................................................33 III.4.1. S quy ........................................................................ 33 III.4.2. V d..................................................................................... 34 III.4.3. Tnh dng ca li gi quy ............................................... 36 III.4.4. Chng minh tnh dng ......................................................... 37 III.4.5. S lp .............................................................................. 37 III.5. Vo/ra d liu...........................................................................................................39 III.6. Kiu d liu phc hp ...........................................................................................40 III.6.1. Kiu chui............................................................................ 40 III.6.2. Kiu d liu vect................................................................ 43 III.6.3. Khi nim tru tng ho d liu........................................ 43 III.6.4. nh ngha b i................................................................. 45 III.6.5. t bin trn cc b i ....................................................... 47 III.6.6. ng dng b i .................................................................. 47 III.7. Kiu d liu danh sch ..........................................................................................52 III.7.2. Dng case x l danh sch................................................... 62

II. III. IV. CHNG 2 I. II.

III.

LP TRNH HM V LP TRNH LGIC

3

III.8.

III.9. III.10.

III.11.

III.12.

III.13.

III.7.3. K thut quy x l danh sch phng............................... 64 III.7.4. K thut quy x l danh sch bt k............................... 67 Biu din danh sch................................................................................................70 III.8.1. Biu din danh sch bi kiu b i .................................... 70 III.8.2. Danh sch kt hp................................................................ 73 III.8.3. Dng quasiquote................................................................... 76 Mt s v d ng dng danh sch.......................................................................77 S dng hm .............................................................................................................80 III.10.1. Dng tn hm lm tham i................................................. 81 III.10.2. p dng hm cho cc phn t ca danh sch ...................... 83 III.10.3. Kt qu tr v l hm ........................................................... 85 Php tnh lambda .....................................................................................................86 III.11.1. Gii thiu php tnh lambda................................................. 86 III.11.2. Biu din biu thc lambda trong Scheme .......................... 87 III.11.3. nh ngha hm nh lambda................................................ 88 III.11.4. K thut s dng phi hp lambda...................................... 90 III.11.5. nh ngha hm nh tch lu kt qu................................... 93 III.11.6. Tham i ho tng phn ...................................................... 95 III.11.7. nh ngha quy cc b .................................................... 95 X l trn cc hm..................................................................................................97 III.12.1. Xy dng cc php lp......................................................... 97 III.12.2. Trao i thng ip gia cc hm........................................ 99 III.12.3. T hp cc hm.................................................................. 101 III.12.4. Cc hm c s lng tham i bt k................................ 102 Mt s v d ......................................................................................... 104 III.13.1. Phng php xp x lin tip ............................................. 104 III.13.2. To th tc nh dng ........................................................ 105 III.13.3. X l a thc...................................................................... 106 III.13.4. Thut ton quay lui ............................................................ 111

CHNG 3 I.

NGN NG PROLOG ............................................................................122 GII THIU NGN NG PROLOG ............................................................. 122 I.1. Prolog l ngn ng lp trnh lgich ..................................................... 122 I.1.1. C php Prolog .................................................................. 123 I.1.2. Cc thut ng ..................................................................... 123 I.1.3. Cc kiu d liu Prolog...................................................... 123 I.1.4. Ch thch............................................................................ 124 I.2. Cc kiu d liu s cp ca Prolog...................................................... 124 I.2.1. Kiu hng s ...................................................................... 124 I.2.2. Kiu hng lgich ................................................................ 125 I.2.3. Kiu hng chui k t........................................................ 125 I.2.4. Kiu hng nguyn t.......................................................... 125 I.2.5. Bin .................................................................................... 125 S KIN V LUT TRONG PROLOG ........................................................ 125 II.1. Xy dng s kin ................................................................................. 125 II.2. Xy dng lut....................................................................................... 128 II.2.1. nh ngha lut................................................................... 128 II.2.2. nh ngha lut quy....................................................... 132 II.2.3. S dng bin trong Prolog ................................................. 135 KIU D LIU CU TRC CA PROLOG................................................. 136 III.1. nh ngha kiu cu trc ca Prolog.................................................... 136 III.2. So snh v hp nht cc hng .............................................................. 138

II.

III.

LP TRNH HM V LP TRNH LGIC IV.

4

V.

VI.

VII.

VIII. IX. X.

QUAN H GIA PROLOG V LGICH TON HC ................................ 141 IV.1. Cc mc ngha ca chng trnh Prolog.............................................. 142 IV.2. Ngha khai bo ca chng trnh Prolog ............................................. 142 IV.3. Khi nim v gi mnh ................................................................... 143 IV.4. Ngha lgich ca cc mnh ............................................................. 144 IV.5. Ngha th tc ca Prolog...................................................................... 145 IV.6. T hp cc yu t khai bo v th tc ................................................. 152 V D : CON KH V QU CHUI .............................................................. 153 V.1. Pht biu bi ton................................................................................. 153 V.2. Gii bi ton vi Prolog ....................................................................... 154 V.3. Sp t th t cc mnh v cc ch ............................................... 157 V.3.1. Nguy c gp cc vng lp v hn ...................................... 157 V.3.2. Thay i th t mnh v ch trong chng trnh ........ 159 S HC ........................................................................................................... 162 VI.1. Cc php ton s hc ........................................................................... 162 VI.2. Biu thc s hc................................................................................... 162 VI.3. nh ngha cc php ton trong Prolog................................................ 164 VI.4. Cc php so snh s hc ...................................................................... 168 VI.5. Cc php so snh hng......................................................................... 169 VI.6. V t xc nh kiu............................................................................... 170 VI.7. Mt s v t x l hng........................................................................ 171 NH NGHA HM........................................................................................ 172 VII.1. nh ngha hm s dng quy .......................................................... 172 VII.2. Ti u php quy .............................................................................. 179 VII.3. Mt s v d khc v quy ................................................................ 180 VII.3.1. Tm ng i trong mt th c nh hng .................. 180 VII.3.2. Tnh di ng i trong mt th............................... 181 VII.3.3. Tnh gn ng cc chui .................................................... 181 BIU DIN CU TRC DANH SCH ......................................................... 182 MT S V T X L DANH SCH CA PROLOG................................. 184 CC THAO TC C BN TRN DANH SCH .......................................... 185 X.1. Xy dng li mt s v t c sn ........................................................ 185 X.1.1. Kim tra mt phn t c mt trong danh sch ................... 185 X.1.2. Ghp hai danh sch ............................................................ 186 X.1.3. B sung mt phn t vo danh sch .................................. 189 X.1.4. Loi b mt phn t khi danh sch.................................. 189 X.1.5. Nghch o danh sch ........................................................ 190 X.1.6. Danh sch con .................................................................... 190 X.1.7. Hon v............................................................................... 191 X.2. Mt s v d v danh sch.................................................................... 192 X.2.1. Sp xp cc phn t ca danh sch .................................... 192 X.2.2. Tnh di ca mt danh sch .......................................... 193 X.2.3. To sinh cc s t nhin..................................................... 194

LP TRNH HM V LP TRNH LGIC

5

CHNG 1

CC NGN NG LP TRNH

I.I.1.

M u v ngn ng lp trnhVi nt v lch s

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... 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...

N

Bui ban u

LP TRNH HM V LP TRNH LGIC

6

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.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) : :, (, ), ... 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.

LP TRNH HM V LP TRNH LGIC

7

V d I.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 ch A ... Z a ... z s 0 ... 9

Hnh 0.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 : ::= { | } ::= A | ... | Z | a | ... | z ::= 0 | ... | 9 V d I.2 Vn phm ca mt ngn ng lp trnh n gin dng EBNF nh sau : ::= program * end ::= | ::= := ; ::= while do + done ::= | + | 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... 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.

LP TRNH HM V LP TRNH LGIC

15

Bi tp chng 1 : N LI THUT TON1. 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 ) hoc du hi (?) . Mt dy cc php tnh gi tr biu thc trong mt vng tng tc c gi l mt 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 : Kt qu tnh ton c ghi theo sau du mi 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 : 3

S

2 3

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.

LP TRNH HM V LP TRNH LGIC

18

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 nhng 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 mt dng bt k, hoc t u dng, hoc cui 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.

Cc kiu d liu ca Scheme

Kiu d liu (data type) l mt 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.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.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 V d s nguyn 52 s thc 3.0, -2.5 s hu t 6/10, 23/5 s phc 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. Vi cc s, Scheme cng s dng cc php ton s hc thng dng +, -, *, /, max, min, php ly cn bc hai v so snh s hc vi s lng i s tng ng : (+ x1 ... xn) --> x1 + ... + xn (- x1 x2) --> x1- x2 (* x1 ... xn) --> x1 * ... * xn (/ x1 x2) --> x1/ x2

LP TRNH HM V LP TRNH LGIC (quotient x1 x2) (remainder x1 x2) (modulo x1 x2) (max x1 ... xn) (min x1 ... xn) (sqrt x) --> --> --> --> --> --> phn nguyn ca (x1/ x2) phn d ca php chia nguyn (x1/ x2), ly du x1 phn d ca php chia nguyn (x1/ x2) , ly du x2 max (x1, ..., xn) min (x1, ..., xn) x

19

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) 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 ( #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 : (+ 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)

LP TRNH HM V LP TRNH LGIC --> 6 5 -2 K t Mt k t (character) ca Scheme c dng #\. V d : #\a --> #\a ;ch a thng #\A --> #\A ;ch A hoa #\( --> #\( du ngoc tri

20

Chui Chui (string) l kiu d liu phc hp ca 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 ca chui : Cho cc bn ! --> Cho cc bn ! Tn Mi ngn ng lp trnh u s dng 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 mt ch ci v khng phn bit ch hoa ch thng. Vit pi hay PI u cng ch mt 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 * + vector

II.1.2.

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 mt hm lun tr v gi tr lgch. Theo quy c, tn cc v t c kt thc bi mt du chm hi (?). Th vin Scheme c sn nhiu v t. Sau y l mt s v t dng kim tra kiu ca 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

LP TRNH HM V LP TRNH LGIC (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

21

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

II.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 (ging tn bin) m khng gn vi mt gi tr no khc. Ch Scheme lun lun in ra cc k hiu trch dn dng ch thng. 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 mt bin c tn l firstname :

LP TRNH HM V LP TRNH LGIC (define first-name pierre) *** ERROR unbound variable: pierre.

22

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 mt php trch dn (quote operator) : pierre --> pierre K t l cch vit tt ca hm quote trong Scheme : tng ng vi (quote ) Hm quote l mt dng c bit tin nh cho php tr v tham i ca n d tham i l th no m khng tnh gi tr : (quote pierre) --> pierre Khi nim trch dn c tc dng quan trng : khi nim bng nhau trong ngn ng t nhin v trong Scheme l khc nhau v mt Ton hc : 1+2=3 nhng 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 ca first-name, ta c : first-name --> pierre (define x 3) x --> 3 x --> x H cc ngn ng Lisp rt thun tin cho vic x l k hiu. Mt trong nhng p dng quan trng ca 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. Nhng 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 ca x3 l 3x2. Mt x l k hiu quan trng na l x l chng trnh : mt trnh bin dch c cc d liu l cc chng 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 mt 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) .

LP TRNH HM V LP TRNH LGIC

23

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 ca tt c cc hm vit cho n lc ny), tr khi ngi ta cn x l k hiu. kim tra gi tr mt 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.

Khi nim v cc biu thc tin t

C nhiu cch biu din cc biu thc s hc. Ngn ng Scheme s dng 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 hc 4+76 c vit thnh (+ 4 76). Mt cch tng qut, nu op ch nh mt php ton hai ngi, mt biu thc s hc 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 hc : 4 + 76 + 19 s c vit thnh : (+ 4 76 19) Ch t du cch hay khong trng (space) gia du php ton v gia mi 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 ca vic s dng 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 dng hm f cho cc i s 2, 0 v 18 vit theo dng Ton hc 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 dng trong biu thc. Cc biu thc c th lng 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

LP TRNH HM V LP TRNH LGIC

24

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 lng 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 tng 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 Ngi ta thng vit thng ng cc ton hng ca mt hm, tht 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 thuc vo thi quen (hay s thch) ca ngi lp trnh. Khi cc ton hng l nhng biu thc phc 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 mt ngha trong Scheme, nn ngi lp trnh c th vn dng quy c vit tht dng sao cho ph hp vi thi quen ca h. Chng hn biu thc Ton hc : sin(a) + sin(b) 1 + a2 + b2 c th vit trong Scheme : (/ (+ (sin a) (sin b)) (sqrt (+ 1 (* a a) (* b b))))

II.3.

S-biu thc

Ngi ta gi s-biu thc (s-expression, s c ngha l symbolic) l tt c cc kiu d liu c th gp nhm li vi nhau (lumped together) ng n v mt c php trong Scheme. V d sau y u l cc s-biu thc ca Scheme : 42 #\A (1 . 2) (a b c) #(a b c) Hello (quote pierre) (string->number 16) (begin (display Hello, World!) (newline))

LP TRNH HM V LP TRNH LGIC

25

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 ri , 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 li : (+ 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

III.

Cc nh ngha trong Scheme

III.1. nh ngha binBin (variable) l mt tn gi 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 gi l t kha ca ngn ng do n ch nh mt php ton tin nh. Chng hn, khi mun ch nh cho tn bin pi mt gi tr 3.14, ta vit : (define pi 3.14159) khi , ta c pi --> 3.14159 Dng tng qut ca nh ngha bin nh sau : (define var expr) Sau khi nh ngha bin var s nhn gi tr ca 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 :

LP TRNH HM V LP TRNH LGIC

26

sqrt ; gi tr ca 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 gi 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.

III.2. nh ngha hmIII.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 ca hnh cu bn knh R. Ta s dng dng define c c php nh sau : (define (sphereVolume R) (* 4/3 pi R R R)) 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, mt nh ngha hm c dng : (define (func-name x1 ... xk) body) Cc xi, i=1..k, c gi l cc tham bin hnh thc (formal parameters), hay gi tt l tham bin. Trong Scheme, cc tham bin v gi tr tr v ca 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 dng cc quy c vit cc tham bin gi ra mt cch khng tng minh (implicite) cc kiu ca 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, ... Mt biu thc bt k s, s1, e, exp, ...

III.2.2.

Gi hm sau khi nh ngha

Li gi mt hm sau khi ngi lp trnh t nh ngha tng t li gi mt hm c sn trong th vin ca Scheme. Li gi c dng :

LP TRNH HM V LP TRNH LGIC (func-name arg1 arg2 ... argk)

27

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 ca n ph hp vi kiu d kin trong thn hm. V d, li gi : (spherevolume (+ 8 4)) gy ra vic tnh gi tr tnh ca 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 gi li hm SphereVolum s cho kt qu khc : (SphereVolime 12) --> 7238.22

III.2.3.

S dng cc hm b tr

Do tnh th tnh hnh cu cn tnh lp phng ca mt 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 mt hm ch dng tnh ton trung gian cho mt hm khc, m khng dng chung, ngi ta c th t n trong hm v khng mun nhn thy bi cc hm khc. l khi nim hm cc b i vi mt hm khc. Nh vy, hm cc b cng l hm b tr. Khng c quy tc nht nh xc nh th t nh ngha cc hm. Ngi ta c th nh ngha mt (hoc nhiu) hm chnh trc, ri nh ngha cc hm b tr lm r cc hm chnh, ri tip tc nh ngha cc hm b tr ca 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 ca biu thc, khi cc hm lin quan c nh ngha ri. V d : Hm sau y tnh cnh huyn ca mt 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 ca b din dch Scheme l trnh nh ngha li tt c cc hm.

LP TRNH HM V LP TRNH LGIC

28

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 thuc nhau. V d ta cn tnh x4 x2 vi mt 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 ca 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 cc b i vi f (+ x 3)) x --> 1 (f) --> 5 x --> 1 ; li gi f khng lm thay i nh ngha ton cc ca x Ngi ta khuyn khng nn s dng cc nh ngha hm hay bin cc b bn trong thn ca mt hm : kt qu nhiu khi khng d kin trc c v ph thuc vo b din dch Scheme ang s dng.

III.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 cng c nhng bt tin. Nhn xt : S mm do v kiu cho php s dng 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 mt s phc. Cng mt bin c th biu din lc th mt s, lc th mt chui, v.v... trong khi cc gi tr th li c nh kiu. Tuy nhin, khng nh kiu lm mt tnh an ton, chnh ngi lp phi kim tra kiu ch khng phi l b bin dch. Khng nh kiu cng 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.

LP TRNH HM V LP TRNH LGIC

29

III.3. Cu trc iu khinIII.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 li 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 (= note 8) Gioi) ((>= note 7) Kha) ((>= note 6) Trung binh kha) ((>= note 5) TB) (else Km)))

LP TRNH HM V LP TRNH LGIC

30

Bng cch biu din cc kiu gi tr c bit qua tn gi ca chng, sau y l mt 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 : (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

III.3.2.

Bin cc b

1. nh ngha bin cc b nh dng letKhi 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 mt ln. Nu dng mt hm b tr tnh p th s khng tin nu nh p ch s dng tnh din tch tam gic, cc hm khc khng s dng p s khng cn bit n p.

LP TRNH HM V LP TRNH LGIC

31

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 ngi 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 : (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 letCn xem xt phm v hot ng ca cc bin nh ngha trong let : (define a 10) (let ((a 5) (b (* 2 a))) (+ a b)) --> 25 Gi tr ton cc ca a c nhn thy trong biu thc nh ngha b, v do b=20, nhng trong thn (+ a b) th a = 5 do body nhn thy cc vj. Tuy nhin, gi tr ca bin cc b b li khng xc nh ngoi let : b --> *** ERROR - unbound variable: b Mt cch tng 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 mt 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 :

LP TRNH HM V LP TRNH LGIC (define (pitagore a b) (let ((a2 (* a a)) (b2 (* b b))) (sqrt (+ a2 b2)))) (pitagore 3 4) --> 5.

32

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 ca let* th hin ch gi tr ca vi dng tnh sj, nu i 64 ; a = 4 ; b = 12 ; c = 48

Tht vy, 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 lng 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. Mt cch tng 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) ... ))

III.3.3.

nh ngha cc v t

Nh ni, tn cc v t trong Scheme u t mt du chm (?) hi sau cng. NSD c th nh ngha cc v t v cng 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 dng 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)

LP TRNH HM V LP TRNH LGIC #f (is-even? (- n 1)))) (is-even? 4) --> #t (is-odd? 5) --> #t

33

V t sau y kim tra mt 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 (thng s ln hn 1) cho cc s 2, 3, 5, 7, ... sqrt(n). Vy nu 10 #t

III.4. S quy v s lpIII.4.1. S quyC 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 ( ) (if (zero? )

LP TRNH HM V LP TRNH LGIC ( ( (- 1))))) y, c v u cha c nh ngha theo hm .

34

S quy c gii thch mt cch tng qut nh sau : C mt hoc nhiu ca ra tng ng vi iu kin c tho mn dng qu trnh quy : nu = 0 th ca ra ly gi tr tr v . C mt hoc nhiu li gi quy, ngha l gi li chnh hm , sao cho trong mi trng hp, gi tr ca tham i phi hi t v mt trong cc ca ra dng, thng thng gim dn, chng hn tham i mi l -1. Phng php lp trnh quy mang tnh tng 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 ti hay khng cc trng hp c bit ca bi ton cho nhn c mt li gii trc tip dn n kt qu. 2. C th nhn c li gii ca bi ton cho t li gii 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.

III.4.2.

V d

1. Tnh tng bnh phng cc s t 1 n n Xt hm SumSquare tnh tng 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 ( 120

LP TRNH HM V LP TRNH LGIC

35

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). Ngi ta chng minh c rng :( n - n ) (1 + 5 ) (1 - 5 ) f(n) = vi = ~ 1.6, v = ~ 0.6 2 2 5 y, f c gi l s vng (golden number), vi l nghim ca phng trnh :

x2 = 1 + x. Hm fib trong Scheme c nh ngha nh sau :(define (fib n) (if ( 3 4. Tnh cc h s nh thc Tnh cc h s nh thc hay t hp : s php chn k trong b n phn t. Gi (n k) l h s nh thc 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

LP TRNH HM V LP TRNH LGIC

36

III.4.3.

Tnh dng ca li gi quy

Mt li gi 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 mt li gi quy. V nu khng, s xy 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. Chng hn ca ra ca nh ngha hm fac trn y l (fac 0) ng vi 0!=1. Tuy nhin, mt 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 6 (bad-fact 4) 4) (quotient (bad-fact 5) 5) 4) (quotient 120 5) 4) 24 4)

Kt qu ng, nhng vi li gi 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 nhng 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 li (hoc treo my) :*** ERROR Stack overflow

Ch i vi hm fac, nu ly n 0, hoc n1 = n1, th do gi thit quy np (fact n1) = n1!, do (fact n) = (* n (fact n1)) = n * n1! = n!

III.4.4.

Chng minh tnh dng

Mi li gi 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 dng l tm c mt s nguyn dng gim ngt sau mi ln gi quy. Trong trng hp hm SumSquare, ta ch cn chn tham i n. Hm fib dng v mi li gi ko theo hai li gi quy, mi mt trong chng c tham i mi 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 ca n l gim ngt, v (fac n) ch gi (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 ca hm bad-fact : (bad-fact 0) = (quotient (bad-fact 1) 1) = ... = 1 Nu (bad-fact n1) = n1! l ng vi 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 dng 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 chng minh tnh ng n mt chng trnh qua mt vi v d minh ho.

III.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 vy c mt chui cc php tnh khc nhau, tng tuyn tnh vi n. Ngi ta gi y l qu trnh quy tuyn tnh (linear recursive processus). Trong trng hp tnh hm fib, lc u Scheme hon thc hin mt php cng tin hnh hai li gi quy m khng th tnh ton ng thi. Ngi ta gi y l qu trnh quy dng cy (tree recursive processus). R rng vi kiu qu trnh ny, hm fib i hi mt chi ph tnh ton ng k. By gi ta xt mt cch tnh giai tha khc :(define (fact n) (define (i-fact p r) (if (= p 0) r

LP TRNH HM V LP TRNH LGIC(i-fact ( p 1) (* p r)))) (i-fact n 1))

38

p dng :(fact ; = ; = ; = ; = --> 6 3) (i-fact (i-fact (i-fact (i-fact 3 2 1 0 1) 3) 6) 6)

Ti mi 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 mt s gi tr c nh (l p v r), ri dng li sau . Ngi ta gi 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 vy 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 mt khng gian nh khng i nn ngi lp trnh nn tn dng 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 gi lin tip. Quan h ny cho php chng minh tnh ng n ca chng trnh. Chng hn, ta tnh bt bin ca hm i-fact : p=0 v p! * r = constant = p0! * r0 y, p0 v r0 l cc gi tr trong li gi chnh. Gi s rng li gi quy bo ton quan h ny : p0! * r0 = (p1)! * (p! *r) = p! * r Hn 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 gi chnh l (i-fact n 1), n=0, kt qu ca (fact n) s l n! * 1 = n!. Ngi ta lun lun c th chuyn mt hm quy tuyn tnh thnh quy kt thc, bng cch nh ngha mt hm ph tr c mt 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 ( ) (define ( 354224848179261915075 (fib 200) --> 280571172992510140037611932413038677189525

39

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

III.5. Vo/ra d liuCho 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 nhng nguyn l ca lp trnh Scheme l trnh trn ln cc vic in ra kt qu vi vic tnh ton trong cng mt nh ngha hm. Tuy nhin, trong mt s trng hp, vn c th trn ln cc qu trnh vo/ra vo bn trong ca mt hm. 1. c vo d liu : read Hm (read) c mt d liu bt k ca Scheme t bn phm (l dng vo hin hnh) v tr v gi tr c c m khng xy ra mt tnh ton no. (read)

Sau khi thc hin li gi ny, Scheme bt u trng thi ch ngi s dng 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 mt biu thc ng (khng cn du cch tha) m khng tnh biu thc ny. --> (+ 2 3) Dng tng qut ca hm c d liu ca Scheme c cha mt 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 mt 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 nhng i vi cc chui k t th khng in ra cc du nhy : (display Hello, world!) --> Hello, world!

LP TRNH HM V LP TRNH LGIC qua dng mi, Sheme c hm (newline) khng c tham i :(newline)

40

3. Xy dng vng lp c menu Sau y, ta xy dng mt hm gy ra mt 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 dng g vo. Trong hm menu trn y, ta thy xut hin hiu ng ph trong thn mt hm, ngha l biu thc khng c s dng gi tr m ch in ra.

III.6. Kiu d liu phc hpKiu d liu phc hp trong Scheme gm kiu chui (string), kiu vect (vector), kiu b 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.6.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 :

LP TRNH HM V LP TRNH LGIC(display two \quotes\ within.) --> two quotes within.

41

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 (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.

LP TRNH HM V LP TRNH LGIC(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 :

42

Cc v t so snh chui :(string=? str1 str2) (string