Đệ quy• Một mệnh đề đệ quy là mệnh đề đệ quy là mệnh đề sử dụng chính nó để định nghĩa nó.. Các đĩa đặt theo thứ tự từ lớn đến nhỏ từ thấp lên cao; tạo nên một Tòa tháp.. Trò chơi đòi hỏ
Trang 1Lập trình logic và ràng buộc
( Logic Programming and Constraint)
Ts Lê Mạnh Hải Khoa CNTT,
ĐH Kỹ thuật Công nghệ TP HCM
Trang 3Xử lý danh sách
Danh sách (list) là cấu trúc dữ liệu quan trọng
•Biểu diễn danh sách [X], [a,b,c], [], [Head|Tail].
•Các vị từ build-in (/doc/Manual/lists.html‘)
– member(?Elem, ?List), delete(+List1, @Elem, -List2)
– append(?List1, ?List2, ?List1AndList2),
– select(?Elem, ?List1, ?List2)
– nextto(?X, ?Y, ?List), last(?List, ?Last)
– nth0(?Index, ?List, ?Elem), nth1(?Index, ?List, ?Elem)
– max_member(-Max, +List), min_member(-Max, +List),
– sum_list(+List, -Sum)
Trang 4Kiểm tra hoạt động
Trang 5Kiểm tra hoạt động
Trang 8Suy diễn lùi (BackTracking)
Chẳng hạn ta có định nghĩa vi từ bigger sau
bigger(N,M):-N =:= M, write(‘bigger(N,M):-Numbers are the same‘).
Bây giờ ta truy vấn
?- bigger(5,4)
Prolog làm gì?
Trang 9bigger(N,M):-N =:= M, write(‘Numbers are the same‘).
Trang 11bigger(5,4):-5 > 4, succeeds, go on with body.
write(‘The bigger number is ‘), write(N) bigger(N,M):-
N =:= M, write(‘Numbers are the same‘)
Đến dấu chấm
= thành công
Trang 12Backtracking – Suy diễn lùi
?- bigger(5,5) If our query only matches the final clause
bigger(5,5):-5 =:= bigger(5,5):-5,
write(‘Numbers are the same‘).
Đã biết trước là không xảy ra
Clauses should be ordered according to specificity Most specific at top Universally applicable at bottom
Trang 14Đệ quy
• Một mệnh đề đệ quy là mệnh đề đệ quy là mệnh đề sử dụng
chính nó để định nghĩa nó
• Một mệnh đề đệ quy sẽ bị lặp vô hạn nếu không có điều kiện
thoát Vì vậy phải có định nghĩa trường hợp cụ thể không
đệ quy ngay trước mô tả đệ quy
Trang 15Ví dụ 2: Bài toán tháp Hà nội
Đế đặt nằm ngang; các cột thẳng đứng Các đĩa đặt theo thứ tự từ lớn đến nhỏ từ thấp lên cao; tạo nên một Tòa
tháp Trò chơi đòi hỏi di chuyển các đĩa, bằng cách đặt chúng vào cột bên cạnh, một đĩa trong một di chuyển,
theo luật sau:
I Sau mỗi di chuyển, các đĩa đều nằm trên một, hai, hoặc ba cột, theo thứ tự từ lớn đến nhỏ từ thấp đến cao
II Đĩa trên cùng của một trong ba cột đĩa được đặt vào cột rỗng
III Đĩa trên cùng của một trong ba cột đĩa được đặt lên một cột đĩa khác, nếu đĩa này nhỏ hơn các đĩa của cột
này
Trang 16Lưu đoạn code sau vao file hanoi.pl
move(1,X,Y,_)
:-write('chuyen dia tren cung tu '),
write(X), write(' sang '),write(Y), nl.
chuyen dia tren cung tu giua sang trai
chuyen dia tren cung tu giua sang phai
chuyen dia tren cung tu trai sang phai
Trang 19Cắt “!”
• Cắt không làm thay đổi kết quả truy vấn
• Cắt chỉ giới hạn số phép quay lui khi điều kiện ngay trước đó đã được thỏa mãn.
– Nhanh hơn
– Chống đệ quy vô hạn
Trang 20Bài tập 2
Sắp xếp một danh sách theo thứ tự tăng dần
• Bubble sort? QuickSort? MergeSort?
•Prolog “ưa” các giải thuật đệ quy => QS và MS dễ viết hơn!
Trang 23Bài tập
1 Viêt một chương trình để bỏ ba phần tử đầu của một danh
sách
2 Định nghĩa hai vị từ :
even_length( List ) và odd_length( List ) để kiểm tra số các
phần tử của một danh sách là chẵn hay lẻ
Ví dụ danh sách :
even_length([ a, b, c, d ]) là true
even_length([ a, b, c]) là false
Trang 243 Viêt chương trình Prolog kiểm tra một danh sách có phải
là một tap hợp con của một danh sách khác không ?
Trang 255 Viết chương trình Prolog kiểm tra hai danh
sách có rời nhau không
Trang 26Bài kế tiếp
Cơ sở dữ liệu
Xuất nhập
Trang 27Cơ sở dữ liệu
• Tổ chức cơ sở dữ liệu dưới dạng bảng
• Các bảng có mối liên kết (quan hệ ràng buộc)
Trang 28• ‘bảng’ family
family(individual(…), individual(…), [individual(…)]) Với ám chỉ ngôi
1 là chồng, ngôi 2 là vợ, ngôi 3 là danh sách các con.
family(individual( tom, smith, date(7, may, 1960),
work(microsoft, 30000) ),
individual( ann, smith, date(9, avril, 1962),inactive),
[ individual( roze, smith, date(16, june, 1991), inactive),
individual( eric, smith, date(23, march, 1993), inactive) ] ).
husban( X ) :- % X là chồng
family( X , _ , _ ).
wife( X ) :- % X là vợ
family( _, X , _ ).
children( X ) :- % X là một người con,
family( _, _ , Children ), member( X, Children )
Trang 29Ta định nghĩa một số vị từ để tiện truy vấn
exist( Individual ) :- % mọi thành viên của gia dình
husban( Individual ) ;
wife( Individual ) ;
chidren( Individual ) % dấu ; là hoặc, dấu , là và!!!
dateofbirth( individual( _ , _, Date , _ ), Date )
salary( individual( _ , _, _ , work( _ , S ) ), S )
salary( individual( _ , _, _ , inactive ), 0 )
Tại sao phải có 2 định nghĩa salary?
Trang 30Truy vấn dữ liệu
Các lệnh truy vấn sau đây sẽ trả lại những thông tin gì?
?- exist( individual( Firstname, Lastname, _ , _ ) ).
?- chidren( X ), dateofbirth( X, date( _ , _ , 1991 )).
?- wife( individual( Firstname, Lastname, _ , work( _, _ ) ) ).
Hãy viết các lệnh truy vấn các thông tin sau:
1.Tìm những người sinh trước 1975 không có việc làm
2.Tìm những người sinh trước 1970 có thu nhập trên 10000 3.Tìm những gia đình có trên 3 người con.