Ng ngha ca chưng trình Prolog 31
 IAa%aD$!-a!ươ 
V! mt hình thc, ngha khai báo, hay ng ngha ch ý (intentional semantic)
xác nh các mi quan h ã ưc #nh ngha trong chương trình. Ngha khai báo
xác nh nhng gì là kt qu (ích) mà chương trình phi tính toán, phi to ra.
Ngha khai báo ca chương trình xác nh nu mt ích úng, trong
trưng hp này, xác nh giá tr ca các bin. Ta ưa vào khái nim th! nghim
(instance) ca mt mnh ! C mnh ! C mAi mt bin ca ã ưc
thay th bi mt hng. Mt bin th! (variant) ca mt mnh ! C mnh ! C
sao cho mAi mt bin ca nó ã ưc thay th bi mt bin khác.
Ví d II.1 : Cho mnh ! :
hasachild(X) :-
parent(X, Y).
Hai bin th ca mnh ! này là :
hasachild(A) :-
parent(A, B).
hasachild(X1) :-
parent(X1, X2).
Các th nghim ca mnh ! này là :
hasachild(tom) :-
parent(tom, Z).
hasachild(jafa) :-
parent(jafa, small(iago)).
Cho trưc mt chương trình và mt ích G, ngha khai báo nói r*ng :
Mt ích G úng (tho mãn, hay suy ra ưc t chương trình mt cách
logic) nu và chD nu
(1) t>n ti mt mnh ! C ca chương trình sao cho
(2) t>n ti mt th nghim I ca mnh ! C sao cho:
(a) phn u ca I là ging ht G, và
(b) mi ích ca phn thân ca I là úng.
nh ngha trên ây áp dng ưc cho các câu h=i Prolog. Câu h=i mt
danh sách các ích ngn cách nhau bi các du phGy. Mt danh sách các ích là
úng nu tt c các ích ca danh sách úng cho cùng mt ràng buc ca c
bin. Các giá tr ca các bin là nhng giá tr ràng buc t1ng quát nht.
32 Lp trình lôgic trong Prolog
 3$LNL
Mt gói hay mnh  (packages of clauses) tp hp các mnh !
cùng tên hng t chính (cùng tên, cùng s lưng tham i). d sau ây mt
gói mnh ! :
a(X) :- b(X, _).
a(X) :- c(X), e(X).
a(X) :- f(X, Y).
Gói mnh ! trên có ba mnh ! cùng hng a(X). MAi mnh ! ca gói
là mt phương án gii quyt bài toán ã cho.
Prolog quy ưc :
mAi du ph.y (comma) t gia các mnh !, hay các ích, óng vai trò
phép hi (conjunction). V! mt lôgich, chúng phi úng tt c.
mAi du chm ph.y (semicolon) t gia c mnh !, hay các ích, óng
vai trò phép tuy!n (disjunction). Lúc này chD cn mt trong các ích ca
danh sách úng.
Ví d II.2 :
P :- Q; R.
ưc c là : P úng nu Q úng hoc R úng. Ngưi ta cBng th vit tách ra
thành hai mnh ! :
P :- Q.
P :- R.
Trong Prolog, du phGy (phép hi) mc  ưu tiên cao hơn du chm phGy
(phép tuyn). Ví d :
P :- Q, R; S, T, U.
ưc hiu là :
P :- (Q, R); (S, T, U).
và có th ưc vit thành hai mnh ! :
P :- (Q, R).
P :- (S, T, U).
Hai mnh ! trên ưc c : P úng nu hoc c Q R !u úng, hoc c
S, T U !u úng.
V! nguyên t6c, th t thc hin các mnh ! trong mt gói là không quan
trng, tuy nhiên trong thc t, cn chú ý tôn trng th t ca các mnh !. Prolog
s@ ln lưt thc hin theo th t xut hin các mnh ! trong gói và trong chương
trình theo mô hình tun t b*ng cách th quay lui mà ta s@ xét sau ây.
Ng ngha ca chưng trình Prolog 33
( IAa!!-a!$!L
Ngha lôgich th hin mi liên h gia c t lôgich (logical specification)
ca bài toán cn gii vi bn thân chương trình.

"$!L%!MaD;
Mnh  Ngha lôgich Ký hiu Toán hc
P(a). P(X) úng nu X = a P(X) X = a
P(a).
P(b).
P(X) úng nu X = a hoc X = b P(X) (X = a) (X
= b)
P(a) :-
Q(c).
P(X) úng nu X = a và Q(c)
úng P(X) X = a Q(c)
P(a) :-
Q(c).
P(b).
P(X) úng nu hoc (X = a
Q(c) úng) hoc X = b
P(X) (X = a
Q(c))
(X = b)
Quy ưc : nu = nu và chD nu.

"$!L!N!MaD;
Mnh  Ngha lôgich Ký hiu Toán hc
P(X). Vi mi g tr ca X, P(X) úng X P(X)
P(X) :-
Q(X).
Vi mi g tr ca X, P(X) úng nu
Q(X)
úng P(X) Q(X)
P(X) :-
Q(X, Y).
Vi mi g tr ca X, P(X) úng nu t
>n ti
Y là mt bin cc b sao cho Q(X, Y)
úng
P(X) Y Q(X, Y)
P(X) :-
Q(X,
_).
Vi mi g tr ca X, P(X) úng nu t
>n ti
mt giá tr nào ó ca Y sao cho Q(X, Y)
úng (không quan tâm n giá tr ca Y như
tho)
P(X) Y Q(X, Y)
P(X) :-
Q(X,
Y),
R(Y).
Vi mi g tr ca X, P(X) úng nu t
>n ti
Y sao cho Q(X, Y) R(Y) úng
P(X) Y Q(X, Y)
R(Y)
P(X) :-
Q(X,
Y),
R(Y).
p(a).
Vi mi g tr ca X, P(X) úng nu hoc
t>n ti Y sao cho Q(X, Y) R(Y) úng,
hoc X = a
P(X) (Y Q(X, Y)
R(Y))
(X = a)
34 Lp trình lôgic trong Prolog
(
IAa!!-a!$!)!
*ích Ngha lôgich
p(a). Có phi p(a) úng (tho mãn) ?
p(a), Q(b). Có phi c p(a) Q(b) !u úng ?
P(X). Cho bit giá tr ca X  P(X)úng ?
P(X), Q(X, Y). Cho bit các giá tr ca X và ca Y  P(X)Q(X,
Y) !u là úng ?
 IAa-C!!-a
Ngha th tc, hay ng ngha thao c (operational semantic), li xác nh
làm cách nào  nhn ưc kt qu, ngha làm cách nào  các quan h ưc
x thc s bi h thng Prolog.
Ngha th tc tương ng vi cách Prolog tr li các u h=i như th nào
(how) hay lp lun trên các tri thc. Tr li mt câu h=i ngha m cách xóa
mt danh sách. i!u y chD th thc hin ưc nu các bin xut hin trong
các ích này ưc ràng buc sao cho chúng ưc suy ra mt cách lôgich t
chương trình (hay t các tri thc ã ghi nhn).
Prolog có nhim v thc hin ln lưt tng ích trong mt danh sách các ích
t mt chương trình ã cho. «Thc hin mt ích» có ngha làm cách tho mãn
hay xoá ích ó kh=i danh sách các ích ó.
Hình II.1. Mô hình vào/ra ca mt th tc thc hin mt danh sách các ích.
Gi th tc này là execute (thc hin), cái vào và cái ra ca nó như sau :
Cái vào : mt chương trình và mt danh sách các ích
Cái ra : mt du hiu thành công/tht bi và mt ràng buc các bin
Ngha ca hai cái ra như sau :
(1) Du hiu tnh công/tht bi là Yes nu các ích ưc tho mãn (thành công),
No nu ngưc li (tht bi).
(2) S ràng buc các bin chD xy ra nu chương trình ưc thc hin.
chương trình (s kin+lut)
danh sách các ích
execute
du hiu thành
công/tht bi
ràng bu
c các bin
Ng ngha ca chưng trình Prolog 35
Ví d II.3 :
Minh ho cách Prolog tr li câu h=i cho d chương trình gia h trưc ây
như sau :
ích cn tìm là :
?- ancestor(tom, sue)
Ta bit r*ng parent(bill, sue) mt s kin.  s dng s kin này
lut 1 (v! t1 tiên trc tip), ta th kt lun r*ng ancestor(bill, sue).
ây mt s kin kéo theo : s kin này không mt trong chương trình,
nhưng th ưc suy ra t các lut s kin khác. Ta th vit gn s suy
din này như sau :
parent(bill, sue) ancestor(bill, sue)
Ngha parent(bill, sue)kéo theo ancestor(bill, sue) bi lut
1. Ta li bit r*ng parent(tom, bill) cBng mt s kin. Mt khác, t s
kin ưc suy din ancestor(bill, sue), lut 2 (v! t1 tiên gián tip) cho
phép kt lun r*ng ancestor(tom, sue). Quá trình suy din hai giai on này
ưc vit :
parent(bill, sue) ancestor(bill, sue)
parent(tom, bill) ancestor(bill, sue)
ancestor(tom, sue)
Ta va chD ra các giai on  xoá mt ích, gi mt chng minh. Tuy
nhiên, ta chưa chD ra làm cách nào Prolog nhn ưc mt chng minh như vy.
Prolog nhn ưc phép chng minh này theo th t ngưc li nhng ã
trình bày. Thay xut phát t các s kin cha trong chương trình, Prolog b6t
u bi các ích và, b*ng cách s dng các lut, thay th các ích này bi các
ích mi, cho n khi nhn ưc các s kin sơ cp.
 xoá ích :
?- ancestor(tom, sue).
Prolog m kim mt mnh ! trong chương trình ích này ưc suy din
ngay lp tc. ràng chD hai mnh ! tho mãn yêu cu này lut 1 lut
2, liên quan n quan h ancestor. Ta nói r*ng phn u ca các lut này
tưng ng vi ích.
Hai mnh ! này biu din hai kh nng Prolog phi khai thác x lý.
Prolog b6t u chn x lý mnh ! th nht xut hin trong chương trình :
ancestor(X, Z) :- parent(X, Z).
Do ích là ancestor(tom, sue), các bin phi ưc ràng buc như sau :