You are on page 1of 201

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

Mc lc
CHNG 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

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.

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

CHNG 1

CC NGN NG LP TRNH

I.
I.1.

M u v ngn ng lp trnh
Vi 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...

Bui ban u

LP TRNH HM V LP TRNH LGIC

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

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 : <tn> ::= <ch> { <ch> | <s> } <ch> ::= A | ... | Z | a | ... | z <s> ::= 0 | ... | 9 V d I.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> ; <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

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

LP TRNH HM V LP TRNH LGIC

II.

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 Truy cp n v t ng cp pht Hnh 0.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 Hng i tng X l song song Khai bo C s d liu V d Hp ng, Autocode FORTRAN, ALGOL, Pascal, C, Ada SELT, Prolog, Miranda

Rt cao My tru tng

Th tc

Lgic

Hm

Hnh 0.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 phn b (distributed programming). Lp trnh rng buc (constraint programming). Lp trnh hng truy cp (access-oriented programming).

LP TRNH HM V LP TRNH LGIC Lp trnh theo lung d liu (dataflow programming), v.v...

10

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

LP TRNH HM V LP TRNH LGIC

11

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

Kiu : tp hp gi tr ..., 1, 0, 1, ... +, , , /, ... tp hp php ton cu trc lu tr bit 14 13 2 2 du


. . .

Mc ngn ng Mc chng trnh dch S 5

Tn bin

22

21

20

biu din theo bit : 0 0 0 ... 1 0 1 Mc my

Hnh 0.5. Quan h gia tn bin, kiu v gi tr trong ngn ng mnh lnh Hnh 0.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 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.

LP TRNH HM V LP TRNH LGIC

12

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.

IV. C s 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 (...)))) 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

LP TRNH HM V LP TRNH LGIC

13

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

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.

LP TRNH HM V LP TRNH LGIC

14

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


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

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! x2 x4 x6 x 2n + + +...+ +... 2! 4! 6 ! (2 n)! x + ... + x cho n khi
x 2n < 105 (2 n)!

S = 1+ y=

x +

c n > 1 du cn

2. Tm c s chung ln 4 ca * s nguyn bt k p, q. 3. Cho danh sch cc s nguyn L v mt s nguyn K, hy 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 xa ba phn t u tin v ba phn t cui cng ca mt danh sch. 5. Vit chng trnh xa N phn t u tin ca mt danh sch. Tht bi nu danh sch khng c N phn t. 6. Vit chng trnh xa N phn t cui cng ca mt danh sch. Tht bi nu danh sch khng c N phn t. 7. nh ngha hai hm even_length v odd_length kim tra s cc phn t ca mt 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 kim tra mt danh sch c phi l mt tp hp con ca mt danh sch khc khng ? 8. Vit chng trnh ly ra phn t th N trong mt danh sch. Tht bi nu danh sch khng c N phn t. Vit chng trnh tm phn t ln nht v phn t nh nht trong mt danh sch cc s. 9. Vit chng trnh kim tra hai danh sch c ri nhau (disjoint) khng ?

10. Vit mt chng trnh gii bi ton thp H Ni (Tower of Hanoi) : chuyn N a c kch thc khc nhau t mt cc qua cc th hai ly cc th ba lm cc trung gian, sao cho

LP TRNH HM V LP TRNH LGIC

16

lun lun tha mn mi ln ch chuyn mt a t mt cc ny sang mt cc khc, trn mt cc th a sau nh hn chng ln trn a trc ln hn v a ln nht di cng. 11. Vit mt chng trnh to ra cc s nguyn t s dng sng Eratosthnes. Chng trnh c th khng kt thc. Th s dng 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 mt 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 gc. Mi 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 2 4 Hnh 0.6. Cy nh phn c 4 nt. Vit chng trnh duyt cy ln lt theo th t gia (tri-gc-phi), trc (gc-tri-phi) v sau (tri- phi-gc) ? 3

LP TRNH HM V LP TRNH LGIC

17

CHNG 2

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

I.

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 hc v x l k hiu. Theo W. Clinger v J. Rees2 : ... 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 tc) gp li nh ngha mt hoc nhiu hm phc tp hn. Hot ng c bn trong lp trnh Scheme l tnh gi tr cc biu thc. Scheme lm vic theo ch tng tc (interaction) vi ngi s dng. Mi vng tng tc xy ra nh sau : Ngi 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 mt du nhc (prompt character) v ch ngi s dng a vo mt biu thc tip theo... Vic la chn du nhc ty theo quy c ca h thng, thng thng l du ln hn (>) 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 : <e>
3

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) (>= 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 : (+ 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 #\<char>. 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 * + <=? V19a pi-chia-2 a34kTMNs is-this-a-very-long-name? list->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 : <exp> tng ng vi (quote <exp>) 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 bin


Bin (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 hm
III.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 khin


III.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 (<= 0 nb) nb ( nb))) Ch dng if ch lun tnh mt trong hai biu thc s-then, hoc s-else. V vy ngi ta gi 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 dng 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) (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 dng cc if lng 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 ca cond l gi tr ca s-biu thc sj. m bo t nht c mt 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 mt 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)))

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


Cn 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<j (vi ng trc sj). (define a 2) (let* ((a (* a a)) (b (* 3 a)) (c (* a b))) (+ a b c )) --> 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<n100 th sqrt(100) = 10 v do vy, n khng th l bi ca cc s 2, 3, 5, 7. Trc tin ta vit v t kim tra n c l bi ca cc s 2, 3, 5, 7 hay khng : (define (multiple2357? n) (or (zero? (remainder n 2)) (zero? (remainder n 3)) (zero? (remainder n 5)) (zero? (remainder n 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

III.4. S quy v s lp
III.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>

LP TRNH HM V LP TRNH LGIC (<func> <arg> (<name> (- <arg> 1))))) y, c <init-val> v <func> u cha c nh ngha theo hm <name>.

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 <arg> = 0 th ca ra ly gi tr tr v <init-val>. C mt hoc nhiu li 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. 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 (<= n 0) m bo x l mi s n 1 (* n (fac (- n 1))))) (fac 5) --> 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 (<= 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 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<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 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, th cng gy ra mt 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 ti hay khng nhng s lp trnh p dng c cho cc nh ngha hm chy 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 4 trng hp c bit . chng minh hm P nh ngha ng (tnh ng) mt hm f no , cn phi chng minh P tho mn hai iu kin l :

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.

LP TRNH HM V LP TRNH LGIC


P ng n tng phn (partial correction). P dng.

37

Trong trng hp tnh giai tha, ta bit rng 0! = 1, v n! = n*(n1)!. By gi ta cn chng minh tnh ng n tng phn ca fac : (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!

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 (<fname> <arg>) (define (<i-name <arg> <result>) (if (zero? <arg>) <result> (<i-name> (- <arg> 1) (<func> <arg> <result>)))) (<i-name> <arg> <init-val>))

Ngi ta cng c th chuyn mt hm quy dng cy thnh quy kt thc, lc ny thi gian tnh hm c rt gn mt cch ngon mc ! Chng hn ta vit li hm tnh cc s Fibonacci theo kiu quy kt thc :

LP TRNH HM V LP TRNH LGIC


(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

39

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

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


Kiu 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<? 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<?, char-ci>?,


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

LP TRNH HM V LP TRNH LGIC


(test expr ...) command ... )

43

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

III.6.3.

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.

LP TRNH HM V LP TRNH LGIC

44

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

LP TRNH HM V LP TRNH LGIC


succ(X) = 0 false 0 = succ(X) false succ(X) = succ(Y) X = Y

45

III.6.4.

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

nh ngha bin c gi tr l mt b i :
(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.

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

LP TRNH HM V LP TRNH LGIC

46

x car 1 cdr 2

Hnh 0.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 : (eq? x (cons 1 2)) --> #f bi v x khng tr n b i mi c to ra bi cons !

LP TRNH HM V LP TRNH LGIC

47

III.6.5.

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 1 2 x 1 2 4 3

(a)

(b) Hnh III.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)

III.6.6.
1.

ng dng b i
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).

LP TRNH HM V LP TRNH LGIC

48

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

LP TRNH HM V LP TRNH LGIC


R1 --> (2 . 3) R2 (4 . 5) (numer R1) --> 2 (denom R2) --> 5 (=rat R1 R2) --> #f

49

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

LP TRNH HM V LP TRNH LGIC

50

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 !

2.

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.

LP TRNH HM V LP TRNH LGIC

51

L H

y 0

Hnh 0.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))))) 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 :

LP TRNH HM V LP TRNH LGIC


(define (translate R (let ((x (value-x ((y (value-y ((L (value-L ((H (value-H (cons-rectangle a b) R)) R)) R)) R))) (+ x a) (+ y b) L H)))

52

b y 0 x

V a

Hnh 0.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)) (value-L R) --> 3 (value-H R) --> 4

III.7. Kiu d liu danh sch


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 :

LP TRNH HM V LP TRNH LGIC


(define week-list) (mon tue wed thu fri sat sun)) --> *** ERROR-unbound variable: mon

53

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) () ; danh sch rng (empty list) khng c phn t no --> () (* 4 5) ; khng phi l mt biu thc tnh c --> (* 4 5) 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

LP TRNH HM V LP TRNH LGIC


(list-ref L 3) --> "bonjour"

54

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 : (length ((a b) (c d) () (e))) --> 4
( a a ( b c ) () ( b c ) () b c ( ( c ) ) ( ( c ) ) ( c ) c d ) d

danh sch cho cc phn t mc 1 cc phn t mc 2 cc phn t mc 3

Hnh 0.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)

LP TRNH HM V LP TRNH LGIC


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

55

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

LP TRNH HM V LP TRNH LGIC


(list a b c) (a b c)

56

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

LP TRNH HM V LP TRNH LGIC


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

57

V t null? ca Scheme cho php kim tra mt danh sch rng.


(null? '()) --> #t

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

LP TRNH HM V LP TRNH LGIC

58

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 :


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

LP TRNH HM V LP TRNH LGIC


R (rev-iter (cdr L) (cons (car L) R)))) (rev-iter L ())) ; hoc (list) (reverse (list 1 2 3 4)) --> (4 3 2 1)

59

Chi ph ca hm reverse vn tu thuc tuyn tnh vo L.

4. Cc hm tham chiu danh sch


(list-ref L n) (list-tail L n) (list? L)

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? (a b c)) --> #t (list? a) --> #f

LP TRNH HM V LP TRNH LGIC


(list? (3 . 4)) --> #f (list? 3) --> #f

60

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

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

LP TRNH HM V LP TRNH LGIC


(string->number 1e3) --> 1000.0 (string->number "1ABC" 16) --> 6844

61

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

LP TRNH HM V LP TRNH LGIC


((null? L) #f) ((eq? (car L) s) L) (else (memq s (cdr L)))))

62

V d : (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.7.2.

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

LP TRNH HM V LP TRNH LGIC


--> consonant (case (car (c d)) ((a) a) ((b) b)) --> khng tr v kt qu g (unspecified)

63

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 solution-display 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))) (else (display 2 racines complex conjuguees: )

LP TRNH HM V LP TRNH LGIC


(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

64

III.7.3.

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=(n1 n2 nj), th n1+n2 + +nj = n1 + (n2 + + 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))) (iota 10) --> (0 1 2 3 4 5 6 7 8 9 10) 3. Nghch o mt danh sch

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

65

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

LP TRNH HM V LP TRNH LGIC

66

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

LP TRNH HM V LP TRNH LGIC


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

67

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

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 : 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))))

LP TRNH HM V LP TRNH LGIC


((pair? (car L)) (+ (Listsum* (car L)) (Listsum* (cdr L)))) (else (Listsum* (cdr L))))) (Listsum* (a (4) 5 ((6 b)) 8)) --> 23

68

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.

3.

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

LP TRNH HM V LP TRNH LGIC


5. So snh bng nhau Kiu tru tng ca dng thc so snh bng nhau (equality) c nh ngha nh sau :

69

= : 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=?

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

eqv?, eq?

equal?

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

LP TRNH HM V LP TRNH LGIC


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

70

III.8. Biu din danh sch


III.8.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)) y ; xem ni dung ca y --> ((a . b ) . c) Biu din dng cy (v n gin) ca cc b i nh sau :

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

B i (a . b)

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

LP TRNH HM V LP TRNH LGIC

71

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


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

Hnh 0.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 3 1 5 2

Hnh 0.8. t bin ca C cng l t bin ca D.

LP TRNH HM V LP TRNH LGIC

72

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 5 6 2 3 4 ( )

Hnh 0.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) 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.

LP TRNH HM V LP TRNH LGIC

73

X ( ) 1

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


; 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.8.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)

LP TRNH HM V LP TRNH LGIC

74

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)

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)

LP TRNH HM V LP TRNH LGIC


(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

75

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

LP TRNH HM V LP TRNH LGIC

76

III.8.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 : (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.

LP TRNH HM V LP TRNH LGIC

77

`(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.9. 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) ) (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)

LP TRNH HM V LP TRNH LGIC


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

78

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) 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 : 3 Thut ton lp phng vi chi ph O(N ). 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). 1 MaxSoFar i MaxEndingHere

Hnh 0.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)

LP TRNH HM V LP TRNH LGIC


(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

79

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 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 B bi xanh b W bi trng w X r R N

bi Vng cha x l Hnh 0.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))

LP TRNH HM V LP TRNH LGIC


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

80

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

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

LP TRNH HM V LP TRNH LGIC

81

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

III.10.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 : 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))

LP TRNH HM V LP TRNH LGIC

82

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

LP TRNH HM V LP TRNH LGIC


(sum-sqrt 4 9) --> 15.1597 (sum-any sqrt 4 9) --> 15.1597

83

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 + dx) - f ( x) dx 0 dx S gia dx phi tng i nh sao cho c lng l ng. Hm tnh o hm c nh ngha nh sau : f '( x) = lim
; 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

III.10.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 :

LP TRNH HM V LP TRNH LGIC


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

84

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

LP TRNH HM V LP TRNH LGIC


((atom? s) 0) ; danh sch phng c su 1 ((null? s) 1) ; x l danh sch khc rng (else (+ 1 (apply max (map depth s)))))) (depth a) > 0 (depth (a)) > 1 (depth (a (b c) ((d (e))) yes ())) > 4

85

III.10.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)

LP TRNH HM V LP TRNH LGIC


(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

86

Trong hai li gi trn, x ln lt ly cc gi tr 2 v 2, cn y ly 7 v 7.

III.11. Php tnh lambda


III.11.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. 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) :

LP TRNH HM V LP TRNH LGIC

87

app
x

app x y y

app x

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

III.11.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 :
(lambda () (display 1) (display < = ) (display 2) (newline))

LP TRNH HM V LP TRNH LGIC Khi gi s dng, khng cn a vo tham i thc s :


((lambda () (display 1) (display < = ) (display 2) (newline))) --> 1 < 2

88

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

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

LP TRNH HM V LP TRNH LGIC


(if (null? L) #f (or (equal? s (car L)) ((define (my-member? s L)

89

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

LP TRNH HM V LP TRNH LGIC


(display-liste (a b c d e)) --> a b c d e (display-liste (a (b ()) c (d) e)) --> a (b ()) c (d) e

90

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.

III.11.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 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)))))

LP TRNH HM V LP TRNH LGIC


(pitagore 3 4) --> 5.

91

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 (let ((curr (list -1))) (lambda () (set-car! curr (+ (car curr) 1)) (car curr)))) (gennerator) --> 0 (gennerator) --> 1 (gennerator) --> 2 (gennerator) --> 3

LP TRNH HM V LP TRNH LGIC

92

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

LP TRNH HM V LP TRNH LGIC


(define curr (list -1)) (set-car! curr (+ (car curr) 1)) (car curr)) (gennerator_e2) --> 0 (gennerator_e2) --> 0

93

III.11.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) (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.

LP TRNH HM V LP TRNH LGIC

94

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

LP TRNH HM V LP TRNH LGIC


(foldl cons --> (((((0 (foldr cons --> (1 2 3 0 . 0 4 (1 2 3 4 5)) 1) . 2) . 3) . 4) . 5) (1 2 3 4 5)) 5 . 0)

95

III.11.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))))) ((((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.

III.11.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)

LP TRNH HM V LP TRNH LGIC

96

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

LP TRNH HM V LP TRNH LGIC

97

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) () (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) (lambda (x1 ... xN) (letrec (f1 e1) ... (fN eN)) s))

III.12. X l trn cc hm
III.12.1. 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 appendmap nh sau :
(define (append-map f L) (apply append (map f L)))

LP TRNH HM V LP TRNH LGIC

98

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

LP TRNH HM V LP TRNH LGIC

99

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

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

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

LP TRNH HM V LP TRNH LGIC


(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 ((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)}

100

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 :

LP TRNH HM V LP TRNH LGIC


(define (cons x y) (lambda (m) (cond ((eq? m car) x) ((eq? m cdr) y) (else (error "unknown message"))))) (define (car D) (D car)) (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

101

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

LP TRNH HM V LP TRNH LGIC

102

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 :
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) (f sqrt) ; to danh sch mt phn t ; tnh cn bc hai mt s nguyn

--> 1.41421

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

III.12.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) ... )

LP TRNH HM V LP TRNH LGIC tng ng vi :


(define f (lambda (x y z) ... ) 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 :

103

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

LP TRNH HM V LP TRNH LGIC


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

104

III.13. Mt s v d
III.13.1. 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) : (2) x = (x2 + 2)/2x 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 : (3) x0 = f (xo) 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 =

x 1 + vi x0 = 1 : 2 x

(n-iter (lambda (x) (+ (/ x 2) (/ 1. 0 x))) 10 1) --> 1. 41421

V d 2 : Tnh gn ng x = sin (2x) : (n-inter (lambda (x) (sin (* 2 x))) 10 1) --> 0.948362

LP TRNH HM V LP TRNH LGIC

105

III.13.2. To th tc nh dng
Sau y l mt v d t to mt 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 chui nh dng, cn L-args l cc biu thc tham i (s lng tu ) c a ra theo cch quy c trong chui 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 ^a hoc ^A ^% ^^

ch v tr write a ra gi tr tham i tng ng 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 chui nh dng a ra kt qu. Cch hot ng n gin nh sau : th tc duyt chui nh dng v a ra mi k t khng t trc mt k t c bit ^. Khi gp ^, th tc 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)) (else (display "unknown character"))) (begin (display c) (format-to (+ i 1) L)))))))) (format-to 0 L))))

LP TRNH HM V LP TRNH LGIC

106

III.13.3. X l a thc
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 mt biu thc dng : axn vi a l h s thc v n l bc ca 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 mt a thc ca x. Lc ny du cng c vai tr phn cch cc n thc. Ta cha nh ngha php cng trn a thc, tuy nhin mt cch trc gic, ta c th rt gn a thc thnh : 9x4 + -10 +27x x l cc a thc trong Scheme, trc ht ta cn a ra mt cch biu din a thc thng nht. Ta bit rng php cng cc n thc c cng bc theo nguyn tc nh sau : nu a+b = 0 axn +bxn = o axn +bxn = (a+b)xn nu khng Bng cch cng tt c cc n thc cng bc v sp xp mt 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 ca n l bc ca a thc, h s ca n l h s nh hng (director) hay h s tri. V d a thc trn y c bc l 4 v c vit li l : 9x4 +27x + -10 Ngi 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.

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 tri. V d a thc 9x4 +27x + -10 c biu din bi danh sch : (9 0 0 27 -10)
2. Biu din hng (hollow representation) S dng mt danh sch cc n thc khc 0 theo bc gim dn, mi 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 mt a thc thnh mt n thc tri v mt a thc cn li 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.

LP TRNH HM V LP TRNH LGIC

107

Trc tin, ta tin hnh cc thao tc x l a thc m cha nu ra cch biu din hng trong Scheme.Ta gi 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 tri 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 nhng 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 remain-poly tha mn cc quan h sau : (coeff-domin (cons-poly coeff degree (degree-poly (cons-poly coeff degree (remain-poly (cons-poly coeff degree
degree-poly, coeff-domin, poly)) = coeff poly)) = 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 ca a thc va trnh by trn y m tip tc s dng chng trong cc php x l di y.

3.

X l a thc
Cho trc a thc P = cxd + Q, cc php x l trn P bao gm : Nhn a thc vi 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, ly a nhn vi h s tri 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 (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 tri, 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

LP TRNH HM V LP TRNH LGIC


(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 ca hai a thc cn li (equal-poly? Q1 Q2))))))

108

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 cng cc n thc tri 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 hn, 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))) (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 :

LP TRNH HM V LP TRNH LGIC


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

109

5.

Biu din trong mt a thc

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

Nh vy mi a thc c biu din bi mt danh sch kt hp alist. Chng hn a thc : 9x4 +27x + -10 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 ca 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)))

LP TRNH HM V LP TRNH LGIC

110

car degree

cdr coefficient

Hnh 0.14. 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)))

6.

a ra a thc

nhn thy cc a thc trn mn hnh, hay trn giy in, ta c th biu din chng nh cc k t ASCII thng dng. 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 gi 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 +) (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 thng tnh ton hnh thc (formal calculus).

LP TRNH HM V LP TRNH LGIC

111

III.13.4. Thut ton quay lui


Khi gii nhng 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 ngi 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 chn trc tip tc qu trnh.

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 gi qun hu l Q, u tin t Q ti ct th nht, sau , tm cch t Q ct th hai sao cho khng b Q ct trc n v c th tip tc cho cc ct tip theo. C th ti mt s la chn no khng cho php t c Q tip theo (ti ct j). Khi , ngi 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 chn 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 gc n mt l (nt ngoi) no c th l mt li gii ca bi ton cho. Xut pht t nt gc ca 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 mt nt cho bit tht bi, ngi ta phi quay ln nt cha v bt u vi nt con cha 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 (depth-first-search algorithm). xut pht

thnh cng thnh cng Hnh 0.15. Tm li gii trn cy trng thi. tng ca thut ton nh sau : Gi 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 gi 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.

2.

Tm kim cc li gii

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

LP TRNH HM V LP TRNH LGIC

112

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 mt 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 mt trng thi cho, v t finalstate? kim tra trng thi cui 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 III.12.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 gp vo danh sch ln lt cc li gii tip theo c th tm c nh sau :
(define (list-of-solutions state) if (finalstate? state) (if (solution? state) (list state) ()) (append-map list-of-solutions (followingstates state))))

Cui cng, ngi ta mong mun 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 thy 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))

LP TRNH HM V LP TRNH LGIC

113

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

Hng i

Hnh 0.16. 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 li gii. Bn c vua c 88 c nh s theo hng 1..8 v theo ct 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 ca 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 thy khi trng thi c 8 con Q v mi 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?. (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 chn sao cho khng b n bi cc Q khc trong trng thi ang xt. Ta cn xc dnh hm admissible? kim tra nu mt 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 0.17. V tr chp nhn c ca mt qun hu. Ni cch khc, khng c con Q no nm trn hng, trn ct, 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

LP TRNH HM V LP TRNH LGIC

114

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 tc 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 ct. V tr chp nhn c ca mt con Q c minh ho trn hnh 0.17. xy dng 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 : (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)

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.

LP TRNH HM V LP TRNH LGIC


(list-of-solutions state) --> Tm tt c cc li gii. (some-solutions state) --> Tm ln lt cc li gii theo yu cu.

115

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 mt v tr khng th tip tc. (solution? state) --> V t kim tra mt trng thi l mt 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 mt trng thi cho. (admissible? newqueen existing-queens) --> V t kim tra nu v tr ca con Q mi khng b n bi cc con Q khc t ti cc ct trc trong danh sch trng thi.

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


(a-solution ()) --> (4 2 7 3 6 8 5 1) (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

LP TRNH HM V LP TRNH LGIC

116

Bi tp chng 2 NGN NG SCHEME


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)) 7. Vit hm yu cu ngi s dng g vo mt s nm gia 0 v 1000 tr v gi tr bnh phng ca s . t hm ny vo trong mt vng lp vi menu.

LP TRNH HM V LP TRNH LGIC 8. Vit hm s dng menu gii h phng trnh i s tuyn tnh : ax + by = 0 cx + dy = 0

117

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 ca 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 dng 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 ca 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 nhng s dng phng php chia i : 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 Ni. V d : (Hanoi 2 A B C) --> Move A to B Move A to C Move B to C 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))
2

LP TRNH HM V LP TRNH LGIC


(cdr (list 1 2 3 4 5)) (cadr (list 1 2 3 4 5)) (caddr (list 1 2 3 4 5))

118

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))) (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 c d e f

b d e

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

2)

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)

LP TRNH HM V LP TRNH LGIC

119

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 : (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: Tr : Nhn : Chia : Lu tha : (a + bi) (c + di) = (a c) + (b d)i (a + bi) (c + di) = (a c) + (b d)i (a + bi) (c + di) = (ac bd) + (ad bc)i
(a + bi) (ac + bd) (bc ad) = + i , vi iu kin c2 + d2 0. 2 2 2 2 (c + di) (c + d ) (c + d )

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

a2 + b2 ,

= arctg

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

b a trong :

LP TRNH HM V LP TRNH LGIC


a b + , y= 2 2
2 2

120
a b + 2 2
2 2

x=

a + 2

a + 2

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

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

21. Cho bit gi tr ca : ((lambda (x y z) (+ x y z)) 1 (+ 2 5) 3) ((lambda (L) ((lambda (x) (append L (list x))) 0)) '(a)) 22. 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 ca cc li gi sau y : (g 0 x) (g 4 1) (g 3 x) (eq? (cadr z) (car y)) (eq? (car z) (cdr z)) 23. Cho : U0 =V0 =1 Un = Un-1 + Vn-1 Vn = Un-1 * Vn-1 Dng letrec tnh gi tr ca U3 *V4 ? 24. 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))))) 25. Cho a thc bc n h s thc (hoc nguyn) mt 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 : (a0, a1, a2, . . . an) hoc (an, an1,. . . a1, a0) Hy vit trong Scheme hm (eval-pol p x) tnh gi tr ca a thc P(x) vi mt

LP TRNH HM V LP TRNH LGIC

121

gi tr x s dng c hai phng php quy v phng php lp, mi phng php x l theo hai cch biu din h s trn y. 26. Vit hm tnh su ca danh sch : (profondeur (a (b ( c d)) e)) --> 3 27. 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

28. Vit hm to danh sch ni vng cho mt danh sch cho. 29. Vit hm kim tra mt danh sch c l tin t ca mt danh sch cho. 30. Vit hm m cc phn t ca mt danh sch ni vng cho. 31. 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 ca n l tng con ln nht ca L (xem v d mc III.8.1, 3). 32. Cho mt xu k t c di N, N c xem rt ln. Hy phn loi mi 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) ? 33. Cho mt danh sch c N t (word) 32 bit, N c xem rt ln. Hy m s bit bng 1 trong mi t ca danh sch cho ? 34. Cho mt danh sch c N s nguyn. Hy vit cc th tc sp xp m phng cc thut ton sp xp chn v chn. 35. Khi sp xp mt dy, ngi ta thng s dng hm b tr swap(a, b) hon i gi tr ca 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))))

LP TRNH HM V LP TRNH LGIC

122

CHNG 3

NGN NG PROLOG
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

I.
I.1.

Gii thiu ngn ng Prolog


Prolog l ngn ng lp trnh lgich

Prolog l ngn ng c s dng ph bin nht trong dng cc ngn ng lp trnh lgich (Prolog c ngha l PROgramming in LOGic). Ngn ng Prolog do gio s ngi Php Alain Colmerauer v nhm nghin cu ca ng xut ln u tin ti trng i hc Marseille u nhng nm 1970. n nm 1980, Prolog nhanh chng c p dng rng ri chu u, c ngi Nht chn lm ngn ng pht trin dng my tnh th h 5. Prolog c ci t trn cc my vi tnh Apple II, IBM-PC, Macintosh. Prolog cn c gi l ngn ng lp trnh k hiu (symbolic programming) tng t cc ngn ng lp trnh hm (functional programming), hay lp trnh phi s (non-numerical programming). Prolog rt thch hp gii quyt cc bi ton lin quan n cc i tng (object) v mi quan h (relation) gia chng. Prolog c s dng ph bin trong lnh vc tr tu nhn to. Nguyn l lp trnh lgich da trn cc mnh Horn (Horn logc). Mt mnh Horn biu din mt s kin hay mt s vic no l ng hoc khng ng, xy ra hoc khng xy ra (c hoc khng c, v.v...). V d I.1 : Sau y l mt s mnh Horn : Nu mt ngi gi m (v) khn ngoan th ngi hnh phc. Jim l ngi hnh phc. Nu X l cha m ca Y v Y l cha m ca Z th X l ng ca Z. Tom l ng ca Sue. Tt c mi ngi u cht (hoc Nu ai l ngi th ai phi cht). Socrat l ngi. Trong cc mnh Horn trn, cc mnh 1, 3, 5 c gi l cc lut (rule), cc mnh cn li c gi l cc s kin (fact). Mt chng trnh lgich c th c xem nh l mt c s d liu gm cc mnh Horn, hoc dng lut, hoc dng s kin, chng hn nh tt c cc s kin v lut t 1 n 6 trn. Ngi s dng (NSD) gi chy mt chng trnh lgich bng cch t cu hi (query/ question) truy vn trn c s d liu ny, chng hn cu hi : Socrat c cht khng ? (tng ng khng nh Socrat cht ng hay sai ?) Mt h thng lgich s thc hin chng trnh theo cch suy lun-tm kim da trn vn hiu bit c l chng trnh - c s d liu, minh chng cu hi l mt khng nh, l ng (Yes) hoc sai (No). Vi cu hi trn, h thng tm kim trong c s d liu khng nh Socrat cht v tm thy lut 5 tho mn (v th). Vn dng lut 5, h thng nhn c Socrat l ngi (v nu) chnh l s kin 5.

LP TRNH HM V LP TRNH LGIC T , cu tr li s l : Yes c ngha s kin Socrat cht l ng.

123

I.1.1. C php Prolog

I.1.2. Cc thut ng
Mt chng trnh Prolog l mt c s d liu gm cc mnh (clause). Mi mnh c xy dng t cc v t (predicat). Mt v t l mt pht biu no v cc i tng c gi tr chn ng (true) hoc sai (fail). Mt v t c th c cc i l cc nguyn lgich (logic atom). Mi nguyn t (ni gn) biu din mt quan h gia cc hng (term). Nh vy, hng v quan h gia cc hng to thnh mnh . Hng c xem l nhng i tng d liu trong mt trnh Prolog. Hng c th l hng s cp (elementary term) gm hng (constant), bin (variable) v cc hng phc hp (compound term). Cc hng phc hp biu din cc i tng phc tp ca bi ton cn gii quyt thuc lnh vc ang xt. Hng phc hp l mt hm t (functor) c cha cc i (argument), c dng
Tn_hm_t(i_1, ..., i_n) Tn hm t l mt chui ch ci v/hoc ch s c bt u bi mt ch ci thng. Cc i c th l bin, hng s cp, hoc hng phc hp. Trong Prolog, hm t c bit . (du chm) biu din cu trc danh sch (list). Kiu d liu hm t tng t kiu bn ghi (record) v danh sch (list) tng t kiu mng (array) trong cc ngn ng lp trnh mnh lnh (C, Pascal...).

V d I.2 :
f(5, a, b). student(robert, 1975, info, 2, address(6, 'mal juin', 'Caen')). [a, b, c]

Mnh c th l mt s kin, mt lut (hay quy tc), hay mt cu hi. Prolog quy c vit sau mi mnh mt du chm kt thc nh sau : S kin : < ... >. (tng ng vi lut < ... > :- true. ) Lut : < ... > :- < ... >. Cu hi ?- < ... >. ( ch tng tc c du nhc lnh)

I.1.3. Cc kiu d liu Prolog


Hnh 1.1. biu din mt s phn lp cc kiu d liu trong Prolog gm kiu d liu s cp v kiu d liu c cu trc. S phn lp ny nhn bit kiu ca mt i tng nh b ngoi c php. C php ca Prolog quy nh mi kiu i tng c mt dng khc nhau. Prolog khng cn cung cp mt thng tin no khc nhn bit kiu ca mt i tng. Trong Prolog, NSD khng cn khai bo kiu d liu.

LP TRNH HM V LP TRNH LGIC

124

kiu d liu kiu s cp hng s bin kiu phc hp

chui k t nguyn t Hnh I.1. Cc kiu d liu trong Prolog

Cc kiu d liu Prolog c xy dng t cc k t ASCII : Cc ch ci in hoa A, B, ..., Z v ch ci in thng a, b, ..., z. Cc ch s 0, 1, ..., 9. Cc k t c bit, chng hn + - * / < > = : . & _ ~.

I.1.4. Ch thch
Trong mt chng trnh Prolog, ch thch (comment) c t gia hai cp k hiu /* v */ (tng t ngn ng C). V d : /*************************/ /*** y l mt ch thch ***/ /*************************/ Trong trng hp mun t mt ch thch ngn sau mi phn khai bo Prolog cho n ht dng, c th t trc mt k hiu %. V d :
%%%%%%%%%%%%%%%%%%%%% % y cng l mt ch thch %%%%%%%%%%%%%%%%%%%%%

Prolog s b qua tt c cc phn ch thch trong th tc.

I.2.

Cc kiu d liu s cp ca Prolog

I.2.1. Kiu hng s


Prolog s dng c s nguyn v s thc. C php ca cc s nguyn v s thc rt n gin, chng hn nh cc v d sau :
1 3.14 1515 -0.0035 0 100.2 -97

Tu theo phin bn ci t, Prolog c th x l cc min s nguyn v min s thc khc nhau. V d trong phin bn Turbo Prolog, min s nguyn cho php t -32768 n 32767, min s thc cho php t 1e-307 n 1e+308. Cc s thc rt khi c s dng trong Prolog. L do ch yu ch Prolog l ngn ng lp trnh k hiu, phi s. Cc s nguyn thng ch c s dng khi cn m s lng cc phn t hin din trong mt danh sch Prolog dng [a1, a2, ..., an ].

LP TRNH HM V LP TRNH LGIC

125

I.2.2. Kiu hng lgich


Prolog s dng hai hng lgich c gi tr l true v fail. Thng thng cc hng lgich khng c dng nh tham s m c dng nh cc mnh . Hng fail thng c dng to sinh li gii bi ton.

I.2.3. Kiu hng chui k t


Cc hng l chui (string) cc k t c t gia hai du nhy kp.
"Toto \#\{@ tata" "" "\""

chui c tu k t chui rng (empty string) chui ch c mt du nhy kp.

I.2.4. Kiu hng nguyn t


Cc hng nguyn t Prolog l chui k t mt trong ba dng nh sau : (1) Chui gm ch ci, ch s v k t _ lun lun c bt u bng mt ch ci in thng.
newyork nil x25 a_ x__y tom_cruise

(2) Chui cc k t c bit :


<---> ======> ... .:. ::==

(3) chui t gia hai du nhy n (quote) c bt u bng ch in hoa, dng phn bit vi cc tn bin :
Jerry Tom SMITH

I.2.5. Bin
Tn bin l mt chui k t gm ch ci, ch s, bt u bi ch hoa hoc du gch di dng :
X, Y, A Result, List_of_members _x23, _X, _, ...

II.
II.1.

S kin v lut trong Prolog


Xy dng s kin

V d II.1 : Quan h gia nh xy dng cc s kin trong mt chng trnh Prolog, ta ly mt v d v. Ta xy dng mt cy gia h nh Hnh II.1. Trong cy gia h (a), cc nt ch ngi, cn cc mi tn ch quan h cha m ca (parent of). S kin Tom l cha m ca Bill c vit thnh mt v t Prolog nh sau (ch mnh c kt thc bi mt du chm) :
parent(tom, bill). % Ch khng c du cch trc du m ngoc

LP TRNH HM V LP TRNH LGIC

126

y, v t parent c hai i l tom v bill. Ngi ta c th biu din v t ny bi mt cy nh trong Hnh II.1 (b) : nt gc l tn ca v t, cn cc nt l l cc i.
mar bil l ann jim sue tom liz tom bill parent

(a)

(b)

Hnh II.1.Cy gia h. T cy gia h trn y, c th tip tc vit cc v t khc nhn c mt chng trnh Prolog gm 6 v t nh sau : parent(mary, bill). parent(tom, bill). parent(tom, liz). parent(bill, ann). parent(bill, sue). parent(sue, jim). Sau khi h thng Prolog nhn c chng trnh ny, thc cht l mt c s d liu, ngi ta c th t ra cc cu hi lin quan n quan h parent. V d cu hi Bill c phi l cha m ca Sue c g vo trong h thng i thoi Prolog (du nhc ?-_) nh sau :
?- parent(bill, sue).

Sau khi tm thy s kin ny trong chng trnh, Prolog tr li :


Yes Ta tip tc t cu hi khc : ?- parent(liz, sue). No Bi v Prolog khng tm thy s kin Liz l ngi m ca Sue trong chng trnh. Tng t, Prolog tr li No cho s kin : ?- parent(tom, ben).

V tn ben cha c a vo trong chng trnh. Ta c th tip tc t ra cc cu hi th v khc. Chng hn, ai l cha (hay m) ca Liz ?
?- parent(X, liz).

Ln ny, Prolog khng tr li Yes hoc No, m a ra mt gi tr ca X lm tho mn cu hi trn y :


X = tom

bit c ai l con ca Bill, ta ch cn vit :


?- parent(bill, X).

Vi cu hi ny, Prolog s c hai cu tr li, u tin l :


X = ann ->;

LP TRNH HM V LP TRNH LGIC

127

bit c cu tr li tip theo, trong hu ht cc ci t ca Prolog, NSD phi g vo mt du chm phy (;) sau -> (Arity Prolog) :
X = sue

Nu ht phng n tr li m vn tip tc yu cu (;), Prolog tr li No. NSD c th t cc cu hi tng qut hn, chng hn : ai l cha m ca ai ? Ni cch khc, cn tm X v Y sao cho X l cha m ca Y. Ta vit nh sau : ?- parent(X, Y). Sau khi hin th cu tr li u tin, Prolog s ln lt tm kim nhng cp cha m con tho mn v ln lt hin th kt qu nu chng no NSD cn yu cu cho n khi khng cn kt qu li gii no na (kt thc bi Yes) : X = mary Y = bill ->; X = tom Y = bill ->; X = tom Y = liz ->; X = bill Y = ann ->; X = bill Y = sue ->; X = sue Y = jim Yes Tu theo ci t Prolog, NSD c th g vo mt du chm (.) hoc Enter chm dt gia chng lung tr li. Ta c th tip tc a ra nhng cu hi phc tp hn khc, chng hn ai l ng (b) ca Jim ? Thc t, quan h ng b (grandparent) cha c nh ngha, cn phi phn tch cu hi ny thnh hai phn s cp hn : 1. Ai l cha (m) ca Jim ? Gi s c tn l Y. 2. Ai l cha (m) ca Y ? Gi s c tn l X.
X parent Y parent jim grandparent

Hnh II.2. Quan h ng b c hp thnh t hai quan h cha m. Lc ny, c th vit trong Prolog nh sau :
?- parent(Y, jim), parent(X, Y). Prolog tr li : Y = sue X = bill Yes

Cu hi trn y tng ng vi cu hi : tm X v Y tho mn :

LP TRNH HM V LP TRNH LGIC


parent(Y, jim)

128

v
parent(X, Y).

Nu thay i th t hai thnh phn cu hi, th ngha lgich vn khng thay i v Prolog tr li cng kt qu (c th thay i v th t), ngha l ta c th t cu hi nh sau :
?- parent(X, Y), parent(Y, jim). X = bill Y = ng dn Yes

By gi ta t cu hi ai l chu ca Tom ?
?- parent(tom, X), parent(X, Y). X = bill Y = ann->; X = bill Y = sue ->; No

Mt cu hi khc c th nh sau : Ann v Sue c cng ngi ng khng ? ngha l ta din t thnh hai giai on : 1. Tm X l cha m ca Ann. 2. X tm thy c cng l cha m ca Sue khng ? Cu hi v tr li trong Prolog nh sau :
?- parent(X, ann), parent(X, sue). X = bill

Trong Prolog, cu hi cn c gi l ch (goal) cn phi c tho mn (satisfy). Mi cu hi t ra i vi c s d liu c th tng ng vi mt hoc nhiu ch. Chng hn dy cc ch :
parent(X, ann), parent(X, sue).

tng ng vi cu hi l php hi (conjunction) ca 2 mnh : X l mt cha m ca Ann, v X l mt cha m ca Sue. Nu cu tr li l Yes, th c ngha ch c tho mn, hay thnh cng. Trong trng hp ngc li, cu tr li l No, c ngha ch khng c tho mn, hay tht bi. Nu c nhiu cu tr li cho mt cu hi, Prolog s a ra cu tr li u tin v ch yu cu ca NSD tip tc.

II.2. Xy dng lut


II.2.1. nh ngha lut
T chng trnh gia h trn y, ta c th d dng b sung cc thng tin khc, chng hn b sung cc s kin v gii tnh (nam, n) ca nhng ngi nu tn trong quan h parent nh sau : woman(mary). man(tom). man(bill). woman(liz).

LP TRNH HM V LP TRNH LGIC


woman(sue). woman(ann). man(jim).

129

Ta nh ngha cc quan h n (unary) woman v man v chng ch lin quan n mt i tng duy nht. Cn quan h parent l nh phn, v lin quan n mt cp i tng. Nh vy, cc quan h n dng thit lp mt thuc tnh ca mt i tng. Mnh :
woman(mary).

c gii thch : Mary l n. Tuy nhin, ta cng c th s dng quan h nh phn nh ngha gii tnh :
sex(mary, female). sex(tom, male). sex(bill, male). ...

By gi ta a vo mt quan h mi child, i ngc vi parent nh sau :


child(liz, tom).

T , ta nh ngha lut mi nh sau :


child(Y, X) :- parent(X, Y).

Lut trn c hiu l : Vi mi X v Y, Y l con ca X nu X l cha (hay m) ca Y. hay Vi mi X v Y, nu X l cha (hay m) ca Y th Y l con ca X. C s khc nhau c bn gia s kin v lut. Mt s kin, chng hn :
parent(tom, liz).

l mt iu g lun ng, khng c iu kin g rng buc. Trong khi , cc lut lin quan n cc thuc tnh ch c tho mn nu mt s iu kin no c tho mn. Mi lut bao gm hai phn:

phn bn phi (RHS: Right Hand Side) ch iu kin, cn c gi l thn (body) ca lut, v phn bn tri (LH: Left Hand Side S) ch kt lun, cn c gi l u (head) ca lut.

Nu iu kin parent(X, Y) l ng, th child(Y, X) cng ng v l hu qu lgich ca php suy lun (inference). child(Y, X) :- parent(X, Y). u ?
?- child(liz, tom)

thn

Cu hi sau y gii thch cch Prolog s dng cc lut : Liz c phi l con ca Tom khng

LP TRNH HM V LP TRNH LGIC

130

Thc t, trong chng trnh khng c s kin no lin quan n con, m ta phi tm cch p dng cc lut. Lut trn y dng tng qut vi cc i tng X v Y bt k, m ta li cn cc i tng c th liz v tom. Ta cn s dng php th (substitution) bng cch gn gi tr liz cho bin Y v tom cho X. Ngi ta ni rng cc bin X v Y c rng buc (bound) :
X = tom

v
Y = liz

Lc ny, phn iu kin c gi tr parent(tom, liz) v tr thnh ch con (sub-goal) Prolog thay th cho ch child(liz, tom). Tuy nhin, ch ny tho mn v c gi tr Yes v chnh l s kin thit lp trong chng trnh. Sau y, ta tip tc b sung cc quan h mi. Quan h m mother c nh ngha nh sau (ch du phy ch php hi hay php v lgich) :
mother(X, Y) :- parent(X, Y), woman(X).

c hiu l : Vi mi X v Y, X l m ca Y nu X l cha (hay m) ca Y v X l n. th sau y minh ho vic nh ngha cc quan h child, mother v grandparent s dng mt quan h khc : Trong th, ngi ta quy c rng : cc nt tng ng vi cc i tng (l cc i ca mt quan h). Cc cung ni cc nt tng ng vi cc quan h nh phn, c nh hng t i th nht n i th hai ca quan h. Mt quan h n c biu din bi tn quan h tng ng vi nhn ca i tng . Cc quan h cn nh ngha s c biu din bi cc cung c nt t. Mi th c gii thch nh sau : nu cc quan h c ch bi cc cung c nt lin c tho mn, th quan h biu din bi cung c nt t cng c tho mn.
X parent Y
child

X parent Y

woman mother

X parent Y parent Z grandparent

Hnh II.3. nh ngha quan h con, m v ng b s dng mt quan h khc. Nh vy, quan h ngb grandparent c vit nh sau :
grandparent(X, Z) :- parent(X, Y), parent(Y, Z).

thun tin cho vic c chng trnh Prolog, ta c th vit mt lut trn nhiu dng, dng u tin l phn u ca lut, cc dng tip theo l phn thn ca lut, mi ch trn mt dng phn bit. By gi quan h grandparent c vit li nh sau :
grandparent(X, Z) :parent(X, Y), parent(Y, Z).

LP TRNH HM V LP TRNH LGIC Ta tip tc nh ngha quan h ch em gi sister nh sau : Vi mi X v Y, X l mt ch (em) gi ca Y nu (1) X v Y c cng cha (cng m), v (2) X l n .
sister(X, Y) :parent(Z, X), parent(Z, Y), woman(X).
Z parent woman X sister parent Y

131

Hnh II.4. nh ngha quan h ch (em) gi. Ch cch gii thch iu kin X v Y c cng cha m : mt Z no phi l mt cha m ca X, v cng Z phi l mt cha m ca Y. Hay ni mt cch khc l : Z1 l mt cha m ca X, Z2 l mt cha m ca Y, v Z1 ng nht vi Z2. An l n, Ann v Sue cng cha m nn Ann l ch em gi ca Sue, ta c :
?- sister(ann, sue). Yes

Ta cng c th hi ai l ch em gi ca Sue nh sau :


?- sister(X, sue).

Prolog s ln lt a ra hai cu tr li :
X = ann ->; X = sue ->. Yes

Vy th Sue li l em gi ca chnh mnh ?! iu ny sai v ta cha gii thch r trong nh ngha ch em gi. Nu ch da vo nh ngha trn y th cu tr li ca Prolog l hon ton hp l. Prolog suy lun rng X v Y c th ng nht vi nhau, mi ngi n b c cng cha m s l em gi ca chnh mnh. Ta cn sa li nh ngha bng cch thm vo iu kin X v Y khc nhau. Nh s thy sau ny, Prolog c nhiu cch gii quyt, tuy nhin lc ny ta gi s rng quan h : different(X, Y) c Prolog nhn bit v c tho mn nu v ch nu X v Y khng bng nhau. nh ngha ch (em) gi mi nh sau :
sister(X, Y) :parent(Z, X), parent(Z, Y), woman(X). different(X, Y).

V d II.2 : Ta ly li v d c in s dng hai tin sau y : Tt c mi ngi u cht. Socrate l mt ngi. Ta vit trong Prolog nh sau :

LP TRNH HM V LP TRNH LGIC


mortal(X) :- man(X). man(socrate).

132

Mt nh l c suy lun mt cch lgich t hai tin ny l Socrate phi cht. Ta t cc cu hi nh sau :
?- mortal(socrate). Yes

V d II.3 : ch Paul cng l ngi, cn Bonzo l con vt, ta vit cc s kin :


man(paul). animal(bonzo).

Con ngi c th ni v khng phi l loi vt, ta vit lut : speak(X) :- man(X), not(animal(bonzo)). Ta t cc cu hi nh sau :
?- speak(bonzo). No ?- speak(paul). Yes

V d II.4 : Ta xy dng cc s kin v cc lut c dng v t cha tham i, sau y, ta ly mt v d khc v s kin v lut khng cha tham i : 'It is sunny'. 'It is summer'. 'It is hot' :'It is summer', 'It is sunny'. 'It is cold' :'It is winter', 'It is snowing'. T chng trnh trn, ta c th t cu hi :
?- 'It is hot'. Yes

Cu tr li 'It is hot' l ng v c cc s kin 'It is sunny' v 'It is summer' trong chng trnh. Cn cu hi ?- 'It is cold.' c cu tr li sai.

II.2.2. nh ngha lut quy


By gi ta tip tc thm mt quan h mi vo chng trnh. Quan h ny ch s dng quan h parent, v ch c hai lut. Lut th nht nh ngha cc t tin trc tip, lut th hai nh ngha cc t tin gin tip. Ta ni rng X l mt t tin gin tip ca Z nu tn ti mt lin h cha m (ng b) gia X v Z : Trong cy gia h Hnh II.1, Tom l t tin trc tip ca Liz, v t tin gin tip ca Sue. Ta nh ngha lut 1 (t tin trc tip) nh sau : Vi mi X v Z, X l mt t tin ca Z nu X l cha m ca Z .
ancestor(X, Z) :-

LP TRNH HM V LP TRNH LGIC


parent(X, Z).
X parent Z (a) parent ancesto r ancestor X parent

133

parent Y (b)

Hnh II.5. Quan h t tin : (a) X l t tin trc tip ca Z, (b) X l t tin gin tip ca Z. nh ngha lut 2 (t tin gin tip) phc tp hn, trnh Prolog tr nn di dng hn, mi khi cng m rng mc t tin hu du nh ch ra trong Hnh II.6. K c lut 1, ta c quan h t tin c nh ngha nh sau : ancestor(X, Z) :% lut 1 nh ngha t tin trc tip parent(X, Z). ancestor(X, Z) :% lut 2 : t tin gin tip l ng b (tam i) parent(X, Y), parent(Y, Z). ancestor(X, Z) :% t tin gin tip l c ng c b (t i) parent(X, Y1), parent(Y1, Y2), parent(Y2, Z). ancestor(X, Z) :% ng i ng ng parent(X, Y1), parent(Y1, Y2), parent(Y2, Y3), parent(Y3, Z). ... Tuy nhin, tn ti mt cch nh ngha t tin gin tip mc bt k nh php quy (recursive) nh sau : Vi mi X v Z, X l mt t tin ca Z nu tn ti Y sao cho (1) X l cha m ca Y v (2) Y l mt t tin ca Z.

LP TRNH HM V LP TRNH LGIC

134

X parent parent Y ancestor parent parent

X Y1 ancestor Y2 Y3 ancestor

Y1

parent

Y2

Z Z

Hnh II.6. Cc cp t tin hu du gin tip cc mc khc nhau.


ancestor(X, Z) :parent(X, Z). ancestor(X, Z) :parent(X, Y), ancestor(Y, Z). ?- ancestor(mary, X). X = jim ->; X = ann ->; X = sue ->; X = bill Yes

Trong Prolog, hu ht cc chng trnh phc tp u s dng quy, quy l mt kh nng mnh ca Prolog.
ancestor Y ancestor ... Z

parent X

Hnh II.7.Dng quy ca quan h t tin (c quay ngang cho thun tin). Cho n lc ny, ta nh ngha nhiu quan h (parent, woman, man, grandparent, child, sister, mother v ancestor). Ta thy mi quan h ch tng ng vi mt mnh , tuy nhin, quan h ancestor li c hai mnh . Ngi ta ni rng nhng mnh ny lin quan (concern) n quan h ancestor. Trong trng hp tt c cc mnh u lin quan n mt quan h, ngi ta nhn c mt th

tc (procedure).

LP TRNH HM V LP TRNH LGIC

135

II.2.3. S dng bin trong Prolog


Khi tnh ton, NSD c th thay th mt bin trong mt mnh bi mt i tng khc. Lc ny ta ni bin b rng buc. Cc bin xut hin trong mt mnh c gi l bin t do. Ngi ta gi thit rng cc bin l c lng t ton th v c c l vi mi. Tuy hin c nhiu cch gii thch khc nhau trong trng hp cc bin ch xut hin trong phn bn phi ca lut. V d :
haveachil(X) :- parent(X, Y).

c th c c nh sau : (a) Vi mi X v Y, nu X l cha (hay m) ca Y th X c mt ngi con. (b) Vi mi X, X c mt ngi con nu tn ti mt Y sao cho X l cha (hay m) ca Y. Khi mt bin ch xut hin mt ln trong mt mnh th khng cn t tn cho n. Prolog cho php s dng cc bin nc danh (anonymous variable) l cc bin c tn ch l mt du gch di dng _. Ta xt v d sau : have_a_child(X) :- parent(X, Y). Lut trn nu ln rng vi mi X, X c mt con nu X l cha ca mt Y no . Ta thy ch have_a_child khng ph thuc g vo tn ca con, v vy c th s dng bin nc danh nh sau : have_a_child(X) :- parent(X, _). Mi v tr xut hin du gch di dng _ trong mt mnh tng ng vi mt bin nc danh mi. V d nu ta mun th hin tn ti mt ngi no c con nu tn ti hai i tng sao cho mt i tng ny l cha ca i tng kia, th ta c th vit : someone_has_a_child :- parent(_, _). Mnh ny tng ng vi : someone_has_a_child :- parent(X, Y). nhng hon ton khc vi : someone_has_a_child :- parent(X, X). Nu bin nc danh xut hin trong mt cu hi, th Prolog s khng hin th gi tr ca bin ny trong kt qu tr v. Nu ta mun tm kim nhng ngi c con, m khng quan tm n tn con l g, th ch cn vit : ?- parent(X, _). hoc tm kim nhng ngi con, m khng quan tm n cha m l g : ?- parent(_ , X). Tm vc t vng (lexical scope) ca cc bin trong mt mnh khng vt ra khi mnh . C ngha l nu, v d, bin X15 xut hin trong hai mnh khc nhau, th s tng ng vi hai bin phn bit nhau. Trong cng mt mnh , X15 lun lun ch biu din mt bin. Tuy nhin i vi cc hng th tnh hung li khc : mt nguyn t th hin mt i tng trong tt c cc mnh , c ngha l trong tt c chng trnh.

LP TRNH HM V LP TRNH LGIC

136

III. Kiu d liu cu trc ca Prolog


III.1. nh ngha kiu cu trc ca Prolog
Kiu d liu c cu trc, tng t cu trc bn ghi, l i tng c nhiu thnh phn, mi thnh phn li c th l mt cu trc. Prolog xem mi thnh phn nh l mt i tng khi x l cc cu trc. t hp cc thnh phn thnh mt i tng duy nht, Prolog s dng cc hm t. V d III.1 : Cu trc gm cc thnh phn ngy thng nm to ra hm t date. Ngy 2/9/1952 s c vit nh sau : date(2, september, 1952) Mi thnh phn trong hm t date u l hng (hai s nguyn v mt nguyn t). Tuy nhin ta c th thay th mi thnh phn bng mt bin hay mt cu trc khc. Chng hn ta c th thay th thnh phn th nht bng bin Day (ch tn bin bt u bi ch hoa) th hin bt k ngy no ca thng 9 :
date(Day, may, 1890)

Ch rng Day l mt bin, c th c rng buc khi x l sau . Trong Prolog, v mt c php, cc i tng l nhng hng. Trong v d trn, may v date(Day, september, 2003) u l nhng hng.
cc tham i date date( Day, september, 2003 ) hm t bin k hiu (b) s

Hnh III.1. Ngy thng l mt i tng c cu trc : (a) biu din dng cy ca cu trc ; (b) gii thch cch vit trong Prolog Mi i tng c cu trc u c th c biu din hnh hc di dng cy (tree), vi hm t l gc, cn cc thnh phn tham i l cc nhnh ca cy. Nu mt trong cc thnh phn l mt cu trc, th thnh phn to thnh mt cy con ca cy ban u. Hai hng l c cng cu trc nu c cng cy biu din v c cng thnh phn (pattern of variables). Hm t ca gc c gi l hm t chnh ca hng. V d III.2 : Cu trc (n gin) ca mt cun sch gm ba thnh phn tiu v tc gi cng l cc cu trc (con), nm xut bn l mt bin :
book(title(Name), author(Author), Year)

02 september 2003 (a)

V d III.3 : Xy dng cc i tng hnh hc n gin trong khng gian hai chiu. Mi im c xc nh bi hai to , hai im to thnh mt ng thng, ba im to thnh mt tam gic. Ta xy dng cc hm t sau y :
point seg triangle

biu din im, biu din mt on thng (segment), biu din mt tam gic.

LP TRNH HM V LP TRNH LGIC

137

5 4 3 2 1 P1 = (1, 1) | | 1 2 | 3 | 4 | 5 | 6 | 7 P2 = (2, 3) (4, 2) (7, 1) (6, 4)

| 8

Hnh III.2. Mt s i tng hnh hc n gin. T , cc i tng trn Hnh III.2 c biu din bi cc hng nh sau :
P1 = point(1, 1) P2 = point(2, 3) S = seg(P1, P2) = seg(point(1, 1), point(2, 3)) T = triangle(point(4, 2), point(6, 4), point(7, 1))

Nu trong cng mt chng trnh, ta c cc im trong mt khng gian ba chiu, ta c th nh ngha mt hm t mi l point3 nh sau :
point3(X, Y, Z) Prolog cho php s dng cng tn hai cu trc khc nhau. V d : point(X1, Y1) v point(X, Y, Z)

l hai cu trc khc nhau. Trong cng mt chng trnh, nu mt tn ng hai vai tr khc nhau, nh trng hp point trn, th Prolog s cn c vo s lng i s phn bit. Cng mt tn ny s tng ng vi hai hm t, mt hm t c hai i s v mt hm t c ba i s. Nh vy, mt hm t c nh ngha bi hai yu t :
P1 = point 1 1 P1 = seg point 1 1 2 point 3 4 2 6 4 7 1 point T = triangle point point

Hnh III.3. Biu din dng cy ca cc i tng. (1) Tn hm t c c php l c php ca cc nguyn t. (2) Kch thc ca hm t l s cc i s ca n. Biu din dng cy ca cc i tng im, on thng v tam gic trn y c cho trong Hnh III.3. Nh trnh by, mi i tng cu trc ca Prolog u c biu din di dng cy, xut hin trong mt chng trnh di dng cc hng.

LP TRNH HM V LP TRNH LGIC

138

* +
a b c

Hnh III.4. Cu trc cy ca biu thc (a + b) * (c 5) V d biu thc s hc : (a + b) * (c 5) c dng cy, c th vit di dng biu thc tin t gm cc hm t *, + v :
*(+(a, b), (c, 5))

III.2. So snh v hp nht cc hng


Ta va xt cch biu din cc cu trc d liu s dng hng. By gi ta s xt php ton quan trng nht lin quan n cc hng l php so khp (matching), thc cht l php so snh (comparison operators) trn cc hng v cc v t. Trong Prolog, vic so khp tng ng vi vic hp nht (unification) c nghin cu trong l thuyt lgich. Cho hai hng, ngi ta ni rng chng l hp nht c vi nhau, nu : (1) chng l ging ht nhau, hoc (2) cc bin xut hin trong hai hng c th c rng buc sao cho cc hng ca mi i tng tr nn ging ht nhau. Th t chun (standard order) trn cc hng c nh ngha nh sau : 1. Bin < Nguyn t < Chui < S < Hng 2. Bin c < Bin mi 3. Nguyn t c so snh theo th t ABC (alphabetically). 4. Chui c so snh theo th t ABC. 5. S c so snh theo gi tr (by value). S nguyn v s thc c x l nh nhau (treated identically). 6. Cc hng phc hp (compound terms) c so snh bc hay s lng tham i (arity) trc, sau so snh tn hm t (functor-name) theo th t ABC v cui cng so snh mt cch quy (recursively) ln lt cc tham i t tri qua phi (leftmost argument first). V d hai hng date(D, M, 1890) v date(D1, May, Y1) l c th vi nhau nh rng buc sau : D c rng buc vi D1 M c rng buc vi May Y1c rng buc vi 1890 Trong Prolog, ta c th vit :
D = D1 M = May Y1 = 1890

Tuy nhin, ta khng th rng buc hai hng date(D, M, 1890) v date(D1, May, 2000), hay date(X, Y, Z) v point(X, Y, Z). Cu trc book(title(Name), author(Author)) c so khp vi :

LP TRNH HM V LP TRNH LGIC

139

book(title(lord_of_the_rings), author(tolkien)) nh php th : Name = lord_of_the_rings Author = tolkien Thut ton hp nht Herbrand so khp hai hng S v T : (1) Nu S v T l cc hng, th S v T ch c th khp nhau nu v ch nu chng c cng gi tr (ch l mt i tng). (2) Nu S l mt bin, T l mt i tng no bt k, th S v T khp nhau, vi S c rng buc vi T. Tng t, nu T l mt bin, th T c rng buc vi S. (3) Nu S v T l cc cu trc, th S v T khp nhau nu v ch nu : (a) S v T c cng mt hm t chnh, v (b) tt c cc thnh phn l khp nhau tng i mt. Nh vy, s rng buc c xc nh bi s rng buc ca cc thnh phn.

Ta c th quan st lut th ba cch biu din cc hng di dng cy trong Hnh III.5 di y. Qu trnh so khp c bt u t gc (hm t chnh). Nu hai hm t l ging nhau, th qu trnh s c tip tc vi tng cp tham i ca chng. Mi qu trnh so khp c xem nh mt dy cc php tnh n gin hn nh sau : triangle = triangle point(1, 1) = X A = point(4, Y) point(2, 3) = point(2, Z) Mt qu trnh so khp l tch cc (positive), nu tt c cc qu trnh so khp b tr l tch cc.
triangle point 1 1 triangle X 4 point Y 2 point Z A 2 point 3

Hnh III.5. Kt qu so khp : triangle(point(1, 1), A, point(2, 3)))= triangle(X, point(4, Y), point(2, Z))). S rng buc nhn c nh sau : X = point(1, 1) A = point(4, Y) Z = 3 Sau y l mt v d minh ho s dng k thut so khp nhn bit mt on thng cho l nm ngang hay thng ng. Mt on thng l thng ng nu honh (abscissa) ca hai mt l bng nhau, tng t, l nm ngang nu tung (ordinate) ca hai mt l bng nhau. Ta s dng quan h n phn biu din cc tnh cht ny nh sau :

LP TRNH HM V LP TRNH LGIC


vertical(seg(point(X, Y), point(X, Y1))). horizontal(seg(point(X, Y), point(X1, Y))).

140

Ta c : ?- vertical(seg(point(1, 1), point(1, 2))). Yes ?- vertical(seg(point(1, 1), point(2, Y))). No ?- horizontal(seg(point(1, 1), point(2, Y))). Y = 1 Yes
point(X, Y1)

point(X, Y) point(X1, Y)

point(X, Y)

Hnh III.6. Minh ho cc on thng nm ngang v thng ng. Vi cu hi th nht, Prolog tr li Yes v cc s kin c so khp ng. Vi cu hi th hai, v khng c s kin no c so khp nn Prolog tr li No. Vi cu hi th ba, Prolog cho Y gi tr 1 c so khp ng. Ta c th t mt cu hi tng qut hn nh sau : Cho bit nhng on thng thng ng c mt mt cho trc l (2, 3) ?
?- vertical(seg(point(2, 3), P)). P = point(2, _0104) Yes

Cu tr li c ngha l mi ng thng c phng trnh X = 2 l thng ng. Ch rng y, ta khng nhn c tn bin nh mong mun (l Y), m tu theo phin bn ci t c th, Prolog s to ra mt tn bin khi thc hin chng trnh, _0104 trong v d trn, nhm trnh t li tn bin ca NSD vi hai l do nh sau. Th nht, cng mt tn bin nhng xut hin trong cc mnh khc nhau th s biu din nhng bin khc nhau. Th hai, do khi p dng lin tip cng mt mnh , chnh bn copy c s dng vi mt b bin khc. By gi ta t tip mt cu hi th v nh sau : C tn ti mt on thng va thng ng va nm ngang hay khng ?
?- vertical(S), horizontal(S). S = seg(point(_00E8, _00EC), point(_00E8, _00EC)) Yes

Cu tr li c ngha l mi on thng khi suy bin thnh mt im th va thng ng, li va nm ngang. Ta thy rng kt qu nhn c l nh so khp. y, cc tn bin _00E8 v _00EC, tng ng vi X v Y, c to ra bi Prolog.

LP TRNH HM V LP TRNH LGIC Sau y l mt v d khc minh ho hai cu trc c s khp vi nhau.
student jean X address maljuin caen student jean info Y

141

Hnh III.7. Kt qu so khp : student( jean, X, address(maljuin, caen) ) = student( jean,info, Y ).

IV. Quan h gia Prolog v lgich ton hc


Prolog c quan h cht ch vi lgich ton hc. Da vo lgich ton hc, ngi ta c th din t c php v ngha ca Prolog mt cch ngn gn v sc tch. Tuy nhin khng v vy m nhng ngi hc lp trnh Prolog cn phi bit mt s khi nim v lgich ton hc. Tht may mn l nhng khi nim v lgich ton hc khng thc s cn thit c th hiu v s dng Prolog nh l mt cng c lp trnh. Sau y l mt s quan h gia Prolog v lgich ton hc. Prolog c c php l nhng cng thc lgich v t bc mt (first order predicate logic), c vit di dng cc mnh (cc lng t v khng xut hin mt cch tng minh), nhng hn ch ch n thun dng mnh Horn, l nhng mnh ch c t nht mt trc kin dng (positive literals). Nm 1981, Clocksin v Mellish a ra mt chng trnh Prolog chuyn cc cng thc tnh v t bc mt thnh dng cc mnh . Cch Prolog din gii chng trnh l theo kiu Ton hc : Prolog xem cc s kin v cc lut nh l cc tin , xem cu hi ca NSD nh l mt nh l cn phng on. Prolog s tm cch chng minh nh l ny, ngha l ch ra rng nh l c th c suy lun mt cch lgich t cc tin . V mt th tc, Prolog s dng phng php suy din quay lui (back chaining) hp gii (resolution) bi ton, c gi l chin lc hp gii SLD (Selected, Linear, Definite : Linear resolution with a Selection function for Definite sentences) do J. Herbrand v A. Robinson xut nm 1995. C th tm tt nh sau : chng minh P(a), ngi ta tm s kin
P(t) hoc mt lut : P(t) :- L1, L2, , Ln

sao cho a c th hp nht (unifiable) c vi t nh so khp. Nu tm c P(t) l s kin nh vy, vic chng minh kt thc. Cn nu tm c P(t) l lut, cn ln lt chng minh v bn phi L1, L2, ..., Ln ca n. Trong Prolog, cu hi lun lun l mt dy t mt n nhiu ch. Prolog tr li mt cu hi bng cch tm kim xo (erase) tt c cc ch. Xo mt ch ngha l chng minh rng ch ny c tho mn, vi gi thit rng cc quan h ca chng trnh l ng. Ni cch

LP TRNH HM V LP TRNH LGIC

142

khc, xo mt ch c ngha l ch ny c suy ra mt cch lgich bi cc s kin v lut cha trong chng trnh. Nu c cc bin trong cu hi, Prolog tm cc i tng thay th vo cc bin, sao cho ch c tho mn. S rng buc gi tr ca cc bin tng ng vi vic hin th cc i tng ny. Nu Prolog khng th tm c rng buc cho cc bin sao cho ch c suy ra t chng trnh th n s tr li No.

IV.1. Cc mc ngha ca chng trnh Prolog


Cho n lc ny, qua cc v d minh ho, ta mi ch hiu c tnh ng n v kt qu ca mt chng trnh Prolog, m cha hiu c lm cch no h thng tm c li gii. Mt chng trnh Prolog c th c hiu theo ngha khai bo (declarative signification) hoc theo ngha th tc (procedural signification). Vn l cn phn bit hai mc ngha ca mt chng trnh Prolog, l ngha khai bo v ngha th tc. Ngi ta cn phn bit mc ngha th ba ca mt chng trnh Prolog l ngha lgich (logical semantic). Trc khi nh ngha mt cch hnh thc hai mc ng ngha khai bo v th tc, ta cn phn bit s khc nhau gia chng. Cho mnh :
P :- Q, R.

vi P, Q, v R l cc hng no . Theo ngha khai bo, ta c chng theo hai cch nh sau : P l ng nu c Q v R u ng. Q v R dn ra P. Theo ngha th tc, ta cng c chng theo hai cch nh sau : gii bi ton P, u tin, gii bi ton con Q, sau gii bi ton con R. xo P, u tin, xo Q, sau xo R. S khc nhau gia ngha khai bo v ngha th tc l ch, ngha th tc khng nh ngha cc quan h lgich gia phn u ca mnh v cc ch ca thn, m ch nh ngha th t x l cc ch.

IV.2. Ngha khai bo ca chng trnh Prolog


V mt hnh thc, ngha khai bo, hay ng ngha ch (intentional semantic) xc nh cc mi quan h c nh ngha trong chng trnh. Ngha khai bo xc nh nhng g l kt qu (ch) m chng trnh phi tnh ton, phi to ra. Ngha khai bo ca chng trnh xc nh nu mt ch l ng, v trong trng hp ny, xc nh gi tr ca cc bin. Ta a vo khi nim th nghim (instance) ca mt mnh C l mnh C m mi mt bin ca n c thay th bi mt hng. Mt bin th (variant) ca mt mnh C l mnh C sao cho mi mt bin ca n c thay th bi mt bin khc. V d IV.1 : Cho mnh :
hasachild(X) :parent(X, Y).

Hai bin th ca mnh ny l :


hasachild(A) :parent(A, B).

LP TRNH HM V LP TRNH LGIC


hasachild(X1) :parent(X1, X2).

143

Cc th nghim ca mnh ny l :
hasachild(tom) :parent(tom, Z). hasachild(jafa) :parent(jafa, small(iago)).

Cho trc mt chng trnh v mt ch G, ngha khai bo ni rng : Mt ch G l ng (tho mn, hay suy ra c t chng trnh mt cch logic) nu v ch nu (1) tn ti mt mnh C ca chng trnh sao cho (2) tn ti mt th nghim I ca mnh C sao cho: (a) phn u ca I l ging ht G, v (b) mi ch ca phn thn ca I l ng. nh ngha trn y p dng c cho cc cu hi Prolog. Cu hi l mt danh sch cc ch ngn cch nhau bi cc du phy. Mt danh sch cc ch l ng nu tt c cc ch ca danh sch l ng cho cng mt rng buc ca cc bin. Cc gi tr ca cc bin l nhng gi tr rng buc tng qut nht.

IV.3.

Khi nim v gi mnh

Mt gi hay b mnh (packages of clauses) l tp hp cc mnh c cng tn hng t chnh (cng tn, cng s lng tham i). V d sau y l mt gi mnh :
a(X) :- b(X, _). a(X) :- c(X), e(X). a(X) :- f(X, Y).

Gi mnh trn c ba mnh c cng hng l a(X). Mi mnh ca gi l mt phng n gii quyt bi ton cho. Prolog quy c :
mi du phy (comma) t gia cc mnh , hay cc ch, ng vai tr php hi (conjunction). V mt lgich, chng phi ng tt c. mi du chm phy (semicolon) t gia cc mnh , hay cc ch, ng vai tr php tuyn (disjunction). Lc ny ch cn mt trong cc ch ca danh sch l ng. V d IV.2 : P :- Q; R.

c c l : P ng nu Q ng hoc R ng. Ngi ta cng c th vit tch ra thnh hai mnh : P :- Q. P :- R. Trong Prolog, du phy (php hi) c mc u tin cao hn du chm phy (php tuyn). V d :
P :- Q, R; S, T, U.

c hiu l :

LP TRNH HM V LP TRNH LGIC


P :- (Q, R); (S, T, U).

144

v c th c vit thnh hai mnh : P :- (Q, R).


P :- (S, T, U).

Hai mnh trn c c l :


P ng nu hoc c Q v R u ng,

hoc c S, T v U u ng. V nguyn tc, th t thc hin cc mnh trong mt gi l khng quan trng, tuy nhin trong thc t, cn ch tn trng th t ca cc mnh . Prolog s ln lt thc hin theo th t xut hin cc mnh trong gi v trong chng trnh theo m hnh tun t bng cch th quay lui m ta s xt sau y.

IV.4.

Ngha lgich ca cc mnh

Ngha lgich th hin mi lin h gia c t lgich (logical specification) ca bi ton cn gii vi bn thn chng trnh.

1. Ngha lgich ca cc ch
ch
p(a). p(a), Q(b). P(X). P(X), Q(X, Y).

Ngha lgich C phi p(a) ng (tho mn) ? C phi c p(a) v Q(b) u ng ? Cho bit gi tr ca X P(X) l ng ? Cho bit cc gi tr ca X v ca Y P(X) v Q(X, Y) u l ng ?

2. Cc mnh khng cha bin


Mnh P(a).
P(a). P(b). P(a) :Q(c). P(a) :Q(c). P(b).

Ngha lgich P(X) ng nu X = a


P(X) ng nu X = a hoc X = b P(X) ng nu X = a v Q(c) ng P(X) ng nu hoc (X = a v Q(c) ng) hoc X = b

K hiu Ton hc
P(X) X = a P(X) (X = a) (X = b) P(X) X = a Q(c) P(X) (X = a Q(c)) (X = b)

Quy c : nu = nu v ch nu.

LP TRNH HM V LP TRNH LGIC

145

3. Cc mnh c cha bin


Mnh
P(X). P(X) :Q(X). P(X) :Q(X, Y).

Ngha lgich Vi mi gi tr ca X, P(X) ng Vi mi gi tr ca X, P(X) ng nu Q(X) ng Vi mi gi tr ca X, P(X) ng nu tn ti Y l mt bin cc b sao cho Q(X, Y) ng Vi mi gi tr ca X, P(X) ng nu tn ti mt gi tr no ca Y sao cho Q(X, Y) ng (khng quan tm n gi tr ca Y nh th no) Vi mi gi tr ca X, P(X) ng nu tn ti Y sao cho Q(X, Y) v R(Y) ng Vi mi gi tr ca X, P(X) ng nu hoc tn ti Y sao cho Q(X, Y) v R(Y) ng, hoc X = a

K hiu Ton hc
X P(X)
P(X) Q(X) P(X) Y Q(X, Y) P(X) Y Q(X, Y) P(X) Y Q(X,Y)R(Y) P(X) (Y Q(X, Y) R(Y)) (X = a)

P(X) :Q(X, _). P(X) :Q(X, Y), R(Y). P(X) :Q(X, Y), R(Y). p(a).

IV.5. Ngha th tc ca Prolog


Ngha th tc, hay ng ngha thao tc (operational semantic), li xc nh lm cch no nhn c kt qu, ngha l lm cch no cc quan h c x l thc s bi h thng Prolog. Ngha th tc tng ng vi cch Prolog tr li cc cu hi nh th no (how) hay lp lun trn cc tri thc. Tr li mt cu hi c ngha l tm cch xa mt danh sch. iu ny ch c th thc hin c nu cc bin xut hin trong cc ch ny c rng buc sao cho chng c suy ra mt cch lgich t chng trnh (hay t cc tri thc ghi nhn). Prolog c nhim v thc hin ln lt tng ch trong mt danh sch cc ch t mt chng trnh cho. Thc hin mt ch c ngha l tm cch tho mn hay xo ch khi danh sch cc ch .
chng trnh (s kin+lut) du hiu thnh cng/tht bi rng buc cc bin

danh sch cc ch

execute

Hnh IV.1. M hnh vo/ra ca mt th tc thc hin mt danh sch cc ch. Gi th tc ny l execute (thc hin), ci vo v ci ra ca n nh sau : Ci vo : mt chng trnh v mt danh sch cc ch Ci ra : mt du hiu thnh cng/tht bi v mt rng buc cc bin Ngha ca hai ci ra nh sau :

LP TRNH HM V LP TRNH LGIC (1) Du hiu thnh cng/tht bi l Yes nu cc ch c tho mn (thnh cng), l No nu ngc li (tht bi). (2) S rng buc cc bin ch xy ra nu chng trnh c thc hin. V d IV.3 : Minh ho cch Prolog tr li cu hi cho v d chng trnh gia h trc y nh sau : ch cn tm l : ?- ancestor(tom, sue)

146

Ta bit rng parent(bill, sue) l mt s kin. s dng s kin ny v lut 1 (v t tin trc tip), ta c th kt lun rng ancestor(bill, sue). y l mt s kin ko theo : s kin ny khng c mt trong chng trnh, nhng c th c suy ra t cc lut v s kin khc. Ta c th vit gn s suy din ny nh sau :
parent(bill, sue)

ancestor(bill, sue)

Ngha l parent(bill, sue)ko theo ancestor(bill, sue) bi lut 1. Ta li bit rng parent(tom, bill) cng l mt s kin. Mt khc, t s kin c suy din ancestor(bill, sue), lut 2 (v t tin gin tip) cho php kt lun rng ancestor(tom, sue). Qu trnh suy din hai giai on ny c vit :
parent(bill, sue) ancestor(bill, sue) ancestor(tom, parent(tom, bill) v ancestor(bill, sue) sue)

Ta va ch ra cc giai on xo mt ch, gi l mt chng minh. Tuy nhin, ta cha ch ra lm cch no Prolog nhn c mt chng minh nh vy. Prolog nhn c php chng minh ny theo th t ngc li nhng g trnh by. Thay v xut pht t cc s kin cha trong chng trnh, Prolog bt u bi cc ch v, bng cch s dng cc lut, n thay th cc ch ny bi cc ch mi, cho n khi nhn c cc s kin s cp. xo ch :
?- ancestor(tom, sue). Prolog tm kim mt mnh trong chng trnh m ch ny c suy din ngay lp tc. R rng ch c hai mnh tho mn yu cu ny l lut 1 v lut 2, lin quan n quan h ancestor. Ta ni rng phn u ca cc lut ny tng ng vi ch.

Hai mnh ny biu din hai kh nng m Prolog phi khai thc x l. Prolog bt u chn x l mnh th nht xut hin trong chng trnh :
ancestor(X, Z) :- parent(X, Z).

Do ch l ancestor(tom, sue), cc bin phi c rng buc nh sau :


X = tom, Z = sue

Lc ny, ch ban u tr thnh :


parent(tom, sue)

Hnh di y biu din giai on chuyn mt ch thnh ch mi s dng mt lut. Tht bi xy ra khi khng c phn u no trong cc mnh ca chng trnh tng ng vi ch parent(tom, sue).

LP TRNH HM V LP TRNH LGIC

147

ancestor(tom,
Bi lut 1

parent(tom, sue)

Hnh IV.2. X l bc u tin : ch pha trn c tho mn nu Prolog c th xo ch pha di. Lc ny Prolog phi tin hnh quay lui (backtracking) tr li ch ban u, tip tc x l mnh khc l lut th hai :
ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z). Tng t bc x l th nht, cc bin X v Z c rng buc nh sau : X = tom, Z = sue ch pha trn ancestor(tom, sue)c thay th bi hai ch l : parent(tom, Y), ancestor(Y, sue).

Nhng lc ny, Y cha c gi tr. Lc ny cn xo hai ch. Prolog s tin hnh xo theo th t xut hin ca chng trong chng trnh. i vi ch th nht, vic xo rt d dng v l mt trong cc s kin ca chng trnh. S tng ng s kin dn n Y c rng buc bi gi tr bill. Cc giai on thc hin c m t bi cy hp gii sau y :
ancestor(tom,
Bi lut 1 Tht bi Bi lut 2

parent(tom, sue)

parent(tom, Y) ancestor(Y,

Hnh IV.3. Cc giai on thc hin x l xo ch. Sau khi ch th nht parent(tom, bill) tho mn, cn li ch th hai :
ancestor(bill, sue) cng phi c tho mn Mt ln na, lut 1 c s dng. Ch rng vic p dng ln th hai cng lut ny khng lin quan g n ln p dng th nht. Prolog s dng cc bin mi mi ln lut c gi n. Lut 1 by gi c th c t tn li nh sau : ancestor(X, Z) :- parent(X, Z).

Phn u phi tng ng vi ch th nht, ancestor(bill, sue), tc l : X = bill, Z = sue

LP TRNH HM V LP TRNH LGIC

148

ancestor(tom,
Bi lut 1 Bi lut 2

parent(tom, sue)
Tht bi

parent(tom, Y) ancestor(Y, sue)


Y = bill bi parent(tom, bill)

ancestor(bill, )
Thnh cng Bi lut 1

parent(bill,

Hnh IV.4. Qu trnh thc hin xo ch ancestor(tom, sue). T ch (trong phn thn) phi thay th bi :
parent(bill, sue)

ch ny c tho mn ngay lp tc, v chnh l mt s kin trong chng trnh. Qu trnh x l c minh ho li y trong Hnh IV.4. Hnh 2.4. c dng mt cy. Mi nt tng ng vi mt ch, hay mt danh sch cc ch cn tho mn. Mi cung ni hai nt tng ng vi vic p dng mt lut trong chng trnh. Vic p dng mt lut cho php chuyn cc ch ca mt nt thnh cc ch mi ca mt nt khc. ch trn cng (gc ca cy) c xo khi tm c mt con ng i t gc n l c nhn l thnh cng. Mt nt l c nhn l thnh cng khi trong nt l mt s kin ca chng trnh. Vic thc thi mt chng trnh Prolog l vic tm kim nhng con ng nh vy.
Nhnh bn phi chng t rng c th xo ch.

Trong qu trnh tm kim, c th xy ra kh nng l Prolog i trn mt con ng khng tt. Khi gp nt cha mt s kin khng tn ti trong chng trnh, xem nh tht bi, nt c gn nhn tht bi, ngay lp tc Prolog t ng quay lui ln nt pha trn, chn p dng mt mnh tip theo c mt trong nt ny tip tc con ng mi, chng no thnh cng. V d trn y, ta gii thch mt cch khng hnh thc cch Prolog tr li cu hi. Th tc execute di y m t hnh thc v c h thng hn v qu trnh ny. thc hin danh sch cc ch :
G1, G2, ..., Gm

th tc execute tin hnh nh sau : Nu danh sch cc ch l rng, th tc thnh cng v dng. Nu danh sch cc ch khc rng, th tc duyt scrutinize sau y c thc hin Th tc scrutinize : Duyt cc mnh trong chng trnh bt u t mnh u tin, cho n khi nhn c mnh C c phn u trng khp vi phn u ca ch u tin G1. Nu khng tm thy mt mnh no nh vy, th tc ri vo tnh trng tht bi. Nu mnh C c tm thy, v c dng :

LP TRNH HM V LP TRNH LGIC


H :- D1, ..., Dn

149

khi , cc bin ca C c t tn li nhn c mt bin th C khng c bin no chung vi danh sch G1, G2, ..., Gm. Mnh C nh sau : H :- D1, ..., Dn Gi s S l rng buc ca cc bin t vic so khp gia G1 v H, Prolog thay th G1 bi
D1, ..., Dn trong danh sch cc ch nhn c mt danh sch mi : D1, ..., Dn, G2, ..., Gm

Ch rng nu C l mt s kin, khi , n=0 v danh sch mi s ngn hn danh sch c. Trng hp danh sch mi rng, kt qu thnh cng. Thay th cc bin ca danh sch mi ny bi cc gi tr mi ch nh bi rng buc S, ta nhn c mt danh sch cc ch mi :
D"1, ..., D"n, G"2, ..., G"m

Thc hin th tc mt cch quy cho danh sch cc ch mi ny. Nu kt thc thnh cng, tip tc thc hin danh sch ban u. Trong trng hp ngc li, Prolog b qua danh sch cc ch quay lui li th tc scrutinize. Qu trnh tm kim cc mnh trong chng trnh c bt u li t sau mnh C, vi mt mnh mi. Qu trnh thc hin th tc execute c m t nh sau :
Chng trnh Prolog hay c s d liu

G1, G2, ..., Gm C' : H :- D1, ..., Dn

Khng c bin trng nhau :

Gi, H'

Dj,

. . H :...,

. D1, Dn

S = (G1| H)

D1, ..., Dn, G2, D"1, ..., D"n, G"2, G" Hnh IV.5. Qu trnh thc hin execute.

Nu n=0 mnh mi s ngn hn

Sau y l th tc execute c vit bng gi ng Pascal. Procedure execute(program, goallist, success); { Tham i vo : program danh sch cc mnh goallist danh sch cc ch Tham i ra : success kiu Boolean, l true nu goallist l true i vi tham i program Cc bin cc b : goal ch othergoals danh sch cc ch satisfied kiu Boolean

LP TRNH HM V LP TRNH LGIC


matchOK kiu Boolean process rng buc ca cc bin H, H, D1, D1, ..., Dn, Dn cc ch Cc hm ph : empty(L) c gi tr true nu L l danh sch rng head(L) tr v phn t u tin ca danh sch L tail(L) tr v danh sch L sau khi b i phn t u tin add(L1, L2) ghp danh sch L2 vo sau danh sch L1 match(T1, T2, matchOK, process) so khp cc hng T1 v T2, nu thnh cng, bin matchOK c gi tr true, v process cha cc rng buc tng ng vi cc bin.

150

substitute(process, goals) thay th cc bin ca goals bi gi tr rng buc tng ng trong process. } begin { execute_main } if empty(goallist) then success:= true else begin goal:= head(goallist); othergoals:= tail(goallist); satisfied:= false; while not satisfied and there_are_again_some_terms do begin Let the following clause of program is: H :- D1, ..., Dn constructing a variant of this clause: H :- D1, ..., Dn match(goal, H, matchOK, process) if matchOK then begin newgoals:= add([ D1, ..., Dn ], othergoals); newgoals:= substitute(process, newgoals); execute(program, newgoals, satisfied) end { if } end; { while } satisfied:= satisfied end end; { execute_main }

T th tc execute trn y, ta c mt s nhn xt sau. Trc ht, th tc khng m t lm cch no nhn c rng buc cui cng cho cc bin. Chnh rng buc S dn n thnh cng nh cc li gi quy. Mi ln li gi quy execute tht bi (tng ng vi mnh C), th tc scrutinize tm kim mnh tip theo ngay sau mnh C. Qu trnh thc thi l hiu qu, v Prolog b qua nhng phn v ch r sang nhnh khc.

LP TRNH HM V LP TRNH LGIC

151

Lc ny, mi rng buc cho bin thuc nhnh v ch b loi b hon ton. Prolog s ln lt duyt ht tt c cc con ng c th n thnh cng. Ta cng thy rng ngay sau khi c mt kt qu tch cc, NSD c th yu cu h thng quay lui tm kim mt kt qu mi. Chi tit ny khng c x l trong th tc execute. Trong cc ci t Prolog hin nay, nhiu kh nng mi c thm vo nhm t hiu qu ti u. Khng phi mi mnh trong chng trnh u c duyt n, m ch duyt nhng mnh c lin quan n ch hin hnh. V d IV.4 : Cho chng trnh :
thick(bear). % thick(elephant). % small(cat). % brown(bear). % grey(elephant). % black(cat). % dark(Z) :- black(Z). % dark(Z) :- brown(Z). % Cu hi : ?- dark(X), thick(X). % X = bear Yes clause clause clause clause clause clause clause clause 1 2 3 4 5 6 7: all this who is black is dark 8: all this who is brown is dark

who is thick and dark ?

(1) Danh sch ban u ca cc ch l : dark(X), thick(X). (2) Tm kim (duyt) t u n cui chng trnh mt mnh c phn u tng ng vi ch u tin dark(X). Prolog tm c mnh 7 : dark(Z) :- black(Z). Thay th ch u tin bi phn thn ca mnh 7 sau khi c rng buc (th bin Z bi X) nhn c mt danh sch cc ch mi : black(X), thick(X). (3) Tm kim trong chng trnh mt mnh sao cho ch con black(X) c so khp : tm c mnh 6 l s kin black(cat). Lc ny, rng buc thnh cng, danh sch cc ch thu gn thnh : thick(cat) (4) Tm kim ch con thick(cat). Do khng tm thy mnh no tho mn, Prolog quay lui li giai on (3). Rng buc X=cat b loi b. Danh sch cc ch tr thnh : black(X), thick(X). Tip tc tm kim trong chng trnh bt u t mnh 6. Do khng tm thy mnh no tho mn, Prolog quay lui li giai on (2) tip tc tm kim bt u t mnh 7. Kt qu tm c mnh 8 : dark(Z) :- brown(Z).

Sau khi thay th bi brown(X)trong danh sch cc ch, ta nhn c : brown(X), thick(X) (5) Tm kim cho rng buc brown(X), c kt qu l brown(bear). Mnh ny l mt s kin, danh sch cc ch thu gn li thnh : thick(bear)

LP TRNH HM V LP TRNH LGIC

152

(6) Vic tm kim trong chng trnh dn n kt qu thick(bear). Do y l mt s kin, danh sch cc ch tr nn rng. iu ny chng t chng trnh thc hin thnh cng, s rng buc cho bin l : X = bear Qu trnh thc hin c gii thch trong hnh di y.
dark(X), thick(X) dark(Z) :- black(Z). Quay lui dark(Z) :- brown(Z).

(Z|X)
black(X), thick(X) black(cat). Quay lui

(Z|X)
brown(X), thick(X) brown(bear). (X|bear) thick(bear) Thnh cng, X=bear

(X|cat)
thick(cat) Tht bi

Hnh IV.6. Qu trnh thc hin xo ch dark(X), thick(X).

IV.6. T hp cc yu t khai bo v th tc
Ngi ta thng quan tm n tnh u vit ca Prolog l kh nng t qun l cc chi tit th tc. iu ny cho php NLT (NLT) d kin trc c ngha khai bo ca mt chng trnh mt cch c lp vi ngha th tc ca n. V nguyn tc, do kt qu thc hin ca mt chng trnh ph thuc vo phn khai bo, nn phi khai bo y cc s kin, lut v quan h khi lp trnh. iu ny mang tnh thc tin, v lun lun cc yu t khai bo ca mt chng trnh d hiu hn so vi cc chi tit th tc. tn dng c kh nng t qun l cc chi tit th tc ca Prolog, NLT phi tp trung c bit vo yu t khai bo, trnh nhm ln trong chng mc c th bi cc chi tit thc hin chng trnh. Cn cho Prolog t gii quyt cc chi tit mang tnh th tc ny. Nh tip cn khai bo, lp trnh trn Prolog lun lun thun tin hn so vi cc ngn ng th tc khc nh Pascal. Tuy nhin, tip cn khai bo khng phi lun lun y . Nh s thy sau ny, i vi cc chng trnh ln, khng th loi b hon ton tnh tip cn th tc, do tnh hiu qu thc tin ca n khi thc hin chng trnh. V vy, tu theo chng trnh Prolog m s dng hon ton yu t khai bo, loi b yu t th tc khi rng buc thc tin cho php. Nh s thy trong chng sau rng vic sp t th t cc mnh v cc ch cng nh th t cc hng trong mi mnh c vai tr quan trng trong vic tm ra kt qu. Mt khc, mt s chng trnh tuy ng n v mt khai bo nhng li khng chy c trong thc t. Ranh gii gia yu t th tc v yu t khai bo rt kh suy xt. Mnh sau y l mt minh chng v vic khai bo ng, nhng li hon ton v ch v mt chy chng trnh : ancestor(X, Z) :- ancestor(X, Z). Do nhng tin b ca k thut lp trnh, ngi ta quan tm n ngha khai bo b qua nhng chi tit th tc, tn dng nhng chi tit khai bo lm li gii n gin hn v d hiu hn. Khng phi l NLT, m chnh h thng phi qun l nhng chi tit th tc. Prolog l ngn ng nhm vo mc ch ny. Nh ta thy, Prolog ch gip qun l ng n mt phn nhng chi tit th tc, m khng th qun l c tt c.

LP TRNH HM V LP TRNH LGIC

153

Mt yu t thc t na l ngi ta d dng chp nhn mt chng trnh chy c (ng ngha th tc) hn l mt chng trnh ch ng n v mt khai bo m cha chy c. V vy, gii quyt mt bi ton no mt cch c li, ngi ta tp trung gii quyt nhng yu t khai bo, tin hnh chy th chng trnh trn my, ri sp t li cc mnh v cc ch nu n vn cha chy ng v mt th tc.

V.
V.1.

V d : con kh v qu chui
Pht biu bi ton

Trong tr tu nhn to, ngi ta thng ly ti con kh v qu chui (monkey and banana problem) minh ho vic hp gii bi ton. Sau y, ta s trnh by lm cch no vn dng so khp v quay lui cho nhng ng dng nh vy. Ta s trin khai mt cch phi th tc, sau nghin cu tnh th tc mt cch chi tit.

Hnh V.1. Minh ho bi ton con kh v qu chui.

Ta s dng mt bin th (variant) ca bi ton nh sau : mt con kh ang trc ca mt cn phng. Trong phng, chnh gia trn c treo mt qu chui. Con kh ang i nn tm cch ly qu chui, nhng qu chui li treo qu cao i vi n. cnh ca s, c t mt ci hp con kh c th tro ln. Con kh c th thc hin cc ng tc nh sau : bc i trong phng, nhy ln hp, di chuyn ci hp (nu con kh ng cnh ci hp), v vi ly qu chui nu n ang ng trn hp t ng pha di qu chui. Cu hi t ra l con kh c n c qu chui hay khng ? Trong lp trnh, vn quan trng l lm sao biu din c bi ton ph hp vi ngn ng ang s dng. Trng hp ca chng ta c th ngh n trng thi ca con kh c th bin i theo thi gian. Trng thi hin hnh c xc nh bi v tr ca cc i tng. Chng hn, trng thi ban u ca con kh c xc nh bi : (1) Con kh ang trc ca (to the door). (2) Con kh ang trn sn nh (on the floor). (3) Ci hp ang cnh ca s (to the window). (4) Con kh cha ly c qu chui (not have).

LP TRNH HM V LP TRNH LGIC

154

Ta c th nhm bn thng tin trn thnh mt i tng c cu trc duy nht. Gi state l hm t m ta la chn nhm cc thnh phn ca i tng. Hnh 2.9. trnh by cch biu din trng thi u l mt tng c cu trc.
state

tothedoor

onthefloor

tothewindow

nothave

Hnh V.2. Trng thi u ca con kh l mt i tng c cu trc gm bn thnh phn : v tr nm ngang, v tr thng ng ca con kh, v tr ca ci hp v mt ch dn cho bit con kh ly c qu chui cha.

V.2.

Gii bi ton vi Prolog

Bi ton con kh v qu chui c xem nh mt tr chi ch c mt ngi chi. Ta hnh thc ho bi ton nh sau : u tin, ch ca tr chi l tnh hung con kh ly c qu chui, ngha l mt trng thi state bn thnh phn, thnh phn th t l possessing (chim hu) : state(_, _, _, possessing) Tip theo, ta tm cc ng tc ca con kh chuyn t mt trng thi ny sang mt trng thi khc. C bn kiu ng tc (movement) nh sau : (1) Nm ly qu chui (grab). (2) Tro ln hp (climbing). (3) y ci hp (pushing). (4) Di chuyn (walking). Tu theo trng thi hin hnh, khng phi tt c mi ng tc u c th s dng. Chng hn, ng tc nm ly qu chui ch c th xy ra khi con kh ng trn ci hp, ng v tr pha di qu chui ( chnh gia phng), v n cha nm ly qu chui. Quy tc Prolog displacement di y c ba i s m t di chuyn ca con kh nh sau :
displacement(State1, Movement, State2).

Vai tr ca cc i s dng th hin di chuyn l : State1 Movement Hnh V.3. Di chuyn trng thi. Quy c state1 l trng thi trc khi di chuyn, M l di chuyn thc hin, v state2 l trng thi sau khi di chuyn. ng tc nm ly qu chui vi iu kin u cn thit c nh ngha bi mnh c ni dung : sau khi di chuyn, con kh ly c qu chui, v n ang ng trn ci hp, gia cn phng. Mnh c vit trong Prolog nh sau : displacement( state(tothecenter, onthebox, tothecenter, nothave), % trc khi di chuyn grab, % di chuyn state(tothecenter, onthebox, tothecenter, possessing). % sau khi di chuyn State2

LP TRNH HM V LP TRNH LGIC

155

Mt cch tng t, ta c th din t di chuyn ca con kh trn sn nh t mt v tr nm ngang P1 bt k no n mt v tr mi P2. Vic di chuyn ca con kh l c lp vi v tr ca ci hp, v c lp vi s kin con kh ly c qu chui hay l cha :
displacement( state(P1, onthefloor, G, H), walking(P1, P2), % di chuyn t P1 n P2 state(P2, onthefloor, G, H).

Mnh trn y c rt nhiu ngha : Di chuyn thc hin l i t P1 n P2. Con kh trn sn nh trc v sau khi di chuyn. V tr hp l G khng thay i sau khi di chuyn. Qu chui vn v tr c trc v sau khi di chuyn (cha b con kh ly i). Mnh ny c trng cho mt tp hp y cc ng tc v c th p dng cho bt k mt tnh hung no tng ng vi trng thi ch ra trc khi di chuyn. Ngi ta gi cc mnh kiu ny l mt s di chuyn. Hai kiu hnh ng khc l y v tro cng c c trng mt cch tng t.
displacement M S1 S2 couldtake S3 couldtake Sn possessing

Hnh V.4. Dng quy ca v t couldtake. Cu hi t ra cho bi ton s l Xut pht t v tr u S, con kh c th ly c qu chui khng ? vi v t sau y : couldtake(S) vi tham i S l mt trng thi ch v tr ca con kh. Chng trnh xy dng cho v t ny da trn hai quan st sau y :
(1) Vi mi trng thi S m con kh ly c qu chui, v t couldtake c gi tr true, khng cn mt di chuyn no khc na. iu ny tng ng vi s kin : couldtake(state(_, _, _, possessing)). (2) Trong cc trng hp khc, cn thc hin mt hoc nhiu di chuyn. Xut pht t mt trng thi S1, con kh c th ly c qu chui nu tn ti mt s ln di chuyn M no t S1 n mt trng thi S2 sao cho trong trng thi S2, con kh c th ly c qu chui. Ta c mnh sau : couldtake(S1) :displacement(S1, M, S2), couldtake(S2).

V t couldtake c dng quy, tng t vi quan h ancestor xt u chng. Chng trnh Prolog y nh sau :
displacement( state(tothecenter, onthebox, tothecenter, nothave), grab, % vi ly qu chui state(tothecenter, onthebox, tothecenter, possessing)).

LP TRNH HM V LP TRNH LGIC

156

displacement( state(P, onthefloor, P, H), climbing, % tro ln hp state(P, onthebox, P, H)). displacement( state(P1, onthefloor, P1, H), pushing(P1, P2), % y ci hp t P1 n P2 state(P2, onthefloor, P2, H)). displacement( state(P1, onthefloor, G, H), walking(P1, P2), % di chuyn t P1 n P2 state(P2, onthefloor, G, H)). pushing(tothewindow, tothecenter). walking(tothedoor, tothewindow). % couldtake(state) : con kh c th ly c qu chui trong state couldtake(state(_, _, _, possessing)). % trng hp 1 : con kh c qu chui couldtake(State1) :% trng hp 2 : cn phi hnh ng displacement(State1, Move, State2), % hnh ng couldtake(State2). % ly qu chui

Chng trnh trn y c pht trin mt cch phi th tc. xt tnh th tc ca chng trnh, ta t ra cu hi sau y : ?couldtake(state(tothedoor, onthefloor, tothewindow, nothave)). Yes c cu tr li, Prolog phi tho mn mt danh sch cc ch theo ng ngha th tc. l qu trnh tm kim cho con kh mt di chuyn hp l trong mi di chuyn c th. i khi, qu trnh ny s dn n mt ng ct, thot ra, cn phi quay lui. Cu hi trn cn quay lui mt ln. Cc di chuyn hp l tip theo c tm thy ngay do cc mnh lin quan n quan h displacement c mt trong chng trnh, ph hp vi tnh hung. Tuy nhin, vn c th xy ra kh nng cc di chuyn khng hp l. Con kh i ti i lui mi m khng chm c ci hp, hoc khng c ch thc s. Trong v d trn, ta u tin qu trnh so khp cc mnh dn n thnh cng.

LP TRNH HM V LP TRNH LGIC

157

state(tothedoor, onthefloor, tothewindow, nothave) grab climbing failure pushing failure walking(tothedoor, P2)

failure

state(P2, onthefloor, tothewindow, nothave) grab climbing backtrack state(P2, onthefloor, P2, nothave) grab failure climbing pushing(P2, P2) failure

state(tothedoor, onthebox, tothewindow, nothave) grab climbing failure walking failure pushing failure

failure

state(P2, onthebox, P2, nothave) Grab P2 = tothecenter state(tothecenter, onthebox, tothecenter, possessing)

Hnh V.5. Li gii ca bi ton con kh v qu chui. Qu trnh tm kim bt u t nt trn cng v tip tc xung di. Cc php th thc hin ln lt t tri qua phi. Ch xy ra mt ln quay lui m thi.

V.3.

Sp t th t cc mnh v cc ch

V.3.1. Nguy c gp cc vng lp v hn


Xt mnh sau y : p :- p Ngha ca mnh l p ng nu p ng. V mt khai bo, mnh hon ton ng n. Tuy nhin, v mt th tc, mnh khng dng lm g. Trong Prolog, mnh ny gy ra rc ri. Ta xt cu hi : ?- p. S dng mnh trn, ch p c thay th bi chnh ch p, ri li c thay th bi p, v c th tip tc. Prolog b ri vo tnh trng qun v hn. V d ny lm phng tin thc hin cc vng lp ca Prolog. Tr li v d con kh v qu chui trn y, ta c th thay i th t cc ch bn trong ca cc mnh . Chng hn cc mnh thuc v quan h displacement c sp xp nh sau : grab, climbing, pushing, walking (ta c th b sung thm mnh descending nu mun trn vn). Cc mnh ny ni rng con kh c th nm ly qu chui (grab), tro ln hp (climbing), v.v... V mt ng ngha th tc, th t cc mnh ni rng trc con kh vi ly c qu chui, n phi tro ln hp, trc khi tro ln hp, n phi y ci hp, v.v... Vi th t ny,

LP TRNH HM V LP TRNH LGIC

158

con kh ly c qu chui (gii quyt c bi ton). By gi nu ta thay i th t th iu g s xy ra ? Gi thit rng mnh walking xut hin u tin. Lc ny, vic thc hin ch t ra trn y : ?couldtake(state(tothedoor, onthefloor, tothewindow, nothave)). s to ra mt qu trnh thc thi khc. Bn danh sch ch u tin nh c (cc tn bin c t li) : (1) couldtake(state(tothedoor, onthefloor, nothave))

tothewindow,

Sau khi mnh th hai c p dng, ta c : (2) displacement(state(tothedoor, onthefloor, tothewindow, nothave), M, S2), couldtake(S2) Vi chuyn ng walking(tothedoor, P2), ta nhn c : (3) couldtake(state(P2, onthefloor, tothewindow, nothave)) p dng ln na mnh th hai ca couldtake : (4) displacement(state(P2, onthefloor, tothewindow, nothave), M, S2), couldtake(S2) T thi im ny, s khc nhau xut hin. Mnh u tin c phn u c th so khp vi ch u tin trn y by gi s l walking (m khng phi climbing nh trc). Rng buc l S2 = state(P2, onthefloor, tothewindow, nothave). Danh sch cc ch tr thnh : (5) couldtake(state(P2, onthefloor, tothewindow, nothave)) Bng cch p dng mnh th hai couldtake, ta nhn c (6) displacement(state(P2, onthefloor, tothewindow, nothave), M, S2), couldtake(S2) Tip tc p dng mnh walking cho mnh th nht v ta c : (7) couldtake(state(P2, onthefloor, tothewindow, nothave)) By gi ta so snh cc ch (3), (5) v (7). Chng gn nh ging ht nhau, tr cc bin P2, P2 v P2. Nh ta thy, s thnh cng ca mt ch khng ph thuc vo tn cc bin trong ch. iu ny c ngha rng k t danh sch cc ch (3), qu trnh thc hin khng c s tin trin no. Thc t, ta nhn thy rng mnh th hai ca couldtake v walking c s dng qua li. Con kh i loanh quanh trong phng m khng bao gi c nh s dng ci hp. Do khng c s tin trin no, nn v mt l thuyt, qu trnh tm n qu chui s din ra mt cch v hn. Prolog s khng x l nhng tnh hung v ch nh vy. V d ny minh ho Prolog ang th gii mt bi ton m khng bao gi t c li gii, du rng li gii tn ti. Nhng tnh hung nh vy khng phi l him khi lp trnh Prolog. Ngi ta cng hay gp nhng vng lp qun v hn trong cc ngn ng lp trnh khc. Tuy nhin, iu khng bnh thng so vi cc ngn ng lp trnh khc l chng trnh Prolog ng n v mt ng ngha khai bo, nhng li khng ng n v mt th tc, ngha l khng c cu tr li i vi cu hi cho trc. Trong nhng trng hp nh vy, Prolog khng th xo mt ch v Prolog c gng a ra mt cu tr li trong khi ang i theo mt con ng xu (khng dn n thnh cng). Cu hi chng ta mun t ra l : liu chng ta c th thay i chng trnh sao cho c th d phng trc nguy c b qun ? C phi chng ta lun lun b ph thuc vo s sp t th

LP TRNH HM V LP TRNH LGIC

159

t ng n ca cc mnh v cc ch ? R rng rng cc chng trnh ln s tr nn d sai st nu phi da trn mt th t no ca cc mnh v cc ch. Tn ti nhiu phng php khc cho php loi b cc vng lp v hn, tng qut hn v ng tin cy hn so vi phng php sp t th t. Sau y, chng ta s s dng thng xuyn nhng phng php ny trong vic tm kim cc con ng, hp gii cc bi ton v duyt cc th.

V.3.2. Thay i th t mnh v ch trong chng trnh


Ngay cc v d u chng, ta thy nguy c xy ra cc vng lp v hn. Chng trnh m t quan h t tin :
ancestor(X, Z) :parent(X, Z). ancestor(X, Z) :parent(X, Y), ancestor(Y, Z).

Ta hy xt mt s bin th ca chng trnh ny. V mt khai bo, tt c cc chng trnh l tng ng, nhng v mt th tc, chng s khc nhau. Tham kho ng ngha khai bo ca Prolog, khng nh hng n ngha khai bo, ta c th thay i nh sau : (1) Th t cc mnh trong mt chng trnh, v (2) Th t cc ch bn trong thn ca cc mnh . Th tc ancestor trn y gm hai mnh , ui mnh th nht c mt ch con v ui mnh th hai c hai ch con. Nh vy chng trnh s c bn bin th (=122) m c bn u c cng ngha khai bo. Ta nhn c nh sau : (1) o th t cc mnh , v (2) o th t cc ch cho mi sp t th t cc mnh . Hnh di y m t bn th tc anc1, anc2, anc3, anc4 :
% Th tc gc anc1(X, Z) :parent(X, Z). anc1 (X, Z) :parent(X, Y), anc1 (Y, Z). % Bin th a : hon i cc mnh anc2 (X, Z) :parent(X, Y), anc2 (Y, Z). anc2(X, Z) :parent(X, Z). % Bin th b : hon i cc ch ca mnh th hai anc3(X, Z) :parent(X, Z). anc3 (X, Z) :anc3 (X, Y), parent(Y, Z). % Bin th c : hon i cc ch v cc mnh anc4 (X, Z) :anc4 (X, Y), parent(Y, Z).

LP TRNH HM V LP TRNH LGIC


anc4(X, Z) :parent(X, Z).

160

% Cc cu hi c t ra ln lt nh sau :
?- anc1(tom, sue). -> Yes ?- anc2(tom, sue). -> Yes ?- anc3(tom, sue). -> Yes ?- anc4(tom, sue). ERR 211 Not enough local stack
anc2(X, Z) :parent (X, Y), anc2 (Y, Z), anc2(X , Z) :parent (X, Z). anc2(tom, sue) parent (tom, Y) anc2(Y, sue) Y = bill anc2(bill, sue) parent (bill, Y) anc2 (Y, sue) Y = ann anc2(ann, sue) parent(ann, Y) anc2(Y, sue) tht bi parent (ann, sue) tht bi Y = sue anc2(sue, sue) parent (sue, Y) anc2(Y, sue) Y = jim anc2 (jim, sue) parent(jim, Y) anc2(Y, sue) tht bi parent (jim, sue) tht bi parent (sue, sue) tht bi parent (bill, sue) thnh cng

Hnh V.6. Bin th a ca quan h t tin tr li cu hi Tom c phi l mt t tin ca Sue ? Trong trng hp cui cng, Prolog khng th tm ra cu tr li. Do b qun v hn nn Prolog thng bo khng b nh. Hnh 2.4. m t qu trnh thc hin ca anc1 (trc y l ancestor) cho cng mt cu hi. Hnh 2.13 (a, b, c) m t qu trnh thc hin ca anc2, anc3 v anc4. Ta thy anc4 khng c hy vng v anc2 km hiu qu hn so vi anc1 do thc hin nhiu ln tm kim v quay lui hn trong cy.

LP TRNH HM V LP TRNH LGIC

161

So snh cc qu trnh so khp trong cc hnh v, ta thy rng cn khai bo cc mnh n gin khi gii cc bi ton. i vi bi ton quan h t tin, c bn bin th u da trn hai : kim tra nu hai tham i ca quan h t tin tho mn quan h parent. giai on phc tp nht l tm ai gia nhng ngi l parent hay ancestor.
anc3(X, Z) :parent(X, Z). anc3(X, Z) :anc3(X, Y), parent(Y, Z). parent (tom, sue) tht bi anc3(tom, sue) anc3(tom, Y) parent(Y, sue) parent(tom, Y) parent(Y, sue) Y = bill paren(bill, sue) thnh cng

Hnh V.7. Bin th b ca quan h t tin tr li cu hi Tom c phi l mt t tin ca Sue ?


anc4(X, Z) :anc4(X, Y), parent(Y, Z). anc4(X, Z) :parent(X, Z). anc4(tom, sue) anc4(tom, Y) parent(Y, sue) anc4(tom, Y) parent(Y, Y) parent(Y, sue)

anc4(tom, Y) parent(Y, Y) parent(Y, Y) parent(Y, sue)

Hnh V.8. Bin th c ca quan h t tin tr li cu hi Tom c phi l mt t tin ca Sue ? Trong s bn bin th ca quan h ancestor, ch c anc1 l thc hin qu trnh so khp n gin nht. Trong khi , anc4 bt u qu trnh kh khn nht. Cn anc2 v anc3 nm gia hai thi cc ny. D ta c xem xt chi tit cc qu trnh thc hin th no i chng na, th anc1 vn l lut n gin nht. Ngi ta khuyn nn s dng cch ny khi lp trnh. Ta khng cn so snh bn bin th m xem xt vi kiu cu hi no th mi bin th dn n thnh cng hay tht bi. Ta d nhn thy rng c hai th tc anc1 v anc2 u c kh nng a ra cu tr li cho mi kiu cu hi. Cn anc3 th khng chc chn. Chng hn cu hi sau y gy ra tht bi : anc3(liz, jim) ERR 212 Not enough global stack

LP TRNH HM V LP TRNH LGIC

162

v dn n nhng li gi quy v hn. Nh vy, ta khng th xem anc3 l ng n v mt th tc.

VI. S hc
VI.1. Cc php ton s hc
Nh bit, Prolog l ngn ng ch yu dng x l k hiu, khng thch hp tnh ton s. Do vy, cc phng tin tnh ton trong hu ht cc h thng Prolog u rt hn ch. Sau y l bng cc php ton s hc chun (standard arithmetic operations) ca Prolog : K hiu
+ * / // mod **

Php ton Cng (addition) Tr (subtraction) Nhn (multiplication) Chia s thc (real division) Chia s nguyn (integer division) Chia ly phn d (modulus) Lu tha (power)

VI.2. Biu thc s hc


Biu thc s hc (arithmetic expressions) c xy dng nh v t is. V t ny l mt php ton tin t (infix operator) c dng :
Number is Expr

Tham i bn tri php ton is l mt i tng s cp. Tham i bn phi l mt biu thc s hc c hp thnh t cc php ton s hc, cc s v cc bin. V php ton is s khi ng vic tnh ton, cho nn khi thc hin ch ny, tt c cc bin cn phi c rng buc vi cc gi tr s. Prolog so khp thnh cng nu Number khp c vi Expr. Nu Expr l kiu thc (float) th c xem nh mt s nguyn. V d VI.1 : ?- X is 3*4. X = 12 Yes ?- is(X, 40+50). X = 90 Yes ?- 1.0 is sin(pi/2). No % sai do sin(pi/2) c lm trn thnh 1 ?- 1.0 is float(sin(pi/2)). Yes Trong Prolog, cc php ton s hc ko theo s tnh ton trn cc d liu. thc hin cc php ton s hc, cn bit cch gi dng theo kiu Prolog m khng th gi trc tip ngay c nh trong cc ngn ng lp trnh mnh lnh. Chng hn, nu NSD cn cng hai s 1 v 2 m li vit nh sau : ?- X = 1 + 2 th Prolog s tr li theo kiu ca Prolog :

LP TRNH HM V LP TRNH LGIC

163

X = 1 + 2 m khng phi l X = 3 nh mong mun. L do rt n gin : biu thc X = 1 + 2 ch l mt hng ca Prolog m hm t chnh l +, cn 1 v 2 l cc tham i ca n. Khng c g trong ch trc n Prolog tin hnh php cng. Sau y l mt s v d : ?- X = 1 + 1 + 1. X = 1 + 1 + 1 (ou X = +(+(1, 1), 1)).

Prolog tin hnh tnh ton trn cc php ton s hc, s dng php ton is nh sau :
?- X is 1 + 2. X = 3

Php cng thc hin c l nh mt th tc c bit kt hp vi php ton +. Nhng th tc nh vy c gi l th tc thng tr (built-in procedures).
?- X = 1 + 1 + 1, Y is X. X = 1 + 1 + 1, Y = 3. ?- X is 1 + 1 + a. ERROR: Arithmetic: `a/0' is not a function (sai do a khng phi l hm s) ?- X is 1 + 1 + Z. ERROR: Arguments are not sufficiently instantiated (sai do a khng phi l s) ?- Z = 2, X is 1 + 1 + Z. Z = 2 X = 4

u tin ca cc php ton s hc tin nh ca Prolog cng l u tin tho mn tnh cht kt hp trong ton hc. Cc cp du ngoc c th lm thay i th t u tin gia cc php ton. Ch rng +, -, *, / v // c nh ngha nh l yfx, c ngha l vic tnh ton c thc hin t tri sang phi. V d, biu thc :
X is 5 -2 1 c gii thch nh l : X is ( 5 -2 ) - 1 Do : ?- X is 5 -2 - 1. X = 2 Yes ?- X = 5 -2 - 1. X = 5-2-1 Yes Cc php so snh gi tr s hc trong Prolog c thc hin theo ngha Ton hc thng thng. Chng hn, ta cn so snh nu tch ca 277 vi 37 l ln hn 10000 vi ch sau : ?- 277 * 37 > 10000. Yes

By gi gi s ta c quan h birth, cho php lin h mt ngi vi ngy thng nm sinh ca ngi . Ta c th tm c tn ca nhng ngi sinh ra gia nm 1950 v nm 1960 (k c hai nm ny) bng cch t cu hi :
?- birth( Name, Year ), Year >= 1950, Year <= 1960.

LP TRNH HM V LP TRNH LGIC

164

% kt qu tr v l tn nhng ngi sinh ra trong khong 1950 - 1960 Yes Prolog c sn cc hm s hc nh : sin, cos, tan, atan, sqrt, pi, e, exp, log, ...

V d VI.2 :
?- X is exp(10). X = 22026.5 Yes ?- X is sqrt(9). X = 3 Yes 7 ?- X is abs(1.99). X = 1.99 Yes ?- X is pi. X = 3.14159 Yes

VI.3.

nh ngha cc php ton trong Prolog

Biu thc ton hc thng c vit di dng trung t (infix) nh sau :


2 * a + b * c

vi + v * l cc php ton (operator), cn a, b v c l cc ton hng (operand), hay tham i (argument). Biu thc trn cn c vit di dng tin t (prefix) nh cc hm t + v * nh sau : +( *(2, a), *(b, c) ) hoc dng hu t (postfix) nh sau : ( (2, a) *, (b, c) * )+ Do thi quen, ngi ta thch vit cc biu thc dng trung t d c hn. Prolog cho php vit cc biu thc di dng trung t, l biu din bn ngoi, nhng thc cht, cc biu thc c biu din bn trong vn dng tin t, theo quy c vit cc hng trong mt mnh .
+ * 2 a b * c

Hnh VI.1. Biu din dng cy ca biu thc 2 * a + b * c Khi vit a + b, Prolog hiu rng l biu thc +(a, b). Prolog c th hiu c ng n cc biu thc nh l a + b * c, cn cho Prolog bit rng php nhn * c u tin cao hn php cng +. Khi biu thc ny phi c vit di dng : +( a, *(b, c) ) m khng phi l : *( + (a, b), c) Prolog quy c php ton c u tin cao nht l hm t chnh ca hng. Nu cc biu thc cha + v * tun theo nhng quy c thng thng, th cch vit a + b * c v a +

LP TRNH HM V LP TRNH LGIC

165

(b * c) ch l mt. Cn nu mun thay i th t u tin, th cn vit r rng bng cch s dng cc cp du ngoc (a + b) * c : Mi NLT c th nh ngha cc php ton ring ca mnh, chng hn nh ngha cc nguyn t is v support nh l nhng php ton trung t vit cc s kin trong mt chng trnh. Chng hn : tom bald wall support ceiling l nhng s kin c vit trong Prolog : is( tom, bald ). support( wall, ceiling ).

Mi php ton l mt nguyn t c u tin l mt gi tr s, tu thuc phin bn Prolog, thng thng nm trong khong gia 1 v 1200. Cc php ton c c t bi hn hp tn php ton f v cc bin (tham i) x v y. Mi c t cho bit cch kt hp (associative) php ton v c chn sao cho phn nh c cu trc ca biu thc. Mt php ton trung t c k hiu bi mt f t gia hai tham i dng xfy. Cn cc php ton tin t v hu t ch c mt tham i c t trc (hoc t sau tng ng) du php ton f. C ba nhm kiu php ton trong Prolog nh sau : Cc php ton Trung t Tin t Hu t Khng kt hp
xfx fx xf

Kt hp phi
xfy fy

Kt hp tri
yfx yf

Hnh VI.2. Ba nhm kiu php ton trong Prolog. C s khc nhau gia x v y. gii thch, ta a vo khi nim u tin ca tham i. Nu cc du ngoc bao quanh mt tham i, hay tham i ny l mt i tng khng c cu trc, th u tin ca n bng 0. u tin ca mt cu trc l u tin ca hm t chnh. Do x l mt tham i nn u tin ca x phi thp hn hn u tin ca php ton f, cn tham i y c u tin thp hn hoc bng u tin ca php ton f. Khi gp mt biu thc cha php ton op dng : a op b op c Tnh kt hp xc nh v tr du ngoc theo th t u tin nh sau :

Nu l kt hp tri, ta c : (a op b) op c Nu l kt hp phi, ta c : a op (b op c)

Cc quy tc trn cho php loi b tnh nhp nhng ca cc biu thc cha cc php ton c cng u tin. Chng hn : a - b - c s c hiu l (a - b ) - c, m khng phi a - (b - c). y, php tr - c kiu trung t yfx. Xem Hnh VI.3 di y. By gi ta ly mt v d khc v php ton tin t mt ngi not. Nu not c xp kiu fy, th biu thc sau y vit ng : not not p

LP TRNH HM V LP TRNH LGIC


a b c u tin 0 a u tin 0 b c

166

Cch gii thch 1 : (a - b ) c Cch gii thch 2 : a - (b - c) Hnh VI.3. Hai cch gii thch cho biu thc a - b - c vi gi thit rng php tr - c u tin l 500. Nu - l yfx, th cch gii thch 2 l sai v u tin ca b - c khng thp hn u tin ca -. Tri li, nu php ton not c nh ngha nh l fx, th biu thc trn s khng cn ng na, v rng tham i ca not u tin l not p, s c cng u tin vi n. Trong trng hp ny, biu thc phi c vit kt hp vi cc cp du ngoc : not ( not p ) Tnh d c ca mt chng trnh tu thuc vo cch s dng cc php ton. Trong cc chng trnh Prolog, nhng mnh s dng php ton mi do ngi dng nh ngha thng c gi l cc ch dn hay nh hng (directive). Cc ch dn phi xut hin trc khi mt php ton mi c s dng n trong mt mnh , c dng nh sau : :- op( u tin, Cch kt hp, Tn php ton). Chng hn ngi ta nh ngha php ton is nh ch dn :
:- op( 600, xfx, is ).

Ch dn ny bo cho Prolog bit rng is s c s dng nh l mt php ton c u tin l 600, cn k hiu c t xfx ch nh y l mt php ton trung t. ngha ca xfx nh sau : f l du php ton c t gia, cn x l tham i c t hai bn du php ton. Vic nh ngha mt php ton khng ko theo mt hnh ng (action) hoc mt thao tc (opration) no. V nguyn l, khng mt thao tc no trn d liu c kt hp vi mt php ton (tr mt vi trng hp him gp c bit, nh cc php ton s hc). Tng t nh mi hm t, cc php ton ch c dng cu trc cc hm t, m khng ko theo mt thao tc no trn cc d liu, du rng tn gi php ton c th gi ln vai tr hot ng. Prolog cung cp sn mt s php ton chun. Nhng php ton tin nh ngha ny thay i ty theo phin bn Prolog. Hnh 3.5 di y trnh by mt s php ton chun tin nh ngha ca Prolog. Ch rng cng mt mnh c th nh ngha nhiu php ton, min l chng cng kiu v cng u tin. Cc tn php ton c vit trong mt danh sch.

LP TRNH HM V LP TRNH LGIC Cc php ton tin nh ngha trong Prolog nh sau : u tin
1200 1200 1100 1000 900 900 700 600 500 500 400 200 200

167

Cch kt hp
xfx fx xfy xfy fy fx xfx xfy yfx fx yfx xfx xfy

Cc php ton
-->, ::-, ?;, | , \+ ~ <, =, =.., =@=, =:=, =<, ==, =\=, >, >=, @<, @=<, @>, @>=, \=, \==, is : +, -, /\, \/, xor +, -, ?, \ *, /, //, <<, >>, mod, rem ** ^

Hnh 3.5. Cc php ton tin nh ngha trong Prolog.

minh ho, ta xt v d vit mt chng trnh x l cc biu thc lgich (boolean). Gi s ta cn biu din mt trong cc nh l tng ng ca Morgan, c vit di dng ton hc nh sau : ~ ( A & G ) <===> ~ A ~ B Trong Prolog, mnh trn phi c vit nh sau :
equivalent( not ( and( A, B ) ), or(not ( A ), not ( B ) ) ).

Tuy nhin, cch lp trnh tt nht l th tm cch bo lu ti a s ging nhau gia cc k hiu trong bi ton cho vi cc k hiu c s dng trong chng trnh..
<===> ~ & A B ~ A v ~ B

Hnh VI.4. Biu din cy ca hng ~ ( A & B ) <===> ~ A ~ B Trong v d trn, ta d dng nh ngha li cc php ton lgich nh sau :
:- op( 800, xfx, <===> ). :- op( 700, xfy, v ). :- op( 600, xfy, & ). :- op( 500, fy, ~ ). T y, nh l Morgan c vit li thnh hng sau (xem hnh trn) :

LP TRNH HM V LP TRNH LGIC


~ ( A & B ) <===> ~ A ~ B

168

VI.4. Cc php so snh s hc


Prolog c cc php so snh v hm s hc nh sau : K hiu
Expr1 > Expr2 Expr1 < Expr2 Expr1 =< Expr2 Expr1 >= Expr2 Expr1 =\= Expr2 Expr1 =:= Expr2 between(Low, High, Value) succ(Int1, Int2) plus(Int1, Int2, Int3)

Gii thch php ton Thnh cng nu Expr1 c gi tr s ln hn Expr2 Thnh cng nu Expr1 c gi tr s nh hn Expr2 Thnh cng nu Expr1 c gi tr s nh hn hoc bng Expr2 Thnh cng nu Expr1 c gi tr s ln hn hoc bng Expr2 Thnh cng nu Expr1 c gi tr s khc Expr2 Thnh cng nu Expr1 c gi tr s bng Expr2
Low v High l cc s nguyn, Low=< Value=< High. Value l bin s c nhn gi tr gia Low v High

Thnh cng nu Int2= Int1+ 1 v Int1>= 0 Thnh cng nu Int3= Int1+Int2

Ch rng cc php ton = v =:= l hon ton khc nhau, chng hn trong cc ch X = Y v X =:= Y :
ch X = Y ko theo vic ng nht cc i tng X v Y, nu chng ng nht vi nhau th c th rng buc mt s bin no trong X v Y. ch X =:= Y ch gy ra mt php tnh s hc so snh m khng xy php rng buc no trn cc bin. V d VI.3 :
?- X = Y. X = _G997 Y = _G997 Yes ?- 1 + 2 =:= 2 + 1. Yes. ?- 1 + 2 = 2 + 1. No. ?- 1 + 2 = 1 + 2. Yes. ?- 1 + X = 1 + 2. X = 2 ?- 1 + A = B + 2. A = 2 B = 1 ?- 1 + 2 =:= 2 + 1. Yes.

LP TRNH HM V LP TRNH LGIC


?- 1 + X =:= 1 + 2. ERROR: Arguments are not sufficiently instantiated (sai do a khng phi l s) ?- 1 + 2 == 1 + 2. Yes. ?- 1 + 2 == 2 + 1. No. ?- 1 + X == 1 + 2. No. ?- 1 + a == 1 + a. Yes. 1 is sin(pi/2). Yes ?- 1.0 is sin(pi/2). No ?- 1.0 is float(sin(pi/2)). Yes ?- 1.0 =:= sin(pi/2). Yes

169

VI.5.
K hiu

Cc php so snh hng


Gii thch php ton Thnh cng nu Term1 tng ng vi Term2. Mt bin ch ng nht vi mt bin cng chia s trong hng (sharing variable) Tng ng vi \Term1 == Term2. Thnh cng nu Term1 khp c vi Term2 Tng ng vi \Term1 = Term2 Thnh cng nu Term1 c cng cu trc (structurally equal) vi Term2. Tnh c cng cu trc yu hn tnh tng ng (equivalence), nhng li mnh hn php hp nht Tng ng vi `\Term1 =@= Term2' Thnh cng nu Term1 v Term2 theo th t chun ca cc hng Thnh cng nu hoc hai hng bng nhau hoc Term1 ng trc Term2 theo th t chun ca cc hng Thnh cng nu Term1 ng sau Term2 theo th t chun ca cc hng Thnh cng nu hoc hai hng bng nhau both hoc Term1 ng sau Term2 theo th t chun ca cc hng

Cc php so snh hng ca Prolog nh sau :

Term1 == Term2

Term1 \== Term2 Term1 = Term2 Term1 \= Term2 Term1 =@= Term2

Term1 \=@= Term2 Term1 @< Term2 Term1 @=< Term2 Term1 @> Term2 Term1 @>= Term2

compare(?Order, Hng1, Hng2) Kim tra th t <, > hoc = gia hai hng

LP TRNH HM V LP TRNH LGIC V d VI.4 :


?- free_variables(a(X, b(Y, X), Z), L). L = [G367, G366, G371] X = G367 Y = G366 Z = G371 ?- a =@= A. No ?- a =@= B. No ?- x(A, A) =@= x(B, C). No ?- x(A, A) =@= x(B, B). A = _G267 B = _G270 Yes 5 ?- x(A, B) =@= x(C, D). A = _G267 B = _G268 C = _G270 D = _G271 Yes ?- 3 @< 4. Yes ?- 3 @< a. Yes ?- a @< abc6. Yes ?- abc6 @< t(c, d). Yes ?- t(c, d) @< t(c, d, X). X = _G284 Yes

170

VI.6. V t xc nh kiu
Do Prolog l mt ngn ng nh kiu yu nn NLT thng xuyn phi xc nh kiu ca cc tham i. Sau y l mt s v t xc nh kiu (type predicates) ca Prolog.. V t Kim tra
var(V) nonvar(X) atom(A) integer(I) float(R) V l mt bin ? X khng phi l mt bin ? A l mt nguyn t ? I l mt s nguyn ? R l mt s thc (du chm ng) ?

LP TRNH HM V LP TRNH LGIC


number(N) atomic(A) compound(X) ground(X) N l mt s (nguyn hoc thc) ? A l mt nguyn t hoc mt s ? X l mt hng c cu trc ? X l mt hng hon ton rng buc ?

171

V d VI.5 : ?- var(X). X = _G201 Yes ?- integer(34). Yes ?- ground(f(a, b)). Yes ?- ground(f(a, Y)). No

VI.7. Mt s v t x l hng
V t
T =..L arg(N, Term, X) name(A, L)

Kim tra Chuyn i hng T thnh danh sch L


Head :- Term l mt lut trong chng trnh ?

functor(T, F, N) T l mt hng vi F l hng t v c N i (arity) clause(Head, Term)

Th bin X cho tham i th N ca hng Term Chuyn nguyn t A thnh danh sch L gm cc m ASCII (danh sch s c trnh by trong chng sau).

V d VI.6 :
?- functor(t(a, b, c), F, N). F = t N = 3 Yes ?- functor(father(jean, isa), F, N). F = father, N = 2. Yes ?- functor(T, father, 2). T = father(_G346, _G347). ?- t(a, b, c) =..L. L = [t, a, b, c] Yes ?- T =..[t, a, b, c, d, e]. T = t(a, b, c, d, e) Yes ?- arg(1, father(jean, isa), X). X = jean ?- name(toto, L). L = [116, 111, 116, 111]. Yes % _G346 v _G347 l hai bin ca Prolog

LP TRNH HM V LP TRNH LGIC


?- name(A, [116, 111, 116, 111]). A = toto. Yes V d VI.7 : Cho c s d liu : personal(tom). personal(ann). father(X, Y) :- son(Y, X), male(X). ?- clause(father(X, Y), C). C = (son(Y, X), male(X)). ?- clause(personal(X), C). X = tom, C = true; X = ann, C = true Yes

172

VII. nh ngha hm
Prolog khng c kiu hm, hm phi c nh ngha nh mt quan h trn cc i tng. Cc tham i ca hm v gi tr tr v ca hm phi l cc i tng ca quan h . iu ny c ngha l khng th xy dng c cc hm t hp t cc hm khc. V d VII.1 : nh ngha hm s hc cng hai s bt k
plus(X, Y, Z) :% trng hp tnh Z = X + Y nonvar(X), nonvar(Y), Z is X + Y. plus(X, Y, Z) :% trng hp tnh X = Z - Y nonvar(Y), nonvar(Z), X is Z - Y. plus(X, Y, Z) :% trng hp tnh Y - Z - X nonvar(X), nonvar(Z), Y is Z - X. ?- add1(2, 3, X). X = 5 Yes add1(7, X, 3). X = -4 Yes add1(X, 2, 6). X = 4 Yes

VII.1. nh ngha hm s dng quy


Trong chng 1, ta trnh by cch nh ngha cc lut (mnh ) quy. Sau y, ta tip tc ng dng php quy xy dng cc hm. Tng t cc ngn ng lp trnh mnh lnh, mt th tc quy ca Prolog phi cha cc mnh tho mn 3 iu kin :
Mt khi ng qu trnh lp.

LP TRNH HM V LP TRNH LGIC

173

Mt s lp li chnh n. Mt iu kin dng. V d th tc quy to dy 10 s t nhin chn u tin nh sau : u tin ly gi tr 0 khi ng qu trnh. Sau ly 0 l gi tr hin hnh to s tip theo nh s lp : even_succ_nat = even_succ_nat + 2. Qu trnh c tip tc nh vy cho n khi c 10 s 0 2 4 6 8 10 12 14 16 18 th dng li. Trong Prolog, mt mnh quy ( to s lp ) l mnh c cha trong thn (v phi) t nht mt ln li gi li chnh mnh (v tri) :
a(X) :- b(X, Y), a(Y). Mnh a gi li chnh n ngay trong v phi. Dng s lp nh vy c gi l quy trc tip. khng xy ra li gi v hn, cn c mt mnh lm iu kin dng t trc mnh . Mi ln vo lp mi, iu kin dng s c kim tra quyt nh xem c th tip tc gi a hay khng ?

Ta xy dng th tc even_succ_nat(Num, Count) to ln lt cc s t nhin chn Num, bin Count m s bc lp. iu kin dng l Count=10, ta c :
even_succ_nat(Num, 10). Mnh lp c xy dng nh sau : even_succ_nat(Num, Count) :write(Num), write(' '), Count1 is Count + 1, Num1 is Num + 2, even_succ_nat(Num1, Count1). Nh vy, li gi to 10 s t nhin chn u tin s l : ?- even_succ_nat(0, 0). 0 2 4 6 8 10 12 14 16 18 Yes Mt cch khc xy dng s lp c gi l quy khng trc tip c dng nh sau : a(X) :- b(X). b(X) :- c(Y...), a(Z). Trong s lp ny, mnh quy a khng gi gi trc tip n a, m gi n mt mnh b khc, m trong b ny li c li gi n a. khng xy ra li gi lun qun v hn, trong b cn thc hin cc tnh ton lm gim dn qu trnh lp trc khi gi li mnh a (v d mnh c). V d s di y s gy ra vng lun qun v hn : a(X) :- b(X, Y). b(X, Y) :- a(Z). Bi ton to 10 s t nhin chn u tin c vit li theo s quy khng trc tip nh sau : a(0). a(X) :- b(X). b(X) :- X1 is X - 2, write(X), write(' '), a(X1). Chng trnh ny khng gi quy nh even_succ_nat. Kt qu sau li gi a(20) l dy s gim dn 20 18 16 14 12 10 8 6 4 2.

V d VII.2 : Xy dng s t nhin (Peano) v php cng trn cc s t nhin /* nh ngha s t nhin */ nat(0). % 0 l mt s t nhin

LP TRNH HM V LP TRNH LGIC


nat(s(N)) :nat(N). % s(X) cng l mt s t nhin % nu N l mt s t nhin

174

Chng hn s 5 c vit : s(s(s(s(s(zero)))))


/* nh ngha php cng */ addi(0, X, X). % lut 1 : 0 + X = X /* addi(X, 0, X). c th s dng them lut 2 : X + 0 = X addi(s(X), Y, s(Z)) :- % lut 3 : nu X + Y = Z th (X+1) + Y = (Z+1) addi(X, Y, Z).

Hoc nh ngha theo nat(X) nh sau : addi(0, X, X) :- nat(X).


?- addi(X, Y, s(s(s(s(0))))). X = 0 Y = s(s(s(s(0)))) Yes ?- addi(X, s(s(0)), s(s(s(s(s(0)))))). X = s(s(s(0))) Yes ?- THREE = s(s(s(0))), FIVE = s(s(s(s(s(0))))), addi(THREE, FIVE, EIGHT). THREE = s(s(s(0))) FIVE = s(s(s(s(s(0))))) EIGHT = s(s(s(s(s(s(s(s(0)))))))) Yes

V d VII.3 : Tm c s chung ln nht (GCD: Greatest Common Divisor) Cho trc hai s nguyn X v Y, ta cn tnh c s D v USCLN da trn ba quy tc nh sau : 1. Nu X = Y, th D bng X. 2. Nu X < Y, th D bng USCLN ca X v ca Y - X. 3. Nu X > Y, th thc hin tng t bc 2, bng cch hon v vai tr X v Y. C th d dng tm c cc v d minh ho s hot ng ca ba quy tc trc y. Vi X =20 v Y =25, th ta nhn c D =5 sau mt dy cc php tr. Chng trnh Prolog c xy dng nh sau : gcd( X, X, X ). gcd( X, Y, D ) :X < Y, Y1 is Y X, gcd( X, Y1, D ).
gcd( X, Y, D ) :X > Y, gcd( Y, X, D ).

ch cui cng trong mnh th ba trn y c th c thay th bi : X1 is X Y, gcd( X1, Y, D ). Kt qu chy Prolog nh sau :

LP TRNH HM V LP TRNH LGIC


?- gcd( 20, 55, D ). D = 5

175

V d VII.4 : Tnh giai tha


fac(0, 1). fac(N, F) :N > 0, M is N - 1, fac(M, Fm), F is N * Fm.

Mnh th hai c ngha rng nu ln lt :


N > 0, M = N - 1, Fm is (N-1)!, v F = N * Fm,

th F l N!. Php ton is ging php gn trong cc ngn ng lp trnh mnh lnh nhng trong Prolog, is khng gn gi tr mi cho bin. V mt lgich, th t cc mnh trong v phi ca mt lut khng c vai tr g, nhng li c ngha thc hin chng trnh. M khng phi l bin trong li gi th tc quy v s gy ra mt vng lp v hn. Cc nh ngha hm trong Prolog thng rc ri do hm l quan h m khng phi l biu thc. Cc quan h c nh ngha s dng nhiu lut v th t cc lut xc nh kt qu tr v ca hm... V d VII.5 : Tnh s Fibonacci
/* Fibonacci function */ fib(0, 0). % fib0 = 0 fib(1, 1). % fib1 = 1 fib(N, F) :% fibn+2 = fibn+1 + fibn N > 1, N1 is N - 1, fib(N1, F1), N2 is N - 2, fib(N2, F2), F is F1 + F2. ?- fib(20, F). F = 10946 Yes ?- fib(21, F). ERROR: Out of local stack

Ta nhn thy thut ton tnh s Fibonacci trn y s dng hai ln gi quy nhanh chng lm y b nh v ch vi N=21, SWI-prolog phi dng li thng bo li. V d VII.6 : Tnh hm Ackerman
/* Ackerman's function */ ack(0, N, A) :- % Ack(0, n) = n + 1 A is N + 1. ack(M1, 0, A) :- % Ack(m, n) = Ack(m-1, 1) M > 0, M is M - 1, ack(M, 1, A). ack(M1, N1, A) :% Ack(m, n) = Ack(m-1, Ack(m, n-1)) M1 > 0, N1 > 0, M is M - 1, N is N - 1,

LP TRNH HM V LP TRNH LGIC


ack(M1, N, A1), ack(M, A1, A).

176

V d VII.7 : Hm tnh tng plus(X, Y, Z) :nonvar(X), nonvar(Y), Z is X + Y. plus(X, Y, Z) :nonvar(Y), nonvar(Z), X is Z - Y. plus(X, Y, Z) :nonvar(X), nonvar(Z), Y is Z - X. V d VII.8 : Thut ton hp nht Sau y l mt thut ton hp nht n gin cho php x l trng hp mt bin no c thay th (hp nht) bi mt hng m hng ny li c cha ng tn bin . Chng hn php hp nht X = f(X) l khng hp l.
% unify(T1, T2). unify(X, Y) :% trng hp 2 bin var(X), var(Y), X = Y. unify(X, Y) :% trng hp bin = khng phi bin var(X), nonvar(Y), X = Y. unify(X, Y) :% trng hp khng phi bin = bin nonvar(X), var(Y), Y = X. unify(X, Y) :% nguyn t hay s = nguyn t hay s nonvar(X), nonvar(Y), atomic(X), atomic(Y), X = Y. unify(X, Y) :% trng hp cu trc = cu trc nonvar(X), nonvar(Y), compound(X), compound(Y), termUnify(X, Y). termUnify(X, Y) :% hp nht hng vi hng cha cu trc functor(X, F, N), functor(Y, F, N), argUnify(N, X, Y). argUnify(N, X, Y) :- % hp nht N tham i ca X v Y N>0, argUnify1(N, X, Y), Ns is N - 1, argUnify(Ns, X, Y). argUnify(0, X, Y). argUnify1(N, X, Y) :- % hp nht cc tham i c bc N arg(N, X, ArgX), arg(N, Y, ArgY), unify(ArgX, ArgY).

V d VII.9 : L thuyt s Ta tip tc xy dng hm mi trn cc s t nhin c nh ngha trong v d 1. Ta xy dng php so snh hai s t nhin da trn php cng nh sau :

LP TRNH HM V LP TRNH LGIC


egal(+(X, 0), X). egal(+(0, X), X). % php cng c tnh giao hon % X YZ.egal(X+Y, Z)

177

egal(+(X, s(Y)), s(Z)) :egal(X+s(Y), s(Z)) egal(+(X, Y), Z).

Sau y l mt s kt qu :
?- egal(s(s(0))+s(s(s(0))), s(s(s(s(s(0)))))). Yes ?- egal(+(s(s(0)), s(s(0))), X). X = s(s(s(s(0)))) ?- egal(+(X, s(s(0))), s(s(s(s(s(0)))))). X = s(s(s(0))) Yes ?- egal(+(X, s(s(0))), s(s(s(s(s(0)))))). X = s(s(s(0))) Yes ?- egal(X, s(s(s(s(0))))). X = s(s(s(s(0))))+0 ; X = 0+s(s(s(s(0)))) ; X = s(s(s(0)))+s(0) ; X = 0+s(s(s(s(0)))) ; X = s(s(0))+s(s(0)) ; X = 0+s(s(s(s(0)))) ; X = s(0)+s(s(s(0))) ; X = 0+s(s(s(s(0)))) ; X = 0+s(s(s(s(0)))) ; X = 0+s(s(s(s(0)))) ; No

Vi ch egal(X, Y) sau y, cu tr li l v hn :
?- egal(X, Y). X = _G235+0 Y = _G235 ; X = 0+_G235 Y = _G235 ; X = _G299+s(0) Y = s(_G299) ; X = 0+s(_G302) Y = s(_G302) ; X = _G299+s(s(0)) Y = s(s(_G299)) ;

LP TRNH HM V LP TRNH LGIC


X = 0+s(s(_G309)) Y = s(s(_G309)) ; X = _G299+s(s(s(0))) Y = s(s(s(_G299))) ; X = 0+s(s(s(_G316))) Y = s(s(s(_G316))) ; X = _G299+s(s(s(s(0)))) Y = s(s(s(s(_G299)))) ; X = 0+s(s(s(s(_G323)))) Y = s(s(s(s(_G323)))) ; X = _G299+s(s(s(s(s(0))))) Y = s(s(s(s(s(_G299))))) ; ... X = 0+s(s(s(s(s(s(_G337)))))) Y = s(s(s(s(s(s(_G337)))))) ; X = _G299+s(s(s(s(s(s(s(0))))))) Y = s(s(s(s(s(s(s(_G299))))))) v.v...

178

LP TRNH HM V LP TRNH LGIC

179

VII.2.

Ti u php quy

Li gii cc bi ton s dng quy trong cc ngn ng lp trnh ni chung thng ngn gn, d hiu v d qun l c chng trnh. Tuy nhin, trong mt s trng hp, s dng quy li xy ra vn v phc tp tnh ton, khng nhng tn km b nh m cn tn km thi gian. Trong cc ngn ng mnh lnh, php tnh n! s dng quy cn s dng b nh c c 0(n) v thi gian tnh ton cng c c 0(n), thay v gi quy, ngi ta thng s dng php lp fac=fac*i, i=1..n. Ta xt li v d 4 tnh s Fibonacci trn y vi li gi quy :
fib(N, F) :N > 1, N1 is N - 1, fib(N1, F1), N2 is N - 2, fib(N2, F2), F is F1 + F2.

rng mi ln gi hm fib(n) vi n>1 s dn ti hai ln gi khc, ngha l s ln gi s tng theo lu tha 2. Vi n ln, chng trnh gi quy nh vy d gy trn b nh. V d sau y l tt c cc li gi c th cho trng hp n=5. fib5 4 3 2 1 1 0 1 2 0 2 1 0 3 1

Hnh VII.1. Biu din cy cc li gi quy tm s Fibonacci Mt s ngn ng mnh lnh tnh s Fibonacci s dng cu trc lp trnh tnh i tnh li cng mt gi tr. Chng trnh Pascal di y dng hai bin ph x=fib(i) v y=fib(i+1) :
{ tnh fib(n) vi n > 0 } i:= 1; x:= 1; y:= 0; while i < n do begin x:= x + y; y:= x y end;

Ta vit li chng trnh Prolog nh sau :


fibo(0, 0). fibo(N, F) :N >= 1, fib1(N, 1, 0, F). fib1(1, F, _, F). fib1(N, F2, F1, FN) :N > 1, N1 is N - 1, F3 is F1 + F2, fib1(N1, F3, F2, FN). ?- fibo(21, F). F = 10946 Yes

LP TRNH HM V LP TRNH LGIC


?- fibo(200, F). F = 2.80571e+041 Yes

180

VII.3. Mt s v d khc v quy


VII.3.1. Tm ng i trong mt th c nh hng
A B Cho mt th c nh hng nh sau :

C E

Hnh VII.2. Tm ng i trong mt th c nh hng. Ta xt bi ton tm ng i gia hai nh ca th. Mi cung ni hai nh ca th biu din mt quan h gia hai nh ny. T th trn, ta c th vit cc mnh Prolog biu din cc s kin :
arc(a, arc(b, arc(c, arc(c, arc(a, b). c). e). d). e).

Gi s cn kim tra c tn ti mt ng i gia hai nt a v d (khng tn ti ng i gia hai nt ny nh m t), ta vit mnh :
path(a, d).

nh ngha ny, ta nhn xt nh sau : Tn ti mt ng i gia hai nt c cung ni chng.


Tn ti mt ng i gia hai nt X v Y nu tn ti mt nt th ba Z sao cho tn ti mt ng i gia X v Z v mt ng i gia Z v Y. Ta vit chng trnh nh sau :
path(X, Y) :- arc(X, Y). path(X, Y) :arc(X, Z), path(Z, Y).

Ta thy nh ngha th tc path(X, Y) tng t th tc tm t tin gin tip gia hai ngi trong cng dng h ancestor(X, Y) xt trc y.
?- path(X, Y). X = a Y = b ; X = b Y = c ; ...

LP TRNH HM V LP TRNH LGIC

181

VII.3.2.

Tnh di ng i trong mt th

Ta xt bi ton tnh di ng i gia hai nt, t nt u n nt cui trong mt th l s cung gia chng. Chng hn di ng i gia hai nt a v d l 3 trong v d trn. Ta lp lun nh sau :
Nu gia hai nt c cung ni chng th di ng i l 1. Gi L l di ng i gia hai nt X v Y, L1 l di ng i gia mt nt th ba Z v Y nu tn ti v gi s c cung ni X v Z, khi L = L1 + 1.

Chng trnh c vit nh sau :


trajectory(X, Y, 1) :- arc(X, Y). trajectory(X, Y, L) :arc(X, Z), trajectory(Z, Y, L1), L is L1 + 1. trajectory(a, d, L). L = 3 Yes

VII.3.3.

Tnh gn ng cc chui

Trong Ton hc thng gp bi ton tnh gn ng gi tr ca mt hm s vi chnh xc nh tu (e) theo phng php khai trin thnh chui Max Loren. V d tnh hm m ex vi chnh xc 10-6 nh khai trin chui Max Loren : x 2 x3 x + + ... e =1+ x + 2! 3! Gi expower(X, S) l hm tnh gi tr hm m theo X, bin S l kt qu gn ng vi chnh xc e=10-6. T cng thc khai trin Max Loren trn y, ta nhn thy gi tr ca hm m ex l tng v hn c dng : sum(0) = 1, t0 = 1 tng ng vi x = 0 v ex = 1 sum(i+1) = sum(i) + ti+1, vi ti+1 = ti * x /( i+1), i = 0, 1, 2 ... thc hin php lp, ta cn xy dng hm quy tnh tng sum(X, S, I, T) trong s dng cc bin trung gian I l bc lp th i v T l s hng ti. Theo cch xy dng ny, hm tnh tng sum(X, S, I, T) l tng ca cc s hng th I tr i ca chui. Qu trnh tnh cc tng dng li khi ti< e, ngha l t c chnh xc e. Ti thi im ny, gi tr ca tng cng chnh l s hng ti. iu kin khi ng qu trnh lp l chuyn v t expower(X, S) thnh v t tnh tng sum(X, S, I, T) vi gi tr u I=0 v T=1. Ta c chng trnh quy nh sau :
expower(X, S) :sum(X, S, 0, 1). sum(_, T, _, T) :abs(T) < 0.000001. sum(X, S, I, T) :abs(T) > 0.000001, I1 is I + 1, T1 is T*X/I1, sum(X, S1, I1, T1), S is S1 + T.

LP TRNH HM V LP TRNH LGIC


?- expower(1, S). S = 2.71828 Yes ?- expower(10, S) S = 22026.5 Yes

182

VIII. Biu din cu trc danh sch


Danh sch l kiu cu trc d liu c s dng rng ri trong cc ngn ng lp trnh phi s. Mt danh sch l mt dy bt k cc i tng. Khc vi kiu d liu tp hp, cc i tng ca danh sch c th trng nhau (xut hin nhiu ln) v mi v tr xut hin ca i tng u c ngha. Danh sch l cch din t ngn gn ca kiu d liu hng phc hp trong Prolog. Hm t ca danh sch l du chm .. Do vic biu din danh sch bi hm t ny c th to ra nhng biu thc mp m, nht l khi x l cc danh sch gm nhiu phn t lng nhau, cho nn Prolog quy c t dy cc phn t ca danh sch gia cc cp mc vung. Chng hn .(a,.(b,[ ])). L danh sch [ a, b ]. Danh sch cc phn t anne, tennis, tom, skier (tn ngi) c vit :
[ anne, tennis, tom, skier ]

chnh l hm t : . ( anne, .( tennis, .( tom, .( skier, [ ] ) ) ) ) Cch vit dng cp mc vung ch l xut hin bn ngoi ca mt danh sch. Nh thy mc trc, mi i tng cu trc ca Prolog u c biu din cy. Danh sch cng khng nm ngoi l, cng c cu trc cy. Lm cch no biu din danh sch bi mt i tng Prolog chun ? C hai kh nng xy ra l danh sch c th rng hoc khng. Nu danh sch rng, n c vit di dng mt nguyn t : [ ] Nu danh sch khc rng, c th xem n c cu trc t hai thnh phn (pair syntax) : 1. Thnh phn th nht, c gi l u (head) ca danh sch. 2. Thnh phn th hai, phn cn li ca danh sch (tr ra phn u), c gi l ui (tail) ca danh sch, cng l mt danh sch. Trong v d trn th u l anne, cn ui l danh sch : [ tennis, tom, skier ] Ni chung, u ca danh sch c th l mt i tng bt k ca Prolog, c th l cy hoc bin, nhng ui phi l mt danh sch. Hnh VIII.1. Biu din dng cy ca danh sch m t cu trc cy ca danh sch cho :

LP TRNH HM V LP TRNH LGIC

183

anne u tennis

.
.

ui cng l danh sch

tom skier

. []

Hnh VIII.1. Biu din dng cy ca danh sch V ui tail l mt danh sch, nn tail c th rng, hoc li c th c to thnh t mt u head v mt ui tail khc. Ch rng danh sch rng xut hin trong s cc hng, v rng phn t cui cng c th xem l danh sch ch gm mt phn t duy nht c phn ui l mt danh sch rng: [ skier ] V d trn y minh ho nguyn l cu trc d liu tng qut trong Prolog p dng cho cc danh sch c di tu . ?- L1 = [ a, b, c ]. ?- L2 = [ a, a, a ]. L1 = [ a, b, c ] L2 = [ a, a, a ] ?- Leisure1 = [ tennis, music, [ ] ]. ?- Leisure2 = [ sky, eating ], ?- L = [ anne, Leisure1, tom, Leisure2 ].
Leisure1 = [ tennis, music ] Leisure2 = [ sky, eating ] L = [ anne, [ tennis, music ], tom, [ sky, eating ] ]

Nh vy, cc phn t ca mt danh sch c th l cc i tng c kiu bt k, k c kiu danh sch. Thng thng, ngi ta x l ui ca danh sch nh l mt danh sch. Chng hn, danh sch : L = [ a, b, c ] c th vit : tail = [ b, c ] v L = .(a, tail) biu din mt danh sch c to thnh t u (Head) v ui (Tail), Prolog s dng k hiu | (split) phn cch phn u v phn ui nh sau : L = [ a | Tail ] K hiu | c dng mt cch rt tng qut bng cch vit mt s phn t tu ca danh sch trc | ri danh sch cc phn t cn li. Danh sch by gi c vit li nh sau : [ a, b, c ] = [ a | [ b, c ] ] = [ a, b | [ c ] ] = [ a, b, c | [ ] ] Sau y l mt s cch vit danh sch : Kiu hai thnh phn
[ ] [ a | [ ] ] [ a | b | [ ] ]

Kiu lit k phn t


[ ] [ a ] [ a, b ]

LP TRNH HM V LP TRNH LGIC


[ a | X ] [ a | X ] [ a | b | X ] [ a, b | X ] [ X1 | [ ... [ Xn | [ ] ]... ] ] [ X1, ... , Xn ]

184

Ta c th nh ngha danh schtheo kiu quy nh sau :


List List [ ] [ Element | List ]

IX. Mt s v t x l danh sch ca Prolog


SWI-Prolog c sn mt s v t x l danh sch nh sau : V t append(List1, List2, List3) ngha Ghp hai danh sch List1 v List2 thnh List3.

Kim tra Elem c l phn t ca danh sch List hay member(Elem, List) khng, ngha l Elem hp nht c vi mt trong cc phn t ca List. Kim tra nu phn t Y c ng ngay sau phn t X nextto(X, Y, List) trong danh sch List hay khng. delete(List1, Elem, Xo khi danh sch List1 nhng phn t hp nht List2) c vi Elem tr v kt qu List2. Ly phn t Elem ra khi danh sch List tr v select(Elem, List, nhng phn t cn li trong Rest, c th dng chn Rest) mt phn t vo danh sch. nth0(Index, List, Kim tra phn t th Index (tnh t 0) ca danh sch Elem) List c phi l Elem hay khng. nth1(Index, List, Kim tra phn t th Index (tnh t 1) ca danh sch Elem) List c phi l Elem hay khng. Kim tra phn t ng cui cng trong danh sch last(List, Elem) List c phi l Elem hay khng. reverse(List1, Nghch o th t cc phn t ca danh sch List1 List2) tr v kt qu List2. permutation(List1, Hon v danh sch List1 thnh danh sch List2. List2) Chuyn danh sch List1 cha cc phn t bt k thnh danh sch phng List2. flatten(List1, V d : flatten([a, [b, [c, d], e]], List2) X). cho kt qu X = [a, b, c, d, e]. sumlist(List, Sum) Tnh tng cc phn t ca danh sch List cha ton s tr v kt qu Sum. Nu Low v High l cc s sao cho Low =< High, numlist(Low, High, th tr v danh sch List = [Low, Low+1, ..., List) High]. Ch mt s v t x l danh sch c th s dng cho mi rng buc, k c khi cc tham i u l bin.

LP TRNH HM V LP TRNH LGIC

185

Trong Prolog, tp hp c biu din bi danh sch, tuy nhin, th t cc phn t trong mt tp hp l khng quan trng, cc i tng d xut hin nhiu ln ch c xem l mt phn t ca tp hp. Cc php ton v danh sch c th p dng cho cc tp hp. l :

Kim tra mt phn t c mt trong mt danh sch tng t vic kim tra mt phn t c thuc v mt tp hp khng ? Ghp hai danh sch nhn c mt danh sch th ba tng ng vi php hp ca hai tp hp. Thm mt phn t mi, hay loi b mt phn t. Prolog c sn mt s v t x l tp hp nh sau : ngha Kim tra Set c phi l mt tp hp hay khng Chuyn danh sch List thnh tp hp Set gi nguyn th t cc phn t ca List (nu List c cc phn t trng nhau th ch ly phn t gp u tin). V d : list_to_set([a,b,a], X) cho kt qu X = [a,b]. Php giao ca hai tp hp Set1 v Set2 l Set3.

V t is_set(Set)

list_to_set(List, Set)

intersection(Set1, Set2, Set3)

Tr v kt qu php hiu ca hai tp hp Set v subtract(Set, Delete, Delete l Result (l tp Set sau khi xo ht Result) cc phn t ca Delete c mt trong ).
union(Set1, Set2, Set3) subset(Subset, Set)

Tr v kt qu php hp ca hai tp hp Set1 v Set2 l Set3. Kim tra tp hp Subset c l tp hp con ca Set hay khng.

X.
X.1.

Cc thao tc c bn trn danh sch


Xy dng li mt s v t c sn

Sau y ta s trnh by mt s thao tc c bn trn danh sch bng cch xy dng li mt s v t c sn ca Prolog.

X.1.1. Kim tra mt phn t c mt trong danh sch


Prolog kim tra mt phn t c mt trong mt danh sch nh sau :
member(X, L)

trong , X l mt phn t v L l mt danh sch. ch member(X, L) c tho mn nu X xut hin trong L. V d : ?- member( b, [ a, b, c ] ) Yes ?- member( b, [ a, [ b, c ] ] ) No ?- member( [ b, c], [ a, [ b, c ] ] )

LP TRNH HM V LP TRNH LGIC


Yes

186

T cc kt qu trn, ta c th gii thch quan h member(X, L) nh sau : Phn t X thuc danh sch L nu : 1. X l u ca L, hoc nu 2. X l mt phn t ca ui ca L. Ta c th vit hai iu kin trn thnh hai mnh , mnh th nht l mt s kin n gin, mnh th hai l mt lut : member( X, [ X | Tail ] ). member( X, [ Head | Tail ] ) :- member( X, Tail ). hoc : member(X, [X|T]). member(X, [_|T]) :- member(X, T).
X.1.2. Ghp hai danh sch

ghp hai danh sch, Prolog c hm : append( L1, L2, L3). trong , L1 v L2 l hai danh sch, L3 l danh sch kt qu ca php ghp L1 v L2. V d : ?- append( [ a, b ], [ c, d ], [ a, b, c, d ] ). Yes ?- append( [ a, b ], [ c, d ], [ a, b, a, c ] ). No [ X | L1 ] X L1 L3
X L3

L2

[ X | L3 ] Hnh X.1. Ghp hai danh sch [ X | L1 ] v L2 thnh [ X | L3 ]. Hm append hot ng ph thuc tham i u tin L1 theo cch nh sau : 1. Nu tham i u tin l danh sch rng, th tham i th hai v th ba phi l mt danh sch duy nht, gi l L. Ta vit trong Prolog nh sau : append( [ ], L, L). 2. Nu tham i u tin ca append l danh sch khc rng, th n gm mt u v mt ui nh sau [ X | L1 ] Kt qu php ghp danh sch l danh sch [ X | L3 ], vi L3 l php ghp ca L1 v L2. Ta vit trong Prolog nh sau :
append( [ X | L1 ], L2, [ X | L3 ] ) :- append( L1, L2, L3 ).

Hnh 4.2 minh ho php ghp hai danh sch [ X | L1 ] v L2.

LP TRNH HM V LP TRNH LGIC Ta c cc v d sau : ?- append( [ a, b, c ], [ 1, 2, 3 ], L ). L = [ a, b, c, 1, 2, 3 ] ?- append( [ a, [ b, c ], d ], [ a, [ ], b ], L ] ). L = [ a, [ b, c ], d, a, [ ], b ] Th tc append c s dng rt mm do theo nhiu cch khc nhau.

187

Chng hn Prolog a ra bn phng n phn tch mt danh sch cho thnh hai danh sch mi nh sau : ?- append( L1, L2, [ a, b, c ] ). L1 = [ ] L2 = [ a, b, c ]; L1 = [ a ] L2 = [ b, c ]; L1 = [ a, b ] L2 = [ c ]; L1 = [ a, b, c ] L2 = [ ]; Yes S dng append, ta cng c th tm kim mt s phn t trong mt danh sch. Chng hn, t danh sch cc thng trong nm, ta c th tm nhng thng ng trc mt thng cho, gi s thng nm (May) : ?- append( Before, [ May | After ] , [ jan, fev, mar, avr, may, jun, jul, aut, sep, oct, nov, dec ] ). Before = [ jan, fev, mar, avr ] After = [ jun, jul, aut, sep, oct, nov, dec ] Yes Thng ng ngay trc v thng ng ngay sau thng nm nhn c nh sau : ?- append( _, [ Month1, may, Month2 | _ ] , [ jan, fev, mar, avr, may, jun, jul, aut, sep, oct, nov, dec ] ). Month1 = avr Month2 = jun Yes By gi cho trc danh sch : L1 = [ a, b, z, z, c, z, z, z, d, e ] Ta cn xa cc phn t ng sau ba ch z lin tip, k c ba ch z : ?- L1 = [ a, b, z, z, c, z, z, z, d, e ], append( L2, [ z, z, z | _ ], L1 ). L1 = [ a, b, z, z, c, z, z, z, d, e ] L2 = [ a, b, z, z, c ]

LP TRNH HM V LP TRNH LGIC

188

member1( b, [ a, b, c ] )

append( L1, [ b | L2 ], [ a, b, c ] Mnh 2 ca append Mnh 1 ca append So khp : L1 = [ ] [ b | L2 ] = [ a, b, c ] Tht bi v b a So khp : L1 = [ X | L1 ] [ b | L2 ] = L2 [ a, b, c ] = [ X | L3 ] T ko theo : X = a, L3 = [ b, c ] append( L1, [ b | L2 ], [ b, c ] ) Mnh 1 ca append So khp : L1 = [ ] [ b | L2 ] = [ b, c ] T ko theo : L2 = [ c ]
thnh cng

Hnh X.2. Th tc member1 tm tun t mt i tng trong danh sch cho. Trc y ta nh ngha quan h member( X, L ) kim tra mt phn t X c mt trong mt danh sch L khng. By gi bng cch s dng append, ta c th nh ngha li member nh sau : member1( X, L ) :- append( L1, [ X | L2], L). Mnh ny c ngha : nu X c mt trong danh sch L th L c th c phn tch thnh hai danh sch, vi X l u ca danh sch th hai. nh ngha member1 hon ton tng ng vi nh ngha member. y ta s dng hai tn khc nhau phn bit hai cch ci t Prolog. Ta cng c th nh ngha li member1 bng cch s dng bin nc danh (anonymous variable) : member1( X, L ) :append( _ , [ X | _ ], L). So snh hai cch ci t khc nhau v quan h thnh vin, ta nhn thy ngha th tc trong nh ngha member c th hin rt r : Trong member, kim tra phn t X c mt trong mt danh sch L khng, 1. Trc tin kim tra phn t u ca L l ng nht vi X, nu khng, 2. Kim tra rng X c mt trong phn ui ca L. Nhng trong trng hp nh ngha member1, ta thy hon ton ngha khai bo m khng c ngha th tc. hiu c cch member1hot ng nh th no, ta hy xem xt qu trnh Prolog thc hin cu hi : ?- member1( b, [ a, b, c ] ).

LP TRNH HM V LP TRNH LGIC

189

Cch tm ca th tc member1 trn y tng t member, bng cch duyt tng phn t, cho n khi tm thy i tng cn tm, hoc danh sch cn.

X.1.3. B sung mt phn t vo danh sch


Phng php n gin nht b sung mt phn t vo danh sch l t n v tr u tin, n tr thnh u. Nu X l mt i tng mi, cn L l danh sch cn b sung thm, th danh sch kt qu s l : [ X | L ] Ngi ta khng cn vit th tc b sung mt phn t vo danh sch. Bi v vic b sung c th c biu din di dng mt s kin nu cn : insert( X, L, [ X | L ] ).

X.1.4. Loi b mt phn t khi danh sch


loi b mt phn t X khi danh sch L, ngi ta xy dng quan h : remove( X, L, L1 ) trong , L1 ng nht vi L, sau khi X b loi b khi L. Th tc remove c cu trc tng t member. Ta c th lp lun nh sau 1. Nu phn t X l u ca danh sch, th kt qu l ui ca danh sch. 2. Nu khng, tm cch loi b X khi phn ui ca danh sch. remove( X, [ X | Tail ], Tail ). remove( X, [ Y | Tail ], [ Y | Tail1 ] ) :remove( X, Tail, Tail1 ). Tng t th tc member, th tc remove mang tnh khng xc nh. Nu c nhiu phn t l X c mt trong danh sch, th remove c th xo bt k phn t no, do qu trnh quay lui. Tuy nhin, mi ln thc hin, remove ch xo mt phn t l X m khng ng n nhng phn t khc. V d : ?- remove( a, [ a, b, a, a ], L ). L = [ b, a, a ]; L = [ a, b, a ]; L = [ a, b, a ] No Th tc remove tht bi nu danh sch khng cha phn t cn xo. Ngi ta c th s dng remove trong mt kha cnh khc, mc ch b sung mt phn t mi vo bt c u trong danh sch. V d, nu ta mun t phn t a vo ti mi v tr bt k trong danh sch [ 1, 2, 3 ], ch cn t cu hi : Cho bit danh sch L nu sau khi xo a, ta nhn c danh sch [ 1, 2, 3 ] ? ?- remove( a, L, [ 1, 2, 3 ] ). L = [ a, 1, 2, 3 ]; L = [ 1, a, 2, 3 ]; L = [ 1, 2, a, 3 ]; L = [ 1, 2, 3, a ] No

LP TRNH HM V LP TRNH LGIC

190

Mt cch tng qut, php ton chn insert mt phn t X vo mt danh sch List c nh ngha bi th tc remove bng cch s dng mt danh sch ln hn LargerList lm tham i th hai :
insert( X, List, LargerList ) :remove( X, LargerList, List ).

Ta nh ngha quan h thuc v trong th tc member1 bng cch s dng th tc append. Tuy nhin, ta cng c th nh ngha li quan h thuc v trong th tc mi member2 bi th tc remove bng cch xem mt phn t X thuc v mt danh sch List nu X b xo khi List :
member2( X, List ) :remove( X, List, _ ).

X.1.5. Nghch o danh sch


S dng append, ta c th vit th tc nghch o mt danh sch nh sau : reverse ( [ ], [ ] ). reverse ( [ X | Tail ], R ) :reverse (Tail, R1 ), append(R1, [X], R). ?- reverse( [ a, b, c , d, e, f ] , L). L = [f, e, d, c, b, a] Yes Sau y l mt th tc khc nghch o mt danh sch nhng c s dng hm b tr trong thn th tc :
revert(List, RevList) :rev(List, [ ], RevList). rev([ ], R, R). rev([H|T], S, R) :rev(T, [H|S], R). ?- revert( [ a, b, c , d, e, f ] , R). R = [f, e, d, c, b, a] Yes

S dng reverse, ta c th kim tra mt danh sch c l i xng (palindrome) hay khng : palindrome(L) :reverse( L, L ). ?- palindrome([ a, b, c , d, c, b, a ]). Yes

X.1.6. Danh sch con


Ta xy dng th tc sublist nhn hai tham i l hai danh sch L v S sao cho S l danh sch con ca L nh sau : ?- sublist( [ c, d, e ], [ a, b, c , d, e, f ] ) Yes ?- sublist( [ c, e ], [ a, b, c , d, e, f ] )

LP TRNH HM V LP TRNH LGIC

191

No Nguyn l xy dng th tc sublist tng t th tc member1, mc d y quan h danh sch con tng qut hn. L

L1

X L

L2 [ X | L2 ] L3

member( X, L )

L1

sublist( S, L )

L2 Hnh X.3. Cc quan h member v sublist. Quan h danh sch con c m t nh sau :
S l mt danh sch con ca L nu :

1. Danh sch L c th c phn tch thnh hai danh sch L1 v L2, v nu 2. Danh sch L2 c th c phn tch thnh hai danh sch S v L3. Nh thy, vic phn tch cc danh sch c th c m t bi quan h ghp append. Do ta vit li trong Prolog nh sau :
sublist( S, L ) :append( L1, L2, L ), append( S, L3, L2 ).

Ta thy th tc sublist rt mm do v do vy c th s dng theo nhiu cch khc nhau. Chng hn ta c th lit k mi danh sch con ca mt danh sch cho nh sau : ?- sublist( S, [ a, b, c ] ). S = [ ]; S = [ a ]; S = [ a, b ]; S = [ a, b, c ]; S = [ b ]; ...

X.1.7. Hon v
i khi, ta cn to ra cc hon v ca mt danh sch. Ta xy dng quan h permutation c hai tham bin l hai danh sch, m mt danh sch l hon v ca danh sch kia. Ta s tn dng php quay lui nh sau : ?- permutation( [ a, b, c ], P ). P = [ a, b, c ]; P = [ a, c, b ]; P = [ b, a, c ]; ... Nguyn l hot ng ca th tc swap da trn hai trng hp phn bit, tu theo danh sch th nht : 1. Nu danh sch th nht rng, th danh sch th hai cng phi rng. 2. Nu danh sch th nht khc rng, th n s c dng [ X | L ] v c tin hnh hon v nh sau : trc tin hon v L nhn c L1, sau chn X vo tt c cc v tr trong L1.

LP TRNH HM V LP TRNH LGIC

192

L hon v L L1 L1 l mt hon v ca L

Chn X ti mt v tr nhn c mt hon v ca [ X | L ] Hnh X.4. Mt cch xy dng hon v permutation ca danh sch [ X | L ]. Ta nhn c hai mnh tng ng vi th tc nh sau : permutation( [ ], [ ] ). permutation( [ X | L ], P ) :permutation( L, L1 ), insert( X, L1, P ). Mt phng php khc l loi b phn t X khi danh sch u tin, hon v phn cn li ca danh sch ny nhn c danh sch P, sau thm X vo phn u ca P. Ta c chng trnh khc permutation2 nh sau : permutation2( [ ], [ ] ). permutation2( L, [ X | P ] ) :remove( X, L, L1 ), permutation2( L1, P ). T y, ta c th khai thc th tc hon v, chng hn (ch khi chy Arity Prolog cn g vo mt du chm phy ; sau ->) : ?- permutation( [ red, blue, green ], P ). P = [ red, blue, green ]; P = [ red, green, blue ]; P = [ blue, red, green ]; P = [ blue, green, red ]; P = [ green, red, blue ]; P = [ green, blue, red ]; Yes Hoc nu s dng permutation theo cch khc nh sau : ?- permutation( L, [ a, b, c ] ). Prolog s rng buc lin tip cho L a ra 6 hon v khc nhau c th. Tuy nhin, nu NSD yu cu mt gii php khc, Prolog s khng bao gi tr li No, m ri vo mt vng lp v hn do phi tm kim mt hon v mi m thc ra khng tn ti. Trong trng hp ny, th tc permutation2 ch tm thy mt hon v th nht, sau ngay lp tc ri vo mt vng lp v hn. V vy, cn ch khi s dng cc quan h hon v ny.

X.2.

Mt s v d v danh sch

X.2.1. Sp xp cc phn t ca danh sch


Xy dng th tc sp xp cc phn t c ca mt danh sch bng phng php chn nh sau :
ins(X, [ ], [ X ]). ins(X, [H|T], [ X,H|T ]) :X @=< H. ins(X, [ H|T ], [ H|L ]) :-

LP TRNH HM V LP TRNH LGIC


X @> H, ins( X, T, L ). ?- ins(8, [ 1, 2, 3, 4, 5 ], L). L = [1, 2, 3, 4, 5, 8] Yes ?- ins(1, L, [ 1, 2, 3, 4, 5 ]). L = [2, 3, 4, 5] Yes ins_sort([ ], [ ]). ins_sort([H|T], L) :ins_sort(T, L1), ins(H, L1, L). ?- ins_sort([3, 2, 6, 4, 7, 1], L). L = [1, 2, 3, 4, 6, 7] Yes

193

X.2.2. Tnh di ca mt danh sch


Xy dng th tc tnh di hay m s lng cc phn t c mt trong mt danh sch cho nh sau :
length( L, N ).

Xy ra hai trng hp : 1. Nu danh sch rng, th di N = 0. 2. Nu danh sch khc rng, th n c to thnh t danh sch c dng : [ head | queue ] v c di bng 1 cng vi di ca queue. Ta c chng trnh Prolog nh sau :
length( [ ], 0 ). length( [ _ | Queue ], N ) :length(Queue, N1 ), N is 1 + N1. Kt qu chy Prolog nh sau : ?- length( [ a, b, c, d, e ], N ). N = 5 Yes ?- length( [ a, [ b, c ], d, e ], N ). N = 4 Yes

Ta thy rng trong mnh th hai, hai ch ca phn thn l khng th hon i cho nhau, v rng N1 phi c rng buc trc khi thc hin ch :
N is 1 + N1

Chng hn, nu gi trace, qu trnh thc hin length( [ 1, 2, 3 ], N ) nh sau :


(0) (1) (2) (3)

gi gi gi gi

length([1, 2, 3], N) length([2, 3], N) length([3], N) -> length([ ], N) ->

-> -> N = 0

LP TRNH HM V LP TRNH LGIC


(4) (5) (6)

194
N = 1 N = 2 N = 3

gi gi gi

N is 1 + 0 -> N is 1 + 1 -> N is 1 + 2 ->

Vi is, ta a vo mt quan h nhy cm vi th t thc hin cc ch, v do vy khng th b qua yu t th tc trong chng trnh. iu g s xy ra nu ta khng s dng is trong chng trnh. Chng hn :
length1( [ ], 0 ). length1( [ _ | Queue ], N ) :length1( Queue, N1 ), N = 1 + N1.

Lc ny, nu gi :
?- length1( [ a, [ b, c ], d, e ], N ).

Prolog tr li :
N = 1 + (1 + (1 + (1 + 0))) Yes

Php cng do khng c khi ng mt cch tng minh nn s khng bao gi c thc hin. Tuy nhin, ta c th hon i hai ch ca mnh th hai trong length1 :
length1( [ ], 0 ). length1( [ _ | Queue ], N ) :N = 1 + N1, length1( Queue, N1 ).

Kt qu chy chng trnh sau khi hon i vn y ht nh c. By gi, ta li c th rt gn mnh v ch cn mt ch :


length1( [ ], 0 ). length2( [ _ | Queue ], 1 + N ) :length2( Queue, N ).

Kt qu chy chng trnh ln ny vn y ht nh c. Prolog khng a ra tr li nh mong mun, m l : ?- length1([ a, b, c, d], N). N = 1+ (1+ (1+ (1+0))) Yes

X.2.3. To sinh cc s t nhin


Chng trnh sau y to sinh v lit k cc s t nhin : % Natural Numbers
nat(0). nat(N) :- nat(M), N is M + 1.

Khi thc hin cc ch con trong cu hi :


?- nat(N), write(N), nl, fail.

cc s t nhin c to sinh lin tip nh k thut quay lui. Sau khi s t nhin u tin nat(N) c in ra nh write(N), hng fail bt buc thc hin quay lui. Khi , lut th hai c vn dng to sinh s t nhin tip theo v c th tip tc cho n khi NSD quyt nh dng chng trnh (^C).

LP TRNH HM V LP TRNH LGIC

195

Bi tp chng 3
1. Tm cc i tng Prolog ng n v mt c php trong s i tng c cho di y. Cho bit kiu ca chng (l nguyn t, s, bin hay cu trc) ?
a) b) c) d) e) f) g) h) i) j) Diane diane Diane _diane Diane va en vacances va( diane, vacances ) 45 5(X , Y) +( nord , owest ) three( small( cats ) )

2. Hy tm mt biu din dng i tng cu trc cho cc hnh ch nht, hnh vung v hnh trn. Xem hnh 2.4 c cch gii quyt. S dng cc biu din cho cc hnh c th minh ha. 3. Chng trnh sau ni rng hai ngi l c quan h dng h vi nhau nu : a) mt l t tin ca ngi kia, hoc, b) hai ngi c chung t tin, hoc, c) hai ngi c cng con chu. kindred( X, Y) :ancestor(X , Y). kindred(X , Y) :ancestor(X , Y). kindred(X , Y) :% X v Y c cng t tin ancestor( Z, X), ancestor(Z , Y). kindred(X , Y) :% X v Y c cng con chu ancestor (X , Z), ancestor(Y , Z). Hy cho bit c th lm ngn chng trnh trn bng cch s dng du chm phy ; c khng ? 4. Hy tm hiu mt nh ngha mi v quan h ancestor : ancestor(X Z) :parent(X Z) .
ancestor(X Z) :parent(Y , Z), ancestor( X, Y).

nh ngha ny c ng hay khng ? C th thay i li s cho trong hnh 1.7 tng ng vi nh ngha mi ny ? 5. Ngoi cc nh ngha quan h gia nh c trong phn l thuyt v bi tp, hy nh ngha cc quan h khc theo tp qun Vit Nam (c, d, ch, bc...) ?

LP TRNH HM V LP TRNH LGIC 6. Hy nh ngha cc quan h trong th gii sinh vt (ng vt, thc vt) ? 7. Cho bit cc hng Prolog hp thc sau y (valid Prolog terms) : 23 +(fred, jim)
foo(X, bar(+(3, 4))) Foo(x) 1+2. Alison Cawsey

196

8. Cho quan h parent c nh ngha trong phn l thuyt cho bit kt qu ca cc cu hi sau : a) ?- parent(jim , X). b) ?- parent( X , jim). c) ?- parent(mary , X) , parent( X , part). d) ?- parent(mary , X) , parent( X , y ) , parent(y , jim). 9. Vit cc mnh Prolog din t cc cu hi lin quan n quan h parent : a) Ai l cha m ca Sue ? b) Liz c con khng ? c) Ai l ng b (grandparent) ca Sue ? 10. Vit trong Prolog cc mnh sau : a) Ai c mt a tr ngi l hnh phc. Hng dn : Xy dng quan h mt ngi happy. b) Vi mi X, nu X c mt con m ngi con ny c mt ch em gi, th X c hai con (xy dng quan h have_two_children). 11. nh ngha quan h grandchild bng cch s dng quan h parent. Hng dn : tm hiu quan h grandparent. 12. nh ngha quan h aunt( X, Y ) bng cch s dng quan h parent. thun tin, c th v s minh ha. 13. Cc php so khp di y c ng khng ? Nu ng, cho bit cc rng buc bin tng ng ? a) point( A , B ) = point( 1 , 2 ) b) point( A , B ) = point( X , Y, Z ) c) addition( 2 , 2 ) = 4 d) +( 2 , D ) = +( E , 2 ) e) triangle( point( -1 , 0 ) , P2, P3 ) = triangle( P1, point( 1, 0 ), point( 0, Y ) ) Cc rng buc y nh ngha mt lp cc tam gic. Lm cch no m t lp ny ? 14. S dng m t cc ng thng cho trong bi hc, tm mt hng biu din mi ng thng ng X = 5. 15. Cho hnh ch nht c biu din bi hng: rectangle(P1, P2, P3, P4). Vi Pi l cc nh ca hnh ch nht theo chiu dng, hy nh ngha quan h : regular( R ) l ng nu R l mt hnh ch nht c cc cnh thng ng v nm ngang (song song vi cc trc ta ). 16. Cho bit kt qu ca cc cu hi sau y : ?- X=Y. ?- X is Y ?- X=Y, Y=Z, Z=1. ?- X=1, Z=Y, X=Y.

LP TRNH HM V LP TRNH LGIC


?- X is 1+1, Y is X. ?- Y is X, X is 1+1. ?- 1+2 == 1+2. ?- X == Y. ?- X == X. ?- 1 =:= 2-1 ?- X =:= Y. 17. Cho bit kt qu ca cc cu hi sau y : ?- op(X) is op(1). ?- op(X) = op(1). ?- op(op(Z), Y) = op(X, op(1)).

197

?- op(X, Y) = op(op(Y), op(X)). 18. T cc nh ngha s t nhin (nat) v php cng (addi) cho trong v d 1 mc nh ngha hm, hy vit tip cc hm tr (subt), nhn (multi), chia (divi), lu tha (power), giai tha (fact), so snh nh hn (less) v tm c s chung ln nht (pdg) s dng cc hm c (chng hn less, subt...). 19. Vit hm Prolog kim tra mt s nguyn tu N : a. N l s chn (even number) s dng quy trc tip Hng dn : N chn th N2 cng l s chn b. N l s l (odd number) s dng quy trc tip Hng dn : N l th N2 cng l s l c. N chn s dng hm kim tra s l cu d (N chn th N1 l s l) d. N l s l s dng hm kim tra s chn cu c (N l th N1 chn). 20. Vit hm Prolog lm duyt (tracking/traverse) trn cy nh phn theo cc th t trc (reorder), sau (post-order) v gia (in-order).

Gi s cy nh phn tng ng vi biu thc s hc (5+6)*(3-(2/2)) l cc mnh Prolog nh sau :


tree(*, tree(+, leaf(5), leaf(6)), tree(-, leaf(3), tree(/, leaf(2), leaf(2))) Kt qu duyt cy nh sau : theo th t trc : [*, +, 5, 6, -, 3, /, 2, 2] th t gia : [5, +, 6, *, 3, -, 2, /, 2]

th t sau :
[5, 6, +, 3, 2, 2, /, -, *] 21. Vit li hm to 10 s t nhin chn u tin ( cho trong phn quy) sao cho kt qu tr v l dy s tng dn. 22. Lp bng nhn table(R, N) c s b nhn (multiplicator) t 1 tr i vi s nhn N (multiplier) v dng li khi gp s b nhn R (kt qu R * N). 23. Vit cc hm 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

LP TRNH HM V LP TRNH LGIC 1+ x2 2 x4 2 4 x6 cho n khi phn t th n < e + + + ... 2 3 4 3 5 6 n x2 x3 xn n x S = 1 - x + + ... + (-1) + ... cho n khi < 2! 3! n! n! x2 x4 x6 x 2n + + +...+ +... 2! 4! 6! (2n)! x + ... + x c n > 1 du cn cho n khi
x 2n < 105 (2 n)!

198

S = 1+ y=

x +

24. Trnh Prolog di y l mt trnh din dch (interpreter) cho mt ngn ng lp trnh n gin ch gm cc s nguyn int(N), cc bin id(X), cc hm fn(X,E), v gi hm app(E1,E2) :
%% subst(E1, E2, X, V) %% thc hin php th bin X bi bin V trong E1 tr v E2. subst(int(N), int(N), _, _). subst(id(X), V, X, V). subst(id(Y), id(Y), X, _) :X \= Y. subst(fn(X, E), fn(X, E), X, _). subst(fn(Y, Ea), fn(Y, Eb), X, V) :X \= Y, subst(Ea, Eb, X, V). subst(app(E1a, E2a), app(E1b, E2b), X, V) :subst(E1a, E1b, X, V), subst(E2a, E2b, X, V). %% reduce(E, V) %% thc hin php tnh gi tr ca E tr v V. reduce(int(N), int(N)). reduce(fn(X, B), fn(X, B)) reduce(app(E1, E2), V) :reduce(E1, fn(X, B)), reduce(E2, V2), subst(B, E, X, V2), reduce(E, V).

Cu hi : a. Cho bit cch trao i tham bin hp l trong ngn ng m t trn y ? i tham bin no th khng th thc hin c ? b. Tm cch thay i trnh Prolog trn y c th thc hin c cc phng php trao i tham bin khc nhau. c. Cho bit tm vc (scope) ca cc bin l tnh hay ng ? 25. Cho v d mt th khng nh hng di y :
arc(a,b). arc(b,c). arc(c,d). arc(c,e). arc(d,f). arc(f,a). arc(a,b). arc(h,i).

Cch trao

LP TRNH HM V LP TRNH LGIC


arc(c,g). arc(g,f). arc(i,j).

199

Hy vit hm tm ng i gia hai nh ca th. 26. Vit mt th tc s dng append xa ba phn t cui cng ca danh sch L, to ra danh sch L1. Hng dn : L l php ghp ca L1 vi mt danh sch ca ba phn t ( b xa khi L). 27. Vit mt dy cc ch xa ba phn t u tin v ba phn t cui cng ca mt danh sch L, tr v danh sch L2. 28. nh ngha quan h :
last_element( Object, List )

sao cho Object phi l phn t cui cng ca danh sch List. Hy vit thnh hai mnh , trong c mt mnh s dng append, mnh kia khng s dng append. 29. nh ngha hai v t :
even_length( List ) v odd_length( List )

c tha mn khi s cc phn t ca danh sch List l chn hay l tng ng. V d danh sch : [ a, b, c, d ] c di chn, [ a, b, c ] c di l. 30. Cho bit kt qu Prolog tr li cc cu hi sau : ?- [1,2,3] = [1|X]. ?- [1,2,3] = [1,2|X]. ?- [1 | [2,3]] = [1,2,X]. ?- [1 | [2,3,4]] = [1,2,X]. ?- [1 | [2,3,4]] = [1,2|X]. ?- b(o,n,j,o,u,r) =.. L. ?- bon(Y) =.. [X,jour]. ?- X(Y) =.. [bon,jour]. 31. Vit chng trnh Prolog kim tra mt danh sch c phi l mt tp hp con ca mt danh sch khc khng ? Chng trnh hot ng nh sau : ?- subset2([4,3],[2,3,5,4]). Yes 32. Vit chng trnh Prolog ly ra cc phn t t mt danh sch. Chng trnh cng c th chn cc phn t vo mt danh sch hot ng nh sau :
?- takeout(3,[1,2,3],[1,2]). Yes ?- takeout(X,[1,2,3],L). X = 1 L = [2, 3] ; X = 2 L = [1, 3] ; X = 3 L = [1, 2] ; No ?- takeout(4,L,[1,2,3]). 4

LP TRNH HM V LP TRNH LGIC

200

L = [4, 1, 2, 3] ; L = [1, 4, 2, 3] ; L = [1, 2, 4, 3] ; L = [1, 2, 3, 4] ; No 33. Vit v t Prolog getEltFromList(L,N,E) cho php ly ra phn t th N trong mt danh sch. Tht bi nu danh sch khng c N phn t. Chng trnh hot ng nh sau : ?- getEltFromList([a,b,c],0,X). No ?- getEltFromList([a,b,c],2,X). X = b ?- getEltFromList([a,b,c],4,X). No 34. Vit chng trnh Prolog tm phn t ln nht v phn t nh nht trong mt danh sch cc s. Chng trnh hot ng nh sau : ?- maxmin([3,1,5,2,7,3],Max,Min). Max = 7 Min = 1 Yes ?- maxmin([2],Max,Min). Max = 2 Min = 2 Yes 35. Vit chng trnh Prolog chuyn mt danh sch phc hp, l danh sch m mi phn t c th l mt danh sch con cha cc danh sch con phc hp khc, thnh mt danh sch phng l danh sch ch cha cc phn t trong tt c cc danh sch con c th, gi nguyn th t lc u. Chng trnh hot ng nh sau : flatten([[1,2,3],[4,5,6]], Flatlist). Flatlist = [1,2,3,4,5,6] Yes flatten([[1,[hallo,[[aloha]]],2,[],3],[4,[],5,6]], Flatlist) Flatlist = [1, hallo, aloha, 2, 3, 4, 5, 6] Yes 36. S dng v t forall vit chng trnh Prolog kim tra hai danh sch c ri nhau (disjoint) khng ? Chng trnh hot ng nh sau : ?- disjoint([a,b,c],[d,g,f,h]). Yes ?- disjoint([a,b,c],[f,a]). No 37. V t forall(Cond, Action) thc hin kim tra s so khp tng ng gia Cond, thng kt hp vi v t member, v Action. V d di y kim tra vic thc hin cc php ton s hc trong danh sch L l ng n. ?- forall(member(Result = Formula, [2 = 1 + 1, 4 = 2 * 2]), Result =:= Formula).

LP TRNH HM V LP TRNH LGIC

201

Result = _G615 Formula = _G616 Yes 38. S dng v t forall vit chng trnh Prolog kim tra mt danh sch c l mt tp hp con ca mt danh sch khc hay khng ? Chng trnh hot ng nh sau : ?- subset3([a,b,c],[c,d,a,b,f]). Yes ?- subset3([a,b,q,c],[d,a,c,b,f]) No 39. S dng v t append ghp hai danh sch vit cc chng trnh Prolog thc hin cc vic sau : prefixe(L1, L2) danh sch L1 ng trc (prefixe list) danh sch L2. suffixe(L1, L2) danh sch L1 ng sau (suffixe list) danh sch L2. isin(L1, L2) cc phn t ca danh sch L1 c mt trong danh sch L2. 40. S dng phng php Quicksort vit chng trnh Prolog sp xp nhanh mt danh sch cc s cho theo th t tng dn. 41. c hiu chng trnh sau y ri dng li thut ton : /* Missionarys & Cannibals */ /* Trnh vng lp */ lNotExist(_,[]). lNotExist(X,[T|Q]) :X\==T, lNotExist(X,Q). /* Kim tra tnh hp l ca trng thi */ valid(MG,CG,MD,CD) :MG>=0, CG>=0, MD>=0, CD>=0, MG=0, MD>=CD. valid(MG,CG,MD,CD) :MG>=0, CG>=0, MD>=0, CD>=0, MG>=CG, MD=0. valid(MG,CG,MD,CD) :MG>=0, CG>=0, MD>=0, CD>=0, MG>=CG, MD>=CD. /* Xy dng cung v kim tra */ sail(1,0). sail(0,1). sail(1,1). sail(2,0). sail(0,2). arc([left,MGi,CGi,MDi,CDi],[droite,MGf,CGf,MDf,CDf]) :sail(Mis,Can), MGf is MGi-Mis, MDf is MDi+Mis, CGf is CGi-Can, CDf is CDi+Can, valid(MGf,CGf,MDf,CDf). arc([right,MGi,CGi,MDi,CDi],[left,MGf,CGf,MDf,CDf]) :sail(Mis,Can), MGf is MGi+Mis, MDf is MDi-Mis, CGf is CGi+Can, CDf is CDi-Can, valid(MGf,CGf,MDf,CDf). /* Php quy */ cross(A,A,[A],Non). cross(X,Y,Ch,Non) :arc(X,A), lNotExist(A,Non), cross(A,Y,ChAY,[A|Non]), Ch=[X|ChAY]. /* i qua */ traverse(X,Y,Ch) :cross(X,Y,Ch,[X]).

You might also like