Diferencia entre revisiones de «Relación 6»
De Informática de 1º de Matemáticas [Curso 2021-22, Grupo 2]
(No se muestran 10 ediciones intermedias de 6 usuarios) | |||
Línea 28: | Línea 28: | ||
-- potencia 2 3 == 8 | -- potencia 2 3 == 8 | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Irene Ortega, Ana Sánchez Martín | ||
potencia :: Integer -> Integer -> Integer | potencia :: Integer -> Integer -> Integer | ||
potencia _ 0 = 1 | potencia _ 0 = 1 | ||
potencia x n = x* potencia x (n-1) | potencia x n = x* potencia x (n-1) | ||
-- Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sosa Caballero | |||
potencia :: Integer -> Integer -> Integer | |||
potencia _ 0 = 1 | |||
potencia x n | n > 0 = x * potencia x (n-1) | |||
| n < 0 = error "n tiene que ser un natural (>=0)" | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 38: | Línea 43: | ||
-- equivalente a la predefinida (^). | -- equivalente a la predefinida (^). | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | ||
-- La propiedad es | -- La propiedad es | ||
prop_potencia :: Integer -> Integer -> Property | prop_potencia :: Integer -> Integer -> Property | ||
Línea 59: | Línea 64: | ||
-- mcd 30 45 == 15 | -- mcd 30 45 == 15 | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Nicolás Rodríguez Ruiz, Irene Ortega, Elsa Domínguez, Ana Sosa Caballero | ||
mcd :: Integer -> Integer -> Integer | mcd :: Integer -> Integer -> Integer | ||
mcd a 0 = a | mcd a 0 = a | ||
mcd a b = mcd b (mod a b) | mcd a b = mcd b (mod a b) | ||
-- Adolfo Sagrera Vivancos, Ana Sánchez Martín | |||
mcd1 :: Integer -> Integer -> Integer | |||
mcd1 a b | b==0 = a | |||
| b > 0 = mcd b (mod a b) | |||
Línea 71: | Línea 80: | ||
-- menor de los números a y b. | -- menor de los números a y b. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | ||
-- La propiedad es | -- La propiedad es | ||
prop_mcd :: Integer -> Integer -> Property | prop_mcd :: Integer -> Integer -> Property | ||
Línea 94: | Línea 103: | ||
1 | 1 | ||
1 | 1 | ||
-- Nicolás Rodríguez Ruiz, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | |||
prop_mcd_div :: Integer -> Integer -> Property | |||
prop_mcd_div a b = a>0 && b>0 && a/=b==> mcd a b <= (max a b) `div` 2 | |||
-- La comprobación es | |||
-- +++ OK, passed 100 tests; 407 discarded. | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ejercicio 3.1, Definir por recursión la función | -- Ejercicio 3.1, Definir por recursión la función | ||
Línea 103: | Línea 117: | ||
-- pertenece 4 [2,3,5] == False | -- pertenece 4 [2,3,5] == False | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Irene Ortega, Ana Sánchez Martín, Ana Sosa Caballero | ||
pertenece :: Eq a => a -> [a] -> Bool | pertenece :: Eq a => a -> [a] -> Bool | ||
pertenece _ [] = False | pertenece _ [] = False | ||
pertenece n (x:xs) | n == x = True | pertenece n (x:xs) | n == x = True | ||
|otherwise = pertenece n xs | |otherwise = pertenece n xs | ||
-- Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos | |||
pertenece :: Eq a => a -> [a] -> Bool | |||
pertenece _ [] = False | |||
pertenece y (x:xs) = y==x || pertenece y xs | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ejercicio 3.2. Comprobar con quickCheck que pertenece es equivalente | -- Ejercicio 3.2. Comprobar con quickCheck que pertenece es equivalente | ||
-- a elem. | -- a elem. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | ||
-- La propiedad es | -- La propiedad es | ||
prop_pertenece :: Int -> [Int] -> Bool | prop_pertenece :: Int -> [Int] -> Bool | ||
Línea 128: | Línea 145: | ||
-- concatenaListas [[1..3],[5..7],[8..10]] == [1,2,3,5,6,7,8,9,10] | -- concatenaListas [[1..3],[5..7],[8..10]] == [1,2,3,5,6,7,8,9,10] | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | |||
-- Lucía Hernández , Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | |||
concatenaListas :: [[a]] -> [a] | concatenaListas :: [[a]] -> [a] | ||
concatenaListas [] = [] | concatenaListas [] = [] | ||
concatenaListas (xs:xss) = xs ++ concatenaListas xss | concatenaListas (xs:xss) = xs ++ concatenaListas xss | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ejercicio 4.2. Comprobar con QuickCheck que concatenaListas es | -- Ejercicio 4.2. Comprobar con QuickCheck que concatenaListas es | ||
Línea 137: | Línea 156: | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Nicolás Rodrígez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | |||
-- La propiedad es | -- La propiedad es | ||
prop_concat :: [[Int]] -> Bool | prop_concat :: [[Int]] -> Bool | ||
prop_concat xss = | prop_concat xss = concat xss == concatenaListas xss | ||
-- La comprobación es | -- La comprobación es | ||
-- +++ OK, passed 100 tests. | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 151: | Línea 172: | ||
-- coge (-3) [4..12] == [] | -- coge (-3) [4..12] == [] | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín | ||
coge :: Int -> [a] -> [a] | coge :: Int -> [a] -> [a] | ||
coge _ [] = [] | coge _ [] = [] | ||
coge n (x:xs) | n<=0 = [] | coge n (x:xs) | n<=0 = [] | ||
| otherwise = x : coge (n-1) xs | | otherwise = x : coge (n-1) XS | ||
-- Ana Sosa Caballero | |||
coge' :: Int -> [a] -> [a] | |||
coge' n [] = [] | |||
coge' 0 xs = [] | |||
coge' n (x:xs) | n > 0 = x : coge (n-1) xs | |||
| otherwise = [] | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 161: | Línea 189: | ||
-- take. | -- take. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | ||
-- La propiedad es | -- La propiedad es | ||
prop_coge :: Int -> [Int] -> Bool | prop_coge :: Int -> [Int] -> Bool | ||
prop_coge n xs = coge n xs == take n xs | prop_coge n xs = coge n xs == take n xs | ||
-- La comprobación es quickCheck | -- La comprobación es quickCheck prop_coge | ||
+++ OK, passed 100 tests | +++ OK, passed 100 tests | ||
Línea 176: | Línea 204: | ||
-- sumaCuadradosR 4 == 30 | -- sumaCuadradosR 4 == 30 | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Nicolás Rodríguez Ruiz, Ana Sánchez Martín, Ana Sosa Caballero | ||
sumaCuadradosR :: Integer -> Integer | sumaCuadradosR :: Integer -> Integer | ||
sumaCuadradosR 0 = 0 | sumaCuadradosR 0 = 0 | ||
sumaCuadradosR n = n^2 + sumaCuadradosR (n-1) | sumaCuadradosR n = n^2 + sumaCuadradosR (n-1) | ||
-- Elsa Domínguez, Adolfo Sagrera Vivancos | |||
sumaCuadradosR :: Integer -> Integer | |||
sumaCuadradosR 1 = 1 | |||
sumaCuadradosR n | n < 0 = error "n debe ser mayor que cero" | |||
| otherwise = n^2 + sumaCuadradosR (n-1) | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ejercicio 6.2. Comprobar con QuickCheck si sumaCuadradosR n es igual a | -- Ejercicio 6.2. Comprobar con QuickCheck si sumaCuadradosR n es igual a | ||
-- n(n+1)(2n+1)/6. | -- n(n+1)(2n+1)/6. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | ||
-- La propiedad es | -- La propiedad es | ||
prop_SumaCuadrados :: Integer -> Property | prop_SumaCuadrados :: Integer -> Property | ||
Línea 199: | Línea 233: | ||
-- sumaCuadradosC 4 == 30 | -- sumaCuadradosC 4 == 30 | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | ||
sumaCuadradosC :: Integer -> Integer | sumaCuadradosC :: Integer -> Integer | ||
sumaCuadradosC n = sum [ x^2 | x <- [1..n]] | sumaCuadradosC n = sum [x^2 | x <- [1..n]] | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 208: | Línea 242: | ||
-- naturales. | -- naturales. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | ||
-- La propiedad es | -- La propiedad es | ||
prop_sumaCuadradosR :: Integer -> Property | prop_sumaCuadradosR :: Integer -> Property | ||
Línea 223: | Línea 257: | ||
-- digitosR 320274 == [3,2,0,2,7,4] | -- digitosR 320274 == [3,2,0,2,7,4] | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín | ||
digitosR :: Integer -> [Integer] | digitosR :: Integer -> [Integer] | ||
digitosR n = if n<10 then [n] | digitosR n = if n<10 then [n] | ||
else digitosR (div n 10) ++ [rem n 10] | else digitosR (div n 10) ++ [rem n 10] | ||
-- Ana Sosa Caballero | |||
digitosR' :: Integer -> [Integer] | |||
digitosR' 0 = [] | |||
digitosR' n = digitosR (div n 10) ++ [rem n 10] | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ejercicio 7.2. Definir, por comprensión, la función | -- Ejercicio 7.2. Definir, por comprensión, la función | ||
Línea 235: | Línea 274: | ||
-- Indicación: Usar las funciones show y read. | -- Indicación: Usar las funciones show y read. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | |||
-- Lucía Hernández | |||
digitosC :: Integer -> [Integer] | digitosC :: Integer -> [Integer] | ||
digitosC n = [read [x] | x <- show n] | digitosC n = [read [x] | x <- show n] | ||
Línea 243: | Línea 281: | ||
-- digitosC son equivalentes. | -- digitosC son equivalentes. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | ||
-- La propiedad es | -- La propiedad es | ||
prop_digitos :: Integer -> Property | prop_digitos :: Integer -> Property | ||
Línea 259: | Línea 297: | ||
-- sumaDigitosR 20045 == 11 | -- sumaDigitosR 20045 == 11 | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | ||
sumaDigitosR :: Integer -> Integer | sumaDigitosR :: Integer -> Integer | ||
sumaDigitosR n = if n<10 then n | sumaDigitosR n = if n<10 then n | ||
else rem n 10 + sumaDigitosR (div n 10) | else rem n 10 + sumaDigitosR (div n 10) | ||
-- Elsa Domínguez | |||
sumaDigitosR' :: Integer -> Integer | |||
sumaDigitosR' 0 = 0 | |||
sumaDigitosR' n | n < 0 = error "no es posible" | |||
| otherwise = rem n 10 + sumaDigitosR (div n 10) | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 272: | Línea 315: | ||
-- sumaDigitosNR 20045 == 11 | -- sumaDigitosNR 20045 == 11 | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Ana Sosa Caballero | ||
sumaDigitosNR :: Integer -> Integer | sumaDigitosNR :: Integer -> Integer | ||
sumaDigitosNR n = sum (digitosR n) | sumaDigitosNR n = sum (digitosR n) | ||
-- Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín | |||
sumaDigitosNR :: Integer -> Integer | |||
sumaDigitosNR n = sum (digitosC n) | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 280: | Línea 326: | ||
-- y sumaDigitosNR son equivalentes. | -- y sumaDigitosNR son equivalentes. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | ||
-- La propiedad es | -- La propiedad es | ||
prop_sumaDigitos :: Integer -> Property | prop_sumaDigitos :: Integer -> Property | ||
prop_sumaDigitos n = n>= 0 ==> sumaDigitosR n == sumaDigitosNR n | prop_sumaDigitos n = n>= 0 ==> sumaDigitosR n == sumaDigitosNR n | ||
-- La comprobación es quickCheck prop_sumaDigitos | -- La comprobación es quickCheck prop_sumaDigitos | ||
+++ OK, passed 100 tests. | +++ OK, passed 100 tests. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 299: | Línea 343: | ||
-- listaNumeroR [0,0,1] == 1 | -- listaNumeroR [0,0,1] == 1 | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Ana Sánchez Martín, Ana Sosa Caballero | ||
listaNumeroR :: [Integer] -> Integer | listaNumeroR :: [Integer] -> Integer | ||
listaNumeroR [] = 0 | listaNumeroR [] = 0 | ||
listaNumeroR [x] = x | listaNumeroR [x] = x | ||
listaNumeroR (x:xs) = x*10^(length (xs)) + listaNumeroR xs | listaNumeroR (x:xs) = x*10^(length (xs)) + listaNumeroR xs | ||
-- Elsa Domínguez, Adolfo Sagrera Vivancos | |||
listaNumeroR' :: [Integer] -> Integer | |||
listaNumeroR' [] = 0 | |||
listaNumeroR' [x] = x | |||
listaNumeroR' xs = last xs + (listaNumeroR (init xs))*10 | |||
--José Manuel García | |||
listaNumeroR :: [Integer] -> Integer | |||
listaNumeroR (x:xs) = read ( (show x) ++ listaNumeroR' xs) :: Integer | |||
listaNumeroR' :: [Integer] -> [Char] | |||
listaNumeroR' [] = [] | |||
listaNumeroR' (x:xs) = show x ++ listaNumeroR' xs | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 314: | Línea 370: | ||
-- listaNumeroC [0,0,1] == 1 | -- listaNumeroC [0,0,1] == 1 | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Elsa Domínguez, Ana Sánchez Martín | ||
listaNumeroC :: [Integer] -> Integer | listaNumeroC :: [Integer] -> Integer | ||
listaNumeroC xs = sum [x*10^s | (x,s) <- zip(reverse xs) [0..length xs -1]] | listaNumeroC xs = sum [x*10^s | (x,s) <- zip(reverse xs) [0..length xs -1]] | ||
-- Adolfo Sagrera Vivancos | |||
listaNumeroC' :: [Integer] -> Integer | |||
listaNumeroC' xs = sum [ x*(10^y) | (x,y) <- agrupa1 xs] | |||
agrupa1 xs = zip (reverse xs) [0..] | |||
--José Manuel García | |||
listaNumeroC :: [Integer] -> Integer | |||
listaNumeroC xs = read [stringToChar t | t <- [show a | a <- xs]] :: Integer | |||
stringToChar :: String -> Char | |||
stringToChar x = head (x) | |||
-- Ana Sosa Caballero | |||
listaNumeroC'' :: [Integer] -> Integer | |||
listaNumeroC'' [x] = x | |||
listaNumeroC'' xs = sum [ x*10^(length xs) | x <- xs] | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ejercicio 9.3. Comprobar con QuickCheck que las funciones | -- Ejercicio 9.3. Comprobar con QuickCheck que las funciones | ||
-- listaNumeroR y listaNumeroC son equivalentes. | -- listaNumeroR y listaNumeroC son equivalentes. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
--Lucía Hernández | --Lucía Hernández, Elsa Domínguez, Ana Sánchez Martín, Ana Sosa Caballero | ||
-- La propiedad es | -- La propiedad es | ||
prop_listaNumero :: [Integer] -> Bool | prop_listaNumero :: [Integer] -> Bool | ||
Línea 329: | Línea 399: | ||
-- La comprobación es quickCheck prop_listaNumero | -- La comprobación es quickCheck prop_listaNumero | ||
+++ OK, passed 100 tests. | +++ OK, passed 100 tests. | ||
-- Adolfo Sagrera Vivancos | |||
prop_listaNumero' xs = not(null xs) ==> listaNumeroR xs == listaNumeroC xs | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 340: | Línea 413: | ||
-- mayorExponenteR 2 60 == 2 | -- mayorExponenteR 2 60 == 2 | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero | ||
mayorExponenteR :: Integer -> Integer -> Integer | mayorExponenteR :: Integer -> Integer -> Integer | ||
mayorExponenteR _ 0 = 0 | mayorExponenteR _ 0 = 0 | ||
mayorExponenteR a b | mod b | mayorExponenteR a b | mod b a == 0 = 1 + mayorExponenteR a( div b a) | ||
| otherwise = 0 | | otherwise = 0 | ||
Línea 356: | Línea 429: | ||
-- mayorExponenteC 5 101 == 0 | -- mayorExponenteC 5 101 == 0 | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Adolfo Sagrera Vivancos, Ana Sánchez Martín | ||
mayorExponenteC :: Integer -> Integer -> Integer | mayorExponenteC :: Integer -> Integer -> Integer | ||
mayorExponenteC a b = last [s | s<- [0..b], mod b (a^s) == 0] | mayorExponenteC a b = last [s | s<- [0..b], mod b (a^s) == 0] | ||
-- Elsa Domínguez | |||
mayorExponenteC' :: Integer -> Integer -> Integer | |||
mayorExponenteC' a b | rem b a /= 0 = 0 -- mejora la eficiencia | |||
| otherwise = last [x | x <- [0..32], rem b (a^x) == 0] | |||
</source> | </source> |
Revisión actual del 10:39 17 nov 2021
-- I1M 2021-22: Rel_6.hs (5 de noviembre de 2021)
-- Definiciones por recursión
-- Departamento de Ciencias de la Computación e I.A.
-- Universidad de Sevilla
-- =====================================================================
-- ---------------------------------------------------------------------
-- Introducción --
-- ---------------------------------------------------------------------
-- En esta relación se presentan ejercicios con definiciones por
-- recursión correspondientes al tema 6 cuyas transparencias se
-- encuentran en
-- http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-6.html
-- ---------------------------------------------------------------------
-- Importación de librerías auxiliares --
-- ---------------------------------------------------------------------
import Test.QuickCheck
-- ---------------------------------------------------------------------
-- Ejercicio 1.1. Definir por recursión la función
-- potencia :: Integer -> Integer -> Integer
-- tal que (potencia x n) es x elevado al número natural n. Por ejemplo,
-- potencia 2 3 == 8
-- ---------------------------------------------------------------------
-- Lucía Hernández, Irene Ortega, Ana Sánchez Martín
potencia :: Integer -> Integer -> Integer
potencia _ 0 = 1
potencia x n = x* potencia x (n-1)
-- Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sosa Caballero
potencia :: Integer -> Integer -> Integer
potencia _ 0 = 1
potencia x n | n > 0 = x * potencia x (n-1)
| n < 0 = error "n tiene que ser un natural (>=0)"
-- ---------------------------------------------------------------------
-- Ejercicio 1.2. Comprobar con QuickCheck que la función potencia es
-- equivalente a la predefinida (^).
-- ---------------------------------------------------------------------
-- Lucía Hernández, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
-- La propiedad es
prop_potencia :: Integer -> Integer -> Property
prop_potencia x n = n>=0 ==> x^n == potencia x n
-- La comprobación es quickCheck prop_potencia
+++ OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- Ejercicio 2.1. Dados dos números naturales, a y b, es posible
-- calcular su máximo común divisor mediante el Algoritmo de
-- Euclides. Este algoritmo se puede resumir en la siguiente fórmula:
-- mcd(a,b) = a, si b = 0
-- = mcd (b, a módulo b), si b > 0
--
-- Definir la función
-- mcd :: Integer -> Integer -> Integer
-- tal que (mcd a b) es el máximo común divisor de a y b calculado
-- mediante el algoritmo de Euclides. Por ejemplo,
-- mcd 30 45 == 15
-- ---------------------------------------------------------------------
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Irene Ortega, Elsa Domínguez, Ana Sosa Caballero
mcd :: Integer -> Integer -> Integer
mcd a 0 = a
mcd a b = mcd b (mod a b)
-- Adolfo Sagrera Vivancos, Ana Sánchez Martín
mcd1 :: Integer -> Integer -> Integer
mcd1 a b | b==0 = a
| b > 0 = mcd b (mod a b)
-- ---------------------------------------------------------------------
-- Ejercicio 2.2. Definir y comprobar la propiedad prop_mcd según la
-- cual el máximo común divisor de dos números a y b (ambos mayores que
-- 0) es siempre mayor o igual que 1 y además es menor o igual que el
-- menor de los números a y b.
-- ---------------------------------------------------------------------
-- Lucía Hernández, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
-- La propiedad es
prop_mcd :: Integer -> Integer -> Property
prop_mcd a b = a>0 && b>0 ==> mcd a b >=1 && mcd a b <= min a b
-- Su comprobación es quickCheck prop_mcd
+++ OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- Ejercicio 2.3. Teniendo en cuenta que buscamos el máximo común
-- divisor de a y b, sería razonable pensar que el máximo común divisor
-- siempre sería igual o menor que la mitad del máximo de a y b. Definir
-- esta propiedad y comprobarla.
-- ---------------------------------------------------------------------
--- Lucía Hernández
-- La propiedad es
prop_mcd_div :: Integer -> Integer -> Property
prop_mcd_div a b = a>0 && b>0 ==> (mcd a b) <= div (max a b)2
-- La comprobación es quickCheck prop_mcd_div
*** Failed! Falsifiable (after 1 test):
1
1
-- Nicolás Rodríguez Ruiz, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
prop_mcd_div :: Integer -> Integer -> Property
prop_mcd_div a b = a>0 && b>0 && a/=b==> mcd a b <= (max a b) `div` 2
-- La comprobación es
-- +++ OK, passed 100 tests; 407 discarded.
-- ---------------------------------------------------------------------
-- Ejercicio 3.1, Definir por recursión la función
-- pertenece :: Eq a => a -> [a] -> Bool
-- tal que (pertenece x xs) se verifica si x pertenece a la lista xs. Por
-- ejemplo,
-- pertenece 3 [2,3,5] == True
-- pertenece 4 [2,3,5] == False
-- ---------------------------------------------------------------------
-- Lucía Hernández, Irene Ortega, Ana Sánchez Martín, Ana Sosa Caballero
pertenece :: Eq a => a -> [a] -> Bool
pertenece _ [] = False
pertenece n (x:xs) | n == x = True
|otherwise = pertenece n xs
-- Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos
pertenece :: Eq a => a -> [a] -> Bool
pertenece _ [] = False
pertenece y (x:xs) = y==x || pertenece y xs
-- ---------------------------------------------------------------------
-- Ejercicio 3.2. Comprobar con quickCheck que pertenece es equivalente
-- a elem.
-- ---------------------------------------------------------------------
-- Lucía Hernández, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
-- La propiedad es
prop_pertenece :: Int -> [Int] -> Bool
prop_pertenece x xs = pertenece x xs == elem x xs
-- La comprobación es quickCheck prop_pertenece
+++ OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- Ejercicio 4.1. Definir por recursión la función
-- concatenaListas :: [[a]] -> [a]
-- tal que (concatenaListas xss) es la lista obtenida concatenando las listas de
-- xss. Por ejemplo,
-- concatenaListas [[1..3],[5..7],[8..10]] == [1,2,3,5,6,7,8,9,10]
-- ---------------------------------------------------------------------
-- Lucía Hernández , Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
concatenaListas :: [[a]] -> [a]
concatenaListas [] = []
concatenaListas (xs:xss) = xs ++ concatenaListas xss
-- ---------------------------------------------------------------------
-- Ejercicio 4.2. Comprobar con QuickCheck que concatenaListas es
-- equivalente a concat.
-- ---------------------------------------------------------------------
-- Nicolás Rodrígez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
-- La propiedad es
prop_concat :: [[Int]] -> Bool
prop_concat xss = concat xss == concatenaListas xss
-- La comprobación es
-- +++ OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- Ejercicio 5.1. Definir por recursión la función
-- coge :: Int -> [a] -> [a]
-- tal que (coge n xs) es la lista de los n primeros elementos de
-- xs. Por ejemplo,
-- coge 3 [4..12] == [4,5,6]
-- coge (-3) [4..12] == []
-- ---------------------------------------------------------------------
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín
coge :: Int -> [a] -> [a]
coge _ [] = []
coge n (x:xs) | n<=0 = []
| otherwise = x : coge (n-1) XS
-- Ana Sosa Caballero
coge' :: Int -> [a] -> [a]
coge' n [] = []
coge' 0 xs = []
coge' n (x:xs) | n > 0 = x : coge (n-1) xs
| otherwise = []
-- ---------------------------------------------------------------------
-- Ejercicio 5.2. Comprobar con QuickCheck que coge es equivalente a
-- take.
-- ---------------------------------------------------------------------
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
-- La propiedad es
prop_coge :: Int -> [Int] -> Bool
prop_coge n xs = coge n xs == take n xs
-- La comprobación es quickCheck prop_coge
+++ OK, passed 100 tests
-- ---------------------------------------------------------------------
-- Ejercicio 6.1. Definir, por recursión, la función
-- sumaCuadradosR :: Integer -> Integer
-- tal que (sumaCuadradosR n) es la suma de los cuadrados de los números
-- de 1 a n. Por ejemplo,
-- sumaCuadradosR 4 == 30
-- ---------------------------------------------------------------------
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Ana Sánchez Martín, Ana Sosa Caballero
sumaCuadradosR :: Integer -> Integer
sumaCuadradosR 0 = 0
sumaCuadradosR n = n^2 + sumaCuadradosR (n-1)
-- Elsa Domínguez, Adolfo Sagrera Vivancos
sumaCuadradosR :: Integer -> Integer
sumaCuadradosR 1 = 1
sumaCuadradosR n | n < 0 = error "n debe ser mayor que cero"
| otherwise = n^2 + sumaCuadradosR (n-1)
-- ---------------------------------------------------------------------
-- Ejercicio 6.2. Comprobar con QuickCheck si sumaCuadradosR n es igual a
-- n(n+1)(2n+1)/6.
-- ---------------------------------------------------------------------
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
-- La propiedad es
prop_SumaCuadrados :: Integer -> Property
prop_SumaCuadrados n = n>=1 ==> sumaCuadradosR n == div (n*(n+1)*(2*n+1)) 6
-- La comprobación es quickCheck prop_SumaCuadrados
+++ OK, passed 100 tests
-- ---------------------------------------------------------------------
-- Ejercicio 6.3. Definir, por comprensión, la función
-- sumaCuadradosC :: Integer --> Integer
-- tal que (sumaCuadradosC n) es la suma de los cuadrados de los números
-- de 1 a n. Por ejemplo,
-- sumaCuadradosC 4 == 30
-- ---------------------------------------------------------------------
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
sumaCuadradosC :: Integer -> Integer
sumaCuadradosC n = sum [x^2 | x <- [1..n]]
-- ---------------------------------------------------------------------
-- Ejercicio 6.4. Comprobar con QuickCheck que las funciones
-- sumaCuadradosR y sumaCuadradosC son equivalentes sobre los números
-- naturales.
-- ---------------------------------------------------------------------
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
-- La propiedad es
prop_sumaCuadradosR :: Integer -> Property
prop_sumaCuadradosR n = n>=1 ==> sumaCuadradosR n == sumaCuadradosC n
-- La comprobación es quickCheck prop_sumaCuadradosR
-- +++ OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- Ejercicio 7.1. Definir, por recursión, la función
-- digitosR :: Integer -> [Integer]
-- tal que (digitosR n) es la lista de los dígitos del número n. Por
-- ejemplo,
-- digitosR 320274 == [3,2,0,2,7,4]
-- ---------------------------------------------------------------------
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín
digitosR :: Integer -> [Integer]
digitosR n = if n<10 then [n]
else digitosR (div n 10) ++ [rem n 10]
-- Ana Sosa Caballero
digitosR' :: Integer -> [Integer]
digitosR' 0 = []
digitosR' n = digitosR (div n 10) ++ [rem n 10]
-- ---------------------------------------------------------------------
-- Ejercicio 7.2. Definir, por comprensión, la función
-- digitosC :: Integer -> [Integer]
-- tal que (digitosC n) es la lista de los dígitos del número n. Por
-- ejemplo,
-- digitosC 320274 == [3,2,0,2,7,4]
-- Indicación: Usar las funciones show y read.
-- ---------------------------------------------------------------------
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
digitosC :: Integer -> [Integer]
digitosC n = [read [x] | x <- show n]
-- ---------------------------------------------------------------------
-- Ejercicio 7.3. Comprobar con QuickCheck que las funciones digitosR y
-- digitosC son equivalentes.
-- ---------------------------------------------------------------------
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
-- La propiedad es
prop_digitos :: Integer -> Property
prop_digitos n = n>=0 ==> digitosR n == digitosC n
-- La comprobación es quickCheck prop_digitos
+++ OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- Ejercicio 8.1. Definir, por recursión, la función
-- sumaDigitosR :: Integer -> Integer
-- tal que (sumaDigitosR n) es la suma de los dígitos de n. Por ejemplo,
-- sumaDigitosR 3 == 3
-- sumaDigitosR 2454 == 15
-- sumaDigitosR 20045 == 11
-- ---------------------------------------------------------------------
-- Lucía Hernández, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
sumaDigitosR :: Integer -> Integer
sumaDigitosR n = if n<10 then n
else rem n 10 + sumaDigitosR (div n 10)
-- Elsa Domínguez
sumaDigitosR' :: Integer -> Integer
sumaDigitosR' 0 = 0
sumaDigitosR' n | n < 0 = error "no es posible"
| otherwise = rem n 10 + sumaDigitosR (div n 10)
-- ---------------------------------------------------------------------
-- Ejercicio 8.2. Definir, sin usar recursión, la función
-- sumaDigitosNR :: Integer -> Integer
-- tal que (sumaDigitosNR n) es la suma de los dígitos de n. Por ejemplo,
-- sumaDigitosNR 3 == 3
-- sumaDigitosNR 2454 == 15
-- sumaDigitosNR 20045 == 11
-- ---------------------------------------------------------------------
-- Lucía Hernández, Ana Sosa Caballero
sumaDigitosNR :: Integer -> Integer
sumaDigitosNR n = sum (digitosR n)
-- Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín
sumaDigitosNR :: Integer -> Integer
sumaDigitosNR n = sum (digitosC n)
-- ---------------------------------------------------------------------
-- Ejercicio 8.3. Comprobar con QuickCheck que las funciones sumaDigitosR
-- y sumaDigitosNR son equivalentes.
-- ---------------------------------------------------------------------
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
-- La propiedad es
prop_sumaDigitos :: Integer -> Property
prop_sumaDigitos n = n>= 0 ==> sumaDigitosR n == sumaDigitosNR n
-- La comprobación es quickCheck prop_sumaDigitos
+++ OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- Ejercicio 9.1. Definir, por recursión, la función
-- listaNumeroR :: [Integer] -> Integer
-- tal que (listaNumeroR xs) es el número formado por los dígitos xs. Por
-- ejemplo,
-- listaNumeroR [5] == 5
-- listaNumeroR [1,3,4,7] == 1347
-- listaNumeroR [0,0,1] == 1
-- ---------------------------------------------------------------------
-- Lucía Hernández, Ana Sánchez Martín, Ana Sosa Caballero
listaNumeroR :: [Integer] -> Integer
listaNumeroR [] = 0
listaNumeroR [x] = x
listaNumeroR (x:xs) = x*10^(length (xs)) + listaNumeroR xs
-- Elsa Domínguez, Adolfo Sagrera Vivancos
listaNumeroR' :: [Integer] -> Integer
listaNumeroR' [] = 0
listaNumeroR' [x] = x
listaNumeroR' xs = last xs + (listaNumeroR (init xs))*10
--José Manuel García
listaNumeroR :: [Integer] -> Integer
listaNumeroR (x:xs) = read ( (show x) ++ listaNumeroR' xs) :: Integer
listaNumeroR' :: [Integer] -> [Char]
listaNumeroR' [] = []
listaNumeroR' (x:xs) = show x ++ listaNumeroR' xs
-- ---------------------------------------------------------------------
-- Ejercicio 9.2. Definir, por comprensión, la función
-- listaNumeroC :: [Integer] -> Integer
-- tal que (listaNumeroC xs) es el número formado por los dígitos xs. Por
-- ejemplo,
-- listaNumeroC [5] == 5
-- listaNumeroC [1,3,4,7] == 1347
-- listaNumeroC [0,0,1] == 1
-- ---------------------------------------------------------------------
-- Lucía Hernández, Elsa Domínguez, Ana Sánchez Martín
listaNumeroC :: [Integer] -> Integer
listaNumeroC xs = sum [x*10^s | (x,s) <- zip(reverse xs) [0..length xs -1]]
-- Adolfo Sagrera Vivancos
listaNumeroC' :: [Integer] -> Integer
listaNumeroC' xs = sum [ x*(10^y) | (x,y) <- agrupa1 xs]
agrupa1 xs = zip (reverse xs) [0..]
--José Manuel García
listaNumeroC :: [Integer] -> Integer
listaNumeroC xs = read [stringToChar t | t <- [show a | a <- xs]] :: Integer
stringToChar :: String -> Char
stringToChar x = head (x)
-- Ana Sosa Caballero
listaNumeroC'' :: [Integer] -> Integer
listaNumeroC'' [x] = x
listaNumeroC'' xs = sum [ x*10^(length xs) | x <- xs]
-- ---------------------------------------------------------------------
-- Ejercicio 9.3. Comprobar con QuickCheck que las funciones
-- listaNumeroR y listaNumeroC son equivalentes.
-- ---------------------------------------------------------------------
--Lucía Hernández, Elsa Domínguez, Ana Sánchez Martín, Ana Sosa Caballero
-- La propiedad es
prop_listaNumero :: [Integer] -> Bool
prop_listaNumero xs = listaNumeroR xs == listaNumeroC xs
-- La comprobación es quickCheck prop_listaNumero
+++ OK, passed 100 tests.
-- Adolfo Sagrera Vivancos
prop_listaNumero' xs = not(null xs) ==> listaNumeroR xs == listaNumeroC xs
-- ---------------------------------------------------------------------
-- Ejercicio 10.1. Definir, por recursión, la función
-- mayorExponenteR :: Integer -> Integer -> Integer
-- tal que (mayorExponenteR a b) es el exponente de la mayor potencia de
-- a que divide b. Por ejemplo,
-- mayorExponenteR 2 8 == 3
-- mayorExponenteR 2 9 == 0
-- mayorExponenteR 5 100 == 2
-- mayorExponenteR 2 60 == 2
-- ---------------------------------------------------------------------
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero
mayorExponenteR :: Integer -> Integer -> Integer
mayorExponenteR _ 0 = 0
mayorExponenteR a b | mod b a == 0 = 1 + mayorExponenteR a( div b a)
| otherwise = 0
-- ---------------------------------------------------------------------
-- Ejercicio 10.2. Definir, por comprensión, la función
-- mayorExponenteC :: Integer -> Integer -> Integer
-- tal que (mayorExponenteC a b) es el exponente de la mayor potencia de
-- a que divide a b. Por ejemplo,
-- mayorExponenteC 2 8 == 3
-- mayorExponenteC 5 100 == 2
-- mayorExponenteC 5 101 == 0
-- ---------------------------------------------------------------------
-- Lucía Hernández, Adolfo Sagrera Vivancos, Ana Sánchez Martín
mayorExponenteC :: Integer -> Integer -> Integer
mayorExponenteC a b = last [s | s<- [0..b], mod b (a^s) == 0]
-- Elsa Domínguez
mayorExponenteC' :: Integer -> Integer -> Integer
mayorExponenteC' a b | rem b a /= 0 = 0 -- mejora la eficiencia
| otherwise = last [x | x <- [0..32], rem b (a^x) == 0]