Professional Documents
Culture Documents
TP.HCM
Mc lc
PHN I. PROLOG _______________________________________________________ 1
V t (predicate) - T duy lp trnh v nh ngha vn trn Prolog ______ 2 Cc clause, cch gii thch cc vn trn Prolog _______________________ 5 Mi trng lp trnh B-Prolog _______________________________________ 7
Gii thiu s nt v B-Prolog ____________________________________________________ 7 Ci t v lm vic vi B-Prolog__________________________________________________ 7 G ri chng trnh (debugging)__________________________________________________ 8 Cc thut ng c bn trong B-Prolog ______________________________________________ 9 Cc kiu d liu v cc v t xy dng sn (built-in) c bn trong B-Prolog _______________ 10
Thc thi chng trnh. - t cu hi v nhn cu tr li_________________ 12 IV. Php hp nht - C ch tm cu tr li ca Prolog. __________________ 15
Chng VI.
VI.1 VI.2
Lp trnh quy vi Prolog ______________________________________ 22 Danh sch trn Prolog ___________________________________________ 24 Lp trnh quy vi danh sch trn Prolog ___________________________ 26 Danh sch hai chiu _______________________________________________ 29
PHN II.
Chng I.
I.1 I.2 1. 2.
LISP ________________________________________________________ 30
Gii thiu ________________________________________________________ 31
Lch s pht trin _______________________________________________________________ 31 c im ca gcLisp ____________________________________________________________ 31 Cc c im ca ngn ng_____________________________________________________ 31 Kiu d liu _________________________________________________________________ 32
Chng II.
II.1 1. 2. 3. II.2 1. 2.
Cc khi nim c bn _________________________________________________________ 33 Bt u vi LISP _____________________________________________________________ 33 Hm v d liu trong LISP _____________________________________________________ 34 nh gi____________________________________________________________________ 34 Cc hm x l trn danh sch ___________________________________________________ 34 FIRST v REST CAR v CDR_________________________________________________ 34 CONS, APPEND, LIST________________________________________________________ 35
3. 4. II.3 II.4 1. 2.
NTHCDR, BUTLAST v LAST _________________________________________________ 36 LENGTH v REVERSE _______________________________________________________ 37 Thao tc trn Integer, Ratio, Floating-Point Numbers, ... ______________________________ 37 Lp trnh hng d liu ________________________________________________________ 38 ASSOC ____________________________________________________________________ 38 ACONS ____________________________________________________________________ 38
Chng III.
III.1 III.2 1. 2.
Hm v Bin cc b _______________________________________________ 40
nh ngha hm Chng trnh quy trong Lisp ___________________________________ 40 Bin cc b _________________________________________________________________ 41 LET _______________________________________________________________________ 41 LET* ______________________________________________________________________ 42
Chng IV.
IV.1 IV.2 IV.3 IV.4 IV.5 IV.6 IV.7 1. 2. 3. IV.8 1. 2. 3.
V t_______________________________________________________________________ 43 Cc php so snh: EQUAL, EQ, EQL v =_________________________________________ 43 V t MEMBER______________________________________________________________ 44 V t NULL v ENDP _________________________________________________________ 45 Cc v t xc nh kiu d liu __________________________________________________ 45 Cc v t trn s______________________________________________________________ 47 Cc ton t logic _____________________________________________________________ 48 AND ______________________________________________________________________ 48 OR ________________________________________________________________________ 49 NOT_______________________________________________________________________ 49 Cc dng iu kin ___________________________________________________________ 50 IF, WHEN v UNLESS________________________________________________________ 50 COND _____________________________________________________________________ 51 CASE______________________________________________________________________ 51
Chng V.
V.1 V.2 1. 2. 3. 4. V.3 1. 2. V.4 1. 2.
Cc trng ca mt k hiu_____________________________________________________ 53 Doublets____________________________________________________________________ 53 Doublets____________________________________________________________________ 53 Pointed pair _________________________________________________________________ 54 K hiu pointed pair __________________________________________________________ 54 Doublets trong LISP __________________________________________________________ 54 Li gi hm tnh ton _________________________________________________________ 55 Apply ______________________________________________________________________ 55 Funcall _____________________________________________________________________ 55 Hm v danh ________________________________________________________________ 56 Lambda expression ___________________________________________________________ 56 Hm v danh v bin cc b ____________________________________________________ 56
Chng VI.
VI.1 1.
ii
2. 3. VI.2 1. 2.
DOLIST H tr lp trn danh sch _______________________________________________ 57 DO tng qut hn DOLIST v DOTIMES _________________________________________ 59 Cc dng c bit_____________________________________________________________ 59 progn ______________________________________________________________________ 59 prog1 ______________________________________________________________________ 59
Chng VII.
VII.1 VII.2 VII.3
Lu li tp tin chng trnh v d liu ____________________________________________ 61 Bin dch tp tin______________________________________________________________ 61 Debugging __________________________________________________________________ 61
Chng VIII.
VIII.1 VIII.2 VIII.3 VIII.4 VIII.5 VIII.6 VIII.7
Ci t___________________________________________________________________ 63 Startup Gclisp _____________________________________________________________ 63 Phm nng________________________________________________________________ 63 Dng lnh ________________________________________________________________ 64 Lnh tin t (Prefix command) ________________________________________________ 64 Ca s son tho GMAC ____________________________________________________ 64 Load file vo gclisp_________________________________________________________ 64
PHN III.
Chng I.
I.1 1. 2. 3. 4. 5. 6. 7. 8. I.2 1. 2. 3. 4. 5. 6. 7. 8.
SMALLTALK_________________________________________________ 66
L THUYT V OOP V NGN NG SMALLTALK ________________ 67
Lp trnh hng i tng (Object Oriented Programming) vi Smalltalk ___________________ 67 i tng (Object) - Cc thnh phn (member) ca i tng: Cc thuc tnh (properties) v cc Khi nim class - Mi quan h gia object v class - Khi nim instance. _________________ 67 Phng thc - Thng ip (message) - i tng nhn thng ip (receiver). i s ca thng Cc loi thng ip: unary, binary v keyword. u tin gia cc thng ip. ____________ 69 Cu lnh (statement) - kch bn (script)____________________________________________ 70 Che giu thng tin (hiding information) ___________________________________________ 71 S tha k (inheritance) - Che ph (override) - S dn xut (derivation) - Mi quan h gia cc Tnh a hnh (polymorphism) - S rng buc mun (late - binding)______________________ 72 Ngn ng Smalltalk _____________________________________________________________ 72 Object trn Smalltalk. Thuc tnh thng v thuc tnh indexed. Cc thnh phn cho i tng v Cc literal - object: Integer, Float, Character, Boolean, Array, String, Context _____________ 73 Khai bo bin - Rng buc v kiu trn ngn ng Smalltalk - Pht biu gn - Pht biu tr v _ 74 nh ngha mt object mi. Cc phng thc new v new: ____________________________ 75 nh ngha mt class mi v phng thc mi - S bin dch offline v online mt phng thc 76 Bn trong phng thc - Cc t kha self v super___________________________________ 76 Cc phng thc primitive _____________________________________________________ 78 Khi nim v MetaClass - S dng MetaClass - Lp trnh OOP ng (dynamic) vi Smalltalk 78 thnh phn cho lp ________________________________________________________________ 72 phng thc (methods) - S bao ng (encapsulation). ____________________________________ 67
ip (argument) ___________________________________________________________________ 68
iii
9. I.3 1. 2.
Cc lp c bit: Compiler, Window, ViewManager, Prompter... _______________________ 79 Mt s k thut lp trnh cn bn trn Smalltalk _______________________________________ 79 S m phng cc cu trc iu khin. _____________________________________________ 79 Thao tc trn tp hp (collection). Mt s k thut x l trn tp hp.____________________ 80
Chng II.
II.1 1. 2. 3. 4. II.2 1. 2. 3. 4. 5.
Hng dn s dng chng trnh VWIN: __________________________________________ 83 Thao tc trn h thng lp ______________________________________________________ 83 Lp trnh ___________________________________________________________________ 85 Load v Save file. ____________________________________________________________ 88 G ri______________________________________________________________________ 88 Gii thiu v mt s lp c sn ca VWIN _________________________________________ 90 Lp Object__________________________________________________________________ 90 Lp Magnitude ______________________________________________________________ 91 Lp Number, Integer, Float, Character ____________________________________________ 91 Lp IndexedCollection: ________________________________________________________ 91 Lp Context: ________________________________________________________________ 94
iv
PHN I. PROLOG
Chng I.
i vi Prolog, mt chng trnh c th hiu nh l cc tri thc c ngi lp trnh cung cp cho h thng Prolog. Nh vo cc kin thc c cung cp, h thng c th tr li c cc cu hi c t ra, v cu tr li c th t c nh c ch suy lun ca h thng da trn nhng kin thc c cung cp ban u. n v kin thc m ngi lp trnh cung cp cho Prolog gi l cc v t (predicate). Cc v t dng biu din cc khi nim m ngi lp trnh mun h thng dng suy lun t c cc kin thc khc m mnh mong mun. V mt k thut, cc predicate c th c xem nh cc hm, nhng gi tr tr v ch c th l cc gi tr lun l - ng hoc sai. V gi tr tr v ny ch c th s dng suy lun, Prolog khng c c th chng cht hm nh cc ngn ng th tc khc, chnh iu ny s lm nhng ngi quen vi vic lp trnh th tc gp kh khn khi bc u lp trnh vi Prolog. Cng vic u tin khi lp trnh trn Prolog l nh ngha cc v t - cc khi nim m mnh cn cung cp cho chng trnh. Xt cc v d sau: VD1: D kin ban u: Mi ngi u phi cht. Socrates l ngi. Yu cu: Chng ta mun h thng phi c kh nng suy lun v tr li c cc vn lin quan n cc khi nim trn: ai l ngi, ai khng l ngi, ai phi cht, ai khng phi cht. y chng ta c mt s suy lun thng minh c trng cho sc mnh ca Prolog: h thng s t ng suy lun rng Socrates phi cht (iu khng c cung cp ban u). biu din cc vn trn bng ngn ng Prolog, chng ta cn phi xc nh cn phi biu din nhng khi nim g. Trong vn ny chng ta c hai khi nim cn biu din: mt thc th no c th l ngi (hoc khng), v mt thc th no c th cht. Nh vy chng ta biu din vn u tin bng ngn ng Prolog nh sau: nguoi(symbol) Symbol l mt kiu d liu c bit ca Prolog, dng biu din cho mt thc th, mt khi nim tng qut. Nh vy chng ta va nh ngha mt khi nim: mt symbol no c th l ngi, mt symbol no khc th khng. Hiu nh mt s nh ngha hm, chng ta c th xem nh nh ngha mt hm mang tn nguoi, hm ny c thng s mt bin thuc kiu d liu symbol, v kt qu ca hm ny,
2
khng cn phi khai bo thuc v kiu g, v ch c th thuc kiu boolean, ch c th ng hoc sai. Nhim v ca Prolog l phi tr li c vi gi tr symbol nhp vo, th hm ny cho ra kt qu ng hoc sai, tc symbol y c phi l ngi hay khng. Prolog ch c th lm c iu ny nu nh nu nh chng ta cung cp cho h thng mt c ch suy lun ng n, tc l gii thch c cho Prolog hiu nh th no l ngi? Tng t nh vy, chng ta nh ngha v vn mt thc th no phi cht bng v t sau chet(symbol) Nh vy vi bi ton nu, chng ta s t ra hai v t nguoi(symbol) chet(symbol) VD2: Yu cu: tnh gi tr giai tha ca mt s nguyn bt k. Bi ton trn khng cho bit d kin ban u. Chng ta phi cung cp cc d kin ban u, Prolog c th da vo suy lun, t h thng c th gii quyt c yu cu ca chng ta. Vic cung cp d kin ban u cho h thng l rt quan trng quyt nh vn gii quyt yu cu ca chng ta. Mt trong nhng cch gii quyt c th c la chn l chng ta s cho h thng bit gi tr giai tha ca ton b s nguyn: giai tha ca 0 l 1, giai tha ca 1 l 1, giai tha ca 2 l 2, giai tha ca 3 l 6, giai tha ca 4 l 24 D dng nhn thy rng cch ny l khng kh thi, v trong thc t, con ngi cng khng tip thu tri thc theo cch ny. Chng ta c th cung cp d kin cho h thng theo cch khc: giai tha ca mt s l tch cc s t 1 n s . Nh vy vi cch gii quyt ny, chng ta c hai khi nim cn phi cung cp: giai tha ca mt s l g, v tch ca cc s nguyn tnh t 1 n mt s l g? Cch t vn ny c th gii quyt c bi ton, tuy nhin chng ta c th t vn theo mt cch khc n gin, v hp vi tinh thn ca Prolog hn: giai tha ca 0 l 1, v giai tha ca mt s ln hn 0 l giai tha ca s lin trc n nhn vi chnh n. Vi cch t vn ny, chng ta ch c mt khi nim phi biu din: giai tha ca mt s l g? (tht ra chng ta cn mt s khi nim phi a ra: mt s ng trc mt s l g, nhn hai s ngha l g, tuy nhin Prolog cung cp cc ton t gii quyt vn ny. Hiu theo mt ngha no , cc vn trn l cc tin , khng cn phi gii thch vi h thng.) Nu quen vi ngn ng lp trnh th tc, chng ta c khuynh hng din t khi nim giai tha nh sau: giaithua(integer) y cch t vn nh vy l khng thch hp vi ngn ng Prolog, v
. Mt v t ch c th tr li l ng hoc sai, trong khi chng ta ang mong mun kt qu tr v theo cch khai bo ny mt s . Ngn ng Prolog khng c s chng cht hm, ngha l kt qu ca hm (v t) khng th dng nh mt thng s cho mt v t khc, trong khi chng ta ang nh dng kt qu ca hm ny tnh tip gi tr cho mt hm khc.(Chng ta nh dng hm ny tnh giai tha ca n -1 , ri nhn tip cho n ra kt qu cui cng). V t thch hp s nh sau: giaithua(integer,integer) iu ny, hiu theo ngn ng th tc, ngha l chng ta khai bo mt hm c thng s l hai s nguyn, v kt qu tr v s l ng hoc sai. iu chng ta mun din t c ngha l: giai tha ca mt s nguyn (integer) s l mt s nguyn khc. Nu chng ta gii thch c cho Prolog hiu giai tha ca mt s nguyn s c tnh nh th no, h thng s c kh nng tr li cho c cu hi thun (giai tha ca mt s nguyn l g), cu hi nghch (s nguyn no c giai tha bng s nguyn ny), v nghi vn (giai tha ca mt s nguyn X c phi l s nguyn Y hay khng). Tuy nhin mc ch ca chng ta ch cung cp cc d kin h thng c th tr li cu hi thun (v c th tr li thm cu hi nghi vn) m thi. Tm tt: . Lp trnh trn Prolog l cung cp cho h thng cc khi nim v din gii cc khi nim . . Cc khi nim c cung cp qua cc v t. . Cc v t c th xem nh cc hm nh ch tr v gi tr ng hoc sai. . Vic h thng c th tr li c nhng cu hi no lin quan n khi nim cung cp ph thuc vo vic chng ta din gii cc khi nim trn cho h thng
Chng II.
Sau khi cung cp cho h thng cc khi nim cn thit, chng ta cn phi gii thch cc khi nim mnh cung cp, Prolog s dng cc li gii thch ny thc hin vic suy lun v tr li cu hi ca chng ta. Cc li gii thch ny c gi l cc mnh (clauses). C hai dng mnh : s kin (fact), v lut ( rule) Cc s kin l nhng iu m chng ta cng nhn l ng. Lut l nhng quy tc m chng ta xc nh iu kin ng cho chng. VD3: hy vit phn clause cho v t nguoi nh ngha trong VD1 D kin ban u ch cung cp cho chng ta mt vn lin quan n ngi: Socrates l ngi. Theo nh cch t duy trong khng gian ca bi ton, ch c mt con ngi duy nht: Socrates. Khng ai khc l ngi. Nh vy chng ta s vit phn clause cho v t ny nh sau: nguoi(socrates). Chng ta va vit mt s kin: socrates l ngi l iu chc chn ng. Bt k symbol no c tn l socrates l ngi l chc chn ng, khng cn phi c mt iu kin rng buc no km theo. Lu : i/ C hai cch vit dng hng (literal) cho symbol trn Prolog: Mt danh hiu m u bng k t thng (socrates, sOCRATES) Mt chui k hiu t trong cp k hiu (socrates,SOCRATES, sOCRATES, Socrates) ii/ Mt mnh lun kt thc bng k t '.' VD4: hy vit phn clause cho v t chet trong VD1. D kin ban u ch cung cp cho chng ta mt s kin lin quan n vn ny: symbol s phi cht nu (v ch nu) l ngi. iu ny s xc nh mt quy tc: symbol s ch phi cht, tc v t s tr v kt qu true, nu symbol l ngi. Vn symbol no l ngi v symbol no khng l ngi chng ta a ra khi nim v gii thch cho Prolog trong cc v d 1 v 3. Nh vy phn mnh s c vit nh sau; chet(X):-nguoi(X). Mnh dng rule s bao gm hai phn, nm hai bn cp k hiu ":-". Phn bn tri cho bit v t ang c cp v cc thng s tng ng. Phn bn phi, xc nh iu kin tr li ng cho lut trn, bao gm cc li gi cc v t khc, c ngn cch bi k hiu ',', gi
5
l cc mnh con (sub-clause). Trong v d trn, ch c mt sub-clause. Mt lut ch tr li ng nu tt c cc sub-clause bn v phi u tr li ng. Trong v d trn, chng ta c mt bin X. Tt c cc thng s m u bng k t hoa u c Prolog hiu l bin. Bin ny l thng s ca v t chet. Do khai bo phn v t, X s c hiu l mt bin thuc kiu symbol. Kt qu s tr v ng nu tt c sub-clause bn v phi u tr li l ng. Trong trng hp ny, ch c mt sub-clause xc nh xem X c phi l ngi khng. Nh vy chng ta biu din c khi nim mt symbol s phi cht nu symbol l ngi, tc l tt c nhng d kin ban u c cung cp. VD5: Hy vit phn clause cho v t giaithua VD2. T cc d kin c cung cp (do chng ta t cung cp cho mnh gii bi ton), chng ta thy c mt s kin chc chn ng: giai tha ca 0 l 1, v c mt lut suy din: giai tha ca n l (n-1)!*n. Chng ta s vit phn mnh cho v t ny nh sau: giaithua(0,1). giaithua(X,Y) -: X1 is X -1, giaithua(X1,Y1), Y is Y1*X. Trc khi hiu nhng iu c m t trong cc v d trn, chng ta s c mt s nhn xt nh sau: i./Trc tin, chng ta thy v t giaithua c biu din bng hai mnh : mt s kin v mt lut. Khi vit nhiu mnh cho mt v t, cc mnh phi c vit lin tip nhau (khng c xen mnh ca v t khc vo). ii./ Chng ta s hiu hai mnh con u tin X1 is X -1, giaithua(X1,Y1) biu din cho cng vic tnh giai tha ca X-1. Tuy nhin chng ta khng c vit giaithua(X-1, Y1). Thng s ca cc mnh con phi l bin, khng c php l biu thc. iii./ Chng ta thy s xut hin ca php quan h 'is' v s hiu nh mnh con X1 is X1 l php gn. Thc t, vi php quan h 'is' c dng exp1 is exp2, nu exp1 l mt bin th php ton ny s rng buc bin ny vi kt qu ca biu thc exp2. Nu exp1 khng phi l mt bin m l mt biu thc bnh thng th php quan h ny tng ng vi php so snh 2 biu thc s hc exp1 =:= exp2. iv./ Phn v t trn biu din cho vic s dng k thut lp trnh quy, s l sc mnh lp trnh ch yu ca Prolog. Xem thm v phn lp trnh quy trn Prolog trong cc phn sau. Tm tt . Cc khi nim c m t qua cc v t s c gii thch bng cc mnh . . C hai loi mnh : s kin v lut. . Thng s c truyn trong li gi cc mnh con phi l bin. . Cc k thut ch yu lp trnh trn Prolog l hp nht v quy.
6
Chng III.
Trc khi thc thi cc chng trnh vit bng ngn ng Prolog trn, chng ta cn phi chn mt mi trng lp trnh c th. Trong mn hc ny, chng ta s s dng phn mm lp trnh B-Prolog (http://www.cad.mse.kyutech.ac.jp/people/zhou/bprolog.html) ca Neng-Fa Zhou lm cng c lp trnh cho ngn ng Prolog. Phn ny u tin s gii thiu s lc v B-Prolog: cch ci t, mt phin lm vic trn n, cc kiu d liu v mt s v t c sn. Phn tip theo s trnh by cch s dng B-Prolog vit cc chng trnh v d n gin.
III.1 Gii thiu s nt v B-Prolog B-Prolog ngoi vic h tr vit cc chng trnh bng ngn ng Prolog chun cn cung cp mt mi trng cho php ngi s dng c th np (consult, load), dch (compile), debug v thc thi chng trnh. c bit l mi trng ny cho php s dng li cc lnh gi trc thng qua phm mi tn ln v xung. Ngoi ra, B-Prolog cn c th lin kt vi ngn ng C, C++, Java; h tr lp trnh ha cng nh cho php lp trnh rng buc (Constraint Logic Programming) trn n. Trong B-Prolog, chng ta khng cn phi khai bo tng minh cc v t nh Turbo Prolog m chng ta ch cn vit cc mnh gii thch v vn quan tm. III.2 Ci t v lm vic vi B-Prolog Ti chng trnh B-Prolog t a ch v gii nn n vo mt th mc bt k. Th mc mc nh gii nn ca B-Prolog l C:\Bprolog. Nu chng ta gii nn ngay trong th mc mc nh ny th chng ta ch cn chy file C:\Bprolog\bp.bat vo mi trng lm vic ca B-Prolog. Nu chng ta gii nn vo mt th mc khc th chng ta phi sa li ng dn (mc BPDIR) trong file bp.bat ny n ni m chng ta gii nn. Ngoi ra, nu chng ta mun s dng cc gi trong ha th chng ta phi chy file bpp.bat. Sau khi hon tt giai on ci t, mn hnh khi chy file bp.bat s nh sau:
Khi vo c mi trng B-Prolog, chng ta s thy mt du nhc | ?-. y s l ni m chng ta nhp cc lnh vo. Nu mun bit cc lnh m h thng B-Prolog ny h tr chng ta g lnh help du nhc ny. thot khi B-Prolog chng ta s dng lnh halt hoc nhn t hp phm Ctrl-D. Cc chng trnh Prolog ca chng ta thng c vit di dng mt file vn bn bng mt chng trnh son tho bt k (EditPlus, Notepad...). Phn m rng mc nh ca cc file chng trnh i vi B-Prolog l .pl. dch mt chng trnh Prolog trong mi trng B-Prolog th chng ta dng lnh compile(file-name) vi file-name l tn chng trnh cn dch. Nu tn file ny c phn m rng l .pl th c th khng cn g vo phn m rng . File c dch s c cng tn filename vi file dch nhng c phn m rng l .out. thc thi mt file trong B-Prolog chng ta phi np cc file c dch ny vo b nh bng lnh load(file-name). Mt cch kt hp c giai on dch v np ny l s dng lnh consult(file-name) hoc n gin l g [filename] du nhc lnh. Sau khi np chng trnh, chng ta c th thc thi chng trnh thng qua cc cu hi (query). Vi mi cu hi h thng s thc thi chng trnh v tr kt qu v l yes nu thnh cng v no nu vic thc thi chng trnh tht bi. Nu trong cu hi c cha bin v vic thc thi thnh cng th chng trnh s thng bo cho chng ta gi tr rng buc vi cc bin . Chng ta c th yu cu h thng tm thm li gii khc bng cch g du ; v enter sau li gii bit. III.3 G ri chng trnh (debugging)
g ri cho mt chng trnh Prolog cng nh hiu r hn c ch hot ng ca Prolog, chng ta s s dng lnh trace. Khi g lnh trace du nhc, h thng s chuyn sang ch g ri. Khi ang ch g ri, tt c cc lnh, cu hi nhp vo cho h thng s c thc hin theo tng bc. thot khi ch g ri, chng ta s dng lnh notrace.
III.4 Cc thut ng c bn trong B-Prolog Ton hng (term) trong B-Prolog l cc hng, bin hoc cc ton hng t hp (compound term). C 2 loi hng: atom v s. Atom l chui cc k t, s hoc du gch di c k t bt u dng ch thng. Bt k chui no nm gia cp du nhy n u l atom. y chnh l kiu litteral m phn trc chng ta cp n. Mt du nhy n cng c dng biu din k t escape. V d: chui ab cha 3 k t l a, v b. S c th l s nguyn hoc s thc du chm ng. S nguyn thp phn c th l s c du hoc khng du v c tm tr t -227 + 1 n 227 -1. C th biu din 1 s nguyn dng c s khc 10 theo dng tng qut sau: <base><digits> vi base l c s v digits l dy s biu din ca s nguyn . V d: 2100 l biu din nh phn ca s 4. S thc du chm ng bao gm mt s nguyn biu din phn nguyn, mt du chm phn cch gia phn thp phn v phn nguyn v mt s nguyn khc biu din phn thp phn. Hin nay, B-Prolog khng h tr dng s m. Bin, nh cp phn trn, ging nh atom nhng bt u bng mt ch hoa. Ton hng t hp c dng f(t1, t2,..., tn), trong n c gi l arity, f c gi l functor v t1, t2,..., tn l cc ton hng c gi l component. Danh sch, c cp trong cc phn sau, l mt cu trc t bit c functor l du chm .. Danh sch [H|T] tng ng vi cu trc .[H,T]. Atom c bit [] biu din danh sch rng.
Term
Variable
Compound Term
Hashtable III.5 Cc kiu d liu v cc v t xy dng sn (built-in) c bn trong BProlog Cc kiu d liu, i vi B-Prolog c nh ngha l mt tp cc gi tr v cc v t trn cc gi tr . Cc v t ny khng th c nh ngha li. Cc v t kim tra kiu: atom(X): tr v ng nu ton hng X l mt atom atomic(X): tr v ng nu X l mt atom hoc mt number real(X), float(X): kim tra xem X c l mt s thc du chm ng hay khng var(X): kim tra X c l mt bin hay khng compound(X): X l mt ton hng t hp. V t ny tr v ng nu X l mt cu trc hay l mt danh sch X = Y: hp nht gia X v Y X \= Y : 2 ton hng X v Y khng th hp nht Term1 == Term2: hai ton hng Term1 v Term2 l ng nht (strictly identical) Term1 \== Term2: hai ton hng Term1 v Term2 khng ng nht Exp1 is Exp2: trnh by phn trc X =:= Y: hai biu thc s X v Y bng nhau (numerically) X =\= Y: hai biu thc s X v Y khc nhau X<Y, X=<Y, X>Y,X>=Y : l cc php ton so snh gia cc biu thc s khc X + Y, X Y, X * Y, X / Y : cc php ton cng tr nhn chia n gin X // Y : php chia nguyn
10
Cc v t trn s:
11
Chng IV.
n y chng ta c th s dng B-Prolog vit v thc thi cc chng trnh n gin vit bng ngn ng Prolog.. VD6: Vit chng trnh hon chnh cho VD1. S dng mt cng c son tho vn bn n gin (khng c nh dng) bt k, nhp vo ni dung chng trnh hon chnh cho VD1 nh sau: nguoi(Socrates). chet(X):-nguoi(X). Gi s chng ta t tn cho chng trnh ny l vd1.txt v t trong th mc C:\BaitapBP th thc thi chng trnh, chng ta s g [C:\BaitapBP\vd1.txt] ti du nhc ca mi trng B-Prolog (xem hnh di).
Sau khi np chng trnh vo h thng B-Prolog, thc thi chng trnh, ngi s dng nhp yu cu (goal) ca mnh cho h thng. Cu hi chng ta t ra cho h thng ch c da vo cc tri thc m chng ta cung cp cho h thng hoc cc kin thc c sn ca h thng. Chng ta cung cp cho h thng cc khi nim nguoi v chet, nh vy chng ta ch c th t cc cu hi lin quan n hai khi nim ny. Vi v d 1 bn trn, chng ta c th nhp cu hi nh sau: nguoi(Socrates)
12
Da trn tinh thn ca ca khi nim, cu pht biu ca chng ta c ngha l "Socrates l ngi", h thng s hiu rng chng ta mun t mt cu hi nghi vn "Socrates l ngi phi khng?" Sau khi n Enter, chng ta s thy h thng c ngay cu tr li: yes. Thay bng mt tn khc, v d: nguoi(Xeda) H thng s tr li no. Chng ta thy cc cu tr li ca h thng da trn kin thc m chng ta cung cp. Da vo nhng g m chng ta cung cp, h thng ch bit c mt ngi l Socrates, tt c nhng symbol khc u khng phi l ngi. Tuy nhin, vi c ch suy lun m chng ta cung cp, h thng c th suy lun ra nhng iu cha c cung cp sn. y chnh l im to nn sc mnh lp trnh ca Prolog. Nhp vo cu hi nh sau: chet(Socrates) Cu tr li l: Yes. Vi mt tn ngi khc: chet(Xeda) Cu tr li l: No. H thng t ng suy lun theo nguyn l m chng ta mun n phi "hc": ai l ngi th ngi phi cht. Ngoi nhng cu hi dng Yes/No, Prolog c th tr li cc cu hi yu cu tm p s. Chng ta nhp vo mt cu hi nh sau: chet(X) n y, trong cu hi ca chng ta c mt bin: X (nhc li: mi danh hiu m u l k t hoa u l bin). Khi trong cu hi ca chng ta cha mt (hoc nhiu) bin, h thng s tm cc gi tr c th c ca bin cho cu pht biu ca ta l ng. Hiu mc nim, cu hi ca chng ta l: ai l ngi? Kt qu tr li ca cu hi (ai) s c cha trong bin X. Cu tr li s l: X = Socrates Tng t nh trn, h thng s da vo c ch suy lun c cung cp tm ra li gii vi nhng cu hi dnh cho cc v t c cc mnh tng ng l cc lut. Nhp vo cu hi nh sau: chet(X) H thng s tr li nh sau: X = Socrates.
13
VD7: Hon chnh v thc thi chng trnh cho VD2 Chng trnh hon chnh cho v d 2 nh sau: giaithua(0,1):-!. giaithua(X,Y):- X1 is X -1, giaithua(X1,Y1), Y is X*Y1. Chng ta lu l khi kt thc mi mnh u c k hiu '.' v trong mnh u tin c mt k hiu t bit !. y chnh l v t nht ct v s c trnh by phn sau. Sau khi np chng trnh vo h thng, chng ta c th t cho h thng cu hi dng nghi vn nh sau: giaithua(3,6) Hiu theo ngn ng t nhin s l: c phi giai tha ca 3 l 6 hay khng? Cu tr li l: Yes Hoc chng ta c th t cu hi: giaithua(3,8) Cu tr li s l: No. Chng ta s t cu hi theo dng tm li gii: giaithua(3,X) Cu tr li s l X = 6 Chng ta cng c th t cu hi ngc: giaithua(X,6) tng ca cu hi s l: giai tha ca s no s bng 6. Tuy nhin chng ta khng cung cp cho h thng c ch suy lun tr li cu hi ny nn h thng s bo li. Tt nhin chng ta cng c th t cu hi nh sau: giaithua(X,Y) C hai thng s u l bin. Nh vy cu hi c th hiu l: s no (X) giai tha th thnh mt s khc (Y). Cu hi gn nh v ngha v nhng cu tr li ca h thng cng s chng mang mt ngha thc s c ngha no. Tm tt: . Chng trnh Prolog s hot ng theo c ch tng tc. Ngi s dng s cung cp yu cu v h thng s tr li cc yu cu ny. . Nu cu hi khng cha bin th h thng s kim tra pht biu ca chng ta l ng hoc sai, ngc li, h thng s tm cc gi tr ca cc bin lm cho pht biu ca ta l ng.
14
Chng V.
V.1 Php hp nht Cng vic quan trng nht ca Prolog trong vic tm cu tr li l thc hin vic hp nht. tin cho vic theo di, php hp nht c y s c biu din bi du =. N c hai thnh phn, tm gi l v tri v phi. Php hp nht s tr v kt qu true (thnh cng) hoc false (tht bi). C cc trng hp hp nht sau: a) C hai v u l hng hoc biu thc cha ton hng. Nu gi tr ca hai v l bng nhau th php hp nht thnh cng (p s l true), ngc li php hp nht s tht bi (kt qu l false) 7=7 7=8 true false true false
false true
Mt trong hai v l hng hoc trong biu thc cha ton hng, v kia l bin hoc biu thc c cha bin. Trng hp 1: Nu tt c cc bin u c gi tr (gi l cc bin tnh trng bound), chng ta quay v trng hp a 7=X 7 = X +1 false nu X c gi tr l 6 true nu X c gi tr l 6 true ny Y c gi tr l Socrates
Y = Socrates
Trng hp 2: Nu c bin cha c gi tr (gi l bin tnh trng unbound), Prolog s gn gi tr cho bin sao cho hai v c gi tr nh nhau v tr v kt qu l true. Nu khng tm gi tr nh vy, php hp nht s cho kt qu l false. 7=X true nu X cha c gi tr, sau php hp nht ny, X s c gi tr l 7 false v khng th tm cho X gi tr no lm cho gi tr hai v l -1 = X*X nh nhau.
b) C hai v u l bin hoc cc biu thc c cha bin . Trng hp 1: tt c cc bin u c cha gi tr, chng ta s quay v trng hp a
15
X=Y X -1 = Y
. Trng hp 2: tt c cc bin ca mt v u c gi tr, chng ta s quay v v trng hp b X=Y true nu X cha c gi tr v Y c gi tr, sau php hp nht, X s nhn gi tr ca Y X-1=Y true nu X cha c gi tr, Y c gi tr. Sau php hp nht, X s c gi tr bng Y +1 . Trng hp 3: c hai v u cn cha bin tnh trng unbound hp nht vn thnh cng v mi khi mt bin no trong v phi hoc v tri c gi tr th bin cn li cng s c rng buc vi gi tr X=Y X-1 = Y true nu c X v Y u cha gn gi tr true nu c X v Y u cha gn gi tr
V.2 C ch tm cu tr li ca Prolog Nu chng ta t ra cho Prolog mt cu hi, Prolog s thc hin cng vic so trng (match), tc l tm mnh u tin cp n khi nim m chng ta mun hi. Ni mt cch chi tit hn, Prolog s dng php hp nht trnh by phn trn trong qu trnh so trng cu trc d liu mt subgoal vi mt mnh . Tr li VD6, sau khi hon tt chng trnh, chng ta t ra cu hi nh sau: nguoi(Socrates) Prolog s tm mnh u tin c lin quan n khi nim nguoi. Hin nhin, mnh u tin (v duy nht) c lin quan n khi nim ny l: nguoi(Socrates) Nh vy, khi c cu hi (nguoi(Socrates)) v tm thy mnh lin quan (nguoi(Socrates)), Prolog s tin hnh tm kim li gii, cng vic ny tin hnh bng cch to mi lin kt gia cc thng s phn cu hi v cc thng s phn mnh . Sau khi to mi quan h gia cc thng s phn cu hi v phn mnh , Prolog s tin hnh cc sub-clause (nu mnh ny mt lut). Nu tt c cc sub-clause thnh cng v cc bin phn cu hi tnh trng bound (tc l c gi tr), Prolog s thng bo li gii. Nu l cu hi thuc dng Yes/No nh v d trn, tc l cu hi khng cha bin, Prolog s tr li Yes nu cng vic hp nht thnh cng v cc sub-clause u thnh cng (nu mnh so trng l mt lut). Quay tr li vi v d ca chng ta, y thng s ca cu hi l mt hng (Socrates), v thng s ca mnh tng ng cng l mt hng (Socrates), hai hng ny hp nht thnh cng, v kt qu tr li l Yes.
16
Nu chng ta t ra cu hi khc: nguoi(Xeda) Prolog cng ch tm thy mt mnh lin quan n khai nim ny (nguoi(Socrates)), v v s hp nht gia hai hng Socrates v Xeda tht bi, p s s tr li l No. Chng ta xt trng hp cu hi ca chng ta c cha bin: nguoi(X) H thng s tm thy mnh c lin quan n vn ny (nguoi(Socrates)) , v tin hnh hp nht gia X v Socrates, v v X cha c gi tr (unbound) nn php hp nht thnh cng, X c gi tr l Socrates. V vic hp nht gia cc thng s gia phn cu hi v phn clause thnh cng, y l mt s kin nn khng cn phi thc hin phn sub-clause, v sau khi hp nht, tt c cc bin cn tm c gi tr ( y ch c mt bin l X), nn h thng s cng b tm ra li gii v in ra gi tr ca X ( X = Socrates) Chng ta xt trng hp khi cu hi so trng vi mt lut: chet(Y) Chng ta hon ton c th t cu hi l chet(X), nhng chng ta s t tn bin khc tin phn bit gia bin trong cu hi v thng s cc b mnh . Thc ra, B-Prolog s t to ra v qun l cc bin ca n trong qu trnh i tm li gii cho mt goal no . Chng ta c th thy r iu ny qua qu trnh debug (dng lnh trace) chng trnh. Cc bin ny c bt u bng du gch di v mt dy 6 s hoc k t tip theo. hiu r c ch tm cu tr li ca B-Prolog chng ta c th chuyn sang ch debug khi t cu hi. Cu hi c so trng vi mnh sau: chet(X): - nguoi (X). V hai bin X (thng s ca mnh ) v Y (thng s ca cu hi) u cha cha gi tr, h thng s xem c hai bin l mt, tc l, khi X c c gi tr th Y cng c gi tr v ngc li. Do y l mt lut, nn h thng s tin hnh thc hin cc sub-clause. H thng s thc hin sub-clause u tin nguoi(X). Qu trnh thc hin cc sub-clause v phi s c thc hin nh sau: Nu sub-clause ny c thng s l bin unbound, Prolog s tm gi tr ca bin ny sub-clause c gi tr Yes, nu khng tm c gi tr nh vy, subclause s tht bi. Nu sub-clause c thng s u l bin bound ( c gi tr) hoc l hng, Prolog s kim tra xem sub-clause c tr v gi tr Yes hay khng, nu khng, sub-clause s tht bi.
Cc sub-clause s c tin hnh t tri qua phi, v nu c mt sub-clause tht bi, mnh c so trng s tht bi.
17
Trong trng hp trn, khi tin hnh sub-clause nguoi(X), do bin X l unbound, nn chng ta ri vo trng hp a, h thng s tm gi tr ca X cho sub-clause trn l ng. Cch tm kim cu tr li cho sub-clause ny han tan ging nh cch h thng tm cu tr li khi chng ta t cu hi ny trong phn cu hi, v nh vy X s c gi tr l Socrates sau khi sub-clause ny thc hin xong. Do X v Y c xem nh mt, nn khi X c gi tr l Socrates th Y cng c gi tr ny. Do tt c cc sub-clause thc hin xong, v Y c gi tr, nn Prolog cng b l tm ra li gii v in ra gi tr ca Y. Tm tt: . Php hp nht l nn tng ca mi hot ng ca Prolog tm ra li gii . tr li cu hi, Prolog so trng cu hi vi mnh v to mi lin quan gia cc thng s. . Prolog tm ra li gii khi thc hin thnh cng mt mnh v tt c cc bin nu c trong cc thng s ca cu hi u c gi tr
18
Chng VI.
VI.1 S quay lui (back-tracing) trn Prolog Hp nht l hn nn tng cho c ch suy lun ca Prolog. Tuy nhin, tm ra li gii ng, Prolog cn phi s dng c ch quay lui, khi gi tr u tin c gn cho thng s khng phi l li gii. Chng ta xt v d sau: VD9: nguoi(Socrates). nguoi(Xeda). vua(Xeda). sungsuong(X) :- nguoi(X), vua(X). Nh vy trong v d ny, ngoi khi nim v ngi, chng ta a ra khi nim v vua v s sung sng. Din gii nhng thng tin trong cc d kin trn thnh ngn ng t nhin, chng ta c c cc iu sau: "Th gii m chng ta sng c hai ngi l Socrates v Xeda. Chng ta c mt vua la Xeda, v mt thc th no ch sung sng nu thc th va ngi va l vua." Lu rng trong v d trn, cc mnh lin quan n cng mt v t phi vit lin tip nhau. Xt khi h thng tr li cu hi sau: sungsuong(X) Trc tin h thng s so trng cu hi trn vi mnh sungsuong(X) :nguoi(X),vua(X). Lu rng vo lc ny chng ta c hai bin X: mt bin X l thng s ca cu hi v mt bin X l thng s ca mnh . V nguyn tc, hai bin X ny han tan khc nhau. Tuy nhin, khi so trng cu hi vi mnh , do c hai bin X lc ny u cha cha gi tr, nn chng s c xem nh mt. Nhng cn ch rng bin X s dng trong cc subclause l bin X thng s ca mnh . Sau Prolog s tin hnh cc sub-clause. sub-clause u tin, nguoi(X), tng t nh VD6, Prolog s tm c cu tr li l X = Socrates. Khi thc hin sub-clause th hai, vua(X), do X c gi tr (Socrates), Prolog s kim tra xem gi tr ny c lm gi tr ca mnh l true hay khng. Nh cc v d trn, vic tin hnh tr li mt sub-clause cng tng t nh khi tr li mt cu hi, Prolog li so trng sub-clause vi mt mnh cng tn. Prolog tm thy mt mnh
19
lin quan n vua l vua(Xeda) v tin hnh hp nht gia X v Xeda. Do X c gi tr l Socrates, vic hp nht tht bi. Tuy nhin khi sub-clause ny tht bi, khng c ngha rng Prolog s vi kt lun rng mnh ny tht bi. y cng vic tm kim cu tr li tht bi sau khi bin X c gn gi tr v chuyn t trng thi bound sang unbound. H thng s quay li thi im bin X c gn gi tr (khi tr li sub-clause nguoi(X)), X c chuyn li sang tnh trng unbound, v c gng tm kim mt gi tr khc ca X cho mnh con ny vn ng. Cng vic ny c gi l back-tracing. Do vic so trng sub-clause ny vi mnh nguoi(Socrates) tht bi, h thng s so trng vi mnh khc. Nu khng cn mnh no khc lin quan n sub-clause, vic thc hin mnh mi tht s tht bi, tuy nhin y h thng tm thy mt mnh khc lin quan n khi nim ny l nguoi(Xeda). Vic hp nht gia X v Xeda li c thc hin, X s c gi tr l Xeda v sau , khi li tip tc thc hin sub-clause vua(X) th chng ta s d dng thy rng sub-clause ln ny c thc hin thnh cng. Prolog tm ra li gii, tuy nhin, trng hp ny, ngoi s hp nht, Prolog cn s dng thm mt "v kh" mi, l s quay lui. VI.2 Khng ch s lng li gii khng ch s lng li gii theo mnh, chng ta s dng hai v t c bit l nht ct (cut) v findall, nh cc v d sau: VD10: P(X) :-Q(X). P(3). Q(1). Q(2). Vi v d ny, khi chng ta t cu hi P(X) cho h thng th chng ta s c c tng cng 3 kt qu. Ngc li nu chng ta thm mt v t nht ct (!) sau v t Q(X) mnh u tin ca v d trn (P(X) :- Q(X), !.) th chng ta s ch c mt kt qu cho d chng ta c dng du ; yu cu B-Prolog cung cp thm li gii khc. V t nht ct c vit l !, c vit thn ca mt mnh s loi b tt c cc kh nng la chn c th ca cc v t ng trc (bn tri) n trong mnh . VD11: s dng v t findall tm tt c cc li gii ?-findall(X, member(X,[(1,a),(2,b),(3,c)]), Xs) Xs = [(1,a),(2,b),(3,c)] Trong v d trn, v t member l mt v t c xy dng sn (built-in) trong B-Prolog. V t ny c hai i s, dng kim tra xem i s th nht c phi l phn t ca i s th hai hay khng.
20
V t findall(Term,Goal,List) l mt v t c bit. V t ny thc hin thnh cng nu List cha cc gi tr ca Term m cc gi tr ny lm cho Goal thnh cng. Cc v t tng t vi v t ny c th k n l v t bagof v v t setof.
21
giaithua(X1,Y1) cho gi tr l ng. V cng nh cc v d trn, cch thc Prolog tr li mt sub-clause cng tng t nh khi tr li cu hi t goal, tc l li so trng cu hi vi cc mnh bit So trng vi giaithua(0,1), Prolog tin hnh hp nht X1 vi 0, Y1 vi 1, do X1 c gi tr l 1, vic hp nht vi 0 tht bi, Prolog phi so trng vi mnh khc. So trng vi giaithua(X,Y), Prolog tin hnh hp nht X1 vi X ng nht Y1 vi Y. Chng ta k hiu X v Y ln gi quy ny l X2 v Y2, v s dng cch k hiu tng t nh vy cho cc bin cn li ln gi quy ny cng nh cc ln gi quy tip theo. Nh vy X2 s c gi tr l 1 v Y1 s c gi tr m Y2 s c. Tng t ln gi th nht, cc sub-clause ca mnh trn ln gi th hai ny s ln lt c gi: X12 is X2 - 1, hp nht X12 vi X2 -1, ta c X12 c gi tr l 0. giaithua(X12,Y12), X12 c gi tr l 0, Prolog s tm gi tr ca Y12 bng vic tip tc so trng giaithua(X12,Y12) vi cc mnh c lin quan: . So trng giaithua(X12,Y12) vi giaithua(0,1). Do X12 c gi tr l 0, Prolog tin hnh hp nht X12 vi 0 v Y12 vi 1. Thc hin tip subclause !, do cu hi giaithua(X12,Y12) cha tm c cu tr li no, nn sub-clause ny tr li l ng. Vic thc hin mnh giaithua(0,1) thnh cng, v Y12 c gi tr l 1 nn cu hi giaithua(X12,Y12) c p s. V t ! s ngn chn vic tm cc p s khc, v vy trong trng hp ny, Prolog khng tip tc so trng tip vi mnh giaithua(X,Y). Y2 = X2 * Y12, lc ny Y2 cha c gi tr, X2 v Y12 c gi tr l 1 v 1 nn Prolog s hp nht Y2 v 1. Kt qu s l Y2 c gi tr l 1.
Nh vy n y cc sub-clause ca mnh giaithua(X2,Y2) thc thi thnh cng, v Y2 c gi tr l 1, v v Y1 c ng nht vi Y2, nn Y1 cng s c gi tr la 1 . Y = X* Y1, lc ny Y cha c gi tr, X v Y1 ln lt c gi tr l 2 v 1, nn Prolog hp nht Y v 2*1, kt qu Y s c gi tr l 2. Nh vy n y cc sub-clause ca mnh giaithua(X,Y) thc thi thnh cng, v Y c gi tr l 2, v v XG c ng nht vi Y, nn XG cng s c gi tr l 2, v li gii ca bi ton c tm thy. Tm tt: . quy l sc mnh lp trnh ch yu trn Prolog . Mi ln gi quy, cc thng s v bin cc b trong mi mnh s c to mi tng ng vi ln gi quy d. . C th dng nht ct ngn chn cc ln gi quy tha khi tm ra p s
23
VIII.1 Cu trc ca danh sch Mt danh sch trn Prolog bao gm hai phn: phn u (head) l phn t u tin ca danh sch v phn ui (tail) l danh sch cc phn t cn li ca danh sch. Mt danh sch c th m t theo hai cch: i. Lit k cc phn t ca danh sch, v d: [1,2,3,4,5] ii. M t phn u v phn ui ca danh sch, ngn cch bi du |, v d [1|[2,3,4,5]] VD15: M t mt danh sch bao gm 5 s nguyn l 1,2,3,4,5 Danh sch trn c th m t theo cc cch sau: [1,2,3,4,5] [1|[2,3,4,5]] [1|[2|[3,4,5]]] [1|[2|[3|[4,5]]]] [1|[2|[3|[4|[5]]]]] [1|[2|[3|[4|[5|[]]]]]] Lu : danh sch rng c th c m t nh sau: [] VD16: Vit chng trnh in ra phn u v phn ui ca mt danh sch. Chng trnh ny thc cht ch gip chng ta nhn r hn khi nim v danh sch. Chng trnh c vit nh sau: indanhsach(L,H,T):- L = [H|T]. Xt khi chng ta nhp goal vo nh sau: indanhsach([1,2,3,4,5],X,Y) Prolog s so trng goal vi mnh indanhsach(L,H,T), L c hp nht vi [1,2,3,4,5], X c ng nht vi H, Y c ng nht vi T. Khi thc hin sub-clause L = [H|T], L c hp nht vi [H|T], nh vy phn u ca L s hp nht vi H, phn ui s hp nht vi T. Do L c gi tr l [1,2,3,4,5], phn u ca L s c gi tr l 1, phn ui s c gi tr l [2,3,4,5], vy sau khi hp nht, H s c gi tr l 1 v L s c gi tr l [2,3,4,5]. Cng tc l X s c gi tr l 1 v Y c gi tr l [2,3,4,5]. Prolog tm thy li gii v s in ra li gii ny.
24
Lu : Chng trnh trn s chy sai nu danh sch nhp vo l rng ([]) do li gii ca chng ta cha x l trng hp ny Phn mnh cho v t indanhsach c th vit li l indanhsach([H|T],H,T). Tm tt . Danh sch l kiu d liu cu trc c bit do ngi dng nh ngha trn Prolog . Mt danh sch bao gm hai phn: phn u l phn t u, phn ui l danh sch cc phn t cn li ca danh sch. . Trong trng hp danh sch rng, phn u ca danh sch s khng c.
25
Chng IX.
Khi x l danh sch trn Prolog, ngi lp trnh phi t b phong cch dng vng lp x l dy m phi tn dng k thut quy tm ra li gii. Chng ta xt mt s v d sau y: VD17: Vit v t m xem mt danh sch c bao nhiu phn t. u tin chng ta phi nh ngha c cng vic m chng ta nh lm. Chng ta s vit mt v t nh sau: dem(list,integer) Chng ta m trong mt danh sch c bao nhiu phn t. V d khi gi goal dem([1,2,3,4],X), p s s l X = 4 Tip theo chng ta phi xc nh mt thut gii ph hp vi tinh thn ca Prolog. Khng th dng vng lp, chng ta phi xy dng mt gii thut quy. Mt gii thut quy s bao gm hai phn: iu kin dng v li gi quy. iu kin dng cho bi ton ny rt d dng: khi danh sch khng c phn t no, th hin nhin s phn t ca n l 0. Vy iu kin dng s c vit nh sau: dem([],0):-!. Khi trng hp danh sch khng c phn t no, p s 0 l duy nht, vy chng ta c th dng nht ct yu cu Prolog khng tm thm li gii no khc. Phn quy hi kh i vi nhng ai cha quen vi danh sch trn Prolog. Prolog ch cung cp cho chng ta c ch chia danh sch thnh hai phn: phn t u v phn ui danh sch cc phn t cn li. Nh vy li gii gn nh t n hin ra: chng ta s gi quy m phn ui c bao nhiu phn t ri cng n vi 1 (phn t u) s ra s phn t trong mt danh sch. Phn ny s c vit nh sau: dem([H|T],X):- dem(T,X1), X is X1+1. T tng quy c th hin rt r rng: m phn ui T ca danh sch c c tng X1, hp nht X vi X1+1 s cho p s cn tm. Tuy nhin chng ta thy y bin H han tan khng cn dng trong v phi ca mnh . Prolog khng coi y l li, nhng s "phn nn" v vic ny. Xt v hiu qu lp trnh, han tan khng cn khai bo tn bin mi cho thnh phn H trong trng hp ny. C mt nguyn tc nhn ra nhng bin "v dng" nh vy: l nhng bin ch xut hin 1 ln trong sut mnh . i vi trng hp ny, ta nn dng k hiu '_' thay cho tn bin biu din bin ny khng cn dng trong thut gii.
26
Vy phn quy s c "tinh ch" nh sau: dem([_|T],X):- dem(T,X1), X is X1+1. Nh vy ton b chng trnh hon chnh s nh sau: dem([],0):-!. dem([_|T],X):- dem(T,X1), X is X1+1. VD18: Vit v t tnh tng cc phn t trong mt danh sch tong([],0):-!. tong([H|T],X):- tong(T,X1), X is X1+H. T duy quy y l: chng ta tnh tng phn ui ca danh sch, ri cng n vi phn t u tnh tng danh sch. VD19: Vit v t kim tra mt s nguyn c nm trong danh sch hay khng (thc ra y chnh l v t member c sn ca B-Prolog). Xc nh vn : chng ta s vit v t ptu(integer,list), khi gi ptu(2,[1,3,5]) kt qu s l No, ngc li khi gi ptu(3,[1,3,5]), kt qu s l Yes. y chng ta phi xc nh c cc trng hp mt phn t nm trong mt danh sch. V chng ta phi trnh by c cc khi nim ny mt cch quy. Sau y l tng ca thut gii: c hai trng hp mt s nguyn l phn t ca mt danh sch: s nguyn ny l phn t u ca danh sch hoc n l phn t ca phn ui danh sch. Sau khi xc nh c tng, chng ta c bi gii nh sau: ptu(H,[H|_]):-!. ptu(H,[_|T]):- ptu(H,T). Lu : i./Chng ta thay th cc bin ch xut hin mt ln trong mt mnh bng k hiu '_' nh ni ii./ mnh u c k hiu nht ct, nn nu mnh ny ng, bi ton c li gii v khng so trng n mnh th hai. Nh vy mnh th hai ch c so trng khi mnh th nht thy bi, v v mnh th nht ng vi trng hp s nguyn cn tm bng vi phn t u ca danh sch, nn khi mnh th nht tht bi, tc l s nguyn cn tm khng bng vi phn t u ca danh sch, nn trong mnh th hai, chng ta khng cn quan tm n phn t u ca danh sch. VD20: Xc nh phn t th n ca danh sch Khi ta gi ptn([1,3,5,7,9],2,X) X = 3 (phn t th 2 ca danh sch). V Prolog ch cho chng ta truy xut phn t u tin ca danh sch, nn chng ta phi xy dng thut gii quy da trn c s ny: nu n bng 1 th phn t cn tm l phn t u ca danh sch, ngc li th s l phn t th n -1 ca phn ui danh sch. ptn([H|_],1,H):-!.
27
ptn([_|T],N,X):- N1 is N - 1, ptn(T,N1,X). VD 21: To ra mt danh sch bao gm ch cc phn t l ca danh sch ban u. Goal khi gi s c dng ptle([1,2,3,4,5,6],L) L = [1,3,5] iu kin dng ca bi ton rt n gin: khi danh sch l rng th danh sch c to ra cng l rng. V phn quy ca bi ton phi da trn vic truy xut t phn t u tin ca danh sch v gi quy cho phn ui. Chng ta phi xt cc trng hp khc nhau ca phn t u. ptle([],[]):-!. ptle([H|T],[H|T1]):- H mod 2 =:= 1, ptle(T,T1),!. ptle([_|T],T1):- ptle(T,T1). y chng ta lu n mnh th ba: do hai mnh trn u c nht ct, nn mnh th ba ch c so trng khi hai mnh trn u sai. Mnh th hai xt trng hp khi H l, v vy mnh th ba chc chn H khng phi l s l, v v vy khng cn phi xt n Tm tt: . quy l cng c ch yu x l danh sch trn Prolog . Vic gi quy trn danh sch thng da trn c s chia danh sch thnh phn u v phn ui. . S dng v t nht ct hp l s khin cc mnh tr nn gn nh v logic hn.
28
Chng X.
Danh sch hai chiu l mt trng hp c bit ca danh sch. Phn t ca danh sch lc ny cng l mt danh sch. Vic lp trnh vi danh sch hai hay nhiu chiu, v c bn, han tan khng khc vi vic lp trnh danh sch mt chiu, tc cng s dng cc gii thut x l danh sch bnh thng. Tuy nhin chng ta cn ch rng phn t ca danh sch ny cng l mt danh sch. VD23: Vit chng trnh m trn mt danh sch hai chiu ca cc s nguyn L c bao nhiu phn t con c tng cc phn t l s chn. Vi bi ton ny, chng ta phi vit thm mt v t ph c c li gii tong([],0):-!. tong([H|T],X):-tong(T,X1), X is H+X1. dem([],0):-!. dem([H|T],X):-tong(H,N), N mod 2 =:= 0, dem(T,X1), X is X1 + 1,!. dem([_|T],X):- dem(T1,X). Tm tt . Danh sch nhiu chiu l mt danh sch trong cc phn t cng l danh sch . V mt t duy, lp trnh x l trn danh sch nhiu chiu khng khc nhiu vi x l danh sch mt chiu . Cc phn t ca danh sch nhiu chiu cng l danh sch, nn c th p dng cc gii thut x l danh sch x l cc phn t ny.
29
Chng I.
I.1 Lch s pht trin
Gii thiu
LISP l ngn ng lp trnh c tn ly t List Processing ngha l x l trn danh sch. Vo ma h nm 1956, Allen Newell, J.C. Shaw, v Herbert Simon pht trin Lisp (Lisp processing) v to nn ngn ng x l thng tin IPL (Information Processing Language) ngn ng tru tng thao tc trn k hiu v danh sch. Khi FORTRAN c xy dng, McCarthy thit k mt ngn ng mi LISP (Lisp Processor), ly t tng ca IPL, FORTRAN v FLPL chy trn IBM704. Vo thp nin 70, Guy Steele v Gerald Sussman nh ra Scheme, kt hp Algol v Lisp. Vo u thp nin 80, c khong 12 h Lisp khc nhau. Cc h Lisp ny khng tng thch nhau. Do , mt d n nhm nh ra mt ngn ng Lisp chung nht hnh thnh d n ny s kt hp nhng c tnh tt nht ca cc h Lisp thi vo mt th thng nht. iu dn n s ra i phin bn u tin ca Common Lisp chun nm 1984 kt hp nhiu tng ca ngn ng lp trnh nh thng dch v bin dch hm, dn rc (garbage collection), gi hm quy, theo vt v d li (tracing and debugging) v trnh son tho theo c php. I.2 c im ca gcLisp
1. Cc c im ca ngn ng T khi c John McCarthy (MIT) ngh ra nm 1958, LISP c tinh ch dn n version 1.5 v c s sng lu di v sau Lisp l ngn ng hng chc nng (functional language hay applicative), dng li k hiu tin t (prefix) v du ngoc n: f(x,y, z) c k hiu l (f x y z) Tng t x+y k hiu l (+ x y) Bt. sin 3 x + vit trong Lisp nh th no ? (sin (+ (* 3 x )(/ pi 2 ))) 2 Lisp l ngn ng thng dch (interpreted language) (xem Error! Reference source not found.) Ngn ng bin dch
cu lnh (instructions) bin dch chng trnh thc thi thc thi kt qu Kt qu vng lp top-level
V d:
31
2. Kiu d liu
Lisp thao tc trn cc loi d liu:
Danh sch l mt chui cc biu thc ngn cch nhau bi khong trng, tt c t trong du ngoc n Atoms atom::= s | chui k t | k hiu
K hiu (~ identifier): t to bi cc k t bt k, ngoi tr ( ) ` ; v khong trng Boolean: Lisp khng c kiu boolean. Trong Lisp, nil mang gi tr logic sai v tt c cc biu thc khc c gi tr ng. K hiu t dng ch tr logic ng theo mc nh.
Cc kiu d liu c xp theo cp bc nh sau:
expression list symbol atom number ...
list
nil
...
interger
real
...
Bin trong Lisp khng c kiu d liu , cng mt bin c th c nhiu kiu d liu khc nhau. V d:
* (setq a (1 2 3)) (1 2 3) * a (1 2 3) * (setq a 2) 2 * a 2
32
Chng II.
Lp trnh vi gcLisp
By gi chng ta s cng bt u vi LISP. Chng ny s gii thiu mt s hm c bn nhm thao tc trn k hiu trong LISP. u tin l cc hm v s, sau l cc hm trn danh sch. Phn ny cng s gii thiu mt s thut ng khi lm vic vi LISP, chng hn nh du nhc, ch thch, hm, i s, chng trnh, gii thut, atom, s, k hiu, danh sch, cc phn t trong danh sch, biu thc, kiu d liu, dng, nh gi.
Nhng t i sau du chm phy l ghi ch chn vo chng trnh. Tt c nhng t cn li sau du ; trong cng dng s khng c LISP x l. Chng ta khi u vi mt v d n gin minh ha kh nng ca LISP v x l s hc
* (+ 3.14 2.71) 5.85
Gi s chng ta mun lu tr mt s thng tin cn thit ca mt ngi. V d, chng ta mun ghi nh danh sch bn b, k th, ca mt ngi no . Chng ta dng SETF (vit tt ca set field).
* (setf friends (dick jane sally)) (DICK JANE SALLY) * friends (DICK JANE SALLY) * (setf enemies (troll grinch ghost)) (TROLL GRINCH GHOST) * enemies (TROLL GRINCH GHOST)
Hai danh sch trn l nhng thng tin ng v c th thay i. V d nh ghost khng cn l k th m tr thnh bn b. Khi cn cp nht li hai danh sch.
* (setf enemies (remove ghost enemies)) (TROLL GRINCH) * (setf friends (cons ghost friends)) (GHOST DICK JANE SALLY) * enemies
33
Hng dn s dng Lisp (TROLL GRINCH) * friends (GHOST DICK JANE SALLY)
By gi chng ta s xem lm th no nh ngha mt hm lm cng vic tng t. Ta nh ngha hm tn NEWFRIEND thc hin cng vic i mt ngi t k th thnh bn b.
(defun newfriend (name) (setf enemies (remove name enemies)) (setf friends (cons name friends)) )
Vi hm NEWFRIEND, vic i tnh trng ca GHOST t k th thnh bn b c th thc hin bng mt dng lnh n gin.
* (newfriend ghost)
3. nh gi
Exp l cch vit tt ca (quote Exp)
*a A *a (QUOTE A)
QUOTE khng nh gi i s
Ngc li vi quote l hm eval nh gi gi tr ca i s
* (setq l (a b c)) (A B C) * (eval (list car l)) A * (eval (list * (1+ 3) 2)) 6
II.2 Cc hm x l trn danh sch 1. FIRST v REST CAR v CDR FIRST tr v phn t u tin ca danh sch
34
Bi tp: 1. Ly phn t th ba ca danh sch (car (cdr (cdr l))) c th vit: (caddr l) CAR v CDR c th kt hp vi nhau n mc 4 V d: (caadr l) = (car (car (cdr l))) (cadar l) = (car (cdr (car l))) 2. Lm th no trch ra chui example trong danh sch: L=((this) is (an (example)) more complex)
L=((this) (cdr l) = (cdr (cdr (car (cdr (cdr (car (car (cdr (car (car is (an (example)) more complex) (is (an (example)) more complex) l)) = ((an (example)) more complex) (cdr l))) = (an (example)) (cdr (cdr l)))) = ((example)) (car (cdr (cdr l))))) = (example) (cdr (car (cdr (cdr l)))))) = example
35
BUTLAST ct n phn t cui danh sch, vi thng s u l danh sch, thng s th hai ch s phn t cn ct
* (setq l (a b c d e)) (a b c d e) * (butlast l 2) (a b c) * (butlast l 10) NIL
36
Hng dn s dng Lisp ((a b) (c d)) * (last l) (e) * (last l1) ((c d))
37
Hng dn s dng Lisp * (expt 2 3) 8 * (expt 3 2) 9 * (expt 3.3 2.2) 13.827085 * (sqrt 9) 3 * (abs -5) 5
II.4 Lp trnh hng d liu 1. ASSOC ASSOC gn vi mt danh sch association list hay cn gi a-list
Key Key
Value
Value
height v weight l kha trong danh sch c gn cho SARAH; .54 v 4.4 l cc gi tr biu th bng met v kilograms. C th ly cc thnh phn t mt danh sch dng ASSOC vi cc i s l mt kha v danh sch lin kt:
Lu ASSOC lun tr v ton b danh sch con tng ng vi kha. Trong trng hp c nhiu danh sch con cng kha, danh sch u tin s c tr v.
2. ACONS ACONS thm mt thnh phn mi vo danh sch (ACONS <key> <value> <asociation list>)
V d:
* (acons nick Bobby Andrew) ((NICK . BOBBY) (HEIGHT 0.74) (WEIGHT 6.4))
38
V d: Chng ta mun dng cng mt hm thc hin vic cng hai s v ni hai chui Gii php 1
(defun add(x y) (cond ((numberp x) (+ x y)) ((listp x) (append x y) ) ) )
Gii php 2
* (setf add ((FIXNUM +) (CONS append))) ((FIXNUM +) (CONS APPEND)) * (defun add(x y) (funcall (cadr (assoc (type-of x) add)) x y) )
39
Chng III.
Hm v Bin cc b
Trong chng trc, chng ta tm hiu v cc hm c bn cng nh mt s thut ng trn LISP. Chng ny s gip chng ta trong vic vit cc chng trnh ring cho mnh v nh ngha mt hm mi da trn cc hm c bn. Cc thut ng mi cng c thm vo nh bin, tham s, thn chng trnh.
Vng lp trong Lisp c thc hin ch yu nh vo quy V d: Tnh giai tha n!=1*2*...*n 0!=1 Trong Pascal, hm n! c vit bng vng lp:
function fac(integer:n):integer; var i:integer begin fac:=1; for i:=1 to n do fac:=fac*i; end
Trong Lisp:
(defun fac(n) (if (= n 0) 1 (* n fac (1- n)) ) )
Cc bin cc b che ph cc i s ca mt hm
* (defun foo(x) (let ((x 1)) x ) ) FOO * (foo 4)
41
2. LET*
Dng let* thc hin mt lin kt tun t cc i s
* (defun bar(x) (let ((x 1) (y (1- x))) y) ) BAR * (defun bar1(x) (let* ((x 1) (y (1- x))) y) ) BAR * (bar 3) 2 * (bar1 3) 0
42
Chng IV.
Mc ch chnh ca chng ny l gii thch mt s t m chng ta gi l v t. Nhng t ny, khi kt hp vi cc biu thc iu kin s cho php chng ta bin i nhng g xy ra trong mt s tnh hung, v nh vo , chng ta c th nh ra cc hm phc tp hn. Mt s v t cn cho php thay i cch x l ca cc i s.
IV.1 V t
Mt v t l mt hm tr v gi tr true hay false. FALSE trong LISP lun c biu din bng NIL. True c biu din bng k hiu T, bt k ci g khc NIL u c xem l c gi tr true. Lu l y, T v NIL l cc k hiu c bit trong gi tr ca chng c thit lp sn cho T v NIL. iu c ngha l gi tr ca T l T v gi tr ca NIL l NIL. V d:
* t T * nil NIL ; Gi tr ca T l T ; Gi tr ca NIL l NIL
Cc v t EQUAL, EQ, EQL v = u c hai i s v u dng so snh hai i s. Nu hai i s l bng nhau, v t s tr v gi tr T; ngc li v t tr v gi tr NIL. Tuy nhin chng c mt s khc bit trong cch thc so snh. Nu nh EQUAL c xem l v t chung dng so snh, th EQ v = c s dng vi nhng mc ch khc hn: V t equal Mc ch Gi tr ca hai i s c cng l mt biu thc hay khng ?
43
eql eq =
Gi tr ca hai i s c cng l mt k hiu hay mt s hay khng ? Gi tr ca hai i s c cng l mt k hiu hay khng ? Gi tr ca hai i s c cng l mt s hay khng ?
By gi, chng ta xem xt mt cch chi tit hn v lin h gia cc v t: EQUAL u tin kim tra xem hai i s c tha mn EQL. Nu khng tha, n s xem chng l cc danh sch v kim tra tng phn t trong n c tha EQUAL khng. EQL u tin kim tra hai i s c tha mn EQ. Nu khng tha, n s xem chng c cng l s vi cng kiu v gi tr. EQ kim tra hai i s c lu tr cng vng nh trong my tnh hay khng. = kim tra hai i s biu din cng mt s, ngay c khi chng khng cng kiu. Lu rng cc s c so snh phi l cng kiu tha mn EQL. Nhng vi = th c th khng cng kiu.
* (eql 4 4.0) NIL * (eql 4 4) T ; Cc s khc kiu ; Cc s c cng kiu
IV.3 V t MEMBER
V t MEMBER kim tra xem i s th nht c phi l mt phn t ca i s th hai hay khng. Lu l MEMBER tr v nhng g cn li trong danh sch khi tm thy phn t trng hp vi i s th nht.
* (setf sentence (tell me more about your mother please)) (TELL ME MORE ABOUT YOUR MOTHER PLEASE) * (member mother sentence) (MOTHER PLEASE)
Mt lu na l MEMBER thng thng tr v NIL tr khi i s th nht l mt phn t trc tip ca i s th hai; cn nu ch l phn t nm trong mt danh sch th khng .
* (setf pairs ((father son) (mother daughter))) (TELL ME MORE ABOUT YOUR MOTHER PLEASE) * (member mother pairs) NIL
Thay i cch x l cc i s
Thng thng, MEMBER thc hin vic kim tra vi v t EQL v t ch hot ng vi k hiu v s c cng kiu. By gi chng ta mun MEMBER tm mt phn t xut hin trong danh sch, chng ta phi ch ra l chng ta cn kim tra tnh thnh vin dng v t EQUAL thay v EQL.
44
Hng dn s dng Lisp * (setf pairs ((mapple shade) (apple fruit))) ((MAPPLE SHADE) (APPLE FRUIT)) * (member (mapple shade) pairs) NIL * (member (mapple shade) pairs :test #equal) ((MAPPLE SHADE) (APPLE FRUIT))
Thng thng ENDP c dng kim tra danh sch rng, v NULL cng vy. Tuy nhin ENDP dng vi mt i tng khng phi danh sch s sinh ra li. V vy, nn dng NULL cho vic kim tra d liu ni chung c phi l NIL hay khng, hn l cho vic kim tra danh sch rng.
stringp listp V d:
* (atom pi) T * (atom pi) T * (numberp pi) NIL * (numberp pi) T * (symbolp pi) T * (symbolp pi) NIL * (listp pi) NIL * (listp pi) NIL
Chnh s tng ng gia NIL v () gy rc ri, bi v NIL v () u l k hiu v danh sch. V th, c (SYMBOLP ()) v (LISTP NIL) u tr v T.
* (atom nil) T * (atom ())
46
Hng dn s dng Lisp T * (symbolp nil) T * (symbolp ()) T * (listp nil) T * (listp ()) T
IV.6 Cc v t trn s
Cc v t trn s mang ngha kh r rng: V t numberp zerop plusp minusp evenp oddp > < V d:
* (setf zero 0 one 1 two 2 three 3 four 4) 4 * (setf digits (list zero on0e two three four)) (0 1 2 3 4)
Mc ch i s c phi l mt s ? i s c phi l zero ? i s c phi l mt s dng ? i s c phi l mt s m ? i s l s chn ? i s l s l ? Cc i s theo th t gim dn ? Cc i s theo th t tng dn ?
Dng nhng gi tr trn, chng ta c th xem cc v t s. NUMBERP kim tra xem i s ca n c phi l mt s hay khng.
* (numberp 4) T * (numberp four) T * (numberp four) NIL * (numberp digits) NIL * (numberp digits) NIL
47
ZEROP nhn i s l mt s v kim tra n c phi l zero hay khng. ZEROP s pht sinh li nu i s khng c kiu s.
* (zerop zero) T * (zerop zero) ERROR: ZEROP: wrong type argument: ZERO A NUMBER was expected. * (zerop four) NIL
Cc v t > v < i hi i s ca n phi l s. V t > kim tra xem cc i s c gim ngt v < kim tra chng c tng ngt hay khng. C hai v t u c th nhn mt, hai hay nhiu i s.
* (> four two) T * (>two four) NIL * (> three two one) T * (> three one two) NIL
V d:
* (setq x a) A *x A * (and (numberp x) (> x 1) ) NIL * (and (symbolp x) (list x) ) (A)
2. OR
(or E1 E2 ... En) l sai nu t nht mt Ei sai OR nh gi cc i s t tri sang phi v ch dng khi gp mt i s ng V d:
* (setq x a) A *x A * (or (numberp x) (> x 1) ) error > A is not a number * (or (symbolp x) (list x) ) T
3. NOT
NOT i gi tr khng NIL thnh NIL v NIL thnh T. V d:
* (not nil) T * (not t) NIL * (not dog) NIL * (setf pets (dog cat)) (DOG CAT) * (member dog pets) (DOG CAT) * (not (member dog pets)) NIL * (member dingo pets) NIL * (not (member dingo pets))
49
Hng dn s dng Lisp T * (and (member dog pets) (member tiger pets)) NIL * (and (member dog pets) (not (member tiger pets))) T
Chng ta nhn thy rng NIL v danh sch rng () l hon ton tng ng nhau. Do NOT tht s lm cng mt cng vic nh NULL: c hai u tr v T nu i s l NIL, v c hai u tr v NIL khi i s l khng NIL.
y, ch c mt trong hai i s i s th hai hoc th ba c nh gi. IF c gi l c iu kin v IF ph thuc vo gi tr i s ca n. C nhiu dng iu kin khc ph bin IF hn khi ngi dng khng cn lm tnh tng qut ca IF. Chi tit hn, WHEN c dng thay cho IF khi mnh kt qu sai trong IF (biu thc E3 trn) l NIL. (if E1 E2 nil) (when E1 E2) Tng t nh vy, UNLESS c dng thay cho IF khi mnh kt qu ng trong IF (biu thc E2 trn) l NIL. (if E1 nil E3) (when E1 E3) Tht s, c WHEN v UNLESS c s lng khng gii hn cc i s. i s th nht l biu thc cn kim tra; i s cui cng tr v gi tr; v mi i s gia c nh gi cho cc hiu ng l. Trong v d bn di, gi tr ca WHEN l NEW-RECORD khi TEMPRATURE c gi tr ln hn HIGH.
* (setf high 98 temprature 102) 102 * (when (> temprature high) (setf high temprature) new-record) ; So snh TEMPRATURE vi HIGH ; Nu ln hn, thay i gi tr HIGH ; Nu ln hn, tr v NEW-RECORD
50
2. COND
(cond (Test1 E1 ) (Test2 E2 ) (Test3 E3 ) (Testn En ) ) (if Test1 (progn E1 ) (if Test2 (progn E2 ) (if Test3 (progn E3 ) (if Testn (progn En )) ) )) Trong mt mnh kiu (Test1), nu Test1 ng, kt qu ca cond l gi tr ca (Test1) V d: Vit hm tr v kiu ca i s
* (type-of 1) FIXNUM * (type-of a) SYMBOL
Gii:
(defun type-of (x) (cond ((null x) null) ((symbolp x) symbolp) ((numberp x) numberp) ((stringp x) stringp) ((consp x) consp) (t unknown-type) ) )
3. CASE
Cc dng IF, WHEN v UNLESS c th xem nh nhng trng hp c bit ca COND v tt c u c th biu din bng COND. Chng ta xem mt trng hp c bit khc, CASE, c ngha tng t nh COND. CASE theo sau l dng kha (key form) v mt dy cc mnh . (case Key (Key1 E11 ) (Key2 E21 ) (Keyn En1 ) )
51
(cond ( (eql Key Key1) E11 ) ( (eql Key Key2) E21 ) ( (eql Key Key3) E31 ) ( (eql Key Keyn) En1 ) ) CASE dng v t EQL v so snh kha c nh gi vi cc kha cha c nh gi. Nu tm thy kha, mnh tng ng s c thc hin v tt c mi biu thc trong mnh c nh gi. Chng ta dng CASE khi ta mun c COND trong mi biu thc kim tra tm mt gi tr trong nhiu kh nng. Trong v d bn di, xt dng COND sau:
* (cond ((eq thing circle) (* pi r r)) ((eq thing sphere) (* 4 pi r r)))
52
Chng V.
Phn ny s gii thiu khi nim tru tng ha d liu tin trnh gip bn xy dng cc chng trnh ln v phc tp trong LISP.
CVAL: gi tr ca k hiu cng nh bin PNAME: chui k t tng ng vi tn ca k hiu (dng cho my in) FVAL: hm gn lin vi k hiu, trng ny khng tn ti trong LISP n tr
LISP a tr (bi-valued)
* (setq + 4) 4 * (+ + 3) 7 * (setq + *)
LISP n tr (mono-valued)
* (setq + 4) 4 * (+ + 3) func + undef * (* 4 3) = 12
var + indef
FTYPE: kiu hm
V d:
* (setq foo 3) 3
foo
3 EXPR foo
phn t u
53
2. Pointed pair
Thng s th hai ca cons c th khng phI l mt danh sch. Trong trng hp , chng ta gi l cp con tr (pointed pair)
* (cons a b) (A . B) * (car (a . b)) A * (cdr (a . b)) B
54
(apply F L) (eval (cons F L)) Bt. m s k hiu, s hay chui trong mt list
(defun count(test l) (if (null l) 0 (if (apply test (list (car l))) (1+ (count test (cdr l))) (count test (cdr l)) ) ) )
2. Funcall funcall: p dng gi tr ca thng s th nht (mt hm hay tn ca mt hm) vo cc thng s tip theo
(funcall F E1En) = (F E1En) (apply f (list e1 en)) (funcall f e1 e2)
* (setq a +) + * (funcall a (+ 3 4) 5) 12
55
Nhn xt : Chng ta nh ngha hm inf10 ch s dng mt ln duy nht C th s dng mt hm khng tn. Hm nh th trong Lisp c gi l lambdaexpression v c vit: (lambda header content)
* (count (lambda (x) (and (integer x) (< x 10) ) ) (4 12 a 11 3) 2
2. Hm v danh v bin cc b
Cc bin cc b c bt u vi let l cc tham s ca mt hm v danh (anonymous) (let ((var1 val1) (varN valN)) corps) ( ( lambda (var1 varN) corps) val1 valN)
* (let ((x 1) (y 2)) (+ x y)) 3 * ( ( lambda (x y) (+ x y) ) 1 2 ) 3
56
Chng VI.
Mc ch chnh ca chng ny nhm gip bn c lm th no thc hin mt vic mt s ln no (tnh ly tha, giai tha ca mt s) hay lm th no cng thc hin mt vic cho mi phn t trong danh sch (trong mt danh sch hai chiu, sp xp mi danh sch con theo th t tng dn).
Bn trong DOTIMES, thn vng lp (phn body - setf result (* m result)) c thc hin n ln, v gi tr ca RESULT, result form, chnh l kt qu cn tnh. Lu l tham s count khng xut hin trong phn thn ca DOTIMES trong v d c bit ny. Bt: Vit DOTIMES-FACTORIAL, dng DOTIMES tnh giai tha. n! = n * (n - 1)!, 1, vi n > 0; vi n = 0.
57
Khi thc hin DOLIST, u tin list form c nh gi v tr v kt qu l mt danh sch cc phn t. Sau , cc phn t ca danh sch c gn ln lt cho tham s. Vi mi gi tr, phn thn vng lp (body) c nh gi. Cui cng, tham s ny c b i v kt qu c nh gi, tr v gi tr cho DOLIST form. Nu DOLIST khng c result form, DOLIST s tr v NIL v mc ch ca n by gi ch l sp xp cho mc ch no . By gi chng ta s vit phng thc m s phn t trong danh sch di nhit ng lnh hay trn nhit si, tnh bng Fahrenheit:
* (count-outlyers (18 75 31 180 270 52)) 3
Cch n gin nht lm vic ny l hin thc COUNT-OUTLYERS dng COUNT-IF. Mt cch khc na l dng DOLIST nh sau:
(setf freezing 32 boiling 212) (defun count-outlyers(list-of-elements) (let ((result 0)) (dolist (element list-of-elements result) (when (or (> element boiling) (< element freezing)) (setf result (+ result 1)) ) ) ) )
Trong v d trn, COUNT-OUTLYERS c thng s (18 75 31 180 270 52). Tip theo, ELEMENT s nhn gi tr 18. V 18 nh hn 32, result c cng thm 1. Trong qu trnh nh gi sau cng, gi tr ca ELEMENT l 52 v gi tr ca result khng i. chm dt s thc hin DOLIST hay DOTIMES, ta dng return:
(RETURN (expression))
Khi gp (RETURN (expression)), biu thc s c nh gi v tr v gi tr cho DOLIST. Nh c im ny, chng ta c th tr v n outlyers u tin:
(defun first-n-outlyers(n list-of-elements) (let ((result 0) (outlyers nil)) (dolist (element list-of-elements outlyers) (cond ((or (> element boiling) (< element freezing)) (setf result (+ result 1)) (push element outlyers)) ((= n result) (return outlyers)) ) ) ) )
Bt. Vit DOLIST-MEMBER hin thc MEMBER dng DOLIST. Vit DOLIST-REVERSE hin thc REVERSE dng DOLIST.
58
(DO ( (<parameter 1> <initial value 1> <update form 1>) (<parameter 2> <initial value 2> <update form 2>) ... (<parameter n> <initial value n> <update form n>) ) (<termination test> <intermediate form, if any> <result form>) <body>)
Chng trnh sau minh ha cch dng DO tnh ly tha:
(defun do-expt(m n) (do ((result 1) (exponent n)) ((zerop exponent) result) (setf result (* m result)) (setf exponent (- exponent 1)) ) )
Chng ta thy trong vng lp DO trn c hai phn: Phn th nht l mt danh sch cc tham s cng gi tr khi to khi mi vo vng DO. Phn th hai s xc nh khi no vng lp kt thc v gi tr tr v. Phn ny bao gm mt danh sch c: Phn t u tin ca danh sch l mt kim tra kt thc Test Cc phn t tip theo ca danh sch ln lt c nh gi khi Test khc NIL. Gi tr tr v ca DO l gi tr ca phn t cui cng trong danh sch.
2. prog1
(prog1 E1 ... En) nh gi tun t cc biu thc E1, ..., En t tri sang phi v kt qu tr v l gi tr ca biu thc E1
59
60
VII.3 Debugging
y l ngn ng tng tc (interactive), do chng ta c th kim tra mi hm toplevel m khng bt buc phi nh ngha cc chng trnh tests Mt k thut theo vt (trace) cho php theo di qu trnh thc hin mt hm
61
Hng dn s dng Lisp * (defun fac(n) (if (= n 0) 1 (* n (fac (1- n))) FAC ) )
* (trace fac) ;Autoload: TRACE from TRACE in C:\\GCLISP\\LISPLIB T * (fac 2) ENTERING: FAC, ARGUMENT LIST: (2) ENTERING: FAC, ARGUMENT LIST: (1) ENTERING: FAC, ARGUMENT LIST: (0) EXITING: FAC, VALUE: 1 EXITING: FAC, VALUE: 1 EXITING: FAC, VALUE: 2 2
62
<Ctrl>-E <F1>
dng trnh son tho GMACS (kim tra du ngoc) ra khi mi trng son tho
63
* (load first)
64
65
PHN III.
SMALLTALK
Chng I.
I.1 1.
Lp trnh hng i tng (Object Oriented Programming) vi Smalltalk i tng (Object) - Cc thnh phn (member) ca i tng: Cc thuc tnh (properties) v cc phng thc (methods) - S bao ng (encapsulation).
i tng l khi nim cn bn nht ca OOP. Hiu theo mt cch n gin, i tng l s m rng ca record (c th thy r iu ny qua s pht trin ca ngn ng Pascal). Mt record th bao gm nhiu trng (field), trong mi field li c xem nh mt bin thnh phn ca record. Nh vy mi record c xem nh mt i tng d liu cu trc, trong mi thnh phn ca cu trc li l mt i tng d liu con. Tng t nh record, mi i tng cng c nhiu thnh phn (member), tuy nhin cc thnh phn khng ch l d liu, m cn c th l cc on m (code). Cc thnh phn d liu ca i tng c gi l cc thuc tnh (properties) ca i tng, cn cc thnh phn m ca i tng c th c coi nh l cc chng trnh con (procedure) c bit c vit dnh ring cho i tng. Mi chng trnh con ny c gi l mt phng thc (method). Nh vy mt i tng c xem nh l mt i tng d liu c cu trc trong cc thnh phn ca n l cc thuc tnh v cc phng thc. S thng nht d liu v m thnh mt thc th duy nht nh vy gi l s bao ng(encapsulation). i tng l mt s bao ng gia cc thuc tnh v cc phng thc.
2.
Khi nim class - Mi quan h gia object v class - Khi nim instance.
Cc i tng c cng mt s tnh cht c tp hp li thnh mt lp (class). Hiu mt cch tng i, mi quan h gia i tng v lp gn ging nh mi quan h gia mt i tng d liu (hng, bin) vi kiu d liu (data type). Cc i tng thuc cng mt lp th c cc thnh phn nh nhau, ngha l c cng cc thuc tnh v cc phng thc nh nhau. Chnh v vy vi lp trnh OOP, lp trnh vin s khng lm cng vic nh ngha hay khai bo cc thnh phn cho mt i tng c th no, m s nh ngha hoc khai bo cc thnh phn cho mt lp c th no , theo , tt c cc i tng thuc v lp ny s c chung tnh cht v cc thnh phn c khai bo cho lp. Mt i tng ca mt lp trong thi gian sng (life - time) ca n c gi l mt thc th (instance) ca lp . Khi chng trnh Smalltalk thc thi, lp trnh vin lun c cho bit thng tin v cc lp ang c ca chng trnh, cc thuc tnh v cc phng thc c xy dng cho cc i tng ca lp .
67
Trong ti liu ny, chng ta s s dng phn mm lp trnh Vwin minh ha ngn ng lp trnh Smalltalk ny.
Tn lp
Tn cc thuc tnh ca lp
Tn cc phng thc ca lp
3.
Phng thc - Thng ip (message) - i tng nhn thng ip (receiver). i s ca thng ip (argument)
Mt phng thc, nh trnh by, c th xem nh mt chng trnh con c vit ring cho mt i tng. Tuy nhin, chng trnh con ny, v l thuyt, khng c php gi trc tip t bn ngai i tng. T mi trng bn ngai i tng, ch c th tc ng n i tng bng mt thng ip (message). Nu mt i tng nhn mt thng ip, n s tr li bng mt phng thc thch hp (nu thng ip m i tng nhn c l thng ip m n c kh nng tr li). V mt l thuyt, tn thng ip v tn phng thc tng ng dng tr li thng ip khng cn phi ging nhau, tuy nhin vi ngn ng Smalltalk, phng thc dng tr li thng ip s c cng tn vi thng ip.
68
Nh vy, khi mi trng tc ng ln mt i tng qua mt thng ip, c th coi nh l mt li gi chng trnh con (procedure - call), qua i tng s thc thi phng thc tng ng. Nh vy, nu hiu trn phng din mt phng thc l mt chng trnh con c bit, th cng nh cc chng trnh con bnh thng, mt phng thc cng c th c cc thng s hnh thc, v trong li gi chng trnh con, ti ni gi phi truyn cc thng s thc. Cc thng s thc ny c gi l cc i s (argument) ca thng ip. Cc i s ny cng l cc i tng khc. V d: Xt cu lnh Smalltalk nh sau: 3 + 4. Trong trng hp trn y, 3 v 4 l hai i tng, biu hin cho hai con s. K hiu + l mt thng ip, v theo quy nh ca c php Smalltalk, thng ip trn c gi cho i tng l s 3. Nh vy 3 l i tng nhn thng ip. 4 l i s ca thng ip ny. Khi thc thi, i tng 3 s gi n mt phng thc tng ng vi thng ip + v truyn i s l 4, phng thc ny s thc hin v cho ra kt qu. Tt nhin, kt qu l 7. thc thi on v d (trong trng hp ny ch l mt dng lnh) trn, cng nh tt c cc on m v d khc ca phn ny, hy thc hin theo trnh t sau (c gi c th xem phn 3 c hng dn k hn) Ti vng ca s son tho kch bn (Transcript), nh an m v d vo. Sau khi nhp xong on script, chn (highlight) on m cn thc thi, chn mc Show It trong menu Smalltalk nh trong hnh di. Nu on lnh khng sai c php, kt qu s hin ra v c highlight cui vng m c chn.
4.
Cc loi thng ip: unary, binary v keyword. u tin gia cc thng ip.
Smalltalk quy nh ba loi thng ip c th truyn cho cc i tng, gia cc loi thng ip ny c u tin khc nhau. Nu xem cc thng ip tng t nh cc tan t, th cc tan t ny c s kt hp tri. Thng ip unary l loi thng ip khng yu cu thng s. V d: -2 abs.
69
y -2 l i tng nhn thng ip, abs l mt thng ip unary. Kt qu cho bit tr tuyt i ca i tng nhn thng ip (2). Tng t vi cu lnh abcd size. i tng nhn thng ip l mt chui abcd, tn thng ip l size. Kt qu s cho bit chiu di chui (4). Thng ip binary l loi thng ip c biu din bng mt hoc hai k hiu c bit (khng phi l ch hoc s.). V d nh >=, <=. = Thng ip ny yu cu mt i s. V d: 3 + 4 Thng ip keyword l thng ip yu cu mt hoc nhiu i s, trong ng vi mt i s phi l mt t kha (keyword). Mt t kha l mt danh hiu (mt chui gm nhiu s v ch, m u bng ch) thm vo k t : tn cng.Tn ca thng ip s l s ghp ni theo th t cc keyword trn. V d: 2 and: 3 i tng 2 nhn mt keyword message c mt i s, v v vy c mt t kha l and:. Tn ca thng ip l and:. Kt qu s thc hin php and gia 2 v 3, v cho kt qu l 2. #(2 3 4) at: 2 put: 3 i tng nhn thng ip trong trng hp ny mt dy #(2 3 4). Thng ip c hai i s l hai s nguyn 2 v 3. ng vi hai i s trn l hai t kha at: v put:. Nh vy tn ca thng ip s l at:put:
5.
Nh cc v d trn cho thy, mt cu lnh (statement) bt k ca Smalltalk u ch c mt dng duy nht: i tng nhn thng ip, trong thng ip ny c th c hoc khng c i s, v cc i s ny cng l cc i tng, c truyn qua tn hoc truyn trc tip t cc lnh truyn thng ip cho cc i tng khc. Nh vy mt on lnh, tc nhiu cu lnh trn ngn ng Smalltalk trong cc lnh ngn cch bng k t . thc cht l cc pht biu truyn thng ip c th c thng s ti cc i tng, tc l lp trnh vin lm cng vic ch ra mi quan h gia cc i tng (gia i tng nhn thng ip v i s ca n) hoc tc ng n d liu bn trong ca i tng thng qua cc thng ip c truyn n cc i tng. V vy mt on lnh
70
Smalltalk c coi l mt kch bn (script), ch ra mi quan h gia cc i tng l cc thnh vin tham gia vo kch bn. i vi Smalltalk, mt phng thc c xem l mt kch bn. * Ch : Cc lnh trong cng mt kch bn ca Smalltalk c ngn cch nhau bi k hiu ., tng t k hiu ; ca Pascal.
6.
Mi i tng v mi lp, nh ni, u c nhng thnh phn. Cc thnh phn ny c th c i tng che giu i vi bn ngoi. iu ny c gi l s che giu thng tin. T bn ngai i tng, ch c th truy xut n cc thnh phn b che giu ca i tng qua cc thng ip, khng c php truy xut trc tip. i vi Smalltalk, cc thuc tnh ca mi i tng u l cc thnh phn b che giu i vi bn ngai i tng. V d: Mi i tng thuc lp Character u c mt thuc tnh mang tn asciiValue. Thnh phn ny s cha m ascii ca k t tng ng vi i tng. Khng th truy xut (c, thay i) gi tr thnh phn ny t bn ngai i tng, ngay c i vi cc i tng thuc cng lp Character ny.
7.
Gia cc lp c mi quan h tha k, trong mt lp A c th l lp cha (parent class) ca mt lp B, v khi , lp B l lp con (subclass) ca lp A. Trong trng hp lp B l lp con ca mt lp A, th ngai nhng thnh phn ring ca mnh, lp B s c thm mt s thnh phn khc c tha k t lp A. i vi Smalltalk, lp B s c tha k tt c cc thnh phn ca lp A. Khi trn lp B nh ngha mt thnh phn no tn ti trn lp A, th thnh phn c nh ngha mi ny s che i thnh phn c tha k t lp A, xem nh B khng tha k thnh phn ny t lp A. Chng ta gi y l s che ph (override). Mt lp B c dn xut t lp A khi n l lp con ca lp A hoc l lp con ca mt lp c dn xut t lp A. Trn ngn ng Smalltalk nh ngha sn mt lp i tng cn bn gi l lp Object, tt c cc lp khc trn ngn ng u c dn xut t lp Object ny. Do vy tp hp tt c cc lp ca ngn ng s to thnh mt cy, trong mi nt l mt lp, mi quan h cha con gia cc nt s tng ng vi mi quan h cha - con ca cc lp, v nt gc ca cy tng ng vi lp Object. Tt c cc i tng do lp trnh vin to ra u tng ng vi mt lp no trn cy ny. Cc lp trnh vin c th thm bt, thay i ni dung ca cy trn trong lc thit k cng nh lc thc thi chng trnh.
71
8.
Tnh a hnh l kh nng cc i tng khc nhau s c nhng cch tr li khc nhau cho cng mt thng ip, d chng s gi nhng phng thc ging nhau, ng hn l gi cng mt phng thc tr li. V d: cng vi thng ip at:put: v cng gi phng thc c s primitive l 61 (ni dung ca thng ip ny cng khi nim primitive: s c gii thch sau), nhng khi i tng nhn thng ip l mt array th n s chp nhn khi thng s th hai l mt i tng bt k, nhng nu i tng nhn thng ip l mt chui th phng thc ch chp nhn khi i tng nhn thng ip l mt k t. #( 2 3 4 5) at: 2 put: 7 2345 at: 2 put: 7 khng bo li bo li.
S rng buc mun l vic xc nh phng thc thch hp tr li cho thng ip s din ra vo lc thc thi, thay v lc dch, ty theo i tng ang tht s thuc vo lp no. c gi c th c thm v vn ny trong cc ti liu v OOP. Tt c cc phng thc trong Smalltalk u c gi theo c th rng buc mun ny.
I.2 1.
Ngn ng Smalltalk Object trn Smalltalk - Thuc tnh thng v thuc tnh indexed - Cc thnh phn cho i tng v thnh phn cho lp
Mt i tng trn ngn ng Smalltalk cng bao gm cc thnh phn l cc thuc tnh v cc phng thc. Cc thuc tnh ca mt i tng c th chia thnh hai loi: cc thuc tnh thng, l cc thuc tnh c t tn v truy xut thng qua tn, v cc thuc tnh indexed, tc l cc thuc tnh c truy xut qua ch s. Mi i tng s c mt danh sch cc thuc tnh indexed, tuy nhin danh sch ny c mc nh l rng. Ch c cc lp thuc lp con ca lp Collection mi c cung cp cc phng thc iu khin hu hiu cc thuc tnh indexed. Cc thuc tnh indexed khng c tn v c truy xut qua ch s, v ch c ngha khi chng trnh thc thi v ban u chng lun c khi ng l mt danh sch rng, v vy chng khng xut hin trong ca s con hin th cc thuc tnh ca cc lp. Trn ngn ng Smalltalk, cc thnh phn ca mt i tng c th chia thnh hai phn: thnh phn dnh cho cc i tng (instance member) v thnh phn dnh cho c lp (class member). Cc thnh phn dnh cho mi i tng l c lp. Mi i tng s c cc gi tr thuc tnh ring, v s c cc phng thc ring. Cc phng thc ring ny s c gi mi khi i tng nhn c thng ip tng ng. Trong khi o, cc thuc tnh lp c dng chung cho tan b cc i tng thuc cng mt lp. Khi mt thuc tnh lp ca mt i tng b thay i, th thnh phn tng ng ny trn tt c cc i tng thuc cng lp vi i tng s b thay i theo ngay lp tc.
72
Cc phng thc lp l cc phng thc nhm tr li cho cc thng ip gi n cho c lp. Khi mt thng ip c truyn n khng phi cho mt i tng no, m cho c mt lp, th phng thc lp tng ng s c gi tr li thng ip ny. (Xem hnh 1) V d: Float pi. y nhn thng ip l mt lp (Float) thay v l mt s thc bt k no , v do lp Float c xy dng mt phng thc lp mang tn pi, phng thc ny s c thc thi v tr li kt qu (3.141593)
2.
Literal l cc hng theo k t, trong gi tr ca hng ph thuc vo cc k t to nn tn hng. i vi Smalltalk, cc i tng hng theo k t l cc i tng c nh danh bng chnh cc hng , trong lp ca i tng v gi tr cc thnh phn ca i tng ph thuc vo dng thc ca hng. Cc hng theo k t c nh ngha sn bi ngn ng: Integer: Cc i tng thuc lp Integer i din cho cc s nguyn, v c mt gi tr tng ng vi mt s nguyn. Mi chui k hiu s (1, 23, 456) i din cho mt i tng thuc lp ny v c gi tr bng ng vi s tng ng vi chui k hiu . Float: Cc i tng thuc lp Float i din cho cc s thc, v c mt gi tr tng ng vi mt s thc. Mi chui k hiu s thc (1.5, 2.31, 456.0000) i din cho mt i tng thuc lp ny v c gi tr bng ng vi s tng ng vi chui k hiu . Character: Cc i tng thuc lp Character i din cho mt k t trong bng ascii. Mi chui k hiu m u bng k t $ v mt k t bt k i din cho mt i tng thuc lp Character v c gi tr bng vi k t ng sau k t $. V d: $a, $b, $e. Lp Character c nh ngha mt phng thc lp c tn whiteSpace, kt qu s tr v k t trng (blank). Boolean: Cc i tng thuc lp Boolean i din cho cc gi tr lun l true v false, i din bi cc hng true v false. Array: Cc i tng thuc lp Array i din cho cc danh sch, trong mi phn t ca danh sch l mt i tng thuc mt lp bt k. Cc phn t ca danh sch s tng ng vi thuc tnh indexed ca i tng. Mt i tng thuc lp Array c th biu din di dng mt hng bao gm chui k t sau: m u l k t #, sau l cc hng tng ng vi cc phn t ca danh sch c t gia cp k hiu ng m ngoc. V d: #(2 3 4 5) #( 2.5 4 $a (4 5 $c))
73
Lu : Biu din Array di dng hng nh trn ch c th s dng vi cc array m mi phn t ca n c th biu din bng mt hng khc. String: C th coi String nh mt array c bit, trong mi phn t ca array ny l k t. Mt hng thuc lp string c th biu din di dng mt chui k t t gia cp k t nhy n (), trong mi k t ca chui k hiu ny ln lt tng ng vi mi k t trong dy phn t ca i tng. V d: abcd a Context: Smalltalk a ra khi nim v mt lp c bit gi l Context. Mt i tng thuc v lp ny l mt on lnh nm gia cp k hiu [,], gn ging nh khi nim v khi hoc pht biu ghp trn cc ngn ng c cu trc. Tuy nhin mt on lnh nh vy khng n thun l mt pht biu ghp m l mt i tng thuc v lp Context ny. V d: [a:=2. b:= a+ b. sd at: b.] Cc i tng thuc lp Context ny c th c i s, c th coi nh cc bin cc b ca khi. i s c khai bo bng k hiu :, tn i s v k hiu | ngay sau k t [. V d: [:i :j | a:= i + j] MetaClass: Bt k mt chui danh hiu no trng vi tn mt lp u l mt hng tng ng vi mt i tng thuc lp MetaClass i din cho lp cng tn. Khi nim v MetaClass s c gii thch sau. nil: Chui k hiu nil i din cho mt gi tr rng, khng c gi tr.
3.
Khai bo bin - Rng buc v kiu trn ngn ng Smalltalk - Pht biu gn Pht biu tr v
Lp trnh vin c th khai bo cc bin cc b trong mi kch bn, cc bin (vit dng ch thng) c khai bo u mi kch bn v t gia cp k hiu |. Nu xem mi quan h gia i tng v lp ca n nh l bin v kiu d liu tng ng th s khai bo bin ca Smalltalk khng bt buc phi khai bo kiu, v chng trnh s c s kim tra kiu ng, mi bin khi khai bo u c gi tr l nil, v khi c gn vi mt i tng no th mt bin s i din i tng m n c gn, nh vy mt bin c th tng ng vi nhiu i tng thuc nhiu lp khc nhau khi thc thi mt kch bn, ty theo s ln bin c gn trong kch bn y. Lp trnh vin khng th s dng mt bin cha c khai bo trong mt kch bn.
74
Pht biu gn l mt pht biu c bit, n s tng ng mt bin vi mt i tng qua k hiu :=, sau khi pht biu gn thc thi, mi truy xut n bin u l truy xut n i tng y. Kt qu ca pht biu gn l gi tr bn phi k hiu :=. V d: a:= aads. V d v mt kch bn c khai bo bin: |a| a:= 65. a := a asCharacter. Kt qu on chng trnh trn s l kt qu dng lnh sau cng (k t $A) Nh vy kt qu mt kch bn l kt qu ca dng lnh cui cng ca kch bn, v s thc thi mt kch bn s l s thc thi tun t tng lnh ca kch bn. Tuy nhin lp trnh vin c th chm dt kch bn bng k hiu ^ t trc mt cu lnh bt k ca kch bn. Khi gp k hiu ny, kch bn s ngng sau khi thc thi pht biu tip theo k hiu trn v tr v kt qu l kt qu ca pht biu ( ngha ca k hiu ^ tng t lnh return ca ngn ng C) V d v mt kch bn c lnh tr v |a| ^a:= 1. a := a asCharacter. Kch bn s c chm dt ngay lnh gn a:=1 v tr v kt qu ca lnh gn ny (1). Nh vy, lnh th hai (a := a asCharacter) s khng c thc thi.
4.
nh ngha mt i tng thuc mt lp bt k (k c cc lp c th biu din cc i tng bng cc hng nh ni trn), ta c th gi cc thng ip new hoc new: cho lp ny. Phng thc new l phng thc lp mc nh ca tt c cc lp con ca lp Object. Phng thc ny s to ra mt i tng thuc v lp nhn thng ip c gi tr cha xc nh. Phng thc new: c chc nng tng t, tuy nhin phng thc ny nhn i s l mt s nguyn, v i tng to ra s c sn mt dy indexed thuc tnh c ng tng ng s phn t v u c khi ng gi tr l nil. V d: |a b| a:= Float new. b:= Array new: 4.
75
5.
nh ngha mt class mi v phng thc mi - S bin dch offline v online mt phng thc
Nh vy lp trnh trn mt ngn ng thun ty OOP, lp trnh vin s nh ngha v pht trin cc lp, xy dng cc phng thc cho cc lp, v nh ngha mt kch bn chnh lm im nhp bt u thc hin chng trnh ca mnh. Lp trnh vin c th thm mt lp mi bng cch thit k trc tip trn cy cc lp hoc install trc tip mt on m khai bo thm lp mi (c hai cch s c trnh by phn sau). Cc kch bn do lp trnh vin vit thc hin cc cng vic trn s c bin dch theo hai ch khc nhau: - S bin dch online l s bin dch m chng trnh s da trn ng cnh m lp trnh vin ang lm vic xc nh cc thng tin cn thit cho phng thc (nh lp ca phng thc, tnh cht ca phng thc: l phng thc cho lp hay phng thc cho i tng). Khi bin dch online, lp trnh vin ch cn tp trung vit m cho phn kch bn. - S bin dch offline l s bin dch c lp vi ng cnh, chng trnh s open/install cc on m m t cc kch bn do lp trnh vin vit, trong lp trnh vin phi m t y cc thng tin lin quan n kch bn ny.
6.
Khi vit mt phng thc cho mt lp, ngai cc bin tm c khai bo trong phng thc, lp trnh vin c th truy xut n cc thuc tnh tng ng c khai bo trong lp ca cc phng thc ny.
76
Bn trong phng thc vit cho lp Character, c th truy xut n thuc tnh asciiInteger ca lp ny Ngai ra, bn trong phng thc, lp trnh vin c th truy xut n i tng ang nhn thng ip tng ng v lp cha ca n qua cc t kha self v super. self tng ng vi i tng ang nhn thng ip. V d xy dng cho lp Magnitude mt phng thc returnme nh sau (xem phn 3 bit cch vit v bin dch mt phng thc mi): returnme ^ self Sau th thc thi vi cc s nguyn, s thc v k t (vn thuc v cc lp c dn xut ca lp Magnitude nn c th s dng phng thc ny), kt qu s tr v chnh gi tr ca i tng nhn thng ip 4 returnme 4.2 returme $2 returnme 4 4.200000 $2
super tng ng vi lp cha ca i tng ang nhn thng ip. Dng t kha super khi ta mun gi mt phng thc c xy dng trn lp cha nhng b lp con (tc lp ca i tng ang nhn thng ip) che ph. V d: Vn vi phng thc returnme cho lp Magnitude nh trn, ta s thm vo lp Character mt phng thc cng mang tn returnme. Nh vy phng thc ny s che ph phng thc returnme m lp Character c tha hng t lp cha. Mun vn s dng phng thc c tha hng ny, ta bt buc phi dng n t kha super Ni dung phng thc returnme cho lp Character nh sau: returnme
77
^ super returnme asciiValue Khi thc thi script chnh nh sau main $A returnme Kt qu s tr v 65 (m ascii ca i tng nhn thng ip). Gii thch: vi cu lnh super returnme, phng thc returnme c xy dng cho lp cha (Magnitude) s c gi, kt qu s tr v i tng nhn thng ip (self) l $A, sau i tng $A nhn tip thng ip asciiValue v tr v kt qu.
7.
Cc phng thc c th c khai bo l cc phng thc primitive. Mi phng thc primitive s c mt s nguyn tng ng vi ch s primitive. Mi s nguyn ny s tng ng vi mt on m C++ c che giu. Khi phng thc thc thi, on m C++ ny s c thc thi trc, nu thc thi thnh cng, th kt qu ca on m C++ ny s cho ta kt qu ca phng thc, ngc li th phn kch bn vit bng ngn ng Smalltalk s c thc hin. Smalltalk cung cp sn mt s cc on m C++ tng ng vi cc s primitive (xem ph lc). V d v mt instance phng thc c phn khai bo primitive ca lp Integer + aNumber "Answer the sum of the receiver and aNumber." <primitive: 21> ^aNumber + self
8.
MetaClass l mt khi nim c bit v lp trnh OOP trn Smalltalk. MetaClass l mt lp cc i tng, tuy nhin mi i tng ny li tng ng vi mt lp cc i tng khc. Nh vy bn thn lp MetaClass cng l mt i tng trong chnh lp ny. Mt i tng thuc lp MetaClass c th biu din bng mt hng theo k t, l mt chui k t tng ng vi tn mt lp, hoc c th to ra bng cch khi ng mt i tng v tng ng n vi tn mt lp bng phng thc setName: Do mi i tng trong lp MetaClass u tng ng vi tn mt lp, nn n c th tr li cc thng ip m lp tng ng vi n c th tr li, ngai cc phng thc c xy dng sn trn lp MetaClass. Chnh v vy, khi ta thm mt phng thc lp cho mt lp, th iu cng tng ng vi vic ta thm mt phng thc ring (instance method) cho lp MetaClass (!). Phng thc ring ny s c thm vo t ng v c ch thch Automatical generated Khi s dng cc i tng thuc lp MetaClass, ngi s dng c th ty thay i, thm vo cc thnh phn mi cho lp tng ng vi cc i tng, cng nh c th thm vo
78
cc lp mi, hoc truy xut c cc thng tin v s lin quan gia cc lp trn cy cc lp. Tm li, ni dung ca cy cc lp c th c truy xut v thay i trong lc kch bn ang c thc thi. iu ny lm cho lp trnh OOP trn Smalltalk c tnh cht ng, tc l ni dung ca cc lp v mi quan h gia chng c th c thay i trong lc ang thc thi kch bn. y l mt tnh cht m mt s cc ngn ng OOP nh C++, Java, Delphi khng c c.
9.
Compiler i din cho mt compiler engine. S dng compiler, lp trnh vin c th yu cu chng trnh bin dch li mt on m c chun b sn hoc c son ra ngay lc kch bn ang thc thi. y l mt cch khc thay i ni dung cy cc lp ca Smalltalk ng (trong lc thc thi). Cc lp cn li nh lp Window, ViewManager, Prompter... thng c s dng trong vic trao i (nhp/ xut) cc thng tin gia chng trnh v ngi s dng.
I.3 1.
|a| a:=1. [a<2] whileTrue: [a:= a+1]. ^a Kt qu l 2. Xem thm whileFalse: vi ni dung tng t + Lp vi s ln lp xc nh trc Lp c ch s Phng thc to:do: i tng nhn thng ip l mt s nguyn, hai i s l s nguyn v mt khi c thng s. Phng thc ny s hot ng tng t lnh for ca Pascal. V d |a| a:= 0. 1 to: 3 do: [:i| a:= a +i]. ^a on lnh ny gn ging on lnh Pascal sau: var a, i: integer; begin a:= 0; for i:= 1 to 3 do begin a:= a +i. end; end; Lp khng ch s. Phng thc timesRepeat: i tng nhn thng ip l mt s nguyn, i s l mt Context, khi thc thi, ni dung ca C s c thc hin n ln, vi n l gi tr ca i tng nhn thng ip V d: |a| a:= 0. 4 timesRepeat: [a:= a +1]. ^a Kt qu s l 4.
2.
String, l cc lp c tha k t lp IndexedCollection, ngha l cc dng tp hp m cc phn t c th sp xp theo ch s. Lu l ta khng th thm (gi thng ip add) mt phn t vo cho mt i tng thuc lp Array hay lp String (tng qut l lp FixedSizeCollection). Mt s k thut lp trnh cn bn x l tp hp trn Smalltalk . Truy xut trn tp hp c ch s. truy xut n mt phn t ca tp hp qua ch s, s dng phng thc at:, c i s l mt s nguyn bng vi ch s. V d: #(2 3 4) at: 2 abcd at: 4 2 $d
thay i gi tr mt phn t ca tp hp, ta dng phng thc at:put: c hai thng s l s nguyn ch ra gi tr ca ch s v mt i tng bt k tng ng vi gi tr cn thay i. V d: |a| a:= #($a #(2 3) abc). a at:2 put: 4. ^a Kt qu s l #( $a 4 'abc') . To mt danh sch cc s nguyn lin tip to mt danh sch cc s nguyn lin tip c gi tr t m n n, s dng phng thc to: vi i tng nhn thng ip l m, i s l n. V d: 1 to: 4 #(1 2 3 4) Xem thm phng thc to:by: . Phng thc includes: Phng thc ny kim tra xem mt phn t no c thuc tp hp hay khng. V d: #(2 3 4) includes: 2 #(2 3 4) includes: 5 . Phng thc do: Phng thc ny nhn i s l mt Context c i s n, n s ln lt nhn gi tr l cc phn t ca i tng nhn thng ip v thc hin ni dung ca Context. V d
81
true false
|a| a:= 0. abcd do: [:i| a := a + i asciiValue]. ^a Kt qu l 394 (tng m ascii ca bn k t $a, $b, $c, $d) . Phng thc select: v reject: Phng thc select: nhn i s l mt Context c i s n, n s ln lt nhn gi tr l cc phn t ca i tng nhn thng ip v to ra mt Collection mi cng lp vi i tng nhn thng ip bng cch la chn nhng phn t no khin cho gi tr ca Context l true. V d: #(2 3 4 5 6) select: [:i| i odd] Kt qu tr v l #(3 5) (ni dung Context yu cu la chn cc phn t c gi tr l) Phng thc reject lm cng vic ngc vi select: V d: #(2 3 4 5 6) reject: [:i| i odd] Kt qu s l #(2 4 6) (ni dung yu cu loi b cc phn t c gi tr l) .Phng thc collect: Phng thc ny nhn i s l mt Context c i s n, n s ln lt nhn gi tr l cc phn t ca i tng nhn thng ip v to ra mt Collection mi cng lp vi i tng nhn thng ip bng cch to ra cc phn t c gi tr ln lt bng vi gi tr ca n sau khi thc hin xong ni dung Context V d: #($a $b $c $d) collect: [:i| i:= i asciiValue] Kt qu s l #( 97 98 99 100) Khi s dng ng lc cc phng thc trn, cc cng vic x l trn tp hp s nh nhng v hiu qu hn l vic s dng cc cu trc iu khin lp. V d: hy to mt danh sch a bao gm cc phn t chung gia hai danh sch s nguyn a2 v a3 Cng vic to phn t chung gia hai danh sch c th x l trn mt dng lnh nh kch bn sau: |a a2 a3| a2 := #(1 2 3 4 5 6). a3:= #( 2 4 6 8). a:= a2 select: [:i| a3 includes: i]. ^a
82
Chng II.
II.1
Menu File c mt s chc nng chnh thao tc trn tp tin nh: m mt ca s lm vic mi (New Workspace), m mt file script mi (Open), install mt lp hoc mt phng thc vo trong h thng, lu li script, m ca s duyt lp, m ca s duyt da, in n, lu li cu hnh cho ln chy sau, thot khi mi trng Vwin. Menu Edit c cc chc nng cho vic son tho nh: Undo, Copy, Paste... Menu Smalltalk c cc chc nng chnh dng bin dch v thc thi on script nh: dch v thc thi chng trnh nhng khng hin th kt qu (Do It), thc thi v hin th kt qu (Show It), debug (Inspect It) Ca s Transcript ny l ni c dng vit, dch v hin thc cc on script. Vi chng trnh mi trng Smalltalk nh trn, lp trnh vin c th thc hin cc cng vic nh sau:
1.
Cng vic quan trng trong vic lp trnh hng i tng l nh ngha cc lp v phng thc mi. iu ny s c thc hin trong ca s duyt lp. (T menu File ca ca s transcript, chn mc Browse Classes hoc nhn Alt-B). Ca s ny s c dng nh hnh sau:
83
Ca s m t cy cc lp ang tn ti
Vi cu trc cc lp nh trn, lp trnh vin c th ty thay i ni dung cc lp ca h thng nh sau: Tm kim lp Chn menu Classes\Find Class trn menu chnh. G tn lp cn tm vo hp hi thoi (ch vn ch hoa hoc ch thng) Thm lp mi thm mt lp mi vo h thng qua cc thao tc thit k trn cy cc lp, hy thc hin theo trnh t sau: . La chn lp cha . Thm subclass bng cch la chn trn menu chnh Class\Add Subclass hoc la chn trn pop-up menu bng cch dng phm phi chut. . G tn subclass vo hp hi thoi Thay i trn cc lp: + Thay i trn propeties: C th thm bt, thay i tn cc thuc tnh thng qua ca s m t ni dung lp ang la chn (thm/ bt dng text v tr thch hp). + Thay i trn phng thc: C th thm v xo cc phng thc thng qua cc menu.
84
2.
Lp trnh
y l cng vic chnh ca cc lp trnh vin. Nh ni, lp trnh vin c th vit v bin dch cc kch bn bng hai cch online( vic bin dch s da trn ng cnh chng trnh ang chy) hoc offline (c lp ng cnh). Phn ny ch trnh by phn bin dch online. To lp mi: to mt lp mi, trc tin chng ta phi chn lp cha ca lp trong ca s m t cy cc lp. Sau , chn menu Classes/ Add subclass v g tn lp mi ny vo trong hp thoi New Class nh trong hnh bn di. Lp mi c to ra s mc nhin c tha k tt c cc phng thc v thuc tnh ca lp cha. Tuy nhin, thng tin v cc phng thc tha k ny s khng c hin th ra.
85
thm mt thuc tnh vo mt lp, u tin chng ta phi chn tn lp ca s cy phn cp lp (ch l ch chn tn lp m khng chn phng thc cho lp). Khi chn xong tn lp th trong ca s m t ni dung phng thc/lp ang chn s hin th thng tin v lp . V d trong hnh sau s thm 2 thuc tnh thng l b, c vo gia hai du nhy n ca phn instanceVariableNames v thuc tnh lp (vit hoa) D vo phn classVariableNames cho lp A. Sau khi thm xong th ta chn File/ Save hoc Alt-S dch.
Thuc tnh lp ca lp A
La chn trn cc menu: la chn Method/New method trn menu chnh hoc la chn trn popup - menu khi click phm phi chut trong vng ca s m t cc phng thc dnh cho lp. Ty yu cu ca mnh, lp trnh vin la chn gia vic thm vo mt phng thc thng (instance method) hoc phng thc cho lp (class method). Lu l phi chn lp trc ri mi to phng thc mi. Ni cch khc, lp trnh vin phi bit r phng thc cn xy dng l thuc lp no.
86
Sau khi chn New method, Vwin s to t ng mt phng thc mu (pattern) trong ca s m t ni dung lp/ phng thc nh hnh sau:
Nhn trn phng thc mu ny, chng ta thy mt phng thc thng s bt u bng tn ca phng thc, cc ghi ch, khai bo bin v cui cng l cc pht biu. Ghi ch trong Vwin c t gia hai du nhy kp . Son tho phn thn ca phng thc. Ngi s dng son tho ni dung ca phng thc trc tip trong vng m t ni dung lp/ phng thc ny. Nu l phng thc c thng s, ngi s dng cn thm tn ca thng s vo phn tn phng thc.
Dch phng thc Chn trn menu File/Save hoc dng phm tt Alt-S dch phng thc. Khi phng thc c dch thnh cng, ca s m t cc phng thc ca lp s xut hin tn ca phng thc mi va to c. Ch l phng thc lc ny cha tht s c lu vo da cng m ch c lu tm trong b nh m thi.
87
Thc thi phng thc kim tra phng thc, ngi ta thng vit mt on script trong ca s Transcript (Xem phn II.1).
3.
np (load) mt file script c sn, chn trn menu File/Open v chn file mun load vo. load mt lp hoc mt phng thc vo h thng, chn menu File/Install v chn file cha phng thc (.mth) hoc file lp (.cls). thy c tn lp/ phng thc mi c install vo h thng ny, chng ta cn phi chn menu Classed/Update. Save file: Ngc li, ngi s dng c th lu ni dung mt on script, lp hoc mt phng thc thnh cc on m Smalltalk tng ng. lu mt on script, trong ca s transcript, chn menu File/Save hoc nhn Alt-S lu mt lp, u tin phi chn tn lp cn lu ca s cy phn cp lp. Sau , chn menu Classes/File Out nu mun lu tt c cc phng thc v thuc tnh ca bn thn lp . Nu chng ta chn menu Classes/ File Out All th Vwin s lu ton b bn thn lp v cc lp con ca n.
4.
G ri
Run-time error l nhng li xy ra trong qu trnh thc thi chng trnh. C nhng trng hp li ny xy ra khi cc phng thc c gi ln nhau t qu nhiu cp khin cho ngi lp trnh kh xc nh c nguyn nhn thc s gy ra li. Trong nhng trng hp ny, h thng s thng bo vi ngi s dng mt hp hi thoi m t qu trnh gi nhau ca cc phng thc dn n li ny, ng thi thng bo gi tr cc bin bn trong mi phng thc ti thi im chng trnh c gi. V d: Gi s ta c vit phng thc Temp cho lp Integer nh sau: Temp ^ self unknown_message Kch bn chnh c vit nh sau main |a| a:=2. a Temp
88
Khi thc thi kch bn ny, khi i tng a nhn c thng ip Temp, phng thc Temp dnh cho lp Integer s c gi. Trong phng thc ny, li c thng ip unknownmessage c gi n cho self, l i tng nhn thng ip, do lp Integer khng c phng thc tr li cho thng ip ny, chng trnh s bo li. y l mt li run-time error. hiu r hn thng tin v li, chng ta nhn nt Debug ca s thng bo li ny. Khi nhn Debug, Vwin s hin th mt dialog m t trnh t cc thng ip c gi gy ra li, cng nh gi tr cc i tng nhn thng ip v cc bin tm trong tng thng ip vo thi im gy ra li ny.
89
Cc bin tm
Gi tr ca cc bin tm tng ng
II.2 1.
Cc phng thc ny s tr li false v c vit li cc lp con tng ng cho gi tr true. at: at:put: = Phng thc ny c primitive 60, ch c tc dng vi cc lp con ca lp Collection Phng thc ny c primitive 61, ch c tc dng vi cc lp con ca lp Collection Phng thc ny c primitive l 110, nhn i s l mt i tng, kt qu s tr v true nu i tng nhn thng ip v i s l cng mt i tng. Nu i tng
90
nhn thng ip v i s u thuc lp Character, th phng thc s tr v true nu c hai cng c gi tr asciiValue nh nhau. species Phng thc ny c primitive l 111,s tr v mt i tng thuc lp MetaClass, c gi tr l lp ca i tng nhn thng ip. V d: 5 species Integer new Phng thc ny s to ra mt i tng thuc lp l i tng nhn thng ip. Tuy nhin phng thc lp ny cng nh phng thc lp new: s khng c hin th trong ca s cc phng thc ca lp V d: Object new new: Phng thc ny c i s l s nguyn n cng to ra mt i tng thuc lp l i tng nhn thng ip nhng c indexed data l mt dy n i tng (khi to l nil). V d: Collection new: 4
2.
Lp Magnitude
Lp ny l lp c bn dn xut ra cc lp i din cho cc i tng d liu nh s nguyn, s thc, k t. Lp trnh vin thng ch lp trnh trn cc lp c dn xut t lp ny. between:and: Phng thc ny c i s l hai i tng cng loi vi i tng nhn thng ip o1 v o2. Kt qu s tr v true nu i tng nm gia hai i s da trn cc php so snh c xy dng cho lp ny. (o1 phi lun nh hn o2). V d: $b between: $a and: $c true max: Phng thc ny c i s l i tng cng loi vi i tng nhn thng ip o. Kt qu s tr v i tng ln hn gia i s v i tng nhn thng ip. V d: 2 max: 5 5 min: Phng thc ny c i s l i tng cng loi vi i tng nhn thng ip o. Kt qu s tr v i tng nh hn gia i s v i tng nhn thng ip.
3.
Cc lp trn c dn xut trc tip hoc gin tip t class Magnitude, cung cp cc phng thc c bn nht x l s nguyn, s thc v k t.
4.
Lp IndexedCollection:
Phng thc ny nhn i s l mt Collectiton khc, kt qu s ni i s vo danh sch phn t ca i tng nhn thng ip. V d: abcd,ef abcdef = Phng thc ny nhn i s l mt Collectiton khc, kt qu s tr v true nu mi phn t ca i tng nhn thng ip u bng vi phn t tng ng trn i s v ngc li. V d: abc = abc true atAll:put: Method ny nhn hai i s l mt Collectiton C v mt i tng bt k O, trong C l mt danh sch cc s nguyn, kt qu s thay th mi phn t ca i tng nhn thng ip c ch s xut hin trong C bng i tng O. V d: |a| a := #(1 2 3 4 5). a atAll: #(1 3) put: $c. ^a Kt qu s l #( $c 2 $c 4 5) atAllPut: Phng thc ny nhn i s l mt i tng bt k O, kt qu s thay th tt c cc phn t ca i tng nhn thng ip bng O. V d: |a| a := #(1 2 3 4 5). a atAllPut: #(1 2). ^a Kt qu s l #( #( 1 2) #( 1 2) #( 1 2) #( 1 2) #( 1 2)) checkIndex: Method ny nhn i s l mt s nguyn, kt qu s kim tra s nguyn ny c phi l ch s thch hp cho i tng nhn thng ip khng. (S nguyn ny phi ln hn 1 v nh hn s phn t ca i tng nhn thng ip). Nu khng phi s thng bo li. copyFrom:to: Method ny nhn hai i s l hai s nguyn start,stop, kt qu s tr v mt collection mi t v tr start n stop. V d: #(2 3 4 5) copyFrom: 1 to: 3 #(2 3 4) copyReplaceFrom:to:with: Method ny nhn ba i s l hai s nguyn start,stop v mt Collection C. Kt qu s thay th cc phn t ca i tng nhn thng ip t v tr start n stop bng cc phn t ca C. V d: #(2 3 4 5) copyReplaceFrom: 1 to: 3 with: ab #( $a $b 5) copyWith: Method ny nhn i s l mt i tng bt k. Kt qu s thm i s vo cui i tng nhn thng ip. abcd copyWith: $e abcde
92
do: Method ny nhn thng s l mt block(Context) c i s. Mi phn t ca i tng nhn thng ip s ln lt truyn nh l mt i s cho block v sau thc hin block ny. V d: |a| a:= 0. #(1 2 3 4 5) do: [:i| a:= a+i]. ^a Kt qu s l 15 findFirst: Method nhn i s l mt block c i s. Kt qu s tr v v tr ca phn t u tin trn i tng nhn thng ip lm i s c gi tr true. Nu khng c phn t no nh vy s bo li. #(2 3 4 5) findFirst: [:i| i odd] 2 (v tr ca s 3 trong dy, l s l u tin findLast: Method nhn i s l mt block c i s. Kt qu s tr v v tr ca phn t cui cng trn i tng nhn thng ip lm i s c gi tr true. Nu khng c phn t no nh vy s bo li. V d: #(2 3 4 5) findLast: [:i| i odd] 4 first Tr v phn t u tin ca i tng nhn thng ip abcd first $a grow Tng s phn t ca i tng nhn thng ip growSize Tnh s phn t cn tng ln dng cho grow includes: Nhn i s l mt i tng bt k. Tr v true nu i s bng vi mt phn t ca i tng nhn thng ip. V d: abcd includes: $b true indexOf: Nhn i s l mt i tng bt k. Tr v v tr xut hin ca i s trong i tng nhn thng ip, nu khng tm thy tr v 0. V d: abcd indexOf: $d 4 indexOfCollection: Nhn i s l mt Collection, tr v v tr xut hin ca i s trong i tng nhn thng ip V d: #(1 2 3 4 5 6) indexOfCollection: #(2 3) 2 last Tr v phn t cui ca i tng nhn thng ip. V d: #(1 2 3 4 5 6) last 6 replaceFrom:to:with:
93
Tng t nh copyFrom:to:with: nhng c kim tra xem s phn t ca thng s th ba c thch hp hay khng. #(2 3 4 5) replaceFrom: 1 to: 3 with: ab bo li #(2 3 4 5) replaceFrom: 1 to: 3 with: abc #( $a $b $c 5) replaceFrom:to:with:startingAt: Tng t nh replaceFrom:to:with: nhng bt u thay th t v tr xc nh trc trn Collection i s #(2 3 4 5) replaceFrom: 1 to: 3 with: abcd startingAt: 2 #( $b $c $d 5) replaceFrom:to:withObject: Nhn ba thng s l hai s nguyn start, stop v mt i tng O. Kt qu s thay tt c cc phn t t v tr start n stop ca i tng nhn thng ip bng O. V d: |a| a:= #(2 3 4 5). a replaceFrom: 1 to: 3 withObject: 'abcd'. ^a Kt qu s l #( 'abcd' 'abcd' 'abcd' 5) reversed o ngc th t cc phn t ca i tng nhn thng ip. Method ny c primitive l 8001. V d: abcd reversed dcba reverseDo: Tng t nh thc hin lin tip hai method reversed v do: cho i tng nhn thng ip vi i s l mt s nguyn. size Tr v s phn t trong tp hp V d: abcd size 4
5.
Lp Context: Lp Context i din cho mt khi (block) cc cu lnh. Cc method c vit sn cho lp Context value Thc hin cc lnh bn trong Context nhn thng ip V d: [4 + 5] value 9 value: Method ny nhn i s l mt i tng bt k O. i tng nhn thng ip phi c c i s. i s s c gn bng O v sau thc hin cc lnh bn trong Context nhn thng ip. V d: [:i| i asciiValue] value: $e 101 (m ascii ca k t e) whileTrue: Method nhn thng ip l mt Context C. Cng vic thc hin nh sau: gi tr ca i tng nhn thng ip s c tnh. Nu gi tr l true th thc hin cng vic trong C. Lp li cng vic ny cho n khi gi tr ca i tng nhn thng ip l false. V d:
94
|a b| a:=4. b:= 0. [a > 0] whileTrue: [b:= b+ a. a:= a - 1]. ^b Kt qu s l 10. whileFalse: Tng t whileTrue:
95
Chng III.
MT S K THUT LP TRNH CN BN BI TP
2.
Bi tp ngh:
m trong mt dy by k c bao nhiu phn t l s nguyn (s dng phng thc isInteger) m trong mt chui c bao nhiu k t c m asci nm gia hai s nguyn n,m (n, m l hai s nguyn cho trc, s dng phng thc between:and: ) Tnh hiu gia tng ascii cc k t nguyn m v cc k t ph m trong mt chui (s dng phng thc isVowel). Cho a l mt dy s nguyn. Tnh tng cc phn t c gi tr ln hn s phn t ca a. M ha mt chui thnh mt s nguyn x = a*100 + b*10 + c trong a l s k t nguyn m, b l s k t ph m, c l s k t cn li trong chui (s dng phng thc isLetter)
96
V d:
m trong mt dy s nguyn xem c bao nhiu phn t l s chnh phng. Gii |s| s := #(2 3 4 5 6 7 8 9). ^(s select: [:i| i sqrt - i sqrt rounded = 0]) size. hoc |s| s := #(2 3 4 5 6 7 8 9). ^(s reject: [:i| i sqrt - i sqrt rounded ~= 0]) size. Tnh dy c s chung gia hai s nguyn m v n Gii |tmp n m| n:= 25. m := 125. tmp := 1 to: n. tmp = #(1 2 3 . 25) ^ tmp select: [: i| (n \\ i = 0) & (m \\ i = 0)]
2.
Bi tp ngh
m xem trong mt chui c bao nhiu k t c m ascii chia ht cho n (vi n l mt s nguyn no .) m trong mt dy a c cc phn t l cc dy s nguyn (dy con) c bao nhiu dy con c tng ln hn n. To ra danh sch cc bi s ca mt s nguyn a c gi tr nm gia hai s nguyn n v m. To ra mt dy gm n phn t u tin l s nguyn ca mt dy bt k (s dng phng thc copyFrom:to:) Kim tra xem mt s n c phi l s nguyn t hay khng.
III.3 1.
m := 2. (1 to: n) collect: [:i| i:= m raisedTo: i]. i cc phn t l ph m ca mt chui thnh ch thng v cc phn t l nguyn m ca mt chui thnh ch hoa Gii |a| a:= 'ABCDabcd'. a:= a collect: [:c| c isVowel ifTrue: [c:= c asLowerCase] ifFalse: [c:= c asUpperCase] ]. ^a
2.
Bi tp ngh:
i mt dy s nguyn thnh mt dy cc k t c m ascii tng ng vi dy s nguyn ny. i mt dy s nguyn a thnh mt dy c cc phn t l cc dy con. Dy con v tr th n s l danh sch cc c s ca phn t th n ca a. To ra mt dy t dy ban u a theo nguyn tc sau: nu phn t ca a l s th phn t tng ng l danh sch cc c s ca a, ngc li th phn t tng ng s l chui NOINTEGER
III.4 1.
Bi tp tng hp: V d:
To mt danh sch cc s nguyn t nh hn n Gii |m| m:=10. ^(1 to: m) select: [:i |((2 to: i intSqrt) select: [:j| (i \\j) = 0]) size =0]
2.
Bi tp ngh
Bin i mt chui nh sau: n k t u ca chui s c i thnh ch hoa. m k t cui ca chui s c i thnh ch thng. Thay i mt dy s nguyn nh sau: nu phn t l mt s chnh phng th thay th bng cn bc hai ca n, nu khng th thay th bng c s chung ln nht ca phn t vi mt s m cho trc. Ghp hai dy s nguyn a1, a2 c cng s phn t thnh dy a3 theo nguyn tc sau: phn t th n ca a3 s l mt danh sch cc c s chung cc phn t th n ca a1 v a2
98