Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 49 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
49
Dung lượng
168,68 KB
Nội dung
Chương 7: Ngôn ngữ lập trình hàm Giảng viên: Ph.D Nguyễn Văn Hòa Khoa KT-CN-MT – ðH An Giang Một số ñặc trưng NN mệnh lệnh Sử dụng nguyên lý tinh chế bước, hay mịn dần Khai báo liệu ñể nối kết tên biến → trị Các kiểu liệu → kiểu liệu có cấu trúc Cấu trúc ñiều khiển tự, rẽ nhánh, gọi chương trình Hiệu ứng lề Lập trình cấu trúc: khối, chương trình con, module Nội dung chương Giới thiệu Hàm toán học Dạng hàm Bản chất lập trình hàm Ngôn ngữ LISP Giới thiệu Ngôn ngữ lập trình mệnh lệnh ñược xây dựa nguyên lý kiến trúc máy tính von Neumann ðơn trị làm việc chương trình câu lệnh Các NNLT Fortran, Pascal, Ada… hiệu quan trọng thích hợp ñể phát triển phần mềm Ngôn ngữ lập trình hàm (LTH) ñược xây dựng dựa hàm toán học → ngôn ngữ không lệnh Vì dựa nguyên lý hàm toán học nên LTH gần gủi với người dùng hơn, LTH không liên hệ chặt chẽ với kiến trúc máy tính Hàm toán học Mỗi hàm toán học ánh xạ phần tử tập hợp (miền xác ñịnh) với phần tử tập hợp khác (miền giá trị) Mỗi phần tử miền xác ñịnh tương ứng phần tử miền giá trị Mỗi ñịnh nghĩa hàm xác ñịnh miền xác ñịnh, miền giá trị quy tắc tương tác (ánh xạ) ðịnh nghĩa hàm Tên hàm + danh sách tham số ≡ biểu thức VD lap_phuong(x) ≡ x*x*x ; Biểu thức lambda ðôi người ta dùng hàm không tên → sử dụng biểu thức lambda VD λ(x) x * x * x thay lap_phuong(x) ≡ x*x*x Tham số biểu thức lambda gọi tham số biến kết ghép Khi biểu thức lambda ñược ñịnh trị ñối với tham số ñã cho → biểu thức ñược áp dụng cho tham số ñó (λ(x) x * x * x)(2) có giá trị Ngôn ngữ lập trình hàm Tập hợp ñối tượng liệu Các hàm nguyên thủy Các dạng hàm Tác vụ áp dụng hàm ðối tượng liệu ðối tượng liệu ngôn ngữ lập trình hàm ñơn giản Nguyên tử (Atom): chuỗi ký tự; ABC, 123, Z34 Hai nguyên tử ñặc biệt: T F Dãy n ñối tượng x1, x2, …, xn ñược ký hiệu < x1, x2, …, xn> NIL ký hiệu dãy rỗng Hàm nguyên thủy Là hàm ñược ñịnh nghĩa sẵn ngôn ngữ Bón nhóm dạng hàm nguyên thủy Nhóm hàm số học: +, -,*, / Nhóm hàm vị từ: ATOM NULL Hàm ñồng ID:x ≡ x Nhóm liên quan ñến cấu trúc danh sánh (dãy) Dạng hàm Dạng hàm tổ hợp hàm: hàm (chương trình) ñược xây dựng từ hàm sẵn có cách sử dụng tác vụ tạo chương trình Các dạng hàm Hàm hợp Hàm xây dựng Hàm áp dụng cho tất 10 Các hàm logic (tt) (OR E1 E2 En) nhận vào n biểu thức E1, E2, En OR ñịnh giá biểu thức E1 E2 En từ trái sang phải Nếu gặp biểu thức khác NIL dừng trả kết giá trị biểu thức ñó Nếu tất biểu thứcñều NIL trả kết NIL >(OR (= 2) (+ 1) (list 2)) = >(OR (= 1) (Cdr ‘(a) ) (listp ‘(3) )) = T 35 Các hàm logic (tt) (NOT E) nhận vào biểu thức E Nếu E khác NIL trả kết NIL, ngược lại trả kết T (NOT (listp '(1 2)) = NIL (NOT (eq ‘tuong ‘duong)) = T 36 Các hàm ñiều khiển (IF E1 E2 E3) nhận vào biểu thức E1, E2 E3 Nếu E1 khác NIL hàm trả giá trị E2 ngược lại trả giá trị E3 (IF E1 E2) tương ñương (IF E1 E2 NIL) Nếu E2 khác NIL (IF E1 E2 E3) tương ñương (OR (AND E1 E2) E3) 37 Các hàm ñiều khiển (tt) (COND (ÐK1 E1) (ÐK2 E2) (ÐKn En) [(T En+1)] ) Nếu ðK1 khác NIL trả kết giá trị E1, ngược lại xét ðK2 Nếu ðK2 khác NIL trả kết giá trị E2, ngược lại xét ðK3 Nếu ðKn NIL, trả kết trị En+1 38 Các hàm ñiều khiển (tt) (PROGN E1 E2 En) nhận vào n biểu thức E1, E2, En Hàm ñịnh trị biểu thức E1, E2, En từ trái sang phải trả kết giá trị biểu thức En (PROG1 E1 E2 En) nhận vào n biểu thức E1, E2, En Hàm ñịnh trị biểu thức E1, E2, En từ trái sang phải trả kết giá trị biểu thức E1 39 Hàm người dùng ñịnh nghĩa Cú pháp ñịnh nghĩa hàm là: (defun ) Ví dụ 1: Ðịnh nghĩa hàm lấy bình phương số a (defun binh_phuong (a) (* a a) ) >(binh_phuong 5) = 25 40 Hàm người LT ñịnh nghĩa (tt) Ví dụ 2: Ðịnh nghĩa hàm DIV chia số a cho số b, lấy phần nguyên Trước hết ta có: a DIV b = (a – a MOD b)/b (defun DIV (a b) (/ (- a (MOD a b)) b) ) >(div (div 2)) = 41 ðệ qui Mô tả ñệ quy bao gồm: Có trường hợp “dừng” ñể kết thúc việc gọi ñệ quy Lời gọi ñệ quy phải bao hàm yếu tố dẫn ñến trường hợp “dừng” Ví dụ 1: hàm giai thừa (defun giai_thua (n) (if (= n 0) (* n (giai_thua (1- n)))) ) (giai_thua 4) = 24 42 ðệ qui (tt) Ví dụ 2: hàm DIV chia a cho b lấy phần nguyên (defun DIV (a b) (if (< a b) (1+ (DIV (- a b) b))) ) Ví dụ 3: hàm truy xuất phần tử thứ i DS L (defun phan_tu(i L) (cond ((Null L) “Khong ton tai”) ((= i 1) (car L)); (T (phan_tu (1- i) (cdr L))) ) ) 43 Các hàm nhập xuất (Load ) Nạp tập tin vào cho LISP trả T việc nạp thành công, ngược lại trả NIL Tên tập tin theo quy tắc DOS Dùng ñể load tập tin ñể nạp tâp tin CT trước gọi lời thực hàm tập tin ñó VD >(Load “D:\btlisp\bai1.lsp”) 44 Các hàm nhập xuất (tt) (READ) Ðọc liệu từ bàn phím cho ñến gõ phím Enter trả kết liệu ñược nhập từ bàn phím (PRINT E) In tra hình trị biểu thức E ñồng thời xuống dòng trả giá trị E (PRINC E) In hình giá trị biểu thức E (không xuống dòng) trả giá trị E (TERPRI) ðưa trỏ xuống dòng trả NIL 45 Biến toàn cục biến cục Biến toàn cục Là biến mà phạm vi tất hàm Hàm (SETQ ) VD >(setq x (* 3)) = ↔ biến x tồn có giá trị Biến cục Phạm vi nằm hàm mà ñược tạo Hàm (LET ( (var1 E1) (var2 E2) (vark Ek)) Ek+1 En) VD >(Let ((a 3) (b 5)) (* a b) (+ a b)) = 46 Biến toàn cục biến cục (tt) Biến cục che biến toàn Khai báo biến cục hàm LET gây khó khăn cho việc viết chương trình sử dụng biến toàn cục Giải pháp: kết hợp hai hàm LET SETQ ñể sử dụng biến cục che biến toàn cục VD (LET ( (var E1)… ) …… (SETQ var E2) …… ) 47 Biến toàn cục biến cục (tt) (defun giai_ptb2 () (let ((d 0) (e 0) (f 0)) (print ‘’Chương trình giải phương trình bậc 2’’) (princ ‘’ Nhập số a: ‘’) (setq d (read)) (princ ‘’ Nhập số b: ‘’) (setq e (read)) (princ ‘’ Nhập số c: ‘’) (setq f (read)) (ptb2 d e f) ) ) Sau thực xong chương trình biến d, e f ñược giải phóng 48 Exercise Viết hàm có ñối số tính tích hai số lớn Viết hàm consp kiểm tra xem ñối số có phải danh sách không rỗng Viết hàm tính xn Viết hàm tính ñộ dài chuỗi Viết hàm thực phép nối hai chuỗi (noi ‘(1 3) ‘(4 5) (1 5) Viết hàm run ñể có ñối số danh sách số nguyên L, hàm trả danh sách chiều dãy tăng (run) L >(run ‘(1 7)) = ((1 3) (2) (1 5) (4 7)) 49 [...]... 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ố VD f(x) + f(x) và 2 * f(x) luôn luôn cùng kết quả 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 mệnh lệnh 15 Bản chất của NN lập trình hàm (tt) Ngôn ngữ hàm cung cấp một tập hợp các hàm nguyên.. .Hàm hợp (composition) Hàm hợp là hàm dùng 2 hàm như là 2 tham số và dùng kết quả của hàm ñầu tiên như là tham số thực cho hàm thứ 2 VD hàm hợp của h h ≡ f ° g nghĩa là h(x) ≡ f ( g ( x)) Nếu f (x) ≡ x + 2 và g (x) ≡ 3 * x, h ≡ f ° g tương ñương (3 * x)+ 2 11 Hàm xây dựng (construction) Hàm xây dụng là hàm mà các tham số của chúng cũng là hàm Ký hiệu hàm xây dựng: [] Khi áp dụng vào một ñối số vào hàm. .. nguyên thủy và một tập các dạng hàm Ngoài còn cung cấp một phép toán áp dụng hàm và các cấu trúc lưu trữ dữ liệu Ngôn ngữ hàm ñược thiết kế tốt là LISP 16 NN biên dịch vs NN thông dịch 17 LISP: giới thiệu Ðược John McCarthy ñề xuất vào năm 1958 Trình biên dịch LISP ñầu tiên ñược viết bởi Tim Hart và Mike Levin (1962) bằng chính ngôn ngữ LISP LISP là một trong những ngôn ngữ LT sớm nhất LISP ñã ñược sử... ñược áp dụng vào hàm tham số → tập hợp kết quả VD G(x) ≡ x*x, H(x) ≡ 2*x và I(x) ≡ x/2 [G,H,I](4) có kết quả là (16,8,2) 12 Áp dụng cho tất cả Là hàm lấy một hàm ñơn như là một tham số Hàm áp dụng cho tất cả ñược ký hiệu là α Áp dụng hàm tham số vào danh sách các ñối số, ta ñược một danh sách kết quả VD h (x) ≡ x * x α( h, (2, 3, 4)) kết quả (4, 9, 16) 13 Bản chất của NN lập trình hàm Mục ñích của... Nếu là danh sách có dạng (E0, E1,…, En) thì trị là Phần tử ñầu tiên phải là hàm ñã ñược biết bởi LISP Các phần tử E1,…, En ñược ñịnh trị từ trái sang phải VD >(+ 5 3 6) = 14; >(+ 4 (+ 3 5)) = 12 24 Các hàm Một chương trình của LISP là một hàm hoặc một hàm hợp Các hàm có thể ñược LISP ñịnh nghĩa hoặc do người dùng ñịnh nghĩa Hàm số học: +, -, *, /, 1+, 1-, MOD, SQRT: tác ñộng lên biểu thức số và cho... mô phỏng các hàm toán học một cách nhiều nhất có thể ñược Tiến trình tính toán trong NN LTH khác NN LT mệnh lệnh: Trong LT mệnh lệnh, biểu thức ñược ñịnh giá và kết quả của nó ñược lưu trữ trong ô nhớ Quản lý biến là 1 trong những nhân tố làm phức tạp NNLT mệnh lệnh Trong NN LTH, biến không cần thiết, như là trong trường hợp của toán học 14 Bản chất của NN lập trình hàm (tt) Các lệnh lập lại sẽ ñược... trong 1980s Common Lisp chuẩn ra ñời năm 1984 18 Ưu ñiểm của LISP Cú pháp ñơn giản Cấu trúc dữ liệu duy nhất: danh sách Không có lệnh, không từ khóa Tất cả các hàm ñều viết ở dạng hàm Là một ngôn ngữ mạnh nhờ tính tương ñương giữa dữ liệu và chương trình Mềm dẻo và dễ phát triển 19 Các khái miện cơ bản Nguyên tử (Atom): là một ñối tượng cơ bản của LISP, nguyên tử có thể là số hoặc ký hiệu Số: giống như... (+ 5 1) >(1- 5) ; Tương ñương (- 5 1) >(MOD 14 3) hoặc >(sqrt 9) 25 Các hàm (tt) Các hàm so sánh các số , =, = và /=, cho kết quả là T hoặc NIL VD >(< 4 5) = T >(> 4 (* 2 3)) = NIL (EQ s1 s2) so sánh xem hai ký hiệu s1 và s2 có giống nhau hay không >(eq ‘tuong ‘tuong) = T >(eq ‘tuong ‘duong) = NIL >(eq ‘5 5 ) = T 26 Các hàm (tt) (EQUAL o1 o2) so sánh xem ñối tượng bất kỳ o1 và o2 có giống nhau... 27 Các hàm thao tác trên danh sách CAR: nhận vào danh sách (DS) L, trả về phần tử ñầu tiên của L > (CAR '(1 2 3)) = 1 > (CAR 3) Error: bad argument type - 3 >(CAR nil) = NIL > (CAR '((a b) 1 2 3)) = (A B) CDR: nhận DS L, trả về DS sau khi bỏ phần tử ñầu tiên >(cdr '(1 2 3)) = (2 3) >(cdr 3) Error: bad argument type – 3 >(CAR (CDR ‘(a b c))) = B 28 Các hàm thao tác trên DS (tt) Viết gộp các hàm: ta... hàm thao tác trên DS (tt) Viết gộp các hàm: ta có thể dùng hàm C A/D R ñể kết hợp nhiều CAR và CDR VD (CADR ‘(a b c)) = B (CONS x L) nhận vào phần tử x và danh sách L, trả về một danh sách, có ñược bằng cách thêm phần tử x vào ñầu danh sách L >(CONS 3 '(1 2 3)) = (3 1 2 3) >(CONS 3 nil) = (3) >(CONS '(a b) '(1 2 3)) = ((A B) 1 2 3) 29 Các hàm thao tác trên DS (tt) (APPEND L1 L2 Ln) Trả về DS là nối