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 ! là « 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  là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.
Ví 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 ! này nói r*ng con khD có th n6m ly qu chui (grab), trèo lên
hp (climbing), v.v... V! mt ng ngha th tc, th t các mnh ! nói r*ng
trưc con khD vi ly ưc qu chui, nó phi trèo lên hp, trưc khi trèo lên
hp, nó phi Gy cái hp, v.v... Vi th t nà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 gì 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@ là walking (mà không phi
climbing như trưc).
Ràng buc là 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’’ và 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 có s tin trin nào.
Thc t, ta nhn thy r*ng mnh ! th hai ca couldtake và walking ã
ưc s dng qua li. Con khD i loanh quanh trong phòng mà không bao gi có
ý nh s dng cái hp. Do không có 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 vô hn. Prolog s@ không x lý nhng
tình hung vô ích như vy.
Ví d này minh ho Prolog ang th gii mt bài toán mà 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 vô 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 là 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 là không có 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 vì 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 có th thay 1i chương trình
sao cho có th d phòng trưc nguy cơ b quGn ? Có 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õ ràng
r*ng các chương trình ln s@ tr nên d sai sót nu phi da trên mt th t nào
ó ca các mnh ! và các ích. T>n ti nhi!u phương pháp khác cho phép loi
b= các vòng lp vô hn, t1ng quát hơn và á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 ví d u chương, ta ã thy nguy c xy ra các vòng lp vô 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 là 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 có
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 có mt
ích con và uôi mnh ! th hai có hai ích con. Như vy chương trình s@ có
bn bin th (=1×2×2) mà c bn !u có cùng ngha khai báo. Ta nhn ưc như
sau :
(1) o th t các mnh !, và
(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ó phi là mt t tiên ca Sue ?”
Trong trưng hp cui cùng, Prolog không th tìm ra câu tr li. Do b quGn
vô hn nên Prolog thông báo “không  b nh”. Hình 2.4. mô 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 và anc4. Ta
thy anc4 không có hy vng và 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