M t ngôn ng th tác operational hay không khai báo non-declarative, đó là các ngôn ng m nh l nh... m nh l nh và các ngôn ng khai báo, không ph i luôn luôn rõ ràng.. − S d ng ch ng trình
Trang 1i
Trang 3CH NG I NGUYÊN LÝ L P TRÌNH HÀM
« The primary purpose of a programming language
is to help the programmer in the practice of his art » Charle A Hoare (Hints on programming language design, 1973)
I.1 M đ u v ngôn ng l p trình
Bu i ban đ u
ngôn ng máy (machine language), t h p c a các con s h hai, hay h nh phân, hay
các bit (vi t t t c a binary digit) 0 và 1 Ngôn ng máy ph thu c hoàn toàn vào ki n
m t t h p các s h hai nên g p r t nhi u khó kh n, m t nh c, r t d m c ph i sai sót, nh ng
Ngôn ng máy ti n g n đ n ngôn ng t nhiên
C ng t nh ng n m 1950, ngôn ng h p d ch, hay h p ng (assembly) hay c ng còn
đ c g i là ngôn ng bi u t ng (symbolic) ra đ i Trong h p ng , các mã l nh và đ a ch
h p ng v n còn ph thu c vào ph n c ng và xa l v i ngôn ng t nhiên (natural language),
(Comon Business Oriented Language) n m 1964, Simula n m 1964, v.v
1
Trang 4Phát tri n c a ngôn ng l p trình
Theo s phát tri n c a các th h máy tính, các ngôn ng l p trình c ng không ng ng
đ c c i ti n và hoàn thi n đ càng ngày càng đáp ng nhu c u c a ng i s d ng và gi m
toán (theory of computation) và hình thành hai lo i ngôn ng : ngôn ng b c th p và ngôn
ng b c cao
đ vi t các ch ng trình đi u khi n và ki m tra thi t b , ch ng trình s a l i (debugger) hay công c
công vi c l p trình t lúc phân tích, thi t k cho đ n s d ng m t ngôn ng l p trình
m t v n ph m g m b n thành ph n : b ký t , b t v ng, cú pháp và ng ngh a
1 B ký t (character set)
2 B t v ng (vocabulary)
Trang 53 Cú pháp (syntax)
đúng (statement hay instruction), k t h p các câu l nh đúng thành m t ch ng trình hoàn
Backus-Naur (Backus-Naur Form, vi t t t BNF), ho c d ng chu n Backus-Naur m r ng
Ví d I.1.1 : Trong ngôn ng Pascal (ho c trong ph n l n các ngôn ng l p trình), tên g i,
hay đ nh danh (identifier) có s đ cú pháp nh sau :
ch ho c s tu ý, ch ch có th là m t trong các ch cái A Za z, s ch có th là m t trong các ch s 0 9 Nh v y, Delta, x1, x2, Read, v.v là các tên vi t đúng, còn 1A, β, π, bán kính, v.v đ u không ph i là tên vì vi ph m quy t c cú pháp
đ c đ nh ngh a b i) và v ph i V trái là m t ký hi u ph i đ c đ nh ngh a, còn v ph i là
<statement> ::= <assignment> | <loop>
<assignment> ::= <identifier> := <expression> ;
Trang 6<loop> ::=
while <expression> do <statement>+ done
<expression> ::=
<value> | <value> + <value> | <value> <= <value>
<identifier> ::=
<letter>|<identifier><letter>|<identifier><digit>
yêu c u đ t ra ban đ u
đ c g i là ch ng trình ngu n (source program)
chính các ngôn ng b c cao ho c các công c chuyên d ng
trình thông d ch, ho t đ ng nh sau :
•
r i ti n hành th c hi n luôn câu l nh đã d ch đó, cho t i khi th c hi n xong toàn b
Có th hi u trình biên d ch là d ch gi , trình thông d ch là thông d ch viên
Trang 7Nh ng ngôn ng l p trình c p cao ch đ biên d ch hay g p là : Fortran, Cobol, C,
I.1.4 Phân lo i các ngôn ng l p trình
tr ng (measure of emphasis), theo th h (generation), v.v
ph n c ng, ch ng h n nh l nh (instructions) và c p phát b nh (memory allocation)
Truy c p và c p phát nh các phép toán, ch ng h n new
FORTRAN, ALGOL, Pascal, C, Ada
Hình I.2 Ba m c c a ngôn ng l p trình
Nh ng n m g n đây, ngôn ng l p trình đ c phát tri n theo ph ng th c l p trình (còn đ c g i
là phong cách hay ki u l p trình) M t ph ng th c l p trình có th đ c hi u là m t t p h p các tính
th ng xuyên s d ng chúng S đ sau đây minh ho s phân c p c a các ph ng th c l p trình :
Lôgic
X lý song song
đ i t ng
Th t c
Hình I.3 Phân c p c a các ph ng th c l p trình
Sau đây là m t s ngôn ng l p trình quen thu c li t kê theo ph ng th c :
Các ngôn ng m nh l nh (imperative) có Fortran (1957), Cobol (1959), Basic (1965),
Các ngôn ng x lý song song (parallel) nh Ada, Occam (1982), C-Linda,
Trang 8L p trình phân b (distributed programming)
L p trình h ng truy c p (access-oriented programming)
L p trình theo lu ng d li u (dataflow programming), v.v
đ c g i là ngôn ng đ nh ngh a (definitional) hay khai báo (declarative) M t ngôn ng th
tác (operational) hay không khai báo (non-declarative), đó là các ngôn ng m nh l nh.
Hình I.4 Phát tri n c a ngôn ng l p trình
Th h 5 : ngôn ng suy di n hay d a logic
Th h 6 : m ng n -ron (neural networks)
Trang 9Tr c khi nghiên c u l p các ngôn ng l p trình hàm, ta c n nh c l i m t s đ c đi m
c a l p các ngôn ng l p trình m nh l nh
I.1.5 Ngôn ng l p trình m nh l nh
Hình I.5 Quan h gi a tên bi n, ki u và giá tr trong ngôn ng m nh l nh
Hình I.5 minh h a cách khai báo d li u trong các ngôn ng m nh l nh và các m i quan
l nh v a khai báo v a kh i gán int i=5) T h p tên, ki u và giá tr đã t o nên đ c tr ng
c a bi n
nào S khác nhau gi a «nh th nào» và «cái gì», c ng nh s khác nhau gi a các ngôn ng
Trang 10m nh l nh và các ngôn ng khai báo, không ph i luôn luôn rõ ràng Các ngôn ng khai báo
d li u đã đ c đ t tên
các khai báo, ho c toàn c c (global), ho c c c b (local)
− Các ki u d li u c b n thông d ng là s nguyên, s th c, ký t và lôgic Các ki u m i
đ c xây d ng nh các ki u c u trúc Ví d ki u m ng, ki u b n ghi, ki u t p h p,
ki u li t kê,
đ ng n u có cùng giá tr và có cùng phép toán x lý
(thi t b ngo i vi) b thay đ i b i các l nh vào-ra Giá tr đ c tính t các bi u th c
− Ch ng trình con th ng có hai d ng : d ng th t c (procedure) và d ng hàm
(function) S khác nhau ch y u là hàm luôn tr v m t giá tr , còn th t c thì không
trình con ho c theo tr (by value) và theo tham chi u (by reference)
− S d ng ch ng trình con th ng gây ra hi u ng ph (side effect) do có th làm thay
Trang 11Các ngôn ng hàm là c ng các ngôn ng b c cao, mang tính tr u t ng h n so v i các ngôn ng m nh l nh
đ n (correctness proof), c n tr t i u hóa (optimization), và c n tr quá trình song song t
đ ng (automatic parrallelization) c a ch ng trình
M t ngôn ng hàm, hay ngôn ng áp d ng (applicative language) d a trên vi c tính giá
tr thu c m t mi n khác (range hay co-domain)
t ng (phép +) c a hai tham đ i là 2 và 3
đ c g i, mà ch ph thu c vào cách g i nó nh th nào đ i v i các tham đ i
Trong ngôn ng l p trình m nh l nh, k t qu c a bi u th c :
f(x) + f(x)
có th khác v i k t qu :
2 * f(x)
ngôn ng l p trình hàm, c hai bi u th c trên luôn có cùng giá tr
Do các hàm không ph thu c nhi u vào các bi n toàn c c, nên vi c l p trình hàm s d
hi u h n l p trình m nh l nh Ví d gi s m t trình biên d ch c n t i u phép tính :
f(x) + f(x)
thành :
2 * f(x)
nh t quán trong k t qu tr v c a hàm Tuy nhiên, m t trình biên d ch ngôn ng m nh l nh,
không ph thu c vào các bi n đã b thay đ i trong quá trình th c hi n b i l i g i th nh t
1
Ada là ngôn ng l p trình b c cao đ c phát tri n n m 1983 b i B Qu c phòng M (US Department of Defense), còn g i là Ada 83, sau đó đ c phát tri n b i Barnes n m 1994, g i là Ada 9X Ngôn ng Ada l y tên
c a nhà n Toán h c ng i Anh, Ada Augusta Lovelace, con gái c a nhà th Lord Byron (1788−1824) Ng i
ta tôn vinh bà là ng i l p trình đ u tiên
Trang 12M t trình biên d ch song song s g p ph i v n đ t ng t n u trình này mu n g i hàm theo ki u g i song song
Bên c nh tính u vi t, ta c ng c n xem xét nh ng b t l i v n có c a l p trình hàm :
vi c mô t các c u trúc d li u và khó th c hi n quá trình vào/ra d li u
b ng ngôn ng m nh l nh
Ch ng h n ta xét m t hàm P s d ng m t bi n c c b x và tr v m t giá tr có ki u b t
function P(n: integer) −> SomeType ;
và thay th giá tr m i cho ph n t này Cách ti p c n này kém hi u qu h n so v i phép gán cho ph n t
Trang 13Tóm l i, ngôn ng hàm d a trên vi c tính giá tr c a bi u th c Các bi n toàn c c và phép
ngoan 2 (lazy evaluation), ph ng trình (equations), so kh p (patterm matching)
Các hàm đ quy (recursive functions) là m t trong nh ng khái ni m chính trong ngôn ng
đ c g i là m t «script», là m t t p h p các ph ng trình (equation) đ c đ nh ngh a theo
đ i đã nh n mà thôi
ngh a hàm Ph n khai báo có th v ng m t có d ng m t nguyên m u hàm :
<tên hàm> :: <mi n xác đ nh> -> <mi n giá tr >
ph i có th có m t đi u ki n đóng vai trò «lính gác» (guard) phân bi t đ ng cu i :
<tên hàm> [ <danh sách tham đ i> ] = <bi u th c> [ <đi u ki n> ]
Miranda nh sau :
2
Trong cu n sách có nhi u thu t ng ti ng Vi t do tác gi t d ch t ti ng Anh
Trang 14Dòng đ u tiên khai báo celsius là m t hàm nh n m t đ i s và tr v m t giá tr s
ki u đ quy nh sau :
fac :: num −> num
function fac (n: integer) : integer ;
+bx+c=0 :
Trang 15where delta = b*b - 4*a*c and radix = sqrt delta
I.2.3 Danh sách
Trong h u h t các ngôn ng hàm, danh sách (list) là c u trúc d li u quan tr ng nh t
[1 10] || danh sách 10 s nguyên (1 10)
nguyên week_days = ["Mon","Tue","Wed","Thur","Fri"]
đ nh ngh a nh v y đ c g i là nh n bi t đ c hay ng m hi u (list comprehension) Ví d ,
perms L = [ a:T | a <- L : T <- perms (L [a]) ]
Miranda :
Trang 16fac n = product [1 n]
vi n c a Miranda :
result = sum [1, 3 100]
đ nh ngh a Các phép toán s c p nh t là xây d ng (construction) và phân tách
(length) m t danh sách, phép ghép (concatenate) ++ (hai d u c ng liên ti p) các danh sách,
Trang 17length L = 0, if L = [] || danh sách r ng có đ dài 0
|| danh sách khác r ng có ít nh t m t ph n t
length L = 1 + length (tl L), otherwise
concatenate L1 L2 = L2, if L1 = []
concatenate L1 L2
= (hd L1):concatenate (tl L1) L2, otherwise
đ u tiên ch cách thoát ra kh i hàm, theo ki u chia đ tr (divide and conquer) Trong tr ng
h p ghép m t danh sách r ng (if L1 = []) v i m t danh sách b t k khác (L2) thì tr v
k t qu chính là danh sách này và quá trình k t thúc
d ng phép toán cons (otherwise) theo ki u đ quy Do danh sách th nh t L1 ≠ [] nên L1 có ít nh t m t ph n t Khi đó danh sách m i (là danh sách k t qu ) đ c t o ra b i ph n
l i c a L1 và tham đ i th hai là toàn b L2 Quá trình c th ti p t c cho đ n khi danh sách còn l i r ng
Ta có th so sánh cách xây d ng các danh sách trong các ngôn ng m nh l nh v i ngôn
ng Miranda
allocation) Các phép toán trên danh sách là s thao tác m c th p trên các con tr Vi c c p
(hook) hai danh sách v i nhau nh m t phép gán con tr , mà không c n xây d ng m t danh
danh sách th nh t
phát b nh M c d u nh ng y u t này là t n t i trong ngôn ng hi n hành, nh ng chúng
đ c che d u m t cách hi u qu đ i v i ng i l p trình t o nên m t m c tr u t ng có l i
Trong nh ng tình hu ng nh v y, m t h th ng th i gian th c hi n RST (Run Time
System) qu n lý b nh l u tr các ph n t c a danh sách RTS cho phép c p phát b nh khi
chúng
employee = ("Kim",True, False , 29)
Các ph n t ki u tuple không có th t Vi c truy c p đ n m t ph n t ch có th đ c
th c hi n nh phép so kh p (pattern matching)
Trang 18I.2.4 Phép so kh p
otherwise hay while Tuy nhiên, Miranda cho phép s d ng m t cú pháp t ng quát đ
l a ch n gi a các kh n ng d a trên các m u (patterns) d ng :
<patterm> = <expression>, <condition>
đ i là l n h n ho c b ng 1 Khi đó giá tr c a n đ c l y giá tr c a tham đ i tr đi 1 m t
Trang 19sách tham đ i và do đó, L là danh sách còn l i tr thành tham đ i m i c a hàm K t qu l i
reverse (a:L) = reverse L ++ [a]
có hai ph n t :
fst (a, b) = a || truy c p đ n m t ph n t th nh t
snd (a, b) = b || truy c p đ n m t ph n t th hai
drop (n+1) (a:L) = drop n L
take n L ++ drop n L = L
ph n (partial parametrization)
lên hai đ i x y), vi t quy c (x, y) → f(x, y), thì c ng đ c xem nh vi t (f x) y, ngh a là k t
qu c a vi c áp d ng f cho x là m t hàm đ áp d ng cho y Ta vi t x → (y → f (x, y))
M t cách t ng quát cho hàm n bi n f (x 1 , x 2 , , x n) :
x 1→ (x 2→ (x 3→ (x n→ f (x 1 , ,x n )) ))
mult x y = x * y
N u hàm mult đ c g i v i hai đ i s , thì mult s tính tích s c a hai đ i s này, theo
th hai y)
Trang 20M t cách t ng quát, m t hàm nào đó có nhi u h n m t tham đ i có th đ c tham đ i
bi u th c b c cao h n
answer t các l nh Miranda sau đây :
answer = twice twice twice suc 0
twice f x = f(f x)
suc x = x + 1
cao Ch ng h n t hàm th vi n member x L ki m tra danh sách L có ch a ph n t x không (k t qu là true ho c false), ta có th áp d ng đ đ nh ngh a các hàm khác nhau
nh sau :
vowel = member ['a', 'e', 'i', 'o', 'u']
digit =
member ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] month =
member [ "Jan", "Feb", "Mar", "Apr", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec" ]
các ph n t c a m t danh sách Miranda có hàm foldr đ c đ nh ngh a nh sau :
Trang 21and = foldr (&) true
g i phép « và» lôgích cho t t c các ph n t c a m t danh sách K t qu phép g i hàm and
L là true n u m i ph n t c a danh sách L đ u là true, k t qu là false n u ng c l i
reverse = foldr postfix []
where postfix a L = L ++ [a]
ngh a nh ng hàm b c cao m nh và t ng quát nh hàm foldr v a xét
M t hàm b c cao quan tr ng khác là map f L v i f là m t hàm và L là m t danh sách Hàm map tr v k t qu là m t danh sách m i g m các ph n t c a L đã đ c áp d ng cho hàm f Ví d :
map triple [1, 2, 3, 4]
> [triple 1, triple 2, triple 3, triple 4]
> [3, 6, 9, 12]
Trang 22I.2.7 Ki u và tính đa ki u
Các ngôn ng hàm có m t h th ng ki u d li u hoàn toàn khác v i các ngôn ng m nh
trình
functions) v i l i g i có các tham đ i có các ki u d li u khác nhau
trong Miranda là num, bool và char Ki u num không phân bi t s nguyên hay s th c
Ki u bool có hai giá tr h ng là true và false Ki u char g m các ký t ASCII M t
’x’, ’&’, ’\n’, v.v
N u T là m t ki u, thì [T] là m t ki u danh sách g m các ph n t ki u T Ví d danh sách sau đây :
[[1, 2], [2, 3], [4, 5]]
có ki u [[num]] vì đây là m t danh sách g m các ph n t là danh sách các s M t h ng chu i có d ng [ char ], ch ng h n chu i «bonjour» đ c vi t trong Miranda [’b’,
’o’, ’n’, ’j’, ’o’, ’u’, ’r’]
N u T1, , Tn là các ki u nào đó, n>0, thì (T1, , Tn) là m t ki u b n ghi, hay b n
ph n t b t k Ví d b 3 (true, ”Honda”, 7331) có ki u (bool, [char], num)
N u T1 và T2 là hai ki u nào đó, thì T1->T2 là m t ki u hàm v i tham đ i có ki u T1
num −> num
Chú ý phép −> có k t h p ph i (right associative)
báo ki u currying nh sau :
mult :: num −> (num −> num)
Có ngh a r ng mult đ c xem là hàm có m t tham đ i tr v m t hàm khác có ki u : num −> num
sq :: num -> num
sq n = n * n
triple x = 3 * x
Trang 23thì b ki m tra ki u s suy ra r ng x ph i là m t s , vì x là m t th a s trong m t phép nhân
c a hàm này ph i là :
triple :: num −> num
th c (formal parameters), m t hàm đa ki u có th ch p nh n l i g i t ng ng v i nhi u
tham đ i th c s (actual parameters) có các ki u khác nhau Khác v i các th t c trong Ada,
nh bool, num, [num], v.v , sao cho c hai tham đ i đ u ph i có cùng m t ki u Nh v y,
fac :: num -> num
ack :: num -> num-> num
sum :: [num] -> num
month :: [char] -> bool
Trang 24Các quy t c đ nh ngh a ki u nh trên làm tránh đ c sai sót khi s d ng hàm không đúng,
ch ng h n :
5 + (pair 1 2) || ki u k t qu là m t danh sách, không là m t s
Trong ví d th hai, Miranda xem r ng ki u c a (pair 1 2) là m t danh sách các s ,
sai sót khi s d ng hàm
I.2.8 Tính hàm theo ki u khôn ngoan
đó m i ti n hành th c hi n tính toán trong hàm Ch ng h n, l i g i :
mult (fac 3) (fac 4)
mult 6 24
đ cho k t qu cu i cùng là 144 Cách vi t rút g n bi u th c lúc đ u thành d ng đ n gi n h n
đ c g i là phép rút g n theo th t áp d ng (applicative order reduction) Chú ý r ng phép
ti n
Gi s r ng ta mu n xây d ng hàm cond nh n m t giá tr bool b nh là tham đ i th
b là false :
cond b x y = x, if b
cond b x y = y, otherwise
hay g n h n :
Trang 25cond cho m t đ nh ngh a khác c a hàm fac :
fac n = cond (n = 0) 1 (n * fac (n - 1))
B i vì l i g i fac 1 kéo theo l i g i fac 0, l i g i fac 0 s kéo theo l i g i fac − 1
và c th ti p t c
thi t, nh ng bi u th c nào không c n thi t thì b qua
bi u th c if d ng gi ng (pseuclo-notation) Tham đ i th ba c a cond s không đ c
fac 1
> if (1=0) then 1 else (1*fac (1-1)) || g i cond
> if false then 1 else (1*fac (1-1)) || tính 1 = 0
> 1*fac (1-1)
> 1*((if 1-1=0) then 1 else ((1-1)*fac ((1-1)-1)))
|| g i cond > 1*((if true then 1 else ((1-1)*fac ((1-1)-1)))
|| tính 1-1 = 0
> 1
Trang 26> 2 || ph n t th hai
hd (tl (map triple [1 ]))
Th c t , ngôn ng Miranda ch cho phép xây d ng các danh sách h u h n Ch khi toàn
ho c :
where sieve (p:x)=p : sieve [n|n<-x: n mod p>0 ]
có th tính m t bi u th c m t nhi u l n, trong khi phép rút g n theo th t áp d ng ch tính
nh ng không tính nhi u l n
Trang 27t ng chi phí tính giá tr hàm theo ki u khôn ngoan cao h n bình th ng Hi n nay, ng i ta đang phát tri n các ph ng pháp t i u nh m gi m t ng chi phí này
bi t cho phép tính giá tr tham đ i th hai ch khi c n thi t
I.2.9 M t s ví d
quân h u và tìm dãy s Hamming
1 Lo i b nh ng ph n t trùng nhau
Ta c n xây d ng hàm uniq nh n m t danh sách các ph n t đã đ c s p x p đ tr v
th hai s d ng kh n ng th hi n m t bi n (a) hai l n trong cùng m t v trái M t khi dòng
đ c ch n Dòng này này c ng t o ra m t l i g i đ quy v i ph n t đ u tiên c a danh sách
là cái ra c a nó Ch ng h n danh sách [3, 4, 5] d n đ n ch còn ph i x lý [4, 5]
c a danh sách, g i là x Ti p theo, quicksort t o ra hai danh sách con, m t danh sách ch a các giá tr nh h n ho c b ng x, và m t danh sách ch a giá tr l n h n x M i m t danh sách
đ c s p x p m t cách đ quy (b ng cách g i l i quicksort) Cu i cùng, các danh sách k t
Trang 28qu và giá tr x đ c ráp l i v i nhau và tr v k t qu là danh sách đã đ c s p x p Ph n t
đ c g i là ph n t tr c (pivot)
là danh sách t t c các ph n t a c a danh sách Tail có giá tr nh h n ho c b ng x Ti p
ch a m i ph n t x đ c ráp l i v i nhau b ng cách s d ng phép ghép danh sách ++
ki u, có d ng :
quicksort :: [a] −> [a]
3 Bài toán tám quân h u
Hình I.6 M t l i gi i c a bài toán tám quân h u
Trang 29Bài toán tám quân h u đ c nhà Toán h c ng i c Call Friedrich Gauss đ a ra vào
đ c nhi u ng i gi i tr n v n trên máy tính đi n t , theo nhi u cách khác gi i nhau
th bi u di n bàn c b i m t danh sách các s nguyên cho bi t v trí hàng c a m i quân h u
đ đ t các quân h u trên n c t đ u tiên
4 Bài toán Hamming
x p và không cho phép các s trùng nhau
Hình I.7 Gi i bài toán Hamming nh các quá trình gi i song song
Có th gi i thích bài toán Hamming m t cách tinh t h n b ng cách s d ng m t mô hình
x lý song song nh trong Hình I.7 Mô hình s d ng ba quá trình nhân, m i quá trình nh n
m t dòng giá tr vào gi ng nhau và t o ra m t dòng ra phân bi t
Trang 30m t dòng k t qu ra đ u đã đ c s p x p theo th t t ng d n M t quá trình th t làm
trình nhân
Hamming theo dãy t ng d n và không ch a các s trùng nhau
Hamming
mul :: num −> [num] −> [num] || nhân các ph n t
ham = 1 : merge3 (mul 2 ham) (mul 3 ham) (mul 5 ham)
Hàm mul th c hi n phép nhân b ng cách nhân t t c các giá tr trong danh sách s v i
đ i, nh ng ch ng trình s đ c b t đ u b i l i g i ham Phép tr n ba dòng (3-way merge)
đ c xem nh là phép tr n c a hai dòng (2-way merge) :
merge3 x y z = merge2 x (merge2 y z)
= (x:merge2 xs (y:ys)), if x<y
= (x:merge2 xs ys), if x=y || lo i b s trùng nhau
= (y:merge2 (x:xs) ys), if x>y
trong th vi n c a ngôn ng Miranda
vòng l p vô h n Tuy nhiên v i k thu t tính giá tr hàm theo ki u khôn ngoan, h th ng s tìm cách rút g n hàm merge3 và ch tính giá tr các đ i s c a nó khi th c s c n thi t
Trang 31I.3 K t lu n
Common Lisp, Hope, Standard ML, Miranda, Haskell và Lucid Ph n ti p theo c a giáo trình này s nghiên c u Scheme, m t ngôn ng hàm có ngu n g c t Lisp
không ph i là ngôn ng hàm thu n túy, mà cho phép s d ng các phép gán cho bi n, và do
v y, có th x y ra hi u ng ph
applications), đ c bi t trong l nh v c trí tu nhân t o (artificial intelligence) i v i các phép
đây Cú pháp c a Lisp r t đ n đi u (uniform), tuy nhiên, đi u này giúp cho vi c l p trình và
Lisp
danh sách có th ch a nhi u ki u ph n t khác nhau i u tho i mái này có th có l i trong
bi n (dynamic binding) nên r t d gây ra s l n x n, nh m l n khi s d ng bi n
thi t k các ngôn ng hàm Các ngôn ng th a k Lisp s d ng h th ng ki u, cho phép s
d ng các k thu t tính giá tr hàm theo ki u khôn ngoan và so kh p
Trang 32Tóm t t ch ng 1
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 thi u 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
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 k t
đ i, d mô ph ng song song và d ch ng minh tính đúng đ n
trình
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 (predefined)
ti n hành t đ ng theo k thu t d n rá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
m u đã cho
Các ngôn ng hàm không thu n túy (impure functional languages) 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