
Ng ngha ca chưng trình Prolog 31
IAa%aD$!-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 là úng, và 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 là mnh ! C mà mAi mt bin ca nó ã ưc
thay th bi mt hng. Mt bin th! (variant) ca mt mnh ! C là 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 là ú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 là 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 là úng cho cùng mt ràng buc ca cá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$LNL
Mt gói hay bó mnh (packages of clauses) là tp hp các mnh ! có
cùng tên hng t chính (cùng tên, cùng s lưng tham i). Ví d sau ây là 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ó cùng hng là 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á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 là úng.
Ví d II.2 :
P :- Q; R.
ưc c là : P úng nu Q úng hoc R úng. Ngưi ta cBng có th vit tách ra
thành hai mnh ! :
P :- Q.
P :- R.
Trong Prolog, du phGy (phép hi) có 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 là : P úng nu hoc c Q và R !u úng, hoc c
S, T và 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
( IAa!!-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%!MaD;
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 và
Q(c) úng) hoc X = b
P(X) ⇔ (X = a ∧
Q(c))
∨ (X = b)
Quy ưc : nu = nu và chD nu.
"$!L!N!MaD;
Mnh Ngha lôgich Ký hiu Toán hc
P(X). Vi mi giá tr ca X, P(X) úng ∀X P(X)
P(X) :-
Q(X).
Vi mi giá tr ca X, P(X) úng nu
Q(X)
úng P(X) ⇔ Q(X)
P(X) :-
Q(X, Y).
Vi mi giá 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 giá 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ư
th nào)
P(X) ⇔ ∃Y Q(X, Y)
P(X) :-
Q(X,
Y),
R(Y).
Vi mi giá tr ca X, P(X) úng nu t
>n ti
Y sao cho Q(X, Y) và R(Y) úng
P(X) ⇔ ∃Y Q(X, Y) ∧
R(Y)
P(X) :-
Q(X,
Y),
R(Y).
p(a).
Vi mi giá tr ca X, P(X) úng nu hoc
t>n ti Y sao cho Q(X, Y) và R(Y) úng,
hoc X = a
P(X) ⇔ (∃Y Q(X, Y)
∧ R(Y))
∨ (X = a)

34 Lp trình lôgic trong Prolog
(
IAa!!-a!$!)!
*ích Ngha lôgich
p(a). Có phi p(a) úng (tho mãn) ?
p(a), Q(b). Có phi c p(a) và Q(b) !u úng ?
P(X). Cho bit giá tr ca X P(X) là úng ?
P(X), Q(X, Y). Cho bit các giá tr ca X và ca Y P(X) và Q(X,
Y) !u là úng ?
IAa-C!!-a
Ngha th tc, hay ng ngha thao tác (operational semantic), li xác nh
làm cách nào nhn ưc kt qu, ngha là làm cách nào các quan h ưc
x lý thc s bi h thng Prolog.
Ngha th tc tương ng vi cách Prolog tr li cá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 có ngha là tìm cách xóa
mt danh sách. i!u này chD có 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à tì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 thành công/tht bi là Yes nu các ích ưc tho mãn (thành công),
là 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 ví 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) là mt s kin. s dng s kin này
và lut 1 (v! t1 tiên trc tip), ta có th kt lun r*ng ancestor(bill, sue).
ây là mt s kin kéo theo : s kin này không có mt trong chương trình,
nhưng có th ưc suy ra t các lut và s kin khác. Ta có th vit gn s suy
din này như sau :
parent(bill, sue) ancestor(bill, sue)
Ngha là parent(bill, sue)kéo theo ancestor(bill, sue) bi lut
1. Ta li bit r*ng parent(tom, bill) cBng là 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) và ancestor(bill, sue)
ancestor(tom, sue)
Ta va chD ra các giai on xoá mt ích, gi là 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 gì ã
trình bày. Thay vì 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, nó 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 tìm kim mt mnh ! trong chương trình mà ích này ưc suy din
ngay lp tc. Rõ ràng chD có hai mnh ! tho mãn yêu cu này là lut 1 và 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 mà 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 :