Tema 1: Programación Funcional - Universidad de Sevilla Tema 1: Programaci on Funcional A. Ch...

Click here to load reader

  • date post

    07-Oct-2020
  • Category

    Documents

  • view

    0
  • download

    0

Embed Size (px)

Transcript of Tema 1: Programación Funcional - Universidad de Sevilla Tema 1: Programaci on Funcional A. Ch...

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Tema 1: Programación Funcional

    A. Chávez-González1 A. Riscos-Núñez1 F. Sancho-Caparrini1

    1Departamento de Ciencias de la Computación e Inteligencia Artificial Universidad de Sevilla

    http://www.cs.us.es/cursos/lp/

    Lógica y Programación, 2006/07

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Índice

    1 Funciones

    2 Sesiones y declaraciones

    3 Reducción de expresiones Ejemplo Transparencia referencial Órdenes de reducción aplicativo y normal Evaluación perezosa

    4 Sobre Haskell

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Funciones

    Una función f es una correspondencia entre dos conjuntos inicial y final

    f : A→ B

    f(x) 7−→ . . .

    Ejemplos: sucesor, sumaCuadrados (2 argumentos) y pi (constante)

    sumaCuadrados : Z× Z→ Z

    sumaCuadrados(x, y) 7→ x2 + y 2

    Interesa evaluar la función para ciertos valores: ”El resultado de aplicar la función f al valor x es y”

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Índice

    1 Funciones

    2 Sesiones y declaraciones

    3 Reducción de expresiones Ejemplo Transparencia referencial Órdenes de reducción aplicativo y normal Evaluación perezosa

    4 Sobre Haskell

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Sesiones y declaraciones

    Programar es dar al ordenador los pasos para resolver un problema

    La solución se calcula a partir de los datos, luego un programa se describe mediante funciones

    Programación funcional: ordenador = evaluador

    Prelude>

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Ejemplos

    Prelude> 1 + 2 3 :: Integer

    Prelude> cos (2 * pi) 1.0 :: Double

    Prelude> [1 . . . 5] [1, 2, 3, 4, 5] :: [Integer]

    Prelude> mod 10 3 1 :: Integer

    Prelude> mod 10 (3 + 1) 2 :: Integer

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Sesiones con Haskell

    Haskell es un lenguaje fuertemente tipificado. El conjunto de valores, funciones y operadores predefinidos es ampliable, incluso se pueden definir nuevos tipos de datos

    sucesor :: Integer -> Integer sucesor x = x + 1

    Declaración de tipo, ecuación, método de cómputo, parámetro formal de la función

    Una función de dos argumentos sumaCuadrados :: Integer→ Integer→ Integer sumaCuadrados x y = x ∗ x + y ∗ y

    Main> sumaCuadrados (2 + 2) 3 25 :: Integer

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Ejemplo Transparencia referencial Órdenes de reducción Evaluación perezosa

    Índice

    1 Funciones

    2 Sesiones y declaraciones

    3 Reducción de expresiones Ejemplo Transparencia referencial Órdenes de reducción aplicativo y normal Evaluación perezosa

    4 Sobre Haskell

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Ejemplo Transparencia referencial Órdenes de reducción Evaluación perezosa

    Reducción I

    El evaluador simplifica la expresión y muestra el resultado cuadrado :: Integer→ Integer cuadrado x = x ∗ x Simplificación en varios pasos de reducción 2 + cuadrado3 =⇒ ! por la definición de cuadrado 2 + 3 ∗ 3 =⇒ ! por el operador (∗) 2 + 9 =⇒ ! por el operador (+) 11

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Ejemplo Transparencia referencial Órdenes de reducción Evaluación perezosa

    Reducción II

    El evaluador simplifica la expresión y muestra el resultado

    Simplificación en varios pasos de reduccción

    Un redex es cada parte de la expresión que pueda reducirse

    Forma normal

    Evaluador: mientras quede algún redex, reducir; cuando alcance la forma normal, mostrar el resultado

    Pero, ¿Qué ocurre si hay más de un redex?

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Ejemplo Transparencia referencial Órdenes de reducción Evaluación perezosa

    Ejemplo

    Reducción desde dentro Reducción desde fuera cuadrado(cuadrado3) cuadrado(cuadrado3) =⇒ ! por la definición de cuadrado =⇒ ! por la definición de cuadrado cuadrado(3 ∗ 3) (cuadrado 3) ∗ (cuadrado 3) =⇒ ! por el operador (∗) =⇒ ! por la definición de cuadrado cuadrado 9 (3 ∗ 3) ∗ (cuadrado 3) =⇒ ! por la definición de cuadrado =⇒ ! por el operador (∗) 9 ∗ 9 9 ∗ (cuadrado 3) =⇒ ! por el operador (∗) =⇒ ! por la definición de cuadrado 81 9 ∗ (3 ∗ 3)

    =⇒ ! por el operador (∗) 9 ∗ 9 =⇒ ! por el operador (∗) 81

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Ejemplo Transparencia referencial Órdenes de reducción Evaluación perezosa

    Funciones estrictas y transparecia referencial

    Las funciones que para ser evaluadas necesitan que sus parámetros estén en forma normal se llaman estrictas. Ejs.: ∗ es estricto. cuadrado no es estricto. Sea cual sea el orden de reducción, el resultado final es el mismo. La reducción cambia la forma de una expresión, no su valor

    La transparencia referencial establece que una misma expresión denota siempre el mismo valor

    Si aparecen varios redexes, podemos elegir cualquiera sin que el resultado vaŕıe. Pero la elección del redex equivocado puede no conducir a la forma normal

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Ejemplo Transparencia referencial Órdenes de reducción Evaluación perezosa

    Ejemplo

    infinito :: Integer cero :: Integer→ Integer infinito = 1 + infinito cero x = 0

    Reducción desde dentro Reducción desde fuera cero infinito cero infinito =⇒ ! por la definición de infinito =⇒ ! por la definición de cero cero (1 + infinito) 0 =⇒ ! por la definición de infinito cero(1 + (1 + infinito)) =⇒ ! por la definición de infinito . . .

    La estrategia utilizada para seleccionar el redex es crucial

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Ejemplo Transparencia referencial Órdenes de reducción Evaluación perezosa

    Un orden de reducción es una estrategia que indica qué redex hay que seleccionar en cada paso de reducción

    Orden de reducción aplicativo

    Seleccionar siempre el redex más interno y más a la izquierda

    paso de parámetros por valor (call by value)

    Evaluadores estrictos o impacientes

    Problema: A veces se efectúan reducciones innecesarias

    cero(10 ∗ 4) =⇒ ! por el operador (∗) cero 40 =⇒ ! por la definición de cero 0

    cero infinito

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Ejemplo Transparencia referencial Órdenes de reducción Evaluación perezosa

    Un orden de reducción es una estrategia que indica qué redex hay que seleccionar en cada paso de reducción

    Orden de reducción aplicativo

    Seleccionar siempre el redex más interno y más a la izquierda

    paso de parámetros por valor (call by value)

    Evaluadores estrictos o impacientes

    Problema: A veces se efectúan reducciones innecesarias

    cero(10 ∗ 4) =⇒ ! por el operador (∗) cero 40 =⇒ ! por la definición de cero 0

    cero infinito

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Ejemplo Transparencia referencial Órdenes de reducción Evaluación perezosa

    Un orden de reducción es una estrategia que indica qué redex hay que seleccionar en cada paso de reducción

    Orden de reducción aplicativo

    Seleccionar siempre el redex más interno y más a la izquierda

    paso de parámetros por valor (call by value)

    Evaluadores estrictos o impacientes

    Problema: A veces se efectúan reducciones innecesarias

    cero(10 ∗ 4) =⇒ ! por el operador (∗) cero 40 =⇒ ! por la definición de cero 0

    cero infinito

    Antonia Chávez, Agust́ın Riscos, Fernando Sancho Tema 1

  • Funciones Sesiones y declaraciones

    Reducción Sobre Haskell

    Ejemplo Transp