Professional Documents
Culture Documents
NH XU T B N
I H C QU C GIA H N I 2004
L p tr n h L g ch t r ong Pr ol og
Prolog l ngn ng l p trnh lgich (Prolog = PROgramming in LOGic) do GS. A. Colmerauer a ra l n u tin nm 1972 t i tr ng i h c Marseille, n c Php. n nm 1980, Prolog nhanh chng c p d ng r ng ri, c ng i Nh t ch n lm ngn ng pht tri n my tnh th h 5. Prolog c ci t trn h u h t cc dng my tnh Unix/Linux, Macintosh, Windows. Prolog cn c g i l ngn ng l p trnh k hi u (symbolic programming) tng t l p trnh hm (functional programming), hay l p trnh phi s (non-numerical programming). Nguyn l l p trnh lgich d a trn php suy di n lgch, lin quan n nh ng khi ni m ton h c nh php h p nh t Herbrand, h p gi i Robinson, lgich Horn, lgich v t b c m t (first order predicate logic), v.v... Prolog r t thch h p gi i quy t nh ng bi ton lin quan n cc i t ng v m i quan h gi a chng. Prolog c ng d ng ch y u trong lnh v c tr tu nhn t o (Artificial Intelligence) nh cng ngh x l tri th c, h chuyn gia, my h c, x l ngn ng , tr chi, v.v... N i dung cu n sch t p trung trnh by c s l thuy t v nh ng k thu t l p trnh c b n trong Prolog, r t thch h p cho sinh vin cc ngnh tin h c v nh ng b n c mu n tm hi u v k thu t l p trnh ng d ng trong lnh v c tr tu nhn t o. V TC GI : T t nghi p ngnh Ton My tnh nm 1979 t i tr ng i h c Bch khoa H N i. T 1979 n nay gi ng d y t i khoa Cng ngh Thng tin, tr ng i h c Bch khoa, i h c N ng. B o v ti n s nm 1991 t i Php. Gi ch c ch nhi m khoa Cng ngh Thng tin 1995-2000. H ng nghin c u chnh : x l ngn ng , x l a ng , l thuy t tnh ton. E-mail: khanhph@vnn.vn
L I NI
Cu n sch ny nh m cung c p c s l thuy t v nh ng phng php l p trnh c b n nh t c a mn h c L p trnh lgich (Programming in Logic). Ng i c s c lm quen v i m t s k thu t l p trnh lgich c ng d ng tng i ph bi n v ch y u trong lnh v c tr tu nhn t o (Artificial Intelligence) nh cng ngh x l tri th c, my h c, h chuyn gia, x l ngn ng t nhin, tr chi, v.v... Cu n sch g m nm chng, trong m i chng, tc gi u c g ng a vo nhi u v d minh h a. N i dung cc chng nh sau : Chng 1 gi i thi u ngn ng l p trnh Prolog d a trn lgich Horn (Horn logic). Ng i c c lm quen v i cc ki u d li u c a Prolog, khi ni m lu t, s ki n v vi t c cc chng trnh Prolog n gi n. Chng 2 trnh by cc m c ngha khc nhau c a m t chng trnh Prolog : ngha lgich, ngha khai bo v ngha th t c, cch Prolog tr l i cc cu h i, cch Prolog lm tho mn cc ch. Chng 3 trnh by cc php ton s h c, php so snh cc i t ng v nh ngha cc hm s d ng php quy trong Prolog. Chng 4 trnh by c u trc danh sch v cc php x l c b n trn danh sch c a Prolog. Chng 5 trnh by k thu t l p trnh nng cao v i Prolog. Ph n ph l c gi i thi u ngn ng l p trnh SWI-Prolog, h ng d n cch ci t s d ng ph n m m ny v m t s chng trnh v d tiu bi u vi t trong SWI Prolog ch y c k t qu . Cu n sch ny dng lm gio trnh cho sinh vin ngnh Tin h c v nh ng b n c mu n tm hi u thm v k thu t l p trnh cho lnh v c tr tu nhn t o. Trong qu trnh bin so n, tc gi nh n c t cc b n ng nghi p nhi u ng gp b ch v m t chuyn mn, nh ng ng vin khch l v m t tinh th n, s gip v bin t p cu n sch c ra i. Tc gi xin c by t lng bi t n su s c. Tc gi cng chn thnh c m n m i ki n ph bnh ng gp c a b n c g n xa v n i dung c a cu n sch ny. N ng, ngy 27/05/2004 Tc gi .
M CL C
CHNG 1 M U V NGN NG PROLOG.................................. 1 I. GI I THI U NGN NG PROLOG.......................................... 1 I.1. Prolog l ngn ng l p trnh lgich .............................................. 1 I.2. C php Prolog ............................................................................ 2 I.2.1. Cc thu t ng .............................................................................. 2 I.2.2. Cc ki u d li u Prolog ............................................................... 3 I.2.3. Ch thch ..................................................................................... 4 II. CC KI U D LI U S C P C A PROLOG.......................... 5 II.1. Cc ki u h ng (tr c ki n) ............................................................. 5 II.1.1. Ki u h ng s ................................................................................ 5 II.1.2. Ki u h ng lgich.......................................................................... 5 II.1.3. Ki u h ng chu i k t .................................................................. 5 II.1.4. Ki u h ng nguyn t .................................................................... 5 II.2. Bi n ............................................................................................. 6 III. S KI N V LU T TRONG PROLOG..................................... 6 III.1. Xy d ng s ki n ......................................................................... 6 III.2. Xy d ng lu t ............................................................................ 10 III.2.1. nh ngha lu t .......................................................................... 10 III.2.2. nh ngha lu t quy............................................................... 16 III.2.3. S d ng bi n trong Prolog ......................................................... 18 IV. KI U D LI U C U TRC C A PROLOG........................... 20 IV.1. nh ngha ki u c u trc c a Prolog........................................... 20 IV.2. So snh v h p nh t cc h ng..................................................... 23 CHNG 3 I. II. II.1. II.2. II.3. II.4. II.5. NG NGHA C A CHNG TRNH PROLOG ................ 31 QUAN H GI A PROLOG V LGICH TON H C ........... 31 CC M C NGHA C A CHNG TRNH PROLOG ........... 32 Ngha khai bo c a chng trnh Prolog .................................... 33 Khi ni m v gi m nh .......................................................... 34 Ngha lgich c a cc m nh .................................................... 35 Ngha th t c c a Prolog............................................................ 37 T h p cc y u t khai bo v th t c ........................................ 47
i
III. III.1. III.2. III.3. III.3.1. III.3.2. CHNG 3 I. I.1. I.2. I.3. II. II.1. II.2. II.3. II.4. III. III.1. III.2. III.3. III.3.1. III.3.2. III.3.3. CHNG 4 I. II. III. III.1. III.1.1. III.1.2. III.1.3. III.1.4. III.1.5. III.1.6. III.2.
V D : CON KH V QU CHU I........................................ 48 Pht bi u bi ton....................................................................... 48 Gi i bi ton v i Prolog ............................................................. 49 S p t th t cc m nh v cc ch ...................................... 54 Nguy c g p cc vng l p v h n............................................... 54 Thay i th t m nh v ch trong chng trnh.................. 56 CC PHP TON V S H C............................................. 65 S H C .................................................................................... 65 Cc php ton s h c ................................................................. 65 Bi u th c s h c ........................................................................ 65 nh ngha cc php ton trong Prolog....................................... 68 CC PHP SO SNH C A PROLOG ..................................... 73 Cc php so snh s h c............................................................. 73 Cc php so snh h ng ............................................................... 75 V t xc nh ki u..................................................................... 77 M t s v t x l h ng .............................................................. 77 NH NGHA HM ................................................................. 79 nh ngha hm s d ng quy................................................. 79 T i u php quy .................................................................... 87 M t s v d khc v quy....................................................... 88 Tm ng i trong m t th c nh h ng ............................ 88 Tnh di ng i trong m t th ........................................ 89 Tnh g n ng cc chu i ............................................................ 90 C U TRC DANH SCH ...................................................... 95 BI U DI N C U TRC DANH SCH ................................... 95 M T S V T X L DANH SCH C A PROLOG........... 98 CC THAO TC C B N TRN DANH SCH .................... 99 Xy d ng l i m t s v t c s n ............................................... 99 Ki m tra m t ph n t c m t trong danh sch............................ 99 Ghp hai danh sch ................................................................. 100 B sung m t ph n t vo danh sch......................................... 104 Lo i b m t ph n t kh i danh sch......................................... 104 Ngh ch o danh sch.............................................................. 105 Danh sch con ......................................................................... 106 Hon v .................................................................................... 107
III.3. III.3.1. III.3.2. III.3.3. CHNG 5 I. I.1. I.2. I.2.1. I.2.2. I.2.3. I.3. I.3.1. I.3.2. II. II.1. II.2. II.3. II.3.1. II.3.2. II.4. II.5. II.5.1. II.5.2. II.5.3. II.5.4. II.5.5. III. III.1. III.2. III.2.1. III.2.2. III.2.3. III.3. III.3.1. III.3.2. III.3.3. III.3.4. III.3.5.
M t s v d v danh sch........................................................ 109 S p x p cc ph n t c a danh sch.......................................... 109 Tnh di c a m t danh sch................................................. 109 T o sinh cc s t nhin........................................................... 111 K THU T L P TRNH PROLOG .................................... 117 NHT C T ............................................................................. 117 Khi ni m nht c t ................................................................... 117 K thu t s d ng nht c t......................................................... 118 T o ch gi b ng nht c t....................................................... 118 Dng nht c t lo i b hon ton quay lui ................................ 119 V d s d ng k thu t nht c t ................................................ 122 Php ph nh .......................................................................... 126 Ph nh b i th t b i ............................................................... 126 S d ng k thu t nht c t v ph nh...................................... 128 S D NG CC C U TRC.................................................. 131 Truy c p thng tin c u trc t m t c s d li u ...................... 132 Tr u t ng ho d li u ............................................................ 136 M ph ng tmat h u h n ....................................................... 138 M ph ng tmat h u h n khng n nh .............................. 138 M ph ng tmat h u h n n nh ........................................ 143 V d : l p k ho ch i du l ch b ng my bay ........................... 144 Bi ton tm qun h u.............................................................. 150 S d ng danh sch to theo hng v c t.............................. 151 S d ng danh sch to theo c t........................................... 155 S d ng to theo hng, c t v cc ng CHO................. 158 K t lu n ................................................................................... 161 B di n d ch Prolog ................................................................. 162 QU TRNH VO-RA V LM VI C V I T P.................. 163 Khi ni m ................................................................................ 163 Lm vi c v i cc t p ................................................................ 164 c v ghi ln t p .................................................................... 164 M t s v d c v ghi ln t p................................................. 167 N p chng trnh Prolog vo b nh ....................................... 171 ng d ng ch lm vi c v i cc t p...................................... 172 nh d ng cc h ng ................................................................. 172 S d ng t p x l cc h ng ...................................................... 173 Thao tc trn cc k t ............................................................. 175 Thao tc trn cc nguyn t ..................................................... 177 M t s v t x l c s d li u ................................................ 180
iii
H NG D N S D NG SWI-PROLOG............................ 200 GI I THIUU SWI-PROLOG ................................................ 194 LAIM VIUC V I SWI-PROLOG ......................................... 195 t cu h i............................................................................... 195 Ch y trnh demo ...................................................................... 196 Ch y trnh demo XPCE............................................................ 197 Cc l nh n (Menu commands).............................................. 198 So n th o chng trnh ............................................................ 200 M T S L NH SWI-PROLOG THNG D NG ................... 201
CHNG 1
uv
ngn ng
Prolog
A program is a theory (in some logic) and computation is deduction from the theory J. A. Robinson Program = data structure + algorithm N. Wirth Algorithm = logic + control R. Kowalski
I.
Gi i thi u ngn ng
Prolog
rolog l ngn ng c s d ng ph bi n nh t trong dng cc ngn ng l p trnh lgich (Prolog c ngha l PROgramming in LOGic). Ngn ng Prolog do gio s ng i Php Alain Colmerauer v nhm nghin c u c a ng xu t l n u tin t i tr ng i h c Marseille u nh ng nm 1970. n nm 1980, Prolog nhanh chng c p d ng r ng ri chu u, c ng i Nh t ch n lm ngn ng pht tri n dng my tnh th h 5. Prolog c ci t trn cc my vi tnh Apple II, IBM-PC, Macintosh. Prolog cn c g i l ngn ng l p trnh k hi u (symbolic programming) tng t cc ngn ng l p trnh hm (functional programming), hay l p trnh phi s (nonnumerical programming). Prolog r t thch h p gi i quy t cc bi ton lin quan n cc i t ng (object) v m i quan h (relation) gi a chng. Prolog c s d ng ph bi n trong lnh v c tr tu nhn t o. Nguyn l l p trnh lgich d a trn cc m nh Horn (Horn logc). M t m nh Horn bi u di n m t s ki n hay m t s vi c no l ng ho c khng ng, x y ra ho c khng x y ra (c ho c khng c, v.v...). V d I.1 : Sau y l m t s m nh Horn : 1. N u m t ng i gi m (v) khn ngoan th ng i h nh phc. 2. Jim l ng i h nh phc. 3. N u X l cha m c a Y v Y l cha m c a Z th X l ng c a Z. 4. Tom l ng c a Sue.
1
5. T t c m i ng i u ch t (ho c N u ai l ng i th ai ph i ch t). 6. Socrat l ng i. Trong cc m nh Horn trn, cc m nh 1, 3, 5 c g i l cc lu t (rule), cc m nh cn l i c g i l cc s ki n (fact). M t chng trnh lgich c th c xem nh l m t c s d li u g m cc m nh Horn, ho c d ng lu t, ho c d ng s ki n, ch ng h n nh t t c cc s ki n v lu t t 1 n 6 trn. Ng i s d ng (NSD) g i ch y m t chng trnh lgich b ng cch t cu h i (query/ question) truy v n trn c s d li u ny, ch ng h n cu h i : Socrat c ch t khng ? (tng ng kh ng nh Socrat ch t ng hay sai ?) M t h th ng lgich s th c hi n chng trnh theo cch suy lu n-tm ki m d a trn v n hi u bi t c l chng trnh - c s d li u, minh ch ng cu h i l m t kh ng nh, l ng (Yes) ho c sai (No). V i cu h i trn, h th ng tm ki m trong c s d li u kh ng nh Socrat ch t v tm th y lu t 5 tho mn (v th). V n d ng lu t 5, h th ng nh n c Socrat l ng i (v n u) chnh l s ki n 5. T , cu tr l i s l : Yes c ngha s ki n Socrat ch t l ng.
u v ngn ng Prolog
hm t c bi t . (d u ch m) bi u di n c u trc danh sch (list). Ki u d li u hm t tng t ki u b n ghi (record) v danh sch (list) tng t ki u m ng (array) trong cc ngn ng l p trnh m nh l nh (C, Pascal...). V d I.2 :
f(5, a, b). student(robert, 1975, info, 2, address(6, 'mal juin', 'Caen')). [a, b, c]
M nh
Prolog quy c vi t sau m i m nh m t d u ch m S ki n : < ... >. (tng ng v i lu t < ... > :- true. ) Lu t : < ... > :- < ... >. Cu h i ?- < ... >. ( ch tng tc c d u nh c l nh)
I.2.2. Cc ki u d
li u Prolog
Hnh 1.1. bi u di n m t s phn l p cc ki u d li u trong Prolog g m ki u d li u s c p v ki u d li u c c u trc. S phn l p ny nh n bi t ki u c a m t i t ng nh b ngoi c php. C php c a Prolog quy nh m i ki u i t ng c m t d ng khc nhau. Prolog khng c n cung c p m t thng tin no khc nh n bi t ki u c a m t i t ng. Trong Prolog, NSD khng c n khai bo ki u d li u. ki u d li u ki u s c p h ng s chu i k t bi n nguyn t ki u ph c h p
Hnh I.1. Cc ki u d li u trong Prolog Cc ki u d li u Prolog c xy d ng t cc k t ASCII : Cc ch ci in hoa A, B, ..., Z v ch ci in th ng a, b, ..., z. Cc ch s 0, 1, ..., 9.
Cc k t
t gi a hai c p
k hi u /* v */ (tng t ngn ng C). V d : /*************************/ /*** y l m t ch thch ***/ /*************************/ Trong tr ng h p mu n t m t ch thch ng n sau m i ph n khai bo Prolog cho n h t dng, c th t tr c m t k hi u %. V d :
%%%%%%%%%%%%%%%%%%%%% % y cng l m t ch thch %%%%%%%%%%%%%%%%%%%%%
II. Cc ki u d
li u s c p c a Prolog
II.1. Cc ki u h ng (tr c ki n)
II.1.1. Ki u h ng s
Prolog s d ng c s nguyn v s th c. C php c a cc s nguyn v s th c r t n gi n, ch ng h n nh cc v d sau :
1 3.14 1515 -0.0035 0 -97 100.2
Tu theo phin b n ci t, Prolog c th x l cc mi n s nguyn v mi n s th c khc nhau. V d trong phin b n Turbo Prolog, mi n s nguyn cho php t -32768 n 32767, mi n s th c cho php t 1e-307 n 1e+308. Cc s th c r t khi c s d ng trong Prolog. L do ch y u ch Prolog l ngn ng l p trnh k hi u, phi s . Cc s nguyn th ng ch c s d ng khi c n m s l ng cc ph n t hi n di n trong m t danh sch Prolog d ng [a1, a2, ..., an ].
u v ngn ng Prolog
II.1.2. Ki u h ng lgich
Prolog s d ng hai h ng lgich c gi tr l true v fail. Thng th ng cc h ng lgich khng c dng nh tham s m c dng nh cc m nh . H ng fail th ng c dng t o sinh l i gi i bi ton.
II.1.3. Ki u h ng chu i k t
Cc h ng l chu i (string) cc k t
"Toto \#\{@ tata" "" "\""
II.1.4. Ki u h ng nguyn t
Cc h ng nguyn t Prolog l chu i k t m t trong ba d ng nh sau : (1) Chu i g m ch ci, ch s v k t _ lun lun c b t u b ng m t ch ci in th ng.
newyork nil x25 a_ x__y tom_cruise
(2) Chu i cc k t
c bi t :
<---> .:. ======> ::== ... (3) chu i t gi a hai d u nhy n (quote) c b t dng phn bi t v i cc tn bi n :
Jerry
u b ng ch in hoa,
Tom SMITH
II.2. Bi n
Tn bi n l m t chu i k t g m ch ci, ch s , b t d u g ch d i dng :
X, Y, A Result, List_of_members _x23, _X, _, ...
u b i ch hoa ho c
III. S
ki n v lu t trong Prolog
III.1. Xy d ng s ki n
V d III.1 : Quan h gia nh xy d ng cc s ki n trong m t chng trnh Prolog, ta l y m t v d v . Ta xy d ng m t cy gia h nh Hnh III.1. Trong cy gia h (a), cc nt ch ng i, cn cc mi tn ch quan h cha m c a (parent of). S ki n Tom l cha m c a Bill c vi t thnh m t v t Prolog nh sau (ch m nh c k t thc b i m t d u ch m) :
parent(tom, bill). % Ch khng c d u cch tr c d u m ngo c
(a)
Hnh III.1.Cy gia h .
(b) nh n c m t
Sau khi h th ng Prolog nh n c chng trnh ny, th c ch t l m t c s d li u, ng i ta c th t ra cc cu h i lin quan n quan h parent. V d
u v ngn ng Prolog
i tho i
Ta ti p t c
t cu h i khc :
?- parent(liz, sue). No
B i v Prolog khng tm th y s ki n Liz l ng i m c a Sue trong chng trnh. Tng t , Prolog tr l i No cho s ki n :
?- parent(tom, ben).
t ra
bi t c ai l con c a Bill, ta ch c n vi t :
?- parent(bill, X).
N u h t phng n tr l i m v n ti p t c yu c u (;), Prolog tr l i No. NSD c th t cc cu h i t ng qut hn, ch ng h n : ai l cha m c a ai ? Ni cch khc, c n tm X v Y sao cho X l cha m c a Y. Ta vi t nh sau :
?- parent(X, Y).
Sau khi hi n th cu tr l i u tin, Prolog s l n l t tm ki m nh ng c p cha m con tho mn v l n l t hi n th k t qu n u ch ng no NSD cn yu c u cho n khi khng cn k t qu l i gi i no n a (k t thc b i Yes) :
X Y X Y = = = = mary bill ->; tom bill ->;
8 X = Y = X = Y = X = Y = X = Y = Yes tom liz ->; bill ann ->; bill sue ->; sue jim
Tu theo ci t Prolog, NSD c th g vo m t d u ch m (.) ho c Enter ch m d t gi a ch ng lu ng tr l i. Ta c th ti p t c a ra nh ng cu h i ph c t p hn khc, ch ng h n ai l ng (b) c a Jim ? Th c t , quan h ng b (grandparent) cha c nh ngha, c n ph i phn tch cu h i ny thnh hai ph n s c p hn : 1. Ai l cha (m ) c a Jim ? Gi s c tn l Y. 2. Ai l cha (m ) c a Y ? Gi s c tn l X.
X parent Y parent jim grandparent
Prolog tr l i :
Y = sue X = bill Yes
v
parent(X, Y).
u v ngn ng Prolog
N u thay i th t hai thnh ph n cu h i, th ngha lgich v n khng thay i v Prolog tr l i cng k t qu (c th thay i v th t ), ngha l ta c th t cu h i nh sau :
?- parent(X, Y), parent(Y, jim). X = bill Y = ng d n Yes
By gi ta
t cu h i ai l chu c a Tom ?
M t cu h i khc c th nh sau : Ann v Sue c cng ng i ng khng ? ngha l ta di n t thnh hai giai o n : 1. Tm X l cha m c a Ann. 2. X tm th y c cng l cha m c a Sue khng ? Cu h i v tr l i trong Prolog nh sau :
?- parent(X, ann), parent(X, sue). X = bill
N u cu tr l i l Yes, th c ngha ch c tho mn, hay thnh cng. Trong tr ng h p ng c l i, cu tr l i l No, c ngha ch khng c tho mn, hay th t b i. N u c nhi u cu tr l i cho m t cu h i, Prolog s a ra cu tr l i u tin v ch yu c u c a NSD ti p t c.
10
III.2.
III.2.1.
Xy d ng lu t
nh ngha lu t
T chng trnh gia h trn y, ta c th d dng b sung cc thng tin khc, ch ng h n b sung cc s ki n v gi i tnh (nam, n ) c a nh ng ng i nu tn trong quan h parent nh sau :
woman(mary). man(tom). man(bill). woman(liz). woman(sue). woman(ann). man(jim).
Ta nh quan n m t nm tc p tnh c a m t
ngha cc quan h n (unary) woman v man v chng ch lin i t ng duy nh t. Cn quan h parent l nh phn, v lin quan i t ng. Nh v y, cc quan h n dng thi t l p m t thu c i t ng. M nh :
woman(mary).
i ng c v i parent nh sau :
, ta
nh ngha lu t m i nh sau :
u v ngn ng Prolog
11
l m t i u g lun ng, khng c i u ki n g rng bu c. Trong khi , cc lu t lin quan n cc thu c tnh ch c tho mn n u m t s i u ki n no c tho mn. M i lu t bao g m hai ph n:
i u ki n, cn c g i l thn u
Th c t , trong chng trnh khng c s ki n no lin quan n con, m ta ph i tm cch p d ng cc lu t. Lu t trn y d ng t ng qut v i cc i t ng X v Y b t k, m ta l i c n cc i t ng c th liz v tom. Ta c n s d ng php th (substitution) b ng cch gn gi tr liz cho bi n Y v tom cho X. Ng i ta ni r ng cc bi n X v Y c rng bu c (bound) :
X = tom
v
Y = liz
Lc ny, ph n i u ki n c gi tr parent(tom, liz) v tr thnh ch con (sub-goal) Prolog thay th cho ch child(liz, tom). Tuy nhin, ch ny tho mn v c gi tr Yes v chnh l s ki n thi t l p trong chng trnh. Sau y, ta ti p t c b sung cc quan h m i. Quan h m mother c ngha nh sau (ch d u ph y ch php h i hay php v lgich) :
mother(X, Y) :- parent(X, Y), woman(X).
nh
12
c hi u l : V i m i X v Y, X l m c a Y n u X l cha (hay m ) c a Y v X l n . th sau y minh ho vi c nh ngha cc quan h child, mother v grandparent s d ng m t quan h khc : Trong th , ng i ta quy c r ng : cc nt tng ng v i cc i t ng (l cc i c a m t quan h ). Cc cung n i cc nt tng ng v i cc quan h nh phn, c nh h ng t i th nh t n i th hai c a quan h . M t quan h n c bi u di n b i tn quan h tng ng v i nhn c a i t ng . Cc quan h c n nh ngha s c bi u di n b i cc cung c nt t. M i th c gi i thch nh sau : n u cc quan h c ch b i cc cung c nt li n c tho mn, th quan h bi u di n b i cung c nt t cng c tho mn.
X parent Y
child
X parent Y
woman mother
Hnh III.3.
thu n ti n cho vi c c chng trnh Prolog, ta c th vi t m t lu t trn nhi u dng, dng u tin l ph n u c a lu t, cc dng ti p theo l ph n thn c a lu t, m i ch trn m t dng phn bi t. By gi quan h grandparent c vi t l i nh sau :
grandparent(X, Z) :parent(X, Y), parent(Y, Z).
Ta ti p t c
13
Hnh III.4.
Ch cch gi i thch i u ki n X v Y c cng cha m : m t Z no ph i l m t cha m c a X, v cng Z ph i l m t cha m c a Y. Hay ni m t cch khc l : Z1 l m t cha m c a X, Z2 l m t cha m c a Y, v Z1 ng nh t v i Z2. An l n , Ann v Sue cng cha m nn Ann l ch em gi c a Sue, ta c :
?- sister(ann, sue). Yes
Prolog s l n l t a ra hai cu tr l i :
X = ann ->; X = sue ->. Yes
V y th Sue l i l em gi c a chnh mnh ?! i u ny sai v ta cha gi i thch r trong nh ngha ch em gi. N u ch d a vo nh ngha trn y th cu tr l i c a Prolog l hon ton h p l. Prolog suy lu n r ng X v Y c th ng nh t v i nhau, m i ng i n b c cng cha m s l em gi c a chnh mnh. Ta c n s a l i nh ngha b ng cch thm vo i u ki n X v Y khc nhau. Nh s th y sau ny, Prolog c nhi u cch gi i quy t, tuy nhin lc ny ta gi s r ng quan h :
different(X, Y)
V d III.2 : Ta l y l i v d c
i n s d ng hai tin
sau y :
14
ny l Socrate ph i
Con ng i c th ni v khng ph i l lo i v t, ta vi t lu t :
speak(X) :- man(X), not(animal(bonzo)).
Ta
t cc cu h i nh sau :
i, sau y,
t cu h i :
Cu tr l i 'It is hot' l ng v c cc s ki n 'It is sunny' v 'It is summer' trong chng trnh. Cn cu h i ?- 'It is cold.' c cu tr l i sai.
u v ngn ng Prolog
15
III.2.2.
nh ngha lu t
quy
By gi ta ti p t c thm m t quan h m i vo chng trnh. Quan h ny ch s d ng quan h parent, v ch c hai lu t. Lu t th nh t nh ngha cc t tin tr c ti p, lu t th hai nh ngha cc t tin gin ti p. Ta ni r ng X l m t t tin gin ti p c a Z n u t n t i m t lin h cha m (ng b) gi a X v Z : Trong cy gia h Hnh III.1, Tom l t tin tr c ti p c a Liz, v t tin gin ti p c a Sue. Ta nh ngha lu t 1 (t tin tr c ti p) nh sau : V i m i X v Z, X l m t t tin c a Z n u X l cha m c a Z .
ancestor(X, Z) :parent(X, Z).
X parent Z (a) parent ancesto r ancestor X parent
parent Y (b)
nh ngha lu t 2 (t tin gin ti p) ph c t p hn, trnh Prolog tr nn di dng hn, m i khi cng m r ng m c t tin h u du nh ch ra trong Hnh III.6. K c lu t 1, ta c quan h t tin c nh ngha nh sau :
ancestor(X, Z) :parent(X, Z). ancestor(X, Z) :parent(X, Y), parent(Y, Z). ancestor(X, Z) :parent(X, Y1), parent(Y1, Y2), parent(Y2, Z). % lu t 1 nh ngha t tin tr c ti p i)
... Tuy nhin, t n t i m t cch nh ngha t tin gin ti p php quy (recursive) nh sau : V i m i X v Z, X l m t t tin c a Z n u t n t i Y sao cho (1) X l cha m c a Y v (2) Y l m t t tin c a Z.
X parent parent Y ancestor parent parent Y1 Y1 ancestor Y2 Y3 Z Z ancestor X X
m c b t k nh
parent
Y2
Hnh III.6. Cc c p t tin h u du gin ti p ancestor(X, Z) :parent(X, Z). ancestor(X, Z) :parent(X, Y), ancestor(Y, Z). ?- ancestor(mary, X). X = jim ->; X = ann ->; X = sue ->; X = bill Yes
cc m c khc nhau.
u v ngn ng Prolog
17
u s d ng
quy,
quy
...
Hnh III.7.D ng
n lc ny, ta nh ngha nhi u quan h (parent, woman, man, grandparent, child, sister, mother v ancestor). Ta th y m i quan h ch tng ng v i m t m nh , tuy nhin, quan h ancestor l i c hai m nh .
ancestor. Trong tr ng h p t t c cc m nh
Cho
Ng i ta ni r ng nh ng m nh
III.2.3. S
d ng bi n trong Prolog
Khi tnh ton, NSD c th thay th m t bi n trong m t m nh b im t i t ng khc. Lc ny ta ni bi n b rng bu c. Cc bi n xu t hi n trong m t m nh c g i l bi n t do. Ng i ta gi thi t r ng cc bi n l c l ng t ton th v c c l v i m i. Tuy hin c nhi u cch gi i thch khc nhau trong tr ng h p cc bi n ch xu t hi n trong ph n bn ph i c a lu t. V d :
haveachil(X) :- parent(X, Y).
c th c c nh sau : (a) V i m i X v Y, n u X l cha (hay m ) c a Y th X c m t ng i con. (b) V i m i X, X c m t ng i con n u t n t i m t Y sao cho X l cha (hay m ) c a Y. Khi m t bi n ch xu t hi n m t l n trong m t m nh th khng c n t tn cho n. Prolog cho php s d ng cc bi n n c danh (anonymous variable) l cc bi n c tn ch l m t d u g ch d i dng _. Ta xt v d sau :
have_a_child(X) :- parent(X, Y).
18
M i v tr xu t hi n d u g ch d i dng _ trong m t m nh tng ng v i m t bi n n c danh m i. V d n u ta mu n th hi n t n t i m t ng i no c con n u t n t i hai i t ng sao cho m t i t ng ny l cha c a i t ng kia, th ta c th vi t :
someone_has_a_child :- parent(_, _).
M nh
ny tng ng v i :
n cha m l g :
T m v c t v ng (lexical scope) c a cc bi n trong m t m nh khng v t ra kh i m nh . C ngha l n u, v d , bi n X15 xu t hi n trong hai m nh khc nhau, th s tng ng v i hai bi n phn bi t nhau. Trong cng m t m nh , X15 lun lun ch bi u di n m t bi n. Tuy nhin i v i cc h ng th tnh hu ng l i khc : m t nguyn t th hi n m t i t ng trong t t c cc m nh , c ngha l trong t t c chng trnh.
IV. Ki u d
IV.1.
li u c u trc c a Prolog
Ki u d li u c c u trc, tng t c u trc b n ghi, l i t ng c nhi u thnh ph n, m i thnh ph n l i c th l m t c u trc. Prolog xem m i thnh ph n nh l m t i t ng khi x l cc c u trc. t h p cc thnh ph n thnh m t i t ng duy nh t, Prolog s d ng cc hm t . V d IV.1 : C u trc g m cc thnh ph n ngy thng nm t o ra hm t date. Ngy 2/9/1952 s c vi t nh sau : date(2, september, 1952)
u v ngn ng Prolog
19
M i thnh ph n trong hm t date u l h ng (hai s nguyn v m t nguyn t ). Tuy nhin ta c th thay th m i thnh ph n b ng m t bi n hay m t c u trc khc. Ch ng h n ta c th thay th thnh ph n th nh t b ng bi n Day (ch tn bi n b t u b i ch hoa) th hi n b t k ngy no c a thng 9 :
date(Day, may, 1890)
Ch r ng Day l m t bi n, c th c rng bu c khi x l sau . Trong Prolog, v m t c php, cc i t ng l nh ng h ng. Trong v d trn, may v date(Day, september, 2003) u l nh ng h ng.
cc tham date i date( Day, september, 2003 ) hm t bi n k hi u (b) s
Hnh IV.1. Ngy thng l m t i t ng c c u trc : (a) bi u di n d ng cy c a c u trc ; (b) gi i thch cch vi t trong Prolog
M i i t ng c c u trc u c th c bi u di n hnh h c d i d ng cy (tree), v i hm t l g c, cn cc thnh ph n tham i l cc nhnh c a cy. N u m t trong cc thnh ph n l m t c u trc, th thnh ph n t o thnh m t cy con c a cy ban u. Hai h ng l c cng c u trc n u c cng cy bi u di n v c cng thnh ph n (pattern of variables). Hm t c a g c c g i l hm t chnh c a h ng. V d IV.2 : C u trc ( n gi n) c a m t cu n sch g m ba thnh ph n tiu v tc gi cng l cc c u trc (con), nm xu t b n l m t bi n :
book(title(Name), author(Author), Year)
V d IV.3 : Xy d ng cc i t ng hnh h c n gi n trong khng gian hai chi u. M i i m c xc nh b i hai to , hai i m t o thnh m t ng th ng, ba i m t o thnh m t tam gic. Ta xy d ng cc hm t sau y : point bi u di n i m, seg bi u di n m t o n th ng (segment), triangle bi u di n m t tam gic.
20
5 IV.2. M t s Hnh
i t ng hnh h c n gi n.
, cc
P1 = point(1, 1) P2 = (2, 3) 3 P2 = point(2, 3) S = seg(P1,2 P2) = seg(point(1, 1), point(2, 3)) (4, point(6, 4), point(7, 1)) T = triangle(point(4, 2), 2)
(7, m N u trong cng m t chng trnh, ta c cc i m trong1) t khng gian ba P1 = (1, 1) chi u, ta c th nh ngha m t hm t m i l point3 nh sau : | 1
point3(X, Y, Z) 1
| 2
| 3
| 4
| 5
| 6
| 7
| 8
Prolog cho php s d ng cng tn hai c u trc khc nhau. V d : point(X1, Y1) v point(X, Y, Z) l hai c u trc khc nhau. Trong cng m t chng trnh, n u m t tn ng hai vai tr khc nhau, nh tr ng h p point trn, th Prolog s cn c vo s l ng i s phn bi t. Cng m t tn ny s tng ng v i hai hm t , m t hm t c hai i s v m t hm t c ba i s . Nh v y, m t hm t c nh ngha b i hai y u t :
P1 = point 1 1 P1 = seg point 1 1 2 point 3 4 2 6 4 7 1 point T = triangle point point
Hnh IV.3. Bi u di n d ng cy c a cc
i t ng.
(1) Tn hm t c c php l c php c a cc nguyn t . (2) Kch th c c a hm t l s cc i s c a n. Bi u di n d ng cy c a cc i t ng i m, o n th ng v tam gic trn y c cho trong Hnh IV.3. Nh trnh by, m i i t ng c u trc c a Prolog u c bi u di n d i d ng cy, xu t hi n trong m t chng trnh d i d ng cc h ng.
* +
a b c
u v ngn ng Prolog
21
V d bi u th c s h c : (a + b) * (c 5) c d ng cy, c th vi t d i d ng bi u th c ti n t g m cc hm t *, + v :
*(+(a, b), (c, 5))
IV.2. So snh v h p nh t cc h ng
Ta v a xt cch bi u di n cc c u trc d li u s d ng h ng. By gi ta s xt php ton quan tr ng nh t lin quan n cc h ng l php so kh p (matching), th c ch t l php so snh (comparison operators) trn cc h ng v cc v t . Trong Prolog, vi c so kh p tng ng v i vi c h p nh t (unification) c nghin c u trong l thuy t lgich. Cho hai h ng, ng i ta ni r ng chng l h p nh t c v i nhau, n u : (1) chng l gi ng h t nhau, ho c (2) cc bi n xu t hi n trong hai h ng c th c rng bu c sao cho cc h ng c a m i i t ng tr nn gi ng h t nhau. Th t chu n (standard order) trn cc h ng c nh ngha nh sau : 1. Bi n < Nguyn t < Chu i < S < H ng 2. Bi n c < Bi n m i 3. Nguyn t c so snh theo th t ABC (alphabetically). 4. Chu i c so snh theo th t ABC. 5. S c so snh theo gi tr (by value). S nguyn v s th c c x l nh nhau (treated identically). 6. Cc h ng ph c h p (compound terms) c so snh b c hay s l ng tham i (arity) tr c, sau so snh tn hm t (functor-name) theo th t ABC v cu i cng so snh m t cch quy (recursively) l n l t cc tham i t tri qua ph i (leftmost argument first). V d hai h ng date(D, M, 1890) v date(D1, May, Y1) l c th v i nhau nh rng bu c sau : D c rng bu c v i D1 M c rng bu c v i May Y1 c rng bu c v i 1890 Trong Prolog, ta c th vi t :
D = D1 M = May Y1 = 1890
22
Tuy nhin, ta khng th rng bu c hai h ng date(D, M, 1890) v date(D1, May, 2000), hay date(X, Y, Z) v point(X, Y, Z). C u trc book(title(Name), author(Author)) c so kh p v i :
book(title(lord_of_the_rings), author(tolkien))
nh php th :
Name = lord_of_the_rings Author = tolkien
Thu t ton h p nh t Herbrand so kh p hai h ng S v T : (1) N u S v T l cc h ng, th S v T ch c th kh p nhau n u v ch n u chng c cng gi tr (ch l m t i t ng). (2) N u S l m t bi n, T l m t i t ng no b t k, th S v T kh p nhau, v i S c rng bu c v i T. Tng t , n u T l m t bi n, th T c rng bu c v i S. (3) N u S v T l cc c u trc, th S v T kh p nhau n u v ch n u : (a) S v T c cng m t hm t chnh, v (b) t t c cc thnh ph n l kh p nhau t ng i m t. Nh v y, s rng bu c c xc nh b i s rng bu c c a cc thnh ph n. Ta c th quan st lu t th ba cch bi u di n cc h ng d i d ng cy trong Hnh IV.5 d i y. Qu trnh so kh p c b t u t g c (hm t chnh). N u hai hm t l gi ng nhau, th qu trnh s c ti p t c v i t ng c p tham i c a chng. M i qu trnh so kh p c xem nh m t dy cc php tnh n gi n hn nh sau :
triangle = triangle point(1, 1) = X A = point(4, Y) point(2, 3) = point(2, Z)
u v ngn ng Prolog
triangle point 1 1 triangle X 4 point Y 2 point Z A 2 point 3
23
Hnh IV.5. K t qu so kh p : triangle(point(1, 1), A, point(2, 3)))= triangle(X, point(4, Y), point(2, Z))).
S rng bu c nh n c nh sau :
X = point(1, 1) A = point(4, Y) Z = 3
Sau y l m t v d minh ho s d ng k thu t so kh p nh n bi t m t o n th ng cho l n m ngang hay th ng ng. M t o n th ng l th ng ng n u honh (abscissa) c a hai mt l b ng nhau, tng t , l n m ngang n u tung (ordinate) c a hai mt l b ng nhau. Ta s d ng quan h n phn bi u di n cc tnh ch t ny nh sau :
vertical(seg(point(X, Y), point(X, Y1))). horizontal(seg(point(X, Y), point(X1, Y))).
Ta c :
?- vertical(seg(point(1, 1), point(1, 2))). Yes ?- vertical(seg(point(1, 1), point(2, Y))). No ?- horizontal(seg(point(1, 1), point(2, Y))). Y = 1 Yes
24
point(X, Y1)
point(X, Y) point(X1, Y)
point(X, Y)
ng.
V i cu h i th nh t, Prolog tr l i Yes v cc s ki n c so kh p ng. V i cu h i th hai, v khng c s ki n no c so kh p nn Prolog tr l i No. V i cu h i th ba, Prolog cho Y gi tr 1 c so kh p ng. Ta c th t m t cu h i t ng qut hn nh sau : Cho bi t nh ng o n th ng th ng ng c m t mt cho tr c l (2, 3) ?
?- vertical(seg(point(2, 3), P)). P = point(2, _0104) Yes
Cu tr l i c ngha l m i ng th ng c phng trnh X = 2 l th ng ng. Ch r ng y, ta khng nh n c tn bi n nh mong mu n (l Y), m tu theo phin b n ci t c th , Prolog s t o ra m t tn bi n khi th c hi n chng trnh, _0104 trong v d trn, nh m trnh t l i tn bi n c a NSD v i hai l do nh sau. Th nh t, cng m t tn bi n nhng xu t hi n trong cc m nh khc nhau th s bi u di n nh ng bi n khc nhau. Th hai, do khi p d ng lin ti p cng m t m nh , chnh b n copy c s d ng v i m t b bi n khc. By gi ta t ti p m t cu h i th v nh sau : C t n t i m t o n th ng v a th ng ng v a n m ngang hay khng ?
?- vertical(S), horizontal(S). S = seg(point(_00E8, _00EC), point(_00E8, _00EC)) Yes
Cu tr l i c ngha l m i o n th ng khi suy bi n thnh m t i m th v a th ng ng, l i v a n m ngang. Ta th y r ng k t qu nh n c l nh so kh p. y, cc tn bi n _00E8 v _00EC, tng ng v i X v Y, c t o ra b i Prolog.
u v ngn ng Prolog
25
Tm t t chng 1
Chng 1 trnh by nh ng y u t s c p c a Prolog, r t g n gi v i lgich hnh th c. Nh ng i m quan tr ng m ta c c l : Nh ng i t ng s c p c a Prolog l nguyn t , bi n v s . Cc i t ng c c u trc, hay c u trc, dng bi u di n cc i t ng c nhi u thnh ph n. Cc hm t dng xy d ng cc c u trc. M i hm t c nh ngha b i tn v th nguyn (dimension). Ki u c a m t i t ng c nh ngha hon ton nh vo s xu t hi n v m t c php c a n. T m v c t v ng (lexical scope) c a m t bi n l duy nh t m nh m bi n xu t hi n. Cng m t tn bi n xu t hi n trong hai m nh s tng ng v i hai bi n khc nhau. Cc c u trc c bi u di n r t n gi n b i cc cy. Prolog c xem nh l m t ngn ng x l cy. Php ton so kh p so snh hai ph n t (term) v tm cch ng nh t chng b i cc rng bu c c a chng. N u so kh p thnh cng, Prolog a ra rng bu c cc bi n t ng qut nh t. Nh ng khi ni m trnh by l : m nh , s ki n, lu t, cu h i, nguyn t , bi n, bi n rng bu c, ph n u v ph n thn c a c a m t m nh ,
26
lu t quy, nh ngha quy, ch, i t ng : nguyn t , s , bi n, h ng c u trc hm t , th nguyn c a m t hm t hm t chnh c a m t h ng so kh p cc h ng rng bu c t ng qut nh t
Bi t p chng 1
1. Tm cc i t ng Prolog ng n v m t c php trong s i t ng c cho d i y. Cho bi t ki u c a chng (l nguyn t , s , bi n hay c u trc) ?
a) b) c) d) e) f) g) h) i) j) Diane diane Diane _diane Diane va en vacances va( diane, vacances ) 45 5(X , Y) +( nord , owest ) three( small( cats ) )
2. Hy tm m t bi u di n d ng i t ng c u trc cho cc hnh ch nh t, hnh vung v hnh trn. Xem hnh 2.4 c cch gi i quy t. S d ng cc bi u di n cho cc hnh c th minh h a. 3. Chng trnh sau ni r ng hai ng i l c quan h dng h v i nhau n u :
a) m t l t tin c a ng i kia, ho c, b) hai ng i c chung t tin, ho c, c) hai ng i c cng con chu. kindred( X, Y) :ancestor(X , kindred(X , Y) :ancestor(X , kindred(X , Y) :ancestor( Z, ancestor(Z , Y). Y). % X v Y c cng t tin X), Y).
u v ngn ng Prolog kindred(X , Y) :% X v Y c cng con chu ancestor (X , Z), ancestor(Y , Z).
27
nh ngha ny c ng hay khng ? C th thay i l i s cho trong hnh 1.7 tng ng v i nh ngha m i ny ? 5. Ngoi cc nh ngha quan h gia nh c trong ph n l thuy t v bi t p, hy nh ngha cc quan h khc theo t p qun Vi t Nam (c, d, ch, bc...) ? 6. Hy nh ngha cc quan h trong th gi i sinh v t ( ng v t, th c v t) ? 7. Cho bi t cc h ng Prolog h p th c sau y (valid Prolog terms) :
23 foo(X, bar(+(3, 4))) Foo(x) +(fred, jim) 1+2. Alison Cawsey
a) ?- parent(jim , X). b) ?- parent( X , jim). c) ?- parent(mary , X) , parent( X , part). d) ?- parent(mary , X) , parent( X , y ) , parent(y , jim).
t cc m nh Prolog di n t cc cu h i lin quan n quan h parent : Ai l cha m c a Sue ? Liz c con khng ? Ai l ng b (grandparent) c a Sue ? t trong Prolog cc m nh sau : Ai c m t a tr ng i l h nh phc. H ng d n : Xy d ng quan h m t ngi happy. b) V i m i X, n u X c m t con m ng i con ny c m t ch em gi, th X c hai con (xy d ng quan h have_two_children). 11. nh ngha quan h grandchild b ng cch s d ng quan h parent. H ng d n : tm hi u quan h grandparent.
9. Vi a) b) c) 10. Vi a)
28
12.
nh ngha quan h aunt( X, Y ) b ng cch s d ng quan h parent. thu n ti n, c th v s minh h a. 13. Cc php so kh p d i y c ng khng ? N u ng, cho bi t cc rng bu c bi n tng ng ?
a) point( A , B ) = point( 1 b) point( A , B ) = point( X c) addition( 2 , 2 ) = 4 d) +( 2 , D ) = +( E , 2 ) e) triangle( point( -1 , 0 ) P1, point( 1, 0 ), point( , 2 ) , Y, Z )
, P2, P3 ) = triangle( 0, Y ) )
Cc rng bu c y nh ngha m t l p cc tam gic. Lm cch no m t l p ny ? 14. S d ng m t cc ng th ng cho trong bi h c, tm m t h ng bi u di n m i ng th ng ng X = 5. 15. Cho hnh ch nh t c bi u di n b i h ng: rectangle(P1, P2, P3,
P4). V i Pi l cc
nh ngha quan
h :
regular( R ) l ng n u R l m t hnh ch nh t c cc c nh th ng
ng v n m ngang
(song song v i cc tr c t a
).
CHNG 2
Ng
I.
Prolog c quan h ch t ch v i lgich ton h c. D a vo lgich ton h c, ng i ta c th di n t c php v ngha c a Prolog m t cch ng n g n v sc tch. Tuy nhin khng v v y m nh ng ng i h c l p trnh Prolog c n ph i bi t m t s khi ni m v lgich ton h c. Th t may m n l nh ng khi ni m v lgich ton h c khng th c s c n thi t c th hi u v s d ng Prolog nh l m t cng c l p trnh. Sau y l m t s quan h gi a Prolog v lgich ton h c. Prolog c c php l nh ng cng th c lgich v t b c m t (first order predicate logic), c vi t d i d ng cc m nh (cc l ng t v khng xu t hi n m t cch t ng minh), nhng h n ch ch n thu n d ng m nh Horn, l nh ng m nh ch c t nh t m t tr c ki n dng (positive literals). Nm 1981, Clocksin v Mellish a ra m t chng trnh Prolog chuy n cc cng th c tnh v t b c m t thnh d ng cc m nh . Cch Prolog di n gi i chng trnh l theo ki u Ton h c : Prolog xem cc s ki n v cc lu t nh l cc tin , xem cu h i c a NSD nh l m t nh l c n ph ng on. Prolog s tm cch ch ng minh nh l ny, ngha l ch ra r ng nh l c th c suy lu n m t cch lgich t cc tin . V m t th t c, Prolog s d ng phng php suy di n quay lui (back chaining) h p gi i (resolution) bi ton, c g i l chi n l c h p gi i SLD (Selected, Linear, Definite : Linear resolution with a Selection function for Definite sentences) do J. Herbrand v A. Robinson xu t nm 1995. C th tm t t nh sau :
P(t)
ch ng minh P(a), ng i ta tm s ki n
ho c m t lu t :
P(t) :- L1, L2, , Ln
29
30
sao cho a c th h p nh t (unifiable) c v i t nh so kh p. N u tm c P(t) l s ki n nh v y, vi c ch ng minh k t thc. Cn n u tm c P(t) l lu t, c n l n l t ch ng minh v bn ph i L1, L2, ..., Ln c a n. Trong Prolog, cu h i lun lun l m t dy t m t n nhi u ch. Prolog tr l i m t cu h i b ng cch tm ki m xo (erase) t t c cc ch. Xo m t ch ngha l ch ng minh r ng ch ny c tho mn, v i gi thi t r ng cc quan h c a chng trnh l ng. Ni cch khc, xo m t ch c ngha l ch ny c suy ra m t cch lgich b i cc s ki n v lu t ch a trong chng trnh. N u c cc bi n trong cu h i, Prolog tm cc i t ng thay th vo cc bi n, sao cho ch c tho mn. S rng bu c gi tr c a cc bi n tng ng v i vi c hi n th cc i t ng ny. N u Prolog khng th tm c rng bu c cho cc bi n sao cho ch c suy ra t chng trnh th n s tr l i No.
v i P, Q, v R l cc h ng no . Theo ngha khai bo, ta c chng theo hai cch nh sau : P l ng n u c Q v R u ng. Q v R d n ra P. Theo ngha th t c, ta cng c chng theo hai cch nh sau : gi i bi ton P, u tin, gi i bi ton con Q, sau gi i bi ton con R. xo P, u tin, xo Q, sau xo R. S khc nhau gi a ngha khai bo v ngha th t c l ch , ngha th t c khng nh ngha cc quan h lgich gi a ph n u c a m nh v cc ch c a thn, m ch nh ngha th t x l cc ch.
31
Hai bi n th c a m nh
ny l :
Cc th nghi m c a m nh
ny l :
Cho tr c m t chng trnh v m t ch G, ngha khai bo ni r ng : M t ch G l ng (tho mn, hay suy ra c t chng trnh m t cch logic) n u v ch n u (1) t n t i m t m nh (a) ph n C c a chng trnh sao cho C sao cho: (2) t n t i m t th nghi m I c a m nh u c a I l gi ng h t G, v
(b) m i ch c a ph n thn c a I l ng. nh ngha trn y p d ng c cho cc cu h i Prolog. Cu h i l m t danh sch cc ch ngn cch nhau b i cc d u ph y. M t danh sch cc ch l ng n u t t c cc ch c a danh sch l ng cho cng m t rng bu c c a cc bi n. Cc gi tr c a cc bi n l nh ng gi tr rng bu c t ng qut nh t.
32
II.2. Khi ni m v gi m nh
M t gi hay b m nh (packages of clauses) l t p h p cc m nh c cng tn h ng t chnh (cng tn, cng s l ng tham i). V d sau y l m t gi m nh :
a(X) :- b(X, _). a(X) :- c(X), e(X). a(X) :- f(X, Y).
c a gi
t gi a cc m nh , hay cc ch, ng vai tr php tuy n (disjunction). Lc ny ch c n m t trong cc ch c a danh sch l ng. V d II.2 :
P :- Q; R.
m i d u ch m ph y (semicolon)
u tin cao hn d u ch m ph y
c hi u l :
P :- (Q, R); (S, T, U).
v c th
c vi t thnh hai m nh
Hai m nh trn c c l : P ng n u ho c c Q v R u ng, ho c c S, T v U u ng. V nguyn t c, th t th c hi n cc m nh trong m t gi l khng quan tr ng, tuy nhin trong th c t , c n ch tn tr ng th t c a cc m nh . Prolog s l n l t th c hi n theo th t xu t hi n cc m nh trong gi v trong chng trnh theo m hnh tu n t b ng cch th quay lui m ta s xt sau y.
33
1. Cc m nh
M nh P(a). P(a). P(b). P(a) :Q(c). P(a) :Q(c). P(b).
khng ch a bi n
K hi u Ton h c P(X) X = a P(X) (X = a) (X = b) P(X) X = a Q(c) P(X) (X = a Q(c)) (X = b)
Quy c : n u = n u v ch n u.
2. Cc m nh
M nh P(X). P(X) :Q(X).
c ch a bi n
K hi u Ton h c X P(X)
V i m i gi tr c a X, P(X) ng n u t n t i P(X) :P(X) Y Q(X, Y) Q(X, Y). Y l m t bi n c c b sao cho Q(X, Y) ng P(X) :Q(X, _). P(X) :Q(X, Y), R(Y). P(X) :Q(X, Y), R(Y). p(a). V i m i gi tr c a X, P(X) ng n u t n t i m t gi tr no c a Y sao cho Q(X, Y) P(X) Y Q(X, Y) ng (khng quan tm n gi tr c a Y nh th no) V i m i gi tr c a X, P(X) ng n u t n t i P(X) Y Q(X, Y) R(Y) Y sao cho Q(X, Y) v R(Y) ng
34
3. Ngha lgich c a cc ch
ch
p(a).
Cho bi t gi tr c a X
P(X) l ng ?
Cho bi t cc gi tr c a X v c a Y u l ng ?
danh sch cc ch
execute
G i th t c ny l execute (th c hi n), ci vo v ci ra c a n nh sau : Ci vo : m t chng trnh v m t danh sch cc ch Ci ra : m t d u hi u thnh cng/th t b i v m t rng bu c cc bi n Ngha c a hai ci ra nh sau : (1) D u hi u thnh cng/th t b i l Yes n u cc ch c tho mn (thnh cng), l No n u ng c l i (th t b i). (2) S rng bu c cc bi n ch x y ra n u chng trnh c th c hi n.
35
Ta bi t r ng parent(bill, sue) l m t s ki n. s d ng s ki n ny v lu t 1 (v t tin tr c ti p), ta c th k t lu n r ng ancestor(bill, sue). y l m t s ki n ko theo : s ki n ny khng c m t trong chng trnh, nhng c th c suy ra t cc lu t v s ki n khc. Ta c th vi t g n s suy di n ny nh sau :
parent(bill, sue)
ancestor(bill, sue)
Ngha l parent(bill, sue)ko theo ancestor(bill, sue) b i lu t 1. Ta l i bi t r ng parent(tom, bill) cng l m t s ki n. M t khc, t s ki n c suy di n ancestor(bill, sue), lu t 2 (v t tin gin ti p) cho php k t lu n r ng ancestor(tom, sue). Qu trnh suy di n hai giai o n ny c vi t :
parent(bill, sue) ancestor(bill, sue) parent(tom, bill) v ancestor(bill, sue) ancestor(tom, sue)
Ta v a ch ra cc giai o n xo m t ch, g i l m t ch ng minh. Tuy nhin, ta cha ch ra lm cch no Prolog nh n c m t ch ng minh nh v y. Prolog nh n c php ch ng minh ny theo th t ng c l i nh ng g trnh by. Thay v xu t pht t cc s ki n ch a trong chng trnh, Prolog b t u b i cc ch v, b ng cch s d ng cc lu t, n thay th cc ch ny b i cc ch m i, cho n khi nh n c cc s ki n s c p. xo ch :
?- ancestor(tom, sue).
Prolog tm ki m m t m nh trong chng trnh m ch ny c suy di n ngay l p t c. R rng ch c hai m nh tho mn yu c u ny l lu t 1 v lu t 2, lin quan n quan h ancestor. Ta ni r ng ph n u c a cc lu t ny tng ng v i ch. Hai m nh ny bi u di n hai kh nng m Prolog ph i khai thc x l. Prolog b t u ch n x l m nh th nh t xu t hi n trong chng trnh :
ancestor(X, Z) :- parent(X, Z).
36 X = tom, Z = sue
Lc ny, ch ban
u tr thnh :
parent(tom, sue)
Hnh d i y bi u di n giai o n chuy n m t ch thnh ch m i s d ng m t lu t. Th t b i x y ra khi khng c ph n u no trong cc m nh c a chng trnh tng ng v i ch parent(tom, sue).
ancestor(tom, sue)
B i lu t 1
pha d i.
u,
Nhng lc ny, Y cha c gi tr . Lc ny c n xo hai ch. Prolog s ti n hnh xo theo th t xu t hi n c a chng trong chng trnh. i v i ch th nh t, vi c xo r t d dng v l m t trong cc s ki n c a chng trnh. S tng ng s ki n d n n Y c rng bu c b i gi tr bill. Cc giai o n th c hi n c m t b i cy h p gi i sau y :
37
ancestor(tom, sue)
B i lu t 1 Th t b i B i lu t 2
parent(tom, sue)
parent(tom, Y) ancestor(Y,
cng ph i c tho mn M t l n n a, lu t 1 c s d ng. Ch r ng vi c p d ng l n th hai cng lu t ny khng lin quan g n l n p d ng th nh t. Prolog s d ng cc bi n m i m i l n lu t c g i n. Lu t 1 by gi c th c t tn l i nh sau :
ancestor(X, Z) :- parent(X, Z).
Ph n l :
parent(tom, sue)
Th t b i
ancestor(bill, sue)
Thnh cng B i lu t 1
parent(bill, sue)
ch ny c tho mn ngay l p t c, v chnh l m t s ki n trong chng trnh. Qu trnh x l c minh ho l i y trong Hnh II.4.
38
Hnh 2.4. c d ng m t cy. M i nt tng ng v i m t ch, hay m t danh sch cc ch c n tho mn. M i cung n i hai nt tng ng v i vi c p d ng m t lu t trong chng trnh. Vi c p d ng m t lu t cho php chuy n cc ch c a m t nt thnh cc ch m i c a m t nt khc. ch trn cng (g c c a cy) c xo khi tm c m t con ng i t g c n l c nhn l thnh cng. M t nt l c nhn l thnh cng khi trong nt l m t s ki n c a chng trnh. Vi c th c thi m t chng trnh Prolog l vi c tm ki m nh ng con ng nh v y. Nhnh bn ph i ch ng t r ng c th xo ch. Trong qu trnh tm ki m, c th x y ra kh nng l Prolog i trn m t con ng khng t t. Khi g p nt ch a m t s ki n khng t n t i trong chng trnh, xem nh th t b i, nt c g n nhn th t b i, ngay l p t c Prolog t ng quay lui ln nt pha trn, ch n p d ng m t m nh ti p theo c m t trong nt ny ti p t c con ng m i, ch ng no thnh cng. V d trn y, ta gi i thch m t cch khng hnh th c cch Prolog tr l i cu h i. Th t c execute d i y m t hnh th c v c h th ng hn v qu trnh ny. th c hi n danh sch cc ch : G1, G2, ..., Gm th t c execute ti n hnh nh sau : N u danh sch cc ch l r ng, th t c thnh cng v d ng. N u danh sch cc ch khc r ng, th t c duy t scrutinize sau y c th c hi n Th t c scrutinize : Duy t cc m nh trong chng trnh b t u t m nh u tin, cho n khi nh n c m nh C c ph n u trng kh p v i ph n u c a ch u tin G1. N u khng tm th y m t m nh no nh v y, th t c ri vo tnh tr ng th t b i. N u m nh C c tm th y, v c d ng :
H :- D1, ..., Dn
khi , cc bi n c a C c t tn l i nh n c m t bi n th C khng c bi n no chung v i danh sch G1, G2, ..., Gm. M nh C nh sau : H :- D1, ..., Dn
39
Gi s S l rng bu c c a cc bi n t vi c so kh p gi a G1 v H, Prolog thay th G1 b i D1, ..., Dn trong danh sch cc ch nh n c m t danh sch m i : D1, ..., Dn, G2, ..., Gm Ch r ng n u C l m t s ki n, khi , n=0 v danh sch m i s ng n hn danh sch c. Tr ng h p danh sch m i r ng, k t qu thnh cng. Thay th cc bi n c a danh sch m i ny b i cc gi tr m i ch nh b i rng bu c S, ta nh n c m t danh sch cc ch m i : D"1, ..., D"n, G"2, ..., G"m Th c hi n th t c m t cch quy cho danh sch cc ch m i ny. N u k t thc thnh cng, ti p t c th c hi n danh sch ban u. Trong tr ng h p ng c l i, Prolog b qua danh sch cc ch quay lui l i th t c scrutinize. Qu trnh tm ki m cc m nh trong chng trnh c b t u l i t sau m nh C, v i m t m nh m i.
40
Gi, H'
Dj,
. . H :...,
. D1, Dn
S = (G1| H) D1, ..., Dn, G2, ..., G D"1, ..., D"n, G"2, ..., G" Hnh II.5. Qu trnh th c hi n execute.
N u n=0 m nh m i s ng n hn
Tham
i ra :
ki u Boolean, l true n u goallist l true i program i v i tham
success
Cc bi n c c b : goal ch othergoals danh sch cc ch satisfied ki u Boolean matchOK ki u Boolean process rng bu c c a cc bi n H, H, D1, D1, ..., Dn, Dn
cc ch
Cc hm ph :
empty(L) c gi tr true n u L l danh sch r ng head(L) tr v ph n t u tin c a danh sch L tail(L) tr v danh sch L sau khi b i ph n t u tin add(L1, L2) ghp danh sch L2 vo sau danh sch L1 match(T1, T2, matchOK, process) so kh p cc h ng T1 v T2, n u thnh cng, bi n matchOK c gi tr true, v process ch a cc rng bu c tng ng v i cc bi n.
41
substitute(process, goals) thay th cc bi n c a goals b i gi tr rng bu c tng ng trong process. } begin { execute_main } if empty(goallist) then success:= true else begin goal:= head(goallist); othergoals:= tail(goallist); satisfied:= false; while not satisfied and there_are_again_some_terms do begin Let the following clause of program is: H :- D1, ..., Dn constructing a variant of this clause: H :- D1, ..., Dn match(goal, H, matchOK, process) if matchOK then begin newgoals:= add([ D1, ..., Dn ], othergoals); newgoals:= substitute(process, newgoals); execute(program, newgoals, satisfied) end { if } end; { while } satisfied:= satisfied end end; { execute_main }
T th t c execute trn y, ta c m t s nh n xt sau. Tr c h t, th t c khng m t lm cch no nh n c rng bu c cu i cng cho cc bi n. Chnh rng bu c S d n n thnh cng nh cc l i g i quy. M i l n l i g i quy execute th t b i (tng ng v i m nh C), th t c scrutinize tm ki m m nh ti p theo ngay sau m nh C. Qu trnh th c thi l hi u qu , v Prolog b qua nh ng ph n v ch r sang nhnh khc. Lc ny, m i rng bu c cho bi n thu c nhnh v ch b lo i b hon ton. Prolog s l n l t duy t h t t t c cc con ng c th n thnh cng. Ta cng th y r ng ngay sau khi c m t k t qu tch c c, NSD c th yu c u h th ng quay lui tm ki m m t k t qu m i. Chi ti t ny khng c x l trong th t c execute. Trong cc ci t Prolog hi n nay, nhi u kh nng m i c thm vo nh m t hi u qu t i u. Khng ph i m i m nh trong
42
n, m ch duy t nh ng m nh
c lin quan
% % % % % % %
Cu h i :
?- dark(X), thick(X). % who is thick and dark ? X = bear Yes (1) Danh sch ban
u c a cc ch l : dark(X), thick(X). (2) Tm ki m (duy t) t u n cu i chng trnh m t m nh c ph n tng ng v i ch u tin dark(X). Prolog tm c m nh 7 :
dark(Z) :- black(Z).
sao cho ch con black(X) c so kh p : tm c m nh 6 l s ki n black(cat). Lc ny, rng bu c thnh cng, danh sch cc ch thu g n thnh :
thick(cat)
(4) Tm ki m ch con thick(cat). Do khng tm th y m nh no tho mn, Prolog quay lui l i giai o n (3). Rng bu c X=cat b lo i b . Danh
sch cc ch tr thnh :
black(X), thick(X).
Ti p t c tm ki m trong chng trnh b t u t m nh 6. Do khng tm th y m nh no tho mn, Prolog quay lui l i giai o n (2) ti p t c tm ki m b t u t m nh 7. K t qu tm c m nh 8 :
dark(Z) :- brown(Z).
43
M nh
n k t qu thick(bear). Do y l m t s ki n, danh sch cc ch tr nn r ng. i u ny ch ng t chng trnh th c hi n thnh cng, s rng bu c cho bi n l :
X = bear
(Z|X)
black(X), thick(X) black(cat). Quay lui
(Z|X)
brown(X), thick(X) brown(bear). (X|bear) thick(bear) Thnh cng, X=bear
(X|cat)
thick(cat) Th t b i
II.5. T h p cc y u t khai bo v th t c
Ng i ta th ng quan tm n tnh u vi t c a Prolog l kh nng t qu n l cc chi ti t th t c. i u ny cho php NLT (NLT) d ki n tr c c ngha khai bo c a m t chng trnh m t cch c l p v i ngha th t c c a n. V nguyn t c, do k t qu th c hi n c a m t chng trnh ph thu c vo ph n khai bo, nn ph i khai bo y cc s ki n, lu t v quan h khi l p trnh. i u ny mang tnh th c ti n, v lun lun cc y u t khai bo c a m t chng trnh d hi u hn so v i cc chi ti t th t c. t n d ng c kh nng t qu n l cc chi ti t th t c c a Prolog, NLT ph i t p trung c bi t vo y u t khai bo, trnh nh m l n trong ch ng m c c th b i cc chi ti t th c hi n chng trnh. C n cho Prolog t gi i quy t cc chi ti t mang tnh th t c ny.
44
Nh ti p c n khai bo, l p trnh trn Prolog lun lun thu n ti n hn so v i cc ngn ng th t c khc nh Pascal. Tuy nhin, ti p c n khai bo khng ph i lun lun y . Nh s th y sau ny, i v i cc chng trnh l n, khng th lo i b hon ton tnh ti p c n th t c, do tnh hi u qu th c ti n c a n khi th c hi n chng trnh. V v y, tu theo chng trnh Prolog m s d ng hon ton y u t khai bo, lo i b y u t th t c khi rng bu c th c ti n cho php. Nh s th y trong chng sau r ng vi c s p t th t cc m nh v cc ch cng nh th t cc h ng trong m i m nh c vai tr quan tr ng trong vi c tm ra k t qu . M t khc, m t s chng trnh tuy ng n v m t khai bo nhng l i khng ch y c trong th c t . Ranh gi i gi a y u t th t c v y u t khai bo r t kh suy xt. M nh sau y l m t minh ch ng v vi c khai bo ng, nhng l i hon ton v ch v m t ch y chng trnh :
ancestor(X, Z) :- ancestor(X, Z).
Do nh ng ti n b c a k thu t l p trnh, ng i ta quan tm n ngha khai bo b qua nh ng chi ti t th t c, t n d ng nh ng chi ti t khai bo lm l i gi i n gi n hn v d hi u hn. Khng ph i l NLT, m chnh h th ng ph i qu n l nh ng chi ti t th t c. Prolog l ngn ng nh m vo m c ch ny. Nh ta th y, Prolog ch gip qu n l ng n m t ph n nh ng chi ti t th t c, m khng th qu n l c t t c . M t y u t th c t n a l ng i ta d dng ch p nh n m t chng trnh ch y c ( ng ngha th t c) hn l m t chng trnh ch ng n v m t khai bo m cha ch y c. V v y, gi i quy t m t bi ton no m t cch c l i, ng i ta t p trung gi i quy t nh ng y u t khai bo, ti n hnh ch y th chng trnh trn my, r i s p t l i cc m nh v cc ch n u n v n cha ch y ng v m t th t c.
45
Ta s d ng m t bi n th (variant) c a bi ton nh sau : m t con kh ang tr c c a m t cn phng. Trong phng, chnh gi a tr n c treo m t qu chu i. Con kh ang i nn tm cch l y qu chu i, nhng qu chu i l i treo qu cao i v i n. c nh c a s , c t m t ci h p con kh c th tro ln. Con kh c th th c hi n cc ng tc nh sau : b c i trong phng, nh y ln h p, di chuy n ci h p (n u con kh ng c nh ci h p), v v i l y qu chu i n u n ang ng trn h p t ng pha d i qu chu i. Cu h i t ra l con kh c n c qu chu i hay khng ? Trong l p trnh, v n quan tr ng l lm sao bi u di n c bi ton ph h p v i ngn ng ang s d ng. Tr ng h p c a chng ta c th ngh n tr ng thi c a con kh c th bi n i theo th i gian. Tr ng thi hi n hnh c xc nh b i v tr c a cc i t ng. Ch ng h n, tr ng thi ban u c a con kh c xc nh b i : (1) Con kh ang tr c c a (to the door). (2) Con kh ang trn sn nh (on the floor). (3) Ci h p ang c nh c a s (to the window). (4) Con kh cha l y c qu chu i (not have). Ta c th nhm b n thng tin trn thnh m t i t ng c c u trc duy nh t. G i state l hm t m ta l a ch n nhm cc thnh ph n c a i t ng. Hnh 2.9. trnh by cch bi u di n tr ng thi u l m t t ng c c u trc.
state
tothedoor
onthefloor
tothewindow
nothave
Hnh III.2. Tr ng thi u c a con kh l m t i t ng c c u trc g m b n thnh ph n : v tr n m ngang, v tr th ng ng c a con kh , v tr c a ci h p v m t ch d n cho bi t con kh l y c qu chu i cha.
46
Ti p theo, ta tm cc ng tc c a con kh chuy n t m t tr ng thi ny sang m t tr ng thi khc. C b n ki u ng tc (movement) nh sau : (1) N m l y qu chu i (grab). (2) Tro ln h p (climbing). (3) y ci h p (pushing). (4) Di chuy n (walking). Tu theo tr ng thi hi n hnh, khng ph i t t c m i ng tc u c th s d ng. Ch ng h n, ng tc n m l y qu chu i ch c th x y ra khi con kh ng trn ci h p, ng v tr pha d i qu chu i ( chnh gi a phng), v n cha n m l y qu chu i. Quy t c Prolog displacement d i y c ba i s m t di chuy n c a con kh nh sau :
displacement(State1, Movement, State2).
Vai tr c a cc
i s dng th hi n di chuy n l :
State1
Quy c state1 l tr ng thi tr c khi di chuy n, M l di chuy n th c hi n, v state2 l tr ng thi sau khi di chuy n. ng tc n m l y qu chu i v i i u ki n u c n thi t c nh ngha b i m nh c n i dung : sau khi di chuy n, con kh l y c qu chu i, v n ang ng trn ci h p, gi a cn phng. M nh c vi t trong Prolog nh sau :
displacement( state(tothecenter, onthebox, tothecenter, nothave), % tr c khi di chuy n grab, % di chuy n state(tothecenter, onthebox, tothecenter, possessing). % sau khi di chuy n
M t cch tng t , ta c th di n t di chuy n c a con kh trn sn nh t m t v tr n m ngang P1 b t k no n m t v tr m i P2. Vi c di chuy n c a con kh l c l p v i v tr c a ci h p, v c l p v i s ki n con kh l y c qu chu i hay l cha :
displacement( state(P1, onthefloor, G, H), walking(P1, P2), % di chuy n t P1 state(P2, onthefloor, G, H).
n P2
M nh
47
Di chuy n th c hi n l i t P1 n P2. Con kh trn sn nh tr c v sau khi di chuy n. V tr h p l G khng thay i sau khi di chuy n. Qu chu i v n v tr c tr c v sau khi di chuy n (cha b con kh l y i). M nh ny c trng cho m t t p h p y cc ng tc v c th p d ng cho b t k m t tnh hu ng no tng ng v i tr ng thi ch ra tr c khi di chuy n. Ng i ta g i cc m nh ki u ny l m t s di chuy n. Hai ki u hnh ng khc l y v tro cng c c trng m t cch tng t .
displacement M S1 S2 couldtake S3 couldtake
Sn possessing
Hnh III.4. D ng
quy c a v t couldtake.
u S, con kh c th l y
v i tham i S l m t tr ng thi ch v tr c a con kh . Chng trnh xy d ng cho v t ny d a trn hai quan st sau y : (1) V i m i tr ng thi S m con kh l y c qu chu i, v t couldtake c gi tr true, khng c n m t di chuy n no khc n a. i u ny tng ng v i s ki n :
couldtake(state(_, _, _, possessing)).
(2) Trong cc tr ng h p khc, c n th c chuy n. Xu t pht t m t tr ng thi S1, con kh n u t n t i m t s l n di chuy n M no t sao cho trong tr ng thi S2, con kh c th l y Ta c m nh sau :
couldtake(S1) :displacement(S1, M, S2), couldtake(S2).
V t couldtake c d ng quy, tng t v i quan h ancestor xt u chng. Chng trnh Prolog y nh sau :
48
displacement( state(tothecenter, onthebox, tothecenter, nothave), grab, % v i l y qu chu i state(tothecenter, onthebox, tothecenter, possessing)). displacement( state(P, onthefloor, P, H), climbing, % tro ln h p state(P, onthebox, P, H)). displacement( state(P1, onthefloor, P1, H), pushing(P1, P2), % y ci h p t P1 n P2 state(P2, onthefloor, P2, H)). displacement( state(P1, onthefloor, G, H), walking(P1, P2), % di chuy n t P1 n P2 state(P2, onthefloor, G, H)). pushing(tothewindow, tothecenter). walking(tothedoor, tothewindow). % couldtake(state) : con kh c th l y c qu chu i trong state couldtake(state(_, _, _, possessing)). % tr ng h p 1 : con kh c qu chu i couldtake(State1) :% tr ng h p 2 : c n ph i hnh ng displacement(State1, Move, State2), % hnh ng couldtake(State2). % l y qu chu i
Chng trnh trn y c pht tri n m t cch phi th t c. t c c a chng trnh, ta t ra cu h i sau y :
?- couldtake(state(tothedoor, nothave)). Yes onthefloor,
xt tnh th
tothewindow,
c cu tr l i, Prolog ph i tho mn m t danh sch cc ch theo ng ngha th t c. l qu trnh tm ki m cho con kh m t di chuy n h p l trong m i di chuy n c th . i khi, qu trnh ny s d n n m t ng c t, thot ra, c n ph i quay lui. Cu h i trn c n quay lui m t l n. Cc di chuy n h p l ti p theo c tm th y ngay do cc m nh lin quan n quan h displacement c m t trong chng trnh, ph h p v i tnh hu ng. Tuy nhin, v n c th x y ra kh nng cc di chuy n khng h p l. Con kh i t i i lui mi m khng ch m c ci h p, ho c khng c ch th c s . Trong v d trn, ta u tin qu trnh so kh p cc m nh d n n thnh cng.
49
Hnh III.5. L i gi i c a bi ton con kh v qu chu i. state(tothedoor, onthefloor, tothewindow, nothave) Qu trnh tm ki m b t u t nt trn cng v ti p t c xu ng d i. grab php th th c hi pushing t t tri qua ph i. walking(tothedoor, P2) Cc climbing n l n l Ch failure x y ra m t l n quay lui m thi. failure failure
state(P2, onthefloor, tothewindow, nothave) grab climbing backtrack state(P2, onthefloor, P2, nothave) grab failure climbing pushing(P2, P2) failure
state(tothedoor, onthebox, tothewindow, nothave) grab climbing failure walking failure pushing failure
failure
state(P2, onthebox, P2, nothave) Grab P2 = tothecenter state(tothecenter, onthebox, tothecenter, possessing)
50
III.3.
Xt m nh
p :- p
S p
t th
cc m nh
v cc ch
Ngha c a m nh l p ng n u p ng. V m t khai bo, m nh hon ton ng n. Tuy nhin, v m t th t c, m nh khng dng lm g. Trong Prolog, m nh ny gy ra r c r i. Ta xt cu h i :
?- p.
S d ng m nh trn, ch p c thay th b i chnh ch p, r i l i c thay th b i p, v c th ti p t c. Prolog b ri vo tnh tr ng qu n v h n. V d ny lm phng ti n th c hi n cc vng l p c a Prolog. Tr l i v d con kh v qu chu i trn y, ta c th thay i th t cc ch bn trong c a cc m nh . Ch ng h n cc m nh thu c v quan h displacement c s p x p nh sau :
grab, climbing, pushing, walking
(ta c th b sung thm m nh descending n u mu n tr n v n). Cc m nh ny ni r ng con kh c th n m l y qu chu i (grab), tro ln h p (climbing), v.v... V m t ng ngha th t c, th t cc m nh ni r ng tr c con kh v i l y c qu chu i, n ph i tro ln h p, tr c khi tro ln h p, n ph i y ci h p, v.v... V i th t ny, con kh l y c qu chu i (gi i quy t c bi ton). By gi n u ta thay i th t th i u g s x y ra ? Gi thi t r ng m nh walking xu t hi n u tin. Lc ny, vi c th c hi n ch t ra trn y :
?- couldtake(state(tothedoor, nothave)). onthefloor, tothewindow,
t l i) :
onthefloor,
V i chuy n
ng walking(tothedoor, P2), ta nh n c :
51
(3)
couldtake(state(P2, nothave))
onthefloor,
tothewindow,
T th i i m ny, s khc nhau xu t hi n. M nh u tin c ph n u c th so kh p v i ch u tin trn y by gi s l walking (m khng ph i climbing nh tr c). Rng bu c l S2 = state(P2, onthefloor, tothewindow, nothave). Danh sch cc ch tr thnh : (5) couldtake(state(P2, onthefloor, tothewindow,
nothave))
By gi ta so snh cc ch (3), (5) v (7). Chng g n nh gi ng h t nhau, tr cc bi n P2, P2 v P2. Nh ta th y, s thnh cng c a m t ch khng ph thu c vo tn cc bi n trong ch. i u ny c ngha r ng k t danh sch cc ch (3), qu trnh th c hi n khng c s ti n tri n no. Th c t , ta nh n th y r ng m nh th hai c a couldtake v walking c s d ng qua l i. Con kh i loanh quanh trong phng m khng bao gi c nh s d ng ci h p. Do khng c s ti n tri n no, nn v m t l thuy t, qu trnh tm n qu chu i s di n ra m t cch v h n. Prolog s khng x l nh ng tnh hu ng v ch nh v y. V d ny minh ho Prolog ang th gi i m t bi ton m khng bao gi t c l i gi i, d u r ng l i gi i t n t i. Nh ng tnh hu ng nh v y khng ph i l hi m khi l p trnh Prolog. Ng i ta cng hay g p nh ng vng l p qu n v h n trong cc ngn ng l p trnh khc. Tuy nhin, i u khng bnh th ng so v i cc ngn ng l p trnh khc l chng trnh Prolog ng n v m t ng ngha khai bo, nhng l i khng ng n v m t th t c, ngha l khng c cu tr l i i v i cu h i cho tr c. Trong nh ng tr ng h p nh v y, Prolog khng th xo m t ch v Prolog c g ng a ra m t cu tr l i trong khi ang i theo m t con ng x u (khng d n n thnh cng).
52
Cu h i chng ta mu n t ra l : li u chng ta c th thay i chng trnh sao cho c th d phng tr c nguy c b qu n ? C ph i chng ta lun lun b ph thu c vo s s p t th t ng n c a cc m nh v cc ch ? R rng r ng cc chng trnh l n s tr nn d sai st n u ph i d a trn m t th t no c a cc m nh v cc ch. T n t i nhi u phng php khc cho php lo i b cc vng l p v h n, t ng qut hn v ng tin c y hn so v i phng php s p t th t . Sau y, chng ta s s d ng th ng xuyn nh ng phng php ny trong vi c tm ki m cc con ng, h p gi i cc bi ton v duy t cc th .
i th
m nh
v ch trong chng
Ta hy xt m t s bi n th c a chng trnh ny. V m t khai bo, t t c cc chng trnh l tng ng, nhng v m t th t c, chng s khc nhau. Tham kh o ng ngha khai bo c a Prolog, khng nh h ng n ngha khai bo, ta c th thay i nh sau : (1) Th t cc m nh trong m t chng trnh, v (2) Th t cc ch bn trong thn c a cc m nh . Th t c ancestor trn y g m hai m nh , ui m nh th nh t c m t ch con v ui m nh th hai c hai ch con. Nh v y chng trnh s c b n bi n th (=122) m c b n u c cng ngha khai bo. Ta nh n c nh sau : (1) o th t cc m nh , v (2) o th t cc ch cho m i s p t th t cc m nh . Hnh d i y m t b n th t c anc1, anc2, anc3, anc4 :
% Th t c g c anc1(X, Z) :parent(X, Z). anc1 (X, Z) :parent(X, Y), anc1 (Y, Z). % Bi n th a : hon i cc m nh
53
anc2 (X, Z) :parent(X, Y), anc2 (Y, Z). anc2(X, Z) :parent(X, Z). % Bi n th b : hon i cc ch c a m nh anc3(X, Z) :parent(X, Z). anc3 (X, Z) :anc3 (X, Y), parent(Y, Z). % Bi n th c : hon i cc ch v cc m nh anc4 (X, Z) :anc4 (X, Y), parent(Y, Z). anc4(X, Z) :parent(X, Z). % Cc cu h i c t ra l n l t nh sau : ?- anc1(tom, sue). -> Yes ?- anc2(tom, sue). -> Yes ?- anc3(tom, sue). -> Yes ?- anc4(tom, sue). ERR 211 Not enough local stack th hai
54
anc2(X, Z) :parent (X, Y), anc2 (Y, Z), anc2(X , Z) :parent (X, Z).
anc2(tom, sue) parent (tom, Y) anc2(Y, sue) Y = bill anc2(bill, sue) parent (bill, Y) anc2 (Y, sue) parent (bill, sue) thnh cng
Y = ann anc2(ann, sue) parent(ann, Y) anc2(Y, sue) th t b i parent (ann, sue) th t b i Y = sue anc2(sue, sue) parent (sue, Y) anc2(Y, sue) Y = jim anc2 (jim, sue) parent(jim, Y) anc2(Y, sue) th t b i parent (jim, sue) th t b i parent (sue, sue) th t b i
Trong tr ng h p cu i cng, Prolog khng th tm ra cu tr l i. Do b qu n v h n nn Prolog thng bo khng b nh . Hnh 2.4. m t qu trnh th c hi n c a anc1 (tr c y l ancestor) cho cng m t cu h i. Hnh 2.13 (a, b, c) m t qu trnh th c hi n c a anc2, anc3 v anc4. Ta th y anc4 khng c hy v ng v anc2 km hi u qu hn so v i anc1 do th c hi n nhi u l n tm ki m v quay lui hn trong cy. So snh cc qu trnh so kh p trong cc hnh v , ta th y r ng c n khai bo cc m nh n gi n khi gi i cc bi ton. i v i bi ton quan h t tin, c b n bi n th u d a trn hai :
55
ki m tra n u hai tham i c a quan h t tin tho mn quan h parent. giai o n ph c t p nh t l tm ai gi a nh ng ng i l parent hay ancestor.
anc3(X, Z) :parent(X, Z). anc3(X, Z) :anc3(X, Y), parent(Y, Z). parent (tom, sue) th t b i anc3(tom, sue) anc3(tom, Y) parent(Y, sue) parent(tom, Y) parent(Y, sue) Y = bill paren(bill, sue) thnh cng
Trong s b n bi n th c a quan h ancestor, ch c anc1 l th c hi n qu trnh so kh p n gi n nh t. Trong khi , anc4 b t u qu trnh kh khn nh t. Cn anc2 v anc3 n m gi a hai thi c c ny. D ta c xem xt chi ti t cc qu trnh th c hi n th no i chng n a, th anc1 v n l lu t n gi n nh t. Ng i ta khuyn nn s d ng cch ny khi l p trnh.
56
Ta khng c n so snh b n bi n th m xem xt v i ki u cu h i no th m i bi n th d n n thnh cng hay th t b i. Ta d nh n th y r ng c hai th t c anc1 v anc2 u c kh nng a ra cu tr l i cho m i ki u cu h i. Cn anc3 th khng ch c ch n. Ch ng h n cu h i sau y gy ra th t b i :
anc3(liz, jim) ERR 212 Not enough global stack
v d n n nh ng l i g i ng n v m t th t c.
Tm t t chng 2
Nh ng khi ni m c gi i thi u : ch tho mn, thnh cng ch khng tho mn/b th t b i, ch b xo, ngha khai bo, ngha th t c, ngha lgich, quay lui. th nghi m c a m t m nh , bi n th c a m t m nh L p trnh trn ngn ng Prolog l nh ngha cc quan h v t cu h i trn cc quan h ny. M t chng trnh Prolog bao g m cc m nh . C ba ki u m nh : s ki n, lu t v cu h i. M t quan h c th c c t b i cc s ki n, b ng cch ghi nh n b n i t ng tho mn quan h , hay thi t l p cc lu t lin quan n quan h . M t th t c l m t t p h p cc m nh lin quan n cng m t quan h . Vi c t cc cu h i trn cc quan h tng t vi c v n tin m t c s d li u. Prolog tr l i cu h i b ng cch li t k t p h p cc i t ng lm tho mn cu h i ny. Trong Prolog, khi m t i t ng lm tho mn m t cu h i th vi c tr l i cu h i lun lun l m t qu trnh ph c t p s d ng suy di n lgich, khai thc cc kh nng khc nhau, v c ch quay lui. Prolog ti n hnh t ng qu trnh ny v v nguyn t c, NSD c th hi u c. Ng i ta phn bi t ngha khai bo v ngha th t c khi l p trnh. M t chng trnh Prolog th ng c ngha khai bo l ch y u. Tuy nhin, ng i ta v n tm th y ngha th t c trong m t s chng trnh Prolog. Theo ngha th t c, chng trnh Prolog th c hi n qu trnh tm ki m, so kh p v quay lui.
57
Ng ngha khai bo c a Prolog xc nh n u m t ch l ng i v i m t chng trnh cho, tng ng v i rng bu c c a cc bi n. Ng i ta quy c vi t php giao (and) c a hai ch b ng cch t m t d u ph y gi a chng, php ho c (or) b i m t d u ch m ph y. Ng ngha th t c c a Prolog c th hi n b i m t th t c tm ki m lm tho mn m t danh sch cc ch t m t chng trnh cho. N u tm ki m tho mn, Prolog tr v cc rng bu c cc bi n tng ng. N u t i m t b c no b th t b i, th t c ny cho php t ng quay lui (backtracking) tm ki m tm cc kh nng khc c th d n n thnh cng. Ngha khai bo c a cc chng trnh thu n Prolog khng ph thu c s s p t cc m nh , cng nh khng ph thu c s s p t cc ch bn trong cc m nh . Ngha th t c ph thu c th t cc ch v cc m nh . Th t s p t ny c th nh h ng n tnh hi u qu ch y chng trnh, v c th d n n nh ng l i g i quy v h n. Cho tr c m t khai bo ng, c kh nng lm t i u hi u qu v n hnh c a h th ng b ng cch thay i th t cc m nh , m v n m b o tnh ng n v m t khai bo. S s p t l i th t cc ch v cc m nh l m t trong nh ng phng php nh m trnh cc vng l p qu n v h n. Cn c nh ng k thu t khc t ng qut hn trnh cc vng l p qu n v h n, v lm cho chng trnh v n hnh ng tin c y hn.
Bi t p chng 2
1. T chng trnh Prolog d i y:
aeroplane(concorde). aeroplane(jumbo). on(fred, concorde). on(jim, No_18_bus). bird(percy). animal(leo). animal(tweety). animal(peter). has_feathers(tweety). has_feathers(peter). flies(X) :- bird(X). flies(X) :- aeroplane(X). flies(X) :- on(X, Y), aeroplane(Y).
58
Hy cho bi t cc k t qu nh n c t cu h i :
?- flies(X).
b ng cch li t k theo th t :
X=kq1; X=kq2; v.v...
2. S d ng s cho trong ph n l thuy t, hy tm hi u cch Prolog tm ra cc cu tr l i i v i cc cu h i d i y. V s minh h a tng ng theo ki u s cho. C kh nng Prolog quay lui khng ?
a) ?- parent(mary , bill). b) ?- mother(mary , bill).
c) ?- grand parent(mary, ann). d) ?- grand parent(bill , jim). 3. Vi t l i chng trnh d i y, nhng khng s d ng d u ch m h i :
translate (Number, word) :Number = 1, Word = one; Number = 2, Word = two; Number = 3, Word = three.
qu trnh th c hi n
5.
59
nh ngha b i cc m nh
sau y :
a1(X, Y) :- p(X, Z), a1(Z, Y). a2(X, Y) :- p(X, Y). a2(X, Y) :- a2(Z, Y), p(X, Z). a3(X, Y) :- p(X, Z), a3(Z, Y). a3(X, Y) :- p(X, Y). a4(X, Y) :- a4(Z, Y), p(X, Z). a4(X, Y) :- p(X, Y).
9. Vi t gi cc m nh
nh ngha cc hm sau :
60
10. Vi t chng trnh Prolog t bi u di n lgich sau y : X: pet(X) small(X) apartmentpet(X) X: cat(X) dog(X) pet(X) X: poodle(X) dog(X) small(X) poodle(fluffy) T t cu h i Prolog v v s qu trnh th c hi n.
CHNG 3
Cc php ton v s
h c
I.
S h c
Php ton C ng (addition) Tr (subtraction) Nhn (multiplication) Chia s th c (real division) Chia s nguyn (integer division) Chia l y ph n d (modulus) Lu th a (power)
I.2. Bi u th c s h c
Bi u th c s h c (arithmetic expressions) c xy d ng nh v t is. V t ny l m t php ton ti n t (infix operator) c d ng :
Number is Expr
Tham i bn tri php ton is l m t i t ng s c p. Tham i bn ph i l m t bi u th c s h c c h p thnh t cc php ton s h c, cc s v cc bi n. V php ton is s kh i ng vi c tnh ton, cho nn khi th c hi n ch
61
62
ny, t t c cc bi n c n ph i c rng bu c v i cc gi tr s . Prolog so kh p thnh cng n u Number kh p c v i Expr. N u Expr l ki u th c (float) th c xem nh m t s nguyn. V d I.1 :
?- X is 3*4. X = 12 Yes ?- is(X, 40+50). X = 90 Yes ?- 1.0 is sin(pi/2). No % sai do sin(pi/2) c lm trn thnh 1 ?- 1.0 is float(sin(pi/2)). Yes
Trong Prolog, cc php ton s h c ko theo s tnh ton trn cc d li u. th c hi n cc php ton s h c, c n bi t cch g i dng theo ki u Prolog m khng th g i tr c ti p ngay c nh trong cc ngn ng l p trnh m nh l nh. Ch ng h n, n u NSD c n c ng hai s 1 v 2 m l i vi t nh sau :
?- X = 1 + 2
m khng ph i l X = 3 nh mong mu n. L do r t n gi n : bi u th c X = 1 + 2 ch l m t h ng c a Prolog m hm t chnh l +, cn 1 v 2 l cc tham i c a n. Khng c g trong ch tr c n Prolog ti n hnh php c ng. Sau y l m t s v d :
?- X = 1 + 1 + 1. X = 1 + 1 + 1 (ou X = +(+(1, 1), 1)).
Prolog ti n hnh tnh ton trn cc php ton s h c, s d ng php ton is nh sau :
?- X is 1 + 2. X = 3
c bi t k t h p v i php t c th ng tr (built-in
Cc php ton v s h c
63
ph i l hm s )
?- X is 1 + 1 + Z. ERROR: Arguments are not sufficiently instantiated (sai do a khng ph i l s ) ?- Z = 2, X is 1 + 1 + Z. Z = 2 X = 4
u tin c a cc php ton s h c ti n nh c a Prolog cng l u tin tho mn tnh ch t k t h p trong ton h c. Cc c p d u ngo c c th lm thay i th t u tin gi a cc php ton. Ch r ng +, -, *, / v // c nh ngha nh l yfx, c ngha l vi c tnh ton c th c hi n t tri sang ph i. V d , bi u th c :
X is 5 -2 1
c gi i thch nh l :
X is ( 5 -2 ) - 1
Do :
?- X is 5 -2 - 1. X = 2 Yes ?- X = 5 -2 - 1. X = 5-2-1 Yes
Cc php so snh gi tr s h c trong Prolog c th c hi n theo ngha Ton h c thng th ng. Ch ng h n, ta c n so snh n u tch c a 277 v i 37 l l n hn 10000 v i ch sau :
?- 277 * 37 > 10000. Yes
By gi gi s ta c quan h birth, cho php lin h m t ng i v i ngy thng nm sinh c a ng i . Ta c th tm c tn c a nh ng ng i sinh ra gi a nm 1950 v nm 1960 (k c hai nm ny) b ng cch t cu h i :
?- birth( Name, Year ), Year >= 1950, Year <= 1960. % k t qu tr v l tn nh ng ng i sinh ra trong kho ng 1950 - 1960 Yes
Prolog c s n cc hm s h c nh : sin, cos, tan, atan, sqrt, pi, e, exp, log, ... V d I.2 :
64 ?- X is exp(10). X = 22026.5 Yes ?- X is sqrt(9). X = 3 Yes 7 ?- X is abs(1.99). X = 1.99 Yes ?- X is pi. X = 3.14159 Yes
I.3.
v i + v * l cc php ton (operator), cn a, b v c l cc ton h ng (operand), hay tham i (argument). Bi u th c trn cn c vi t d i d ng ti n t (prefix) nh cc hm t + v * nh sau :
+( *(2, a), *(b, c) )
ho c d ng h u t (postfix) nh sau :
( (2, a) *, (b, c) * )+
Do thi quen, ng i ta thch vi t cc bi u th c d ng trung t d c hn. Prolog cho php vi t cc bi u th c d i d ng trung t , l bi u di n bn ngoi, nhng th c ch t, cc bi u th c c bi u di n bn trong v n d ng ti n t , theo quy c vi t cc h ng trong m t m nh .
+ * 2 a b * c
Hnh I.1. Bi u di n d ng cy c a bi u th c 2 * a + b * c
Khi vi t a + b, Prolog hi u r ng l bi u th c +(a, b). Prolog c th hi u c ng n cc bi u th c nh l a + b * c, c n cho Prolog bi t r ng php nhn * c u tin cao hn php c ng +. Khi bi u th c ny ph i c vi t d i d ng :
+( a, *(b, c) )
m khng ph i l :
65
Prolog quy c php ton c u tin cao nh t l hm t chnh c a h ng. N u cc bi u th c ch a + v * tun theo nh ng quy c thng th ng, th cch vi t a + b * c v a + (b * c) ch l m t. Cn n u mu n thay i th t u tin, th c n vi t r rng b ng cch s d ng cc c p d u ngo c (a + b) * c : M i NLT c th nh ngha cc php ton ring c a mnh, ch ng h n nh ngha cc nguyn t is v support nh l nh ng php ton trung t vi t cc s ki n trong m t chng trnh. Ch ng h n :
tom bald wall support ceiling
l nh ng s ki n c vi t trong Prolog :
is( tom, bald ). support( wall, ceiling ).
M i php ton l m t nguyn t c u tin l m t gi tr s , tu thu c phin b n Prolog, thng th ng n m trong kho ng gi a 1 v 1200. Cc php ton c c t b i h n h p tn php ton f v cc bi n (tham i) x v y. M i c t cho bi t cch k t h p (associative) php ton v c ch n sao cho ph n nh c c u trc c a bi u th c. M t php ton trung t c k hi u b i m t f t gi a hai tham i d ng xfy. Cn cc php ton ti n t v h u t ch c m t tham i c t tr c (ho c t sau tng ng) d u php ton f. C ba nhm ki u php ton trong Prolog nh sau : Cc php ton Trung t Ti n t H ut Khng k t h p
xfx fx xf Hnh I.2. Ba nhm ki u php ton trong Prolog.
K t h p ph i
xfy fy
K t h p tri
yfx yf
C s khc nhau gi a x v y. gi i thch, ta a vo khi ni m u tin c a tham i. N u cc d u ngo c bao quanh m t tham i, hay tham i ny l m t i t ng khng c c u trc, th u tin c a n b ng 0. u tin c a m t c u trc l u tin c a hm t chnh. Do x l m t tham i nn u tin c a x ph i th p hn h n u tin c a php ton f, cn tham i y c u tin th p hn ho c b ng u tin c a php ton f. Khi g p m t bi u th c ch a php ton op d ng :
a op b op c
66
y, php tr
Cc php ton v s h c
67
0 a b c u tin
a u tin 0 b c
Cch gi i thch 1 : (a - b ) c Cch gi i thch 2 : a - (b c) Hnh I.3. Hai cch gi i thch cho bi u th c a - b - c v i gi thi t r ng php tr c u tin l 500. N u - l yfx, th cch gi i thch 2 l sai v u tin c a b - c khng th p hn u tin c a -.
Tri l i, n u php ton not c nh ngha nh l fx, th bi u th c trn s khng cn ng n a, v r ng tham i c a not u tin l not p, s c cng u tin v i n. Trong tr ng h p ny, bi u th c ph i c vi t k t h p v i cc c p d u ngo c :
not ( not p )
Tnh d c c a m t chng trnh tu thu c vo cch s d ng cc php ton. Trong cc chng trnh Prolog, nh ng m nh s d ng php ton m i do ng i dng nh ngha th ng c g i l cc ch d n hay nh h ng (directive). Cc ch d n ph i xu t hi n tr c khi m t php ton m i c s d ng n trong m t m nh , c d ng nh sau : :- op( u tin, Cch k t h p, Tn php ton). Ch ng h n ng i ta nh ngha php ton is nh ch d n :
:- op( 600, xfx, is ).
Ch d n ny bo cho Prolog bi t r ng is s c s d ng nh l m t php ton c u tin l 600, cn k hi u c t xfx ch nh y l m t php ton trung t . ngha c a xfx nh sau : f l d u php ton c t gi a, cn x l tham i c t hai bn d u php ton. Vi c nh ngha m t php ton khng ko theo m t hnh ng (action) ho c m t thao tc (opration) no. V nguyn l, khng m t thao tc no trn d li u c k t h p v i m t php ton (tr m t vi tr ng h p hi m g p c bi t, nh cc php ton s h c). Tng t nh m i hm t , cc php ton ch c dng c u trc cc hm t , m khng ko theo m t thao tc no trn cc d li u, d u r ng tn g i php ton c th g i ln vai tr ho t ng. Prolog cung c p s n m t s php ton chu n. Nh ng php ton ti n nh ngha ny thay i ty theo phin b n Prolog. Hnh 3.5 d i y trnh by m t s php ton chu n ti n nh ngha c a Prolog. Ch r ng cng m t m nh c th
68
nh ngha nhi u php ton, mi n l chng cng ki u v cng php ton c vi t trong m t danh sch. Cc php ton ti n nh ngha trong Prolog nh sau :
u tin 1200 1200 1100 1000 900 900 700 600 500 500 400 200 200 Cch k t h p xfx fx xfy xfy fy fx xfx xfy yfx fx yfx xfx xfy Cc php ton -->, ::-, ?;, | , \+ ~
u tin. Cc tn
<, =, =.., =@=, =:=, =<, ==, =\=, >, >=, @<, @=<, @>, @>=, \=, \==, is : +, -, /\, \/, xor +, -, ?, \ *, /, //, <<, >>, mod, rem ** ^ nh ngha trong Prolog.
minh ho , ta xt v d vi t m t chng trnh x l cc bi u th c lgich (boolean). Gi s ta c n bi u di n m t trong cc nh l tng ng c a Morgan, c vi t d i d ng ton h c nh sau :
~ ( A & G ) <===> ~ A ~ B
Trong Prolog, m nh
trn ph i c vi t nh sau :
Tuy nhin, cch l p trnh t t nh t l th tm cch b o lu t i a s gi ng nhau gi a cc k hi u trong bi ton cho v i cc k hi u c s d ng trong chng trnh..
Cc php ton v s h c
<===> ~ & A B ~ A v ~ B
69
y,
~ ( A & B ) <===> ~ A ~ B
Thnh cng n u Expr1 c gi tr s b ng Expr2 Low v High l cc s nguyn, Low=< Value=< High. Value l bi n s c nh n gi tr gi a Low v High Thnh cng n u Int2= Int1+ 1 v Int1>= 0 Thnh cng n u Int3= Int1+Int2
70
Ch r ng cc php ton = v =:= l hon ton khc nhau, ch ng h n trong cc ch X = Y v X =:= Y : ch X = Y ko theo vi c ng nh t cc i t ng X v Y, n u chng ng nh t v i nhau th c th rng bu c m t s bi n no trong X v Y. ch X =:= Y ch gy ra m t php tnh s h c so snh m khng x y php rng bu c no trn cc bi n. V d II.1 :
?- X = Y. X = _G997 Y = _G997 Yes ?- 1 + 2 =:= 2 + 1. Yes. ?- 1 + 2 = 2 + 1. No. ?- 1 + 2 = 1 + 2. Yes. ?- 1 + X = 1 + 2. X = 2 ?- 1 + A = 2 B = 1 ?- 1 + Yes. ?- 1 + ERROR: A = B + 2.
2 =:= 2 + 1.
X =:= 1 + 2. Arguments are not sufficiently instantiated (sai do a khng ph i l s ) ?- 1 + 2 == 1 + 2. Yes. ?- 1 + 2 == 2 + 1. No. ?- 1 + X == 1 + 2. No. ?- 1 + a == 1 + a. Yes. 1 is sin(pi/2). Yes
Cc php ton v s h c ?- 1.0 is sin(pi/2). No ?- 1.0 is float(sin(pi/2)). Yes ?- 1.0 =:= sin(pi/2). Yes
71
Term1 \== Term2 Term1 = Term2 Term1 \= Term2 Term1 =@= Term2
Term1 \=@= Term2 Term1 @< Term2 Term1 @=< Term2 Term1 @> Term2 Term1 @>= Term2
Thnh cng n u ho c hai h ng b ng nhau both ho c Term1 ng sau Term2 theo th t chu n c a cc h ng
h ng V d II.2 :
?- free_variables(a(X, b(Y, X), Z), L). L = [G367, G366, G371] X = G367
72 Y = G366 Z = G371 ?- a =@= A. No ?- a =@= B. No ?- x(A, A) =@= x(B, C). No ?- x(A, A) =@= x(B, B). A = _G267 B = _G270 Yes 5 ?- x(A, B) =@= x(C, D). A = _G267 B = _G268 C = _G270 D = _G271 Yes ?- 3 @< 4. Yes ?- 3 @< a. Yes ?- a @< abc6. Yes ?- abc6 @< t(c, d). Yes ?- t(c, d) @< t(c, d, X). X = _G284 Yes
II.3. V t xc
nh ki u
Do Prolog l m t ngn ng nh ki u y u nn NLT th ng xuyn ph i xc nh ki u c a cc tham i. Sau y l m t s v t xc nh ki u (type predicates) c a Prolog.. V t Ki m tra
var(V) V l m t bi n ?
Cc php ton v s h c nonvar(X) atom(A) integer(I) float(R) number(N) atomic(A) compound(X) ground(X) X khng ph i l m t bi n ? A l m t nguyn t ? I l m t s nguyn ?
73
R l m t s th c (d u ch m
V d II.3 :
?- var(X). X = _G201 Yes ?- integer(34). Yes ?- ground(f(a, b)). Yes ?- ground(f(a, Y)). No
II.4. M t s v t x l h ng
V t
T =..L
functor(T, F, N) T l m t h ng v i F l h ng t v c N
Th bi n X cho tham
i th N c a h ng Term
Chuy n nguyn t A thnh danh sch L g m cc m ASCII (danh sch s c trnh by trong chng sau).
V d II.4 :
?- functor(t(a, b, c), F, N). F = t N = 3 Yes ?- functor(father(jean, isa), F, N). F = father, N = 2.
74 Yes ?- functor(T, father, 2). T = father(_G346, _G347). Prolog ?- t(a, b, c) =..L. L = [t, a, b, c] Yes ?- T =..[t, a, b, c, d, e]. T = t(a, b, c, d, e) Yes ?- arg(1, father(jean, isa), X). X = jean ?- name(toto, L). L = [116, 111, 116, 111]. Yes ?- name(A, [116, 111, 116, 111]). A = toto. Yes
V d II.5 : Cho c s d li u :
personal(tom). personal(ann). father(X, Y) :- son(Y, X), male(X). ?- clause(father(X, Y), C). C = (son(Y, X), male(X)). ?- clause(personal(X), C). X = tom, C = true; X = ann, C = true Yes
Cc php ton v s h c
75
III.
nh ngha hm
Prolog khng c ki u hm, hm ph i c nh ngha nh m t quan h trn cc i t ng. Cc tham i c a hm v gi tr tr v c a hm ph i l cc i t ng c a quan h . i u ny c ngha l khng th xy d ng c cc hm t h p t cc hm khc. V d III.1 : nh ngha hm s h c c ng hai s b t k
plus(X, Y, Z) :% tr ng h p tnh Z = X + Y nonvar(X), nonvar(Y), Z is X + Y. plus(X, Y, Z) :% tr ng h p tnh X = Z - Y nonvar(Y), nonvar(Z), X is Z - Y. plus(X, Y, Z) :% tr ng h p tnh Y - Z - X nonvar(X), nonvar(Z), Y is Z - X. ?- add1(2, 3, X). X = 5 Yes add1(7, X, 3). X = -4 Yes add1(X, 2, 6). X = 4 Yes
III.1.
nh ngha hm s d ng
quy
Trong chng 1, ta trnh by cch nh ngha cc lu t (m nh ) quy. Sau y, ta ti p t c ng d ng php quy xy d ng cc hm. Tng t cc ngn ng l p trnh m nh l nh, m t th t c quy c a Prolog ph i ch a cc m nh tho mn 3 i u ki n :
M t kh i ng qu trnh l p. M t s l p l i chnh n. M t i u ki n d ng.
V d th t c quy t o dy 10 s t nhin ch n u tin nh sau : u tin l y gi tr 0 kh i ng qu trnh. Sau l y 0 l gi tr hi n hnh t os ti p theo nh s l p : even_succ_nat = even_succ_nat + 2. Qu trnh
76
M nh a g i l i chnh n ngay trong v ph i. D ng s l p nh v y c g i l quy tr c ti p. khng x y ra l i g i v h n, c n c m t m nh lm i u ki n d ng t tr c m nh . M i l n vo l p m i, i u ki n d ng s c ki m tra quy t nh xem c th ti p t c g i a hay khng ? Ta xy d ng th t c even_succ_nat(Num, Count) t o l n l t cc s t nhin ch n Num, bi n Count m s b c l p. i u ki n d ng l Count=10, ta c :
even_succ_nat(Num, 10).
M nh
l p c xy d ng nh sau :
even_succ_nat(Num, Count) :write(Num), write(' '), Count1 is Count + 1, Num1 is Num + 2, even_succ_nat(Num1, Count1).
Nh v y, l i g i t o 10 s t nhin ch n
?- even_succ_nat(0, 0). 0 2 4 6 8 10 12 14 16 18 Yes
u tin s l :
xy d ng s
l p c g i l
quy khng tr c ti p c
Trong s l p ny, m nh quy a khng g i g i tr c ti p n a, m g i n m t m nh b khc, m trong b ny l i c l i g i n a. khng x y ra l i g i lu n qu n v h n, trong b c n th c hi n cc tnh ton lm gi m d n qu trnh l p tr c khi g i l i m nh a (v d m nh c). V d s d i y s gy ra vng lu n qu n v h n :
a(X) :- b(X, Y). b(X, Y) :- a(Z).
u tin c vi t l i theo s
quy
77
Chng trnh ny khng g i quy nh even_succ_nat. K t qu sau l i g i a(20) l dy s gi m d n 20 18 16 14 12 10 8 6 4 2. V d III.2 : Xy d ng s t nhin (Peano) v php c ng trn cc s t nhin /* nh ngha s t nhin */ nat(0). % 0 l m t s t nhin nat(s(N)) :% s(X) cng l m t s t nhin nat(N). % n u N l m t s t nhin
Ch ng h n s 5 c vi t : s(s(s(s(s(zero)))))
/* nh ngha php c ng */ addi(0, X, X). % lu t 1 : 0 + X = X /* addi(X, 0, X). c th s d ng them lu t 2 : X + 0 = X addi(s(X), Y, s(Z)) :- % lu t 3 : n u X + Y = Z th (X+1) + Y = (Z+1) addi(X, Y, Z).
Ho c
addi(0, X, X) :- nat(X). ?- addi(X, Y, s(s(s(s(0))))). X = 0 Y = s(s(s(s(0)))) Yes ?- addi(X, s(s(0)), s(s(s(s(s(0)))))). X = s(s(s(0))) Yes ?- THREE = s(s(s(0))), FIVE = s(s(s(s(s(0))))), addi(THREE, FIVE, EIGHT). THREE = s(s(s(0))) FIVE = s(s(s(s(s(0))))) EIGHT = s(s(s(s(s(s(s(s(0)))))))) Yes
V d III.3 : Tm c s chung l n nh t (GCD: Greatest Common Divisor) Cho tr c hai s nguyn X v Y, ta c n tnh c s D v USCLN d a trn ba quy t c nh sau : 1. N u X = Y, th D b ng X. 2. N u X < Y, th D b ng USCLN c a X v c a Y - X. 3. N u X > Y, th th c hi n tng t b c 2, b ng cch hon v vai tr X v Y.
78
C th d dng tm c cc v d minh ho s ho t ng c a ba quy t c tr c y. V i X =20 v Y =25, th ta nh n c D =5 sau m t dy cc php tr . Chng trnh Prolog c xy d ng nh sau :
gcd( X, X, X gcd( X, Y, D X < Y, Y1 is Y gcd( X, ). ) : X, Y1, D ).
ch cu i cng trong m nh
X1 is X Y, gcd( X1, Y, D ).
th ba trn y c th
c thay th b i :
K t qu ch y Prolog nh sau :
?- gcd( 20, 55, D ). D = 5
M nh
th hai c ngha r ng n u l n l t :
th F l N!. Php ton is gi ng php gn trong cc ngn ng l p trnh m nh l nh nhng trong Prolog, is khng gn gi tr m i cho bi n. V m t lgich, th t cc m nh trong v ph i c a m t lu t khng c vai tr g, nhng l i c ngha th c hi n chng trnh. M khng ph i l bi n trong l i g i th t c quy v s gy ra m t vng l p v h n. Cc nh ngha hm trong Prolog th ng r c r i do hm l quan h m khng ph i l bi u th c. Cc quan h c nh ngha s d ng nhi u lu t v th t cc lu t xc nh k t qu tr v c a hm... V d III.5 : Tnh s Fibonacci
/* Fibonacci function */
Cc php ton v s h c fib(0, 0). % fib0 = 0 fib(1, 1). % fib1 = 1 fib(N, F) :% fibn+2 = fibn+1 + fibn N > 1, N1 is N - 1, fib(N1, F1), N2 is N - 2, fib(N2, F2), F is F1 + F2. ?- fib(20, F). F = 10946 Yes ?- fib(21, F). ERROR: Out of local stack
79
Ta nh n th y thu t ton tnh s Fibonacci trn y s d ng hai l n g i quy nhanh chng lm y b nh v ch v i N=21, SWI-prolog ph i d ng l i thng bo l i. V d III.6 : Tnh hm Ackerman
/* Ackerman's function */ ack(0, N, A) :- % Ack(0, n) = n + 1 A is N + 1. ack(M1, 0, A) :- % Ack(m, n) = Ack(m-1, 1) M > 0, M is M - 1, ack(M, 1, A). ack(M1, N1, A) :% Ack(m, n) = Ack(m-1, Ack(m, n-1)) M1 > 0, N1 > 0, M is M - 1, N is N - 1, ack(M1, N, A1), ack(M, A1, A).
V d III.7 : Hm tnh t ng
plus(X, Y, Z) :nonvar(X), nonvar(Y), Z is X + Y. plus(X, Y, Z) :nonvar(Y), nonvar(Z), X is Z - Y. plus(X, Y, Z) :nonvar(X), nonvar(Z), Y is Z - X.
80
i c a X v Y
i c b c N
V d III.9 : L thuy t s Ta ti p t c xy d ng hm m i trn cc s t nhin c nh ngha trong v d 1. Ta xy d ng php so snh hai s t nhin d a trn php c ng nh sau : egal(+(X, 0), X). % php c ng c tnh giao hon
egal(+(0, X), X). egal(+(X, s(Y)), s(Z)) :egal(X+s(Y), s(Z)) % X YZ.egal(X+Y, Z)
81
Sau y l m t s k t qu :
?- egal(s(s(0))+s(s(s(0))), s(s(s(s(s(0)))))). Yes ?- egal(+(s(s(0)), s(s(0))), X). X = s(s(s(s(0)))) ?- egal(+(X, s(s(0))), s(s(s(s(s(0)))))). X = s(s(s(0))) Yes ?- egal(+(X, s(s(0))), s(s(s(s(s(0)))))). X = s(s(s(0))) Yes ?- egal(X, s(s(s(s(0))))). X = s(s(s(s(0))))+0 ; X = 0+s(s(s(s(0)))) ; X = s(s(s(0)))+s(0) ; X = 0+s(s(s(s(0)))) ; X = s(s(0))+s(s(0)) ; X = 0+s(s(s(s(0)))) ; X = s(0)+s(s(s(0))) ; X = 0+s(s(s(s(0)))) ; X = 0+s(s(s(s(0)))) ; X = 0+s(s(s(s(0)))) ; No
V i ch egal(X, Y) sau y, cu tr l i l v h n :
?- egal(X, Y). X = _G235+0 Y = _G235 ; X = 0+_G235 Y = _G235 ; X = _G299+s(0) Y = s(_G299) ; X = 0+s(_G302) Y = s(_G302) ;
82 X = _G299+s(s(0)) Y = s(s(_G299)) ; X = 0+s(s(_G309)) Y = s(s(_G309)) ; X = _G299+s(s(s(0))) Y = s(s(s(_G299))) ; X = 0+s(s(s(_G316))) Y = s(s(s(_G316))) ; X = _G299+s(s(s(s(0)))) Y = s(s(s(s(_G299)))) ; X = 0+s(s(s(s(_G323)))) Y = s(s(s(s(_G323)))) ; X = _G299+s(s(s(s(s(0))))) Y = s(s(s(s(s(_G299))))) ; ... X = 0+s(s(s(s(s(s(_G337)))))) Y = s(s(s(s(s(s(_G337)))))) ; X = _G299+s(s(s(s(s(s(s(0))))))) Y = s(s(s(s(s(s(s(_G299))))))) v.v...
Cc php ton v s h c
83
III.2.
T i u php
quy
L i gi i cc bi ton s d ng quy trong cc ngn ng l p trnh ni chung th ng ng n g n, d hi u v d qu n l c chng trnh. Tuy nhin, trong m t s tr ng h p, s d ng quy l i x y ra v n v ph c t p tnh ton, khng nh ng t n km b nh m cn t n km th i gian. Trong cc ngn ng m nh l nh, php tnh n! s d ng quy c n s d ng b nh c c 0(n) v th i gian tnh ton cng c c 0(n), thay v g i quy, ng i ta th ng s d ng php l p fac=fac*i, i=1..n. Ta xt l i v d 4 tnh s Fibonacci trn y v i l i g i quy :
fib(N, F) :N > 1, N1 is N - 1, fib(N1, F1), N2 is N - 2, fib(N2, F2), F is F1 + F2.
r ng m i l n g i hm fib(n) v i n>1 s d n t i hai l n g i khc, ngha l s l n g i s tng theo lu th a 2. V i n l n, chng trnh g i quy nh v y d gy trn b nh . V d sau y l t t c cc l i g i c th cho tr ng h p n=5.
fib5 4 3 2 1 1 0 1 2 0 2 1 0 3 1
Hnh III.1. Bi u di n cy cc l i g i
quy tm s Fibonacci
M t s ngn ng m nh l nh tnh s Fibonacci s d ng c u trc l p trnh tnh i tnh l i cng m t gi tr . Chng trnh Pascal d i y dng hai bi n ph x=fib(i) v y=fib(i+1) :
{ tnh fib(n) v i n > 0 } i:= 1; x:= 1; y:= 0; while i < n do begin x:= x + y; y:= x y end;
84 N > 1, N1 is N - 1, F3 is F1 + F2, fib1(N1, F3, F2, FN). ?- fibo(21, F). F = 10946 Yes ?- fibo(200, F). F = 2.80571e+041 Yes
III.3. M t s v d khc v
III.3.1.
Cho m t th c nh h ng nh sau :
A
quy
th c
B
Tm ng i trong m t
nh h ng
th c
nh h ng.
Cc php ton v s h c
85
Ta th y nh ngha th t c path(X, Y) tng t th t c tm t tin gin ti p gi a hai ng i trong cng dng h ancestor(X, Y) xt tr c y.
?- path(X, Y). X = a Y = b ; X = b Y = c ; ...
III.3.2.
Tnh
di ng i trong m t
th
Ta xt bi ton tnh di ng i gi a hai nt, t nt u n nt cu i trong m t th l s cung gi a chng. Ch ng h n di ng i gi a hai nt a v d l 3 trong v d trn. Ta l p lu n nh sau : di ng i l 1. G i L l di ng i gi a hai nt X v Y, L1 l di ng i gi a m t nt th ba Z v Y n u t n t i v gi s c cung n i X v Z, khi
L = L1 + 1. N u gi a hai nt c cung n i chng th
III.3.3.
Tnh g n ng cc chu i
Trong Ton h c th ng g p bi ton tnh g n ng gi tr c a m t hm s v i chnh xc nh tu (e) theo phng php khai tri n thnh chu i Max Loren. V d tnh hm m ex v i chnh xc 10-6 nh khai tri n chu i Max Loren :
86
ex = 1 + x +
x 2 x3 + + ... 2! 3!
G i expower(X, S) l hm tnh gi tr hm m theo X, bi n S l k t qu g n ng v i chnh xc e=10-6. T cng th c khai tri n Max Loren trn y, ta nh n th y gi tr c a hm m ex l t ng v h n c d ng : sum(0) = 1, t0 = 1 tng ng v i x = 0 v ex = 1 sum(i+1) = sum(i) + ti+1, v i ti+1 = ti * x /( i+1), i = 0, 1, 2 ... th c hi n php l p, ta c n xy d ng hm quy tnh t ng sum(X, S, I, T) trong s d ng cc bi n trung gian I l b c l p th i v T l s h ng ti. Theo cch xy d ng ny, hm tnh t ng sum(X, S, I, T) l t ng c a cc s h ng th I tr i c a chu i. Qu trnh tnh cc t ng d ng l i khi ti< e, ngha l t c chnh xc e. T i th i i m ny, gi tr c a t ng cng chnh l s h ng ti. i u ki n kh i ng qu trnh l p l chuy n v t expower(X, S) thnh v t tnh t ng sum(X, S, I, T) v i gi tr u I=0 v T=1. Ta c chng trnh quy nh sau :
expower(X, S) :sum(X, S, 0, 1). sum(_, T, _, T) :abs(T) < 0.000001. sum(X, S, I, T) :abs(T) > 0.000001, I1 is I + 1, T1 is T*X/I1, sum(X, S1, I1, T1), S is S1 + T. ?- expower(1, S). S = 2.71828 Yes ?- expower(10, S) S = 22026.5 Yes
Tm t t chng 3
Cc php ton s h c c th c hi n nh cc th t c th ng tr trong Prolog.
Cc php ton v s h c
87
Vai tr c a cc php ton tng t vai tr c a cc hm t , ch nhm cc thnh ph n c a cc c u trc m thi. M i NLT c th t nh ngha nh ng php ton ring c a mnh. M i php ton c nh ngha b i tn, u tin v ki u g i tham i. Cc php ton cho php NLT v n d ng c php linh ho t cho cc nhu c u ring c a h . S d ng cc php ton lm cho chng trnh tr nn d c (readability). tnh m t bi u th c s h c, m i tham i c m t trong bi u th c ph i c rng bu c b i cc gi tr s . Ch d n op dng nh ngha m t php ton m i, g m cc y u t : tn, ki u v u tin c a php ton m i. S d ng cc php ton trung t , ti n t , ho c h u t lm tng c ng tnh d c c a m t chng trnh Prolog. u tin l m t s nguyn n m trong m t kho ng gi tr cho tr c, thng th ng n m gi a 1 v 1200. Hm t chnh c a m t bi u th c l php ton c u tin cao nh t. Cc php ton c u tin th p nh t c u tin nh t. Ki u c a m t php ton ph thu c vo hai y u t : 1. v tr c a php ton so v i cc tham i, 2. u tin c a cc tham i c so snh v i u tin c a php ton. i v i cc k hi u c t xfy, tham i x c u tin b hn h n u tin c a php ton, cn tham i y c u tin b hn ho c b ng u tin c a php ton.
Bi t p chng 3
1. Cho bi t k t qu c a cc cu h i sau y :
?- X=Y. ?- X is Y ?- X=Y, Y=Z, Z=1. ?- X=1, Z=Y, X=Y. ?- X is 1+1, Y is X. ?- Y is X, X is 1+1. ?- 1+2 == 1+2. ?- X == Y. ?- X == X.
88
?- 1 =:= 2-1 ?- X =:= Y.
2. Cho bi t k t qu c a cc cu h i sau y :
?- op(X) is op(1). ?- op(X) = op(1). ?- op(op(Z), Y) = op(X, op(1)). ?- op(X, Y) = op(op(Y), op(X)).
3. T cc nh ngha s t nhin (nat) v php c ng (addi) cho trong v d 1 m c nh ngha hm, hy vi t ti p cc hm tr (subt), nhn (multi), chia (divi), lu th a (power), giai th a (fact), so snh nh hn (less) v tm c s chung l n nh t (pdg) s d ng cc hm c (ch ng h n less, subt...). 4. Vi t hm Prolog ki m tra m t s nguyn tu N : a. N l s ch n (even number) s d ng quy tr c ti p H ng d n : N ch n th N2 cng l s ch n b. N l s l (odd number) s d ng quy tr c ti p H ng d n : N l th N2 cng l s l c. N ch n s d ng hm ki m tra s l cu d (N ch n th N1 l s l ) d. N l s l s d ng hm ki m tra s ch n cu c (N l th N1 ch n). 5. Vi t hm Prolog lm duy t (tracking/traverse) trn cy nh phn theo cc th t tr c (reorder), sau (post-order) v gi a (in-order). Gi s cy nh phn tng ng v i bi u th c s h c (5+6)*(3-(2/2)) l cc m nh Prolog nh sau :
tree(*, tree(+, leaf(5), leaf(6)), tree(-, leaf(3), tree(/, leaf(2), leaf(2)))
th t gi a :
[5, +, 6, *, 3, -, 2, /, 2]
th t sau :
[5, 6, +, 3, 2, 2, /, -, *]
6. Vi t l i hm t o 10 s t nhin ch n u tin ( cho trong ph n quy) sao cho k t qu tr v l dy s tng d n. 7. L p b ng nhn table(R, N) c s b nhn (multiplicator) t 1 tr i v i s nhn N (multiplier) v d ng l i khi g p s b nhn R (k t qu R * N).
Cc php ton v s h c
89
8. Vi t cc hm tnh g n ng gi tr cc hm sau v i
1 1 1 = 1 + +... 4 3 5 7 x2 2 x4 2 4 x6 + + + ... 2 3 4 3 5 6
cho cho
1+
n khi ph n t th n <
xn n khi < n!
e
n x2 x3 n x S = 1 - x + + ... + (-1) + ... 2! 3! n!
cho cho
S = 1+
n khi
x 2n < 10 5 (2 n)!
y=
x +
c n > 1 d u cn
9. Trnh Prolog d i y l m t trnh di n d ch (interpreter) cho m t ngn ng l p trnh n gi n ch g m cc s nguyn int(N), cc bi n id(X), cc hm fn(X,E), v g i hm app(E1,E2) :
%% subst(E1, E2, X, V) %% th c hi n php th bi n X b i bi n V trong E1 subst(int(N), int(N), _, _). subst(id(X), V, X, V). subst(id(Y), id(Y), X, _) :X \= Y. subst(fn(X, E), fn(X, E), X, _). subst(fn(Y, Ea), fn(Y, Eb), X, V) :X \= Y, subst(Ea, Eb, X, V). subst(app(E1a, E2a), app(E1b, E2b), X, V) :subst(E1a, E1b, X, V), subst(E2a, E2b, X, V). %% reduce(E, V) %% th c hi n php tnh gi tr c a E reduce(int(N), int(N)). reduce(fn(X, B), fn(X, B)) reduce(app(E1, E2), V) :reduce(E1, fn(X, B)), reduce(E2, V2),
tr v E2.
tr v V.
90
subst(B, E, X, V2), reduce(E, V).
Cu h i : a. Cho bi t cch trao i tham bi n h p l trong ngn ng m t trn y ? Cch trao i tham bi n no th khng th th c hi n c ? b. Tm cch thay i trnh Prolog trn y c th th c hi n c cc phng php trao i tham bi n khc nhau. c. Cho bi t t m v c (scope) c a cc bi n l tnh hay ng ? 10. Cho v d m t th khng nh h ng d i y :
arc(a,b). arc(b,c). arc(c,d). arc(c,e). arc(c,g). arc(g,f). arc(d,f). arc(f,a). arc(a,b). arc(h,i). arc(i,j).
Hy vi t hm tm ng i gi a hai
nh c a
th .