1. Trang chủ
  2. » Luận Văn - Báo Cáo

Ứng dụng lập trình hàm giải và suy luận một số bài toán rời rạc luận văn thạc sỹ ngành công nghệ thông tin

88 0 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

Nội dung

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƢỜNG ĐẠI HỌC GIAO THƠNG VẬN TẢI VÕ ĐỨC TỒN ỨNG DỤNG LẬP TRÌNH HÀM GIẢI VÀ SUY LUẬN MỘT SỐ BÀI TOÁN RỜI RẠC LUẬN VĂN THẠC SĨ KỸ THUẬT TP Hồ Chí Minh – 2017 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƢỜNG ĐẠI HỌC GIAO THƠNG VẬN TẢI VÕ ĐỨC TỒN ỨNG DỤNG LẬP TRÌNH HÀM GIẢI VÀ SUY LUẬN MỘT SỐ BÀI TỐN RỜI RẠC NGÀNH CƠNG NGHỆ THƠNG TIN MÃ SỐ: 60.48.02.01 LUẬN VĂN THẠC SĨ KỸ THUẬT HƢỚNG DẪN KHOA HỌC TS Trần Văn Dũng TP Hồ Chí Minh – 2017 i LỜI CAM ĐOAN Tôi xin cam đoan: Những kết nghiên cứu trình bày luận văn hồn tồn trung thực, tơi khơng vi phạm điều luật sở hữu trí tuệ pháp luật Việt Nam Trong trình làm luận văn tơi có tham khảo tài liệu có liên quan ghi rõ nguồn tài liệu tham khảo Những kiến thức tơi trình bày luận văn chưa trình bày hồn chỉnh tài liệu TÁC GIẢ LUẬN VĂN Võ Đức Tồn ii LỜI CẢM ƠN Đầu tiên, tơi xin gửi lời cảm ơn chân thành sâu sắc đến thầy cô giáo trường Đại học Giao Thông Vận Tải nói chung thầy khoa CNTT nói riêng tận tình dạy bảo, truyền đạt lại kiến thức kinh nghiệm quý báu suốt thời gian qua Tôi xin trân trọng gửi lời cảm ơn tới thầy TS Trần Văn Dũng, người nhiệt tình giúp đỡ, trực tiếp bảo, hướng dẫn suốt trình thực luận văn cao học Trong q trình làm việc với thầy, tơi tiếp thu thêm nhiều kiến thức bổ ích, kinh nghiệm việc thực luận văn thái độ làm việc nghiêm túc, hiệu Đây kinh nghiệm cần thiết, quý báu giúp áp dụng vào thực tiễn sau làm việc Sau cùng, cho phép tơi cảm ơn bạn bè, gia đình giúp đỡ, ủng hộ tơi nhiều tồn q trình học tập nghiên cứu hồn thành luận văn TP HCM, ngày tháng năm Học viên thực Võ Đức Toàn iii MỤC LỤC LỜI CAM ĐOAN i LỜI CẢM ƠN ii Đặt vấn đề Đối tƣợng phạm vi nghiên cứu .1 Hƣớng nghiên cứu đề tài .2 Những nội dung nghiên cứu Chƣơng TỔNG QUAN NGÔN NGỮ LẬP TRÌNH HÀM ML .3 1.1 Giới thiệu chung 1.1.1 Mở đầu 1.1.2 Các kiểu 1.1.3 Danh sách (List) 1.1.4 Các kiểu hàm số biểu thức 1.1.5 1.1.6 Hàm số chuẩn operator overloading 1.1.7 Chuỗi hàm chuẩn (String) 1.1.8 Các hàm chuẩn danh sách 1.2 Suy luận kiểu 10 1.2.1 Suy luận kiểu 11 1.2.2 Thuật toán suy luận kiểu 12 1.2.3 Định nghĩa hàm đa hình 12 1.2.4 Hàm đệ quy 14 1.2.5 Hàm nhiều mệnh đề 16 1.3 Đệ quy 17 1.3.1 Định nghĩa đệ quy 17 1.3.2 Thành phần hàm đệ quy 17 iv 1.3.3 1.4 Một số loại đệ quy 17 Hàm bậc cao 17 1.4.1 17 1.4.2 Dãy vô hạn 19 1.5 Quy nạp đệ quy 20 Tóm tắt chƣơng 1: .23 Chƣơng SUY LUẬN MỘT SỐ BÀI TỐN RỜI RẠC BẰNG LẬP TRÌNH HÀM ML 2.1 24 Tính đắn thuật toán 24 2.1.1 Tính đắn: 24 2.1.2 Bất biến vòng lặp 26 2.1.3 Ví dụ lớn 28 2.1.4 Ví dụ nhỏ 29 2.2 Từ định lí đến thuật toán 31 2.2.1 Thuật toán chia (division) 31 2.2.2 Thuật toán Euclide 33 2.2.3 Thuật toán Euclide theo cách khác 35 2.3 Thuật toán đệ quy 36 2.3.1 Phân tích 36 2.3.2 Tổng hợp 40 2.4 Xét lại đệ quy 42 2.4.1 Phạm vi 42 2.4.2 Quan hệ truy hồi (Recurrence relations) 46 Tóm tắt chƣơng 2: .48 Chƣơng SỬ DỤNG ML GIẢI MỘT SỐ BÀI TOÁN RỜI RẠC PHỔ THÔNG 3.1 50 Một số toán số học 50 v 3.1.1 Tim ƣớc chung lớn gcd 50 3.1.2 Tính giai thừa Factorial 51 3.1.3 Tính hàm Fibonachi 51 3.1.4 Tính lũy thừa: 52 3.2 Bài tốn tìm kiếm 53 3.2.1 Tìm kiếm 53 3.2.2 Tìm kiếm nhị phân: 56 3.3 Một số toán danh sách 59 3.3.1 Tìm phần tử max/min 59 3.3.2 Tính tổng, tích phần tử dãy 61 3.3.3 Ghép hai dãy 63 3.3.4 Đảo ngƣợc danh sách: 64 3.4 Bài toán xếp 65 3.4.1 Sắp xếp chèn 65 3.4.2 Sắp xếp chọn 69 3.4.3 Quick sort 70 3.5 Một số toán khác: 72 3.5.1 Tập hợp: 72 3.5.2 Quan hệ: 73 3.5.3 Tính bắc cầu: 74 3.5.4 Tìm bao đóng bắc cầu: 76 Tóm tắt chƣơng 3: .78 Kết luận hƣớng phát triển .79 Phƣơng pháp nghiên cứu 79 Ý nghĩa khoa học đề tài .79 Tài liệu tham khảo 79 vi Phụ lục chƣơng trình: Chƣơng trình 2.1: Hàm tính tổng chuổi số từ đến n 24 Chƣơng trình 2.2: Hàm tìm số dƣ a chia b 26 Chƣơng trình 2.3: Hàm tìm phần tử nhỏ mảng 29 Chƣơng trình 2.4: Hàm kiểm tra phần tử có danh sách .37 Chƣơng trình 2.5: Hàm đếm số phần tử có danh sách 39 Chƣơng trình 2.6: Hàm tính giai thừa n dùng vịng lặp 43 Chƣơng trình 2.7: Hàm tính giai thừa n dùng vòng lặp 43 Chƣơng trình 2.8: Hàm tính giai thừa n dùng đệ quy .44 Chƣơng Trình 3.1: Hàm tìm ƣớc chung lớn hai số……………………… ……… 56 Chƣơng Trình 3.2: Hàm tính giai thừa 51 Chƣơng Trình 3.3: Hàm tính số hạng thứ n dãy Fibonachi 51 Chƣơng Trình 3.4: Hàm tính luỹ thừa an .53 Chƣơng Trình 3.5: Hàm tìm kiếm phần tử danh sách 54 Chƣơng Trình 3.6: Hàm tìm kiếm trả vị trí phần tử danh sách 54 Chƣơng Trình 3.7: Hàm tìm kiếm kiểu danh sách 55 Chƣơng Trình 3.8: Hàm tìm kiếm nút 58 Chƣơng Trình 3.9: Hàm tìm phần tử max danh sách 59 Chƣơng Trình 3.10: Hàm tìm phần tử max kiểu danh sách 60 Chƣơng Trình 3.11: Hàm tìm phần tử max danh sách cách truyền hàm so sanh 60 Chƣơng Trình 3.12: Hàm tìm phần tử max kiểu chuổi danh sách cách truyền hàm so sanh 61 Chƣơng Trình 3.13: Hàm tính tổng phần tử danh sách 61 Chƣơng Trình 3.14: Hàm tính tích phần tử danh sách 62 Chƣơng Trình 15: Hàm tính tích phần tử danh sách truyền hàm .62 Chƣơng Trình 3.16: Hàm nối hai danh sách 64 Chƣơng Trình 3.17: Hàm đảo ngƣợc danh sách 65 Chƣơng Trình 3.18: Hàm chèn phần tử vào danh sách có thứ tự 66 Chƣơng Trình 3.19: Hàm xếp chèn danh sách 67 Chƣơng Trình 3.20: Hàm xếp chèn danh sách kiểu 68 vii Chƣơng Trình 3.21: Hàm xếp chọn danh sách 70 Chƣơng Trình 3.22: Hàm xếp nhanh danh sách 71 Chƣơng Trình 3.23: Hàm kiểm tra phần tử nằm danh sách 72 Chƣơng Trình 3.24: Hàm loại bỏ phần tử trùng danh sách 73 Chƣơng Trình 3.25: Hàm kiểm tra cặp có nằm quan hệ 73 Chƣơng Trình 3.26: Hàm kiểm tra tính bắt cầu 75 Chƣơng Trình 3.27: Hàm tìm bao đóng bắt cầu 76 Chƣơng Trình 3.28: Hàm ghép quan hệ với cặp không bắt cầu 77 Chƣơng Trình 3.29: Hàm kiểm tra tính bắt cầu trƣớc lấy bao đóng .77 LỜI NĨI ĐẦU Đặt vấn đề Trong thời đại công nghệ thông tin ngày nay, việc ứng dụng công nghệ thông tin vào sống, nhƣ ngành khoa học ngày trở nên quan trọng cần thiết, ứng dụng phần mềm ngơn ngữ lập trình vào khoa học kỹ thuật ngày đóng vai trị quan trọng Trƣớc công nghệ thông tin chƣa phát triển việc giải tốn gặp nhiều khó khăn việc suy luận kết đạt đƣợc chƣa có tính thuyết phục cao Giờ máy tính đƣợc sử dụng rộng rãi, yêu cầu đƣợc giải cách đơn giản Chỉ cần thuật toán cần thay giá trị khác cho tốn khác Việc tìm hiểu, học hỏi, ứng dụng lập trình phần mềm giải vấn đề ngày quan trọng cần thiết Đề tài khóa luận “ỨNG DỤNG LẬP TRÌNH HÀM GIẢI VÀ SUY LUẬN MỘT SỐ BÀI TOÁN RỜI RẠC” nghiên cứu khoa học ứng dụng công nghệ thông tin cụ thể, dùng ngơn ngữ lập trình hàm ML vào giải chứng minh số toán rời rạc Khóa luận chia làm chƣơng: Chƣơng Tổng quan ngơn ngữ lập trình hàm ML Chƣơng Tốn rời rạc lập trình hàm ML Chƣơng Ứng dụng ML suy luận số toán rời rạc Khóa luận đƣợc thực hồn thành Khoa Công Nghệ Thông Tin Trƣờng Đại Học Giao Thông Vận Tải với hƣớng dẫn thầy TS Trần Văn Dũng Mặc dù có nhiều cố gắng nhƣng lực thời gian cịn hạn chế nên khóa luận khơng thể tránh khỏi thiếu sót nội dung hình thức Vì tơi mong lời bảo góp ý quý Thầy Cô Đối tƣợng phạm vi nghiên cứu Đối tƣợng nghiên cứu dùng ngơn ngữ lập trình hàm, giải suy luận số toán rời rạc, sau hồn chỉnh tham khảo tài liệu Luận văn để giảng dạy số chủ đề Tốn rời rạc có chƣơng trình giải suy luận minh hoạ 65 in fun rev l = rev_helper (l, nil) end; Chương Trình 3.15: Hàm đảo ngược danh sách Kết chạy ML: rev(["Hung","Lam","Ngan","Hanh"]); val it = ["Hanh","Ngan","Lam","Hung"] : string list rev([2,5,6,3,4]); val it = [4,3,6,5,2] : int list 3.4 Bài toán xếp Cho danh sách phần tử kiểu liệu có phép so sánh khơng bé (hoặc khơng lớn hơn) hai phần từ Hãy xếp phần tử danh sách theo thứ tự khơng giảm dần (hoặc khơng tăng dần) Ta có nhiều thuật toán xếp khác nhƣ xếp chèn insertsort, xếp chọn selectsort, xếp nhanh quicksort, … 3.4.1 Sắp xếp chèn Nhƣ ta biết: danh sách l kiểu a đƣợc định nghĩa cách cho phần tử đầu danh sách fst kiểu a đƣợc tiếp nối đuôi danh sách rest danh sách kiểu a Tức l = fst::rest Trong fst phần tử kiểu a, l rest danh sách kiểu a Giả sử hai phần tử x, y kiểu a, ta có phép so sánh: Less_equal (x, y) = true x nhỏ y, ngƣợc lại Less_equal (x, y) = false Bigger_equal (x, y) = true x lớn y, ngƣợc lại Bigger_equal (x, y) = false 66 Trƣớc hết ta xét toán sau: Bài toán chèn: Cho danh sách tail kiểu a đƣợc xếp không giảm dần phần tử x kiểu a Hãy chèn x vào vị trí danh sách tail, cho danh sách nhận đƣợc xếp khơng giảm dần Thuật tốn chèn đƣợc thực hàm chèn nhƣ sau:  Nếu danh sách ban đầu tail rồng, chèn d vào tail đƣợc kết danh sách gồm phần tử d [d]  Nếu danh sách ban đầu tail khác rỗng, tức ta biểu diễn tail dạng tail = y::ys (trong y phần tử đầu tail ys đuôi tail) Khi ta so sánh x với y: o Nếu x nhỏ y xếp x đứng trƣớc y tiếp nối ys, ta nhận đƣợc danh sách đƣợc xếp không giảm o Ngƣợc lại, x lớn y, ta chèn x vào ys Do đó, ML hàm chèn đƣợc viết nhƣ sau fun less_equal(x,y) = x < y; val less_equal = fn : int * int -> bool fun insert(less_equal,x,nil) = [x] | insert(less_equal,x,y::ys) = if less_equal(x,y) then x::y::ys else y::insert(less_equal,x,ys); val insert = fn : ('a * 'a -> bool) * 'a * 'a list -> 'a list Chương Trình 3.16: Hàm chèn phần tử vào danh sách có thứ tự Ví dụ 3.7: fun behonhoacbangsonguyen(x:int, y:int) = x= y; insert (lonhonhoacbangsonguyen, 6, [9, 7, 5, 3, 1]) = 67 [9, 7, 6, 5, 3, 1] Bây giải toán xếp thuật toán xếp chèn insert_sort Bài toán xếp: Cho danh sách l kiểu a có hàm so sánh Less_equal hai phần tử a Hãy xếp l theo thứ tự không giảm dần Thuật toán xếp chèn đƣợc thực qua hàm insert_sort nhƣ sau: Nếu l rỗng, kết danh sách rỗng Nếu l khác rỗng, tức l = x::xs, insert_sort l tiến hành qua hai bƣớc: trƣớc hết giải toán nhỏ xếp chèn xs nó, sau chèn x vào kết đƣợc xếp insert_sort(xs) Do hàm insert_sort ML đƣợc định nghĩa nhƣ sau: fun less_equal(x,y) = x < y fun insert_sort(less_equal, nil) = nil | insert_sort(less_equal, x::xs) = insert(less_equal, x, insert_sort(less_equal, xs)); val less_equal = fn : int * int -> bool val insert_sort = fn : ('a * 'a -> bool) * 'a list -> 'a list Chương Trình 3.17: Hàm xếp chèn danh sách Ví dụ 3.8: insert_sort (behonhoacbangsonguyen, [7, 3, 1, 9, 6, 5]) = [1, 3, 5, 6, 7, 9] insert_sort (lonhonhoacbangsonguyen, [7, 1, 3, 9, 6, 5]) = [9, 7, 6, 5, 3, 1] Chú ý: Thuật toán xếp chèn thực xếp cho danh sách kiểu, mà đƣợc định nghĩa phép so sánh hai phần tử kiểu fun sosanhtudien (x:string, y:string) insert_sort(sosanhtudien, [“toan”, “minh”, “anh”, “kiet”]) = [“anh”, “kiet”, “minh”, “toan”] 68 Code ML: fun sosanhtudien (x:string, y) = x < y fun insert(sosanhdientu,x,nil) = [x] | insert(sosanhdientu,x,y::ys) = if sosanhdientu(x,y) then x: else y::insert(sosanhdientu,x,ys); val sosanhtudien = fn : string * string -> bool val insert = fn : ('a * 'a -> bool) * 'a * 'a list -> 'a list fun insert_sort(sosanhdientu, nil) = nil | insert_sort(sosanhdientu, x::xs) = insert(sosanhdientu,x,insert_sort(sosanhdientu, xs)); Chương Trình 3.18: Hàm xếp chèn danh sách kiểu Kết chạy ML: val insert_sort = fn : ('a * 'a -> bool) * 'a list -> 'a list insert_sort(sosanhtudien, ["toan", "minh", "anh", "kiet"]) ; val it = ["anh","kiet","minh","toan"] : string list Thuật toán xếp chèn đƣợc thực lấy phần tử danh sách chèn vào phần đuôi danh sách cho vị trí, q trình đƣợc lặp lại phần tử danh sách đƣợc chèn vào vị trí thích hợp, độ phức tạp thuật tốn phụ thuộc vào thứ tự danh sách ban đầu  Trƣờng hợp danh sách có thứ tự độ phức tạp thuật toán là: O(n)  Trƣờng hợp danh sách ngẫu nhiên độ phức tạp thuật toán là: O(n2) 69 3.4.2 Sắp xếp chọn Giả sử ta phải xếp danh sách số nguyên theo thƣ tự không giảm dần Ta tiến hành hàm select_sort nhƣ sau: Ta tìm phần tử nhỏ danh sách ban đầu cho hàm phụ select_r gồm biến: o Biến phần tử small - phần tử nhỏ số phần tử xét o Biến thứ ba danh sách output gồm phần tử thuộc danh sách ban đầu đƣợc xét Mọi phần tử output không nhỏ small o Biến thứ hai danh sách p gồm phần tử thuộc danh sách ban đầu lại chờ xét Tại bƣớc đệ quy: Nếu biến thứ hai p rỗng, small phần tử nhỏ tập phần tử danh sách cho Khi phần tử danh sách kết Và đuôi danh sách kết danh sách đƣợc xếp theo thứ tự không giảm dần đuôi danh sách ban đầu theo thuật toán select_sort Nếu p khác rỗng, tức p = x::xs, so sánh small với x: o Nếu x < small, thay small x thay p xs, ghép small vào đầu output, lại tiếp tục tính hàm phụ o Ngƣơc lại, small < = x, thay p xs ghép x vào đầu output, tiếp tục tính hàm phụ Thuật toán select_sort danh sách khác rỗng xuất phát việc gọi hàm select_r với: o đối số thứ small phần tử danh sách cho o đối số thứ hai p danh sách cho o cịn đối số thứ ba output danh sách rỗng Do bƣớc đầu thuật tốn select_sort đƣợc qui việc tìm phần tử nhỏ danh sách cho Code ML: fun selection_sort [] = [] | selection_sort (first::lst) = 70 let fun select_r small ([], output) = small::(selection_sort output) | select_r small (x::xs, output) = if (x< small) then select_r x (xs, small::output) else select_r small (xs, x::output) in select_r first (lst, []) end; Chương Trình 3.19: Hàm xếp chọn danh sách Kết chạy ML: val selection_sort = fn : int list -> int list selection_sort([2,5,4,3]); val it = [2,3,4,5] : int list Thuật tốn xếp chọn đƣợc thực tìm phần tử nhỏ danh sách để đƣa vào vị trí thích hợp, để tìm phần tử nhỏ ta phải so sánh tất phần tử danh sách trình so sánh đƣợc lặp lại với danh sách n-1 phần tử hết danh sách Do độ phức tạp thuật toán O(n2) 3.4.3 Quick sort Thuật toán quicksort giải toán xếp danh sách, nhƣng hiệu hai thuật toán insert_sort select_sort Giả sử ta phải xếp danh sách số nguyên theo thƣ tự không giảm dần Ta tiến hành hàm quick_sort nhƣ sau: o Trƣờng hợp sở quicksort(nil) = nil o Ta lấy phần tử danh sách làm phần tử trụ pivot o Gọi hàm phụ split tách danh sách x::xs ứng với phần tử pivot thành hai danh sách bellow above Trong Danh sách bellow gồm phần tử danh sách ban đầu nhỏ pivot 71 Danh sách above gồm phần tử danh sách ban đầu không nhỏ pivot Hàm phụ đƣợc định nghĩa nhƣ sau: o split(nil) = (nil, nil) o split (x::xs) với phần tử trụ pivot đƣợc tiến hành đệ quy nhƣ sau: Giả sử với phần tử trụ pivot, ta có (below, above) = split(xs) Khi đó, Nếu x < pivot, split(x::xs) = (x::below, above) Ngƣợc lại, (nếu x >= pivot) split(x::xs) = (below, x::above) Khi thuật toán quicksort (pivot::rest) đƣợc định nghĩa đệ quy quicksort(below) ghép với [pivot] ghép với quicksort (above) Code ML: fun quicksort nil = nil | quicksort(pivot::rest)= let fun split(nil) = (nil,nil) | split(x::xs)= let val (below,above)=split(xs) in if x int list quicksort [3,5,2,1,9,7]; val it = [1,2,3,5,7,9] : int list 72 Thuật toán Quicksort đƣợc thực chọn phần tử trụ chia danh sách ban đầu làm hai danh sách phía phía dƣới phần tử trụ, tìm phần tử danh sách có phần tử nhỏ phần tử trụ đƣa vào danh sách phía dƣới, phần tử lớn phần tử trụ đƣa vào danh sách phía Q trình tìm phần tử trụ so sánh đƣợc lặp lại với danh sách danh sách rỗng Do độ phức tạp thuật toán O(n*log(n)) Kết luận: Qua thuật toán xếp chọn, xếp chèn xếp nhanh  Độ phức tạp thuật toán xếp chọn là: O(n2)  Độ phức tạp thuật toán xếp chèn trƣờng hợp xấu là: O(n2)  Độ phức tạp thuật toán xếp nhanh là: O(n*log(n)) Do thuật tốn xếp nhanh tốt thuật toán xếp chèn thuật toán xếp chọn Một số toán khác: 3.5 3.5.1 Tập hợp: Tập hợp hữu hạn phần tử đƣợc lƣu dƣới dạng danh sách Và kiểm tra phần tử có nằm danh sách khơng nhƣ sau: Code ML: fun isElementOf(x, []) = false | isElementOf(x, y::rest) = if x = y then true else isElementOf(x, rest); Chương Trình 3.21: Hàm kiểm tra phần tử nằm danh sách Kết chạy ML: fun isElementOf(x, []) = false | isElementOf(x, y::rest) = if x = y then true else isElementOf(x, rest); val isElementOf = fn : ''a * ''a list -> bool isElementOf(5,[4,6,7,5,3,10]); val it = true : bool isElementOf(12,[4,6,7,5,3,10]); 73 val it = false : bool Để loại phần tử trùng danh sách ta sử dụng hàm thành viên xét thực đệ quy việc kiểm tra trùng: Code ML: fun makeNoRepeats([]) = [] | makeNoRepeats(x::rest) = if isElementOf(x,rest) then makeNoRepeats(rest) else x::makeNoRepeats(rest); Chương Trình 3.22: Hàm loại bỏ phần tử trùng danh sách Kết chạy ML: val makeNoRepeats = fn : ''a list -> ''a list makeNoRepeats([2,3,4,1,5,8,4,6,3]); val it = [2,1,5,8,4,6,3] : int list 3.5.2 Quan hệ: Ta biểu diễn quan hệ hai tập hợp cách liệt kê danh sách tất cặp phần tử quan hệ ML kiểm tra cặp có nằm quan hệ khơng: Code ML: fun isRelatedTo(a, b, []) = false | isRelatedTo(a, b, (h1, h2)::rest) = (a = h1 andalso b = h2) orelse isRelatedTo(a, b, rest); Chương Trình 3.23: Hàm kiểm tra cặp có nằm quan hệ Kết chạy ML: val isRelatedTo = fn : ''a * ''b * (''a * ''b) list > bool isRelatedTo(2,3,[(2,3),(3,5),(10,4),(5,6)]); val it = true : bool 74 isRelatedTo("Toan","Kiet",[("Toan","Liem"),("Toan","H ai"),("Toan","Kiet")]); val it = true : bool isRelatedTo(3,4,[(3,5),(5,7),(5,6),(8,7)]); val it = false : bool 3.5.3 Tính bắc cầu: Ta kiểm tra số tính chất quan hệ hai ngơi cho trƣớc Chẳng hạn, giả sử ta muốn kiểm tra tính bắc cầu quan hệ Theo định nghĩa: quan hệ R đƣợc gọi có tính bắc cầu, Với hai cặp (a, b) (b, c) thuộc R: ta có cặp (a, c) thuộc R Bây ta đƣa tốn, kiểm tra tính bắc cầu cặp (a, b) cho trƣớc Tức là, phần tử mà b có quan hệ R, a có quan hệ R với phần tử khơng? Có trƣờng hợp cần kiểm tra dựa danh sách định nghĩa cặp quan hệ Danh sách rỗng, đúng, danh sách đảm bảo tính bắc cầu cho cặp (a, b) Danh sách bắt đầu cặp (b, c) c Khi danh sách bắc cầu cặp (a, b), (a, c) có quan hệ R phần cịn lại danh sách bắc cầu (a, b) Danh sách bắt đầu cặp (d, c) d ≠ b Khi danh sách bắc cầu cặp (a, b), phần cịn lại danh sách bắc cầu (a, b) Cụ thể ta kiểm tra ML nhƣ sau: fun isTransitive(relation) = let fun testOnePair((a, b), []) = true | testOnePair((a, b), (c, d)::rest) = ((not (b = c)) orelse isRelatedTo(a, relation)) andalso testOnePair((a,b), rest); d, 75 fun test([]) = true | test((a,b)::rest) = testOnePair((a,b),relation)andalso test(rest); in test(relation) end; datatype Duong = VoChiCong | QL1A | HuynhTanPhat | NguyenVanLinh | NguyenThiThap | NguyenHuuTho; val DuongKhongCat = [(NguyenVanLinh,HuynhTanPhat), (NguyenVanLinh,QL1A),(HuynhTanPhat,NguyenVanLinh), (HuynhTanPhat,QL1A),(QL1A,NguyenVanLinh),(QL1A, HuynhTanPhat),(NguyenHuuTho,NguyenThiThap), (NguyenThiThap,NguyenHuuTho)]; Chương Trình 3.24: Hàm kiểm tra tính bắt cầu Kết kiểm tra tính bắc cầu ML: isTransitive(DuongKhongCat); val it = false : bool val DuongCat = [(VoChiCong,NguyenVanLinh), (VoChiCong,HuynhTanPhat),(VoChiCong,QL1A),(VoChiCong, NguyenHuuTho),(VoChiCong,NguyenThiThap),(NguyenVanLin h,NguyenHuuTho),(NguyenVanLinh,NguyenThiThap),(HuynhT anPhat,NguyenHuuTho),(HuynhTanPhat,NguyenThiThap),(QL 1A,NguyenHuuTho),(QL1A,NguyenThiThap)]; Kết kiểm tra tính bắc cầu ML: isTransitive(DuongCat); val it = true : bool 76 3.5.4 Tìm bao đóng bắc cầu: Bây ta điều chỉnh hàm isTransitive để thay trả True, False trả danh sách phản ví dụ Điều nói cho ta biết quan hệ khơng có tính bắc cầu nữa, lại khơng có tính bắc cầu Điều địi hỏi thay đổi sau testOnePair: Thay trả True, trả danh sách rỗng, nêu lên khơng có cặp mâu thuẫn với tính bắc cầu đƣợc tìm thấy Thay trả False, trả danh sách chứa cặp mong muốn tìm thấy kiểm tra tính bắc cầu, nhƣng thực tế khơng tìm thấy Thay tính giá trị logic and với giá trị testOnePair phần lại danh sách cặp thời, ta kết nối kết cặp thời với danh sách kêt testOnePair fun counterTransitive(relation) = let fun testOnePair((a, b), []) = [] | testOnePair((a, b), (c,d)::rest) = (if ((not (b=c)) orelse isRelatedTo(a, d, relation)) then [] else [(a, d)]) @ testOnePair((a,b), rest); fun test([]) = [] | test((a,b)::rest) = testOnePair((a,b), relation) @ test(rest) in test(relation) end; Chương Trình 3.25: Hàm tìm bao đóng bắt cầu Kết chạy ML: counterTransitive(DuongKhongCat); val it = 77 [(NguyenVanLinh,NguyenVanLinh),(NguyenVanLinh,NguyenV anLinh),(HuynhTanPhat,HuynhTanPhat),(HuynhTanPhat,Huy nhTanPhat),(QL1A,QL1A),(QL1A,QL1A),(NguyenHuuTho,Nguy enHuuTho),(NguyenThiThap,NguyenThiThap)] : (Duong * Duong) list counterTransitive(DuongCat); val it = [] : (Duong * Duong) list Ta ghép quan hệ với cặp làm cho khơng quan hệ bắc cầu để nhận đƣợc bao đóng bắc cầu quan hệ cho fun transitiveClosure(relation) = relation @ makeNoRepeats(counterTransitive(relation)); Chương Trình 3.26: Hàm ghép quan hệ với cặp không bắt cầu Hoặc kiểm tra tính bắc cầu trƣớc lấy bao đóng: fun transitiveClosure(relation) = if isTransitive(relation) then relation else transitiveClosure(makeNoRepeats(counterTransitive( relation)) @ relation); Chương Trình 3.27: Hàm kiểm tra tính bắt cầu trước lấy bao đóng Kết chạy ML: transitiveClosure(DuongKhongCat); val it = [(NguyenVanLinh,NguyenVanLinh),(HuynhTanPhat, HuynhTanPhat),(QL1A,QL1A),(NguyenHuuTho,NguyenHuuTho) ,(NguyenThiThap,NguyenThiThap),(NguyenVanLinh,HuynhTa nPhat),(NguyenVanLinh,QL1A),(HuynhTanPhat,NguyenVanLi nh),(HuynhTanPhat,QL1A),(QL1A,NguyenVanLinh),(QL1A,Hu ynhTanPhat),(NguyenHuuTho,NguyenThiThap), ] : (Duong * Duong) list 78 Tóm tắt chƣơng 3: Phân tích tính chất số tốn sử dụng ngơn ngữ lập trình ML để giải với nhiều kiểu liệu Khi giảng dạy số tốn rời rạc cho học sinh phổ thơng, chúng tơi nghĩ dùng lập trình hàm ML để đƣa chƣơng trình minh họa phƣơng pháp tốt, cách định nghĩa hàm phận đệ quy chặt chẽ (đây hàm tính tốn máy tính đƣợc) dễ dàng chuyển định nghĩa sang chƣơng trình ngơn ngữ lập trình hàm ML để minh họa Đồng thời cách tiếp cận trang bị cho học sinh tƣ tốn học chặt chẽ khả lập trình hàm sử dụng đệ quy Tuy nhiên việc tiếp cận kiến thức lập trình bƣớc đầu học sinh THPT nên hạn chế luận văn chƣa đƣa vào dạy dạng toán tổ hợp kết hợp với ML 79 Kết luận hƣớng phát triển Trong tất chƣơng luận văn giới thiệu ngôn ngữ lập trình hàm ML vận dụng ngơn ngữ lập trình ML vào giải suy luận số dạng tốn rời rạc phổ biến chƣơng trình phổ thơng Luận văn trình bày đƣợc khái niệm, cú pháp ngơn ngữ lập trình hàm ML Chứng minh tính đắn chƣơng trình Ứng dụng giải số tốn phổ thơng, chứng minh qui nạp đệ quy Một số thuật toán danh sách Tuy nhiên thời gian có hạn nên đề tài giải số dạng toán đƣợc giảng dạy trƣờng THPT Trong thời gian tới phát triển thêm toán nâng cao vận dụng giải ngôn ngữ lập trình hàm khác Phƣơng pháp nghiên cứu Nghiên cứu lý thuyết kết hợp với cài đặt thực nghiệm Ý nghĩa khoa học đề tài Hệ thống kiến thức Ngơn ngữ lập trình ML, số vấn đề tốn rời rạc, dùng ngơn ngữ ML giải suy luận số vấn đề toán rời rạc Tài liệu tham khảo [1] Trần Văn Dũng, (2012), Bài giảng Ngơn ngữ lập trình Trƣờng Đại học Giao thông vận tải [2] Trần Văn Dũng, Bài giảng Ngun lý ngơn ngữ lập trình Trƣờng Đại học Giao thông vận tải [3] Thomas VanDrunen Discrete Mathematics and Functional Programming.2006 [4] http://homepages.inf.ed.ac.uk/mfourman/teaching/mlCourse/notes/L09.pdf [5] https://en.wikipedia.org/wiki/Standard_ML [6] https://courses.cs.vt.edu/~cs3304/Spring02/lectures/lect04.pdf [7] http://wiki.science.ru.nl/tfpie/images/3/32/Alegre.pdf [8] http://www.cs.cmu.edu/~rwh/isml/book.pdf Hà Nội, ngày 20 tháng năm 2017 Giảng viên hƣớng dẫn Trƣởng Khoa CNTT TS Trần Văn Dũng TS Phạm Thanh Hà

Ngày đăng: 31/05/2023, 10:41

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

TÀI LIỆU LIÊN QUAN