Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 30 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
30
Dung lượng
224,5 KB
Nội dung
Lập trình logic 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 Bài 2: Kỹ thuật lập trình • Mục tiêu: – – – – Các kỹ thuật xử lý danh sách Các phép toán Xử lý CSDL Nhập xuất qua tập tin Xử lý danh sách Danh sách (list) cấu trúc 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) Kiểm tra hoạt động ?- member(3,[2,4,3,5]) true ?- member([3],[2,4,3,5]) false ?- member(3,[2,4,[3,2],5]) false ?- member([3,_],[2,4,[3,2],5]) true ?- member([3|T],[2,4,[3,2],5]) T = [2] ?- delete([2,4,3,5],3,X) X = [2, 4, 5] Kiểm tra hoạt động ?- append([2,4,5],[3,4,5,6],X) X = [2, 4, 5, 3, 4, 5, 6] ?- select(3,[2,3,4],X) X = [2, 4] ?- last([a,f,d,b,c],X) X = c Hãy tìm phần tử đứng thứ danh sách ?- nextto(3,X,[2,4,3,5,6]) X=5 Hãy tìm phần tử đứng trước số danh sách sau [3,5,4,6,8,4,7] ?- sum_list([3,5,4,6,8,4,7],X) X = 37 • Ví dụ1: – Viết chương trình đếm số phần tử danh sách size([],0) size([H|T],N) :- size(T,N1), N is N1+1 37 ?- size([a,3,d,4,v],X) X = • Bài tập 1: tính tổng danh sách (mysum) Các phép tính số học Các phép tính số học +,-,* / Các phép so sánh , ==, =:= (equals), =\= Ví dụ: ?- 5 M, write(‘The bigger number is ‘), write(N) bigger(N,M):N =:= M, write(‘Numbers are the same‘) Bây ta truy vấn ?- bigger(5,4) Prolog làm gì? Tìm vị từ ?- bigger(5,4) bigger(N,M):N < M, write(‘The bigger number is ‘), write(M) bigger(N,M):N > M, write(‘The bigger number is ‘), write(N) bigger(N,M):N =:= M, write(‘Numbers are the same‘) bigger(5,4) bigger(5,4):- Backtrack < 4, fails write(‘The bigger number is ‘), write(M) bigger(N,M):N > M, write(‘The bigger number is ‘), write(N) bigger(N,M):N =:= M, write(‘Numbers are the same‘) 10 Lư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 move(N,X,Y,Z) :- N>1, M is N-1, move(M,X,Z,Y), move(1,X,Y,_),move(M,Z,Y,X) 55 ?- [hanoi] % hanoi compiled 0.00 sec, clauses true 56 ?- move(5,giua,trai,phai) chuyen dia tren cung tu giua sang trai chuyen dia tren cung tu giua sang phai chuyen dia tren cung tu trai sang phai 16 Cắt “!” Giả sử có vị từ a,b c a(X, Y) :- b(X), !, c(Y) b(1) b(2) b(3) c(1) c(2) c(3) Truy vấn ?- a(Q,P) Sẽ hoạt động 17 Cắt “!” ?- a(Q,P) Q = P, P = ; Q = 1, P=2; Q = 1, P = có dấu ! (cut) 18 Cắt “!” • Cắt khơng làm thay đổi kết truy vấn • Cắt giới hạn số phép quay lui điều kiện trước thỏa mãn – Nhanh – Chống đệ quy vô hạn 19 Bài tập Sắp xếp danh sách theo thứ tự tăng dần • Bubble sort? QuickSort? MergeSort? •Prolog “ưa” giải thuật đệ quy => QS MS dễ viết hơn! 20 ...Bài 2: Kỹ thuật lập trình • Mục tiêu: – – – – Các kỹ thuật xử lý danh sách Các phép toán Xử lý CSDL Nhập xuất qua... Vì phải có định nghĩa trường hợp cụ thể khơng đệ quy trước mơ tả đệ quy • Ví dụ: size([],0) • Lập trình viên prolog thường sử dụng đệ quy gián tiếp a(X):-b(Y) b([]) is %điều kiện đệ quy bên b(Y):-a(X)... cách đặt chúng vào cột bên cạnh, đĩa di chuyển, theo luật sau: I Sau di chuyển, đĩa nằm một, hai, ba cột, theo thứ tự từ lớn đến nhỏ từ thấp đến cao II Đĩa ba cột đĩa đặt vào cột rỗng III