You are on page 1of 103

BK

TP.HCM

I HC BCH KHOA TPHCM KHOA CNG NGH THNG TIN

THC HNH NGN NG LP TRNH

TPHCM, Thng 12 2005

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

Chng I. Chng II. Chng III.


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

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

Chng IV. Chng V.


V.1 V.2

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

Php hp nht _______________________________________________________________ 15 C ch tm cu tr li ca Prolog ________________________________________________ 16

Chng VI.
VI.1 VI.2

S quay lui - Khng ch s lng li gii -V t nht ct v fail ___________ 19

S quay lui (back-tracing) trn Prolog_____________________________________________ 19 Khng ch s lng li gii_____________________________________________________ 20

Chng VII. Chng VIII.


VIII.1

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

Cu trc ca danh sch _____________________________________________________ 24

Chng IX. Chng X.

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.

Lp trnh vi gcLisp _______________________________________________ 33

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.

Cc v t v biu thc iu kin _____________________________________ 43

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.

Tru tng ha d liu ____________________________________________ 53

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.

Lp trn s v trn danh sch _______________________________________ 57

Cc cu trc lp ______________________________________________________________ 57 DOTIMES __________________________________________________________________ 57

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

Cc thao tc vi tp tin __________________________________________ 61

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 v s dng gcLisp ________________________________________ 63

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

i tng: cy cc lp. _____________________________________________________________ 71

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 VWIN VERSION 2.0 _______________________ 83

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

Chng III. MT S K THUT LP TRNH CN BN VI LP COLLECTION TRN SMALLTALK - V D V BI TP _______________________________________ 96


III.1 1. 2. III.2 1. 2. III.3 1. 2. III.4 1. 2. S dng phng thc do: ______________________________________________________ 96 V d:______________________________________________________________________ 96 Bi tp ngh: ______________________________________________________________ 96 S dng phng thc select: hoc reject: __________________________________________ 97 V d:______________________________________________________________________ 97 Bi tp ngh_______________________________________________________________ 97 S dng phng thc collect: ___________________________________________________ 97 V d:______________________________________________________________________ 97 Bi tp ngh: ______________________________________________________________ 98 Bi tp tng hp: _____________________________________________________________ 98 V d:______________________________________________________________________ 98 Bi tp ngh_______________________________________________________________ 98

iv

PHN I. PROLOG

Hng dn s dng BProlog

Chng I.

V t (predicate) - T duy lp trnh v nh ngha vn trn Prolog

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

Hng dn s dng BProlog

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

Hng dn s dng BProlog

. 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

Hng dn s dng BProlog

Chng II.

Cc clause, cch gii thch cc vn trn Prolog

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

Hng dn s dng BProlog

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

Hng dn s dng BProlog

Chng III.

Mi trng lp trnh B-Prolog

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:

Hng dn s dng BProlog

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)

Hng dn s dng BProlog

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.

Hng dn s dng BProlog

Term

Atom Number Integer

Variable

Floating-point Structure List Array

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 hp nht (s c trnh by chi tit v php hp nht phn sau):

Cc v t so snh v thao tc trn cc ton hng :

Cc v t trn s:

Cc php ton s hc:

Hng dn s dng BProlog

X mod Y : php chia d X ** Y : php m abs(X) : tr tuyt i ca X sqrt(X) : ly cn bc hai ca X

11

Hng dn s dng BProlog

Chng IV.

Thc thi chng trnh. - t cu hi v nhn cu tr li

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

Hng dn s dng BProlog

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

Hng dn s dng BProlog

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

Hng dn s dng BProlog

Chng V.

IV. Php hp nht - C ch tm cu tr li ca Prolog.

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

abc = abc abcd = abc 2 = 1 +1 1+1 = 1+1

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

Hng dn s dng BProlog

X=Y X -1 = Y

true nu c X v Y u c gi tr v nhng gi tr ny bng nhau false nu X v Y u c gi tr v X nh hn 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

Hng dn s dng BProlog

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

Hng dn s dng BProlog

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

Hng dn s dng BProlog

Chng VI.

S quay lui - Khng ch s lng li gii -V t nht ct v fail

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

Hng dn s dng BProlog

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

Hng dn s dng BProlog

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

Hng dn s dng BProlog

Chng VII. Lp trnh quy vi Prolog


Chng ta nh li rng vi VD2, chng ta c gng n trnh cch t vn gii bi ton giai tha theo cch nhn dn cc s t 1 n s cn tnh gi tr giai tha. iu ny s dn n mt im yu ca Prolog: khng cung cp cc cu trc iu khin cn thit, dn n vic kh khn khi thc hin php lp. Tuy nhin v d ny cng cho thy mt k thut lp trnh to nn sc mnh ch yu ca Prolog: lp trnh quy. K thut ny cng ph hp vi suy ngh ca con ngi khi tip cn gii quyt vn v khin cho vic lp trnh trn Prolog c mt s uyn chuyn v nh nhng trong vic vit m. Tuy vy, n to ra mt s kh khn vi nhng ngi quen lp trnh th tc. Chng ta s xem xt li tng bc trong vic gi quy tm ra li gii. VD13: Xt tng bc qu trnh gi quy v hp nht ca VD7 vi goal l giaithua(2,X) Nhc li, chng ta c on chng trnh nh sau: giaithua(0,1):-!. giaithua(X,Y):- X1 is X -1, giaithua(X1,Y1), Y is X*Y1. y c mt s thay i nh: chng ta t nht ct chuyn s kin u thnh lut. Chng ta mun khng nh: nu s cn tm giai tha l 0 th giai tha ca n l 1, v kt qu ny l duy nht, khng cn phi tip tc tm cc trng hp khc. Ngoi ra, chng ta cng cn lu thm l v t is khc vi php hp nht = nh trong v d sau: .Vi bin Y c gi tr l 1 th trong mnh X is Y + 1 th X c gi tr l 2 cn trong mnh X = Y + 1 th X c gi tr l 1 + 1. Vi goal l giaithua(2,X), h thng s so trng vi mnh giaithua(0,1) l mnh u tin tm thy c lin quan n khi nim giaithua. H thng s hp nht cc thng s theo th t, 2 hp nht vi 0 v X hp nht vi 1. Cng vic hp nht X vi 1 thnh cng, X c gi tr l 1, nhng 2 hp nht vi 0 tht bi. H thng s tip tc tm kim li gii khc bng cch so trng vi mnh khc. Ln ny h thng so trng goal vi mnh giaithua(X,Y). Khi to mi lin quan gia cc thng s, h thng hp nht 2 vi X ca mnh v Y vi X ca goal. Chng ta s k hiu XG l X thng s ca goal. Do Y v XG u cha c gi tr, Prolog s xem hai bin ny l mt. Sau h thng bt u thc hin tng sub-clause: . X1 is X -1 X1 l bin mi, v cha c gi tr. X c gi tr l 2, nn X - 1 c gi tr l 1. Hp nht X1 vi 1 ta s c gi tr ca X1 l 1. . giaithua(X1,Y1) y mnh giai tha c gi quy. Lu lc ny X1 c gi tr l 1, Y1 l bin mi cha c gi tr, v vy nhim v ca h thng l tm gi tr ca Y1 sao cho sub-clause
22

Hng dn s dng BProlog

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

Hng dn s dng BProlog

Chng VIII. Danh sch trn Prolog


Danh sch l kiu d liu cu trc c bit trn Prolog. C th hiu danh sch nh mt kiu dy mt chiu, v phn t ca danh sch c th thuc v kiu d liu bt k, tuy nhin cc phn t trong cng mt danh sch phi cng kiu.

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

Hng dn s dng BProlog

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

Hng dn s dng BProlog

Chng IX.

Lp trnh quy vi danh sch trn Prolog

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

Hng dn s dng BProlog

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

Hng dn s dng BProlog

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

Hng dn s dng BProlog

Chng X.

Danh sch hai chiu

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

PHN II. LISP

Hng dn s dng Lisp

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

Ngn ng thng dch


Biu thc nh gi tr li

V d:
31

Hng dn s dng Lisp * (+ 3 4) 7 * (+ (* 3 4)(- 5 2)) 15 *4 4

2. Kiu d liu
Lisp thao tc trn cc loi d liu:

Biu thc Danh sch

expression::= atom | list list::= (expression1...expressionn)

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

Hng dn s dng Lisp

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.

II.1 Cc khi nim c bn 1. Bt u vi LISP


i vi phn ln ngn ng lp trnh, cch tt nht hc l bt u vi mt chng trnh n gin. Trong phn ny, chng ta s lm quen vi mt s khi nim c bn trong LISP. bt u, chng ta tng tng ta ang ngi trc mn hnh vi tnh. Khi LISP khng thc hin mt thao tc g, n trng thi tnh. Khi , LISP hin th du nhc cho bit n ang i chng ta g lnh vo. Trong phn ln cc h COMMON LISP hin nay, du nhc chng trnh l du sao.
*

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)

2. Hm v d liu trong LISP


Lisp l ngn ng c trng cho vic x l danh sch Chng trnh c biu din bng cc danh sch v c th thao tc trn nh d liu (+ (* 3 4) (- 5 2)) chng trnh: hm + p dng vo hai i s d liu: danh sch gm ba thnh phn top-level, khi ng vai tr l i s ca mt hm, mt danh sch lun c xem nh l s p dng mt hm.

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

Gi tr ca (eval Exp) l Exp

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

Hng dn s dng Lisp

REST tr v danh sch theo sau phn t u tin


Cho n gn y, phn ln lp trnh vin LISP vn dng CAR v CDR thay cho FIRST v REST. Ngoi chc nng tng t, CAR v CDR c th kt hp vi nhau.thnh dng phc hp CxxR, CxxxR hay CxxxxR. Mi x tng trng cho A CAR hay D CDR. Quy c:
* (car nil) NIL * (cdr nil) NIL

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

2. CONS, APPEND, LIST LIST tr v danh sch cc i s


* (list a (+ 3 1) c) (a 4 c) * (list (a b) (c d)) ((a b) (c d)) * (list a nil) (a nil)

CONS thm mt phn t vo u danh sch


(cons a (2 3)) (a 2 3) (cons `(a b) (c d)) ((ab) c d) (list `a nil)

35

Hng dn s dng Lisp (a)

(CAR (CONS a l)) = a (CDR (CONS a l)) = l


Bt. Cho bit gi tr ca cc biu thc sau: 1. (cons a (cons b (cons c nil)))
(cons a (cons b (cons c nil))) = (cons a (cons b (c))) = (cons a (b c)) = (a b c)

2. (list (car (car ((1) (2)))) (cdr (cdr ((1) (2)))))


(list (car (car ((1) (2)))) (cdr (cdr ((1) (2))))) = (list car (cdr (cdr ((1) (2))))) = (list car (cdr ((2)))) = (list car nil) = (list car nil) = (car nil)

APPEND kt hp cc phn t ca mi danh sch cho


(setq l1 (a b) l2 (x y)) = (x y) (append l1 l2) = (a b x y) (append l1 () l2 ()) = (a b x y)

3. NTHCDR, BUTLAST v LAST NTHCDR ct n phn t u danh sch, vi thng s u ch s phn t cn ct


* (setq l (a b c d e)) (a b c d e) * (nthcdr 2 l) (c d e)

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

LAST tr v danh sch tt c phn t tr phn t cui cng b loi ra


* (setq l (a b c d e) l1 ((a b) (c d)))

36

Hng dn s dng Lisp ((a b) (c d)) * (last l) (e) * (last l1) ((c d))

4. LENGTH v REVERSE LENGTH tr v chiu di ca chui


* (setq l (a b c d e)) (a b c d e) * (length l) 5

REVERSE tr v chui nghch o


* (setq l (a b c d e)) (a b c d e) * (reverse l) (e d c b a)

II.3 Thao tc trn Integer, Ratio, Floating-Point Numbers, ...


* (/ 1.234321 1.111) 1.111 * (/ 27 9) 3 * (\\ 10 4) 2

Tuy nhin vi trng hp chia khng chn, kt qu l mt phn s:


* (/ 22 7) 22/7

Dng FLOAT nu mun kt qu tr v l s thc c du phy ng:


(float (/ 22 7)) 3.14286

Dng ROUND lm trn kt qu:


* (round (/ 22 7)) 3 1/7 ;Thng s nguyn gn nht ;Phn d

* (+ round (/ 22 7)) (round (7/3))) 5 * (round (/ 5 2)) 2

Mt s hm tnh ton hc:


* (MAX 2 4 3) 4 * (MIN 2 4 3) 2

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

(setf sarah ((height .54) (weight 4.4)))

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:

(ASSOC <key> <asociation list>)


V d:
* (setf Andrew ((height .74) (weight 6.4))) ((HEIGHT 0.74) (WEIGHT 6.4)) * (assoc height Andrew) (HEIGHT 0.74)

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

Hng dn s dng Lisp

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

funcall cho php gi cc hm tnh ton

39

Hng dn s dng Lisp

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.

III.1 nh ngha hm Chng trnh quy trong Lisp


Trong Lisp, chng ta nh ngha hm bng t kha defun: (defun <tn> <danh sch i s> <thn hm>) <tn> k hiu <danh sch i s> i din cho cc bin <thn hm> biu thc V d:
* (defun square (x) (* x x)) SQUARE * (square 3) 9 * (defun abs(x) (if (>= x 0) x (* -1 x) ) ) ABS

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

nh ngha quy ca giai tha: n! = 1*2*...*n-1 *n

n!=n* (n-1) nu n2 0!=1 (n-1)!


40

Hng dn s dng Lisp

Trong Lisp:
(defun fac(n) (if (= n 0) 1 (* n fac (1- n)) ) )

Bi tp: 3. Vit hm in ra phn t th n trong danh sch


(defun nth (if (= n (car (nth (n l) 1) l) (1- n) (cdr l)) ) )

4. V d quy cho hay li gi quy:


(defun pair (n) (or (= n 0) (impair (1- n)) ) ) (defun impair (n) (and (<> n 0) (pair (1- n)) ) )

III.2 Bin cc b 1. LET


(let ((var1 exp1) (varm expm)) expm+1 expn) Chng ta gn cho mi bin gi tr ca biu thc tng ng, sau ta nh gi (progn expm+1 expn) V d:
* (let ((x (fac 4))) (* x x)) = 576

Cc bin cc b che ph cc bin ton cc


* (setq x 5) 5 * (let ((x 1)) x) = 1 * x 5 * (let ((x 1)) (setq x 2) x) 2 *x 5

Cc bin cc b che ph cc i s ca mt hm
* (defun foo(x) (let ((x 1)) x ) ) FOO * (foo 4)

41

Hng dn s dng Lisp 1

Cc lin kt c thc hin song song


* (defun bar(x) (let ((x 1) (y (1+ x))) y) ) BAR * (bar 4) 5

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

let* tng ng vi let lng nhau


* (defun bar(x) (let ((x 1)) (let ((y (1+ x))) y) ) ) BAR

42

Hng dn s dng Lisp

Chng IV.

Cc v t v biu thc iu kin

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

IV.2 Cc php so snh: EQUAL, EQ, EQL v =


EQUAL kim tra xem hai i s v xem gi tr ca chng c cng mt biu thc biu din hay khng. EQUAL dng cho c atom v danh sch.
* (equal (+ 2 2) 4) T * (equal (+ 2 3) 3) NIL * (equal (this is a list) (setf l (this is a list))) T * (equal (this is a list) l) T * (equal (this is a list) (setf reverse-of-l (list a is this))) NIL * (equal l (reverse reverse-of-l)) T

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

Hng dn s dng Lisp

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

Cc s khng cng kiu tha =:


* (= 4 4.0) T

Cc i s cho = phi c kiu s. Bt k mt kiu no khc s dn n sinh ra li.

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

IV.4 V t NULL v ENDP


Ngoi v t LISTP, cc v t quan trng nht trn danh sch l: V t null endp V d:
* (null (this is not empty)) NIL * (endp (this is not empty)) NIL * (null ()) T * (endp ()) T * (null this-is-a-symbol) NIL * (endp this-is-a-symbol) ERROR: ENDP: wrong type argument: THIS-IS-A-SYMBOL A CONS or NIL was expected

Mc ch i s ca v t l mt danh sch rng ? i s ca v t (phi l danh sch) l mt danh sch rng ?

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.

IV.5 Cc v t xc nh kiu d liu


Trong LISP, kiu c gn cho d liu ch khng phi cho bin. Ta c th bit kiu d liu ca bin nh vo cc v t (prdicat) V t atom numberp symbolp Mc ch i s c phi l mt atom ? i s c phi l mt s ? i s c phi l mt k hiu ?
45

Hng dn s dng Lisp

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

i s c phi l mt chui ? i s c phi l mt danh sch ?

* (listp (this is a list with pi in it)) T

NIL tng ng vi danh sch rng


NIL v danh sch rng, ( ), hon ton tng ng v tha mn tt c cc v t EQ, EQL, v EQUAL.
* (eq nil ()) T * (eql nil ()) T * (equal nil ()) T

C NIL v danh sch rng u c in l NIL.


* nil NIL * () 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

Hng dn s dng Lisp

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

PLUSP kim tra mt s c phi l s dng hay khng.


* (plusp one) T * (plusp (- one)) NIL * (plusp zero) NIL

EVENP kim tra mt s c phi l s chn hay khng.


* (evenp two) T * (evenp (* 9 7 5 3 1)) NIL * (evenp (* 10 8 6 4 2)) T

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

IV.7 Cc ton t logic 1. AND


(and E1 E2 ... En) l sai nu t nht mt Ei sai AND nh gi cc i s t tri sang phi v ch dng khi gp mt i s sai Nu mi thng s u ng, AND tr v thng s cui cng
48

Hng dn s dng Lisp

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.

IV.8 Cc dng iu kin 1. IF, WHEN v UNLESS


(if E1 E2 E3) Nu E1 ng, tr v gi tr E2 nu khng tr v gi tr E3 V d:
* (if (numberp 1) (a number) (not a number)) (A NUMBER) * (if (numberp a) (a number) (not a number)) (NOT A NUMBER)

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

Hng dn s dng Lisp

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

Hng dn s dng Lisp

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

V d trn c vit li di dng CASE nh sau.


* (case thing (circle (* pi r r)) (sphere (* 4 pi r r))) ;k hiu THING s c nh gi ;k hiu CIRCLE cha c nh gi ;k hiu SPHERE cha c nh gi

52

Hng dn s dng Lisp

Chng V.

Tru tng ha d liu

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.

V.1 Cc trng ca mt k hiu


K hiu l mt i tng bao gm nhiu trng:

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

CVAL FVAL FTYPE PNAME

* (defun foo(x) ) FOO

V.2 Doublets 1. Doublets


Mt danh sch khng rng c biu din bng mt i tng c hai trng gi l doublet
trng trng car cdr phn cn li

phn t u

53

Hng dn s dng Lisp

Tng t nh vy, danh sch (1 2 3) c th hin bi:


nil

Hay n gin hn: 1 2 3 nil

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

3. K hiu pointed pair


K hiu danh sch l vit tt ca k hiu pointed pair
*(1 . nil) (1) *(1 . (2 . (3 . nil))) (1 2 3)

Ni chung, chng ta c: (exp.(exp1 expN))=(exp exp1 expN) Chng ta c th kt hp hai li k hiu:


* (1 . (2 3)) (1 2 3) * (1 . (2 . 3)) (1 2 . 3)

4. Doublets trong LISP


Mi biu thc trong Lisp l mt doublet hay mt atom expression ::= (expression.expression) | atom Consp l mt v t kim tra thng s ca n c l mt doublet hay khng
(defun listp(p) (or (null x) (consp x) ) )

54

Hng dn s dng Lisp

V.3 Li gi hm tnh ton 1. Apply


(apply F L) p dng hm F trn cc phn t ca danh sch L
* (apply append ((a b) (c d))) (a b c d) * (apply + (1 2)) 3 * (setq a *) * * (apply a (3 4)) 12

(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

Lu : Trong Lisp n tr (nh Scheme), chng ta c th vit trc tip:


* (a (+ 3 4) 5) = 12

v c s nh gi hm Bt. m s k hiu, s hay chui trong mt list


(defun count(test l) (if (null l) 0 (if (funcall test (car l)) (1+ (count test (cdr l))) (count test (cdr l)) ) ) )

Bt. m s k hiu, s hay chui trong mt list

55

Hng dn s dng Lisp

V.4 Hm v danh 1. Lambda expression


Dng hm count m s s nguyn nh hn 10 trong danh sch.
* (defun inf10(x) (and (integerp x) (< x 10)) ) INF10 * (count inf10 (4 12 a 11 3)) 2

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

C th trc tip nh ngha lambda-expression khi x l:


* (+ 10 ((lambda (x) (* x x)) 4) ) 26

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

Hng dn s dng Lisp

Chng VI.

Lp trn s v trn danh sch

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

VI.1 Cc cu trc lp 1. DOTIMES


L cch n gin v thng dng nht thc hin mt vng lp, c c php chung nh sau:

(dotimes (<count parameter> <upper-bound form> <result form>) <body>)


Khi thc hin DOTIMES, u tin upper-bound-form c nh gi v tr v kt qu l mt s n. Sau , cc s t 0 n n-1 c gn ln lt cho tham s m count. V th tham s m count c gn n ln. minh ha, chng ta xt mt chng trnh tnh ly tha, nhng ln ny ly tha c xt theo cch thc lp thay v quy: mn = m m ... m DOTIMES l cch chng ta hin thc chng trnh lp tnh ly tha bi v n gip chng ta thc hin cng vic vic mt s ln nht nh.
(defun dotimes-expt(m n) (let ((result 1)) (dotimes (count n result) (setf result (* m result)) ) ) )

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.

2. DOLIST H tr lp trn danh sch


Tng t nh DOTIMES, nhng cc phn t ca danh sch c gn ln lt cho tham s, c c php chung nh sau:

(dolist (<element parameter> <list form> <result form>) <body>)

57

Hng dn s dng Lisp

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

Hng dn s dng Lisp

3. DO tng qut hn DOLIST v DOTIMES


DO c dng khi DOLIST v DOTIMES khng tnh mm do.

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

VI.2 Cc dng c bit 1. progn


(progn 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 En
* (progn (setq x (a b c)) (append x x) ) (A B C A B C) * (progn) NIL

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

Hng dn s dng Lisp * (prog1 (setq x (a b c)) (append x x) ) (A B C)

60

Hng dn s dng Lisp

Chng VII. Cc thao tc vi tp tin


Trong cc phn trc, chng ta bit nh ngha hm thc hin cng vic ca mnh, chng ta bt u mun bit lm th no lu li cc hm v x l mnh to ra. Chng ny s gii thch lm th no lu li cc nh ngha di dng tp tin ta c th s dng li sau ny.

VII.1 Lu li tp tin chng trnh v d liu


to mi mt tp tin hay sa i mt tp tin c sn, chng ta dng ED (vit tt ca editor). (ed name) ED s m trnh son tho son chng trnh (cc lnh, nh ngha hm, ) trn . Sau , nh gi mt tp tin, tr v LISP v dng LOAD. (load name tn hay ng dn n file cha nh ngha hm

(read) c mt biu thc v tr v kt qu


* (+ (read) 3) * 4 = 7 * (read) * (+ 3 4) = (+ 3 4)

VII.2 Bin dch tp tin


Mt khi lu li mt tp tin cha y cc nh ngha LISP, bn c th dng ngay cc nh ngha hoc dch chng sang tp lnh my tnh. Khi chng ta dng cch th nht, ngha l khng cn dch, trnh thng dch LISP (LISP interpreter) s thng xuyn tham chiu n cc nh ngha trong chng trnh v, theo cc nh ngha , tng dng mt, tnh ton kt qu mt cch tng minh i vi mi dng. Khi dng cch th hai, trnh thng dch LISP (LISP compiler), cc nh ngha trong chng trnh ca bn s c chuyn thnh mt tp lnh hon ton khc tp lnh my tnh. dng nhng nh ngha ny, LISP s gi tp lnh my tnh c chuyn bng lnh COMPILE. V d: (compile name)

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

untrace cho php tr v s thc hin bnh thng ca hm


* (untrace fac) (FAC) * (fac 2) 2

trace cp nht nh ngha hm theo vt bng cch in ra kt qu tng giai on


c th theo di s thc hin nhiu hm cng lc

62

Hng dn s dng Lisp

Chng VIII. Ci t v s dng gcLisp


VIII.1 Ci t
Download GC-Lisp t trang web mn hc. Double-click gii nn file. Chn extract vo C:\ Click nt Extract

VIII.2 Startup Gclisp


Trn ca s Windows, chn menu Start -> Run v nh vo C:\GcLisp\gclisp.exe Hay double-click GcLisp.exe load trong th mc C:\GcLisp Chng ta s thy ca s gclisp nh sau:

VIII.3 Phm nng


<Alt>-H <Alt>-E gip i vo LISP Explorer

<Ctrl>-E <F1>

dng trnh son tho GMACS (kim tra du ngoc) ra khi mi trng son tho
63

Hng dn s dng Lisp

<F8> <F9> <F10>

load mt file vo trnh son tho lu mt file save file vi tn khc

VIII.4 Dng lnh


nh cc dng lnh theo sau k hiu *

VIII.5 Lnh tin t (Prefix command)


Mi lnh u nm gia du ngoc n ( ) Lisp s nh gi (evaluate) khi chng ta nh ) Lnh c dng tin t:

(function <parameter>) VIII.6 Ca s son tho GMAC


Nhn Ctrl-E i vo ca s son tho GMAC Nhn <F9> lu file v <F1> quay tr li GcLisp

VIII.7 Load file vo gclisp


V d: load first.lsp

* (load first)

64

Hng dn s dng Lisp

65

PHN III.

SMALLTALK

Hng dn s dng SmallTalk

Chng I.

L THUYT V OOP V NGN NG SMALLTALK

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

Hng dn s dng SmallTalk

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

Thuc tnh thng, thuc tnh lp Ni dung phng thc

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

Hng dn s dng SmallTalk

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

Hng dn s dng SmallTalk

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:

u tin gia cc thng ip:


Trong mt cu lnh nu c nhiu loi thng ip cng xut hin, cc thng ip c t trong cp du (, ) s thc hin trc, sau th t s l unary -> binary->keyword message V d: abcd size + 2 and: 10 abcd size + (2 and: 10) 2 6

5.

Cu lnh (statement) - kch bn (script)

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

Hng dn s dng SmallTalk

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.

Che giu thng tin (hiding information)

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.

S tha k (inheritance) - Che ph (override) - S dn xut (derivation) - Mi quan h gia cc i tng: cy cc lp

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

Hng dn s dng SmallTalk

8.

Tnh a hnh (polymorphism) - S rng buc mun (late - binding)

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

Hng dn s dng SmallTalk

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.

Cc literal - object: Integer, Float, Character, Boolean, Array, String, Context

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

Hng dn s dng SmallTalk

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

Hng dn s dng SmallTalk

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 object mi. Cc phng thc new v new:

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

Hng dn s dng SmallTalk

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.

Bn trong phng thc - Cc t kha self v super

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

Hng dn s dng SmallTalk

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

Hng dn s dng SmallTalk

^ 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 primitive

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.

Khi nim v MetaClass - S dng MetaClass - Lp trnh OOP ng (dynamic) vi Smalltalk

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

Hng dn s dng SmallTalk

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.

Cc lp c bit: Compiler, Window, ViewManager, Prompter...

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.

Mt s k thut lp trnh cn bn trn Smalltalk S m phng cc cu trc iu khin.


Mc d thun ty l lp trnh OOP, cc cu lnh u l cc hnh vi gi cc thng ip n cc i tng, nhng Smalltalk vn cung cp mt s thng ip ngi s dng c th m phng cc cu trc iu khin nh iu kin, lp tng t nh cc ngn ng lp trnh cu trc. . Cu trc iu kin Phng thc ifTrue: i tng nhn thng ip l mt i tng thuc lp Boolean, c i s l mt Context C. Ni dung ca C s c thc thi khi gi tr ca i tng nhn thng ip l true. Xem thm ifFalse:, ifTrue:ifFalse:, ifFalse:ifTrue: vi ni dung tng t. V d: |a| a:= 2. a > 1 ifTrue: [a:= a+1]. ^a Kt qu s l 3 .Cu trc lp. + Lp theo iu kin lun l: Phng thc whileTrue: i tng nhn thng ip l mt Context C, v i s l mt Context C2, trong khi gi tr ca C khi c tnh vn cn l true th ni dung ca C2 vn tip tc c thc thi. V d:
79

Hng dn s dng SmallTalk

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

Thao tc trn tp hp (collection). Mt s k thut x l trn tp hp.


Smalltalk cung cp mt s phng thc vit sn x l tp hp kh hu hiu. Cc tp hp l cc lp c dn xut t lp Collection, trong quan trng l cc lp Array v
80

Hng dn s dng SmallTalk

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

Hng dn s dng SmallTalk

|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

Hng dn s dng SmallTalk

Chng II.

HNG DN S DNG VWIN VERSION 2.0

II.1

Hng dn s dng chng trnh VWIN:


Khi thc thi, chng trnh s hin ra ca s Transcript c giao din vi cc chc nng nh sau:

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.

Thao tc trn h thng lp

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

Hng dn s dng SmallTalk

Ca s m t cy cc lp ang tn ti

Ca s m t cc phng thc Ca s m t cc thuc tnh Ca s m t ni dung phng thc/ lp ang la chn

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

Hng dn s dng SmallTalk

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.

To thuc tnh mi:

85

Hng dn s dng SmallTalk

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 thc th ca lp A

Thuc tnh lp ca lp A

To phng thc mi:

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

Hng dn s dng SmallTalk

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.

Ch thch Tn method Bin cc b Son tho phn thn ca method

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

Hng dn s dng SmallTalk

Thc thi phng thc kim tra phng thc, ngi ta thng vit mt on script trong ca s Transcript (Xem phn II.1).

3.

Load v Save file.


Load file:

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

Hng dn s dng SmallTalk

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

Hng dn s dng SmallTalk

Vt (trnh t) ca cc i tng v phng thc

Cc bin tm

Gi tr ca cc bin tm tng ng

Dng gy ra li khi thc thi phng thc Doit ca lp UndefinedObject.

II.2 1.

Gii thiu v mt s lp c sn ca VWIN Lp Object


Lp ny s cung cp nhng chc nng c bn nht cho mt lp ca Smalltalk isFloat isCharacter isCollection isArray isString Cc phng thc c xy dng sn: isInteger

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

Hng dn s dng SmallTalk

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.

Lp Number, Integer, Float, Character

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:

Lp con ca lp Collection, trong cc phn t ca tp hp c th sp th t. Lp ny c hai lp con l Array m t mt dy cc i tng v String, m t mt dy cc k t. ,


91

Hng dn s dng SmallTalk

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

Hng dn s dng SmallTalk

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

Hng dn s dng SmallTalk

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

Hng dn s dng SmallTalk

|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

Hng dn s dng SmallTalk

Chng III.

MT S K THUT LP TRNH CN BN BI TP

VI LP COLLECTION TRN SMALLTALK - V D V

III.1 S dng phng thc do: 1. V d:


Tnh tng cc phn t trong mt dy s nguyn. Gii: |a n| a:=#(2 3 4 5 6). n:=0. a do: [:i| n := n+ i]. ^n Tnh tng m ascii ca cc k t s trong mt chui Gii |a n| a:= a1cd4y. n:= 0. a do: [:c| c isDigit ifTrue: [n := n + c asciiValue]]. ^n

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

Hng dn s dng SmallTalk

III.2 S dng phng thc select: hoc reject: 1.

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.

S dng phng thc collect: V d:


To mt dy n s l m0.. m1... m2 mn vi m, n l hai s nguyn Gii: |tmp n m| n:= 5.
97

Hng dn s dng SmallTalk

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

You might also like