Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 77 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
77
Dung lượng
628,49 KB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI NGÔ THỊ KIM ÁNH NGHIÊN CỨU CƠ SỞ TOÁN HỌC LẬP TRÌNH HÀM VÀ ỨNG DỤNG LUẬN VĂN THẠC SĨ TOÁN HỌC HÀ NỘI, 2015 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI NGÔ THỊ KIM ÁNH NGHIÊN CỨU CƠ SỞ TOÁN HỌC LẬP TRÌNH HÀM VÀ ỨNG DỤNG Chuyên ngành: Toán ứng dụng Mã số: 60 46 01 12 LUẬN VĂN THẠC SĨ TOÁN HỌC Người hướng dẫn khoa học: TS TRẦN VĂN DŨNG HÀ NỘI - 2015 LỜI CẢM ƠN Luận văn hoàn thành trường Đại học Sư phạm Hà Nội hướng dẫn thầy giáo TS Trần Văn Dũng Sự giúp đỡ hướng dẫn tận tình, nghiêm túc thầy suốt trình thực luận văn giúp trưởng thành nhiều cách tiếp cận số vấn đề Tôi xin bày tỏ lòng biết ơn, kính trọng sâu sắc thầy Tôi xin trân trọng cảm ơn Ban giám hiệu trường Đại học Sư phạm Hà Nội 2, phòng sau đại học thầy cô giáo nhà trường giúp đỡ, tạo điều kiện thuận lợi cho suốt trình học tập Tôi xin chân thành cảm ơn gia đình, bạn bè giúp đỡ động viên tạo điều kiện thuận lợi để hoàn thành khóa học Thạc sĩ hoàn thành luận văn Hà Nội, ngày 10 tháng 12 năm 2015 Tác giả Ngô Thị Kim Ánh LỜI CAM ĐOAN Tôi cam đoan công trình nghiên cứu riêng Các số liệu, kết nêu luận văn trung thực chưa công bố công trình khác Tác giả luận văn ký ghi rõ họ tên Ngô Thị Kim Ánh MỤC LỤC Trang phụ bìa Lời cảm ơn Lời cam đoan Mục lục MỞ ĐẦU .1 CHƯƠNG 1: TÍNH TOÁN LAMBDA 1.1 Giới thiệu chung tính toán Lambda .3 1.1.1 Lời giới thiệu .3 1.1.2 Định nghĩa 1.1.3 Những số hạng λ 1.1.4 Quy ước .5 1.1.5 Định nghĩa 1.1.6 Mệnh đề .6 1.1.7 Nhận xét .6 1.1.8 Định nghĩa Tổ hợp chuẩn 1.1.9 Định lí điểm bất động 1.2 Các điều kiện, Boolean số nguyên .8 1.2.1 Định nghĩa 1.2.2 Định nghĩa kết đôi 1.2.3 Định nghĩa 1.2.4 Bổ đề 1.2.5 Định nghĩa hàm λ-định nghĩa 1.2.6 Định nghĩa 1.2.7 Định nghĩa 1.2.8 Định nghĩa .10 1.2.9 Bổ đề 10 1.2.10 Bổ đề (xem [3,tr19]) 10 1.2.11 Bổ đề (xem [3,tr20]) 10 1.2.12 Bổ đề (xem [3,tr20]) 10 1.2.13 Định lí (xem [3,tr20]) 10 1.2.14 Định lí 11 1.3 Rút gọn tính toán biểu thức 11 1.3.1 Các phương pháp rút gọn 11 1.3.2 Định nghĩa .11 1.3.3 Định nghĩa .12 1.3.4 Ví dụ 12 1.3.5 Mệnh đề: M = ᵦ N ⇔ λ ˫M = N 13 1.3.6 Định nghĩa .13 1.3.7 Bổ đề 13 1.3.8 Định lí Church- Rosser 14 1.3.9 Hệ 14 1.4 Hệ thống kiểu 15 1.4.1 Giới thiệu 15 1.4.2 Kiểu tự tính toán Lambda 16 1.4.3 Các hệ thống λ→ -Curry 17 1.4.4 Hệ thống λ→ - Church 17 CHƯƠNG 2: NGUYÊN LÝ LẬP TRÌNH HÀM .20 2.1 Đặt vấn đề .20 2.2 Các nguyên lí chung .20 2.3 Giới thiệu ngôn ngữ lập trình ML 22 2.3.1 Mở đầu .22 2.3.2 Các kiểu – phép toán luận, số nguyên xâu 23 2.3.3 Danh sách (List) 25 2.3.4 Các kiểu hàm số biểu thức 27 2.3.5 Các hàm phủ định 27 2.3.6 Hàm số số chuẩn toán tử mở rộng 28 2.3.7 Chuỗi hàm chuẩn .29 2.3.8 Danh sách hàm chuẩn 30 2.4 Sự tương tự Lambda ML 31 2.5 Hàm bậc cao 34 2.5.1 Các giá trị hàm bậc cao 34 2.5.2 Phép liên kết phạm vi 34 2.5.3 Hàm quay 36 2.5.4 Dãy vô hạn .39 2.5.5 Ví dụ 40 CHƯƠNG 3: ỨNG DỤNG CỦA LẬP TRÌNH HÀM .42 3.1 Chứng minh chương trình .42 3.2 Một số chương trình đệ quy 44 3.2.1 Biện luận phương trình 44 3.2.2 Chứng minh tính chất hàm sử dụng phép quy nạp 45 3.2.3 Hàm tích số .47 3.2.4 Phép đệ quy số học .49 3.3 Một số chương trình danh sách .54 3.3.1 Phép quy nạp cho danh sách 54 3.3.2 Ghép nối danh sách 55 3.3.4 So sánh danh sách 56 3.3.5 Sắp xếp, chèn phân loại 57 3.4 Một số chương trình 62 3.4.1 Cây hữu hạn .62 3.4.2 Phép quy nạp cho Cây .62 3.4.3 Cây nhị phân 64 KẾT LUẬN .69 DANH MỤC TÀI LIỆU THAM KHẢO 70 MỞ ĐẦU Lí chọn đề tài Ngành công nghệ phần mềm chuyển sang kỉ lục Lập trình máy tính làm cho chương trình trở nên linh hoạt, tin cậy, dễ phát triển ứng dụng Trong logic học khoa học máy tính toán Lambda (Lambda calculus) hay viết tắt λ_ calculus, hệ thống hình thức sử dụng định nghĩa hàm số, ứng dụng hàm số đệ quy phần nghiên cứu tảng toán học Phép toán Lambda sau phát triển để trở thành công cụ quan trọng vấn đề nghiên cứu vấn đề lý thuyết tính toán lý thuyết đệ quy hình thành tảng lập trình hàm Lập trình hàm phong cách lập trình dựa định nghĩa hàm sử dụng phép toán Lambda (Lambda calculus) Lập trình hàm không sử dụng lệnh gán biến khác với lập trình mệnh lệnh ngôn ngữ lập trình hàm, hàm (thủ tục, chương trình con) đóng vai trò trung tâm, thay thực lệnh máy tính tính biểu thức Mục đích việc thiết kế ngôn ngữ lập trình hàm mô hàm toán học cách nhiều Trong ngôn ngữ lệnh, biểu thức đánh giá kết lưu trữ ô nhớ biểu diễn biến chương trình Ngược lại, ngôn ngữ lập trình hàm không sử dụng biến không cần lệnh gán Ðiều giải phóng người lập trình khỏi mối quan tâm ô nhớ máy tính thực hiên chương trình Không có biến cấu trúc lặp (vì cấu trúc lặp điều khiển biến) Các lệnh lặp lại xử lý giải pháp đệ quy Chương trình định nghĩa hàm áp dụng hàm Sự thực việc đánh giá áp dụng hàm Sự thực hàm cho kết ta cho đối số Nó cho thấy ngữ nghĩa ngôn ngữ lập trình hàm đơn giản ngữ nghĩa ngôn ngữ lập trình lệnh ngôn ngữ hàm bao gồm nét đặc biệt ngôn ngữ lệnh Đã có nhiều ngôn ngữ hàm phát triển ứng dụng như: Haskell, ML, Đó động lực để thân nghiên cứu đề tài “Nghiên cứu sở toán học lập trình hàm ứng dụng” 2 Mục đích nghiên cứu Cơ sở, nguyên lý lập trình hàm ứng dụng Nhiệm vụ nghiên cứu Tìm hiểu sở, nguyên lý lập trình hàm ứng dụng Đối tượng nghiên cứu Phép toán, tính toán Calculus, ngôn ngữ lập trình ML, ngôn ngữ lập trình hàm, khả ứng dụng Phương pháp nghiên cứu Thu thập, tìm hiểu phân tích tài liệu Dự kiến đóng góp Xây dựng số ứng dụng suy luận đẳng thức chương trình, hàm bậc cao NỘI DUNG Luận văn chia làm chương, lời mở đầu, lời kết thúc tài liệu tham khảo Chương luận văn nói tính toán Lambda: khái niệm cú pháp tính toán Lambda Chương luận văn nói nguyên lý ngôn ngữ lập trình hàm, lập trình ML: Thủ tục chương trình ngôn ngữ lập trình Chương luận văn nói ứng dụng ngôn ngữ lập trình hàm CHƯƠNG 1: TÍNH TOÁN LAMBDA 1.1 Giới thiệu chung tính toán Lambda 1.1.1 Lời giới thiệu Ứng dụng trừu tượng Hoạt động tính toán λ ứng dụng Biểu thức F.A hay FA rõ liệu F coi thuật toán áp dụng cho liệu A coi đầu vào Điều xem hai cách Thứ trình tính toán FA, thứ hai đầu trình Quan điểm xét đến khái niệm chuyển đổi chí tốt rút gọn; quan điểm thứ hai khái niệm mô hình (ngữ nghĩa) Lí thuyết kiểu viết tự do: cho phép để xem xét biểu thức FF có nghĩa F áp dụng cho Điều kích thích đệ quy Hoạt động khác trừu tượng Nếu M ≡ M[x] biểu thức chứa (phụ thuộc vào) x Sau x M[x] rõ hàm số x ↦ M[x] Sự ứng dụng trừu tượng làm việc công thức sau (λx ∗ x + 1)3 = ∗ + (= 7) Có nghĩa (λx ∗ x + 1)3 hàm số x ↦ ∗ x + đặt vào số cho ∗ + Nói chung, có (λx M[x])N = M[N] Phương trình cuối tốt viết (λx M)N = M[x ≔ N] (1) Ở [x ≔ N] biểu thị thay N cho x Điều đáng ý (1) tiên đề cần thiết tính toán λ, lí thuyết nhận quan tâm nhiều nhà khoa học Biến tự biến ràng buộc Sự trừu tượng cho ràng buộc biến tự x M Chúng ta nói λx.yx có nghĩa x biến ràng buộc y biến tự Sự thay [ ≔ ] thực nơi xuất tự x yx(λx x)[x ≔ N] ≡ yN(λx x) 56 rec DELETE V L = IF ISNIL L THEN NIL ELSE IF EQUAL V (HEAD L) THEN TAIL L ELSE (HEAD L)::(DELETE V (TAIL L)) 3.3.4 So sánh danh sách Hai danh sách chúng trống rỗng LIST_EQUAL [] [] = TRUE LIST_EQUAL [] (H::T) = FALSE LIST_EQUAL (H::T) [] = FALSE Nếu không, chúng giống phần tử đứng đầu phần đuôi LIST_EQUAL (H1::T1) (H2::T2) = LIST_EQUAL T1 T2 if H1 H2 LIST_EQUAL (H1::T1) (H2::T2) = FALSE if NOT ( H1 H2) Chú ý, toán tử so sánh phụ thuộc vào kiểu phần tử so sánh danh sách Ở so sánh danh sách số, ví dụ: LIST_EQUAL [1,2,3] [1,2,3] -> -> LIST_EQUAL [2,3] [2,3] -> -> LIST_EQUAL [3] [3] -> -> LIST_EQUAL [] [] -> -> TRUE Thuật toán 57 rec LIST_EQUAL L1 L2 = IF AND (ISNIL L1) (ISNIL L2) THEN TRUE ELSE IF OR (ISNIL L1) (ISNIL L2) THEN FALSE ELSE IF EQUAL (HEAD L1) (HEAD L2) THEN LIST_EQUAL (TAIL L1) (TAIL L2) ELSE FALSE Xét ví dụ: LIST_EQUAL [1,2,3] [1,2,4] -> -> { EQUAL (HEAD [1,2,3]) (HEAD [1,2,4])) -> -> EQUAL 1 -> -> TRUE} LIST_EQUAL (TAIL [1,2,3]) (TAIL [1,2,4]) -> -> LIST_EQUAL [2,3] [2,4] -> -> { EQUAL (HEAD [2,3]) (HEAD [2,4])) -> -> EQUAL 2 -> -> TRUE} LIST_EQUAL (TAIL [2,3]) (TAIL [2,4]) -> -> LIST_EQUAL [3] [4] -> -> { EQUAL (HEAD [3]) (HEAD [4])) -> -> EQUAL -> -> FALSE} FALSE 3.3.5 Sắp xếp, chèn phân loại Ứng dụng nhiều, hữu ích để giữ liệu Sắp xếp để dễ dàng truy cập liệu trình bày Ở xem xét danh sách liệu có thứ tự 58 Trước hết, danh sách rỗng xếp ORDERED [] = TRUE Hoặc có phần tử ORDERED [C] = TRUE Hoặc có phần đầu xếp kép nối với lệnh xếp phần đuôi ORDERED (C1::C2::L) = ( C1 C2) AND (ORDERED (CONS C2 L)) Ví dụ: [1,2,3] Sắp xếp đứng trước [2,3] xếp đứng trước [3] xếp phần tử Insert:Chèn Để chèn phần tử vào danh sách có thứ tự Danh sách rỗng danh sách có phần tử nhất: INSERT X [] = [X] Hoặc phần tử chèn vào trước phần tử đầu danh sách phần tử chèn vào đứng đầu danh sách phần đuôi: INSERT X (H::T) = X::H::T if X H Nếu không, danh sách phần tử đầu danh sách đứng đầu phần tử cuối danh sách phần tử chèn vào danh sách: INSERT X (H::T) = H::(INSERT X T) if NOT X H Chú ý điều ngầm mô tả tất phần tử danh sách loại với định nghĩa quan hệ thứ tự Ví dụ, danh sách xâu STRING LESS rec INSERT S [] = [S] or INSERT S (H::T) = IF STRING_LESS S H THEN S::H::T ELSE H::(INSERT H T) 59 Ví dụ: INSERT "cherry" ["apple","banana","date"] => => "apple"::(INSERT "cherry" ["banana","date"]) -> -> "apple"::"banana"::(INSERT "cherry" ["date"]) -> -> "apple"::"banana"::"cherry"::["date"] == ["apple","banana","cherry","date"] Sort: Sắp xếp Chèn hình thành sở xếp đơn giản Danh sách xếp: SORT [] = [] Sắp xếp danh sách phần tử nào, chèn đầu vào đuôi xếp: SORT (H::T) = INSERT H (SORT T) Đây định nghĩa chung kiểu đặc trưng Chúng ta xét xem danh sách xâu: rec SORT [] = [] or SORT (H::T) = INSERT H (SORT T) Ví dụ: SORT ["cat","bat","ass"] => => INSERT "cat" (SORT ["bat","ass"]) -> -> INSERT "cat" (SORT ["bat","ass"]) -> -> INSERT "cat" (INSERT "bat" (INSERT "ass" [])) -> -> INSERT "cat" (INSERT "bat" ["ass"]) -> -> ["ass","bat","cat"] Insertion Sort: Chèn xếp Dưới dây việc thực hiên xếp chèn ML insert(x,l) = match l with | nil→[x] | (y::ys) → if y < x then y::insert(x,ys) else x::y::ys; 60 isort l = match l with | nil →nil | (x::xs) →insert(x,isort xs); Nếu phân tích nhanh số liệu đầu vào đánh giá bước thực nguyên mẫu tự động tính toán đầu sau đây: insert: (int,L(int)) →L(int) (*,0) →5.0, (*,1) →12.0 Số lượng bước đánh giá chèn nhiều 12.0*n +5.0 Ở đây, n độ dài phần tử thứ đầu vào isort: L(int) →L(int) →3.0,1 →12.0,2 →12.0 Số lượng bước đánh giá isort nhiều 6.0*n^2 + 6.0*n+3.0 Ở đây, n chiều dài đầu vào Đối với chức có dòng nói kiểu ML thường lệ nêu dạng đối số kết Dưới loại ánh xạ mà tính cách phân tích hệ thống Lập đồ sau chuyển thành viết sử dụng ràng buộc Quick Sort: Sắp xếp nhanh Sắp xếp nhanh thực ML theo cách thông thường append(l,ys) = match l with | nil →ys | (x::xs) →x::append(xs,ys); split(p,l) = match l with | nil →(nil,nil) | (x::xs) →let (ls,rs) = split (p,xs) in If x > p then (ls,x::rs) else (x::ls,rs) qsort l = match l with | nil →nil | (x:xs) →let (ls,rs) = split (x,xs) in append (qsort ls,x:: (qsort rs)); Với số liệu đánh giá bước, phân tích tự động suy luận qsort sử dụng nhiều 12n2 + 14n + bước đánh giá, với n độ dài danh sách đầu vào Khi giới hạn tính toán cho thấy xếp nhanh thực tốt so với xếp chèn Lí có (mở rộng) append chỗ đệ quy qsort Dưới phiên đệ quy xếp nhanh mà không sử dụng phụ thêm: 61 q_aux(l,acc) = match l with | nil →acc | (x::xs) →let (ls,rs) = split (x,xs) in let acc' = x::q_aux(rs,acc) inq_aux(ls,acc'); qsort2 l = q_aux(l,[]); Các tính ràng buộc qsort2 8n2 + 18n + 7, với n độ dài danh sách đầu vào Nó cải thiện ràng buộc qsort phần bậc hai Khả giảm vị trí thứ hai đối số tương ứng trực tiếp chỗ append Tuy nhiên xếp chèn tốt có ràng buộc Merge Sort: Sắp xếp hợp Thực xếp hợp msplit l = match l with | nil →(nil,nil) | (xl::xs) →match xs with | nil →([xl],nil) | (x2::xs') →let(l1,l2) = msplit xs' in (x1::l1,x2::l2); merge (l1,l2) = match l1 with | nil →l2 | (x::xs) →match l2 with | nil →(x::xs) | (y::ys) →if x < y then x::merge (xs,y::ys) else y::merge (x::xs,ys); msort l = match l with | nil →nil | (xl::xs) →match xs with | nil → l | (x2::xs') →let (l1,l2) = msplit l in merge (msort l1, msort l2); Đánh giá ràng buộc cho msort 36.66n2−29.33n+3, n chiều dài danh sách đầu vào Hệ thống tính toán máy tính giới hạn đa thức Một chương trình máy tính, cài đặt theo thuật toán Những đánh giá đa thức bậc hai giải được, khả thi [5] 62 3.4 Một số chương trình Một cấu trúc liệu lồng bao gồm hệ thống nút Mỗi nút chứa mục liệu có nhánh để gồm nút Nút gọi gốc Một nút không nhánh gọi Thông thường, có số nhánh nút 3.4.1 Cây hữu hạn Cây hữu hạn có hữu hạn nút mà giá trị kiểu Ví dụ: Một tìm kiếm nhị phân Br Br Br Lf Br Lf Br Lf Lf 13 21 Lf Br Lf 25 Lf Điều kiện: Với đỉnh gồm giá trị x, giá trị bên trái nhỏ x, giá trị bên phải lớn x 3.4.2 Phép quy nạp cho Cây Cây xây dựng cách quy nạp, ta sử dụng chứng minh quy nạp để chứng minh số tính chất dùng cho tất Ở đây, ta xét nhị phân Để chứng minh tính chất ϕ cho tất t, đủ thấy trường hợp mà cho lá, Lf b, bước quy nạp rằng, cho t1 t2, sau cho tất có dạng Nd (t1, v, t2) Về mặt hình thức hơn, với ϕ ∀ ( ) (Trường hợp bản) 63 ^(∀ , , (ϕ( )^ ( )) → ϕ ( , , ) (Bước quy nạp) → ∀ ϕ( ) (Kết luận) Phương pháp có giá trị lập luận tương tự phương pháp quy nạp khác ta thấy Cho t, ta tạo chứng minh không quy nạp ϕ( ) thật cách bắt đầu với rỗng sau sử dụng bước cách quy nạp để cung cấp cho ta chứng minh ϕ cho lớn hơn, cuối ta đạt đến t Ta áp dụng phép quy nạp với thấy đắn việc thực cách hiệu ta hàm leaves, liệt kê giá trị leaves Dưới hai hàm khai báo fun leaves(Lf a)=[a] |leaves(Nd(l,_, r))=leaves l @ leaves r fun accl(Lf a, acc) = a:: acc |accl(Nd (l, _,r), acc) = accl(l, accl(r, acc)) Định nghĩa theo giản đồ chuẩn: có hai tham số, tree, làtham số tích lũy Phép đệ quy dựa cấu trúc tham số Điều cho thấy chứng minh, phép quy nạp tham số cây, số tính chất cho tất giá trị đếm Ta chứng minh, phép quy nạp t, mà ∀acc accl(t, acc) = leaves(t) @ acc Đây chứng trường hợp accl(Lf a,acc) =a:: acc =[a] @ acc = leaves(Lf a) @ acc Bước quy nạp accl(Nd (l,v,r),acc) = accl(l,accl(r, acc)) = accl(l, leaves r @ acc) = leaves l @ (leaves r @ aac) 64 = (leaves l @leaves r) @ acc = leaves (Nd (l, v,r)) @ acc Điều gây ấn tượng đại số truyền thống, điều quy định không quen thuộc Để chứng minh trường hợp sở, ta sử dụng phương trình trực tiếp từ định nghĩa accl, @ leaves Bước quy nạp sử dụng định nghĩa accl leaves, với luật kết hợp để đính vào 3.4.3 Cây nhị phân 3.4.3.1 Cây nhị phân Chúng ta xét đặc trưng nhị phân Một nút nhị phân có hai nhánh gọi bên trái bên phải Các rỗng kí hiệu EMPTY,là nhị phân Và bao gồm nút hai phụ nhị phân hai nhị phân Chúng ta xem mô hình nhị phân cách sử dụng danh sách xét đại diện cho EMPTY NIL def EMPTY = NIL def ISEMPTY = ISNIL nút danh sách mục có nhánh bên trái nhánh bên phải def NODE ITEM L R = [ITEM,L,R] Các hạng mục lựa chọn từ nút ITEM (NODE I L R) = I LEFT (NODE I L R) = L RIGHT (NODE I L R) = R Một kiểu liệu đệ quy dùng để trình bày giá trị datatype tree = Lf | Br of tree*int*tree; > datatype tree > Lf = Lf: tree > Br = fn: tree * int * tree -> tree Khi nhị phân xây dựng, tìm kiếm giá trị Nếu 65 rỗng tìm kiếm ý nghĩa TFIND V EMPTY = FALSE Nếu khác rỗng, giá trị tìm kiếm giá trị nút tìm kiếm thành công, giá trị tìm kiếm giá trị nút TFIND V (NODE NV L R) = TRUE if V NV Nếu giá trị nút, sau thử nhánh trái TFIND V (NODE NV L R) = TFIND V L if V NV Nếu không, thử nhánh bên phải TFIND V (NODE NV L R) = TFIND V R if NOT ( V NV) Ví dụ: Cho nhị phân số nguyên rec TFIND V EMPTY = " " or TFIND V [NV,L,R] = IF EQUAL V NV THEN TRUE ELSE IF LESS V NV THEN TFIND V L ELSE TFIND V R Cụ thể, TFIND [7, [4, [3,EMPTY,EMPTY], [5,EMPTY,EMPTY] ], [9,EMPTY,EMPTY] ] -> -> TFIND [4, [3,EMPTY,EMPTY], 66 [5,EMPTY,EMPTY] ] -> -> TFIND [5,EMPTY,EMPTY] -> -> TRUE 3.4.3.2 Cây tìm kiếm nhị phân: Phép chèn Phép đệ quy cấu trúc cây: - Các hàm dựng Lf Br dùng giản đồ fun insert(i, Lf)= Br(Lf,i,Lf) | insert(i, tr as Br(t1,j,t2)) = case Int.compare(i,j) of EQUAL=> tr | LESS=> Br(insert(i,t1),j,t2) | GREATER => Br(t1,j,insert(i,t2)) Cây tìm kiếm giữ tính chất sau thực phép chèn với insert Ví dụ: - val t1 = Br(Lf, 3, Br(Lf, 5, Lf)); - val t2 = insert(4, t1); > val t2 = Br(Lf, 3, Br(Br(Lf, 4, Lf), 5, Lf)): tree 3.4.3.3 Cây tìm kiếm nhị phân member tolist fun member(i, Lf)= false | member(i, Br(t1,j,t2)) = case Int.compare(i,j) of EQUAL=> true | LESS=> member(i,t1) | GREATER => member(i,t2) > val member = fn: int * tree -> bool Giải thuật duyệt 67 fun toList Lf= [] | toList(Br(t1,j,t2)) = toList t1 @ [j] @ toList t2; > val toList = fn: tree -> int list Chọn danh sách - toList(Br(Br(Lf,1,Lf), 3, Br(Br(Lf,4,Lf), 5, Lf))); > val it = [1, 3, 4, 5]: int list 3.4.3.4 Phép bỏ bớt tìm kiếm Bỏ phần tử cực tiểu cây: tree -> int * tree fun delMin(Br(Lf,i,t2)) = (i,t2) | delMin(Br(t1,i,t2)) = let val (m,t1’) = delMin t1 in (m, Br(t1’,i,t2)) end Bỏ phần tử cây: tree * int -> tree fun delete(Lf,_)= Lf | delete(Br(t1,i,t2),j) = case Int.compare(i,j) of LESS=> Br(t1,i,delete(t2,j)) | GREATER => Br(delete(t1,j),i,t2) | EQUAL=> (case (t1,t2) of (Lf,_) => t2 | (_,Lf) => t1 | _=> let val (m,t2’) = delMin t2 in Br(t1,m,t2’) end) 68 3.4.3.5 Cây tìm kiếm nhị phân ML Trong vấn đề này, muốn làm việc với tìm kiếm nhị phân chứa từ (tức là, strings) Các tìm kiếm xác định là: Datatype bintree = NOLEAF| LEAF of string| NODE of (string*bintree*bintree); Cấu trúc NOLEAF sử dụng NODE có con, nhỏ với hai từ: NODE ("bravo", LEAF ("alpha"), NOLEAF) Tóm tắt chương Trong lập trình hàm, chương trình viết ngôn ngữ lập trình Để biết chương trình thực hay xem chương trình có thỏa mãn đặc tả kiểm chứng không Trong ML chương trình với đặc tả, kiểu Đó cách chứng minh tính đắn chương trình Và sử dụng phép quy nạp để chứng minh tính chất hàm Trong chương ta lập trình hàm khác lập trình mệnh lệnh Việc lặp lập trình hàm dựa đệ quy Phép đệ quy số học, phép đệ quy thông qua định nghĩa xây dựng chương Chúng ta biết số chương trình danh sách xây dựng là: ghép nối danh sách, xóa khỏi dánh sách, so sánh hai danh sách xếp phân tử danh sách Thêm phần tử vào danh sách xếp danh sách Đôi liệu thể lồng sử dụng cấu trúc thuận lợi Trong chương giới thiệu số chương trình như: bỏ bớt phần tử cây, chèn thêm phần tử vào cây, tìm kiếm 69 KẾT LUẬN Qúa trình tìm hiểu “Nghiên cứu sở toán học lập trình hàm ứng dụng” Luận văn trình bày tính toán Lambda: khái niệm cú pháp tính toán Lambda Ngôn ngữ lập trình hàm, lập trình ML: Thủ tục chương trình ngôn ngữ lập trình Các ứng dụng ngôn ngữ lập trình hàm Các phép tính lambda ban đầu hình thành Church (1932; 1933) Như phần lý thuyết chung hàm logic, tảng cho toán học Hiện hệ thống gọi phép tính lambda Tính toán Lambda hệ thống hình thức sử dụng định nghĩa hàm số Các hệ thống phụ xử lí hàm trở thành mô hình thành công cho hàm tính Trong lập trình hàm, giá trị xuất hàm phụ thuộc vào tham số đầu vào hàm Người ta dự đoán hành vi chương trình, động lực cho phát triển lập trình hàm ML ngôn ngữ lập trình tổng quan với tập hợp hàm số mạnh mẽ ML ngôn ngữ lập trình dựa sở lý thuyết xác định rõ Xây dựng hàm bậc cao có kiểu giá trị kiểu hàm bậc Đặc biệt, hàm thông qua đối số trả kết hàm khác, hàm lưu trữ lấy từ cấu trúc liệu danh sách Hàm bậc cao đóng vai trò bật ML với loạt phép khai triển thú vị hàm bậc cao Chứng minh tính đắn chương trình Xây dựng số chương trình đơn giản Ứng dụng vào tìm ước chung lớn nhất, biện luận phương trình, chứng minh qui nạp đệ quy Một số thuật toán danh sách giới thiệu phát triển 70 DANH MỤ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] Greg Michaelson(1988), An introduction to functional programming through Lambda Calculus [3] Erik Barendsen, Henk Barendregt (1998),Introductionto Lambda Calculus [4] Henk Barendregt (1992), Lambda calculi with types [5] Jan Hoffmann (2012), “AnalyzingSortingAlgorithmsinResourceAware ML” [6] Michael R.Hansen (2004), “Introduction to SML” [7] Michael P Fourman(2010), “Reasoning about Programs” [8] Riccardo Pucella (2001), Notes on Programming Standard ML of New Jersey [9] Robert Harper(2011), Programming in Stadard ML [10] Stephen A Edwards (2010), “The Lambda Calculus” [...]... tương ứng với hai mô hình trong lập trình 20 CHƯƠNG 2: NGUYÊN LÝ LẬP TRÌNH HÀM 2.1 Đặt vấn đề Trong ngành khoa học máy tính, lập trình hàm là một mô hình lập trình xem việc tính toán là sự đánh giá các hàm toán học và tránh sử dụng trạng thái và các dữ liệu biến đổi Lập trình hàm nhấn mạnh việc ứng dụng hàm số, trái với phong cách lập trình mệnh lệnh, nhấn mạnh vào sự thay đổi trạng thái Lập trình hàm. .. xuất phát từ tính toán Lambda, một hệ thống hình thức được phát triển vào những năm 1930 để nghiên cứu để định nghĩa hàm số, ứng dụng của hàm số và đệ quy Nhiều ngôn ngữ lập trình hàm có thể được xem là những cách phát triển giải tích Lambda Trong thực tế, sự khác biệt giữa hàm số toán học và cách dùng từ "hàm" trong lập trình mệnh lệnh đó là các hàm mệnh lệnh có thể tạo ra hiệu ứng lề, làm thay đổi... gọn và sự biến đổi trên bộ giả số hạng Λ Tóm tắt chương 1 Trong khoa học máy tính toán Lambda (Lambda calculus) hay cũng được viết tắt là λ_ calculus, là một hệ thống hình thức sử dụng trong định nghĩa hàm số Nó chính là cơ sở toán học của lập trình hàm Thực ra ngôn ngữ Lambada cũng có thể được xem là một ngôn ngữ lập trình Trong chương 1 giới thiệu chung về tính toán Lambda, dạng biểu thức tính toán. .. bỏ hiệu ứng lề có thể làm cho chương trình dễ hiểu hơn rất nhiều và người ta có dự đoán được hành vi của một chương trình, đó chính là một trong các động lực chính cho sự phát triển của lập trình hàm 2.2 Các nguyên lí chung Lập trình hàm tạo ra những hàm nhận các giá trị vào thuộc một miền xác định để cho ra kết quả là các giá trị thuộc một miền khác, giống như một hàm toán học Các ngôn ngữ hàm thuần... và các lệnh lặp Tuy nhiên, các hàm không gây ra hiệu ứng phụ như hầu hết các ngôn ngữ mệnh lệnh gặp phải Các ngôn ngữ hàm thuần túy có tính nhất quán trong kết quả trả về của hàm, nghĩa là kết quả của một phép áp dụng hàm không phụ thuộc vào thời điểm được gọi mà chỉ phụ thuộc vào các tham đối được cung cấp khi gọi hàm như thế nào 21 Tính nhất quán khi hàm trả về kết quả làm cho một chương trình hàm. .. kiểu và người lập trình không cần phải mô tả trước (như trong các ngôn ngữ mệnh lệnh) Một hàm bậc cao nhận một hàm làm tham đối Các hàm bậc cao mang lại tính mềm dẻo đáng kể cho các ngôn ngữ hàm Phép rút gọn theo thứ tự áp dụng tính giá trị các tham đối của hàm trước tiên, sau đó mới tính đến bản thân hàm Phép rút gọn theo thứ tự chuẩn lại áp dụng hàm cho các tham đối không cần tính giá trị, và chỉ... mang một số tính chất của ngôn ngữ hàm, nhưng không có tính nhất quán khi hàm trả về kết quả 22 2.3 Giới thiệu ngôn ngữ lập trình ML 2.3.1 Mở đầu ML (ngôn ngữ Meta) là một ngôn ngữ lập trình tổng quan với một tập hợp con hàm số mạnh mẽ Nó được dùng chủ yếu như một công cụ thiết kế và thực hiện các tính toán dựa trên lý thuyết nghiên cứu và phát triển Nó cũng được sử dụng như một ngôn ngữ giảng dạy ML... hàm số được mô tả bởi các kiểu miền và vùng của nó: fn: -> Chú ý việc sử dụng - > để chỉ tên ánh xạ của một hàm số Các tuple thường được sử dụng để khởi tạo các hàm số uncurried với nhiều biến ràng buộc Trong SML các biểu thức thường dựa trên ứng dụng các kí hiệu tiền tố hàm số với các hàm số có trước các đối số Các ứng dụng. .. của một phép tính trước đó Vì vậy các hàm kiểu này thiếu tính trong suốt tham chiếu, có nghĩa là cùng một biểu thức ngôn ngữ lại có thể tạo ra nhiều giá trị khác nhau vào các thời điểm khác nhau tùy thuộc vào trạng thái của chương trình đang thực thi Ngược lại, trong lập trình hàm, giá trị xuất ra của một hàm chỉ phụ thuộc vào các tham số đầu vào của hàm, vì thế gọi hàm f hai lần với cùng giá trị tham... Lớp R của các hàm đệ quy là lớp nhỏ nhất của hàm số trên tập số nguyên, mà bao gồm tất cả các hàm ban đầu và đóng với phép hàm hợp, phép đệ quy nguyên thủy và phép lấy cực tiểu Vậy R là một lớp được định nghĩa đệ quy Chứng minh rằng tất cả hàm đệ quy là λ-định nghĩa được dựa vào quy nạp đối số tương ứng Kết quả ban đầu thuộc về Kleene(1936) 1.2.9 Bổ đề Hàm ban đầu là λ-định nghĩa được Chứng minh: Cho