
50 Lp trình lôgic trong Prolog
( <UVM1!$!L!$!)!
( Iy!ơV!$!WVG
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.
( PayQM1L)!!ươ
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)
parent (tom, Y’)
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