SlideShare une entreprise Scribd logo
1  sur  27
Télécharger pour lire hors ligne
Tema 10: Evaluación perezosa
          Informática (2010–11)


          José A. Alonso Jiménez

        Grupo de Lógica Computacional
Departamento de Ciencias de la Computación e I.A.
             Universidad de Sevilla
IM Tema 10: Evaluación perezosa




Tema 10: Evaluación perezosa

 1. Estrategias de evaluación

 2. Terminación

 3. Número de reducciones

 4. Estructuras infinitas

 5. Programación modular

 6. Aplicación estricta


                                  2 / 27
IM Tema 10: Evaluación perezosa
  Estrategias de evaluación




Tema 10: Evaluación perezosa

 1. Estrategias de evaluación

 2. Terminación

 3. Número de reducciones

 4. Estructuras infinitas

 5. Programación modular

 6. Aplicación estricta


                                  3 / 27
IM Tema 10: Evaluación perezosa
  Estrategias de evaluación




Estrategias de evaluación
         Para los ejemplos se considera la función

         mult :: (Int,Int) -> Int
         mult (x,y) = x*y
         Evaluación mediante paso de parámetros por valor (o por más
         internos):
               mult (1+2,2+3)
           = mult (3,5)         [por def. de +]
           = 3*5                [por def. de mult]
           = 15                 [por def. de *]
         Evaluación mediante paso de parámetros por nombre (o por más
         externos):
               mult (1+2,2+3)
           = (1+2)*(3+5)        [por def. de mult]
           = 3*5                [por def. de +]                         4 / 27
IM Tema 10: Evaluación perezosa
  Estrategias de evaluación




Evaluación con lambda expresiones
         Se considera la función

         mult' :: Int -> Int -> Int
         mult' x = y -> x*y

         Evaluación:
              mult’ (1+2) (2+3)
          = mult’ 3 (2+3)          [por   def.   de   +]
          = (λy → 3*y) (2+3)       [por   def.   de   mult’]
          = (λy → 3*y) 5           [por   def.   de   +]
          = 3*5                    [por   def.   de   +]
          = 15                     [por   def.   de   *]



                                                               5 / 27
IM Tema 10: Evaluación perezosa
  Terminación




Tema 10: Evaluación perezosa

 1. Estrategias de evaluación

 2. Terminación

 3. Número de reducciones

 4. Estructuras infinitas

 5. Programación modular

 6. Aplicación estricta


                                  6 / 27
IM Tema 10: Evaluación perezosa
  Terminación




Procesamiento con el infinito
         Definición de infinito

         inf :: Int
         inf = 1 + inf
         Evaluación de infinito en Haskell:
          *Main> inf
            C-c C-cInterrupted.
         Evaluación de infinito:
              inf
          = 1 + inf                  [por def. inf]
          = 1 + (1 + inf)            [por def. inf]
          = 1 + (1 + (1 + inf))      [por def. inf]
          = ...
                                                      7 / 27
IM Tema 10: Evaluación perezosa
  Terminación




Procesamiento con el infinito
         Evaluación mediante paso de parámetros por valor:
              fst (0,inf)
          = fst (0,1 + inf)               [por def. inf]
          = fst (0,1 + (1 + inf))         [por def. inf]
          = fst (0,1 + (1 + (1 + inf))) [por def. inf]
          = ...
         Evaluación mediante paso de parámetros por nombre:
              fst (0,inf)
          = 0             [por def. fst]
         Evaluación Haskell con infinito:
          *Main> fst (0,inf)
          0


                                                              8 / 27
IM Tema 10: Evaluación perezosa
  Número de reducciones




Tema 10: Evaluación perezosa

 1. Estrategias de evaluación

 2. Terminación

 3. Número de reducciones

 4. Estructuras infinitas

 5. Programación modular

 6. Aplicación estricta


                                  9 / 27
IM Tema 10: Evaluación perezosa
  Número de reducciones




Número de reducciones según las estrategias
         Para los ejemplos se considera la función

         cuadrado :: Int -> Int
         cuadrado n = n * n
         Evaluación mediante paso de parámetros por valor:
              cuadrado (1+2)
          = cuadrado 3          [por def. +]
          = 3*3                 [por def. cuadrado]
          = 9                   [por def. de *]
         Evaluación mediante paso de parámetros por nombre:
              cuadrado (1+2)
          = (1+2)*(1+2)         [por def. cuadrado]
          = 3*(1+2)             [por def. de +]
          = 3*3                 [por def. de +]
          = 9                   [por def. de *]               10 / 27
IM Tema 10: Evaluación perezosa
  Número de reducciones




Evaluación perezosa e impaciente
         En la evaluación mediante paso de parámetros por nombre los
         argumentos pueden evaluarse más veces que en el paso por valor.
         Se puede usar punteros para compartir valores de expresiones.
         La evaluación mediante paso de parámetros por nombre usando
         punteros para compartir valores de expresiones se llama
         evaluación perezosa.
         La evaluación mediante paso de parámetros por valor se llama
         evaluación impaciente.
         Evaluación perezosa del ejemplo anterior:
               cuadrado (1+2)
          = x*x con x = 1+2 [por def. cuadrado]
          = 3*3                   [por def. de +]
          = 9                     [por def. de *]
         Haskell usa evaluación perezosa.
                                                                           11 / 27
IM Tema 10: Evaluación perezosa
  Estructuras infinitas




Tema 10: Evaluación perezosa

 1. Estrategias de evaluación

 2. Terminación

 3. Número de reducciones

 4. Estructuras infinitas

 5. Programación modular

 6. Aplicación estricta


                                  12 / 27
IM Tema 10: Evaluación perezosa
  Estructuras infinitas




Programación con estructuras infinitas
         unos es una lista infinita de unos.

         unos :: [Int]
         unos = 1 : unos
         Evaluación:
              unos
          = 1 : unos             [por def. unos]
          = 1 : (1 : unos)       [por def. unos]
          = 1 : (1 : (1 : unos)) [por def. unos]
          = ...
         Evaluación 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
IM Tema 10: Evaluación perezosa
  Estructuras infinitas




Evaluación con estructuras infinitas
         Evaluación impaciente:
              head unos
          = head (1 : unos)                  [por def. unos]
          = head (1 : (1 : unos))            [por def. unos]
          = head (1 : (1 : (1 : unos)))      [por def. unos]
          = ...
         Evaluación perezosa:
              head unos
          = head (1 : unos) [por def.       unos]
          = 1                   [por def.   head]
         Evaluación Haskell:
          *Main> head unos
          1

                                                               14 / 27
IM Tema 10: Evaluación perezosa
  Programación modular




Tema 10: Evaluación perezosa

 1. Estrategias de evaluación

 2. Terminación

 3. Número de reducciones

 4. Estructuras infinitas

 5. Programación modular

 6. Aplicación estricta


                                  15 / 27
IM Tema 10: Evaluación perezosa
  Programación modular




Programación modular
        La evaluación perezosa permite separar el control de los datos.
        Para los ejemplos se considera la función
                                         Prelude
        take :: Int -> [a] -> [a]
        take n _ | n <= 0 = []
        take _ []               = []
        take n (x:xs)           = x : take (n-1) xs

        Ejemplo de separación del control (tomar 2 elementos) de los datos (una
        lista infinita de unos):
               take 2 unos
          = take 2 (1 : unos)        [por def. unos]
          = 1 : (take 1 unos)        [por def. take]
          = 1 : (take 1 (1 : unos)) [por def. unos]
          = 1 : (1 : (take 0 unos)) [por def. take]
          = 1 : (1 : [])             [por def. take]
          = [1,1]                    [por notación de listas]
                                                                                  16 / 27
IM Tema 10: Evaluación perezosa
  Programación modular




Terminación de evaluaciones con estructuras infinitas
         Ejemplo de no terminación:
          *Main> [1..]
          [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,...
         Ejemplo de terminación:
          *Main> take 3 [1..]
          [1,2,3]
         Ejemplo de no terminación:
          *Main> filter (<=3) [1..]
          [1,2,3 C-c C-c Interrupted.
         Ejemplo de no terminación:
          *Main> takeWhile (<=3) [1..]
          [1,2,3]

                                                               17 / 27
IM Tema 10: Evaluación perezosa
  Programación modular




La criba de Erastótenes
         La criba de Erastótenes
          2 3 4 5 6 7 8            9   10   11   12   13   14   15   ...
              3       5      7     9        11        13        15   ...
                      5      7              11        13             ...
                             7              11        13             ...
                                            11        13             ...
                                                      13             ...
         Definición

         primos :: [Int ]
         primos = criba [2..]

         criba :: [Int] -> [Int]
         criba (p:xs) = p : criba [x | x <- xs, x `mod` p /= 0]
                                                                           18 / 27
IM Tema 10: Evaluación perezosa
  Programación modular




La criba de Erastótenes
        Evaluación:
         take 15 primos    [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]
        Cálculo:
          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
IM Tema 10: Evaluación perezosa
  Aplicación estricta




Tema 10: Evaluación perezosa

 1. Estrategias de evaluación

 2. Terminación

 3. Número de reducciones

 4. Estructuras infinitas

 5. Programación modular

 6. Aplicación estricta


                                  20 / 27
IM Tema 10: Evaluación perezosa
  Aplicación estricta




Ejemplo de programa sin aplicación estricta
         (sumaNE xs) es la suma de los números de xs. Por ejemplo,
          sumaNE [2,3,5]        10

         sumaNE :: [Int] -> Int
         sumaNE xs = sumaNE' 0 xs

         sumaNE' :: Int -> [Int] -> Int
         sumaNE' v []     = v
         sumaNE' v (x:xs) = sumaNE' (v+x) xs




                                                                     21 / 27
IM Tema 10: Evaluación perezosa
  Aplicación estricta




Ejemplo de programa sin aplicación estricta
         Evaluación: :
              sumaNE [2,3,5]
          = sumaNE’ 0 [2,3,5]          [por   def.   sumaNE]
          = sumaNE’ (0+2) [3,5]        [por   def.   sumaNE’]
          = sumaNE’ ((0+2)+3) [5]      [por   def.   sumaNE’]
          = sumaNE’ (((0+2)+3)+5) []   [por   def.   sumaNE’]
          = ((0+2)+3)+5                [por   def.   sumaNE’]
          = (2+3)+5                    [por   def.   +]
          = 5+5                        [por   def.   +]
          = 10                         [por   def.   +]




                                                                22 / 27
IM Tema 10: Evaluación perezosa
  Aplicación estricta




Ejemplo de programa con aplicación estricta
         (sumaE xs) es la suma de los números de xs. Por ejemplo,
          sumaE [2,3,5]        10

         sumaE :: [Int] -> Int
         sumaE xs = sumaE' 0 xs

         sumaE' :: Int -> [Int] -> Int
         sumaE' v []     = v
         sumaE' v (x:xs) = (sumaE' $! (v+x)) xs




                                                                    23 / 27
IM Tema 10: Evaluación perezosa
  Aplicación estricta




Ejemplo de programa con aplicación estricta
         Evaluación: :
              sumaE [2,3,5]
          = sumaE’ 0 [2,3,5]          [por   def. sumaE]
          = (sumaE’ $! (0+2)) [3,5]   [por   def. sumaE’]
          = sumaE’ 2 [3,5]            [por   aplicación de $!]
          = (sumaE’ $! (2+3)) [5]     [por   def. sumaE’]
          = sumaE’ 5 [5]              [por   aplicación de $!]
          = (sumaE’ $! (5+5)) []      [por   def. sumaE’]
          = sumaE’ 10 []              [por   aplicación de $!]
          = 10                        [por   def. sumaE’]




                                                                 24 / 27
IM Tema 10: Evaluación perezosa
  Aplicación estricta




Comparación de consumo de memoria
         Comparación de consumo de memoria:
          *Main> sumaNE [1..1000000]
          *** Exception: stack overflow
          *Main> sumaE [1..1000000]
          1784293664
          *Main> :set +s
          *Main> sumaE [1..1000000]
          1784293664
          (2.16 secs, 145435772 bytes)




                                              25 / 27
IM Tema 10: Evaluación perezosa
  Aplicación estricta




Plegado estricto
         Versión estricta de foldl en el Data.List

         foldl' :: (a -> b -> a) -> a -> [b] -> a
         foldl' f a []     = a
         foldl' f a (x:xs) = (foldl' f $! f a x) xs
         Comparación de plegado y plegado estricto:s
          *Main> foldl (+) 0 [2,3,5]
          10
          *Main> foldl' (+) 0 [2,3,5]
          10
          *Main> foldl (+) 0 [1..1000000]
          *** Exception: stack overflow
          *Main> foldl' (+) 0 [1..1000000]
          500000500000
                                                       26 / 27
IM Tema 10: Evaluación perezosa
  Bibliografía




Bibliografía
    1. R. Bird. Introducción a la programación funcional con Haskell.
       Prentice Hall, 2000.
                 Cap. Cap. 7: Eficiencia.
    2. G. Hutton Programming in Haskell. Cambridge University Press,
       2007.
                 Cap. 12: Lazy evaluation.
    3. B. O’Sullivan, D. Stewart y J. Goerzen Real World Haskell.
       O’Reilly, 2008.
                 Cap. 2: Types and Functions.
    4. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J.E. Gallardo. Razonando
       con Haskell. Thompson, 2004.
                 Cap. 2: Introducción a Haskell.
                 Cap. 8: Evaluación perezosa. Redes de procesos.
    5. S. Thompson. Haskell: The Craft of Functional Programming,
       Second Edition. Addison-Wesley, 1999.
                 Cap. 17: Lazy programming.
                                                                         27 / 27

Contenu connexe

Tendances

Manejo de Memoria FreeBSD
Manejo de Memoria FreeBSDManejo de Memoria FreeBSD
Manejo de Memoria FreeBSD
Gerardo Amaya
 
1. modelo entidad relacion ejemplo
1. modelo entidad relacion   ejemplo1. modelo entidad relacion   ejemplo
1. modelo entidad relacion ejemplo
univ of pamplona
 
Notación infija postfija
Notación infija postfijaNotación infija postfija
Notación infija postfija
Omarzingm
 
Método de Búsqueda Hash
Método de Búsqueda HashMétodo de Búsqueda Hash
Método de Búsqueda Hash
Blanca Parra
 
Configuracion de router
Configuracion de routerConfiguracion de router
Configuracion de router
AndyNet-com
 
Taller de redes i
Taller de redes iTaller de redes i
Taller de redes i
carlos
 
Funciones y procedimientos en SQL
Funciones y procedimientos en SQLFunciones y procedimientos en SQL
Funciones y procedimientos en SQL
Ronald Rivas
 

Tendances (20)

Normalizacion de bases de datos
Normalizacion de bases de datosNormalizacion de bases de datos
Normalizacion de bases de datos
 
Programación 3: árboles binarios y ordenados
Programación 3: árboles binarios y ordenadosProgramación 3: árboles binarios y ordenados
Programación 3: árboles binarios y ordenados
 
Manejo de Memoria FreeBSD
Manejo de Memoria FreeBSDManejo de Memoria FreeBSD
Manejo de Memoria FreeBSD
 
1. modelo entidad relacion ejemplo
1. modelo entidad relacion   ejemplo1. modelo entidad relacion   ejemplo
1. modelo entidad relacion ejemplo
 
1.1. impacto de las telecomunicaciones
1.1. impacto de las telecomunicaciones1.1. impacto de las telecomunicaciones
1.1. impacto de las telecomunicaciones
 
Estructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no linealesEstructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no lineales
 
Subnetting
SubnettingSubnetting
Subnetting
 
Árboles binarios, ABB y AVL
Árboles binarios, ABB y AVLÁrboles binarios, ABB y AVL
Árboles binarios, ABB y AVL
 
Listas como estructura de datos..
Listas como estructura de datos..Listas como estructura de datos..
Listas como estructura de datos..
 
Examen final de base de datos ii solucionado
Examen final de base de datos ii solucionadoExamen final de base de datos ii solucionado
Examen final de base de datos ii solucionado
 
control de concurrencia
control de concurrenciacontrol de concurrencia
control de concurrencia
 
Notación infija postfija
Notación infija postfijaNotación infija postfija
Notación infija postfija
 
Algoritmos de Dijkstra, Warshall, Ordenación Topológica.
Algoritmos de Dijkstra, Warshall, Ordenación Topológica.Algoritmos de Dijkstra, Warshall, Ordenación Topológica.
Algoritmos de Dijkstra, Warshall, Ordenación Topológica.
 
Método de Búsqueda Hash
Método de Búsqueda HashMétodo de Búsqueda Hash
Método de Búsqueda Hash
 
Configuracion de router
Configuracion de routerConfiguracion de router
Configuracion de router
 
Ejercicios sql
Ejercicios sqlEjercicios sql
Ejercicios sql
 
Programación 3: listas enlazadas
Programación 3: listas enlazadasProgramación 3: listas enlazadas
Programación 3: listas enlazadas
 
Taller de redes i
Taller de redes iTaller de redes i
Taller de redes i
 
24 Ejercicios Subnetting
24 Ejercicios Subnetting24 Ejercicios Subnetting
24 Ejercicios Subnetting
 
Funciones y procedimientos en SQL
Funciones y procedimientos en SQLFunciones y procedimientos en SQL
Funciones y procedimientos en SQL
 

Similaire à Tema 10: Evaluación perezosa en Haskell

Lógica de la programación
Lógica de la programaciónLógica de la programación
Lógica de la programación
UTPL UTPL
 
Matlab basico
Matlab basicoMatlab basico
Matlab basico
ford81
 

Similaire à Tema 10: Evaluación perezosa en Haskell (20)

Tema 10-1x2
Tema 10-1x2Tema 10-1x2
Tema 10-1x2
 
2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby
 
Conceptos básicos de R
Conceptos básicos de RConceptos básicos de R
Conceptos básicos de R
 
Tema 6: Definiciones por recursión en Haskell
Tema 6: Definiciones por recursión en Haskell Tema 6: Definiciones por recursión en Haskell
Tema 6: Definiciones por recursión en Haskell
 
Tema3
Tema3Tema3
Tema3
 
Lógica de la programación
Lógica de la programaciónLógica de la programación
Lógica de la programación
 
Matlab basico
Matlab basicoMatlab basico
Matlab basico
 
Tema 1: Introducción a la programación funcional.
Tema 1: Introducción a la programación funcional.Tema 1: Introducción a la programación funcional.
Tema 1: Introducción a la programación funcional.
 
Tema 7: Funciones de orden superior en Haskell
Tema 7: Funciones de orden superior en HaskellTema 7: Funciones de orden superior en Haskell
Tema 7: Funciones de orden superior en Haskell
 
Tema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con HaskellTema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con Haskell
 
Factorial again! Olimpiada Informática Media IOI- ACM
Factorial again! Olimpiada  Informática Media IOI- ACMFactorial again! Olimpiada  Informática Media IOI- ACM
Factorial again! Olimpiada Informática Media IOI- ACM
 
Pf con scala
Pf con scalaPf con scala
Pf con scala
 
FdP_Diapositivas_2018
FdP_Diapositivas_2018FdP_Diapositivas_2018
FdP_Diapositivas_2018
 
Descubriendo scala
Descubriendo scalaDescubriendo scala
Descubriendo scala
 
123507620 que-es-la-evaluacion-perezosa-docx
123507620 que-es-la-evaluacion-perezosa-docx123507620 que-es-la-evaluacion-perezosa-docx
123507620 que-es-la-evaluacion-perezosa-docx
 
2 _expresiones_matematicas_254209
2  _expresiones_matematicas_2542092  _expresiones_matematicas_254209
2 _expresiones_matematicas_254209
 
Complejidad Computacional
Complejidad ComputacionalComplejidad Computacional
Complejidad Computacional
 
Parte2
Parte2Parte2
Parte2
 
Estimacion de Proyectos, Ingeniería de Software
Estimacion de Proyectos, Ingeniería de SoftwareEstimacion de Proyectos, Ingeniería de Software
Estimacion de Proyectos, Ingeniería de Software
 
Tema3
Tema3Tema3
Tema3
 

Plus de José A. Alonso

LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
José A. Alonso
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
José A. Alonso
 
LMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicional
José A. Alonso
 
LMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosLMF-T3: Tableros semánticos
LMF-T3: Tableros semánticos
José A. Alonso
 
LMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalLMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicional
José A. Alonso
 
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologLI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
José A. Alonso
 
LI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenLI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer orden
José A. Alonso
 
Panorama del razonamiento automático
Panorama del razonamiento automáticoPanorama del razonamiento automático
Panorama del razonamiento automático
José A. Alonso
 
LI -T5: Resolución proposicional
LI -T5: Resolución proposicionalLI -T5: Resolución proposicional
LI -T5: Resolución proposicional
José A. Alonso
 

Plus de José A. Alonso (20)

Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.Tema 12: Analizadores sintácticos funcionales.
Tema 12: Analizadores sintácticos funcionales.
 
Tema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmosTema 23: Técnicas de diseño descendente de algoritmos
Tema 23: Técnicas de diseño descendente de algoritmos
 
I1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsquedaI1M-T19: El TAD de los árboles de búsqueda
I1M-T19: El TAD de los árboles de búsqueda
 
I1M-T17: El TAD de los conjuntos
I1M-T17: El TAD de los conjuntosI1M-T17: El TAD de los conjuntos
I1M-T17: El TAD de los conjuntos
 
Panorama de la demostración asistida por ordenador
Panorama de la demostración asistida por ordenadorPanorama de la demostración asistida por ordenador
Panorama de la demostración asistida por ordenador
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
 
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer ordenLMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
 
LMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicionalLMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5b: Aplicaciones de la lógica proposicional
 
LMF-T5: Resolución proposicional
LMF-T5: Resolución proposicionalLMF-T5: Resolución proposicional
LMF-T5: Resolución proposicional
 
LMF-T4: Formas normales
LMF-T4: Formas normalesLMF-T4: Formas normales
LMF-T4: Formas normales
 
LMF-T3: Tableros semánticos
LMF-T3: Tableros semánticosLMF-T3: Tableros semánticos
LMF-T3: Tableros semánticos
 
LMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicionalLMF-T2: Deducción natural proposicional
LMF-T2: Deducción natural proposicional
 
I1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en HaskellI1M-T21: El TAD de los polinomios en Haskell
I1M-T21: El TAD de los polinomios en Haskell
 
LMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicionalLMF-T1: Sintaxis y semántica de la lógica proposicional
LMF-T1: Sintaxis y semántica de la lógica proposicional
 
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con PrologLI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
 
LI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer ordenLI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T6: Sintaxis y semántica de la lógica de primer orden
 
LI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. AplicacionesLI-T5b: Algoritmos para SAT. Aplicaciones
LI-T5b: Algoritmos para SAT. Aplicaciones
 
Panorama del razonamiento automático
Panorama del razonamiento automáticoPanorama del razonamiento automático
Panorama del razonamiento automático
 
LI -T5: Resolución proposicional
LI -T5: Resolución proposicionalLI -T5: Resolución proposicional
LI -T5: Resolución proposicional
 
I1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en HaskellI1M2010-T24: Programación dinámica en Haskell
I1M2010-T24: Programación dinámica en Haskell
 

Dernier

TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
jlorentemartos
 
Concepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptxConcepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptx
Fernando Solis
 
PROPUESTA COMERCIAL SENA ETAPA 2 ACTIVIDAD 3.pdf
PROPUESTA COMERCIAL SENA ETAPA 2 ACTIVIDAD 3.pdfPROPUESTA COMERCIAL SENA ETAPA 2 ACTIVIDAD 3.pdf
PROPUESTA COMERCIAL SENA ETAPA 2 ACTIVIDAD 3.pdf
EduardoJosVargasCama1
 

Dernier (20)

AEC 2. Aventura en el Antiguo Egipto.pptx
AEC 2. Aventura en el Antiguo Egipto.pptxAEC 2. Aventura en el Antiguo Egipto.pptx
AEC 2. Aventura en el Antiguo Egipto.pptx
 
Lecciones 06 Esc. Sabática. Los dos testigos
Lecciones 06 Esc. Sabática. Los dos testigosLecciones 06 Esc. Sabática. Los dos testigos
Lecciones 06 Esc. Sabática. Los dos testigos
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESO
 
Novena de Pentecostés con textos de san Juan Eudes
Novena de Pentecostés con textos de san Juan EudesNovena de Pentecostés con textos de san Juan Eudes
Novena de Pentecostés con textos de san Juan Eudes
 
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
 
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptx
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptxCONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptx
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptx
 
ACERTIJO LA RUTA DEL MARATÓN OLÍMPICO DEL NÚMERO PI EN PARÍS. Por JAVIER SOL...
ACERTIJO LA RUTA DEL MARATÓN OLÍMPICO DEL NÚMERO PI EN  PARÍS. Por JAVIER SOL...ACERTIJO LA RUTA DEL MARATÓN OLÍMPICO DEL NÚMERO PI EN  PARÍS. Por JAVIER SOL...
ACERTIJO LA RUTA DEL MARATÓN OLÍMPICO DEL NÚMERO PI EN PARÍS. Por JAVIER SOL...
 
Posición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptxPosición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptx
 
prostitución en España: una mirada integral!
prostitución en España: una mirada integral!prostitución en España: una mirada integral!
prostitución en España: una mirada integral!
 
Los dos testigos. Testifican de la Verdad
Los dos testigos. Testifican de la VerdadLos dos testigos. Testifican de la Verdad
Los dos testigos. Testifican de la Verdad
 
Tema 11. Dinámica de la hidrosfera 2024
Tema 11.  Dinámica de la hidrosfera 2024Tema 11.  Dinámica de la hidrosfera 2024
Tema 11. Dinámica de la hidrosfera 2024
 
Factores que intervienen en la Administración por Valores.pdf
Factores que intervienen en la Administración por Valores.pdfFactores que intervienen en la Administración por Valores.pdf
Factores que intervienen en la Administración por Valores.pdf
 
activ4-bloque4 transversal doctorado.pdf
activ4-bloque4 transversal doctorado.pdfactiv4-bloque4 transversal doctorado.pdf
activ4-bloque4 transversal doctorado.pdf
 
PP_Comunicacion en Salud: Objetivación de signos y síntomas
PP_Comunicacion en Salud: Objetivación de signos y síntomasPP_Comunicacion en Salud: Objetivación de signos y síntomas
PP_Comunicacion en Salud: Objetivación de signos y síntomas
 
Concepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptxConcepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptx
 
Sesión de clase APC: Los dos testigos.pdf
Sesión de clase APC: Los dos testigos.pdfSesión de clase APC: Los dos testigos.pdf
Sesión de clase APC: Los dos testigos.pdf
 
Desarrollo y Aplicación de la Administración por Valores
Desarrollo y Aplicación de la Administración por ValoresDesarrollo y Aplicación de la Administración por Valores
Desarrollo y Aplicación de la Administración por Valores
 
Tema 19. Inmunología y el sistema inmunitario 2024
Tema 19. Inmunología y el sistema inmunitario 2024Tema 19. Inmunología y el sistema inmunitario 2024
Tema 19. Inmunología y el sistema inmunitario 2024
 
PROPUESTA COMERCIAL SENA ETAPA 2 ACTIVIDAD 3.pdf
PROPUESTA COMERCIAL SENA ETAPA 2 ACTIVIDAD 3.pdfPROPUESTA COMERCIAL SENA ETAPA 2 ACTIVIDAD 3.pdf
PROPUESTA COMERCIAL SENA ETAPA 2 ACTIVIDAD 3.pdf
 
Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024
 

Tema 10: Evaluación perezosa en Haskell

  • 1. Tema 10: Evaluación perezosa Informática (2010–11) José A. Alonso Jiménez Grupo de Lógica Computacional Departamento de Ciencias de la Computación e I.A. Universidad de Sevilla
  • 2. IM Tema 10: Evaluación perezosa Tema 10: Evaluación perezosa 1. Estrategias de evaluación 2. Terminación 3. Número de reducciones 4. Estructuras infinitas 5. Programación modular 6. Aplicación estricta 2 / 27
  • 3. IM Tema 10: Evaluación perezosa Estrategias de evaluación Tema 10: Evaluación perezosa 1. Estrategias de evaluación 2. Terminación 3. Número de reducciones 4. Estructuras infinitas 5. Programación modular 6. Aplicación estricta 3 / 27
  • 4. IM Tema 10: Evaluación perezosa Estrategias de evaluación Estrategias de evaluación Para los ejemplos se considera la función mult :: (Int,Int) -> Int mult (x,y) = x*y Evaluación mediante paso de parámetros por valor (o por más internos): mult (1+2,2+3) = mult (3,5) [por def. de +] = 3*5 [por def. de mult] = 15 [por def. de *] Evaluación mediante paso de parámetros por nombre (o por más externos): mult (1+2,2+3) = (1+2)*(3+5) [por def. de mult] = 3*5 [por def. de +] 4 / 27
  • 5. IM Tema 10: Evaluación perezosa Estrategias de evaluación Evaluación con lambda expresiones Se considera la función mult' :: Int -> Int -> Int mult' x = y -> x*y Evaluación: mult’ (1+2) (2+3) = mult’ 3 (2+3) [por def. de +] = (λy → 3*y) (2+3) [por def. de mult’] = (λy → 3*y) 5 [por def. de +] = 3*5 [por def. de +] = 15 [por def. de *] 5 / 27
  • 6. IM Tema 10: Evaluación perezosa Terminación Tema 10: Evaluación perezosa 1. Estrategias de evaluación 2. Terminación 3. Número de reducciones 4. Estructuras infinitas 5. Programación modular 6. Aplicación estricta 6 / 27
  • 7. IM Tema 10: Evaluación perezosa Terminación Procesamiento con el infinito Definición de infinito inf :: Int inf = 1 + inf Evaluación de infinito en Haskell: *Main> inf C-c C-cInterrupted. Evaluación de infinito: inf = 1 + inf [por def. inf] = 1 + (1 + inf) [por def. inf] = 1 + (1 + (1 + inf)) [por def. inf] = ... 7 / 27
  • 8. IM Tema 10: Evaluación perezosa Terminación Procesamiento con el infinito Evaluación mediante paso de parámetros por valor: fst (0,inf) = fst (0,1 + inf) [por def. inf] = fst (0,1 + (1 + inf)) [por def. inf] = fst (0,1 + (1 + (1 + inf))) [por def. inf] = ... Evaluación mediante paso de parámetros por nombre: fst (0,inf) = 0 [por def. fst] Evaluación Haskell con infinito: *Main> fst (0,inf) 0 8 / 27
  • 9. IM Tema 10: Evaluación perezosa Número de reducciones Tema 10: Evaluación perezosa 1. Estrategias de evaluación 2. Terminación 3. Número de reducciones 4. Estructuras infinitas 5. Programación modular 6. Aplicación estricta 9 / 27
  • 10. IM Tema 10: Evaluación perezosa Número de reducciones Número de reducciones según las estrategias Para los ejemplos se considera la función cuadrado :: Int -> Int cuadrado n = n * n Evaluación mediante paso de parámetros por valor: cuadrado (1+2) = cuadrado 3 [por def. +] = 3*3 [por def. cuadrado] = 9 [por def. de *] Evaluación mediante paso de parámetros por nombre: cuadrado (1+2) = (1+2)*(1+2) [por def. cuadrado] = 3*(1+2) [por def. de +] = 3*3 [por def. de +] = 9 [por def. de *] 10 / 27
  • 11. IM Tema 10: Evaluación perezosa Número de reducciones Evaluación perezosa e impaciente En la evaluación mediante paso de parámetros por nombre los argumentos pueden evaluarse más veces que en el paso por valor. Se puede usar punteros para compartir valores de expresiones. La evaluación mediante paso de parámetros por nombre usando punteros para compartir valores de expresiones se llama evaluación perezosa. La evaluación mediante paso de parámetros por valor se llama evaluación impaciente. Evaluación perezosa del ejemplo anterior: cuadrado (1+2) = x*x con x = 1+2 [por def. cuadrado] = 3*3 [por def. de +] = 9 [por def. de *] Haskell usa evaluación perezosa. 11 / 27
  • 12. IM Tema 10: Evaluación perezosa Estructuras infinitas Tema 10: Evaluación perezosa 1. Estrategias de evaluación 2. Terminación 3. Número de reducciones 4. Estructuras infinitas 5. Programación modular 6. Aplicación estricta 12 / 27
  • 13. IM Tema 10: Evaluación perezosa Estructuras infinitas Programación con estructuras infinitas unos es una lista infinita de unos. unos :: [Int] unos = 1 : unos Evaluación: unos = 1 : unos [por def. unos] = 1 : (1 : unos) [por def. unos] = 1 : (1 : (1 : unos)) [por def. unos] = ... Evaluación 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
  • 14. IM Tema 10: Evaluación perezosa Estructuras infinitas Evaluación con estructuras infinitas Evaluación impaciente: head unos = head (1 : unos) [por def. unos] = head (1 : (1 : unos)) [por def. unos] = head (1 : (1 : (1 : unos))) [por def. unos] = ... Evaluación perezosa: head unos = head (1 : unos) [por def. unos] = 1 [por def. head] Evaluación Haskell: *Main> head unos 1 14 / 27
  • 15. IM Tema 10: Evaluación perezosa Programación modular Tema 10: Evaluación perezosa 1. Estrategias de evaluación 2. Terminación 3. Número de reducciones 4. Estructuras infinitas 5. Programación modular 6. Aplicación estricta 15 / 27
  • 16. IM Tema 10: Evaluación perezosa Programación modular Programación modular La evaluación perezosa permite separar el control de los datos. Para los ejemplos se considera la función Prelude take :: Int -> [a] -> [a] take n _ | n <= 0 = [] take _ [] = [] take n (x:xs) = x : take (n-1) xs Ejemplo de separación del control (tomar 2 elementos) de los datos (una lista infinita de unos): take 2 unos = take 2 (1 : unos) [por def. unos] = 1 : (take 1 unos) [por def. take] = 1 : (take 1 (1 : unos)) [por def. unos] = 1 : (1 : (take 0 unos)) [por def. take] = 1 : (1 : []) [por def. take] = [1,1] [por notación de listas] 16 / 27
  • 17. IM Tema 10: Evaluación perezosa Programación modular Terminación de evaluaciones con estructuras infinitas Ejemplo de no terminación: *Main> [1..] [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,... Ejemplo de terminación: *Main> take 3 [1..] [1,2,3] Ejemplo de no terminación: *Main> filter (<=3) [1..] [1,2,3 C-c C-c Interrupted. Ejemplo de no terminación: *Main> takeWhile (<=3) [1..] [1,2,3] 17 / 27
  • 18. IM Tema 10: Evaluación perezosa Programación modular La criba de Erastótenes La criba de Erastótenes 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 3 5 7 9 11 13 15 ... 5 7 11 13 ... 7 11 13 ... 11 13 ... 13 ... Definición primos :: [Int ] primos = criba [2..] criba :: [Int] -> [Int] criba (p:xs) = p : criba [x | x <- xs, x `mod` p /= 0] 18 / 27
  • 19. IM Tema 10: Evaluación perezosa Programación modular La criba de Erastótenes Evaluación: take 15 primos [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47] Cálculo: 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
  • 20. IM Tema 10: Evaluación perezosa Aplicación estricta Tema 10: Evaluación perezosa 1. Estrategias de evaluación 2. Terminación 3. Número de reducciones 4. Estructuras infinitas 5. Programación modular 6. Aplicación estricta 20 / 27
  • 21. IM Tema 10: Evaluación perezosa Aplicación estricta Ejemplo de programa sin aplicación estricta (sumaNE xs) es la suma de los números de xs. Por ejemplo, sumaNE [2,3,5] 10 sumaNE :: [Int] -> Int sumaNE xs = sumaNE' 0 xs sumaNE' :: Int -> [Int] -> Int sumaNE' v [] = v sumaNE' v (x:xs) = sumaNE' (v+x) xs 21 / 27
  • 22. IM Tema 10: Evaluación perezosa Aplicación estricta Ejemplo de programa sin aplicación estricta Evaluación: : sumaNE [2,3,5] = sumaNE’ 0 [2,3,5] [por def. sumaNE] = sumaNE’ (0+2) [3,5] [por def. sumaNE’] = sumaNE’ ((0+2)+3) [5] [por def. sumaNE’] = sumaNE’ (((0+2)+3)+5) [] [por def. sumaNE’] = ((0+2)+3)+5 [por def. sumaNE’] = (2+3)+5 [por def. +] = 5+5 [por def. +] = 10 [por def. +] 22 / 27
  • 23. IM Tema 10: Evaluación perezosa Aplicación estricta Ejemplo de programa con aplicación estricta (sumaE xs) es la suma de los números de xs. Por ejemplo, sumaE [2,3,5] 10 sumaE :: [Int] -> Int sumaE xs = sumaE' 0 xs sumaE' :: Int -> [Int] -> Int sumaE' v [] = v sumaE' v (x:xs) = (sumaE' $! (v+x)) xs 23 / 27
  • 24. IM Tema 10: Evaluación perezosa Aplicación estricta Ejemplo de programa con aplicación estricta Evaluación: : sumaE [2,3,5] = sumaE’ 0 [2,3,5] [por def. sumaE] = (sumaE’ $! (0+2)) [3,5] [por def. sumaE’] = sumaE’ 2 [3,5] [por aplicación de $!] = (sumaE’ $! (2+3)) [5] [por def. sumaE’] = sumaE’ 5 [5] [por aplicación de $!] = (sumaE’ $! (5+5)) [] [por def. sumaE’] = sumaE’ 10 [] [por aplicación de $!] = 10 [por def. sumaE’] 24 / 27
  • 25. IM Tema 10: Evaluación perezosa Aplicación estricta Comparación de consumo de memoria Comparación de consumo de memoria: *Main> sumaNE [1..1000000] *** Exception: stack overflow *Main> sumaE [1..1000000] 1784293664 *Main> :set +s *Main> sumaE [1..1000000] 1784293664 (2.16 secs, 145435772 bytes) 25 / 27
  • 26. IM Tema 10: Evaluación perezosa Aplicación estricta Plegado estricto Versión estricta de foldl en el Data.List foldl' :: (a -> b -> a) -> a -> [b] -> a foldl' f a [] = a foldl' f a (x:xs) = (foldl' f $! f a x) xs Comparación de plegado y plegado estricto:s *Main> foldl (+) 0 [2,3,5] 10 *Main> foldl' (+) 0 [2,3,5] 10 *Main> foldl (+) 0 [1..1000000] *** Exception: stack overflow *Main> foldl' (+) 0 [1..1000000] 500000500000 26 / 27
  • 27. IM Tema 10: Evaluación perezosa Bibliografía Bibliografía 1. R. Bird. Introducción a la programación funcional con Haskell. Prentice Hall, 2000. Cap. Cap. 7: Eficiencia. 2. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 12: Lazy evaluation. 3. B. O’Sullivan, D. Stewart y J. Goerzen Real World Haskell. O’Reilly, 2008. Cap. 2: Types and Functions. 4. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 2: Introducción a Haskell. Cap. 8: Evaluación perezosa. Redes de procesos. 5. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. Addison-Wesley, 1999. Cap. 17: Lazy programming. 27 / 27