Lógica y Programación



Documentos relacionados
Tema 2. Tipos predefinidos

Tema 2: Introducción a Haskell

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Tema 7. El sistema de clases

El sistema de clases de Haskell. Introducción

Tema 4: Definición de funciones

Tema 4: Definición de funciones

Introducción a Haskell. El lenguaje Haskell

Tema II: Introducción al Lenguaje Funcional

Tema 8: Funciones de orden superior

Tema 8: Funciones de orden superior

Tema 9: Declaraciones de tipos y clases

Tipos en Haskell. Cecilia Manzino

Introducción a Haskell. Cecilia Manzino

Programación Declarativa Haskell Informática Sistemas Curso Pepe Gallardo Universidad de Málaga. Tema 8. Listas

Tema 3. Patrones y Definiciones de Funciones

Laboratorio Análisis Lógico Práctica 2: Tipos de datos en Haskell

Informática Haskell Matemáticas Curso Pepe Gallardo Universidad de Málaga. Tema 8. Listas

1.1 Define un operador ( ) que devuelva True si y solo si tan solo uno de sus argumentos es True. Por ejemplo:? (3 > 2) (2 > 5)

Informática de 1 o de Matemáticas. Ejercicios de Introducción a Haskell. Ejercicio 1 Consideremos la siguiente definición:

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

Práctica 1. Programación Funcional Introducción a Helium

Tema 2: Introducción a la programación con Haskell

Tema 2: Introducción a la programación con Haskell

Para entender la recursividad primero tenemos que entender la recursividad

data Tree a = Tip Node a (Tree a) (Tree a) deriving Show

Introducción a OCaml. October 19, 2015

UNIDAD I. ALGORITMOS

Programación Funcional Haskell Clase 19

Programación Declarativa Haskell Informática Sistemas Curso Pepe Gallardo Universidad de Málaga

Temas de Programación funcional (curso )

Temas de Programación funcional (curso )

Tipos de datos algebraicos

Programación Funcional

UNIDAD 2: INTRODUCCIÓN AL LENGUAJE DE PROGRAMACiÓN R

Ejercicios de programación funcional con Haskell

Introducción a la Programación Genérica

El lenguaje Haskell 98

Expresión, Operador, Operando, Asignación, Prioridad

Metodologías de Programación II Introducción a OCaml

Introducción a la programación. Cecilia Manzino

Tema 1. Tema 2. Informática Haskell Matemáticas Curso Pepe Gallardo Universidad de Málaga

ALPII Práctica 3. Bernardo García Fuentes

Tema 3: Conjuntos y Funciones

Programación Funcional Haskell Clase 21

2. ENTIDADES PRIMITIVAS PARA EL DESARROLLO DE ALGORITMOS

Tema 23: Técnicas de diseño descendente de algoritmos

Programación 1 Tema 3. Información, datos, operaciones y expresiones

Programación Funcional en Haskell

GUÍA BÁSICA DE SCHEME v.4

Práctica N o 1 - Programación Funcional

Tutorial Haskell David Julián Guzmán Cárdenas Cristian Alexanther Rojas Cárdenas Luis Ernesto Gil Castellanos

ENTIDADES PRIMITIVAS PARA EL DESARROLLO DE ALGORITMOS Tipos de datos Expresiones Operadores y operandos Identificadores como localidades de memoria

Programación declarativa ( )

Tema 21: Algoritmos de exploración de grafos

Tema 2: Introducción a la programación con Haskell

Tema 3. Tipos de datos simples

Tema Árboles binarios fmap para árboles binarios Plegado de árboles binarios

Conjuntos y relaciones

Árboles generales. Un árbol es una estructura no lineal acíclica utilizada para organizar información de forma eficiente. La definición es recursiva:

Tema 2. Funciones Lógicas. Algebra de Conmutación. Representación de circuitos digitales. Minimización de funciones lógicas.

Programación Funcional

Tema 3.- Predicados y sentencias condicionales

TEORÍA DE CONJUNTOS A ={ 1, 2, 3, 4, 5, 6 }

Tema 6: Funciones recursivas

Isabelle como un lenguaje funcional

Listas y Recursión. Taller de Álgebra I. Primer Cuatrimestre de 2015

Datos y tipos de datos

Tema 10: Evaluación perezosa

Ejercicios de programación funcional con Haskell

Tema 5: Definiciones de listas por comprensión

Lenguajes de Inteligencia Artificial Segundo curso. Primer cuatrimestre

Tema 5: Definiciones de listas por comprensión

Proyecto Clases de Tipos: Polinomios

3. Tipos primitivos de dato

Transcripción:

Lógica y Programación Programación funcional con Haskell Antonia M. Chávez, Carmen Graciani, Agustín Riscos Dpto. Ciencias de la Computación e Inteligencia Artificial Universidad de Sevilla

Programación funcional La programación funcional es un estilo de programación cuyo método básico de computación es la aplicación de funciones a sus argumentos. GHC (Glasgow Haskell Compiler) es el intérprete de Haskell que usaremos en el curso.

Definición de funciones Una función es una aplicación que toma uno o más argumentos y devuelve un valor. Es una correspondencia en la que cada elemento del dominio está relacionado con un único elemento de la imagen. Ejemplo de definición de función en Haskell: doble x = x * x Notación matemática: f(a, b) + cd Notación Haskell: f a b + c * d Los paréntesis se utilizan para agrupar expresiones: Notación matemática: f(x, g(y)) Notación Haskell: f x (g y)

Definición de funciones Las definiciones se incluyen en ficheros de texto. Se acostumbra a identificar dichos ficheros mediante el sufijo.hs Los nombres de funciones tienen que empezar por una letra en minúscula. En Haskell la disposición del texto del programa (el sangrado) delimita las definiciones mediante la siguiente regla: Una definición acaba con el primer trozo de código con un margen izquierdo menor o igual que el del comienzo de la definición actual. Un comentario simple comienza con -- y se extiende hasta el final de la ĺınea. Un comentario anidado comienza con {- y termina en -}

Evaluación de expresiones Haskell utiliza evaluación perezosa o mediante paso de parámetros por nombre usando punteros para compartir valores de expresiones. cuadrado x = x * x unos = 1:unos cuadrado (2+1) ==> [def. cuadrado] x*x siendo x = (2+1) ==> [def. (+)] x*x siendo x = 3 ==> [sustitución] 3*3 ==> [def. (*)] 9 head unos head (1:unos) 1 ==> [def. unos] ==> [def. head]

Tipos y clases Un tipo es una colección de valores relacionados. Haskell es un lenguaje de tipos seguros: la inferencia de tipo precede a la evaluación. Una clase es una colección de tipos junto con ciertas operaciones llamadas métodos. Una función es polimórfica si su signatura contiene una variable de tipo Una función está sobrecargada si su signatura contiene una restricción de clase

El tipo Bool Constructores: True, False Funciones y operadores: (&&) :: Bool -> Bool -> Bool ( ) :: Bool -> Bool -> Bool not :: Bool -> Bool otherwise :: Bool

El tipo Int Números enteros de precisión limitada en el intervalo [ 2 29, 2 29 1] Funciones y operadores: (+)(-)(*) :: Int -> Int -> Int (^) :: Int -> Int -> Int div, mod :: Int -> Int -> Int abs :: Int -> Int signum :: Int -> Int negate :: Int -> Int even, odd :: Int -> Bool

El tipo Float Números reales. Disponen de una cantidad fija de memoria. Funciones y operadores: (+)(-)(*)(/)(**) :: Float -> Float -> Float (^) :: Float -> Int -> Float signum :: Float -> Float (-1.0, 0.0, 1.0) sin, asin, cos, acos, tan, atan :: Float -> Float atan2 :: Float -> Float -> Float negate, abs, sqrt, log, exp :: Float -> Float pi :: Float trucate, round, floor, ceiling :: Float -> Float fromint :: Int -> Float frominteger :: Integer -> Float

El tipo Integer/Double Enteros/reales de precisión arbitraria Mismas operaciones que para el tipo Int/Float

El tipo Char Caracteres: Se denotan entre comillas simples. Los caracteres especiales van precedidos por \n Salto de ĺınea \ Comilla doble \t Tabulador \ El carácter \ \ Comilla simple Funciones ord :: Char -> Int chr :: Int -> Char isupper, islower, isdigit, isalfa :: Char -> Bool toupper, tolower :: Char -> Char

Tuplas Dato compuesto donde cada componente puede ser de un tipo diferente Si v1, v2,..., vn son valores con tipo t1, t2,..., tn (respectivamente), entonces (v1,v2,...,vn) es una tupla con tipo (t1,t2,...,tn)

Listas Colección de cero o más elementos todos del mismo tipo. [] lista vacía Si v1, v2,..., vn son valores con tipo t entonces v1:(v2:(...:(vn:[])...)) es una lista con tipo [t] La lista anterior también puede expresarse como: [v1,v2,...,vn] El tipo String es equivalente al tipo [Char] La lista de caracteres [ a1, a2,..., am ] también puede expresarse como: "a1a2...am"

Listas por comprensión Definición de conjuntos en Matemáticas: {x 2 : x {1, 2, 3}} Definición en Haskell: [x^2 x <- [1,2,3]] La expresión x <- [1,2,3] se denomina generador [(x,y) x <- [1,2,3], y <- [4,5]] ==> [(1,4),(1,5),(2,4),(2,5),(3,4),(3,5)] Las listas por comprensión pueden tener guardas para restringir los valores. [x x <- [1..10], even x] ==> [2,4,6,8,10]

La clase Eq Contiene los tipos cuyos valores con comparables por igualdad: Bool, Char, String, Int, Integer, Float y Double (y composiciones de los mismos en listas o tuplas) Métodos: (==) :: a -> a -> Bool (/=) :: a -> a -> Bool

La clase Ord Es la subclase de Eq de tipos cuyos valores están ordenados: Bool, Char, String, Int, Integer, Float y Double (y composiciones de los mismos en listas o tuplas) Métodos: (<), (<=), (>), (>=) :: a -> a -> Bool min, max :: a -> a -> a

La clase Show Contiene los tipos cuyos valores se pueden convertir en cadenas de caracteres: Bool, Char, String, Int, Integer, Float y Double (y composiciones de los mismos en listas o tuplas) Método: show :: a -> String

La clase Read Contiene los tipos cuyos valores se pueden obtener a partir de cadenas de caracteres: Bool, Char, String, Int, Integer, Float y Double (y composiciones de los mismos en listas o tuplas) Método: read :: String -> a

La clase Num Es la subclase de Eq y Ord de tipos cuyos valores son números: Int, Integer, Float y Double Métodos: (+), (*), (-) :: a -> a -> a negate, abs, signum :: a -> a

La clase Integral Es la subclase de Num cuyos valores son números enteros: Int e Integer Métodos: div :: a -> a -> a mod :: a -> a -> a

La clase Fractional Es la subclase de Num cuyos valores son números no enteros: Float y Double Métodos: (/) :: a -> a -> a recip :: a -> a

Declaraciones de tipo Se puede definir un nuevo nombre para un tipo existente mediante una declaración de tipo. El nombre del tipo tiene que empezar por mayúscula. type String = [Char] Las declaraciones de tipo pueden tener parámetros. type Par a = (a, a) Las declaraciones de tipo no pueden ser recursivas.

Definiciones de tipos Pueden definirse nuevos tipos data Bool = True False El primer elemento de los distintos valores se llama constructor y tiene que empezar por mayúscula. Los constructores pueden tener parámetros y los tipos definidos también. data Figura = Circulo Float Rectangulo Float Float data Maybe a = Nothing Just a Pueden ser recursivos data Natural = Cero Sucesor Natural

La clase Fractional Puede declarse como instancia de clases data Bool = False True deriving (Eq, Ord, Read, Show) data Lista a = Vacia Incluir a (Lista a) instance (Show a) => Show (Lista a) where show Vacia = [] show (Incluir x xs) = "(" ++ show x ++ ":" ++ show xs ++ ")" *Main> Incluir 2 (Incluir 3 Vacia) (2:(3:[]))

Funciones Si t1, t2,..., t(n+1) son tipos, entonces t1->t2->...->t(n+1) es el tipo de las funciones con n argumentos Las funciones pueden construirse sin nombrarlas mediante las expresiones lambda. Los operadores son funciones binarias cuyo nombre empieza por un símbolo y que se escriben de forma infija. Pueden convertirse en funciones prefijas escribiéndolos entre paréntesis. Las funciones binarias pueden convertirse en operadores escribiéndolas entre acentos franceses.

Funciones Se pueden expresar funciones que reciben y devuelven funciones: componer :: (a -> b) -> (b -> c) -> a -> c componer f g x = g (f x) Las funciones toman sus argumentos de uno en uno (currificación) y pueden utilizarse parcialmente. empareja :: a -> b -> (a,b) empareja x y = (x,y) primeraa :: b -> (Char,b) primeraa = empareja A Las parcializaciones de los operadores se denominan secciones.

Condicionales (map f xs) es la lista obtenida aplicando f a cada elemento de xs (filter p xs) es la lista de los elementos de xs que cumplen la propiedad p (all p xs) se verifica si todos los elementos de xs cumplen la propiedad p. (any p xs) se verifica si algún elemento de xs cumple la propiedad p. (takewhile p xs) es la lista de los elementos iniciales de xs que verifican el predicado p (dropwhile p xs) es la lista xs sin los elementos iniciales que verifican el predicado p

Condicionales if <condición> then <consecuencia> else <alternativa> El tipo de la <condición> debe ser Bool La <consecuencia> y la <alternativa> han de ser del tipo de la imagen de la función. abs :: Int -> Int abs n = if n >= 0 then n else (-n) Ecuaciones guardadas: abs :: Int -> Int abs n n >= 0 = n otherwise = (-n)

Equiparación de patrones Constantes Variables anónimas: Tuplas Listas Enteros: el patrón n+<k> sólo se equipara con números mayores o iguales que <k>.

Esquemas básicos de recursión sobre listas Plegado por la derecha: foldr f [] = v f (x:xs) = op x (f xs) f = foldr op v Plegado por la izquierda: foldl f = fa v where fa ac [] = ac fa ac (x:xs) = fa (op ac x) xs f = foldl op v