1. Trang chủ
  2. » Cao đẳng - Đại học

Giáo trình Lập trình lôgic học - Tổng cục dạy nghề

95 15 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 95
Dung lượng 1,3 MB

Nội dung

Nội dung chính của giáo trình sẽ giúp cho các bạn nắm được các khái niệm cơ bản về kiểu lập trình logic, biết phân biệt các đặc trưng khác nhau cơ bản của lập trình logic và lập trình thủ tục, thực hiện giải các bài toán logic trong hệ cơ sở tri thức, nắm được các phương pháp thế, hợp giải, cơ chế đệ quy, quay lui và nắm được ngôn ngữ lập trình logic Prolog để giải các bài toán cụ thể. Mời các bạn tham khảo!

BỘ LAO ĐỘNG - THƯƠNG BINH VÀ XÃ HỘI TỔNG CỤC DẠY NGHỀ GIÁO TRÌNH LẬP TRÌNH LƠGIC MÃ MƠN HỌC : ITPRG3-01 TRÌNH ĐỘ: CAO ĐẲNG NGHỀ NĂM 2012 Tuyên bố quyền : Tài liệu thuộc loại sách giáo trình Cho nên nguồn thơng tin phép dùng nguyên trích dùng cho mục đích đào tạo tham khảo Mọi mục đích khác có ý đồ lệch lạc sử dụng với mục đích kinh doanh thiếu lành mạnh bị nghiêm cấm Tổng Cục Dạy nghề làm cách để bảo vệ quyền Tổng Cục Dạy Nghề cám ơn hoan nghênh thông tin giúp cho việc tu sửa hoàn thiện tốt tàI liệu Địa liên hệ: Dự án giáo dục kỹ thuật nghề nghiệp Tiểu Ban Phát triển Chương trình Học liệu ……………………………………………… LỜI TỰA Đây tài liệu xây dựng theo chương trình dự án giáo dục kỹ thuật dạy nghề, để có đươc giáo trình dự án tiến hành theo hai giai đoạn Giai đoạn : Xây dựng chương trình theo phương pháp DACUM, kết gian đoạn khung chương trình gồm 230 trang cấp độ 170 trang cấp độ Giai đoạn : 29 giáo trình 29 tài liệu hướng dẫn giáo viên cho nghề lập trình máy tính cấp độ Để có khung chương trình chúng tơi mời giáo viên, chuyên gia làm việc lĩnh vực công nghệ thông tin xây dựng chương trình Trong giai đoạn viết giáo trình chúng tơi có điều chỉnh để giáo trình có tính thiết thực phù hợp với phát triển lĩnh vực công nghệ thông tin Tài liệu thiết kế theo mô đun/ môn học thuộc hệ thống mô đun/môn học chương trình, để đào tạo hồn chỉnh nghề Lập trình máy tính cấp trình độ bậc cao dùng làm Giáo trình cho học viên khố đào tạo, sử dụng cho đào tạo ngắn hạn cho công nhân kỹ thuật, nhà quản lý người sử dụng nhân lực tham khảo Đây tài liệu thử nghiệm hoàn chỉnh để trở thành giáo trình thức hệ thống dạy nghề GIỚI THIỆU VỀ MÔN HỌC Vị trí, ý nghĩa, vai trị mơn học: mơ học chuyên ngành bắt buộc Môn học đươc giảng dáy sau học sinh học xong mơn: Cơ sở tốn học CNTT, Kỹ thuật lập trình nâng cao, Lý thuyết ngơn ngữ lập trình Mục tiêu mơ đun: Nắm khái niệm kiểu lập trình logic, biết phân biệt đặc trưng khác lập trình logic lập trình thủ tục, thực giải toán logic hệ sở tri thức, nắm phương pháp thế, hợp giải, chế đệ quy, quay lui nắm ngơn ngữ lập trình logic Prolog để giải tốn cụ thể Mục tiêu thực mơ đun: Phân tích tốn thành thành phần logic Xây dựng cấu trúc logic toán Xác định cách giải lời giải toán tập luật đích Lập trình giải lớp tốn ngơn ngữ Prolog Thực hành lập trình ví dụ Prolog Nội dung mơ đun: Logic có ký hiệu hàm Uớc lượng Logic có chứa ký hiệu hàm Xử lý logic từ xuống Bus mở rộng Phép đồng Ước lượng logic từ xuống Tính quan hệ khai triển luật/đích Thuật tốn ước lượng luật/ đích Đồ thị luật/đích Làm mẫu buộc (biding) thành 10 Sắp thứ tự đích 11 Các khái niệm ngơn ngữ Prolog 12 Ngôn ngữ Prolog - mô tả chi tiết 13 Sử dụng cấu trúc liệu 14 Cơ chế quay lui toán tử rút gọn Kỹ thực thành: Đọc hiểu khái niệm lập trình logic: định nghĩa tính chất giải thuật ứng dụng kỹ thuật lập trình logíc để giải tốn tri thức mang tính đệ quy, suy luận Lập trình lập trình logic có hiệu so với lập trình thủ tục Từ bỏ thói quen lập trình truyền thống sử dung lợi lập trình logíc lớp toán Thái độ học viên: Rèn tư logic để phân tích, tổng hợp vấn đề cần giải Khơng bảo thủ với kiểu lập trình cũ Thao tác cẩn thận xác lập trình Tự tin làm việc Kiên trì mạnh dạn thực Sơ đồ quan hệ theo trình tự học nghề Học kỳ V Học kỳ VI Tiếng Anh chuyên ngành Cơ sở kỹ thuật điện - điện tử Lý thuyết ngơn ngữ lập trình Lập trình nâng cao hướng NET Phát triển phần mềm ứng dụng Phân tích thiết kế giải thuật Thiết kế mạng quản trị mạng Cấp độ Kho liệu Bảo trì máy tính Mơ hình client-server SQL server Cơ sở trí tuệ nhân tạo hệ chuyên gia Phân tích hướng đối tượng UML Tích hợp ứng dụng mạng Lập trình logic An tồn thơng tin Cơ sở liệu nâng cao Chuyên đề tự chọn Lập trình logic môn học bắt buộc Mọi học viên phải học đạt kết chấp nhận kiểm tra đánh giá thi kết thúc đặt chương trình đào tạo Những học viên qua kiểm tra thi mà không đạt phải thu xếp cho học lại phần chưa đạt phải đạt điểm chuẩn phép học tiếp mô đun/ môn học Học viên, chuyển trường, chuyển ngành học sở đào tạo khác Đánh giá thông qua kiểm tra trắc nghiệm: Kiểm tra trắc nghiệm thực máy tính chấm cho kết Xây dựng ngân hàng câu hỏi Học viên nhận ngẫu nhiên Các câu hỏi trắc nghiệm 100 câu (mỗi chức 20 câu), Thời gian kiểm tra hạn chế 60 phút Học viên chưa qua lớp học máy tính tối thiểu biết gõ bàn phím di chuột Thang điểm 0-49 : Khơng đạt 50-69 : Đạt trung bình 70-85 : Đạt 86-100 : Đạt Giỏi Kỹ thực thành  Đọc hiểu khái niệm lập trình lơgic : định nghĩa tính chất giải thuật  Ứng dụng kỹ thuật lập trình lơgic để giải tốn tri thức mang tính đệ quy, suy luận  Lập trình lập trình lơgic có hiệu so với lập trình thủ tục  Từ bỏ thói quen lập trình truyền thống sử dung lợi lập trình lơgic lớp tốn Thái độ học viên  Rèn tư lơgic để phân tích, tổng hợp vấn đề cần giải  Khơng bảo thủ với kiểu lập trình cũ  Thao tác cẩn thận xác lập trình Tự tin làm việc Kiên trì mạnh dạn thực   MỤC LỤC BÀI LOGIC HỌC I MỞ ĐẦU VỀ LOGIC HỌC II LOGIC MỆNH ĐỀ III LOGIC VỊ TỪ IV.CÁC CÔNG THỨC CHỈNH BÀI 2.PHÉP SUY DIỄN TRONG LOGIC VỊ TỪ I CÁC LUẬT SUY DIỄN II NGỮ NGHĨA CỦA LOGIC VỊ TỪ III QUAN HỆ GIỮA ĐỊNH LÝ VÀ HẬU QUẢ LOGIC IV.PHÉP HỢP GIẢI BÀI 3.PHÉP HỢP NHẤT` I ĐỊNH NGHĨA PHÉP HỢP NHẤT II CÁC HỆ THỐNG BÁC BỎ BỞI LỜI GIẢI BÀI 4.TỔNG QUAN VỀ NGÔN NGỮ PROLOG I GIỚI THIỆU NGÔN NGỮ PROLOG II CÁC KIỂU DỮ LIỆU SƠ CẤP CỦA PROLOG III SỰ KIỆN VÀ LUẬT TRONG PROLOG BÀI 5.KIỂU DỮ LIỆU CẤU TRÚC CỦA PROLOG I GIỚI THIỆU BÀI 6.CÁC PHẾP TOÁN VÀ SỐ HỌC I SỐ HỌC II CÁC PHÉP SO SÁNH CỦA PROLOG III ĐỊNH NGHĨA HÀM TÀI LIỆU THAM KHẢO BÀI 10 12 16 18 21 22 23 28 30 37 38 46 50 51 53 55 69 70 79 80 87 91 102 Lôgic học Mã học : ITPRG3-01.1 Mục tiêu thực Học xong học viên có khả năng: - Nắm khái niệm lôgic học, ứng dụng lôgic học - Nắm lôgic mệnh đề ngữ nghĩa lôgic mệnh đề - Hiểu lôgic vị từ, cú pháp lôgic vị từ - Nắm khái niệm hạng, nguyên tử, công thức chỉnh Nội dung Lôgic mệnh đề - Cú pháp lôgic mệnh đề - Ngữ nghĩa lôgic mệnh đề Lôgic vị từ Cú pháp lôgic mệnh đề - Bảng chữ - Hạng - Nguyên tử Các công thức chỉnh I Mở đầu lôgic học Lôgic học (the lôgic) môn khoa học suy luận, hay lập luận (reasoning), mô tả suy luận hợp lý (characterizing the valid reasonings) Suy luận để tạo thông tin từ thông tin có nhờ kỹ thuật biến đổi thơng tin Lĩnh vực ứng dụng lôgic học bao gồm :  Cơ sở phép tính tốn, chứng minh, suy luận hay diễn giải toán học  Tranh cãi, lập luận, hùng biện… sống hàng ngày người  Ứng dụng lôgic tin học :  Lập trình (programming) : chứng minh tính đắn thuật tốn, tính khả thi chương trình, lập trình lơgic  Mạng (computer network) : chứng minh tính chất mạng  Trí tuệ nhân tạo (artificial intelligence) : tạo sinh phương án hoạt động (generation of plans) khoa học người máy (robotics), chẩn đoán cố, đối thoại người-máy, phân tích-tóm tắt văn bản, …  Cơ sở liệu (CSDL) suy diễn (deductive database) : sử dụng suy diễn lôgic để tạo sinh CSDL quan hệ… Một số ví dụ suy luận lơgic :  Nếu trời mưa to đường ngập nước Mà trời mưa to Vậy đường ngập nước  Qua sông nên phải luỵ Tối trời nên phải luỵ bán dầu Ca dao)  Cho trước n số nguyên dương lớn 2, tìm số nguyên tố nhỏ thua n, n Lôgic học có quan hệ chặt chẽ với lĩnh vực nghiên cứu xử lý ngôn ngữ (language processing) Theo quan điểm lôgic học, ngôn ngữ bao gồm khái niệm từ vựng (lexicon), cú pháp (syntax) ngữ nghĩa (semantics) Ngoài ra, người ta đưa vào khái niệm tính thực dụng (pragmatics) để nghiên cứu cách lập luận, phân tích diễn đạt (nói, viết…) sử dụng quy ước giao tiếp người với Ví dụ cho tình sau : «Mũi cu Tý chạm phải tường vừa cao, vừa rộng, vừa dày … » Nếu nói tiếp :  « Cu Tý bước cỏn my », sai mặt từ vựng  « Cu Tý bước mèo », mặt từ vựng sai cú pháp  « Cu Tý bước lên mèo », cú pháp sai mặt ngữ nghĩa  « Cu Tý bước lên bước», ngữ nghĩa sai mặt thực tế Sai thực tế cu Tý đứng đối mặt với tường vừa cao, vừa rộng, vừa dày Do nói :  « Cu Tý lùi lại bước», mặt thực tế Trong lơgic học, người ta phân biệt ba mức sau :  Ngôn ngữ : định nghĩa câu, hay công thức, đắn (well-formed formula)  Lý thuyết phép chứng minh (thuộc lĩnh vực tiên đề học – axiomatics) : định nghĩa khái niệm chứng minh suy diễn  Lý thuyết mô hình (về mặt nghĩa) : định nghĩa khái niệm tính hợp lệ (validity) hệ lơgic (logical consequence) Một cách lý tưởng người ta nói : Tính hợp lệ = Tính chứng minh (Validity=Demonstrability) Người ta phân biệt lôgic học theo phương diện ứng dụng xử lý ngơn ngữ, gồm có loại lơgic sau : 10 Yes is sin(pi/2) Yes ?- 1.0 is sin(pi/2) No ?- 1.0 is float(sin(pi/2)) Yes ?- 1.0 =:= sin(pi/2) Yes II.2 Các phép so sánh hạng Các phép so sánh hạng Prolog sau : Ký hiệu Giải thích (khi phép tốn thành cơng) Term1 == Term2 Term1 tương đương với Term2 Một biến đồng với biến chia sẻ hạng (sharing variable) Term1 \== Term2 Tương đương với \Term1 == Term2 Term1 = Term2 Term1 khớp với Term2 Term1 \= Term2 Tương đương với \Term1 = Term2 Term1 =@= Term2 Term1 có cấu trúc (structurally equal) với Term2 Tính có cấu trúc yếu tính tương đương (equivalence), lại mạnh phép hợp Term1 \=@= Term2 Tương đương với ’\Term1 =@= Term2’ Term1 @< Term2 Term1 Term2 theo thứ tự chuẩn hạng Term1 @=< Term2 hai hạng Term1 đứng trước Term2 theo thứ tự chuẩn hạng Term1 @> Term2 Term1 đứng sau Term2 theo thứ tự chuẩn hạng Term1 @>= Term2 Hoặc hai hạng nhau, Term1 đứng sau Term2 theo thứ tự chuẩn hạng compare(Order, Term1, Term2) Kiểm tra thứ tự = hai hạng Ví dụ II.2 : ?- free_variables(a(X, b(Y, X), Z), L) L=[G367, G366, G371] 81 X=G367 Y=G366 Z=G371 ?- a =@= A No ?- a =@= B No ?- x(A, A) =@= x(B, C) No ?- x(A, A) =@= x(B, B) A=_G267 B=_G270 Yes ?- x(A, B) =@= x(C, D) A=_G267 B=_G268 C=_G270 D=_G271 Yes ?- @< Yes ?- @< a Yes ?- a @< abc6 Yes ?- abc6 @< t(c, d) Yes ?- t(c, d) @< t(c, d, X) X=_G284 Yes II.3 Vị từ xác định kiểu Do Prolog ngôn ngữ định kiểu yếu nên NLT thường xuyên phải xác định kiểu tham đối Sau số vị từ xác định kiểu (type predicates) Prolog Vị từ Kiểm tra var(V) nonvar(X) V biến ? X biến ? 82 atom(A) integer(I) float(R) number(N) atomic(A) compound(X) ground(X) A nguyên tử ? I số nguyên ? R số thực (dấu chấm động) ? N số (nguyên thực) ? A nguyên tử số ? X hạng có cấu trúc ? X hạng hồn tồn ràng buộc ? Ví dụ II.3 : ?- var(X) X=_G201 Yes ?- integer(34) Yes ?- ground(f(a, b)) Yes ?- ground(f(a, Y)) No III Định nghĩa hàm Prolog kiểu hàm, hàm phải định nghĩa quan hệ đối tượng Các tham đối hàm giá trị trả hàm phải đối tượng quan hệ Điều có nghĩa xây dựng hàm tổ hợp từ hàm khác Ví dụ III.1 : Định nghĩa hàm số học cộng hai số plus(X, Y, Z) :% trường hợp tính Z=X + Y nonvar(X), nonvar(Y), Z is X + Y plus(X, Y, Z) :% trường hợp tính X=Z - Y nonvar(Y), nonvar(Z), X is Z - Y plus(X, Y, Z) :% trường hợp tính Y - Z - X nonvar(X), nonvar(Z), Y is Z - X ?- add1(2, 3, X) X=5 Yes add1(7, X, 3) X=-4 Yes 83 add1(X, 2, 6) X=4 Yes III.1 Định nghĩa hàm sử dụng đệ quy Trong trước, ta trình bày cách định nghĩa luật đệ quy Sau đây, ta tiếp tục ứng dụng phép đệ quy để xây dựng hàm Tương tự ngơn ngữ lập trình mệnh lệnh, thủ tục đệ quy Prolog phải chứa mệnh đề thoả mãn điều kiện :  Một khởi động trình lặp  Một sơ đồ lặp lại  Một điều kiện dừng Ví dụ thủ tục đệ quy tạo dãy 10 số tự nhiên chẵn sau : lấy giá trị để khởi động q trình Sau lấy giá trị hành để tạo số nhờ sơ đồ lặp : even_succ_nat=even_succ_nat + Quá trình tiếp tục có đủ 10 số 10 12 14 16 18 dừng lại Trong Prolog, mệnh đề đệ quy (để tạo sơ đồ lặp ) mệnh đề có chứa thân (vế phải) lần lời gọi lại mệnh đề (vế trái) : a(X) :- b(X, Y), a(Y) Mệnh đề a gọi lại vế phải Dạng sơ đồ lặp gọi đệ quy trực tiếp Để không xảy lời gọi vơ hạn, cần có mệnh đề làm điều kiện dừng đặt trước mệnh đề Mỗi lần vào lặp mới, điều kiện dừng kiểm tra để định xem tiếp tục gọi a hay không ? Ta xây dựng thủ tục even_succ_nat(Num, Count) tạo số tự nhiên chẵn Num, biến Count để đếm số bước lặp Điều kiện dừng Count=10, ta có : even_succ_nat(Num, 10) Mệnh đề lặp xây dựng sau : even_succ_nat(Num, Count) :write(Num), write(' '), Count1 is Count + 1, Num1 is Num + 2, even_succ_nat(Num1, Count1) Như vậy, lời gọi tạo 10 số tự nhiên chẵn : ?- even_succ_nat(0, 0) 10 12 14 16 18 Yes Một cách khác để xây dựng sơ đồ lặp gọi đệ quy khơng trực tiếp có dạng sau : a(X) :- b(X) 84 b(X) :- c(Y…), a(Z) Trong sơ đồ lặp này, mệnh đề đệ quy a không gọi gọi trực tiếp đến a, mà gọi đến mệnh đề b khác, mà b lại có lời gọi đến a Để khơng xảy lời gọi luẩn quẩn vô hạn, b cần thực tính tốn làm giảm dần q trình lặp trước gọi lại mệnh đề a (ví dụ mệnh đề c) Ví dụ sơ đồ gây vịng luẩn quẩn vơ hạn : a(X) :- b(X, Y) b(X, Y) :- a(Z) Bài toán tạo 10 số tự nhiên chẵn viết lại theo sơ đồ đệ quy không trực tiếp sau : a(0) a(X) :- b(X) b(X) :- X1 is X - 2, write(X), write(' '), a(X1) Chương trình khơng gọi « đệ quy » even_succ_nat Kết sau lời gọi a(20) dãy số giảm dần 20 18 16 14 12 10 Ví dụ III.2 : Xây dựng số tự nhiên (Peano) phép cộng số tự nhiên /* Định nghĩa số tự nhiên */ nat(0) % số tự nhiên nat(s(N)) :% s(X) số tự nhiên nat(N) % N số tự nhiên Chẳng hạn số viết : s(s(s(s(s(zero))))) /* Định nghĩa phép cộng */ addi(0, X, X) addi(X, 0, X) addi(s(X), Y, s(Z)) :addi(X, Y, Z) % luật : + X=X % luật : X + 0=X % luật : X + Y=Z (X+1) + Y=(Z+1) Hoặc định nghĩa theo nat(X) sau : addi(0, X, X) :- nat(X) ?- addi(X, Y, s(s(s(s(0))))) X=0 Y=s(s(s(s(0)))) Yes ?- addi(X, s(s(0)), s(s(s(s(s(0)))))) X=s(s(s(0))) Yes ?- THREE=s(s(s(0))), FIVE=s(s(s(s(s(0))))), addi(THREE, FIVE, EIGHT) 85 THREE=s(s(s(0))) FIVE=s(s(s(s(s(0))))) EIGHT=s(s(s(s(s(s(s(s(0)))))))) Yes Ví dụ III.3 : Tìm ước số chung lớn (GCD: Greatest Common Divisor) Cho trước hai số nguyên X Y, ta cần tính ước số D USCLN dựa ba quy tắc sau : Nếu X=Y, D X Nếu X < Y, D USCLN X Y - X Nếu X > Y, thực tương tự bước 2, cách hốn vị vai trị X Y Có thể dễ dàng tìm ví dụ minh hoạ hoạt động ba quy tắc trước Với X =20 Y =25, ta nhận D =5 sau dãy phép trừ Chương trình Prolog xây dựng sau : gcd( X, X, X ) gcd( X, Y, D ) :X < Y, Y1 is Y – X, gcd( X, Y1, D ) gcd( X, Y, D ) :X > Y, gcd( Y, X, D ) Đích cuối mệnh đề thứ ba thay : X1 is X – Y, gcd( X1, Y, D ) Kết chạy Prolog sau : ?- gcd( 20, 55, D ) D=5 Ví dụ III.4 : Tính giai thừa fac(0, 1) fac(N, F) :N > 0, M is N - 1, fac(M, Fm), F is N * Fm Mệnh đề thứ hai có nghĩa : N > 0, M=N - 1, Fm is (N-1)!, F=N * Fm, F N! Phép tốn is giống phép gán ngơn ngữ lập trình mệnh lệnh Prolog, is không gán giá trị cho biến Về mặt lôgic, thứ tự mệnh đề 86 vế phải luật khơng có vai trị gì, lại có ý nghĩa thực chương trình M khơng phải biến lời gọi thủ tục đệ quy gây vịng lặp vô hạn Các định nghĩa hàm Prolog thường rắc rối hàm quan hệ mà biểu thức Các quan hệ định nghĩa sử dụng nhiều luật thứ tự luật xác định kết trả hàm… Ví dụ III.5 : Tính số Fibonacci /* Fibonacci function */ fib(0, 0) % fib0 = fib(1, 1) % fib1 = fib(N, F) :% fibn+2 = fibn+1 + fibn N > 1, N1 is N - 1, fib(N1, F1), N2 is N - 2, fib(N2, F2), F is F1 + F2 ?- fib(20, F) F=10946 Yes ?- fib(21, F) ERROR: Out of local stack Ta nhận thấy thuật toán Fibonacci sử dụng hai lần gọi đệ quy nhanh chóng làm đầy nhớ với N=21, SWI-prolog phải dừng lại để thơng báo lỗi Ví dụ III.6 : Tính hàm Ackerman /* Ackerman's function */ ack(0, N, A) :% Ack(0, n) = n + A is N + ack(M1, 0, A) :% Ack(m, n) = Ack(m-1, 1) M > 0, M is M - 1, ack(M, 1, A) ack(M1, N1, A) :% Ack(m, n) = Ack(m-1, Ack(m, n-1)) M1 > 0, N1 > 0, M is M - 1, N is N - 1, ack(M1, N, A1), ack(M, A1, A) Ví dụ III.7 : Hàm tính tổng plus(X, Y, Z) :nonvar(X), nonvar(Y), Z is X + Y 87 plus(X, Y, Z) :nonvar(Y), nonvar(Z), X is Z - Y plus(X, Y, Z) :nonvar(X), nonvar(Z), Y is Z - X III.2 Tối ưu phép đệ quy Lời giải tốn sử dụng đệ quy ngơn ngữ lập trình nói chung thường ngắn gọn, dễ hiểu dễ quản lý chương trình Tuy nhiên, số trường hợp, sử dụng đệ quy lại xảy vấn đề độ phức tạp tính tốn, khơng tốn nhớ mà tốn thời gian Trong ngơn ngữ mệnh lệnh, phép tính n! sử dụng đệ quy cần sử dụng nhớ có cỡ 0(n) thời gian tính tốn có cỡ 0(n), thay gọi đệ quy, người ta thường sử dụng phép lặp fac=fac*i, i=1 n Ta xét lại ví dụ tính số Fibonacci với lời gọi đệ quy : fib(N, F) :N > 1, N1 is N - 1, fib(N1, F1), N2 is N - 2, fib(N2, F2), F is F1 + F2 Để ý lần gọi hàm fib(n) với n>1 dẫn tới hai lần gọi khác, nghĩa số lần gọi tăng theo luỹ thừa Với n lớn, chương trình gọi đệ quy dễ gây tràn nhớ mà khơng dẫn đến kết mong muốn Ví dụ sau tất lời gọi cho trường hợp n=5 fib5 3 2 1 1 Hình III.1 Biểu diễn lời gọi đệ quy tìm số Fibonacci Một số ngơn ngữ mệnh lệnh tính số Fibonacci sử dụng cấu trúc lặp để tránh tính tính lại giá trị Chẳng hạn chương trình Pascal dùng hai biến phụ x=fib(i) y=fib(i+1) : { tính fib(n) với n > } 88 i:= 1; x:= 1; y:= 0; while i < n begin x:= x + y; y:= x – y end; Ta viết lại chương trình Prolog sau : fibo(0, 0) fibo(N, F) :N >= 1, fib1(N, 1, 0, F) fib1(1, F, _, F) fib1(N, F2, F1, FN) :N > 1, N1 is N - 1, F3 is F1 + F2, fib1(N1, F3, F2, FN) ?- fibo(21, F) F=10946 Yes ?- fibo(200, F) F=2.80571e+041 Yes III.3 Một số ví dụ khác đệ quy III.3.1.Tìm đường đồ thị có định hướng Cho đồ thị có định hướng sau : A B C D E Hình III.2 Tìm đường đồ thị có định hướng Ta xét tốn tìm đường hai đỉnh đồ thị Mỗi cung nối hai đỉnh đồ thị biểu diễn quan hệ hai đỉnh Từ đồ thị trên, ta viết mệnh đề Prolog biểu diễn kiện : arc(a, b) arc(b, c) arc(c, e) 89 arc(c, d) arc(a, e) Giả sử cần kiểm tra có tồn đường hai nút a d (không tồn đường hai nút mô tả), ta viết mệnh đề : path(a, d) Để định nghĩa này, ta nhận xét sau :  Tồn đường hai nút có cung nối chúng  Tồn đường hai nút X Y tồn nút thứ ba Z cho tồn đường X Z đường Z Y Ta viết chương trình sau : path(X, Y) :- arc(X, Y) path(X, Y) :arc(X, Z), path(Z, Y) Ta thấy định nghĩa thủ tục path(X, Y) tương tự thủ tục tìm tổ tiên gián tiếp hai người dòng họ ancestor(X, Y) xét trước ?- path(X, Y) X=a Y=b ; X=b Y=c ; … III.3.2.Tính độ dài đường đồ thị Ta xét tốn tính độ dài đường hai nút, từ nút đầu đến nút cuối đồ thị số cung chúng Chẳng hạn độ dài đường hai nút a d ví dụ Ta lập luận sau :  Nếu hai nút có cung nối chúng độ dài đường  Gọi L độ dài đường hai nút X Y, L1 độ dài đường nút thứ ba Z Y tồn giả sử có cung nối X Z, L=L1 + Chương trình viết sau : trajectory(X, Y, 1) :- arc(X, Y) trajectory(X, Y, L) :arc(X, Z), trajectory(Z, Y, L1), L is L1 + 90 trajectory(a, d, L) L=3 Yes III.3.3.Tính gần chuỗi Trong Tốn học thường gặp tốn tính gần giá trị hàm số với độ xác nhỏ tuỳ ý (e) theo phương pháp khai triển thành chuỗi Max Loren Ví dụ tính hàm mũ ex với độ3 xác 10-6 nhờ khai triển chuỗi Max Loren : ex   x  x x   2! 3! Gọi expower(X, S) hàm tính giá trị hàm mũ theo X, biến S kết gần với độ xác e=10-6 Từ cơng thức khai triển Max Loren đây, ta nhận thấy giá trị hàm mũ ex tổng vơ hạn có dạng : sum(0) = 1, t0 = tương ứng với x = ex = sum(i+1) = sum(i) + ti+1, với ti+1 = ti * x /( i+1), i = 0, 1, … Để thực phép lặp, ta cần xây dựng hàm đệ quy tính tổng sum(X, S, I, T) sử dụng biến trung gian I bước lặp thứ i T số hạng t i Theo cách xây dựng này, hàm tính tổng sum(X, S, I, T) tổng số hạng thứ I trở chuỗi Quá trình tính tổng dừng lại ti< e, nghĩa đạt độ xác e Tại thời điểm này, giá trị tổng số hạng ti Điều kiện khởi động trình lặp chuyển vị từ expower(X, S) thành vị từ tính tổng sum(X, S, I, T) với giá trị đầu I=0 T=1 Ta có chương trình đệ quy sau : expower(X, S) :sum(X, S, 0, 1) sum(_, T, _, T) :abs(T) < 0.000001 sum(X, S, I, T) :abs(T) > 0.000001, I1 is I + 1, T1 is T*X/I1, sum(X, S1, I1, T1), S is S1 + T ?- expower(1, S) S=2.71828 Yes ?- expower(10, S) S=22026.5 Yes 91 Bài tập Cho biết kết câu hỏi sau : ?- X=Y ?- X is Y ?- X=Y, Y=Z, Z=1 ?- X=1, Z=Y, X=Y ?- X is 1+1, Y is X ?- Y is X, X is 1+1 ?- 1+2 == 1+2 ?- X == Y ?- X == X ?- =:= 2-1 ?- X =:= Y Cho biết kết câu hỏi sau : ?- op(X) is op(1) ?- op(X)=op(1) ?- op(op(Z), Y)=op(X, op(1)) ?- op(X, Y)=op(op(Y), op(X)) Từ định nghĩa số tự nhiên (nat) phép cộng (addi) cho ví dụ mục định nghĩa hàm, viết tiếp hàm trừ (subt), nhân (multi), chia (divi), luỹ thừa (power), giai thừa (fact), so sánh nhỏ (less) tìm ước số chung lớn (pdg) sử dụng hàm có (chẳng hạn less, subt…) Viết hàm Prolog để kiểm tra số nguyên tuỳ ý N : a N số chẵn (even number) sử dụng đệ quy trực tiếp Hướng dẫn : N chẵn N2 số chẵn b N số lẻ (odd number) sử dụng đệ quy trực tiếp Hướng dẫn : N lẻ N2 số lẻ c N chẵn sử dụng hàm kiểm tra số lẻ câu d (N chẵn N1 số lẻ) d N số lẻ sử dụng hàm kiểm tra số chẵn câu c (N lẻ N1 chẵn) Viết hàm Prolog để làm duyệt (tracking/traverse) nhị phân theo thứ tự trước (reorder), sau (post-order) (in-order) Giả sử nhị phân tương ứng với biểu thức số học (5+6)*(3-(2/2)) mệnh đề Prolog sau : tree(’*’, tree(’+’, leaf(5), leaf(6)), tree(’-’, leaf(3), tree(’/’, leaf(2), leaf(2))) Kết duyệt sau : theo thứ tự trước : [*, +, 5, 6, -, 3, /, 2, 2] thứ tự : 92 [5, +, 6, *, 3, -, 2, /, 2] thứ tự sau : [5, 6, +, 3, 2, 2, /, -, *] Viết lại hàm tạo 10 số tự nhiên chẵn (đã cho phần đệ quy) cho kết trả dãy số tăng dần Lập bảng nhân table(R, N) có số bị nhân (multiplicator) từ trở với số nhân N (multiplier) dừng lại gặp số bị nhân R (kết R * N) Viết hàm tính gần giá trị hàm sau với độ xác e = 10-5 :  1      đến x2 x4 x6 +  +   + x2 x3 xn S = - x + + + (-1) n + 2! 3! n! 1+ S  1 y= x2 x4 x6 x 2n      2! 4! 6! (2n)! x + x + +  2n - đến phần tử thứ n < e đến xn  n! đến x 2n  105 (2n)! có n > dấu x Trình Prolog trình diễn dịch (interpreter) cho ngơn ngữ lập trình đơn giản gồm số nguyên int(N), biến id(X), hàm fn(X,E), gọi hàm app(E1,E2) : %% subst(E1, E2, X, V) %% thực phép biến X biến V E1 để trả E2 subst(int(N), int(N), _, _) subst(id(X), V, X, V) subst(id(Y), id(Y), X, _) :X \= Y subst(fn(X, E), fn(X, E), X, _) subst(fn(Y, Ea), fn(Y, Eb), X, V) :X \= Y, subst(Ea, Eb, X, V) subst(app(E1a, E2a), app(E1b, E2b), X, V) :subst(E1a, E1b, X, V), subst(E2a, E2b, X, V) %% reduce(E, V) %% thực phép tính giá trị E để trả V reduce(int(N), int(N)) 93 reduce(fn(X, B), fn(X, B)) reduce(app(E1, E2), V) :reduce(E1, fn(X, B)), reduce(E2, V2), subst(B, E, X, V2), reduce(E, V) Câu hỏi : a Cho biết cách trao đổi tham biến hợp lệ ngôn ngữ mô tả ? Cách trao đổi tham biến khơng thể thực ? b Tìm cách thay đổi trình Prolog để thực phương pháp trao đổi tham biến khác c Cho biết tầm vực (scope) biến tĩnh hay động ? 10 Cho ví dụ đồ thị khơng định hướng : arc(a,b) arc(d,f) arc(b,c) arc(f,a) arc(c,d) arc(a,b) arc(c,e) arc(h,i) arc(c,g) arc(i,j) arc(g,f) Hãy viết hàm tìm đường hai đỉnh đồ thị Tài liệu tham khảo I Bratko (L Ricard dịch), Programmation en Prolog pour l’ intelligence artificielle, InterÉditions, Paris, 1988 I Bratko, Programming for Artificial Intelligence, AddisonWesley, 1987 K.L Clavle, S.A Tarnlound Logic Programming Accademic Press 1983 G Falquet Prolog et programmation logique Notes de cours, Université de Genève, 2002 H Farrenry, M Ghallab Éléments d’intelligence artificielle, Hermes, ParisLondre-Lausanne 1990 P Gribomont Logiques pour l’ intelligence artificielle Notes de cours 2003-2004 Bạch Hưng Khang, Hồng Kiếm Trí tuệ nhân tạo : phương pháp ứng dụng Nhà Xuất Khoa học Kỹ thuật, 1989 Phan Huy Khánh Lập trình lơgic Prolog Nhà Xuất Đại học Quốc gia Hà Nội 2004 J.W Leoyd Foundations of Logic Programming, Springer-Verlag, 1984 10 P Nugues La Programmation logique et le langage Prolog Notes de cours, ISMRA, 2002 11 D Teller Partiel de Prolog Notes de cours, École Centrale de Lyons, 2001 94 12 Nguyễn Thanh Thuỷ Trí tuệ nhân tạo : phương pháp giải vấn đề kỹ thuật xử lý tri thức Nhă Xuất Giâo dục, 1986 13 A.Voronkov, Logic Programming and automated reasoning, Springer-Verlag, 1993 14 Các tài liệu lôgic, Prolog tập Internet : http://www.irit.fr/GRACQ/COURS/coursJCNA.html ftp://ftp.umh.ac.be/pub/ftp_sgl/LangagesProgrammation/LP-exercProlog.pdf http://www.etse.urv.es/EngInf/assig/iai/Laboratoris/Prolog/ http://membres.lycos.fr/epl2000/2eme/POO/ SPV_Prolog/1_Prolog_leLangage/ http://www.uqac.ca/~flabelle/semantique/logo/logique1.htm#sol1 http://www.ulb.ac.be/di/ssd/jfr http://www-etis.ensea.fr/~revel/html/cours_IA/\ 95 ... dung Lôgic mệnh đề - Cú pháp lôgic mệnh đề - Ngữ nghĩa lôgic mệnh đề Lôgic vị từ Cú pháp lôgic mệnh đề - Bảng chữ - Hạng - Nguyên tử Các công thức chỉnh I Mở đầu lôgic học Lôgic học (the lôgic) ... ITPRG 3-0 1.1 Mục tiêu thực Học xong học viên có khả năng: - Nắm khái niệm lôgic học, ứng dụng lôgic học - Nắm lôgic mệnh đề ngữ nghĩa lôgic mệnh đề - Hiểu lôgic vị từ, cú pháp lôgic vị từ - Nắm khái niệm... luận Lập trình lập trình logic có hiệu so với lập trình thủ tục Từ bỏ thói quen lập trình truyền thống sử dung lợi lập trình logíc lớp toán Thái độ học viên: Rèn tư logic để phân tích, tổng hợp

Ngày đăng: 17/01/2022, 11:30

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w