50 Lp trình lôgic trong Prolog
( <UVM1!$!L!$!)!
( Iy!ơV!$!WVG
Xét mnh ! sau ây :
p :- p
Ngha ca mnh !« p úng nu p úng». V! mt khai báo, mnh ! hoàn
toàn úng 6n. Tuy nhiên, v! mt th tc, mnh ! không dùng  m gì. Trong
Prolog, mnh ! này gây ra r6c ri. Ta xét câu h=i :
?- p.
S dng mnh ! trên, ích p ưc thay th bi chính ích p, r>i li ưc
thay th bi p, và c th tip tc. Prolog b rơi vào tình trng quGn vô hn.
d này làm phương tin thc hin các vòng lp ca Prolog. Tr li ví d
con khD và qu chui trên ây, ta có th thay 1i th t các ích bên trong ca các
mnh !. Ch?ng hn các mnh ! thuc v! quan h displacement ã ưc s6p
xp như sau :
grab, climbing, pushing, walking
(ta có th b1 sung thêm mnh ! descending nu mun trn vFn).
Các mnh ! y nói r*ng con khD th n6m ly qu chui (grab), trèo n
hp (climbing), v.v... V! mt ng ngha th tc, th t các mnh ! i r*ng
trưc con khD vi ly ưc qu chui, phi trèo lên hp, trưc khi trèo n
hp, phi Gy cái hp, v.v... Vi th t y, con khD ly ưc qu chui (gii
quyt ưc bài toán). Bây gi nu ta thay 1i th t thì i!u s@ xy ra ? Gi
thit r*ng mnh ! walking xut hin u tiên. Lúc này, vic thc hin ích ã
t ra trên ây :
?- couldtake(state(tothedoor, onthefloor, tothewindow,
nothave)).
s@ to ra mt quá trình thc thi khác.
Bn danh sách ích u tiên như cB (các tên bin ưc t li) :
(1) couldtake(state(tothedoor, onthefloor,
tothewindow, nothave))
Sau khi mnh ! th hai ưc áp dng, ta có :
(2) displacement(state(tothedoor, onthefloor,
tothewindow, nothave), M’, S2’),
couldtake(S2’)
Vi chuyn ng walking(tothedoor, P2’), ta nhn ưc :
Ng ngha ca chưng trình Prolog 51
(3) couldtake(state(P2’, onthefloor, tothewindow,
nothave))
Áp dng ln na mnh ! th hai ca couldtake :
(4) displacement(state(P2’, onthefloor, tothewindow,
nothave), M’’, S2’’), couldtake(S2’’)
T thi im này, s khác nhau xut hin. Mnh ! u tiên có phn u có
th so khp vi ích u tiên trên ây bây gi s@ walking (mà không phi
climbing như trưc).
Ràng buc S2’’ = state(P2’’, onthefloor, tothewindow,
nothave). Danh sách các ích tr thành :
(5) couldtake(state(P2’’, onthefloor, tothewindow,
nothave))
B*ng cách áp dng mnh ! th hai couldtake, ta nhn ưc
(6) displacement(state(P2’’, onthefloor, tothewindow,
nothave), M’’’, S2’’’), couldtake(S2’’’)
Tip tc áp dng mnh ! walking cho mnh ! th nht và ta có :
(7) couldtake(state(P2’’’, onthefloor, tothewindow,
nothave))
Bây gi ta so sánh các ích (3), (5) và (7). Chúng gn như ging ht nhau, tr
các bin P2’, P2’’ P2’’’. Như ta ã thy, s thành công ca mt ích
không ph thuc vào tên các bin trong ích. i!u này có ngha r*ng k t danh
sách các ích (3), quá trình thc hin không s tin trin nào.
Thc t, ta nhn thy r*ng mnh ! th hai ca couldtake walking ã
ưc s dng qua li. Con khD i loanh quanh trong phòng không bao gi
ý nh s dng cái hp. Do không s tin trin nào, nên v! mt lý thuyt, quá
trình tìm n qu chui s@ din ra mt cách hn. Prolog s@ không x nhng
tình hung vô ích như vy.
d này minh ho Prolog ang th gii mt bài toán không bao gi t
ưc li gii, dHu r*ng li gii t>n ti. Nhng tình hung như vy không phi là
him khi lp trình Prolog. Ngưi ta cBng hay gp nhng vòng lp quGn hn
trong các ngôn ng lp trình khác. Tuy nhiên, i!u không bình thưng so vi các
ngôn ng lp trình khác chương trình Prolog úng 6n v! mt ng ngha khai
báo, nhưng li không úng 6n v! mt th tc, ngha không câu tr li i
vi câu h=i cho trưc.
Trong nhng trưng hp như vy, Prolog không th xoá mt ích Prolog
c g6ng ưa ra mt câu tr li trong khi ang i theo mt con ưng xu (không
dHn n thành công).
52 Lp trình lôgic trong Prolog
Câu h=i chúng ta mun t ra là : liu chúng ta th thay 1i chương trình
sao cho th d phòng trưc nguy cơ b quGn ? phi chúng ta luôn luôn b
ph thuc vào s s6p t th t úng 6n ca các mnh ! và các ích ? ràng
r*ng các chương trình ln s@ tr nên d sai t nu phi da trên mt th t nào
ó ca các mnh ! các ích. T>n ti nhi!u phương pháp khác cho phép loi
b= các vòng lp hn, t1ng quát hơn áng tin cy hơn so vi phương pháp
s6p t th t. Sau ây, chúng ta s@ s dng thưng xuyên nhng phương pháp
này trong vic tìm kim các con ưng, hp gii các bài toán và duyt các > th.
( PayQM1L)!!ươ
 
Ngay các d u chương, ta ã thy nguy c xy ra các vòng lp hn.
Chương trình mô t quan h t1 tiên :
ancestor(X, Z) :-
parent(X, Z).
ancestor(X, Z) :-
parent(X, Y),
ancestor(Y, Z).
Ta hãy xét mt s bin th ca chương trình này. V! mt khai báo, tt c các
chương trình tương ương, nhưng v! mt th tc, chúng s@ khác nhau. Tham
kho ng ngha khai báo ca Prolog, không nh hưng n ngha khai báo, ta
th thay 1i như sau :
(1) Th t các mnh ! trong mt chương trình, và
(2) Th t các ích bên trong thân ca các mnh !.
Th tc ancestor trên ây g>m hai mnh !, uôi mnh ! th nht mt
ích con uôi mnh ! th hai hai ích con. Như vy chương trình s@ có
bn bin th (=1×2×2) mà c bn !u cùng ngha khai báo. Ta nhn ưc như
sau :
(1) o th t các mnh !,
(2) o th t các ích cho mAi s6p t th t các mnh !.
Hình dưi ây mô t bn th tc anc1, anc2, anc3, anc4 :
% Th tc gc
anc1(X, Z) :-
parent(X, Z).
anc1 (X, Z) :-
parent(X, Y),
anc1 (Y, Z).
% Bin th a : hoán 1i các mnh !
Ng ngha ca chưng trình Prolog 53
anc2 (X, Z) :-
parent(X, Y),
anc2 (Y, Z).
anc2(X, Z) :-
parent(X, Z).
% Bin th b : hoán 1i các ích ca mnh ! th hai
anc3(X, Z) :-
parent(X, Z).
anc3 (X, Z) :-
anc3 (X, Y),
parent(Y, Z).
% Bin th c : hoán 1i các ích và các mnh !
anc4 (X, Z) :-
anc4 (X, Y),
parent(Y, Z).
anc4(X, Z) :-
parent(X, Z).
% Các câu h=i ưc t ra ln 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
54 Lp trình lôgic trong Prolog
Hình III.6. Bin th! a ca quan h t tiên tr li câu h"i
“Tom có phimt t tiên ca Sue ?”
Trong trưng hp cui cùng, Prolog không th m ra câu tr li. Do b quGn
hn nên Prolog thông báo “không  b nh”. Hình 2.4. t quá trình thc
hin ca anc1 (trưc ây là ancestor) cho cùng mt câu h=i.
Hình 2.13 (a, b, c) mô t quá trình thc hin ca anc2, anc3 anc4. Ta
thy anc4 không hy vng anc2 kém hiu qu hơn so vi anc1 do thc
hin nhi!u ln tìm kim và quay lui hơn trong cây.
So sánh các quá trình so khp trong các hình v@, ta thy r*ng cn khai báo các
mnh !  ơn gin khi gii các bài toán. i vi bài toán quan h t1 tiên, c
bn bin th !u da trên hai ý :
Y’’ = sue
tht bi
tht bi
anc2(X, Z)
:
-
parent (X, Y),
anc2 (Y, Z),
anc2(X , Z) :-
parent (X, Z).
anc2(tom, sue)
anc2(Y’, sue)
Y’ = bill
anc2(bill, sue)
parent (bill, Y’’)
anc2 (Y’’, sue)
parent (bill, sue)
thành công
Y” = ann
anc2(ann, sue)
parent(ann, Y’’’)
anc2(Y’’’, sue)
parent (ann, sue)
parent(jim, Y’’’)
anc2(Y’’’, sue)
anc2(sue, sue)
parent (sue, Y’’’)
anc2(Y’’’, sue)
parent (sue, sue)
th
t bi
Y’’’ = jim
anc2 (jim, sue)
parent (jim, sue)
th
t bi
tht bi