1
Chương 5
Chương
5
.
Ngôn ng lp trình Prolog
Lê Thanh Hươn
g
g
Khoa CNTT
Đại hc Bách khoa Hà Ni
5.1. Gii thiu
ế
PROgramming in LOGic (s dng cách ti
ế
p
cn logic)
Alain Calmerauer & Philippe Roussel, 1972
Dùng ngôn ng mô t/khai báo (declarative
language) để đặc t vn đề
ng dng nhiu trong x ngôn ngtnhiên
2
ng
dng
nhiu
trong
x
ngôn
ng
t
nhiên
và TTNT.
Turbo Prolog, Visual Prolog, B-Prolog, SWI-
Prolog, …
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
5.2. Cú pháp
Chương trình là tp các mô t logic v t
dưới dng chun Horn
Không có cu trúc điu khin (r nhánh, lp)
Không có phép gán
Vtđượcdingii thông qua
skin
3
V
t
được
din
gii
thông
qua
s
kin
lut, kết thúc bng ký t ‘.’.
Prolog tr li các câu hi nh cơ chế suy
lun da trên kiến thc được cung cp
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
Ví d
owns(john,house).
owns(mary,house).
young(john).
rich(X) :- owns(X,house).
talent(X) :- rich(X), young(X).
s kin
lut
Chương trình
4
?- consult(‘E:\\swi_prolog\\test.pl’).
?- talent(john).
YES
?- talent(X).
X = john
Truy vn
2
5.2.1 S kin
S kin là nhng điu ta công nhn là đúng
Ví d:
cat(tom).
khoang_cach(‘Hà ni’,’TP H Chí Minh’,2000).
5
Chui kí t đặt trong ‘ ‘
Biến bt đầu bng ch hoa.
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
5.2.2 Lut
Sdđể đị hhĩ tt(h)id
S
d
ng
để
đị
n
h
ng
hĩ
a m
t
v
t
(
quan
h)
m
i
d
a
t
r
ê
n
các v t (quan h) đã biết.
Gm 2 phn, phân cách bi du :-
Ví d:
giaithua(N,Kq):- N1 is N-1, giaithua(N1,Kq1), Kq is Kq1*N.
VT là v t cn xác định; VP là điu kin để VT nhn giá
tr đúng
6
tr
đúng
VP gm các li gi v t khác, ngăn cách bi du “,”
Tham s truyn trong các v tkhông được là biu thc.
Ví d:
giaithua(N-1,kq). %sai
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
5.3. Cơ chế tìm li gii ca Prolog
nguoi(socrate).
nguoi(xeda).
vua(xeda).
?
-
consult(
E:
\
\
swi prolog
\
\
a.pl
).
Chương trình
7
?
consult( E:
\
\
swi
_
prolog
\
\
a.pl ).
?- vua(xeda).
YES
?- nguoi(X), vua(X).
X = xeda
Truy vn
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
5.3. Cơ chế tìm li gii ca Prolog
?- nguoi(X), vua(X).
X=socrate,
vua(socrate)
r1 - nguoi(socrate).
r2 - nguoi(xeda).
r3 - vua(xeda).
X=xeda,
vua(xeda)
8
Không thành công
Quay lui
Thành công
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
3
5.3. Cơ chế tìm li gii ca Prolog
1. So khp
2. To mi liên kết gia các thông s phn
câu hi và các thông s ca các s kin và
lut trong chương trình.
3
Thcthitiếpcáclut
9
3
.
Thc
thi
tiếp
các
lut
.
4. Nếu thc thi thành công (các biến phn
câu hi đã tình trng bound) Æcó li gii
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
Điu khin quá trình quay
lui (backtracking)
ế
Prolog t động quay lui khi c
n thi
ế
t
Có th điu khin quá trình thc thi ca chương trình
bng cách sp li th t các mnh đề
Nhát ct là mt toán t dùng để ngăn cn quá trình
backtracking ca Prolog. nhát ct
10
Ví d:
f(X,0):- X <3.
f(X,2) :- 3=<X, X<6.
f(X,4) :- 6=<X.
f(X,0):- X <3, !.
f(X,2) :- 3=<X, X<6, !.
f(X,4) :- 6=<X.
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
Các phép toán s hc
+
-
*
/ (chia s thc)
// (chia s nguyên)
mod
** (lu tha)
between(Low,High,Value)
succ(Int1,Int2)
plus(Int1,Int2,Int3)
11
phép gán: Bien is Bieu_thuc
so sánh: <, =<, =:=, =\=, >, >=
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
Bài tp
1
Cho góc X = 60
0
góc Y = 60
0
Chng minh
1
.
Cho
góc
X
=
60
0
,
góc
Y
=
60
0
.
Chng
minh
các cnh XY = XZ, XY = YZ
bang(X,Y)
banggoc(X,A)
bangnhau(XY,UV) ???
12
A + B + C = 180 ÎC is 180 - A - B
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
4
Bài tp
2. Chng minh t giác ni trung đim 4 cnh ca 1
t giác là hình bình hành.
3. Biết Tùng là b ca Dương. Dương là anh ca
Hoa. Hoa là m ca Trung. Trung là anh ca
Kiên. Cho biết mi quan h gia Tùng và Kiên,
gia Dương và Kiên.
13
4. Tìm USCLN(X,Y)
5. Viết chương trình tính giai tha cho s t nhiên.
giaithua(N,Kq):- N1 is N-1, giaithua(N1,Kq1), Kq is
Kq1*N.
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
5.4. Danh sách (list)
là dãy các ph
n t cùng ki
u
Ví d: [mai, ghita, sơn, trng] là list
[ ] - list rng
List khác rng gm:
phn t đầu tiên (head)
hòli (t il)
14
p
h
n c
ò
n
l
i
(t
a
il)
Du | được dùng để tách phn head và tail
Phn t ca 1 list là bt kì loi đối tượng nào,
k c list
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
5.4. Danh sách
3 cách viết danh sách:
[Item1, Item2, …]
[Head | Tail]
[Item1, Item2, … | others]
15
List được t chc bên
trong bng cây nh phân
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
Các thao tác vi danh sách
Chiu dài d/s
length(L,Kq): chiu dài d/s L
length( [ ], 0).
length( [ _ | T], Kq) :- length(T,Kq1), Kq is Kq1
+1
16
+
1
.
_: biến vô danh
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
5
Các thao tác vi danh sách
Quan h thành viên
member(X, L): X có phi là 1 thành phn ca
L?
Ví d: member(b, [a,b,c]). Ætrue
17
member(H,[H | _ ]).
member(H,[_| Tail]) :- member(H, Tail).
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
Các thao tác vi danh sách
N
i d/s (concatenation)
conc(L1, L2, L3): Ni L1 và L2 thành L3
?- conc([a,b],[c,d],L).
L = [a,b,c,d]
conc([],L,L).
conc([H|T
1
],L
2
,[H|T
3
]) :
-
conc(T
1
,L
2
,T
3
).
18
conc([H|T
1
],L
2
,[H|T
3
])
:
conc(T
1
,L
2
,T
3
).
?- conc(L1,L2, [a,b,c]).
Thêm 1 phn t vào d/s
add(X,L, [X|L]).
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
Các thao tác vi danh sách
Xoá 1 ph
n t X ra khi d/s del(X,L,L1).
del(X, [X|T], T).
del(X, [Y|T], [Y|T1]) :- del(X,T,T1).
?- del(a,[a,b,a,a],L)
L = [b,a,a]
L
=
[a,b,a]
19
L
[a,b,a]
L = [a,b,a]
Thêm 1 phn t vào bt kì ch nào trong d/s
insert(X,L,L1) :- del(X,L1,L).
Lê Thanh Hương – Khoa CNTT - ĐHBKHN
Bài tp
1. Tính chiu dài 1 danh sách
2. Tính tng các phn t ca d/s
3. Viết th tc nghch đảo 1 d/s. VD [1,2,3] -> [3,2,1]
4. Cài đặt chương trình phân tích cú pháp cho phép xác nhn câu
“Tôi đọc” là câu đúng ng pháp.
1. C ÆCN VN
2. CN ÆDT
3. VN ÆĐgT
4. DT Æ“tôi”
5. ĐgT Æđọc”
M rng cho trường hp “tôi đọc sách”, “tôi đọc sách ng pháp”
đị hh h d/
5.
c
đị
n
h
p
h
n t
t
h
n c
a
d/
s
6. Tìm phn t max và min ca 1 d/s. Ví d:
?- maxmin([1,4,8,3],Max,Min).
Max = 8
Min = 1
Yes
Lê Thanh Hương – Khoa CNTT - ĐHBKHN