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

Nghiên cứu cơ sở toán học lập trình hàm và ứng dụng

77 534 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 77
Dung lượng 628,49 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Trong logic học và 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ố, ứng dụng hàm số và đệ q

Trang 1

TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI 2

Trang 2

TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI 2

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

Trang 3

LỜI CẢM ƠN

Luận văn được hoàn thành tại trường Đại học Sư phạm Hà Nội 2 dưới sự hướng dẫn của thầy giáo TS Trần Văn Dũng Sự giúp đỡ và hướng dẫn tận tình, nghiêm túc của thầy trong suốt quá trình thực hiện luận văn đã giúp tôi trưởng thành hơn rất nhiều trong cách tiếp cận một số vấn đề mới Tôi xin bày tỏ lòng biết ơn, kính trọng sâu sắc nhất đối với 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 và các thầy cô giáo trong nhà trường đã giúp đỡ, tạo điều kiện thuận lợi cho tôi trong suốt quá trình học tập

Tôi xin chân thành cảm ơn gia đình, bạn bè đã luôn giúp đỡ động viên và tạo điều kiện thuận lợi để tôi hoàn thành khóa học Thạc sĩ cũng như hoàn thành luận văn này

Hà Nội, ngày 10 tháng 12 năm 2015

Tác giả

Ngô Thị Kim Ánh

Trang 4

LỜI CAM ĐOAN

Tôi cam đoan đây là công trình nghiên cứu của riêng tôi

Các số liệu, kết quả nêu trong luận văn là trung thực và chưa từng được ai công bố trong bất kỳ công trình nào khác

Tác giả luận văn ký và ghi rõ họ tên

Ngô Thị Kim Ánh

Trang 5

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 3

1.1 Giới thiệu chung về tính toán Lambda 3

1.1.1 Lời giới thiệu 3

1.1.2 Định nghĩa 4

1.1.3 Những số hạng λ 4

1.1.4 Quy ước 5

1.1.5 Định nghĩa 5

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 7

1.1.9 Định lí điểm bất động 7

1.2 Các điều kiện, Boolean và số nguyên 8

1.2.1 Định nghĩa 8

1.2.2 Định nghĩa sự kết đôi 8

1.2.3 Định nghĩa 8

1.2.4 Bổ đề 8

1.2.5 Định nghĩa hàm λ-định nghĩa được 9

1.2.6 Định nghĩa 9

1.2.7 Định nghĩa 9

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

Trang 6

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ệ quả 14

1.4 Hệ thống kiểu 15

1.4.1 Giới thiệu 15

1.4.2 Kiểu tự do trong 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 cơ bản – phép toán luận, số nguyên và xâu 23

2.3.3 Danh sách (List) 25

2.3.4 Các kiểu hàm số và biểu thức 27

2.3.5 Các hàm phủ định 27

2.3.6 Hàm số số chuẩn và toán tử mở rộng 28

2.3.7 Chuỗi hàm chuẩn 29

Trang 7

2.3.8 Danh sách các hàm chuẩn 30

2.4 Sự tương tự Lambda và 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 và phạm vi 34

2.5.3 Hàm quay về 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 của hàm sử dụng phép quy nạp 45

3.2.3 Hàm trên tích số 47

3.2.4 Phép đệ quy và số học 49

3.3 Một số chương trình trên 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 và phân loại 57

3.4 Một số chương trình trên cây 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

Trang 8

MỞ ĐẦU

1 Lí do chọn đề tài

Ngành công nghệ phần mềm chuyển sang một kỉ lục mới Lập trình trên 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 và 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ố, ứng dụng hàm số và đệ quy là một phần của nghiên cứu về nền 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 trong vấn đề nghiên cứu các vấn đề lý thuyết tính toán và lý thuyết đệ quy và hình thành nền tảng cơ bản của lập trình hàm

Lập trình hàm là phong cách lập trình dựa trên đị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 các lệnh gán biến và khác với lập trình mệnh lệnh trong các 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 vì thực hiện lệnh máy tính tính biểu thức Mục đích của việc thiết kế ngôn ngữ lập trình hàm là mô phỏng các hàm toán học một cách nhiều nhất có thể được Trong ngôn ngữ ra lệnh, một biểu thức được đánh giá và kết quả của nó được lưu trữ trong ô nhớ được biểu diễn bởi một biến trong chương trình Ngược lại, trong ngôn ngữ lập trình hàm không sử dụng biến và

do đó không cần lệnh gán Ðiều này giải phóng người lập trình khỏi mối quan tâm

về ô nhớ của máy tính trong khi thực hiên chương trình Không có biến cho nên không có cấu trúc lặp (vì cấu trúc lặp được điều khiển bởi biến) Các lệnh lặp lại sẽ được xử lý bằng giải pháp đệ quy Chương trình là các định nghĩa hàm và các áp dụng hàm Sự thực hiện là việc đánh giá các áp dụng hàm Sự thực hiện một hàm luôn cho cùng một kết quả khi ta cho nó cùng một đối số Nó cho thấy rằng ngữ nghĩa của ngôn ngữ lập trình hàm đơn giản hơn ngữ nghĩa của ngôn ngữ lập trình ra lệnh và ngôn ngữ hàm bao gồm cả những nét đặc biệt của ngôn ngữ ra lệnh Đã có nhiều ngôn ngữ hàm được phát triển và ứng dụng như: Haskell, ML, Đó là động

lực để bản thân tôi nghiên cứu đề tài “Nghiên cứu cơ sở toán học lập trình hàm

và ứng dụng”

Trang 9

2 Mục đích nghiên cứu

Cơ sở, nguyên lý lập trình hàm và ứng dụng

3 Nhiệm vụ nghiên cứu

Tìm hiểu cơ sở, nguyên lý lập trình hàm và ứng dụng

4 Đố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ả năng ứng dụng

5 Phương pháp nghiên cứu

Thu thập, tìm hiểu và phân tích các tài liệu

Trang 10

CHƯƠNG 1: TÍNH TOÁN LAMBDA 1.1 Giới thiệu chung về tính toán Lambda

1.1.1 Lời giới thiệu

Ứng dụng và trừu tượng

Hoạt động cơ bản nhất của tính toán λ là ứng dụng Biểu thức F.A hay FA chỉ rõ dữ liệu F coi như là thuật toán áp dụng cho dữ liệu A coi như là đầu vào Điều này được xem bằng hai cách Thứ nhất là quá trình tính toán FA, thứ hai là đầu ra của quá trình Quan điểm đầu tiên được xét đến bởi các khái niệm của chuyển đổi và thậm chí là tốt hơn nữa là sự rút gọn; quan điểm thứ hai là khái niệm

Có nghĩa là (λx 2 ∗ x + 1)3 chỉ ra hàm số x ↦ 2 ∗ x + 1 đặt vào số 3 cho

2 ∗ 3 + 1 là 7 Nói chung, chúng ta có (λx M[x])N = M[N] Phương trình cuối cùng này tốt nhất được viết là

(λx M)N = M[x ≔ N] (1)

Ở đó [x ≔ N] biểu thị thay thế của N cho x Điều đáng chú ý là mặc dù (1) là tiên

đề cần thiết duy nhất của tính toán λ, lí thuyết nhận được sự quan tâm của nhiều nhà khoa học

Biến tự do và biến ràng buộc

Sự trừu tượng được cho là ràng buộc biến tự do x trong M Chúng ta nói rằng λx.yx có nghĩa là x là biến ràng buộc và y là biến tự do Sự thay thế

[ ≔ ] chỉ được thực hiện tại các nơi xuất hiện tự do của x

yx(λx x)[x ≔ N] ≡ yN(λx x)

Trang 11

Trong giải tích có một sự ràng buộc biến tương tự Trong ∫ f(x, y)dx biến x

là bị ràng buộc và y là biến tự do

Nó không có nghĩa khi thế 7 cho x: ∫ f(7, y)d7 ; Nhưng sự thay thế y là có nghĩa ∫ f(x, 7)dx

Vì lí do đó mà luôn được thừa nhận rằng những biến ràng buộc mà xuất hiện trong một biểu thức nào đó thì khác với biến tự do Điều này có thể được thực hiện bằng cách đặt lại tên biến biến ràng buộc Thí dụ λx x trở thành λy y Thật vậy, những biểu thức này thực hiện vai trò như nhau:

(λx x)a = a = (λy y)a

Và trên thực tế là nó chỉ rõ cùng một thuật toán Vì vậy những biểu thức mà khác nhau chỉ ở cái tên của biến ràng buộc thì coi như là một

λv λv᾽(v᾽v) v῎ v ;

Trang 12

1.1.4 Quy ước

i) x, y, z… ký hiệu những biến tùy ý; M, N, L…ký hiệu những số hạng λ tùy

ý Các dấu ngoặc đơn phía ngoài cùng không được viết

ii) M ≡ N có nghĩa là M và N là cùng số hạng hay có thể thu được từ nhau bằng cách đổi tên những biến ràng buộc Thí dụ:

Một biến trong M là ràng buộc nếu nó không tự do Chú ý rằng một biến bị ràng buộc nếu nó xảy ra dưới phạm vi của một số hạng λ

Trang 13

ii) M là một số hạng đóng (hay một tổ hợp) nếu FV(M) = ∅ Tập hợp các số hạng đóng kí hiệu Ʌ˚

iii) Kết quả của việc thay thế N cho mọi sự xuất hiện tự do của biến x trong

M kí hiệu M[x: = N] được định nghĩa như sau

Trang 14

Chúng ta thích một cách viết khác của lí thể hiện này mà trong đó sự định danh được thực hiện ở mức cú pháp Sự định danh này được thực hiện trong đầu của chúng ta và không có trên giấy Để triển khai thành tính toán máy phải đối phó với điều này, nên được gọi là chuyển đổi (2) Một cách tốt để làm điều này được cung cấp bởi kí hiệu tên tự do của Bruijn(1984)

Nhờ đó ta có thể giải được những phương trình đơn giản

Ví dụ: ∃G ∀X GX = XXX tồn tại G ∈ Ʌ sao cho với mọi X ∈ Ʌ có ˫ GX = XX) Thật vậy, cho G ≡ λx xxx và ta đã thực hiện xong

Phương trình đệ quy cần đến một phương pháp kĩ thuật đặc biệt Kết quả dưới đây cung cấp một cách để trình bày sự đệ quy trong tính toán λ

Trang 15

ii) ∃G ∀X GX = GG cho G ≡ (λgx gg)

1.2 Các điều kiện, Boolean và số nguyên

1.2.1 Định nghĩa

i) true ≡ , false ≡ ∗

ii) Nếu B được coi là một Boolean, có nghĩa là một số hạng, mà không là

hằng đúng cũng không là hằng sai Vậy if B then P else Q

có thể biểu diễn bởi: BPQ

Phần tử liền sau, phần tử liền trước, tiêu chuẩn cho số 0

Tồn tại tập hợp , , và sô không sao cho

˹n˺ = ˹n + 1˺

˹n + 1˺ = ˹n˺

Trang 16

sô không˹0˺ = true

sô không˹n + 1˺ = false

Chứng minh:

≡ λx[false, x],

≡ λx x false,

sô không ≡ λx x true

1.2.5 Định nghĩa hàm -định nghĩa được

i) Một hàm số là một ánh xạ φ: N → N

với số p nào đó Trong trường hợp này φ được gọi là p-

ii) Một hàm số p_ary φ được gọi là λ-định nghĩa được, nếu đối với một tổ hợp F nào đó

1.2.7 Định nghĩa

Cho A là một lớp các hàm số trên tập số nguyên

i) A là đóng với phép hợp hàm, nếu với mọi φ định nghĩa bởi

φ(n) = χ ψ (n), … , ψ (n) Với χ, ψ , ψ ∈ A, ta có φ ∈ A

ii) A là đóng với phép đệ quy nguyên thủy nếu với mọi φ định nghĩa

φ(0, n) = χ(n),

Trang 17

φ(k + 1, n) = ψ(φ(k, n), k, n) Với χ, ψ ∈A ta có φ ∈A

iii) A là đóng với phép lấy cực tiểu nếu với mọi φ định nghĩa bởi

φ(n) = μm[χ(n, m) = 0]

với χ ∈A sao cho ∀n ∃m χ(n, m) = 0, ta có φ ∈ A

1.2.8 Định nghĩa

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

Phần đảo cũng thỏa mãn Vậy với hàm số trên tập số nguyên ta có φ là hàm

đệ quy khi và chỉ khi φ là λ-định nghĩa được Hơn nữa đối với hàm bộ phận thì có

Trang 18

khái niệm của λ-định nghĩa được cũng tồn tại Nếu φ là hàm số bộ phận trên tập số

nguyên, khi đó ta có (xem [3,tr20])

ψlà hàm đệ quy bộ phận ⇔ ψ là λ-định nghĩa được

1.2.14 Định lí

Đối với chữ số Church tất cả hàm đệ quy là λ-định nghĩa được

Chứng minh: Định nghĩa S ≡ λxyz y(xyz),

hằng số với arity trong tập số N và các biến, sử dụng ứng dụng

Có một tính chất đối xứng đã biết trong công thức (1) cơ bản Biểu thức

Trang 19

(iii) Một mối quan hệ rút gọn trên Λ là một mối quan hệ tương thích, phản thân và bắc cầu

→ 5 c) (λx.+ x x) 4 → (+ 4 4)

→ 8

Trang 20

Ví dụ: (λx xx)y không phải là một β-nf, nhưng có như β-nf số hạng yy

Một tính chất trực tiếp của β-nf như sau

1.3.7 Bổ đề

Giả sử M là một β-nf Vậy M ↠ ᵦ N ⇒ N ≡ M

Trang 21

Chứng minh: Điều này đúng nếu ↠ ᵦ được thay thế bởi → ᵦ Vậy kết quả dưới đây là tính chất bắc cầu

Trang 22

sánh các biểu thức với nhau Một biểu thức Lambda không thể có hai dạng chuẩn tắc [10]

1.4 Hệ thống kiểu

1.4.1 Giới thiệu

Các phép tính Lambda ban đầu được hình thành bởi Church (1932; 1933) như

là một phần của một lý thuyết chung về hàm và logic, dự định như là một nền tảng cho toán học Mặc dù hệ thống hóa đầy đủ ra là không phù hợp, như trong Kleen và Rosser (1936), các hệ thống phụ xử lí các hàm chỉ trở thành một mô hình thành công cho các hàm có thể tính được Hiện nay hệ thống này được gọi là các phép tính lambda Sách

về chủ đề này ví dụ là Church (1941), Curry và FEYS (1988), Curry(1972), Barendregt (1984), Hindley và Seldin (1986) và Krivine (1990)

Cho đến nay tính toán Lambda thường được xem như dạng lí thuyết đại số tự

do Thật vậy, vì mỗi biểu thức (xét như hàm số) có thể được đưa vào mỗi biểu thức khác nhau (xét như đối số) Chẳng hạn như hàm đồng nhất thức…có thể được đưa vào bất kì đối số x nào đó để cho ra kết quả cùng với x

Có nhiều dạng trong tính toán Lambda Các dạng này được giới thiệu một cách chủ yếu trong Curry(1934) (gọi là logic tổng hợp, sự biến thể khác nhau của tính toán Lambda) và trong Church (1940) Các dạng này thường xuyên là vật thể của cú pháp tự nhiên và có thể được giao cho số hạng Lambda Các kiểu này thường các đối tượng có tính chất cú pháp và có thể được gán cho các số hạng lambda Nếu

M là một số hạng và, một kiểu A được gán cho M, vì vậy ta nói 'M có kiểu A' hoặc 'M thuộc A'; các kí hiệu sử dụng cho điều này là M: A Ví dụ trong hầu hết các hệ thống với một kiểu kiểu có I: A → A, có nghĩa là, các phép đồng nhất I có thể nhận được như kiểu A → A Điều này có nghĩa rằng nếu x là một đối số của I của kiểu A, thì cũng là giá trị I của kiểu A Nói chung A → B là kiểu của hàm từ A đến B

Hai tờ gốc của Curry và Church giới thiệu các kiểu phiên bản của tính toán Lambda đưa đến hai cách khác nhau của hệ thống Trong tính toán Lambda Curry các số hạng là của các lý thuyết kiểu-tự do Trong các hệ thống Church các số hạng

là phiên bản chú thích của các số hạng kiểu-tự do Mỗi số hạng có một kiểu mà

Trang 23

thường là duy nhất (lên đến một quan hệ tương đương) và có thể được suy ra từ cách các số hạng được chú thích Curry và Church gần như là tính toán Lambda tương ứng với hai mô hình trong lập trình Một số tác giả xác định các hệ thống Curry là "tính toán Lambda với phép gán kiểu" và các hệ thống Church là "hệ thống

các kiểu tính toán Lambda"

Trong phần này hệ thống λ→ của tính toán Lambda đơn giản sẽ được giới thiệu Sự chú ý được tập trung vào sự khác biệt giữa kiểu là Curry và là Church bằng cách giới thiệu λ→ trong cả hai cách Một số hệ thống khác của tính toán

Lambda tồn tại cả trong phiên bản một Curry và một Church [4]

1.4.2 Kiểu tự do trong tính toán Lambda

Sự ra đời của các kiểu tự do trong tính toán Lambda là cần thiết để xác định

hệ thống của Curry phép gán kiểu trên đầu trang của nó Hơn nữa, mặc dù kiểu dáng Church gõ các phép tính Lambda có thể được giới thiệu trực tiếp, nó vẫn hữu ích để có một số kiến thức về các kiểu tự do trong tính toán Lambda

Trong mục này, các kiểu tự do trong tính toán Lambda sẽ được gọi là 'λ calculus' hoặc λ đơn giản Bắt đầu với một mô tả chính thức

Hoạt động cơ bản khác là sự trừu tượng Nếu M ≡ M[x] là một biểu thức chứa (phụ thuộc vào) x, thì λx M[x] định nghĩa bản đồ trực quan tức là x một phép gán x ↦ M[x] Các biến x không cần phải thực sự xảy ra trong M Trong trường hợp đó λx M[x] là hàm liên tục với giá trị M

Trang 24

1.4.3 Các hệ thống λ→ -Curry

Ban đầu các kiểu mẫu ngầm đã được giới thiệu trong Curry (1934) cho lí thuyết combinators Trong Curry và FEYS (1985), Curry (1972) lý thuyết đã được sửa đổi một cách tự nhiên để các phép gán các phần tử tính toán Lambda trong một tập hợp T cho các số hạng Lambda tự do Vì lý do này, những phép tính Curry đôi khi được gọi là hệ thống kiểu gán Nếu loại σ ∈ T được gán cho số hạng M ∈ Λ ta viết ˫ M: σ, thường với một dạng dưới ˫ để biểu thị các hệ thống cụ thể Thông thường, một tập hợp các giả thuyết Γ là cần thiết để đưa ra một kiểu gán và ta viết

Γ ˫ M: σ (phát âm này là 'Γ sinh ra M trong σ') Một hệ thống phép gán Curry riêng biệt phụ thuộc vào hai tham số, tập hợp T và các quy tắc của kiểu gán Ví dụ bây

giờ chúng tôi giới thiệu hệ thống λ→- Curry

Định nghĩa 1

Tập hợp các loại λ→, ký hiệu (λ→), được định nghĩa một cách quy nạp như sau Chúng ta viết T=kiểu (λ→)

α, α , … ∈ T(kiểu biến)

σ, τ ∈ T ⇒ (σ → τ) ∈ T (kiểu hàm không gian)

Những định nghĩa như vậy sẽ xảy ra thường xuyên hơn và thuận tiện để sử dụng các cú pháp trừu tượng sau để tạo thành T:

Trang 25

˫ (λx x): (σ → σ), Nhưng mặt khác

˫ (λx: σ x): (σ → σ)

Đó là, số hạng λx x được chú thích trong hệ thống Church bằng (:σ) Ý nghĩa trực giác là λx: σ x lấy các đối số x từ các loại (tập hợp) σ Điều này rõ ràng đề cập đến các loại trong một số hạng làm cho nó có thể để quyết định xem một số hạng có một loại nhất định hay không Đối với một số hệ thống Curry câu hỏi này là không thể quyết định được

Định nghĩa 1 Gọi T là một tập hợp các loại Tập hợp của T-chú thích λ – số hạng

(cũng gọi là số hạng giả), ký hiệu Λ , được định nghĩa như sau:

Λ = V|Λ Λ | : TΛ

V ở đây biểu thị tập hợp các biến số hạng

Các quy ước cú pháp tương tự cho Λ được sử dụng như cho Λ Ví dụ như

λx : σ … x σ M ≡ (λx : σ (λx : σ … (x σ (M))))

Số hạng này có thể được viết tắt là

λx⃗: σ⃗ M Một vài hệ thống kiểu tính toán Lambda Church bao gồm một sự lựa chọn của tập các kiểu T và các phép gán của các loại σ ∈ T với các số hạng M ∈ Λ Tuy nhiên, đây không phải là trường hợp trong tất cả các hệ thống Church Trong các hệ thống với cái gọi là (số hạng) loại phụ thuộc vào các tập hợp và loại được xác định cùng một lúc Dù sao, đối với λ→ - Church định nghĩa riêng biệt của các loại và các

số hạng là có thể và ta có một sự lựa chọn như các loại cùng một tập hợp T = kiểu (λ→) với λ→ - Curry

Định nghĩa 2

Các loại lambda calculus λ→ - Church được định nghĩa như sau

1 Các tập các loại T= kiểu (λ→) được xác định bởi T=V|T→T

2 Một tuyên bố có dạng M: σ với M ∈ Λ và σ ∈ T

3 Một cơ sở lại là một tập hợp các báo cáo với các biến chỉ rõ khi đối tượng

Trang 26

Ví dụ: Trong λ→ - Church người ta viết

tính lambda tương ứng với hai mô hình trong lập trình

Trang 27

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 giá trị 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 số x sẽ cho ra cùng kết quả f(x) Việc loại 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 túy không có các yếu tố mệnh lệnh như phép gá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

Trang 28

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 dễ đọc,

dễ thay đổi, dễ mô phỏng song song và dễ chứng minh tính đúng đắn

Những khái niệm quan trọng nhất trong các ngôn ngữ hàm là các hàm đệ quy, danh sách, tính đa kiểu, các hàm bậc cao, tham đối hoá từng phần và so khớp các phương trình

Các ngôn ngữ hàm sử dụng phép đệ quy để thay cho phép lặp

Danh sách là cấu trúc dữ liệu chính của các ngôn ngữ hàm Nhiều phép toán trên danh sách là tiền định

Việc quản lý bộ nhớ cho các cấu trúc dữ liệu được tiến hành tự động Người lập trình không cần quan tâm đến sự có mặt của các địa chỉ máy và không xử lý dữ liệu kiểu con trỏ Việc giải tỏa bộ nhớ không còn cần dùng đến nữa cũng được tiến hành tự động theo kỹ thuật dọn rác

Các ngôn ngữ hàm hiện đại cho phép xử lý các hàm đa kiểu, mỗi hàm có thể nhận nhiều tham đối có kiểu khác nhau Một số ngôn ngữ hàm sử dụng phép định kiểu ngặt, nhưng các kiểu luôn được suy đoán bởi bộ kiểm soát 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ỉ tính giá trị các tham đối khi thực sự cần thiết

Phép rút gọn theo thứ tự chuẩn căn cứ trên kỹ thuật tính giá trị hàm theo kiểu khôn ngoan, cho phép xử lý các cấu trúc dữ liệu vô hạn nếu có thể Kỹ thuật này tỏ

ra thân thiện hơn so với kỹ thuật tính giá trị có lợi, nhưng khó vận hành có hiệu quả

Các ngôn ngữ hàm hiện đại mô tả các hàm như một tập hợp các phương trình và

sử dụng kỹ thuật so khớp để lựa chọn các phương trình thỏa mãn một mẫu đã cho

Các ngôn ngữ hàm không thuần túy như Lisp 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ả

Trang 29

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 được biên soạn với kiểu kiểm tra thời gian dịch Các chức năng gọi được tính theo các cấp ứng dụng

ML được tạo ra giữa những năm 1970 như một ngôn ngữ để xây dựng các bằng chứng trong Robin Milnerr’s LCF (Lô-gic cho chức năng tính toán) máy tính

hỗ trợ hệ thống hình thức lập luận SML (ML tiêu chuẩn) được phát triển trong những năm đầu của những năm 1980 từ ML với phần mở rộng từ ngôn ngữ chức năng Hope SML là một trong những ngôn ngữ lập trình đầu tiên dựa trên cơ sở lý thuyết được xác định rõ

Kí hiệu - > được dùng trong SML để đại diện cho các kiểu hàm số, hệ thống ứng dựng SML và chỉ ra kết quả của việc tính một biểu thức như:

- <biểu thức >

><kết quả >

Những kiểu quan trọng thường dùng SML Mỗi đối tượng được gõ Không giống Pascal, các kiểu không cần được làm rõ từ đầu, nhưng nó phải được suy luận một cách không thay đổi từ một chương trình

SML cung cấp vài kiểu chuẩn, ví dụ cho các phép toán luận, số nguyên, chuỗi, danh sách và các kiểu mà chúng ta nhìn thấy dưới đây

Khi trình bày các đối tượng, SML luôn hiển thị các kiểu đi cùng các giá trị:

Trang 30

2.3.2 Các kiểu cơ bản – phép toán luận, số nguyên và xâu

2.3.2.1 Unit

Kiểu biểu thức với một kiểu cơ bản là định danh của kiểu

Đơn vị kiểu chỉ có một phần tử, được viết như ngoặc rỗng:

():unit

Giống void trong C, unit được sử dụng như kiểu kết quả cho hàm mà được thực hiện chỉ vì các tác động phụ Kiểu unit cũng được sử dụng như kiểu của đối số cho hàm số mà không có đối số Những lập trình viên C có thể sẽ bị lẫn bởi sự việc unit cho là có một phần tử, trong khi đó void có vẻ như không có phần tử nào Từ góc độ toán học, ‘một phần tử’ là đúng đắn Cụ thể, nếu hàm được giả thiết trả về phần tử kiểu rỗng, thì hàm đó không thể trả về, vì tập rỗng (hoặc kiểu rỗng) không

có phần tử nào Mặt khác, hàm mà trả về một phần tử của kiểu một phần tử, có thể trả về Tuy nhiên chúng ta không cần theo dõi hàm như vậy trả về giá trị nào, vì chỉ

có một thứ mà nó có thể trả về Hệ thống kiểu ML dựa trên nhiều năm nghiên cứu kiểu; hầu hết các khái niệm kiểu trong ML đã được xem xét rất cẩn thận

Trang 31

Chú ý việc sử dụng ˜ là dấu âm

Nhiều biểu thức nguyên được theo cách thông thường, với hằng số số và các phép toán số học chuẩn:

0,1,2,….-1,-2,…int

+,-,*,div:int*int→int

Phép toán div là phép toán nhị phân trung tố, được sử dụng như sau:

-fun quotien(x,y)=x div y;

val quotien = fn:int*int→int

Bản thân định danh div không phải là biểu thức Tương tự, +, -, * cũng là các phép toán nhị phân trung tố

Trang 32

Kiểu xâu có định danh: string

Giá trị xâu là xâu các kí tự trong ML

Cách khác chọn các thành phần của bộ và bản ghi là so sánh mẫu mà được

mô tả trong mục sau

2.3.3 Danh sách (List)

Danh sách của ML có độ dài tùy ý, nhưng mọi phần tử của danh sách phải có cùng kiểu Chúng ta có thể viết danh sách bằng cách liệt kê các phần tử của nó, tách nhau bởi dấu phảy, bên trong ngoặc vuông

Trong SML một danh sách phải bao gồm các phần tử cùng loại và kết thúc với danh sách trống

Danh sách được viết là chuỗi các phần tử riêng biệt bên trong [ ] Ví dụ [1,4,9,16,25]

[ “ant”, “beetle”, “caterpillar”, “dragonfly”, “earwig”]

Có một danh sách rỗng ngụ ý ở cuối danh sách: [ ] là danh sách rỗng Danh

sách rỗng được viết là nil trong ML

Trang 33

Kiểu biểu thức cho một danh sách phụ thuộc vào các loại phần tử

<loại phần tử> danh sách

Ví dụ đầu tiên ở trên:

-[1,4,9,16,25];

>[1,4,9,16,25]: danh sách số

là một danh sách các số nguyên Ví dụ thứ 2 ở trên:

-[ “ant”, “beetle”, “caterpillar”, “dragonfly”, “earwig”];

>[ “ant”, “beetle”, “caterpillar”, “dragonfly”, “earwig”]: danh sách xâu

là một danh sách các xâu

Các danh sách có thể được lồng vào nhau, ví dụ:

-[ [1,1], [2,8], [3,27], [4,64], [5,125]];

>[ [1,1], [2,8], [3,27], [4,64], [5,125]]: danh sách của danh sách số

là một danh sách của danh sách số nguyên

Chú ý rằng việc sử dụng (và) để cấu tạo các kiểu biểu thức

Sau đây là một số ví dụ danh sách các kiểu khác nhau:

Đối với danh sách ngắn, chương trình dịch in ra các phần tử của danh sách khi chỉ ra rằng biểu thức danh sách đã được tính toán Đối với danh sách dài, các phần tử cuối được thay thế bởi ba dấu chấm Như ví dụ danh sách cuối ở trên chỉ ra

Trang 34

2.3.4 Các kiểu hàm số và biểu thức

Một hàm số sử dụng các giá trị là một miền đối (số) để tạo ra giá trị cuối cùng trong một vùng kết quả Trong SML, kiểu của một hàm số được mô tả bởi các kiểu miền và vùng của nó:

fn: <kiểu miền xác định> -> <kiểu miền giá trị>

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ố

<biểu thức hàm số><biểu thức đối số>

Phủ định được viết là not, hội là andalso và tuyển là orelse

Chẳng hạn, sau đây là hàm mà xác định xem hai biến bool của nó có cùng giá trị bool không, tiếp theo là biểu thức mà gọi hàm đó

-fun equiv(x,y)=(x andalso y)orelse((not x) andalso(not y));

val equiv=fn:bool ' bool->bool

-equiv(true,false);

val it=false:bool

Trang 35

Ta nói các biến bool x và y có cùng giá trị bool, tức là chúng cùng true hoặc cùng false Biểu thức con thứ nhất (x andalso y) là true nếu cả hai x và y cùng true

và biểu thức con thứ hai ((not x) andalso là true nếu cả hai cùng false

Nguyên nhân tên dài andalso và orelse là để nhấn mạnh thứ tự tính toán Trong biểu thức (a andalso b) trong đó a và b là hai biểu thức; a được tính trước, nếu a là true, thì b được tính tiếp Ngược lại giá của biểu thức (a andalso b) là false

mà không cần tính b Tương tự, b trong (a orelse b) chỉ được tính chỉ trong trường hợp a là false

Sự kết hợp và sự phân ly được cung cấp thông qua các toán tử trung tố theo sau:

Andalso orelse

Được suy ra trong cú pháp, ví dụ:

-true orelse false;

fn: (bool* bool) -> bool

vì vậy chúng đều có 2 đối số boolean, được xử lí như một:

Trang 36

Các hệ thống SML có thể không biểu diễn các loại của nó bởi vì chúng bị quá tải Tài liệu SML sử dụng các loại phát minh kiểu:

num

để chỉ cả số nguyên và số thực vì vậy các loại toán tử này có thể là:

fn: (num *num) -> num

vì chúng có hai đối số, với một cú pháp trung tố cho một tuple, và trả về một kết quả số

Chú ý rằng với mỗi toán tử tất cả đối số phải cùng kiểu

Toán tử trung tố:

div

là cho phép chia số nguyên Ta có thể sử dụng op để chuyển nó sang hình thức tiền

tố để biểu diễn loại của nó:

-op div;

> fn: (int * int) -> int

Các biểu thức số học được xây dựng từ các toán tử này với dấu ngoặc (and), ví dụ: -6*7 div (7-4)+ 28;

again với loại có hiệu quả fn: num -> num

khi nó bị quá tải để dùng với số nguyên và số thực

2.3.7 Chuỗi hàm chuẩn

String

Các xâu được viết như dãy các ký hiệu được bao quanh dấu ngoặc kép:

"William Jefferson Clinton": string

"Boris Yeltsin": string

Trang 37

Nối xâu được viết dạng ^, như vậy ta có

móc nối 2 chuỗi lại với nhau:

Vì vậy, ta có thể tham khảo danh sách các đối tượng gõ tùy ý như là loại đã có:´a list

Trong SML danh sách được truy cập bởi các toán tử đầu và đuôi: hd tl

Toán tử đầu trả về đối tượng đứng đầu với kiểu: ´a

từ một danh sách được gõ tùy ý Vì vậy, hd sẽ là kiểu:

Trang 38

-tl [“alpha”, “beta”, “gamma”, “delta”, “epsilon”];

> [“alpha”, “beta”, “gamma”, “delta”, “epsilon”]: string list

Các toán tử xâu chuỗi các danh sách trung tố là ::

Cho một đối tượng và một danh sách các đối tượng cùng loại,:: trả về một danh sách mới với đối tượng ở đầu và danh sách đối tượng ở đuôi Vì vậy,:: có kiểu: -op::;

>(´ a*(´a list)) - > (´ a list)

Ngày đăng: 24/08/2016, 12:53

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[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 Sách, tạp chí
Tiêu đề: Ngôn ngữ lập trình
Tác giả: Trần Văn Dũng
Năm: 2012
[5]. Jan Hoffmann (2012), “AnalyzingSortingAlgorithmsinResourceAware ML” Sách, tạp chí
Tiêu đề: AnalyzingSortingAlgorithmsinResourceAware ML
Tác giả: Jan Hoffmann
Năm: 2012
[6]. Michael R.Hansen (2004), “Introduction to SML” Sách, tạp chí
Tiêu đề: Introduction to SML
Tác giả: Michael R.Hansen
Năm: 2004
[7]. Michael P. Fourman(2010), “Reasoning about Programs” Sách, tạp chí
Tiêu đề: Reasoning about Programs
Tác giả: Michael P. Fourman
Năm: 2010
[10]. Stephen A. Edwards (2010), “The Lambda Calculus” Sách, tạp chí
Tiêu đề: The Lambda Calculus
Tác giả: Stephen A. Edwards
Năm: 2010
[2]. Greg Michaelson(1988), An introduction to functional programming through Lambda Calculus Khác
[3]. Erik Barendsen, Henk Barendregt (1998),Introductionto Lambda Calculus Khác
[4]. Henk Barendregt (1992), Lambda calculi with types Khác
[8]. Riccardo Pucella (2001), Notes on Programming Standard ML of New Jersey Khác
[9]. Robert Harper(2011), Programming in Stadard ML Khác

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w