Tải bản đầy đủ (.pdf) (34 trang)

Thực Hành Ngôn Ngữ Lập Trình ĐH Bách Khoa TP.HCM

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (256.85 KB, 34 trang )

BK

Thực hành Ngôn ngữ lập trình

TP.HCM

Nguyễn Thị Trúc Viên
Khoa Công Nghệ Thông Tin
Đại Học Bách Khoa TPHCM

BK

Nội dung

TP.HCM

Các loại Ngôn ngữ lập trình
Lập trình hàm với Lisp: GcLisp
Lập trình logic với Prolog: B_Prolog
Lập trình hướng đối tượng với SmallTalk:
Vwin

Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 2/67

1



BK

Lịch sử phát triển

TP.HCM

Nghĩ ra năm 1958 bởi John McCarthy (MIT)
Hai thế hệ đầu tiên ra đời ngay sau đó:
MacLisp và InterLisp
Franz-Lisp
Zeta-Lisp
Đầu thập niên 80, có 12 hệ Lisp khác nhau
Common Lisp chuẩn ra đời năm 1984
Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 3/67

Lisp – Các ứng dụng

TP.HCM

Expert problem solvers
Common reasoning
Learning
Natural-language interfaces
Education and intelligent support systems

Speech and vision
Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 4/67

2


BK

Ngôn ngữ hướng chức năng

TP.HCM

Từ khi được John McCarthy (MIT) nghĩ ra năm
1958, LISP được tinh chế dần đến version 1.5 và
được sử sụng lâu dài về sau
Ngôn ngữ hướng chức năng (functional
language), dùng ký hiệu tiền tố (prefix):
f(x,y, z)
x+y

Bt:
Nguyễn Thị Trúc Viên

BK

ký hiệu là (f x y z)

ký hiệu là (+ x y)

π

sin  3 x +  ký hiệu ra sao ?
2

Ngôn ngữ lập trình Lisp

Slide 5/67

Giải đáp bài tập

TP.HCM

(sin (+ (* 3 x) (/ pi 2)))

Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 6/67

3


BK

Ngôn ngữ thông dịch


TP.HCM

Ngôn ngữ biên dịch Ngôn ngữ thông dịch
câu lệnh (instructions)

Biểu thức

biên dịch

đánh giá
trả lời

chương trình thực thi

Kết quả

thực thi
kết quả

Nguyễn Thị Trúc Viên

BK

vòng lặp top-level

Ngôn ngữ lập trình Lisp

Slide 7/67

List Processing (1)


TP.HCM

Lisp là ngôn ngữ đặc trưng cho việc xử lý
danh sách
Biểu diễn chương trình bằng các danh
sách và thao tác trên đó như dữ liệu
(+ (* 3 4) (- 5 2))
chương trình: hàm + áp dụng vào hai đối số
dữ liệu: danh sách gồm ba thành phần
Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 8/67

4


BK

List Processing (2)

TP.HCM

Ví dụ:
* (+ 3 4)
7
* (+ (* 3 4) (- 5 2))
15

*4
4
Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 9/67

List Processing (3)

TP.HCM

Danh sách là sự thực hiện một hàm
* (+ 3 4) ; danh sách được đánh giá
7

Để không đánh giá một danh sách, dùng
dấu ‘ đặt trước danh sách
* ‘(+ 3 4)
(+ 3 4)

Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 10/67

5



BK

Symbol (1)

TP.HCM

Symbol (~ identifier): từ tạo bởi các ký tự
bất kỳ, ngoại trừ ( ) ‘ ` “ ; và
khoảng trắng
Ví dụ: + * example là các symbol

Ba trường hợp thường sử dụng:
Tên hàm
Dữ liệu: chuỗi ký tự hay số
Tên biến
Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 11/67

Symbol (2)

TP.HCM

Với vai trò là đối số trong hàm, symbol được

xem như tên của một biến
* example
Unbound variable: EXAMPLE
* (setf example 3)
3
* (+ example 4)
7

Để không đánh giá một symbol, dùng dấu ‘ đặt
trước danh sách
* ’example
example
Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 12/67

6


BK

Symbol (3)

TP.HCM

Bài tập: Symbol hay số ?
AARDVARD
87

1-2-3-GO
3.12
7-11
22/7
-12
Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 13/67

Symbol (4)

TP.HCM

Giải bài tập
AARDVARD
87
1-2-3-GO
3.12
7-11
22/7
12
Nguyễn Thị Trúc Viên

symbol
number
symbol

number
symbol
symbol
number
Ngôn ngữ lập trình Lisp

Slide 14/67

7


BK

Boolean

TP.HCM

Lisp không có kiểu dữ liệu Boolean
nil biểu diễn giá trị logic sai, tất cả các biểu thức
khác biểu diễn trị logic đúng
Mặc định dùng T → trị logic đúng

nil và T là các symbol hằng
* nil
NIL
*T
T

nil ≈ danh sách rỗng ()
Nguyễn Thị Trúc Viên


BK

Ngôn ngữ lập trình Lisp

Slide 15/67

Kiểu dữ liệu

TP.HCM

Symbol (~ identifier): từ tạo bởi các ký tự bất
kỳ, ngoại trừ ( ) ‘ ` “ ; và khoảng trắng
Ví dụ: + * example là các symbol
Biểu thức

expression::= atom | list

Danh sách

list::=(expression1...expressionn)

Atoms

atom::= số|chuỗi ký tự|symbols

Boolean

T và nil


Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 16/67

8


BK

Các loại biểu thức trong Lisp

TP.HCM

Các loại biểu thức (expression):
Ký hiệu (symbol). Ví dụ: a-symbol
Danh sách (list). Ví dụ: (f x y)
Literal:
Số: 0.42e2
Chuỗi: “a string”
Ký tự: ‘c
Mảng: ‘(1 2 3)
Ngôn ngữ lập trình Lisp

Nguyễn Thị Trúc Viên

BK

Slide 17/67


Phân cấp dữ liệu

TP.HCM

expression

list

atom

symbol

list

Nguyễn Thị Trúc Viên

nil

...

number

interger

Ngôn ngữ lập trình Lisp

...

real


...

Slide 18/67

9


BK

Ngôn ngữ động (dynamic type)

TP.HCM

Biến không có kiểu dữ liệu định sẵn
(không khai báo)
Cùng một biến có thể có nhiều kiểu dữ
liệu khác nhau

Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 19/67

Ngôn ngữ lập trình Lisp

Slide 20/67


Ví dụ

TP.HCM

* (setf a ‘(1 2 3))
(1 2 3)
*a
(1 2 3)
* (setf a 2)
2
*a
2
Nguyễn Thị Trúc Viên

10


BK

Các vị từ kiểu

TP.HCM

(numberp E) trả về đúng nếu E là số
(stringp E)

chuỗi

(listp E)


danh sách

(null E)

nil

(atom E)

atom

Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 21/67

Các vị từ kiểu

TP.HCM

* (numberp 4)
T
* (numberp 3.45)
T
* (symbolp ‘ListProcessor)
T
* (listp ‘(a b c))

T
Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 22/67

11


BK

Các vị từ trên số

TP.HCM

ZEROP
PLUSP
MINUSP
ODDP
EVENP
<
>
=
Nguyễn Thị Trúc Viên

BK

kiểm tra zero
kiểm tra số dương

kiểm tra số âm
kiểm tra số lẻ
kiểm tra số chẵn
so sánh first < second
so sánh first > second
so sánh first = second
Ngôn ngữ lập trình Lisp

Slide 23/67

Các hàm cơ bản

TP.HCM

Gán: setf và setq
Các phép tính số học
+, –, *, /, \\
1+ và 1max, min và abs

Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 24/67

12


BK


Ví dụ

TP.HCM

* (setf x 27)
1.111
* (/ x 9)
3
* (/ 22 7)
3.14286
* (max 3 4 5)
5
* (abs -2)
2
Ngôn ngữ lập trình Lisp

Nguyễn Thị Trúc Viên

BK

Slide 25/67

Các hàm so sánh (1)

TP.HCM

Các phép so sánh
=
eq
eql

equal

Nguyễn Thị Trúc Viên

hai đối số cùng là một số
hai đối số cùng là một symbol
hai đối số cùng là một symbol
hay cùng một số
hai đối số có cùng biểu thức
biểu diễn

Ngôn ngữ lập trình Lisp

Slide 26/67

13


BK

Các hàm so sánh (2)

TP.HCM

eq kiểm tra cùng địa chỉ bộ nhớ (các symbol
giống nhau thỏa điều này).

eql kiểm tra thỏa eq hay không. Nếu không,
kiểm tra là hai số cùng kiểu và cùng giá trị.


equal kiểm tra thỏa eql hay không. Nếu
không, xem đối số là hai danh sách và xem
từng cặp phần tử có thỏa equal.

= kiểm tra hai đối số cùng là một số (có thể
không cùng kiểu)
Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 27/67

Ví dụ (1)

TP.HCM

* (setf k ‘(a b) l ‘(a b))
(A B)
* (equal k l)
T
* (eq k l)
NIL
* (eql k l)
NIL
Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp


Slide 28/67

14


BK

Ví dụ (2)

TP.HCM

* (setf x ‘a y ‘a)
A
* (equal x y)
T
* (eq x y)
T
* (eql x y)
T
Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 29/67

Ngôn ngữ lập trình Lisp

Slide 30/67


Ví dụ (3)

TP.HCM

* (eq 3 3)
T
* (eql 3 3.0)
NIL
* (= 3 3)
T
* (= 3 3.0)
T
Nguyễn Thị Trúc Viên

15


BK

Các hàm xử lý trên danh sách (1)

TP.HCM

FIRST và REST – CAR và CDR
CONS, APPEND, LIST
NTHCDR, BUTLAST và LAST
LENGTH và REVERSE

Nguyễn Thị Trúc Viên


BK

Ngôn ngữ lập trình Lisp

Slide 31/67

Các hàm xử lý trên danh sách (2)

TP.HCM

* (setf l ‘(a b c d e) k ‘(f g h))
(F G H)
* (first l)
A
* (rest l)
(B C D E)
* (cons ‘f l)
(F A B C D E)
* (list ‘a ‘b ‘c)
(A B C)
Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 32/67

16



BK

Các hàm xử lý trên danh sách (3)

TP.HCM

* (nthcdr 2 l)
(C D E)
*l
(A B C D E)
* (butlast l 2)
(A B C)
* (last l)
(E)
* (reverse l)
(E D C B A)
Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 33/67

Toán tử ASSOC (1)

TP.HCM

Gắn với một danh sách – association list
hay a-list

Key

Key

(setf sarah ‘((height .54) (weight 4.4)))

Value
Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Value
Slide 34/67

17


BK

ASSOC (2)

TP.HCM

Lấy các thành phần từ một danh sách:
(ASSOC <key> <asociation list>)
Ví dụ:
* (setf sarah ‘((height .54) (weight 4.4)))
((HEIGHT 0.54) (WEIGHT 4.4))
* (assoc ‘weight sarah)
(WEIGHT 4.4)

Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 35/67

ASSOC (3)

TP.HCM

Thêm một thành phần mới vào danh sách:
(ACONS <key><value><asociation list>)

Ví dụ:
* (setf Andrew ‘((height .74) (weight 6.4)))
((HEIGHT 0.74) (WEIGHT 6.4))
* (acons ‘nick ‘Bobby Andrew)
((NICK . BOBBY) (HEIGHT 0.74) (WEIGHT 6.4))
Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 36/67

18


BK


Định nghĩa hàm

TP.HCM

* (defun square (x) (* x x))
SQUARE
* (square 3)
9
* (defun abs(x)
(if (>= x 0) x
(* -1 x) ) )
ABS
Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 37/67

Đệ quy trong Lisp

TP.HCM

Ví dụ: Tính giai thừa:
n!=1*2*...*n
0!=1
(defun fac(n)
(if (= n 0)

1
(* n fac (1- n)) ) )

Bài tập: Viết hàm in ra phần tử thứ n
trong danh sách.
Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 38/67

19


BK

Đánh giá biểu thức (Evaluation)

TP.HCM

‘Exp là cách viết tắt của (quote Exp)
* (setf c ‘a)
a

eval >< quote
* (setf l ‘(a b c))
(a b c)
* (eval (list ‘car ‘l))
a
* (eval (list ‘+ (1+ 3) 2))

6
Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 39/67

Các câu lệnh điều kiện (1)

TP.HCM

Câu lệnh IF
(if E1 E2): Nếu E1 đúng, trả về giá trị E2
(if E1 E2 E3): .. nếu không trả về giá trị E3
Ví dụ:
* (if (numberp 1) ‘(a number) ‘(not a number))
(A NUMBER)
* (if (numberp ‘a) ‘(a number) ‘(not a number))
(NOT A NUMBER)
Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 40/67

20



BK

Các câu lệnh điều kiện (2.1)

TP.HCM

Câu lệnh COND
(cond (Test1 E1 …)
(Test2 E2 …)
(Test3 E3 …)

(Testn En …) )
(if Test1 (progn E1 …)
(if Test2 (progn E2 …)
(if Test3 (progn E3 …)

(if Testn (progn En …)) … )
))
Ngôn ngữ lập trình Lisp

Nguyễn Thị Trúc Viên

BK

Slide 41/67

Các câu lệnh điều kiện (2.2)

TP.HCM


* (setf x ‘(a b c))
(A B C)
* (cond ((numberp x) ‘(This is a number))
((symbolp x) ‘(This is a symbol))
((listp x) ‘(This is a list))
)
(THIS IS A LIST)

Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 42/67

21


BK

Các câu lệnh điều kiện (3)

TP.HCM

Câu lệnh WHEN
(when Test E1 ... En): Nếu Test đúng, thực
hiện E1 ... En và trả về kết quả En
Ví dụ:
* (setf n 3)
* (when (numberp n) (setf n 5) (setf l ‘(a b c)))
(A B C)


Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 43/67

Các trường hợp điều kiện (1.1)

TP.HCM

Câu lệnh AND
(and E1 ... En) sai nếu ít nhất một Ei sai
AND đánh giá từ trái → phải và dừng lại
khi gặp đối số sai
Nếu mọi đối số đều đúng, AND trả về giá
trị của đối số cuối cùng

Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 44/67

22


BK


Các trường hợp điều kiện (1.2)

TP.HCM

* (setf n 3)
3
* (and (numberp n) (> n 3) )
NIL
* (and (numberp n) (oddp n))
T
* (and (numberp n) (oddp n) (1+ n))
4
Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 45/67

Các trường hợp điều kiện (2.1)

TP.HCM

Câu lệnh OR
(or E1 ... En) đúng nếu ít nhất một Ei đúng
OR đánh giá từ trái → phải và dừng lại khi
gặp đối số đúng


Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 46/67

23


BK

Các trường hợp điều kiện (2.2)

TP.HCM

* (setf x ‘a)
A
*x
A
* (or (numberp x) (> x 1))
wrong type argument
* (or (symbolp x) (list x))
T
Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 47/67


Các trường hợp điều kiện (3)

TP.HCM

Toán tử NOT
AND, OR trả về giá trị cuối cùng tính được
NOT đơn giản đổi nonNIL→NIL và NIL→T
* (not nil)
T
* (not ‘dog)
NIL
* (not (symbolp 4.3))
T
Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp

Slide 48/67

24


BK

Các dạng đặc biệt (1)

TP.HCM

Toán tử PROG1 và PROGN

(prog1 E1 ... En) đánh giá tuần tự các biểu
thức E1, ..., En từ trái sang phải và kết quả
trả về là giá trị của biểu thức E1
(progn E1 ... En) đánh giá tuần tự các biểu
thức E1, ..., En từ trái sang phải và kết quả
trả về là giá trị của biểu thức En

Nguyễn Thị Trúc Viên

BK

Ngôn ngữ lập trình Lisp

Slide 49/67

Các dạng đặc biệt (2)

TP.HCM

* (progn (setf x ‘(a b c)) (append x x) )
(A B C A B C)
*x
(A B C)
* (prog1 (setf x ‘(a b c)) (append x x) )
(A B C)

Nguyễn Thị Trúc Viên

Ngôn ngữ lập trình Lisp


Slide 50/67

25


×