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

Documentos relacionados
Ejercicios de Informática de 1 o de Matemáticas ( )

Ejercicios de Informática de 1 o de Matemáticas ( )

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

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

Prácticas de Programación Declarativa ( )

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)

Tema 4: Definición de funciones

Tema 4: Definición de funciones

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Isabelle como un lenguaje funcional

Tema 3: Tipos y clases

Guía 2: Listas, recursión e inducción

Programación Funcional

Ejercicios de Informática de 1º de Matemáticas ( ) José A. Alonso Jiménez

Introducción a Haskell. Cecilia Manzino

Tipos de datos algebraicos

Ejercicios de Informática de 1º de Matemáticas ( ) José A. Alonso Jiménez

Ejercicios de Informática de 1ºde Matemáticas ( ) José A. Alonso Jiménez

Laboratorio de Lenguajes de Programación Introducción al lenguaje ML

Ejercicios de Informática de 1 o de Matemáticas ( )

Guía 1: Funciones, precedencia y tipado

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

Tema 4. Funciones de orden superior

n! = 1 2 n 0! = 1 (n+1)! = (n + 1) n!

Manos a la obra: Recursión, división y listas

Tema 7: Razonamiento sobre programas

Tema 2. Tipos predefinidos

Tema 5: Definiciones de listas por comprensión

Ejercicios de Informática de 1 o de Matemáticas ( ) José A. Alonso Jiménez

Tema 5: Definiciones de listas por comprensión

Tema 3. Patrones y Definiciones de Funciones

Un calculadora avanzada... y algo más!

Tema 6: Funciones recursivas

Guía 2: Funciones, listas, recursión e inducción

Tema 4. Funciones de orden superior

Tema 8: Funciones de orden superior

Tema 8: Funciones de orden superior

Tipos paramétricos y recursivos

Práctica N o 1 - Programación Funcional

El sistema de clases de Haskell. Introducción

Funciones Segunda parte

Tema 13: Aplicaciones de programación funcional

GUÍA BÁSICA DE SCHEME v.4

Tipos de datos y clases de tipos

Programación declarativa ( )

Operaciones aritméticas

Tema 3. Patrones y Definiciones de Funciones

Introducción a los Algoritmos Tipos, Funciones y Patrones

Capitulo IV - Inecuaciones

Introducción a Haskell. El lenguaje Haskell

Programación 1 - Práctica 0, recargada.

Una clasificación de los tipos de datos existentes en los diferentes lenguajes de programación se presenta a continuación:

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

Tema 9: Declaraciones de tipos y clases

Tema II: Introducción al Lenguaje Funcional

Tema 7. El sistema de clases

Programación Declarativa. Ingeniería Informática Especialidad de Computación Cuarto curso. Primer cuatrimestre

Tema 9: Declaraciones de tipos y clases

Introducción a los Algoritmos Validez, Satisfactibilidad, Tipos y Funciones

Ejercicios de programación funcional con Haskell

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

Programación Funcional Haskell Clase 22

Programación en Mathematica

Estructura de un programa en Java. Tipos de datos básicos. class miprimerprograma{ // comentario, no es parte del programa

Números enteros (cortos, largos y sin signo) Números reales (precisión simple y doble) Carácter y cadenas de caracteres. Lógicos.

Guía de Trabajos Prácticos Nº 4

Lenguajes de Programación Programación funcional

Práctica 2. TIPOS DE DATOS SIMPLES

Guardas y Tipos de datos

Divisibilidad y congruencia

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

Programación Funcional Haskell Clase 21

Abstracción de procedimientos

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

TEMA 1: LÓGICA. p p Operador conjunción. Se lee y y se representa por. Su tabla de verdad es: p q p q

Escuela Normal Superior N 40 Mariano Moreno. Cuadernillo Propedéutico 2017 Nivel Superior

Ejercicios de programación funcional con Haskell

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

Programación Declarativa. Ingeniería Informática Especialidad de Computación Cuarto curso. Primer cuatrimestre

Programación Declarativa UNIVERSIDAD DE MÁLAGA

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

Es toda la información que utiliza el computador. Según sea la información que guardemos en los datos, se clasifican en los siguientes tipos:

Lenguaje cotidiano y lenguaje matemático

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

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

Lenguajes funcionales: λ-cálculo

GLOSARIO 1. Qué es bit y byte? Bit: Es la unidad mínima de información. Puede ser 0 o 1. Byte: Es el conjunto de 8 bits. Ejemplo:

Guía 2: Funciones, listas, recursión e inducción

Práctico 2: Especificación, derivación y verificación de programas funcionales

Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28

ALPII Práctica 3. Bernardo García Fuentes

Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

Ampliación Matemática Discreta. Justo Peralta López

Tema 1: Introducción a la programación funcional

Transcripción:

Ejercicios de Introducción a Haskell Informática de 1 o de Matemáticas Ejercicio 1 Consideremos la siguiente definición: doble x = x + x El valor de doble(doble 3) se puede calcular usando distintos métodos de evaluación. doble (doble 3) = doble (3 + 3) [def. de doble] = doble 6 [def. de +] = 6+6 [def. de doble] = 12 [def. de +] doble (doble 3) = (doble 3) + (doble 3) [def. de doble] = (3 +3) + (doble 3) [def. de doble] = 6 + (doble 3) [def. de +] = 6 + (3 + 3) [def. de doble] = 6+6 [def. de +] = 12 [def. de +] Calcular de una forma distinta a las propuestas el resultado de doble (doble 3). Ejercicio 2 Demostrar que sum [x] = x para cualquier número x. Ejercicio 3 Definir la función producto que calcule el producto de una lista de números y, usando la definición, demostrar que producto [2, 3, 4] = 24. Ejercicio 4 Consideremos la siguiente definición: ordena [] = [] ordena (x:xs) = (ordena menores) ++ [x] ++ (ordena mayores) where menores = [a a <- xs, a <= x] mayores = [b b <- xs, b > x] Cómo hay que modificar la definición anterior de ordena para que devuelva la lista ordenada de mayor a menor? Ejercicio 5 1. Cuál es el efecto de cambiar <= por < en la definición de ordena? 2. Cuál es el valor de ordena [2,2,3,1,1] con la nueva definición? Escribir su cálculo. Ejercicio 6 Escribir los paréntesis correspondientes a las siguientes expresiones: 2 3 + 4

2 3 + 4 5 2 + 3 4 5 Ejercicio 7 La siguiente definición contiene 4 errores sintácticos. Corregir los errores y comprobar que la definición es correcta calculando con Haskell el valor de n. n = A div length xs where A = 10 xs = [1, 2, 3, 4, 5] Ejercicio 8 Cuáles son los tipos de los siguientes valores? [ a, b, c ] ( a, b, c ) [(False, O ),(True, 1 )] ([False, True],[ 0, 1 ]) [tail, init, reverse] Ejercicio 9 Cuáles son los tipos de las siguientes funciones? segundo xs = head(tail xs) intercambio (x,y) = (y,x) par x y = (x,y) doble x = x*2 palindromo xs = reverse xs == xs dosveces f s = f(f s) Indicación: Incluir las restricciones de clase necesarias si las funciones utilizan operadores con sobrecarga. Ejercicio 10 Comprobar las respuestas a los dos ejercicios anteriores utilizando el intérprete. Ejercicio 11 Por qué no es posible, en general, que los tipos de las funciones sean instancias de la clase Eq? Cuándo es posible? Indicación: Dos funciones del mismo tipo son iguales si siempre devuelven resultados idénticos para argumentos idénticos. Ejercicio 12 Para cada una de las siguientes expresiones, indica si son válidas o no desde el punto de vista de los tipos. Si lo son, indicar el tipo: [7, 9] 7:9 [(7,9)] [[7],[9]] ([7],[9]) 7:[9] [7]:9 (7,[9]) [7,[9]] [7:[9]]

Ejercicio 13 Razona cuáles de las siguientes igualdades son válidas, explicando qué tipo debe suponerse en cada caso para la variable xs de modo que las expresiones tengan un tipo correcto: [[]] ++ xs = xs [[]] ++ [xs] =[[],xs] [[]] ++ xs = [xs] [xs] ++ [] = [xs] [xs] ++ [xs] = [xs,xs] Ejercicio 14 Cuáles son los valores de las siguientes expresiones y cuáles son erróneas? 1:[2,3,4] 1:2:3:4:[] [1,2,3]:[4.. 7] [1,2,3] ++ [4.. 7] 1:[ a, b ] "abc" ++ "cd" "a":"bcc" "a" ++ "bcc" a : b a :"b" [1,4,7] ++ 4:[5:[]] [True, True:[]] True:[True,False] Ejercicio 15 Escribe una función que dado el radio de un círculo devuelva su área. Expresar su signatura. Ejercicio 16 Construye una expresión que tenga dos apariciones de la lista vacía, siendo la primera de ellas de tipo [Int] y la segunda de tipo [Char]. Ejercicio 17 Definir la función ultimo tal que (ultimo xs) es el último elemento de la lista no vacía xs. Por ejemplo, ultimo [2,5,3] ==> 3 Dar dos definiciones usando adecuadamente las funciones (head, tail,!!, take, drop, length, ++, reverse) y comprobar su equivalencia con QuickCheck. Nota: La función ultimo es la predefinida last. Ejercicio 18 Definir la función iniciales tal que (iniciales xs) es la lista obtenida eliminando el último elemento de la lista no vacía xs. Por ejemplo, iniciales [2,5,3] ==> [2,5] Dar dos definiciones usando adecuadamente las funciones (head, tail,!!, take, drop, length, ++, reverse) y comprobar su equivalencia usando QuickCheck. Nota: La función iniciales es la predefinida init. Ejercicio 19 Comprobar con QuickCheck que para toda lista no vacía xs, la lista obtenida al añadirle a los iniciales de xs la lista formada por el último elemento de xs es xs.

Ejercicio 20 Transformación entre euros y pesetas 1. Calcular cuántas pesetas son 49 euros (1 euro son 166,386 pesetas). 2. Definir la constante cambioeuro cuyo valor es 166,386 y repetir el cálculo anterior usando la constante definida. 3. Definir la función pesetas tal que (pesetas x) es la cantidad de pesetas correspondientes a x euros y repetir el cálculo anterior usando la función definida. 4. Definir la función euros tal que (euros x) es la cantidad de euros correspondientes a x pesetas y calcular los euros correspondientes a 8152,914 pesetas. 5. Definir la propiedad prop_eurospesetas tal que (prop_eurospesetas x) se verifique si al transformar x euros en pesetas y las pesetas obtenidas en euros se obtienen x euros. Comprobar la prop_eurospesetas con 49 euros. 6. Comprobar la prop_eurospesetas con QuickCheck. 7. Calcular la diferencia entre euros(pesetas 3.625) y 3,625. 8. Definir el operador ~= tal que (x ~= y) se verifique si el valor absoluto de la diferencia entre x e y es menor que una milésima. Se dice que x e y son casi iguales. 9. Definir la propiedad prop_eurospesetas tal que (prop_eurospesetas x) se verifique si al transformar x euros en pesetas y las pesetas obtenidas en euros se obtiene una cantidad casi igual a x de euros. Comprobar la prop_eurospesetas con 49 euros. 10. Comprobar la prop_eurospesetas con QuickCheck. Ejercicio 21 Definir la función mitades :: [a] -> ([a],[a]) tal que, dada una lista de longitud par, la divida en dos mitades, devolviendo las dos listas correspondientes. Por ejemplo, *Main> mitades [1,2,3,4,5,6] ([1,2,3],[4,5,6]) Dar dos definiciones de mitades y comprobar con QuickCheck que son equivalentes. Ejercicio 22 Definir un procedimiento union que reciba dos listas de dos elementos cada una, y devuelva una lista, que consiste en los elementos de la primera lista seguidos de los elementos de la segunda, sin repetición. union [1, 2] [3, 1] ==> [1, 2, 3] Ejercicio 23 Definir la función tailseguro :: [a] -> [a] que se comporta como la función tail, excepto que tailseguro aplica la lista vacía en sí misma y tail devuelve error en ese caso. Dar cuatro definiciones distintas utilizando

1. una expresión condicional 2. guardas 3. ecuaciones 4. patrones Comprobar con QuickCheck que las definiciones son equivalentes. Indicación: Usar la función null. Ejercicio 24 El operador de conjunción puede definirse con patrones como True && True = True _ && _ = False Redefinir el operador conjunción como (&&&) a partir de la definición anterior, pero usando expresiones condicionales en lugar de emparejamiento de patrones. Comprobar con QuickCheck que las definiciones son equivalentes. Ejercicio 25 El operador de conjunción puede definirse con patrones como True && b = b False && _ = False Redefinir el operador conjunción como (&&&&) a partir de la definición anterior, pero usando expresiones condicionales en lugar de emparejamiento de patrones. Comprobar con QuickCheck que las definiciones son equivalentes. Ejercicio 26 De manera similar al operador conjunción, demostrar cómo usando emparejamiento de patrones el operador lógico disyunción puede definirse de cuatro formas diferentes (disj_1, disj_2, disj_3 y disj_4). Comprobar con QuickCheck que las definiciones son equivalentes entre si y con el operador ( ). Ejercicio 27 Redefinir la función mult x y z = x*y*z usando expresiones lambda y comprobar con QuickCheck que las definiciones son equivalentes. Ejercicio 28 Máximo de enteros 1. Definir, por casos, la función maxi tal que maxi x y es el máximo de los números enteros x e y. Por ejemplo, maxi 2 5 ==> 5 maxi 7 5 ==> 7 2. En este apartado vamos a comprobar propiedades del máximo. a) Comprobar con QuickCheck que el máximo de x e y es mayor o igual que x y que y. b) Comprobar con QuickCheck que el máximo de x e y es x ó y.

c) Comprobar con QuickCheck que si x es mayor o igual que y, entonces el máximo de x e y es x. d) Comprobar con QuickCheck que si y es mayor o igual que x, entonces el máximo de x e y es y. Ejercicio 29 El objetivo de este ejercicio consiste en definir la función menormultiplo tal que (menormultiplo n p) es el menor número mayor o igual que n que es múltiplo de p. Por ejemplo, menormultiplo 16 5 ==> 20 menormultiplo 167 25 ==> 175 Para ello, partiremos de la siguiente propiedad menormultiplo n p = n + (p - (n resto p)) es decir, n más la diferencia entre p y el resto de la división entre n y p. 1. Definir la función menormultiplo. 2. Calcular el resultado de menormultiplo para los ejemplos anteriores. 3. En este apartado vamos a estudiar propiedades de la función menormultiplo. a) Comprobar con QuickCheck si (menormultiplo n p) es mayor o igual que n. b) Comprobar con QuickCheck si (menormultiplo n p) es múltiplo de p. c) Comprobar con QuickCheck si (menormultiplo n n) es igual a n. 4. Corregir los errores de la definición de menormultiplo escribiendo una nueva función menormultiplo Definir las correspondientes propiedades y comprobarlas. 5. Obtener una definición recursiva que se denomine menormultiplo, definir las correspondientes propiedades y comprobarlas. Ejercicio 30 Raíces de una ecuación de segundo grado 1. Definir la función raices de forma que raices a b c devuelve la lista de las raíces reales de la ecuación ax 2 + bx + c = 0. Por ejemplo, raices 1 (-2) 1 ==> [1.0,1.0] raices 1 2 3 ==> [-1.0,-2.0] Escribir distintas definiciones de la función raices. 2. Comprobar con QuickCheck si todas las definiciones coinciden. 3. Comprobar con QuickCheck que las definiciones son correctas; es decir, que los elementos del resultado son raices de la ecuación. Ejercicio 31 La disyunción excluyente xor de dos fórmulas se verifica si una es verdadera y la otra es falsa. 1. Definir la función xor_1 que calcule la disyunción excluyente a partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea de la tabla.

2. Definir la función xor_2 que calcule la disyunción excluyente a partir de la tabla de verdad y patrones. Usar 2 ecuaciones, una por cada valor del primer argumento. 3. Definir la función xor_3 que calcule la disyunción excluyente a partir de la disyunción ( ), conjunción (&&) y negación (not). Usar 1 ecuación. 4. Definir la función xor_4 que calcule la disyunción excluyente a partir de desigualdad (/=). Usar 1 ecuación. 5. Comprobar con QuickCheck la equivalencia de las 4 definiciones anteriores. Ejercicio 32 Definir la función media3 que reciba como argumentos tres números y devuelva la media aritmética de dichos números. Por ejemplo, media3 1 3 8 ==> 4.0 media3 (-1) 0 7 ==> 2.0 media3 (-3) 0 3 ==> 0.0 Ejercicio 33 Definir la función sumamonedas que reciba los siguientes argumentos: euros, dos-euros, cinco-euros, diez-euros y veinte-eros y devuelva la cantidad total de euros. Por ejemplo, sumamonedas 0 0 0 0 1 ==> 20 sumamonedas 0 0 8 0 3 ==> 100 sumamonedas 1 1 1 1 1 ==> 38 Ejercicio 34 Definir la función areadecoronacircular que calcule el área de una corona circular a partir de los radios interior y exterior de la misma. areadecoronacircular 1 2 ==> 9.42477796076938 areadecoronacircular 2 5 ==> 65.9734457253857 areadecoronacircular 3 5 ==> 50.2654824574367 Indicación: Usar la constante pi. Ejercicio 35 Definir la función intercala que reciba dos listas xs e ys de dos elementos cada una, y devuelva una lista de cuatro elementos, construida intercalando los elementos de xs e ys. Por ejemplo, intercala [1,4] [3,2] ==> [1,3,4,2] Ejercicio 36 Definir la función reagrupa que tome una tupla cuyos elementos son tres tuplas de tres elementos cada una, y actúe del siguiente modo: reagrupa ((1,2,3),(4,5,6),(7,8,9)) ==> ((1,4,7),(2,5,8),(3,6,9)) Ejercicio 37 Definir la función maxmin que reciba cuatro números, y devuelva una lista formada por dos pares de la forma ("min",x) y ("max". y) donde x e y son el mínimo y el máximo de los cuatro números. maxmin 2 5 (-1) 7 maxmin 0 5 9 4 ==> [("min",-1),("max",7)] ==> [("min",0),("max",9)] Indicación: Usar las funciones minimum y maximum.

Ejercicio 38 Definir la función tresiguales tal que (tresiguales x y z) se verifica si los elementos x, y y z son iguales. Por ejemplo, tresiguales 2 3 2 ==> False tresiguales 2 2 2 ==> True Ejercicio 39 Definir la función tresdiferentes tal que (tresdiferentes x y z) se verifica si los elementos x, y y z son distintos. Por ejemplo, tresdiferentes 2 3 5 ==> True tresdiferentes 2 3 2 ==> False Ejercicio 40 Definir la función cuatroiguales tal que (cuatroiguales x y z u) se verifica si los elementos x, y, z y u son iguales. Por ejemplo, cuatroiguales 3 3 3 3 ==> True cuatroiguales 3 3 2 3 ==> False Indicación: Usar la función tresiguales. Ejercicio 41 Definir la función maxtres tal que (maxtres x y z) es el máximo de x, y y z. Por ejemplo, maxtres 7 3 5 ==> 5 maxtres 7 12 5 ==> 12 maxtres 7 12 50 ==> 50 Ejercicio 42 Escribe una función que calcule el producto escalar de dos listas (que pueden tener diferentes longitudes). Es decir, dadas las listas [3, 5, 2] y [1, 5, 8, 6], debe devolver 3 11 + 5 5 + 2 8 que es 44. Ejercicio 43 Escribe una función que dada una lista de entrada, devuelva un booleano que indique si la lista de entrada estaba o no ordenada de menor a mayor.