Algoritmos y programas. Algoritmos y Estructuras de Datos I

Algoritmos y programas I I Algoritmos y Estructuras de Datos I Aprendieron a especificar problemas El objetivo es ahora pensar algoritmos que cumpla...
19 downloads 1 Views 166KB Size
Algoritmos y programas I I

Algoritmos y Estructuras de Datos I

Aprendieron a especificar problemas El objetivo es ahora pensar algoritmos que cumplan con las especificaciones planteadas I

Primer cuatrimestre de 2012

I

Departamento de Computaci´ on - FCEyN - UBA

Una vez que se tiene un algoritmo, se escribe un programa que lo implementa I I

Programaci´ on funcional - clase 1

Puede haber varios algoritmos que cumplan una misma especificaci´on

Expresi´on formal de un algoritmo Lenguajes de programaci´on I I

Funciones Simples - Recursi´on - Tipos de datos

I

Sintaxis definida Sem´ antica definida Ejemplos: Haskell, C, C++, C#, Java, Smalltalk, Prolog, etc.

I

¿C´omo es un lenguaje t´ıpico?

I

¿C´ omo se le dice a una computadora lo que tiene que hacer? 2

1

Lenguajes de programaci´on

Lenguajes de programaci´on

“¿Alguien dijo mi nombre? Me zumbaron los o´ıdos! Veo que est´as ocupado ... Hasta luego, comput´ologo!”

“Computadora, mata a Flanders...” ...

3

4

Lenguajes de programaci´on

Paradigmas de lenguajes de programaci´on I

I

Paradigma = definici´on del modo en el que se especifica el c´omputo (que luego es implementado a trav´es de programas) Representa una “toma de posici´on” ante la pregunta: ¿c´omo se le dice a la computadora lo que tiene que hacer? I

“Augh, 5000 d´ olares por una computadora que no puede con una simple instrucci´on!”

I

Todo lenguaje de programaci´on pertenece a un paradigma

Estado del arte: I I I

I I

Paradigma Paradigma Paradigma Java Paradigma Paradigma

de programaci´on imperativa: C, Basic, Ada, Clu de programaci´on en objetos: Smalltalk de programaci´on orientada a objetos: C++, C#, de programaci´on funcional: LISP, Gopher, Haskell de programaci´on en l´ogica: Prolog

5

Paradigma de programaci´on funcional

I

Programa = colecci´ on de funciones

I

Recordar que un programa es un aparato que transforma datos de entrada en un resultado

I

Los lenguajes funcionales nos dan herramientas para explicarle a la computadora c´ omo calcular esas funciones

I

6

Haskell: programaci´on funcional

funcional/haskell.png Haskell B. Curry (1900–1982)

Herramienta fundamental: definici´ on de funciones

7

I

Haskell: lenguaje de programaci´on funcional

I

Hugs ⊆ Haskell

8

Expresiones, Valores y Tipos

Formaci´on de expresiones I

I

Expresiones at´omicas (las m´as simples) I

Los valores se agrupan en tipos.

I I

I

Int, Float, Bool, Char (como en el lenguaje de especificaci´on)

I

I I

Hay tambi´en tipos compuestos (por ejemplo, pares ordenados) y tipos definidos por el programador

I I

I

Una expresi´ on es una tira de s´ımbolos que denota un valor. I I I I

Tambi´en se llaman formas normales Son la forma m´as intuitiva de representar un valor Ejemplos:

I

2 1+1 (3*7+1)/11 Todas representan el mismo valor de tipo Int.

2 False (3, True)

Es com´ un llamarlas “valores” aunque no son un valor, sino que denotan un valor, como las dem´as expresiones

Expresiones compuestas I

I

Se construyen combinando expresiones at´omicas con operaciones Ejemplos: I I I

1+1 1==2 (4-1, True || False)

10

9

Expresiones mal formadas

Programa funcional Un programa en lenguage funcional es un conjunto de ecuaciones que definen una o m´as funciones.

I

Algunas cadenas de s´ımbolos no forman expresiones I

I I I I

+*1(True (’a’,)

... o por error de tipos: I I I

I

¿Para qu´e se usa un programa funcional?

Por problemas sint´acticos:

2 + False 2 || ’a’ 4 * ’b’

I

Para reducir expresiones

I

Las ecuaciones orientadas junto con el mecanismo de reducci´on describen algoritmos (definici´on de los pasos para resolver un problema)

Ejemplos: I doble:: Int -> Int

Para saber si una expresi´ on est´a bien formada, aplicamos: I

I

doble x = x+x

Reglas sint´acticas Reglas de asignaci´on de tipos (o de inferencia de tipos)

I fst:: (a,b) -> a

fst (x,y)= x I dist:: (Float,Float) -> Float

dist (x,y) = sqrt (x^2+y^2) 11

12

M´as ejemplos

Definiciones recursivas

I signo:: Int -> Int

signo 0 = 0 signo x | x > 0 = 1 signo x | x < 0 = -1 I promedio ::(Float,Float) -> Float

I

promedio1 (x,y) = (x+y)/2 I promedio2:: Float -> Float -> Float

Notar que la definici´on de fact y fib involucra a estas mismas funciones del lado derecho de la definici´on!

promedio2 x y = (x+y)/2

Recursi´ on

I fact:: Int -> Int

fact 0 = 1 fact n | n > 0 = n * fact (n-1) I fib:: Int -> Int

fib 1 = 1 fib 2 = 1 fib n | n > 2 = fib (n-1) + fib (n-2)

14

13

Definiciones recursivas

Asegurarse de llegar a un caso base

I I

I I

Tiene que tener uno o m´as casos base Las llamadas recursivas del lado derecho tienen que acercarse m´as al caso base

} I

I

Consideremos esta especificaci´on: problema par (n : Int) = result : Bool{ requiere n ≥ 0; asegura result == (n m´ od 2 == 0);

Propiedades de una definici´ on recursiva

En cierto sentido, es el equivalente computacional de la inducci´on para las demostraciones

¿Este programa cumple con la especificaci´on? par:: Int -> Bool par 0 = True par n = par (n-2)

I

La recursi´on reemplaza a la necesidad de estructuras de control iterativas (ciclos)

I

Se arregla de alguna de estas formas: par 0 = True par 1 = False par n = par (n-2)

15

par 0 = True par n = not (par (n-1))

16

Ecuaciones I

Usamos ecuaciones para definir funciones.

I

Por ejemplo: doble :: Int -> Int doble x = x + x

I

I

Reducci´on Es el proceso de reemplazar una subexpresi´on por su definici´on, sin tocar el resto

Para determinar el valor de la aplicaci´on de una funci´on se reemplaza cada sub expresi´ on por otra, seg´ un las ecuaciones

I I

La expresi´on resultante puede no ser m´as corta

I

... pero seguramente est´a “m´as definida”, en el sentido de que m´as cerca de ser una forma normal

Ejemplo: doble x = x + x doble (1 + 1) 2 + (1 + 1)

Ecuaciones orientadas: I

I

Lado izquierdo: expresi´on a definir Lado derecho: definici´on C´alculo de valor de una expresi´on: reemplazamos las subexpresiones que sean lado izquierdo de una ecuaci´ on por su lado derecho

(1 + 1) + (1 + 1) 2 + 2 4

Tambi´en podr´ıa ser: doble (1 + 1) 2 + 2 4

doble 2

17

Transparencia referencial

18

Tipos de datos I

Es la propiedad del lenguaje que garantiza que el valor de una expresi´on depende exclusivamente de sus subexpresiones.

En Haskell, todo valor pertenece a alg´ un tipo de datos I I

I

I

Cada expresi´ on del lenguaje representa siempre el mismo valor en cualquier lugar de un programa Es muy u ´til para verificar correctitud (demostrar que se cumple la especificaci´on) I I I

Podemos usar propiedades ya probadas para sub-expresiones El valor de una expresi´on valor no depende de la historia La correctitud vale en cualquier contexto

I

I

Toda expresi´on bien formada denota un valor. Entonces, toda expresi´on tiene un tipo (el del valor que representa).

I

Haskell es un lenguaje fuertemente tipado I

I

Es una propiedad muy importante en este paradigma.

I

19

No se pueden pasar elementos de un tipo a una operaci´on que espera argumentos de otro

Tambi´en tiene tipado est´atico I

En otros paradigmas, el significado de una expresi´on puede depender del contexto

Las funciones son valores, y tambi´en tienen tipo Ejemplo: el tipo “funciones de enteros en enteros”

No hace falta hacer funcionar un programa para saber de qu´e tipo son sus expresiones El int´erprete puede controlar si un programa tiene errores de tipos

20

Notaci´on para tipos I

e :: T I I

I

I

I I

I

La expresi´on e es de tipo T El valor denotado por e pertenece al conjunto de valores llamado T

I

Se llama polimorfismo al hecho de que una funci´on puede aplicarse a distintos tipos de datos, sin redefinirla.

I

En Haskell los polimorfismos se escriben usando variables de tipo y conviven con el tipado fuerte.

I

Ejemplo de una funci´on polim´orfica: la funci´ on identidad id :: a -> a id x = x “id es una funci´on que dado un elemento de alg´ un tipo a devuelve otro elemento de ese mismo tipo”

Ejemplos: I

I

Polimorfismo

2 :: Int False :: Bool ’b’:: Char doble :: Int -> Int

Sirve para escribir reglas y razonar sobre Haskell Tambi´en se usa dentro de Haskell I

I

I

Indica de qu´e tipo queremos que sean los nombres que definimos El int´erprete chequea que el tipo coincida con el de las expresiones que lo definen Podemos obviar las declaraciones de tipos pero nos perdemos la oportunidad del doble chequeo

22

21

Polimorfismo

Aplicaci´on de funciones En programaci´on funcional (como en matem´atica) las funciones tambi´en son valores. Notaci´ on f :: T1 -> T2

id :: a -> a id x = x

I

¿De qu´e tipo es la aplicaci´ on de id a un valor?

La operaci´on b´asica que podemos realizar con ese valor es la aplicaci´on I

I

id 3 :: Int, porque instancia id :: Int -> Int

I

id True :: True, porque instancia id :: Bool -> Bool

I

id doble :: (Int -> Int), porque instancia id :: (Int -> Int) -> (Int -> Int)

23

Aplicar la funci´on a un elemento para obtener un resultado

I

Sint´acticamente, la aplicaci´on se escribe como una yuxtaposici´on (la funci´on seguida de su par´ametro).

I

Por ejemplo, sea f :: T1 -> T2, y e de tipo T1 entonces f e es una expresi´on de tipo T2. Sea doble :: Int -> Int, entonces doble 2 representa un n´ umero entero.

24

Currificaci´on

I

Diferencia entre promedio1 y promedio2 I

I

I I

promedioA promedioA promedioB promedio2

:: (Float, Float) -> Float (x,y) = (x+y)/2 :: Float -> Float -> Float x y = (x+y)/2

La notaci´ on se llama currificaci´ on En primera instancia, evita el uso de varios signos de puntuaci´on (comas y par´entesis) I I

promedioA (promedioA (2, 3), promedioA (1, 2)) promedioB (promedioB 2 3) (promedioB 1 2)

25