Professional Documents
Culture Documents
Informtica (201011)
2 / 27
3 / 27
Estrategias de evaluacin
I
4 / 27
Se considera la funcin
Evaluacin:
mult (1+2) (2+3)
= mult 3 (2+3)
= (y 3*y) (2+3)
= (y 3*y) 5
= 3*5
= 15
[por
[por
[por
[por
[por
def.
def.
def.
def.
def.
de
de
de
de
de
+]
mult]
+]
+]
*]
5 / 27
6 / 27
Definicin de infinito
inf :: Int
inf = 1 + inf
I
Evaluacin de infinito:
inf
= 1 + inf
= 1 + (1 + inf)
= 1 + (1 + (1 + inf))
= ...
7 / 27
8 / 27
9 / 27
10 / 27
I
I
unos :: [Int]
unos = 1 : unos
I
Evaluacin:
unos
= 1 : unos
[por def. unos]
= 1 : (1 : unos)
[por def. unos]
= 1 : (1 : (1 : unos)) [por def. unos]
= ...
Evaluacin en Haskell:
*Main> unos
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,...
13 / 27
Evaluacin impaciente:
head unos
= head (1 : unos)
= head (1 : (1 : unos))
= head (1 : (1 : (1 : unos)))
= ...
Evaluacin perezosa:
head unos
= head (1 : unos) [por def.
= 1
[por def.
Evaluacin Haskell:
*Main> head unos
1
unos]
head]
14 / 27
Programacin modular
I
I
Ejemplo de no terminacin:
*Main> [1..]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,...
Ejemplo de terminacin:
*Main> take 3 [1..]
[1,2,3]
Ejemplo de no terminacin:
*Main> filter (<=3) [1..]
[1,2,3 C-c C-c Interrupted.
Ejemplo de no terminacin:
*Main> takeWhile (<=3) [1..]
[1,2,3]
17 / 27
La criba de Erasttenes
I
La criba de Erasttenes
2 3 4 5 6 7 8
3
5
7
5
7
7
9
9
10
11
11
11
11
11
12
13
13
13
13
13
13
14
15
15
...
...
...
...
...
...
Definicin
primos :: [Int ]
primos = criba [2..]
criba :: [Int] -> [Int]
criba (p:xs) = p : criba [x | x <- xs, x `mod` p /= 0]
18 / 27
La criba de Erasttenes
I
Evaluacin:
take 15 primos
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]
Clculo:
primos
= criba [2..]
= criba (2 : [3..])
= 2 : (criba [x | x <- [3..], x `mod` 2 /= 0])
= 2 : (criba (3 : [x | x <- [4..], x `mod` 2 /= 0]))
= 2 : 3 : (criba [x | x <- [4..], x `mod` 2 /= 0,
x `mod` 3 /= 0])
= 2 : 3 : (criba (5 : [x | x <- [6..], x `mod` 2 /= 0,
x `mod` 3 /= 0]))
= 2 : 3 : 5 : (criba ([x | x <- [6..], x `mod` 2 /= 0,
x `mod` 3 /= 0,
x `mod` 5 /= 0]))
= ...
19 / 27
21 / 27
Evaluacin: :
sumaNE [2,3,5]
= sumaNE 0 [2,3,5]
= sumaNE (0+2) [3,5]
= sumaNE ((0+2)+3) [5]
= sumaNE (((0+2)+3)+5) []
= ((0+2)+3)+5
= (2+3)+5
= 5+5
= 10
[por
[por
[por
[por
[por
[por
[por
[por
def.
def.
def.
def.
def.
def.
def.
def.
sumaNE]
sumaNE]
sumaNE]
sumaNE]
sumaNE]
+]
+]
+]
22 / 27
23 / 27
Evaluacin: :
sumaE [2,3,5]
= sumaE 0 [2,3,5]
= (sumaE $! (0+2)) [3,5]
= sumaE 2 [3,5]
= (sumaE $! (2+3)) [5]
= sumaE 5 [5]
= (sumaE $! (5+5)) []
= sumaE 10 []
= 10
[por
[por
[por
[por
[por
[por
[por
[por
def. sumaE]
def. sumaE]
aplicacin de $!]
def. sumaE]
aplicacin de $!]
def. sumaE]
aplicacin de $!]
def. sumaE]
24 / 27
25 / 27
Plegado estricto
I
Bibliografa
1. R. Bird. Introduccin a la programacin funcional con Haskell.
Prentice Hall, 2000.
I