You are on page 1of 99

PGS.TS.

PHAN HUY KHNH

L p t rnh L g ch trong Prolog

NH XU T B N

I H C QU C GIA H N I 2004

PGS.TS. PHAN HUY KHNH

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

PH L C A M T S PH L C B I. II. II.1. II.2. II.3. II.4. II.5. III.

CHNG TRNH PROLOG ............................... 187

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

TI LI U THAM KH O ............................................................................... 203

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

I.1. Prolog l ngn ng l p trnh lgich

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

L p trnh lgic trong Prolog

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.

I.2. C php Prolog


I.2.1. Cc thu t ng
M t chng trnh Prolog l m t c s d li u g m cc m nh (clause). M i m nh c xy d ng t cc v t (predicat). M t v t l m t pht bi u no v cc i t ng c gi tr chn ng (true) ho c sai (fail). M t v t c th c cc i l cc nguyn lgich (logic atom). M i nguyn t (ni g n) bi u di n m t quan h gi a cc h ng (term). Nh v y, h ng v quan h gi a cc h ng t o thnh m nh . H ng c xem l nh ng i t ng d li u trong m t trnh Prolog. H ng c th l h ng s c p (elementary term) g m h ng (constant), bi n (variable) v cc h ng ph c h p (compound term). Cc h ng ph c h p bi u di n cc i t ng ph c t p c a bi ton c n gi i quy t thu c lnh v c ang xt. H ng ph c h p l m t hm t (functor) c ch a cc i (argument), c d ng Tn_hm_t ( i_1, ..., i_n) Tn hm t l m t chu i ch ci v/ho c ch s c b t u b i m t ch ci th ng. Cc i c th l bi n, h ng s c p, ho c h ng ph c h p. Trong Prolog,

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

c th l m t s ki n, m t lu t (hay quy t c), hay m t cu h i. k t thc nh sau :

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.

L p trnh lgic trong Prolog

Cc k t

c bi t, ch ng h n + - * / < > = : . & _ ~.

I.2.3. Ch thch Trong m t chng trnh Prolog, ch thch (comment) c

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

Prolog s b qua t t c cc ph n ch thch trong th t c.

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" "" "\""

t gi a hai d u nhy kp.

chu i c tu k t chu i r ng (empty string) chu i ch c m t d u nhy kp.

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

L p trnh lgic trong Prolog

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

y, v t parent c hai i l tom v bill. Ng i ta c th bi u di n v t ny b i m t cy nh trong Hnh III.1 (b) : nt g c l tn c a v t , cn cc nt l l cc i.


mar y bil l ann jim sue tom liz tom bill parent

(a)
Hnh III.1.Cy gia h .

(b) nh n c m t

T cy gia h trn y, c th ti p t c vi t cc v t khc chng trnh Prolog g m 6 v t nh sau :


parent(mary, bill). parent(tom, bill). parent(tom, liz). parent(bill, ann). parent(bill, sue). parent(sue, jim).

Sau khi h 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

cu h i Bill c ph i l cha m c a Sue c g vo trong h th ng Prolog (d u nh c ?-_) nh sau :


?- parent(bill, sue).

i tho i

Sau khi tm th y s ki n ny trong chng trnh, Prolog tr l i :


Yes

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

V tn ben cha c a vo trong chng trnh. Ta c th ti p t c cc cu h i th v khc. Ch ng h n, ai l cha (hay m ) c a Liz ?


?- parent(X, liz).

t ra

L n ny, Prolog khng tr l i Yes ho c No, m a ra m t gi tr c a X lm tho mn cu h i trn y :


X = tom

bi t c ai l con c a Bill, ta ch c n vi t :
?- parent(bill, X).

V i cu h i ny, Prolog s c hai cu tr l i,


X = ann ->;

u tin l : t c a Prolog, NSD

bi t c cu tr l i ti p theo, trong h u h t cc ci ph i g vo m t d u ch m ph y (;) sau -> (Arity Prolog) :


X = sue

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

L p trnh lgic trong Prolog

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

Hnh III.2. Quan h ng b c h p thnh t hai quan h cha m .

Lc ny, c th vi t trong Prolog nh sau :


?- parent(Y, jim), parent(X, Y).

Prolog tr l i :
Y = sue X = bill Yes

Cu h i trn y tng ng v i cu h i : tm X v Y tho mn :


parent(Y, jim)

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 ?

?- parent(tom, X), parent(X, Y). X = bill Y = ann->; X = bill Y = sue ->; No

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

Trong Prolog, cu h i cn c g i l ch (goal) c n ph i c tho mn (satisfy). M i cu h i t ra i v i c s d li u c th tng ng v i m t ho c nhi u ch. Ch ng h n dy cc ch :


parent(X, ann), parent(X, sue).

tng ng v i cu h i l php h i (conjunction) c a 2 m nh X l m t cha m c a Ann, v X l m t cha m c a Sue.

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

L p trnh lgic trong Prolog

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

c gi i thch : Mary l n . Tuy nhin, ta cng c th s d ng quan h nh phn nh ngha gi i tnh :


sex(mary, female). sex(tom, male). sex(bill, male).

... By gi ta a vo m t quan h m i child,


child(liz, tom).

i ng c v i parent nh sau :

, ta

nh ngha lu t m i nh sau :

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

Lu t trn c hi u l : V i m i X v Y, Y l con c a X n u X l cha (hay m ) c a Y. hay

u v ngn ng Prolog

11

V i m i X v Y, n u X l cha (hay m ) c a Y th Y l con c a X. C s khc nhau c b n gi a s ki n v lu t. M t s ki n, ch ng h n :


parent(tom, liz).

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:

ph n bn ph i (RHS: Right Hand Side) ch (body) c a lu t, v

i u ki n, cn c g i l thn u

ph n bn tri (LH: Left Hand Side S) ch k t lu n, cn c g i l (head) c a lu t.

N u i u ki n parent(X, Y) l ng, th child(Y, X) cng ng v l h u qu lgich c a php suy lu n (inference).


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

Cu h i sau y gi i thch cch Prolog s d ng cc lu t : Liz c ph i l con c a Tom khng ?


?- child(liz, tom)

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

L p trnh lgic trong Prolog

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

X parent Y parent Z grandparent

Hnh III.3.

nh ngha quan h con, m v ng b s d ng m t quan h khc.

Nh v y, quan h ngb grandparent c vi t nh sau :


grandparent(X, Z) :- parent(X, Y), parent(Y, Z).

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

nh ngha quan h ch em gi sister nh sau :

V i m i X v Y, X l m t ch (em) gi c a Y n u (1) X v Y c cng cha (cng m ), v (2) X l n .


sister(X, Y) :-

u v ngn ng Prolog parent(Z, X), parent(Z, Y), woman(X).


Z parent woman X sister parent Y

13

Hnh III.4.

nh ngha quan h ch (em) gi.

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

Ta cng c th h i ai l ch em gi c a Sue nh sau :


?- sister(X, sue).

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)

c Prolog nh n bi t v c tho mn n u v ch n u X v Y khng b ng nhau. nh ngha ch (em) gi m i nh sau :


sister(X, Y) :parent(Z, X), parent(Z, Y), woman(X). 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

L p trnh lgic trong Prolog

T t c m i ng i u ch t. Socrate l m t ng i. Ta vi t trong Prolog nh sau :


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

M t nh l c suy lu n m t cch lgich t hai tin ch t. Ta t cc cu h i nh sau :


?- mortal(socrate). Yes

ny l Socrate ph i

V d III.3 : ch Paul cng l ng i, cn Bonzo l con v t, ta vi t cc s ki n :


man(paul). animal(bonzo).

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 :

?- speak(bonzo). No ?- speak(paul). Yes

V d III.4 : Ta xy d ng cc s ki n v cc lu t c d ng v t ch a tham ta l y m t v d khc v s ki n v lu t khng ch a tham i :


'It is sunny'. 'It is summer'. 'It is hot' :'It is summer', 'It is sunny'. 'It is cold' :'It is winter', 'It is snowing'.

i, sau y,

T chng trnh trn, ta c th


?- 'It is hot'. Yes

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)

Hnh III.5. Quan h t tin : (a) X l t tin tr c ti p c a Z, (b) X l t tin gin ti p c a Z.

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)

% lu t 2 : t tin gin ti p l ng b (tam % t tin gin ti p l c ng c b (t i)

16 ancestor(X, Z) :parent(X, Y1), parent(Y1, Y2), parent(Y2, Y3), parent(Y3, Z). % ng i

L p trnh lgic trong Prolog ng ng

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

Trong Prolog, h u h t cc chng trnh ph c t p l m t kh nng m nh c a Prolog.


parent X Y ancestor ancestor

u s d ng

quy,

quy

...

Hnh III.7.D ng

quy c a quan h t tin ( c quay ngang cho thu n ti n).

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

ny lin quan (concern) n quan h u lin quan n m t quan h , ng i ta nh n c m t th t c (procedure).

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

L p trnh lgic trong Prolog

Lu t trn nu ln r ng v i m i X, X c m t con n u X l cha c a m t Y no . Ta th y ch have_a_child khng ph thu c g vo tn c a con, v v y c th s d ng bi n n c danh nh sau :


have_a_child(X) :- parent(X, _).

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 :

someone_has_a_child :- parent(X, Y).

nhng hon ton khc v i :


someone_has_a_child :- parent(X, X).

N u bi n n c danh xu t hi n trong m t cu h i, th Prolog s khng hi n th gi tr c a bi n ny trong k t qu tr v . N u ta mu n tm ki m nh ng ng i c con, m khng quan tm n tn con l g, th ch c n vi t :


?- parent(X, _).

ho c tm ki m nh ng ng i con, m khng quan tm


?- parent(_ , X).

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

nh ngha ki 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

02 september 2003 (a)

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

L p trnh lgic trong Prolog

5 IV.2. M t s Hnh

i t ng hnh h c n gi n.

, cc

(6, i 4 trn Hnh IV.2 c bi u di 4) b i cc h ng nh sau : t ng n

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

Hnh IV.4. C u trc cy c a bi u th c (a + b) * (c 5)

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

L p trnh lgic trong Prolog

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)

M i qu trnh so kh p l tch c c (positive), n u t t c cc qu trnh so kh p b tr l tch c c.

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

L p trnh lgic trong Prolog

point(X, Y1)

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

point(X, Y)

Hnh IV.6. Minh ho cc o n th ng n m ngang v th ng

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

Sau y l m t v d khc minh ho hai c u trc c s kh p v i nhau.


student jean X address maljuin caen student jean info Y

Hnh IV.7. K t qu so kh p : student( jean, X, address(maljuin, caen) ) = student( jean,info, Y ).

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

L p trnh lgic trong Prolog

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

Hy cho bi t c th lm ng n chng trnh trn b ng cch s d ng d u ch m ph y ; c khng ? 4. Hy tm hi u m t nh ngha m i v quan h ancestor :


ancestor(X Z) :parent(X Z) . ancestor(X Z) :parent(Y , Z), ancestor( X, Y).

nh ngha ny c ng hay khng ? C th thay i 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

8. Cho quan h parent c c a cc cu h i sau :

nh ngha trong ph n l thuy t cho bi t k t qu

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

L p trnh lgic trong Prolog

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 c a hnh ch nh t theo chi u dng, hy

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.

ngha c a chng trnh Prolog


Quan h gi a Prolog v lgich ton h c

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

L p trnh lgic trong Prolog

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.

II. Cc m c ngha c a chng trnh Prolog


Cho n lc ny, qua cc v d minh ho , ta m i ch hi u c tnh ng n v k t qu c a m t chng trnh Prolog, m cha hi u c lm cch no h th ng tm c l i gi i. M t chng trnh Prolog c th c hi u theo ngha khai bo (declarative signification) ho c theo ngha th t c (procedural signification). V n l c n phn bi t hai m c ngha c a m t chng trnh Prolog, l ngha khai bo v ngha th t c. Ng i ta cn phn bi t m c ngha th ba c a m t chng trnh Prolog l ngha lgich (logical semantic). Tr c khi nh ngha m t cch hnh th c hai m c ng ngha khai bo v th t c, ta c n phn bi t s khc nhau gi a chng. Cho m nh :
P :- Q, R.

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.

Ng ngha c a chng trnh Prolog

31

II.1. Ngha khai bo c a chng trnh Prolog


V m t hnh th c, ngha khai bo, hay ng ngha ch (intentional semantic) xc nh cc m i quan h c nh ngha trong chng trnh. Ngha khai bo xc nh nh ng g l k t qu ( ch) m chng trnh ph i tnh ton, ph i t o ra. Ngha khai bo c a chng trnh xc nh n u m t ch l ng, v trong tr ng h p ny, xc nh gi tr c a cc bi n. Ta a vo khi ni m th nghi m (instance) c a m t m nh C l m nh C m m i m t bi n c a n c thay th b i m t h ng. M t bi n th (variant) c a m t m nh C l m nh C sao cho m i m t bi n c a n c thay th b i m t bi n khc. V d II.1 : Cho m nh :
hasachild(X) :parent(X, Y).

Hai bi n th c a m nh

ny l :

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

Cc th nghi m c a m nh

ny l :

hasachild(tom) :parent(tom, Z). hasachild(jafa) :parent(jafa, small(iago)).

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

L p trnh lgic trong Prolog

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

Gi m nh trn c ba m nh c cng h ng l a(X). M i m nh l m t phng n gi i quy t bi ton cho. Prolog quy c :


m i d u ph y (comma)

c a gi

t gi a cc m nh , hay cc ch, ng vai tr php h i (conjunction). V m t lgich, chng ph i ng t t c .

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)

c c l : P ng n u Q ng ho c R ng. Ng i ta cng c th vi t tch ra thnh hai m nh :


P :- Q. P :- R.

Trong Prolog, d u ph y (php h i) c m c (php tuy n). V d :


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

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

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

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.

Ng ngha c a chng trnh Prolog

33

II.3. Ngha lgich c a cc m nh


Ngha lgich th hi n m i lin h gi a c t lgich (logical specification) c a bi ton c n gi i v i b n thn chng trnh.

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)

Ngha lgich P(X) ng n u X = a P(X) ng n u X = a ho c X = b P(X) ng n u X = a v Q(c) ng P(X) ng n u ho c (X = a v Q(c) ng) ho 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)

Ngha lgich V i m i gi tr c a X, P(X) ng

V i m i gi tr c a X, P(X) ng n u Q(X) P(X) Q(X) ng

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

V i m i gi tr c a X, P(X) ng n u ho c P(X) (Y Q(X, Y) t n t i Y sao cho Q(X, Y) v R(Y) ng, R(Y)) ho c X = a (X = a)

34

L p trnh lgic trong Prolog

3. Ngha lgich c a cc ch
ch
p(a).

Ngha lgich C ph i p(a) ng (tho mn) ? u ng ?


P(X) v Q(X,

p(a), Q(b). C ph i c p(a) v Q(b) P(X).

Cho bi t gi tr c a X

P(X) l ng ?

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

Cho bi t cc gi tr c a X v c a Y u l ng ?

II.4. Ngha th t c c a Prolog


Ngha th t c, hay ng ngha thao tc (operational semantic), l i xc nh lm cch no nh n c k t qu , ngha l lm cch no cc quan h c x l th c s b i h th ng Prolog. Ngha th t c tng ng v i cch Prolog tr l i cc cu h i nh th no (how) hay l p lu n trn cc tri th c. Tr l i m t cu h i c ngha l tm cch xa m t danh sch. i u ny ch c th th c hi n c n u cc bi n xu t hi n trong cc ch ny c rng bu c sao cho chng c suy ra m t cch lgich t chng trnh (hay t cc tri th c ghi nh n). Prolog c nhi m v th c hi n l n l t t ng ch trong m t danh sch cc ch t m t chng trnh cho. Th c hi n m t ch c ngha l tm cch tho mn hay xo ch kh i danh sch cc ch .
chng trnh (s ki n+lu t) d u hi u thnh cng/th t b i rng bu c cc bi n

danh sch cc ch

execute

Hnh II.1. M hnh vo/ra c a m t th t c th c hi n m t danh sch cc ch.

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.

Ng ngha c a chng trnh Prolog

35

V d II.3 : Minh ho cch Prolog tr l i cu h i cho v d chng trnh gia h tr c y nh sau : ch c n tm l :


?- ancestor(tom, sue)

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

Do ch l ancestor(tom, sue), cc bi n ph i c rng bu c nh sau :

36 X = tom, Z = sue

L p trnh lgic trong Prolog

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

parent(tom, sue) Hnh II.2. X l b c u tin : ch pha trn c tho mn n u Prolog c th xo ch

pha d i.

Lc ny Prolog ph i ti n hnh quay lui (backtracking) tr l i ch ban ti p t c x l m nh khc l lu t th hai :


ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z).

u,

Tng t b c x l th nh t, cc bi n X v Z c rng bu c nh sau :


X = tom, Z = sue

ch pha trn ancestor(tom, sue) c thay th b i hai ch l :


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

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 :

Ng ngha c a chng trnh Prolog

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,

Hnh II.3. Cc giai o n th c hi n x l xo ch.

Sau khi ch th nh t parent(tom, bill) tho mn, cn l i ch th hai :


ancestor(bill, sue)

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 :

u ph i tng ng v i ch th nh t, ancestor(bill, sue), t c

X = bill, Z = sue ancestor(tom,


B i lu t 1 B i lu t 2

parent(tom, sue)
Th t b i

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


Y = bill b i parent(tom, bill)

ancestor(bill, sue)
Thnh cng B i lu t 1

parent(bill, Hnh II.4. Qu trnh th c hi n xo ch ancestor(tom, sue).

ch (trong ph n thn) ph i thay th b i :

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

L p trnh lgic trong Prolog

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

Ng ngha c a chng trnh Prolog

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

L p trnh lgic trong Prolog

Qu trnh th c hi n th t c execute c m t nh sau :


Chng trnh Prolog hay c s d li u

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

Khng c bi n trng nhau :

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

Sau y l th t c execute c vi t b ng gi ng Pascal.


Procedure execute(program, goallist, success); { Tham i vo : program danh sch cc m nh goallist danh sch cc ch

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.

Ng ngha c a chng trnh Prolog

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

L p trnh lgic trong Prolog

chng trnh u c duy t ch hi n hnh. V d II.4 : Cho chng trnh :


thick(bear). thick(elephant). small(cat). brown(bear). grey(elephant). black(cat). dark(Z) :- black(Z). dark dark(Z) :- brown(Z). dark

n, m ch duy t nh ng m nh

c lin quan

% % % % % % %

clause clause clause clause clause clause clause

1 2 3 4 5 6 7: all this who is black is

% clause 8: all this who is brown is

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

Thay th ch u tin b i ph n thn c a m nh 7 sau khi c rng bu c (th bi n Z b i X) nh n c m t danh sch cc ch m i :


black(X), thick(X). (3) Tm ki m trong chng trnh m t m nh

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

Ng ngha c a chng trnh Prolog

43

Sau khi thay th b i brown(X)trong danh sch cc ch, ta nh n c :


brown(X), thick(X) (5) Tm ki m cho rng bu c brown(X),

M nh

c k t qu l brown(bear). ny l m t s ki n, danh sch cc ch thu g n l i thnh :

thick(bear) (6) Vi c tm ki m trong chng trnh d n

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

Qu trnh th c hi n c gi i thch trong hnh d i y.


dark(X), thick(X) dark(Z) :- black(Z). Quay lui dark(Z) :- brown(Z).

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

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

(X|cat)
thick(cat) Th t b i

Hnh II.6. Qu trnh th c hi n xo ch dark(X), thick(X).

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

L p trnh lgic trong Prolog

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.

III. V d : con kh v qu chu i


III.1. Pht bi u bi ton
Trong tr tu nhn t o, ng i ta th ng l y ti con kh v qu chu i (monkey and banana problem) minh ho vi c h p gi i bi ton. Sau y, ta s trnh by lm cch no v n d ng so kh p v quay lui cho nh ng ng d ng nh v y. Ta s tri n khai m t cch phi th t c, sau nghin c u tnh th t c m t cch chi ti t.

Ng ngha c a chng trnh Prolog

45

Hnh III.1. Minh ho bi ton con kh v qu chu i.

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.

III.2. Gi i bi ton v i Prolog


Bi ton con kh v qu chu i c xem nh m t tr chi ch c m t ng i chi. Ta hnh th c ho bi ton nh sau : u tin, ch c a tr chi l tnh hu ng con kh l y c qu chu i, ngha l m t tr ng thi state b n thnh ph n, thnh ph n th t l possessing (chi m h u) :
state(_, _, _, possessing)

46

L p trnh lgic trong Prolog

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

State 2 Hnh III.3. Di chuy n tr ng thi.

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

trn y c r t nhi u ngha :

Ng ngha c a chng trnh Prolog

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.

Cu h i t ra cho bi ton s l Xu t pht t v tr c qu chu i khng ? v i v t sau y :


couldtake(S)

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

hi n m t ho c nhi u di c th l y c qu chu i S1 n m t tr ng thi S2 c qu chu i.

V t couldtake c d ng quy, tng t v i quan h ancestor xt u chng. Chng trnh Prolog y nh sau :

48

L p trnh lgic trong Prolog

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.

Ng ngha c a chng trnh Prolog

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

L p trnh lgic trong Prolog

III.3.
Xt m nh
p :- p

S p

t th

cc m nh

v cc ch

III.3.1. Nguy c g p cc vng l p v h n


sau y :

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,

s t o ra m t qu trnh th c thi khc. B n danh sch ch u tin nh c (cc tn bi n c (1) couldtake(state(tothedoor,


tothewindow, nothave))

t l i) :
onthefloor,

Sau khi m nh th hai c p d ng, ta c : (2) displacement(state(tothedoor, onthefloor,


tothewindow, nothave), M, S2), couldtake(S2)

V i chuy n

ng walking(tothedoor, P2), ta nh n c :

Ng ngha c a chng trnh Prolog

51

(3)

couldtake(state(P2, nothave))

onthefloor,

tothewindow,

p d ng l n n a m nh th hai c a couldtake : (4) displacement(state(P2, onthefloor, tothewindow,


nothave), M, S2), couldtake(S2)

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

B ng cch p d ng m nh th hai couldtake, ta nh n c (6) displacement(state(P2, onthefloor, tothewindow,


nothave), M, S2), couldtake(S2)

Ti p t c p d ng m nh walking cho m nh th nh t v ta c : (7) 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

L p trnh lgic trong Prolog

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 .

III.3.2. Thay trnh

i th

m nh

v ch trong chng

Ngay cc v d u chng, ta th y nguy c x y ra cc vng l p v h n. Chng trnh m t quan h t tin :


ancestor(X, Z) :parent(X, Z). ancestor(X, Z) :parent(X, Y), ancestor(Y, Z).

Ta hy xt 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

Ng ngha c a chng trnh Prolog

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

L p trnh lgic trong Prolog

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

Hnh III.6. Bi n th a c a quan h t tin tr l i cu h i Tom c ph i l m t t tin c a Sue ?

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 :

Ng ngha c a chng trnh Prolog


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

Hnh III.7. Bi n th b c a quan h t tin tr l i cu h i Tom c ph i l m t t tin c a Sue ?


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

Hnh III.8. Bi n th c c a quan h t tin tr l i cu h i Tom c ph i l m t t tin c a Sue ?

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

L p trnh lgic trong Prolog

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.

quy v h n. Nh v y, ta khng th xem anc3 l

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.

Ng ngha c a chng trnh Prolog

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

L p trnh lgic trong Prolog bird(X) :- animal(X), has_feathers(X).

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.

4. T chng trnh execute trong l thuy t, hy v s c a Prolog t cu h i sau :


?- thick( X ) , dack( X ).

qu trnh th c hi n

Hy so snh cc qu trnh m ph ng cu h i trn v cc ch d i y :


?- dack( X ), thick( X ).

5.

i u g x y ra khi yu c u Prolog tr l i cu h i sau y :


?- X = f( X ).

So kh p c thnh cng khng ? Gi i thch v sao m t s h th ng Prolog tr l i :


X = f(f(f(f(f(f(f(f(f(f( ... )))))))))) Yes

6. Tm cc php thay th h p th c v tm k t qu (n u c) c a cc php so kh p sau y :


a(1, 2) = a(X, X). a(X, 3) = a(4, Y). a(a(3, X)) = a(Y).

Ng ngha c a chng trnh Prolog

59

1+2 = 3. X = 1+2. a(X, Y) = a(1, X). a(X, 2) = a(1, X).

7. Cho tr c chng trnh d i y :


f( f( f( f( 1, one ). s(1) , two ). s( s( 1 ) ) , three ). s( s( s( X ) ) ), N ) :f(X , N+3).

Hy cho bi t cch Prolog tr l i cc cu h i sau y (khi c nhi u cu tr l i c th , hy a ra t nh t hai cu tr l i) ?


a) ?- f( s( 1 ) , A ). b) ?- f( s( s( 1 ) ) , two ). c) ?- f( s( s( s( s( s( s( 1 ) ) ) ) ) ), C ). d) ?- f( D, three ).

8. Cho cc v t p, a1, a2, a3, a4 c


p(a, b). p(b, c b). a1(X, Y) :- p(X, Y).

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

a) V cy h p gi i SLD c cc g c l a1(a, X), a2(a, X), a3(a, X), a4(a, X) ?


b) So snh ngha lgich c a cc v t a1, a2, a3, a4 ?

9. Vi t gi cc m nh

nh ngha cc hm sau :

a) greathan(X, N) tr v gi tr X n u X > N, tr v N n u khng ph i.

60

L p trnh lgic trong Prolog b) sum_diff(X, Y, X) tr v trong Z gi tr t ng X + Y n u X > Y, tr v hi u X - Y n u khng ph i.

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

Chng ny trnh by s h c s c p, cc php ton v m t s v t chu n c s d ng trong cc chng trnh Prolog.

I.

S h c

I.1. Cc php ton s h c


Nh bi t, Prolog l ngn ng ch y u dng x l k hi u, khng thch h p tnh ton s . Do v y, cc phng ti n tnh ton trong h u h t cc h th ng Prolog u r t h n ch . Sau y l b ng cc php ton s h c chu n (standard arithmetic operations) c a Prolog : K hi u
+ * / // mod **

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

L p trnh lgic trong Prolog

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

th Prolog s tr l i theo ki u c a Prolog :


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

Php c ng th c hi n c l nh m t th t c ton +. Nh ng th t c nh v y c g i l th procedures).


?- X = 1 + 1 + 1, Y is X. X = 1 + 1 + 1, Y = 3. ?- X is 1 + 1 + a.

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

ERROR: Arithmetic: `a/0' is not a function (sai do a khng

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

L p trnh lgic trong Prolog

I.3.

nh ngha cc php ton trong Prolog

Bi u th c ton h c th ng c vi t d i d ng trung t (infix) nh sau :


2 * a + b * c

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 :

Cc php ton v s h c *( + (a, b), c)

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

Tnh k t h p xc nh v tr d u ngo c theo th t u tin nh sau : N u l k t h p tri, ta c : (a op b) op c

66

L p trnh lgic trong Prolog

N u l k t h p ph i, ta c : a op (b op c) Cc quy t c trn cho php lo i b tnh nh p nh ng c a cc bi u th c ch a cc php ton c cng u tin. Ch ng h n :


a - b - c

s c hi u l (a - b ) - c, m khng ph i a - (b - c). - c ki u trung t yfx. Xem Hnh I.3 d i y.

y, php tr

By gi ta l y m t v d khc v php ton ti n t m t ngi not. N u not c x p ki u fy, th bi u th c sau y vi t ng :


not not p

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

L p trnh lgic trong Prolog

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.

Hnh 3.5. Cc php ton ti n

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 :

equivalent( not ( and( A, B ) ), or(not ( A ), not ( B ) ) ).

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

Hnh I.4. Bi u di n cy c a h ng ~ ( A & B ) <===> ~ A ~ B

Trong v d trn, ta d dng


:- op( 700, xfy, v ). :- op( 600, xfy, & ). :- op( 500, fy, ~ ).

nh ngha l i cc php ton lgich nh sau :

:- op( 800, xfx, <===> ).

y,

nh l Morgan c vi t l i thnh h ng sau (xem hnh trn) :

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

II. Cc php so snh c a Prolog


II.1. Cc php so snh s h c
Prolog c cc php so snh v hm s h c nh sau :
K hi u Expr1 > Expr2 Expr1 < Expr2 Expr1 =< Expr2 Expr1 >= Expr2 Expr1 =\= Expr2 Expr1 =:= Expr2 between(Low, High, Value) succ(Int1, Int2) plus(Int1, Int2, Int3) Gi i thch php ton Thnh cng n u Expr1 c gi tr s l n hn Expr2 Thnh cng n Thnh cng n Expr2 Thnh cng n b ng Expr2 Thnh cng n u Expr1 c gi tr s nh hn Expr2 u Expr1 c gi tr s nh hn ho c b ng u Expr1 c gi tr s l n hn ho c u Expr1 c gi tr s khc Expr2

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

L p trnh lgic trong Prolog

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

II.2. Cc php so snh h ng


Cc php so snh h ng c a Prolog nh sau :
K hi u Term1 == Term2 Gi i thch php ton Thnh cng n u Term1 tng ng v i Term2. M t bi n ch ng nh t v i m t bi n cng chia s trong h ng (sharing variable) Tng ng v i \Term1 == Term2. Thnh cng n u Term1 kh p c v i Term2 Tng ng v i \Term1 = Term2 Thnh cng n u Term1 c cng c u trc (structurally equal) v i Term2. Tnh c cng c u trc y u hn tnh tng ng (equivalence), nhng l i m nh hn php h p nh t Tng ng v i `\Term1 =@= Term2' Thnh cng n u Term1 v Term2 theo th t chu n c a cc h ng Thnh cng n u ho c hai h ng b ng nhau ho c Term1 ng tr c Term2 theo th t chu n c a cc h ng Thnh cng n u Term1 chu n c a cc h ng ng sau Term2 theo th t

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

compare(?Order, H ng1, H ng2) Ki m tra th t <, > ho c = gi a hai

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

L p trnh lgic trong Prolog

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

ng) ? N l m t s (nguyn ho c th c) ? A l m t nguyn t ho c m t s ? X l m t h ng c c u trc ? X l m t h ng hon ton rng bu c ?

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

Ki m tra i (arity) Chuy n trnh ? i h ng T thnh danh sch L

functor(T, F, N) T l m t h ng v i F l h ng t v c N

clause(Head, Term) arg(N, Term, X) name(A, L)

Head :- Term l m t lu t trong chng

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

L p trnh lgic trong Prolog

% _G346 v _G347 l hai bi n c a

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

L p trnh lgic trong Prolog

c ti p t c nh v y cho n khi c 10 s 0 2 4 6 8 10 12 14 16 18 th d ng l i. Trong Prolog, m t m nh quy ( t o s l p ) l m nh c ch a trong thn (v ph i) t nh t m t l n l i g i l i chnh m nh (v tri) :


a(X) :- b(X, Y), a(Y).

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 :

M t cch khc d ng nh sau :

xy d ng s

l p c g i l

quy khng tr c ti p c

a(X) :- b(X). b(X) :- c(Y...), a(Z).

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

Bi ton t o 10 s t nhin ch n khng tr c ti p nh sau :


a(0).

u tin c vi t l i theo s

quy

Cc php ton v s h c a(X) :- b(X). b(X) :- X1 is X - 2, write(X), write(' '), a(X1).

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

nh ngha theo nat(X) nh sau :

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

V d 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

L p trnh lgic trong Prolog

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

gcd( X, Y, D ) :X > Y, gcd( Y, X, 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

V d III.4 : Tnh giai th a


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

M nh

th hai c ngha r ng n u l n l t :

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

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.

V d III.8 : Thu t ton h p nh t

80

L p trnh lgic trong Prolog

Sau y l m t thu t ton h p nh t n gi n cho php x l tr ng h p m t bi n no c thay th (h p nh t) b i m t h ng m h ng ny l i c ch a ng tn bi n . Ch ng h n php h p nh t X = f(X) l khng h p l .


% unify(T1, T2). unify(X, Y) :% tr ng h p 2 bi n var(X), var(Y), X = Y. unify(X, Y) :% tr ng h p bi n = khng ph i bi n var(X), nonvar(Y), X = Y. unify(X, Y) :% tr ng h p khng ph i bi n = bi n nonvar(X), var(Y), Y = X. unify(X, Y) :% nguyn t hay s = nguyn t hay s nonvar(X), nonvar(Y), atomic(X), atomic(Y), X = Y. unify(X, Y) :% tr ng h p c u trc = c u trc nonvar(X), nonvar(Y), compound(X), compound(Y), termUnify(X, Y). termUnify(X, Y) :% h p nh t h ng v i h ng ch a c u trc functor(X, F, N), functor(Y, F, N), argUnify(N, X, Y). argUnify(N, X, Y) :% h p nh t N tham N>0, argUnify1(N, X, Y), Ns is N - 1, argUnify(Ns, X, Y). argUnify(0, X, Y). argUnify1(N, X, Y) :- % h p nh t cc tham arg(N, X, ArgX), arg(N, Y, ArgY), unify(ArgX, ArgY).

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)

Cc php ton v s h c 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...

L p trnh lgic trong Prolog

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;

Ta vi t l i chng trnh Prolog nh sau :


fibo(0, 0). fibo(N, F) :N >= 1, fib1(N, 1, 0, F). fib1(1, F, _, F). fib1(N, F2, F1, FN) :-

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

L p trnh lgic trong Prolog

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

C E Hnh III.2. Tm ng i trong m t

th c

nh h ng.

Ta xt bi ton tm ng i gi a hai nh c a th . M i cung n i hai nh c a th bi u di n m t quan h gi a hai nh ny. T th trn, ta c th vi t cc m nh Prolog bi u di n cc s ki n :


arc(a, arc(b, arc(c, arc(c, arc(a, b). c). e). d). e).

Gi s c n ki m tra c t n t i m t ng i gi a hai nt a v d (khng t n t i ng i gi a hai nt ny nh m t ), ta vi t m nh :


path(a, d).

nh ngha ny, ta nh n xt nh sau : T n t i m t ng i gi a hai nt c cung n i chng.

Cc php ton v s h c

85

T n t i m t ng i gi a hai nt X v Y n u t n t i m t nt th ba Z sao cho t n t i m t ng i gi a X v Z v m t ng i gi a Z v Y.

Ta vi t chng trnh nh sau :


path(X, Y) :- arc(X, Y). path(X, Y) :arc(X, Z), path(Z, Y).

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

Chng trnh c vi t nh sau :


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

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

L p trnh lgic trong Prolog

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.

L p trnh lgic trong Prolog

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

K t qu duy t cy nh sau : theo th t tr c :


[*, +, 5, 6, -, 3, /, 2, 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

chnh xc e = 10-5 : n khi


1 < 2n - 1

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+

x 2 x4 x6 x 2n + + +...+ +... 2! 4! 6! (2 n)!


x + ... + x

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

L p trnh lgic trong Prolog

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 .

You might also like