You are on page 1of 27

TRNG I HC BCH KHOA KHOA CNG NGH THNG TIN

LP TRNH HM
V Trung Hng Hung.Vo-Trung@ud.edu.vn

Ni dung
Nguyn l lp trnh hm Ngn ng Scheme Kiu d liu phc hp K thut x l hm Cu trc d liu

Phng php
L thuyt

Nm c mc ch tng ni dung Cch thc tin hnh Nhng vn cn lu


Thc hnh

Thc hnh cc ni dung hc Nm c cc k nng lp trnh


Thc hin bo co

Ti liu tham kho


Gio trnh lp trnh hm (P.H. Khnh) Revised Report on Algorithmic Language

Scheme, Richard Kelsey, Wiliam Clinger & Jonathan Rees Teach Yourself Scheme in Fixnum Days, Dorai Sitaram PLT DrScheme : Programming Env. Manual, http://www.drscheme.org/

Phn I

Nguyn l lp trnh hm

nh ngha ngn ng lp trnh


B k t (character set) B t vng (vocabulary)
T kha

Tn, nh danh Php ton ...


C php (syntax) Ng ngha (semantic)

Lp trnh mnh lnh


S dng nguyn l tinh ch tng bc

Khai bo d liu : tn bin - kiu Cc kiu d liu c bn : s, k t... Trng thi trong (b nh, thanh ghi) thay i bng lnh gn Trng thi ngoi (thit b ngoi vi) thay i bi cc lnh vo ra Cc cu trc iu khin D c hiu ng ph khi dng CT con

C s ca cc ngn ng hm (1)
Tnh khai bo

Ngn ng mnh lnh :


begin GetData (...); ProcessData(...); OutputData(...); end

Ngn ng lp trnh hm
(print (process-data (get-data (...))))

C s ca cc ngn ng hm (2)
c im

L NNLT bc cao tru tng hn t s dng cc bin ton cc Ngi s dng quan tm n vic nh ngha cc hm ton hc d suy lun m khng quan tm n vn ci t Ngn ng lp trnh hm da trn vic tnh ton gi tr ca biu thc t bn ngoi li gi hm Mt hm c th c hoc khng c i s

C s ca cc ngn ng hm (3)
c im

Kt qu mt hm khng ph thuc vo thi im hm c gi


f(x) + f(x) = 2 * f(x) ?

Khng th thay i gi tr mt phn t ca mng Hn ch trong giao tip gia h thng tng tc vi HH v NSD

C s ca cc ngn ng hm (3)
Cc khi nim c bn trong LTH

Hm (function) Danh sch (list) Kiu (type) Tnh a kiu (polymorphism) Cc hm bc cao (higher-order function) Tham i ho tng phn (currying) Cc hm theo kiu khn ngoan (lazy-evalation) Phng trnh (equation)

Ngn ng Miranda
Gii thiu

Do David Turner pht trin nm 1986 Trnh thng dch chy trn Unix c im : thun tu hm
nh ngha hm

C php
<tn hm> ::<min xc nh> -><min gi tr> <tn hm>[<danh sch tham i>]=<biu thc> [<iu kin>]

Ngn ng Miranda
nh ngha hm

V d : i Fahrenheit --> Celsius


celsius :: num -> num celsius f = (f - 32) * 5 / 9

S dng :
celsius 68 --> 20

Ngn ng Miranda
nh ngha hm

V d : tnh c s chung ln nht gcd (greatest common divisor)


gcd :: num -> num gcd a b = gcd (a-b) b, if a>b = gcd a (b-a), if b>a = a, if a=b

S dng :
gcd 4 2 --> 2

Ngn ng Miranda
V d : tnh giai tha
fac :: num -> num fac n = 1, if n=0 fac x = x * fac(x - 1), otherwise

S dng :
fac 4 --> 24

Ngn ng Miranda
V d : tm nghim phng trnh bc 2
ptbac2 a b c = error "PT vo nghiem", if delta<0 = [-b/(2*a)], if delta=0 = [-b/(2*a)] + radix/(2*a), otherwise = [-b/(2*a)] - radix/(2*a), otherwise where delta=b*b-4*a*c and radix=sqrt delta

S dng :
ptbac2 2 1 -3 --> 1 -1.5

Ngn ng Miranda
Danh sch

y l cu trc d liu quan trng nht ca cc ngn ng lp trnh hm


[1, 4, 9, 16] II danh sch gm 4 s nguyn [1..10] II danh sch gm 10 s nguyn ['a', 'b', 'c'] II danh sch gm 3 k t [] II danh sch rng weekdays=["Mon", "Tue", "Wed", "Thur", "Fri"]

Dng nhn bit c : [body I qualifiers]


[n | n <- [1..10] : n mod 2 = 1] --> [1, 3, 5, 7, 9]

Ngn ng Miranda
Danh sch

Mt s cc php ton trn danh sch


product [...] : tnh tch
fac n = product [1..n]

sum [...] : tnh tng


resul = sum [1, 3..100]

hd [...] : tr v phn t u tin


hd [1, 3, 100] --> 1

tl [...] : tr v danh sch cc PT th 2 -->


tl [1, 3, 2, 5] --> [3, 2, 5]

: [...] : chn 1 PT vo u danh sch


0 : [1, 3, 2, 5] --> [0, 1, 3, 2, 5]

Ngn ng Miranda
Danh sch

Vit li mt s hm
length L = 0, if L = [] length L = 1 + length (tl L), otherwise concat L1 L2 = L2, if L1 = [] concat L1 L2 = L1, if L2 = [] concat L1 L2 = (hd L1) : concat (tl L1) L2, otherwise

Ngn ng Miranda
Php so khp

Mt hm c th nh ngha bng nhiu biu thc v phi khc nhau C php tng qut :
<pattern> = <expression>, <condition>

V d : tnh dy Fibonacci
fib 0 = 0 fib 1 = 1 fib (n+2) = fib (n+1) + fib n

Ngn ng Miranda
Php so khp

V d : tnh di chui
length [] = 0 length (a : L) = 1 + (length L) V d : tnh tng ca mng sum [] = 0 sum [a : X] = a + sum X

V d : tnh tch ca mng


product [] = 1 product [a : X] = a * product X

Ngn ng Miranda
Phng php currying (tham i ho tng

phn - partial parametrization)

Cho hm n bin : f(x1, x2,..., xn) C th vit li : x1-->(x2-->...(xn-->f(x1..xn))...)) Mt hm nhiu hn 1 tham i th c th tham i ho tng phn
triple x = 3 * x hoc triple = multi 3

Ngn ng Miranda
Kiu v tnh a kiu (polymorphic)

Cc ngn ng hm thng khng s dng nh kiu Cho php nh ngha cc hm a kiu vi li gi c cc tham i c cc kiu d liu khc nhau V d
pair x y = [x, y]

S dng
pair 1 2 --> [1, 2] pair true false --> [true, false]

Ngn ng Miranda
Tnh hm theo kiu khn ngoan

Thng thng khi tnh gi tr mt hm, cc tham i c tnh gi tr trc --> tnh gi tr ca hm
mult (fac 3) (fac 4) --> mul 6 24 --> 144

Rt gn biu thc --> n gin hn : rt gn theo th t p dng


mult (fac 3) (fac 4) --> (fac 3) * (fac 4)

V d
cond b x y = x, if b cond b x y = y, otherwise

Ngn ng Miranda
Tnh hm theo kiu khn ngoan

V d : tnh fac vi cond


fac n = cond (n = 0) 1 (n * fac (n-1)) --> nu tham i th 3 lun c tnh th hm trong Miranda ch tnh gi tr tham i khi cn Ex : fac 1 --> cond (1=0) 1 (1*fac (1-1)) II gi fac --> if (1=0) then 1 else (1*fac (1-1)) II gi cond --> if false then 1 else (1*fac (1-1)) II tnh 1=0 --> 1*fac (1-1) --> 1*(cond (1-1=0) 1 ((1-1)*fac ((1-1)-1))) --> ...

Ngn ng Miranda
Mt vi v d :

Loi b nhng phn t trng nhau


uniq [] = [] uniq (a:(a:L) = uniq (a:L) uniq (a:L) = a : uniq L Ex : uniq [3, 3, 4, 6, 6, 6, 6, 7] --> [3, 4, 6, 7] uniq ['a', 'b', 'b', 'c', 'c'] --> ['a', 'b', 'c']

Ngn ng Miranda
Mt vi v d :

Sp xp nhanh
quicksort [] = [] quicksort (x:Tail) = quicksort [a a <-- Tail :a<x] quicksort [a a <-- Tail :a>x] Ex : Quicksort [5, 2, 9, 1] --> [1, 2, 5, 9]

You might also like