You are on page 1of 49

Chng 7: Ngn ng l p trnh hm

Gi ng vin: Ph.D Nguy n Vn Ha Khoa KT-CN-MT H An Giang

M t s c trng c a NN m nh l nh
S d ng nguyn l tinh ch t ng b c, hay m n d n Khai bo d li u n i k t tn bi n tr Cc ki u d li u c b n ki u d li u c c u trc C u trc i u khi n t ng t , r nhnh, g i chng trnh con Hi u ng l L p trnh c u trc: kh i, chng trnh con, module
2

N i dung chnh c a chng


Gi i thi u Hm ton h c D ng hm B n ch t c a l p trnh hm Ngn ng LISP

Gi i thi u
Ngn ng l p trnh m nh l nh c xy d a trn nguyn l ki n trc my tnh c a von Neumann
n tr lm vi c trong chng trnh l cu l nh Cc NNLT Fortran, Pascal, Ada s hi u qu quan tr ng hn l s thch h p pht tri n ph n m m

Ngn ng l p trnh hm (LTH) c xy d ng d a trn cc hm ton h c ngn ng khng ra l nh


V d a trn nguyn l hm ton h c nn LTH g n g i v i ng i dng hn, nhng LTH th khng lin h ch t ch v i ki n trc my tnh
4

Hm ton h c
M i hm ton h c l m t nh x cc ph n t c a t p h p (mi n xc nh) v i cc ph n t c a t p h p khc (mi n gi tr ) M i ph n t c a mi n xc nh tng ng m t ph n t c a mi n gi tr M i nh ngha hm xc nh mi n xc nh, mi n gi tr v quy t c tng tc (nh x ) nh ngha hm
Tn hm + danh sch tham s bi u th c VD lap_phuong(x) x*x*x ;
5

Bi u th c lambda
i khi ng i ta dng hm khng tn s d ng bi u th c lambda
VD (x) x * x * x thay th lap_phuong(x) x*x*x

Tham s bi u th c lambda g i l tham s bi n k t ghp Khi bi u th c lambda c nh tr i v i m t tham s cho bi u th c c p d ng cho tham s
((x) x * x * x)(2) c gi tr l 8
6

Ngn ng l p trnh hm
T p h p cc i t ng d li u Cc hm nguyn th y Cc d ng hm Tc v p d ng hm

i t ng d li u
i t ng d li u c a ngn ng l p trnh hm r t n gi n
Nguyn t (Atom): m t chu i cc k t ; ABC, 123, Z34 Hai nguyn t c bi t: T v F Dy n cc i t ng x1, x2, , xn c k hi u l < x1, x2, , xn> NIL l k hi u dy r ng

Hm nguyn th y
L cc hm c nh ngha s n trong ngn ng Bn nhm d ng hm nguyn th y
Nhm hm s h c: +, -,*, / Nhm hm v t : ATOM v NULL Hm ng nh t ID:x x Nhm lin quan n c u trc danh snh (dy)

D ng hm
D ng hm l s t h p c a cc hm: m t hm (chng trnh) c xy d ng t cc hm s n c b ng cch s d ng cc tc v t o chng trnh Cc d ng hm
Hm h p Hm xy d ng Hm p d ng cho t t c

10

Hm h p (composition)
Hm h p l hm dng 2 hm nh l 2 tham s v dng k t qu c a hm u tin nh l tham s th c cho hm th 2 VD hm h p c a h
h f g

ngha l h(x) f ( g ( x)) N u f (x) x + 2 v g (x) 3 * x, h f g tng ng (3 * x)+ 2

11

Hm xy d ng (construction)
Hm xy d ng l hm m cc tham s c a chng cng l hm K hi u hm xy d ng: [] Khi p d ng vo m t i s vo hm xy d ng: i s c p d ng vo hm 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 hm l y m t hm n nh l m t tham s Hm p d ng cho t t c c k hi u l p d ng hm tham s vo danh sch cc i s , ta c m t danh sch 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 trnh hm
M c ch c a vi c thi t k NN LTH l m ph ng cc hm ton h c m t cch nhi u nh t c th c Ti n trnh tnh ton trong NN LTH khc 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 lu tr trong nh Qu n l bi n l 1 trong nh ng nhn t lm ph c t p NNLT m nh l nh

Trong NN LTH, bi n khng c n thi t, nh l trong tr ng h p c a ton h c


14

B n ch t c a NN l p trnh hm (tt)
Cc l nh l p l i s c x l b ng qui Chng trnh l cc nh ngha hm v cc p d ng hm S th c hi n l vi c nh gi cc p d ng hm S th c hi n m t hm lun cho cng m t k t qu khi ta cho n cng m t i s
VD f(x) + f(x) v 2 * f(x) lun lun cng k t qu

Ng ngha c a ngn ng l p trnh hm n gi n hn ng ngha c a ngn ng l p trnh m nh l nh


15

B n ch t c a NN l p trnh hm (tt)
Ngn ng hm cung c p m t t p h p cc hm nguyn th y v m t t p cc d ng hm Ngoi cn cung c p m t php ton p d ng hm v cc c u trc lu tr d li u Ngn ng hm c thi t k t t l LISP

16

NN bin d ch vs NN thng d ch

17

LISP: gi i thi u
c John McCarthy xu t vo nm 1958 Trnh bin d ch LISP u tin c vi t b i Tim Hart v Mike Levin (1962) b ng chnh ngn ng LISP LISP l m t trong nh ng ngn ng LT s m nh t LISP c s d ng r ng ri v pht tri n m nh trong lnh v c tr tu nhn t o trong 1980s Common Lisp chu n ra i nm 1984

18

u i m c a LISP
C php n gi n
C u trc d li u duy nh t: danh sch Khng c l nh, khng t kha T t c cc hm u vi t d ng hm

L m t ngn ng m nh nh tnh tng ng gi a d li u v chng trnh M m d o v d pht tri n

19

Cc khi mi n c b n
Nguyn t (Atom): l m t i t ng c b n c a LISP, nguyn t c th l s ho c k hi u
S : gi ng nh trong cc NNLT khc nh Pascal, C VD : cc h ng s 5, -20, 10.45, 18.2E+5 K hi u (symbol): l chu i cc k t (tr cc k t c bi t, d u ngo c & kho ng tr ng)
Cc k hi u c b t u bng d u VD a, anh, anh_ba K hi u s c xem l s ; VD 5 = 5

20

Cc khi mi n c b n (tt)
Danh snh: dy cc c phn bi t th t c a cc ph n t , cch nhau t nh t m t kho ng tr ng v t n m trong c p d u ngo c n ()
Ph n t c a danh sch c th l m t nguyn t ho c l m t danh sch Cc ph n t khng nh t thi t c cng ki u H ng danh sch c m u b ng d u VD
() Danh sch r ng, tng ng k hi u NIL (a 5 c) Danh sch g m 3 ph n t (3 (b c) d (e (f g))) Danh sch g m 4 ph n t

21

22

Cc khi mi n c b n (tt)
Phn c p d li u

23

Cc khi mi n c b n (tt)
Bi u th c: m t nguyn t ho c m t danh sch, lun lun c tr c nh theo nguyn t c:
N u l m t s : tr l chnh s VD >25, = 25 N u l k hi u: tr c th l
c nh tr c b i LISP; VD t (TRUE), nil (NIL) Gi tr d li u c a ng i s d ng, tr gn cho bi n VD >(setq a 3); gn 3 cho bi n a

N u l danh sch c d ng (E0, E1,, En) th tr l


Ph n t u tin ph i l hm c bi t b i LISP Cc ph n t E1,, En c nh tr t tri sang ph i VD >(+ 5 3 6) = 14; >(+ 4 (+ 3 5)) = 12
24

Cc hm
M t chng trnh c a LISP l m t hm ho c m t hm h p Cc hm c th c LISP nh ngha ho c do ng i dng nh ngha Hm s h c: +, -, *, /, 1+, 1-, MOD, SQRT: tc ng ln bi u th c s v cho k t qu l s
VD >(+ 5 6 2) =13 >(- 8 3) = 5 >(- 8 3 1) =4 >(1+ 5) ; Tng ng (+ 5 1) >(1- 5) ; Tng ng (- 5 1) >(MOD 14 3) ho c >(sqrt 9)
25

Cc hm (tt)
Cc hm so snh cc s <, >, <=, >=, = v /=, cho k t qu l T ho c NIL
VD >(< 4 5) = T >(> 4 (* 2 3)) = NIL

(EQ s1 s2) so snh xem hai k hi u s1 v s2 c gi ng nhau hay khng


>(eq tuong tuong) = T >(eq tuong duong) = NIL >(eq 5 5 ) = T

26

Cc hm (tt)
(EQUAL o1 o2) so snh xem i t ng b t k o1 v o2 c gi ng nhau hay khng
>(equal (a b c) (a b c)) = T >(equal (a b c) ( b a c)) = NIL >(equal a a) = T

27

Cc hm thao tc trn danh sch


CAR: nh n vo danh sch (DS) L, tr v ph n t u tin 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 tin


>(cdr '(1 2 3)) = (2 3) >(cdr 3) Error: bad argument type 3 >(CAR (CDR (a b c))) = B

28

Cc hm thao tc trn DS (tt)


Vi t g p cc hm: ta c th dng hm C..A/D..R k t h p nhi u CAR v CDR
VD (CADR (a b c)) = B

(CONS x L) nh n vo ph n t x v danh sch L, tr v m t danh sch, c c b ng cch thm ph n t x vo u danh sch 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

Cc hm thao tc trn DS (tt)


(APPEND L1 L2 ... Ln)
Tr v DS l n i k t c a DS L1 L2 ... Ln (append (A) (B C)) = (A B C)

(LIST E1 E2 ... En) nh n vo n bi u th c E1, E2, ..., En, tr v danh sch bao g m n ph n t V1, V2, ..., Vn, trong Ei l gi tr c a bi u th c Ei (i=1..n)
>(list 1 2) = (1 2) >(list 'a 'b) = (A B) >(list 'a 'b (+ 2 3 5)) = (A B 10)

30

Cc hm thao tc trn DS (tt)


(LENGTH L)
Tr v t ng s ph n t trong c a DS L (length (A B C D)) = 4

(REVERSE L)
Tr v DS o c a DS L (reverse (1 2 3)) = (3 2 1) (reverse (A B C D)) = (D C B A)

(FIRST L)
Tr v ph n t u tin c a DS L (first (A B C D)) = A
31

Cc hm thao tc trn DS (tt)


(REST L)
Tr v DS sau khi b ph n t u tin c a DS L (rest (A B C D)) = (B C D)

(LAST L)
Tr v ph n t cu i cng c a DS L (last (A B C D)) = D

32

Cc v t ki m tra
(ATOM a) xt xem a c ph i l m t nguyn t (NUMBERP n) xt xem n c ph i l m t s (LISTP L) xt xem L c ph i l m t danh sch (SYMBOLP S) xt xem S c ph i l m t k hi u (NULL L) nh n vo 1 danh sch L. N u L r ng th tr v k t qu l T, ng c l i th tr v k t qu l NIL
>(atom 'a) = T; >(numberp 4) = T; >(symbolp 'a) = T >(listp '(1 2)) = T; >(symbolp NIL) = T; >(null NIL) = T; >(null (a b)) = NIL; >(null 10) = NIL
33

Cc hm logic AND, OR v NOT


(AND E1 E2.. En) nh n vo n bi u th c E1, E2,... En
AND nh tr cc bi u th c E1 E2... En t tri sang ph i N u g p m t bi u th c l NIL th d ng v tr v k t qu l NIL. N u t t c cc bi u th c u khc NIL th tr v gi tr c a bi u th c En >(AND (> 3 2) (= 3 2) (+ 3 2)) = NIL >(AND (> 3 2) (- 3 2) (+ 3 2)) = 5

34

Cc hm logic (tt)
(OR E1 E2 ... En) nh n vo n bi u th c E1, E2, .... En
OR nh gi cc bi u th c E1 E2... En t tri sang ph i N u g p m t bi u th c khc NIL th d ng v tr v k t qu l gi tr c a bi u th c N u t t c cc bi u th c u l NIL th tr v k t qu l NIL >(OR (= 3 2) (+ 2 1) (list 1 2)) = 3 >(OR (= 2 1) (Cdr (a) ) (listp (3) )) = T

35

Cc hm logic (tt)
(NOT E) nh n vo bi u th c E
N u E khc NIL th tr v k t qu l NIL, ng c l i th tr v k t qu l T (NOT (listp '(1 2)) = NIL (NOT (eq tuong duong)) = T

36

Cc hm i u khi n
(IF E1 E2 E3) nh n vo 3 bi u th c E1, E2 v E3 N u E1 khc NIL th hm tr v gi tr c a E2 ng c l i tr v gi tr c a E3 (IF E1 E2) tng ng (IF E1 E2 NIL) N u E2 khc NIL th (IF E1 E2 E3) tng ng (OR (AND E1 E2) E3)

37

Cc hm i u khi n (tt)
(COND (K1 E1) (K2 E2) .................. (Kn En) [(T En+1)] ) N u K1 khc NIL th tr v k t qu l gi tr c a E1, ng c l i s xt K2. N u K2 khc NIL th tr v k t qu l gi tr c a E2, ng c l i s xt K3... N u Kn b ng NIL, th tr v k t qu l tr c a En+1
38

Cc hm i u khi n (tt)
(PROGN E1 E2 ... En) nh n vo n bi u th c E1, E2,... En
Hm nh tr cc bi u th c E1, E2,... En t tri sang ph i v tr v k t qu l gi tr c a bi u th c En

(PROG1 E1 E2 ... En) nh n vo n bi u th c E1, E2,... En


Hm nh tr cc bi u th c E1, E2,... En t tri sang ph i v tr v k t qu l gi tr c a bi u th c E1

39

Hm do ng i dng nh ngha
C php nh ngha hm l:
(defun <tn hm> <danh sch cc tham s hnh th c> <bi u th c> )

V d 1:
nh ngha hm l y bnh phng c a s a (defun binh_phuong (a) (* a a) ) >(binh_phuong 5) = 25
40

Hm do ng i LT nh ngha (tt)
V d 2:
nh ngha hm DIV chia s a cho s b, l y ph n nguyn Tr c h t ta c: a DIV b = (a a MOD b)/b (defun DIV (a b) (/ (- a (MOD a b)) b) ) >(div 6 (div 4 2)) = 3

41

qui
M t m t quy bao g m:
C t nh t m t tr ng h p d ng k t thc vi c g i quy L i g i quy ph i bao hm y u t d n n cc tr ng h p d ng

V d 1: hm giai th a
(defun giai_thua (n) (if (= n 0) 1 (* n (giai_thua (1- n)))) ) (giai_thua 4) = 24
42

qui (tt)
V d 2: hm DIV chia a cho b l y ph n nguyn
(defun DIV (a b) (if (< a b) 0 (1+ (DIV (- a b) b))) )

V d 3: hm truy xu t ph n t th i trong 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

Cc hm nh p xu t
(Load <Tn t p tin>)
N p m t t p tin vo cho LISP v tr v T n u vi c n p thnh cng, ng c l i tr v NIL Tn t p tin theo quy t c c a DOS Dng load t p tin n p tp tin CT tr c khi g i l i th c hi n cc hm trong t p tin VD >(Load D:\btlisp\bai1.lsp)

44

Cc hm nh p xu t (tt)
(READ)
c d li u t bn phm cho n khi g phm Enter tr v k t qu l d li u c nh p t bn phm

(PRINT E)
In tra mn hnh tr bi u th c E ng th i xu ng dng tr v gi tr c aE

(PRINC E)
In ra mn hnh gi tr c a bi u th c E (khng xu ng dng) v tr v gi tr c a E

(TERPRI)
a con tr xu ng dng v tr v NIL

45

Bi n ton c c v bi n c c b
Bi n ton c c
L bi n m ph m vi c a n l t t c cc hm Hm (SETQ <tn bi n> <bi u th c>) VD >(setq x (* 2 3)) = 6 bi n x v n t n t i v c gi tr l 6

Bi n c c b
Ph m vi ch n m trong hm m n c t o ra Hm (LET ( (var1 E1) (var2 E2) ... (vark Ek)) Ek+1... En) VD >(Let ((a 3) (b 5)) (* a b) (+ a b)) = 8

46

Bi n ton c c v bi n c c b (tt)
Bi n c c b che bi n ton b
Khai bo bi n c c b trong hm LET gy kh khn cho vi c vi t chng trnh hn l s d ng bi n ton c c Gi i php: k t h p c hai hm LET v SETQ s d ng bi n c c b che bi n ton c c VD (LET ( (var E1)..) . (SETQ var E2) )
47

Bi n ton c c v bi n c c b (tt)
(defun giai_ptb2 () (let ((d 0) (e 0) (f 0)) (print Chng trnh gi i phng trnh 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 khi th c hi n xong chng trnh ny th cc bi n d, e v f c gi i phng

48

Exercise
1. Vi t hm c 3 i s v tnh tch c a hai s l n nh t 2. Vi t hm consp ki m tra xem i s c a n c ph i l m t danh sch khng r ng 3. Vi t hm tnh xn. 4. Vi t hm tnh di m t chu i. 5. Vi t hm th c hi n php n i hai chu i. (noi (1 2 3) (4 5) (1 2 3 4 5) 6. Vi t hm run c i s l m t danh sch cc s nguyn L, hm ny s tr v m t danh sch 2 chi u cc dy tng (run) trong L >(run (1 2 3 2 1 5 4 7)) = ((1 2 3) (2) (1 5) (4 7))
49

You might also like