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

24
Funciones Sesiones y declaraciones Reducci´ on Sobre Haskell Tema 1: Programaci´ on Funcional A. Ch´ avez-Gonz´ alez 1 A. Riscos-N´ nez 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias de la Computaci´ on e Inteligencia Artificial Universidad de Sevilla http://www.cs.us.es/cursos/lp/ ogica y Programaci´ on, 2006/07 Antonia Ch´ avez, Agust´ ın Riscos, Fernando Sancho Tema 1

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

Page 1: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

Tema 1: Programacion Funcional

A. Chavez-Gonzalez1 A. Riscos-Nunez1 F. Sancho-Caparrini1

1Departamento de Ciencias de la Computacion e Inteligencia ArtificialUniversidad de Sevilla

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

Logica y Programacion, 2006/07

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 2: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

Indice

1 Funciones

2 Sesiones y declaraciones

3 Reduccion de expresionesEjemploTransparencia referencialOrdenes de reduccion aplicativo y normalEvaluacion perezosa

4 Sobre Haskell

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 3: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

Funciones

Una funcion f es una correspondencia entre dos conjuntos inicialy 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 funcion para ciertos valores: ”El resultado deaplicar la funcion f al valor x es y”

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 4: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

Indice

1 Funciones

2 Sesiones y declaraciones

3 Reduccion de expresionesEjemploTransparencia referencialOrdenes de reduccion aplicativo y normalEvaluacion perezosa

4 Sobre Haskell

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 5: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

Sesiones y declaraciones

Programar es dar al ordenador los pasos para resolver unproblema

La solucion se calcula a partir de los datos, luego un programase describe mediante funciones

Programacion funcional: ordenador = evaluador

Prelude>

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 6: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

Ejemplos

Prelude> 1 + 23 :: Integer

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

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

Prelude> mod 10 31 :: Integer

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

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 7: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

Sesiones con Haskell

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

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

Declaracion de tipo, ecuacion, metodo de computo, parametroformal de la funcion

Una funcion de dos argumentossumaCuadrados :: Integer→ Integer→ IntegersumaCuadrados x y = x ∗ x + y ∗ y

Main> sumaCuadrados (2 + 2) 325 :: Integer

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 8: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Indice

1 Funciones

2 Sesiones y declaraciones

3 Reduccion de expresionesEjemploTransparencia referencialOrdenes de reduccion aplicativo y normalEvaluacion perezosa

4 Sobre Haskell

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 9: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Reduccion I

El evaluador simplifica la expresion y muestra el resultadocuadrado :: Integer→ Integercuadrado x = x ∗ x

Simplificacion en varios pasos de reduccion2 + cuadrado3=⇒ ! por la definicion de cuadrado2 + 3 ∗ 3=⇒ ! por el operador (∗)2 + 9=⇒ ! por el operador (+)11

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 10: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Reduccion II

El evaluador simplifica la expresion y muestra el resultado

Simplificacion en varios pasos de reducccion

Un redex es cada parte de la expresion que pueda reducirse

Forma normal

Evaluador: mientras quede algun redex, reducir; cuandoalcance la forma normal, mostrar el resultado

Pero, ¿Que ocurre si hay mas de un redex?

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 11: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Ejemplo

Reduccion desde dentro Reduccion desde fueracuadrado(cuadrado3) cuadrado(cuadrado3)=⇒ ! por la definicion de cuadrado =⇒ ! por la definicion de cuadradocuadrado(3 ∗ 3) (cuadrado 3) ∗ (cuadrado 3)=⇒ ! por el operador (∗) =⇒ ! por la definicion de cuadradocuadrado 9 (3 ∗ 3) ∗ (cuadrado 3)=⇒ ! por la definicion de cuadrado =⇒ ! por el operador (∗)9 ∗ 9 9 ∗ (cuadrado 3)=⇒ ! por el operador (∗) =⇒ ! por la definicion de cuadrado81 9 ∗ (3 ∗ 3)

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

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 12: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Funciones estrictas y transparecia referencial

Las funciones que para ser evaluadas necesitan que susparametros esten en forma normal se llaman estrictas.Ejs.: ∗ es estricto. cuadrado no es estricto.

Sea cual sea el orden de reduccion, el resultado final es elmismo. La reduccion cambia la forma de una expresion, no suvalor

La transparencia referencial establece que una mismaexpresion denota siempre el mismo valor

Si aparecen varios redexes, podemos elegir cualquiera sin que elresultado varıe. Pero la eleccion del redex equivocado puede noconducir a la forma normal

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 13: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Ejemplo

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

Reduccion desde dentro Reduccion desde fueracero infinito cero infinito=⇒ ! por la definicion de infinito =⇒ ! por la definicion de cerocero (1 + infinito) 0=⇒ ! por la definicion de infinitocero(1 + (1 + infinito))=⇒ ! por la definicion de infinito. . .

La estrategia utilizada para seleccionar el redex es crucial

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 14: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Un orden de reduccion es una estrategia que indica que redexhay que seleccionar en cada paso de reduccion

Orden de reduccion aplicativo

Seleccionar siempre el redex mas interno y mas a la izquierda

paso de parametros por valor (call by value)

Evaluadores estrictos o impacientes

Problema: A veces se efectuan reducciones innecesarias

cero(10 ∗ 4)=⇒ ! por el operador (∗)cero 40=⇒ ! por la definicion de cero0

cero infinito

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 15: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Un orden de reduccion es una estrategia que indica que redexhay que seleccionar en cada paso de reduccion

Orden de reduccion aplicativo

Seleccionar siempre el redex mas interno y mas a la izquierda

paso de parametros por valor (call by value)

Evaluadores estrictos o impacientes

Problema: A veces se efectuan reducciones innecesarias

cero(10 ∗ 4)=⇒ ! por el operador (∗)cero 40=⇒ ! por la definicion de cero0

cero infinito

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 16: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Un orden de reduccion es una estrategia que indica que redexhay que seleccionar en cada paso de reduccion

Orden de reduccion aplicativo

Seleccionar siempre el redex mas interno y mas a la izquierda

paso de parametros por valor (call by value)

Evaluadores estrictos o impacientes

Problema: A veces se efectuan reducciones innecesarias

cero(10 ∗ 4)=⇒ ! por el operador (∗)cero 40=⇒ ! por la definicion de cero0

cero infinito

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 17: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Orden de reduccion normal

Seleccionar siempre el redex mas externo y mas a la izquierda

paso de parametros por nombre (call by name)

Evaluadores no estrictos

Es normalizante

Problema: Ciertas expresiones se reducen varias veces

Ejemplo:cuadrado(cuadrado3)

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 18: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Orden de reduccion normal

Seleccionar siempre el redex mas externo y mas a la izquierda

paso de parametros por nombre (call by name)

Evaluadores no estrictos

Es normalizante

Problema: Ciertas expresiones se reducen varias veces

Ejemplo:cuadrado(cuadrado3)

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 19: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Evaluacion perezosa

Orden normal (paso por nombre): expresiones se reducenvarias veces

Solucion: Evaluacion perezosa (call by need)Consiste en utilizar paso por nombre y recordar los valores delos argumentos ya calculados para evitar recalculo

No se utilizan mas reducciones que con paso por valor, luegono es menos eficiente que ella y tiene las ventajas de paso pornombre.

Haskell utiliza un evaluador perezoso

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 20: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Evaluacion perezosa: Ejemplo

cuadrado(cuadrado3)=⇒ ! por la definicion de cuadradoa ∗ a donde a = cuadrado3=⇒ ! por la definicion de cuadradoa ∗ a donde a = b ∗ b donde b = 3=⇒ ! por el operador (∗)a ∗ a donde a = 9=⇒ ! por el operador (∗)81

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 21: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Representacion perezosa de la funcion cuadrado

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 22: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

EjemploTransparencia referencialOrdenes de reduccionEvaluacion perezosa

Reduccion perezosa de la funcion cuadrado

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 23: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

Indice

1 Funciones

2 Sesiones y declaraciones

3 Reduccion de expresionesEjemploTransparencia referencialOrdenes de reduccion aplicativo y normalEvaluacion perezosa

4 Sobre Haskell

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1

Page 24: Tema 1: Programación Funcional - Universidad de SevillaTema 1: Programaci on Funcional A. Ch avez-Gonz alez 1 A. Riscos-Nu nez~ 1 F. Sancho-Caparrini 1 1 Departamento de Ciencias

FuncionesSesiones y declaraciones

ReduccionSobre Haskell

Version estable del lenguaje Haskell denominadaHaskell 98

Peyton Jones, 2003. Haskell 98 Language and Libraries. TheRevised Report. Cambridge University Press

Peyton Jones y Hughes, 2002. Standard Libraries for Haskell98. En http://haskell.org/onlinelibrary

Hugs 98 es una de las implementaciones mas populares paraHaskell 98

http://haskell.org/hugs

Mas informacion sobre Haskell: http://haskell.org

Antonia Chavez, Agustın Riscos, Fernando Sancho Tema 1