Tema 1: Programación Funcional - Universidad de Sevilla Tema 1: Programaci on Funcional A. Ch...
date post
07-Oct-2020Category
Documents
view
0download
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