Diferencia entre revisiones de «Relación 2»
De Informática de 1º de Matemáticas [Curso 2021-22, Grupo 2]
(No se muestran 14 ediciones intermedias de 12 usuarios) | |||
Línea 42: | Línea 42: | ||
-- divisionSegura 7 0 == 9999.0 | -- divisionSegura 7 0 == 9999.0 | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos | -- Ana Sosa Caballero, Lucía Hernández, Elsa Domínguez,Lucía González, Adolfo Sagrera Vivancos, José Manuel García, Fernando Martínez Ortega, Ángela Pérez Ríos, Irene Ortega Moncayo, Cristina Torres ,Daniel Kock Cabrera | ||
divisionSegura :: Double -> Double -> Double | divisionSegura :: Double -> Double -> Double | ||
divisionSegura x y = if y == 0 then 9999 | divisionSegura x y = if y == 0 then 9999 | ||
else x/y | else x/y | ||
-- Laura Arango | -- Laura Arango, Ana Sánchez Martín | ||
divisionSegura1 :: Double -> Double -> Double | divisionSegura1 :: Double -> Double -> Double | ||
divisionSegura1 x y | y == 0 = 999 | divisionSegura1 x y | y == 0 = 999 | ||
Línea 53: | Línea 53: | ||
divisionSegura x y | y/=0 = x/y | divisionSegura x y | y/=0 = x/y | ||
| y==0 = 9999.0 | | y==0 = 9999.0 | ||
-- prof | |||
divisionSegura x 0 = 9999 | |||
divisionSegura x y = x/y | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 62: | Línea 66: | ||
-- intercambia (5,2) == (2,5) | -- intercambia (5,2) == (2,5) | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos, José Manuel García, Fernando Martínez Ortega, | -- Ana Sosa Caballero,Lucía González, Adolfo Sagrera Vivancos, José Manuel García, Fernando Martínez Ortega, Ángela Pérez Ríos, Irene Ortega Moncayo, Cristina Torres,Daniel Kock Cabrera, Ana Sánchez Martín | ||
intercambia :: (a,b) -> (b,a) | intercambia :: (a,b) -> (b,a) | ||
intercambia (a,b) = (b,a) | intercambia (a,b) = (b,a) | ||
Línea 73: | Línea 77: | ||
-- aplicarla ninguna. | -- aplicarla ninguna. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos, José Manuel García, Fernando Martínez Ortega, | -- Ana Sosa Caballero, Adolfo Sagrera Vivancos, Lucía González, José Manuel García, Fernando Martínez Ortega, Ángela Pérez Ríos, Irene Ortega Moncayo, Cristina Torres,Daniel Kock Cabrera, Ana Sánchez Martín | ||
-- La propiedad es | -- La propiedad es | ||
prop_intercambia :: (Int,Int) -> Bool | prop_intercambia :: (Int,Int) -> Bool | ||
prop_intercambia (a,b) = intercambia (intercambia (a,b)) == (a,b) | prop_intercambia (a,b) = intercambia (intercambia (a,b)) == (a,b) | ||
-- La comprobación es quickCheck prop_intercambia | -- La comprobación es quickCheck prop_intercambia | ||
+++ OK, passed 100 tests | -- +++ OK, passed 100 tests | ||
--Lucía Hernández, Laura Arango, Elsa Domínguez | --Lucía Hernández, Laura Arango, Elsa Domínguez | ||
-- La propiedad es | -- La propiedad es | ||
Línea 85: | Línea 89: | ||
-- La comprobación es quickCheck prop_intercambia1 | -- La comprobación es quickCheck prop_intercambia1 | ||
+++OK, passed 100 tests. | -- +++OK, passed 100 tests. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ejercicio 4.1. Definir una función | -- Ejercicio 4.1. Definir una función | ||
Línea 101: | Línea 105: | ||
ciclo xs | length xs == 0 = xs | ciclo xs | length xs == 0 = xs | ||
| otherwise = last xs : init xs | | otherwise = last xs : init xs | ||
--Lucía Hernández | --Lucía Hernández, Irene Ortega Moncayo, Cristina Torres,Daniel Kock Cabrera | ||
ciclo1 :: [a] -> [a] | ciclo1 :: [a] -> [a] | ||
ciclo1 xs =if length xs == 0 then [] | ciclo1 xs =if length xs == 0 then [] | ||
Línea 109: | Línea 113: | ||
ciclo2 [] = [] | ciclo2 [] = [] | ||
ciclo2 xs = last xs : init xs | ciclo2 xs = last xs : init xs | ||
-- Adolfo Sagrera Vivancos, | -- Adolfo Sagrera Vivancos, Lucía González | ||
ciclo3 xs |length xs == 0 = [] | ciclo3 xs |length xs == 0 = [] | ||
|otherwise = last xs:init xs | |otherwise = last xs:init xs | ||
Línea 115: | Línea 119: | ||
ciclo4 :: [a] -> [a] | ciclo4 :: [a] -> [a] | ||
ciclo4 xs = take (length xs) ((drop (length xs - 1) xs) ++ xs) | ciclo4 xs = take (length xs) ((drop (length xs - 1) xs) ++ xs) | ||
-- Ana Sánchez Martín | |||
ciclo :: [a] -> [a] | |||
ciclo [] = [] | |||
ciclo xs = [last xs] ++ init xs | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 121: | Línea 129: | ||
-- de xs. | -- de xs. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Elsa Domínguez, Lucía Hernández, Laura Arango, Adolfo Sagrera Vivancos, José Manuel García, | -- Ana Sosa Caballero, Elsa Domínguez, Lucía Hernández,Lucía González,Laura Arango, Adolfo Sagrera Vivancos, José Manuel García, Ángela Pérez Ríos, Irene Ortega Moncayo, Cristina Torres,Daniel Kock Cabrera, Ana Sánchez Martín | ||
-- La propiedad es | -- La propiedad es | ||
prop_ciclo :: [Int] -> Bool | prop_ciclo :: [Int] -> Bool | ||
Línea 137: | Línea 145: | ||
-- numeroMayor 5 2 == 52 | -- numeroMayor 5 2 == 52 | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Elsa Domínguez, Lucía Hernández, Laura Arango, | -- Ana Sosa Caballero, Elsa Domínguez, Lucía Hernández, Laura Arango, Irene Ortega Moncayo | ||
numeroMayor :: (Num a, Ord a) => a -> a -> a | numeroMayor :: (Num a, Ord a) => a -> a -> a | ||
numeroMayor x y = if x > y then (x*10 + y) else (y*10+x) | numeroMayor x y = if x > y then (x*10 + y) else (y*10+x) | ||
-- Adolfo Sagrera Vivancos, José Manuel García | -- Adolfo Sagrera Vivancos, José Manuel García, Lucía González, Cristina Torres,Daniel Kock Cabrera | ||
numeroMayor1 x y | x<y = (y*10+x) | numeroMayor1 x y | x<y = (y*10+x) | ||
| x>y = (x*10+y) | | x>y = (x*10+y) | ||
-- Ana Sánchez Martín | |||
numeroMayor :: (Num a, Ord a) => a -> a -> a | |||
numeroMayor x y | |||
| x > y = x*10+y | |||
| otherwise = 10*y+x | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 153: | Línea 166: | ||
-- numeroDeRaices 5 23 12 == 2 | -- numeroDeRaices 5 23 12 == 2 | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero | -- Ana Sosa Caballero | ||
numeroDeRaices :: (Num t, Ord t) => t -> t -> t -> Int | numeroDeRaices :: (Num t, Ord t) => t -> t -> t -> Int | ||
numeroDeRaices a b c | t < 0 = 0 | numeroDeRaices a b c | t < 0 = 0 | ||
Línea 159: | Línea 172: | ||
| otherwise = 2 | | otherwise = 2 | ||
where t = b^2 - 4*a*c | where t = b^2 - 4*a*c | ||
-- Elsa Domínguez | -- Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Cristina Torres,Daniel Kock Cabrera | ||
numeroDeRaices1 :: (Num t, Ord t) => t -> t -> t -> Int | numeroDeRaices1 :: (Num t, Ord t) => t -> t -> t -> Int | ||
numeroDeRaices1 a b c | b^2-4*a*c < 0 = 0 | numeroDeRaices1 a b c | b^2-4*a*c < 0 = 0 | ||
Línea 169: | Línea 182: | ||
|(b^2-4*a*c) == 0 = 1 | |(b^2-4*a*c) == 0 = 1 | ||
|otherwise = 0 | |otherwise = 0 | ||
-- Ana Sánchez Martín | |||
numeroDeRaices :: (Num t, Ord t) => t -> t -> t -> Int | |||
numeroDeRaices a b c | |||
|discriminante < 0 = 0 | |||
|discriminante == 0 = 1 | |||
| otherwise = 2 | |||
where discriminante = b^2-4*a*c | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 185: | Línea 204: | ||
| otherwise = [(-b+t)/2*a, (-b-t)/2*a] | | otherwise = [(-b+t)/2*a, (-b-t)/2*a] | ||
where t = b^2 - 4*a*c | where t = b^2 - 4*a*c | ||
-- Elsa Domínguez, Laura Arango | -- Elsa Domínguez, Laura Arango, Irene Ortega Moncayo, Cristina Torres | ||
raices1 :: Double -> Double -> Double -> [Double] | raices1 :: Double -> Double -> Double -> [Double] | ||
raices1 a b c | b^2-4*a*c == 0 = [-b/2*a, -b/2*a] | raices1 a b c | b^2-4*a*c == 0 = [-b/2*a, -b/2*a] | ||
Línea 191: | Línea 210: | ||
| b^2-4*a*c > 0 = [(-b+t)/(2*a), (-b-t)/(2*a)] | | b^2-4*a*c > 0 = [(-b+t)/(2*a), (-b-t)/(2*a)] | ||
where t = sqrt (b^2-4*a*c) | where t = sqrt (b^2-4*a*c) | ||
--Lucía Hernández, José Manuel García | --Lucía Hernández, José Manuel García | ||
raices2 :: Double -> Double -> Double -> [Double] | raices2 :: Double -> Double -> Double -> [Double] | ||
raices2 a b c |(b^2-4*a*c) >0 = [(-b+sqrt(b^2-4*a*c))/2*a,(-b-sqrt(b^2-4*a*c))/2*a] | raices2 a b c |(b^2-4*a*c) >0 = [(-b+sqrt(b^2-4*a*c))/2*a,(-b-sqrt(b^2-4*a*c))/2*a] | ||
|(b^2-4*a*c) == 0 = [-b/2*a, -b/2*a] | |(b^2-4*a*c) == 0 = [-b/2*a, -b/2*a] | ||
|otherwise = [] | |otherwise = [] | ||
-- Adolfo Sagrera Vivancos | -- Adolfo Sagrera Vivancos, Lucía González, Ana Sánchez Martín | ||
raices3 a b c | numeroDeRaices a b c == 0 = [] | raices3 a b c | numeroDeRaices a b c == 0 = [] | ||
| numeroDeRaices a b c == 1 = [-b/(2*a), -b/(2*a)] | | numeroDeRaices a b c == 1 = [-b/(2*a), -b/(2*a)] | ||
Línea 209: | Línea 228: | ||
-- 12.3457 ~= 12.3479 == False | -- 12.3457 ~= 12.3479 == False | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos | -- Ana Sosa Caballero, Adolfo Sagrera Vivancos, Cristina Torres | ||
(~=) :: (Fractional a, Ord a) => a -> a -> Bool | (~=) :: (Fractional a, Ord a) => a -> a -> Bool | ||
x ~= y | abs(x-y) <= 0.001 = True | x ~= y | abs(x-y) <= 0.001 = True | ||
| otherwise = False | | otherwise = False | ||
--Lucía Hernández, Laura Arango | --Lucía Hernández, Laura Arango, Lucía González, Irene Ortega Moncayo | ||
(~=) :: (Fractional a, Ord a) => a -> a -> Bool | (~=) :: (Fractional a, Ord a) => a -> a -> Bool | ||
x ~= y = if abs(x - y)<0.001 then True | x ~= y = if abs(x - y)<0.001 then True | ||
else False | else False | ||
-- Elsa Domínguez, José Manuel García, | -- Elsa Domínguez, José Manuel García, Ana Sánchez Martín | ||
(~=) :: (Fractional a, Ord a) => a -> a -> Bool | (~=) :: (Fractional a, Ord a) => a -> a -> Bool | ||
x ~= y = abs (x-y) < 0.001 | x ~= y = abs (x-y) < 0.001 | ||
Línea 227: | Línea 246: | ||
-- Nota. En la comparación usar ~= en lugar de == | -- Nota. En la comparación usar ~= en lugar de == | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Cristina Torres | |||
-- La propiedad es | -- La propiedad es | ||
prop_raices :: Double -> Double -> Double -> Property | prop_raices :: Double -> Double -> Double -> Property | ||
Línea 233: | Línea 252: | ||
-- La comprobación es quickCheck prop_raices | -- La comprobación es quickCheck prop_raices | ||
-- +++ OK, passed 100 tests. | -- +++ OK, passed 100 tests. | ||
-- Ana Sánchez Martín | |||
-- La propiedad es | |||
prop_raices :: Double -> Double -> Double -> Property | |||
prop_raices a b c = a /= 0 && numeroDeRaices a b c /= 0 ==> | |||
(sol1 + sol2) ~= (-b/a) && (sol1 * sol2) ~= (c/a) | |||
where sol1 = raices a b c !! 0 | |||
sol2 = raices a b c !! 1 | |||
-- La comprobación es quickCheck prop_raices | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 247: | Línea 274: | ||
-- area 3 4 5 == 6.0 | -- area 3 4 5 == 6.0 | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, Adolfo Sagrera Vivancos, José Manuel García,César Fornis | -- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Lucía González, Elsa Domínguez, Adolfo Sagrera Vivancos, José Manuel García,César Fornis, Irene Ortega Moncayo, Cristina Torres, Ana Sánchez Martín | ||
area :: Double -> Double -> Double -> Double | area :: Double -> Double -> Double -> Double | ||
area a b c = sqrt(s*(s-a)*(s-b)*(s-c)) | area a b c = sqrt(s*(s-a)*(s-b)*(s-c)) | ||
Línea 270: | Línea 297: | ||
-- interseccion [5,6] [0,4] == [] | -- interseccion [5,6] [0,4] == [] | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
--Lucía Hernández | --Lucía Hernández, Ana Sánchez Martín | ||
interseccion :: Ord a => [a] -> [a] -> [a] | interseccion :: Ord a => [a] -> [a] -> [a] | ||
interseccion [] _ = [] | interseccion [] _ = [] | ||
Línea 277: | Línea 304: | ||
|head i1>last i2 = [] | |head i1>last i2 = [] | ||
|otherwise = [maximum [head i1,head i2], minimum [last i1,last i2]] | |otherwise = [maximum [head i1,head i2], minimum [last i1,last i2]] | ||
--Laura Arango, Elsa Domínguez, César Fornis | --Laura Arango, Elsa Domínguez, César Fornis, Lucía González | ||
interseccion1 :: Ord a => [a] -> [a] -> [a] | interseccion1 :: Ord a => [a] -> [a] -> [a] | ||
interseccion1 i1 i2 | i1==[] || i2==[] || head i1>last i2 || last i1<head i2 = [] | interseccion1 i1 i2 | i1==[] || i2==[] || head i1>last i2 || last i1<head i2 = [] | ||
| otherwise = [max (head i1)(head i2), min (last i1)(last i2)] | | otherwise = [max (head i1)(head i2), min (last i1)(last i2)] | ||
--José Manuel García, Fernando Martínez Ortega | --José Manuel García, Fernando Martínez Ortega, Irene Ortega Moncayo | ||
interseccion2 :: Ord a => [a] -> [a] -> [a] | interseccion2 :: Ord a => [a] -> [a] -> [a] | ||
interseccion2 i1 i2 | null i1 || null i2 || a > d || b < c = [] | interseccion2 i1 i2 | null i1 || null i2 || a > d || b < c = [] | ||
Línea 292: | Línea 319: | ||
c = head i2 | c = head i2 | ||
d = last i2 | d = last i2 | ||
-- Adolfo Sagrera Vivancos, Cristina Torres | |||
interseccion3 :: Ord a => [a] -> [a] -> [a] | |||
interseccion3 i1 i2 | null i1 || null i2 || a > d || b < c = [] | |||
| otherwise = [max a c, min b d] | |||
where a = head i1 | |||
b = last i1 | |||
c = head i2 | |||
d = last i2 | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ejercicio 12. Comprobar con QuickCheck que la intersección de | -- Ejercicio 12. Comprobar con QuickCheck que la intersección de | ||
-- intervalos es conmutativa. | -- intervalos es conmutativa. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
--Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García | --Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García, Lucía González, Adolfo Sagrera Vivancos, Irene Ortega Moncayo, Cristina Torres, Ana Sánchez Martín | ||
-- La propiedad es | -- La propiedad es | ||
prop_interseccion :: Int -> Int -> Int -> Int -> Bool | prop_interseccion :: Int -> Int -> Int -> Int -> Bool | ||
Línea 316: | Línea 350: | ||
-- formaReducida (4,10) == (2,5) | -- formaReducida (4,10) == (2,5) | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango | -- Ana Sosa Caballero, Lucía Hernández, Laura Arango, José Manuel García, Lucía González, Irene Ortega Moncayo, Cristina Torres | ||
formaReducida :: (Int,Int) -> (Int,Int) | formaReducida :: (Int,Int) -> (Int,Int) | ||
formaReducida (a,b) = (div a z, div b z) | formaReducida (a,b) = (div a z, div b z) | ||
where z = gcd a b | where z = gcd a b | ||
-- Adolfo Sagrera Vivancos | |||
formaReducida1 :: (Int,Int) -> (Int,Int) | |||
formaReducida1 (a,b) = (s*abs(div a z), abs(div b z)) where z = gcd a b | |||
s = signum (a*b) | |||
-- Elsa Domínguez | |||
formaReducida2 :: (Int,Int) -> (Int,Int) | |||
formaReducida2 (a,b) | a == 0 && b == 0 = (0,0) | |||
| otherwise = (s*abs(div a z), abs(div b z)) | |||
where z = gcd a b | |||
s = signum (a*b) | |||
-- Ana Sánchez Martín | |||
formaReducida :: (Int,Int) -> (Int,Int) | |||
formaReducida (0,_) = (0,1) | |||
formaReducida (_,0) = (1,0) | |||
formaReducida (a,b) = (div a (gcd a b), div b (gcd a b)) | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 334: | Línea 383: | ||
else formaReducida(a+ (div s d)*c, s) | else formaReducida(a+ (div s d)*c, s) | ||
where s = lcm b d | where s = lcm b d | ||
-- Elsa Domínguez, José Manuel García | -- Elsa Domínguez, José Manuel García, Lucía González, Irene Ortega Moncayo, Cristina Torres, Ana Sánchez Martín | ||
sumaRacional1 :: (Int,Int) -> (Int,Int) -> (Int,Int) | sumaRacional1 :: (Int,Int) -> (Int,Int) -> (Int,Int) | ||
sumaRacional1 (a,b) (c,d) = formaReducida (a*d + c*b, b*d) | sumaRacional1 (a,b) (c,d) = formaReducida (a*d + c*b, b*d) | ||
Línea 342: | Línea 391: | ||
where x= y+ ((div (lcm b d) d)*c) | where x= y+ ((div (lcm b d) d)*c) | ||
where y= (div(lcm b d) b)*a | where y= (div(lcm b d) b)*a | ||
--Adolfo Sagrera Vivancos | |||
sumaRacional3 :: (Int,Int) -> (Int,Int) -> (Int,Int) | |||
sumaRacional3 (a,b) (c,d) = formaReducida(((div t b)*a + (div t d)*c), t) where t = lcm b d | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 355: | Línea 407: | ||
where x = a*c | where x = a*c | ||
t = b*d | t = b*d | ||
-- Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García | -- Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García, Adolfo Sagrera Vivancos, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | ||
productoRacional1 :: (Int,Int) -> (Int,Int) -> (Int,Int) | productoRacional1 :: (Int,Int) -> (Int,Int) -> (Int,Int) | ||
productoRacional1 (a,b) (c,d) = formaReducida (a*c, b*d) | productoRacional1 (a,b) (c,d) = formaReducida (a*c, b*d) | ||
Línea 365: | Línea 417: | ||
-- cocienteRacional (2,3) (5,6) == (4,5) | -- cocienteRacional (2,3) (5,6) == (4,5) | ||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
-- Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García | -- Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García, Adolfo Sagrera Vivancos, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | ||
cocienteRacional :: (Int,Int) -> (Int,Int) -> (Int,Int) | cocienteRacional :: (Int,Int) -> (Int,Int) -> (Int,Int) | ||
cocienteRacional (x1,x2) (y1,y2) = formaReducida (x1*y2, x2*y1) | cocienteRacional (x1,x2) (y1,y2) = formaReducida (x1*y2, x2*y1) | ||
Línea 378: | Línea 430: | ||
-- igualdadRacional (0,2) (0,-5) == True | -- igualdadRacional (0,2) (0,-5) == True | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández | -- Ana Sosa Caballero, Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo | ||
igualdadRacional :: (Int,Int) -> (Int,Int) -> Bool | igualdadRacional :: (Int,Int) -> (Int,Int) -> Bool | ||
igualdadRacional (a,b) (c,d) = formaReducida (a,b) == formaReducida (c,d) | igualdadRacional (a,b) (c,d) = formaReducida (a,b) == formaReducida (c,d) | ||
Línea 386: | Línea 438: | ||
|| (a==0 && c==0) | || (a==0 && c==0) | ||
|| (b==0 && d==0) | || (b==0 && d==0) | ||
-- José Manuel García | -- José Manuel García | ||
igualdadRacional3 :: (Int,Int) -> (Int,Int) -> Bool | igualdadRacional3 :: (Int,Int) -> (Int,Int) -> Bool | ||
Línea 396: | Línea 443: | ||
then True | then True | ||
else formaReducida (a,b) == formaReducida (c,d) | else formaReducida (a,b) == formaReducida (c,d) | ||
-- César Fornis Catalán, Ana Sánchez Martín | |||
igualdadRacional4 :: (Int,Int) -> (Int,Int) -> Bool | |||
igualdadRacional4 (a,b) (c,d) = a*d == b*c | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 402: | Línea 452: | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Elsa Domínguez, Irene Ortega Moncayo, Adolfo Sagrera Vivancos, Ana Sánchez Martín | |||
-- La propiedad es | -- La propiedad es | ||
prop_distributiva :: (Int,Int) -> (Int,Int) -> (Int,Int) -> Property | prop_distributiva :: (Int,Int) -> (Int,Int) -> (Int,Int) -> Property | ||
prop_distributiva x y z = | prop_distributiva x y z = (fst x * snd x /= 0) && (fst y * snd y /= 0) && (fst z * snd z /= 0) ==> | ||
igualdadRacional (productoRacional (sumaRacional x y) z) (sumaRacional (productoRacional x z) (productoRacional y z)) | |||
-- La comprobación es | -- La comprobación es quickCheck prop_distributiva | ||
-- +++ OK, passed 100 tests. | |||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
Línea 424: | Línea 477: | ||
-- sumaComplejos (2,3) (5,6) == (7.0,9.0) | -- sumaComplejos (2,3) (5,6) == (7.0,9.0) | ||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García | -- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, Irene Ortega Moncayo, José Manuel García, Adolfo Sagrera Vivancos, Lucía González, Ana Sánchez Martín | ||
sumaComplejos :: Complejo -> Complejo -> Complejo | sumaComplejos :: Complejo -> Complejo -> Complejo | ||
sumaComplejos (x1,x2) (y1,y2) = (x1+y1, x2+y2) | sumaComplejos (x1,x2) (y1,y2) = (x1+y1, x2+y2) | ||
Línea 435: | Línea 488: | ||
-- productoComplejos (2,3) (5,6) == (-8.0,27.0) | -- productoComplejos (2,3) (5,6) == (-8.0,27.0) | ||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García | -- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García, Adolfo Sagrera Vivancos, Irene Ortega Moncayo, Lucía González, Ana Sánchez Martín | ||
productoComplejos :: Complejo -> Complejo -> Complejo | productoComplejos :: Complejo -> Complejo -> Complejo | ||
productoComplejos (x1,x2) (y1,y2) = ((x1*y1 - x2*y2),(x2*y1 + x1*y2)) | productoComplejos (x1,x2) (y1,y2) = ((x1*y1 - x2*y2),(x2*y1 + x1*y2)) | ||
Línea 445: | Línea 498: | ||
-- cocienteComplejos (3,2) (1,-2) == (-0.2,1.6) | -- cocienteComplejos (3,2) (1,-2) == (-0.2,1.6) | ||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Laura Arango | -- Ana Sosa Caballero, Laura Arango, Lucía González, Irene Ortega Moncayo | ||
cocienteComplejos :: Complejo -> Complejo -> Complejo | cocienteComplejos :: Complejo -> Complejo -> Complejo | ||
cocienteComplejos (x1,x2) (y1,y2) = (((x1*y1 + x2*y2)/ t), ((x2*y1 - x1*y2)/t)) | cocienteComplejos (x1,x2) (y1,y2) = (((x1*y1 + x2*y2)/ t), ((x2*y1 - x1*y2)/t)) | ||
where t = (y1^2 + y2^2) | where t = (y1^2 + y2^2) | ||
-- Elsa Domínguez | -- Elsa Domínguez, Adolfo Sagrera Vivancos | ||
cocienteComplejos :: Complejo -> Complejo -> Complejo | cocienteComplejos :: Complejo -> Complejo -> Complejo | ||
cocienteComplejos (x1,x2) (y1,y2) = (a,b) | cocienteComplejos (x1,x2) (y1,y2) = (a,b) | ||
where a = fst (productoComplejos (x1,x2) (y1,-y2))/(y1^2 + y2^2) | where a = fst (productoComplejos (x1,x2) (y1,-y2))/(y1^2 + y2^2) | ||
b = snd (productoComplejos (x1,x2) (y1,-y2))/(y1^2 + y2^2) | b = snd (productoComplejos (x1,x2) (y1,-y2))/(y1^2 + y2^2) | ||
-- Ana Sánchez Martín | |||
cocienteComplejos :: Complejo -> Complejo -> Complejo | |||
cocienteComplejos (x1,x2) (y1,y2) = (fst(numero)/modulo, snd(numero)/modulo) | |||
where numero = productoComplejos (x1,x2) (y1,-y2) | |||
modulo = y1^2 + y2^2 | |||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
Línea 462: | Línea 520: | ||
-- conjugado (2,3) == (2.0,-3.0) | -- conjugado (2,3) == (2.0,-3.0) | ||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García | -- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, Irene Ortega Moncayo, José Manuel García, Adolfo Sagrera Vivancos, Lucía González, Ana Sánchez Martín | ||
conjugado :: Complejo -> Complejo | conjugado :: Complejo -> Complejo | ||
conjugado (x1,x2) = (x1, -x2) | conjugado (x1,x2) = (x1, -x2) | ||
Línea 484: | Línea 542: | ||
where t = x1*y1 | where t = x1*y1 | ||
p = x2*y2 | p = x2*y2 | ||
-- Lucía Hernández, Laura Arango, Elsa Domínguez | -- Lucía Hernández, Laura Arango, Elsa Domínguez, Lucía González, Irene Ortega Moncayo | ||
mayorRectangulo1 :: (Int,Int) -> (Int,Int) -> (Int,Int) | mayorRectangulo1 :: (Int,Int) -> (Int,Int) -> (Int,Int) | ||
mayorRectangulo1 (x1,y1) (x2,y2) = if x1*y1 >= x2*y2 then (x1,y1) | mayorRectangulo1 (x1,y1) (x2,y2) = if x1*y1 >= x2*y2 then (x1,y1) | ||
else (x2,y2) | |||
-- Adolfo Sagrera Vivancos | |||
mayorRectangulo2 :: (Int,Int) -> (Int,Int) -> (Int,Int) | |||
mayorRectangulo2 (x1,y1) (x2,y2) | t > s = (x1, y1) | |||
| s > t = (x2, y2) | |||
| otherwise = (x1, y1) | |||
where t = x1*y1 | |||
s = x2*y2 | |||
-- Ana Sánchez Martín | |||
mayorRectangulo :: (Int,Int) -> (Int,Int) -> (Int,Int) | |||
mayorRectangulo (x1,y1) (x2,y2) = if x1*y1 >= x2*y2 | |||
then (x1,y1) | |||
else (x2,y2) | else (x2,y2) | ||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
Línea 517: | Línea 587: | ||
| x1<0 && x2<0 = 3 | | x1<0 && x2<0 = 3 | ||
| otherwise = 4 | | otherwise = 4 | ||
--Laura Arango, Elsa Domínguez | --Laura Arango, Elsa Domínguez, Irene Ortega Moncayo | ||
cuadrante2 :: (Int,Int) -> Int | cuadrante2 :: (Int,Int) -> Int | ||
cuadrante2 (x1,x2) | x1>0 && x2>0 = 1 | cuadrante2 (x1,x2) | x1>0 && x2>0 = 1 | ||
Línea 524: | Línea 594: | ||
| x1>0 && x2<0 = 4 | | x1>0 && x2<0 = 4 | ||
| otherwise = 0 | | otherwise = 0 | ||
-- Adolfo Sagrera Vivancos, Lucía González | |||
cuadrante3 :: (Int,Int) -> Int | |||
cuadrante3 (x1,x2) | x1 == 0 || x2 == 0 = 0 | |||
| x1 == 0 && x2 == 0 = 0 | |||
| x1 > 0 && x2 > 0 = 1 | |||
| x1 < 0 && x2 > 0 = 2 | |||
| x1 < 0 && x2 < 0 = 3 | |||
| otherwise = 4 | |||
-- José Manuel García, Ana Sánchez Martín | |||
cuadrante4 :: (Int,Int) -> Int | |||
cuadrante4 (x1,x2) | x1 * x2 == 0 = 0 | |||
| x1 > 0 && x2 > 0 = 1 | |||
| x1 < 0 && x2 > 0 = 2 | |||
| x1 < 0 && x2 < 0 = 3 | |||
| x1 > 0 && x2 < 0 = 4 | |||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
Línea 533: | Línea 620: | ||
-- simetricoH (2,-5) == (2,5) | -- simetricoH (2,-5) == (2,5) | ||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango | -- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Adolfo Sagrera Vivancos, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | ||
simetricoH :: (Int,Int) -> (Int,Int) | simetricoH :: (Int,Int) -> (Int,Int) | ||
simetricoH (x1,x2) = (x1,-x2) | simetricoH (x1,x2) = (x1,-x2) | ||
Línea 548: | Línea 635: | ||
-- simetricoV (2,-5) == (-2,-5) | -- simetricoV (2,-5) == (-2,-5) | ||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango | -- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Adolfo Sagrera Vivancos, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | ||
simetricoV :: (Int,Int) -> (Int,Int) | simetricoV :: (Int,Int) -> (Int,Int) | ||
simetricoV (x1,x2) = (-x1,x2) | simetricoV (x1,x2) = (-x1,x2) | ||
Línea 561: | Línea 648: | ||
-- distancia (1,2) (4,6) == 5.0 | -- distancia (1,2) (4,6) == 5.0 | ||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Laura Arango, Elsa Domínguez | -- Ana Sosa Caballero, Laura Arango, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | ||
distancia :: (Float,Float) -> (Float,Float) -> Float | distancia :: (Float,Float) -> (Float,Float) -> Float | ||
distancia (x1,x2) (y1,y2) = sqrt((x1-y1)^2 + (x2-y2)^2) | distancia (x1,x2) (y1,y2) = sqrt((x1-y1)^2 + (x2-y2)^2) | ||
Línea 567: | Línea 654: | ||
distancia1 :: (Float,Float) -> (Float,Float) -> Float | distancia1 :: (Float,Float) -> (Float,Float) -> Float | ||
distancia1 p1 p2 = sqrt((fst p2 - fst p1)^2 + (snd p2-snd p1)^2) | distancia1 p1 p2 = sqrt((fst p2 - fst p1)^2 + (snd p2-snd p1)^2) | ||
-- Adolfo Sagrera Vivancos | |||
distancia2 :: (Float,Float) -> (Float,Float) -> Float | |||
distancia2 (x1,x2) (y1,y2) = sqrt(t^2 + s^2) | |||
where t = x1-y1 | |||
s = x2-y2 | |||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
-- Ejercicio 20. Comprobar con QuickCheck que se verifica la propiedad | -- Ejercicio 20. Comprobar con QuickCheck que se verifica la propiedad | ||
Línea 573: | Línea 665: | ||
-- p2 y de p2 a p3. | -- p2 y de p2 a p3. | ||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez | -- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, Adolfo Sagrera Vivancos, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | ||
-- La propiedad es | -- La propiedad es | ||
Línea 590: | Línea 682: | ||
-- puntoMedio (-1,2) (7,6) == (3.0,4.0) | -- puntoMedio (-1,2) (7,6) == (3.0,4.0) | ||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez | -- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | ||
puntoMedio :: (Float,Float) -> (Float,Float) -> (Float,Float) | puntoMedio :: (Float,Float) -> (Float,Float) -> (Float,Float) | ||
puntoMedio (x1,x2) (y1,y2) = ((x1+y1)/2, (x2+y2)/2) | puntoMedio (x1,x2) (y1,y2) = ((x1+y1)/2, (x2+y2)/2) | ||
-- Adolfo Sagrera Vivancos | |||
puntoMedio1 :: (Float,Float) -> (Float,Float) -> (Float,Float) | |||
puntoMedio1 (x1,x2) (y1,y2) = (t/2, s/2) | |||
where t = x1 + y1 | |||
s = x2 + y2 | |||
Línea 616: | Línea 713: | ||
-- de la tabla. | -- de la tabla. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | ||
xor1 :: Bool -> Bool -> Bool | xor1 :: Bool -> Bool -> Bool | ||
xor1 True True = False | xor1 True True = False | ||
Línea 634: | Línea 731: | ||
xor2 x y | y/= x = True | xor2 x y | y/= x = True | ||
| y == x = False | | y == x = False | ||
-- Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | |||
xor2' :: Bool -> Bool -> Bool | |||
xor2' True y = not y | |||
xor2' False y = y | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 642: | Línea 743: | ||
-- Usar 1 ecuación. | -- Usar 1 ecuación. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | ||
xor3 :: Bool -> Bool -> Bool | xor3 :: Bool -> Bool -> Bool | ||
xor3 x y = (x && not y) || (y && not x) | xor3 x y = (x && not y) || (y && not x) | ||
Línea 655: | Línea 756: | ||
xor4 :: Bool -> Bool -> Bool | xor4 :: Bool -> Bool -> Bool | ||
xor4 x y = if x == y then False else True | xor4 x y = if x == y then False else True | ||
-- Lucía Hernández | -- Lucía Hernández, Adolfo Sagrera Vivancos, Lucía González, Irene Ortega Moncayo | ||
xor4' :: Bool -> Bool -> Bool | xor4' :: Bool -> Bool -> Bool | ||
xor4' x y = if x/=y then True else False | xor4' x y = if x/=y then True else False | ||
-- Elsa Domínguez, Ana Sánchez Martín | |||
xor4'' :: Bool -> Bool -> Bool | |||
xor4'' x y = x /= y | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ejercicio 22.5. Comprobar con QuickCheck que las cuatro definiciones | -- Ejercicio 22.5. Comprobar con QuickCheck que las cuatro definiciones | ||
-- de xor son equivalentes. | -- de xor son equivalentes. | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | ||
-- La propiedad es | -- La propiedad es | ||
prop_xor_equivalentes :: Bool -> Bool -> Bool | prop_xor_equivalentes :: Bool -> Bool -> Bool | ||
Línea 678: | Línea 783: | ||
-- or3 False False False == False | -- or3 False False False == False | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández | -- Ana Sosa Caballero, Lucía Hernández, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | ||
or3 :: Bool -> Bool -> Bool-> Bool | or3 :: Bool -> Bool -> Bool-> Bool | ||
or3 a b c = a || b || c | or3 a b c = a || b || c | ||
-- Adolfo Sagrera Vivancos | |||
or3'' :: Bool -> Bool -> Bool-> Bool | |||
or3'' a b c | a==True || b==True || c==True = True | |||
| otherwise = False | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ejercicio 23.2 Definir la función | -- Ejercicio 23.2 Definir la función | ||
Línea 690: | Línea 800: | ||
-- or3' False False False == False | -- or3' False False False == False | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández | -- Ana Sosa Caballero, Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | ||
or3' :: Bool -> Bool -> Bool -> Bool | or3' :: Bool -> Bool -> Bool -> Bool | ||
or3' a b c = or [a,b,c] | or3' a b c = or [a,b,c] | ||
Línea 702: | Línea 812: | ||
-- and3 False True False == False | -- and3 False True False == False | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández | -- Ana Sosa Caballero, Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | ||
and3 :: Bool -> Bool -> Bool -> Bool | and3 :: Bool -> Bool -> Bool -> Bool | ||
and3 a b c = a && b && c | and3 a b c = a && b && c | ||
Línea 715: | Línea 825: | ||
-- and3' False True False == False | -- and3' False True False == False | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández | -- Ana Sosa Caballero, Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Ana Sánchez Martín | ||
and3' :: Bool -> Bool -> Bool -> Bool | and3' :: Bool -> Bool -> Bool -> Bool | ||
and3' a b c = and[a,b,c] | and3' a b c = and [a,b,c] | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 728: | Línea 838: | ||
-- siglo20 2001 == False | -- siglo20 2001 == False | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ana Sosa Caballero, Lucía Hernández | -- Ana Sosa Caballero, Lucía Hernández, Lucía González, Irene Ortega Moncayo | ||
siglo20 :: Int -> Bool | siglo20 :: Int -> Bool | ||
siglo20 x = if 1901 <= x && x < 2000 then True | siglo20 x = if 1901 <= x && x < 2000 then True | ||
else False | else False | ||
-- Elsa Domínguez | -- Elsa Domínguez, Ana Sánchez Martín | ||
siglo201 :: Int -> Bool | siglo201 :: Int -> Bool | ||
siglo201 x = 1901 <= x && x <= 2000 | siglo201 x = 1901 <= x && x <= 2000 | ||
-- Adolfo Sagrera Vivancos | |||
siglo20' :: Int -> Bool | |||
siglo20' x = x > 1901 && x < 2000 | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 753: | Línea 866: | ||
noSiglo20' = undefined | noSiglo20' = undefined | ||
noSiglo20'' x = x < 1901 || x >= 2000 | noSiglo20'' x = x < 1901 || x >= 2000 | ||
-- Lucía Hernández | -- Lucía Hernández, Lucía González, Irene Ortega Moncayo | ||
noSiglo20 :: Int -> Bool | noSiglo20 :: Int -> Bool | ||
noSiglo20 x = not(siglo20 x) | noSiglo20 x = not(siglo20 x) | ||
Línea 759: | Línea 872: | ||
else True | else True | ||
noSiglo20'' x = x=>2000 || x< 1901 | noSiglo20'' x = x=>2000 || x< 1901 | ||
-- Elsa Domínguez | -- Elsa Domínguez, Ana Sánchez Martín | ||
noSiglo20 :: Int -> Bool | noSiglo20 :: Int -> Bool | ||
noSiglo20 x = siglo20 x | noSiglo20 x = not (siglo20 x) | ||
noSiglo20' x = not (x >= 1901 && x <= 2000) | noSiglo20' x = not (x >= 1901 && x <= 2000) | ||
noSiglo20'' x = x < 1901 || x > 2000 | noSiglo20'' x = x < 1901 || x > 2000 | ||
-- Adolfo Sagrera Vivancos | |||
noSiglo201 :: Int -> Bool | |||
noSiglo201 x = not (siglo20 x) | |||
noSiglo20'1 x = not(x>1901) && not(x<2000) | |||
noSiglo20''1 x = x<1901 || x>2000 | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ejercicio 26. Definir la función | -- Ejercicio 26. Definir la función | ||
Línea 783: | Línea 901: | ||
-- xnor False False == True | -- xnor False False == True | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Lucía Hernández | -- Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín | ||
xnor :: Bool -> Bool -> Bool | xnor :: Bool -> Bool -> Bool | ||
Línea 809: | Línea 927: | ||
| (x+y+z)/3 >= 5 && and [x>4, y>4, z>4] = True | | (x+y+z)/3 >= 5 && and [x>4, y>4, z>4] = True | ||
| otherwise = False | | otherwise = False | ||
--Lucía Hernández | --Lucía Hernández, Ana Sánchez Martín | ||
aprueba :: Float -> Float -> Float -> Bool | aprueba :: Float -> Float -> Float -> Bool | ||
aprueba n1 n2 n3 = (n1+n2+n3)/3 >= 5 &&( n1>=4 && n2>=4 && n3>=4) || n3 == 10 | aprueba n1 n2 n3 = (n1+n2+n3)/3 >= 5 &&( n1>=4 && n2>=4 && n3>=4) || n3 == 10 | ||
-- Elsa Domínguez | -- Elsa Domínguez, Lucía González | ||
aprueba2 :: Float -> Float -> Float -> Bool | aprueba2 :: Float -> Float -> Float -> Bool | ||
aprueba2 n1 n2 n3 | and [n1 > 4, n2 > 4, n3 > 4] = (n1+n2+n3)/3 >= 5 | aprueba2 n1 n2 n3 | and [n1 >= 4, n2 >= 4, n3 >= 4] = (n1+n2+n3)/3 >= 5 | ||
| n3 == 10 | | n3 == 10 = True | ||
| otherwise = False | |||
-- Adolfo Sagrera Vivancos | |||
aprueba3 :: Float -> Float -> Float -> Bool | |||
aprueba3 n1 n2 n3 | (n1+n2+n3)/3 >= 5 && (n1 >= 4 && n2 >= 4 && n3 >= 4) || n3 == 10 = True | |||
| otherwise = False | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
Línea 837: | Línea 960: | ||
prop_leyes_morgan a b = ley1 a b == ley2 a b | prop_leyes_morgan a b = ley1 a b == ley2 a b | ||
-- Lucía Hernández | -- Lucía Hernández, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Adolfo Sagrera Vivancos, Ana Sánchez Martín | ||
ley1 :: Bool -> Bool -> Bool | |||
ley1:: Bool -> Bool -> Bool | |||
ley1 a b = not(a || b) ==( not a && not b) | ley1 a b = not(a || b) ==( not a && not b) | ||
ley2:: Bool -> Bool -> Bool | ley2 :: Bool -> Bool -> Bool | ||
ley2 a b = not (a&&b) == ( not a || not b ) | ley2 a b = not (a&&b) == ( not a || not b ) | ||
Revisión actual del 17:29 28 oct 2021
-- I1M 2021-22: Rel_2.hs (08 de octubre de 2021)
-- Definiciones con condicionales, guardas o patrones.
-- Departamento de Ciencias de la Computación e I.A.
-- Universidad de Sevilla
-- =====================================================================
-- ---------------------------------------------------------------------
-- Introducción --
-- ---------------------------------------------------------------------
-- En esta relación se presentan ejercicios con definiciones elementales
-- (no recursivas) de funciones que usan condicionales, guardas o
-- patrones.
--
-- De forma adicional, se adjuntan ejercicios de repaso para trabajar con
-- operaciones lógicas sobre valores de verdad (o booleanos), sobre todo
-- con &&, || y not.
--
-- Estos ejercicios se corresponden con el tema 4 cuyas transparencias
-- se encuentran en
-- http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-4.html
-- ---------------------------------------------------------------------
-- § Librerías auxiliares --
-- ---------------------------------------------------------------------
-- Esta librería se puede instalar de la siguiente forma:
-- 1. Abrir cmd (Windows) o Terminal (MacOS y Linux)
-- 2. Escribir: cabal update
-- 3. Escribir: cabal install QuickCheck
import Test.QuickCheck
-- ---------------------------------------------------------------------
-- Ejercicio 1. Definir la función
-- divisionSegura :: Double -> Double -> Double
-- tal que (divisionSegura x y) es x/y si y no es cero y 9999 en caso
-- contrario. Por ejemplo,
-- divisionSegura 7 2 == 3.5
-- divisionSegura 7 0 == 9999.0
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Elsa Domínguez,Lucía González, Adolfo Sagrera Vivancos, José Manuel García, Fernando Martínez Ortega, Ángela Pérez Ríos, Irene Ortega Moncayo, Cristina Torres ,Daniel Kock Cabrera
divisionSegura :: Double -> Double -> Double
divisionSegura x y = if y == 0 then 9999
else x/y
-- Laura Arango, Ana Sánchez Martín
divisionSegura1 :: Double -> Double -> Double
divisionSegura1 x y | y == 0 = 999
| otherwise = x/y
-- Alereyvil
divisionSegura x y | y/=0 = x/y
| y==0 = 9999.0
-- prof
divisionSegura x 0 = 9999
divisionSegura x y = x/y
-- ---------------------------------------------------------------------
-- Ejercicio 2. Definir la función
-- intercambia :: (a,b) -> (b,a)
-- tal que (intercambia p) es el punto obtenido intercambiando las
-- coordenadas del punto p. Por ejemplo,
-- intercambia (2,5) == (5,2)
-- intercambia (5,2) == (2,5)
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero,Lucía González, Adolfo Sagrera Vivancos, José Manuel García, Fernando Martínez Ortega, Ángela Pérez Ríos, Irene Ortega Moncayo, Cristina Torres,Daniel Kock Cabrera, Ana Sánchez Martín
intercambia :: (a,b) -> (b,a)
intercambia (a,b) = (b,a)
-- Lucía Hernández, Laura Arango, Elsa Domínguez
intercambia1 :: (a,b) -> (b,a)
intercambia1 p = (snd p, fst p)
-- ---------------------------------------------------------------------
-- Ejercicio 3. Comprobar con QuickCheck que la función intercambia es
-- idempotente; es decir, si se aplica dos veces es lo mismo que no
-- aplicarla ninguna.
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos, Lucía González, José Manuel García, Fernando Martínez Ortega, Ángela Pérez Ríos, Irene Ortega Moncayo, Cristina Torres,Daniel Kock Cabrera, Ana Sánchez Martín
-- La propiedad es
prop_intercambia :: (Int,Int) -> Bool
prop_intercambia (a,b) = intercambia (intercambia (a,b)) == (a,b)
-- La comprobación es quickCheck prop_intercambia
-- +++ OK, passed 100 tests
--Lucía Hernández, Laura Arango, Elsa Domínguez
-- La propiedad es
prop_intercambia1 :: (Int,Int) -> Bool
prop_intercambia1 p = intercambia1 (intercambia1 p) == p
-- La comprobación es quickCheck prop_intercambia1
-- +++OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- Ejercicio 4.1. Definir una función
-- ciclo :: [a] -> [a]
-- tal que (ciclo xs) es la lista obtenida permutando cíclicamente los
-- elementos de la lista xs, pasando el último elemento al principio de
-- la lista. Por ejemplo,
-- ciclo [2,5,7,9] == [9,2,5,7]
-- ciclo [] == []
-- ciclo [2] == [2]
-- ---------------------------------------------------------------------
-- Elsa Domínguez
ciclo :: [a] -> [a]
ciclo xs | length xs == 0 = xs
| otherwise = last xs : init xs
--Lucía Hernández, Irene Ortega Moncayo, Cristina Torres,Daniel Kock Cabrera
ciclo1 :: [a] -> [a]
ciclo1 xs =if length xs == 0 then []
else last xs:init xs
--Laura Arango
ciclo2 :: [a] -> [a]
ciclo2 [] = []
ciclo2 xs = last xs : init xs
-- Adolfo Sagrera Vivancos, Lucía González
ciclo3 xs |length xs == 0 = []
|otherwise = last xs:init xs
-- José Manuel García
ciclo4 :: [a] -> [a]
ciclo4 xs = take (length xs) ((drop (length xs - 1) xs) ++ xs)
-- Ana Sánchez Martín
ciclo :: [a] -> [a]
ciclo [] = []
ciclo xs = [last xs] ++ init xs
-- ---------------------------------------------------------------------
-- Ejercicio 4.2. Comprobar que la longitud es un invariante de la
-- función ciclo; es decir, la longitud de (ciclo xs) es la misma que la
-- de xs.
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero, Elsa Domínguez, Lucía Hernández,Lucía González,Laura Arango, Adolfo Sagrera Vivancos, José Manuel García, Ángela Pérez Ríos, Irene Ortega Moncayo, Cristina Torres,Daniel Kock Cabrera, Ana Sánchez Martín
-- La propiedad es
prop_ciclo :: [Int] -> Bool
prop_ciclo xs = length (ciclo xs) == length xs
-- La comprobación es quickCheck prop_ciclo
+++OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- Ejercicio 5. Definir la función
-- numeroMayor :: (Num a, Ord a) => a -> a -> a
-- tal que (numeroMayor x y) es el mayor número de dos cifras que puede
-- construirse con los dígitos x e y. Por ejemplo,
-- numeroMayor 2 5 == 52
-- numeroMayor 5 2 == 52
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero, Elsa Domínguez, Lucía Hernández, Laura Arango, Irene Ortega Moncayo
numeroMayor :: (Num a, Ord a) => a -> a -> a
numeroMayor x y = if x > y then (x*10 + y) else (y*10+x)
-- Adolfo Sagrera Vivancos, José Manuel García, Lucía González, Cristina Torres,Daniel Kock Cabrera
numeroMayor1 x y | x<y = (y*10+x)
| x>y = (x*10+y)
-- Ana Sánchez Martín
numeroMayor :: (Num a, Ord a) => a -> a -> a
numeroMayor x y
| x > y = x*10+y
| otherwise = 10*y+x
-- ---------------------------------------------------------------------
-- Ejercicio 6. Definir la función
-- numeroDeRaices :: (Num t, Ord t) => t -> t -> t -> Int
-- tal que (numeroDeRaices a b c) es el número de raíces reales de la
-- ecuación a*x^2 + b*x + c = 0. Por ejemplo,
-- numeroDeRaices 2 0 3 == 0
-- numeroDeRaices 4 4 1 == 1
-- numeroDeRaices 5 23 12 == 2
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero
numeroDeRaices :: (Num t, Ord t) => t -> t -> t -> Int
numeroDeRaices a b c | t < 0 = 0
| t == 0 = 1
| otherwise = 2
where t = b^2 - 4*a*c
-- Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Cristina Torres,Daniel Kock Cabrera
numeroDeRaices1 :: (Num t, Ord t) => t -> t -> t -> Int
numeroDeRaices1 a b c | b^2-4*a*c < 0 = 0
| b^2-4*a*c == 0 = 1
| otherwise = 2
--Lucía Hernández, Laura Arango, Adolfo Sagrera Vivancos, José Manuel García
numeroDeRaices2 :: (Num t, Ord t) => t -> t -> t -> Int
numeroDeRaices2 a b c |(b^2-4*a*c) >0 = 2
|(b^2-4*a*c) == 0 = 1
|otherwise = 0
-- Ana Sánchez Martín
numeroDeRaices :: (Num t, Ord t) => t -> t -> t -> Int
numeroDeRaices a b c
|discriminante < 0 = 0
|discriminante == 0 = 1
| otherwise = 2
where discriminante = b^2-4*a*c
-- ---------------------------------------------------------------------
-- Ejercicio 7. Definir la función
-- raices :: Double -> Double -> Double -> [Double]
-- tal que (raices a b c) es la lista de las raíces reales de la
-- ecuación ax^2 + bx + c = 0. Por ejemplo,
-- raices 1 3 2 == [-1.0,-2.0]
-- raices 1 (-2) 1 == [1.0,1.0]
-- raices 1 0 1 == []
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero
raices :: Double -> Double -> Double -> [Double]
raices a b c | b == 0 = []
| otherwise = [(-b+t)/2*a, (-b-t)/2*a]
where t = b^2 - 4*a*c
-- Elsa Domínguez, Laura Arango, Irene Ortega Moncayo, Cristina Torres
raices1 :: Double -> Double -> Double -> [Double]
raices1 a b c | b^2-4*a*c == 0 = [-b/2*a, -b/2*a]
| b^2-4*a*c < 0 = []
| b^2-4*a*c > 0 = [(-b+t)/(2*a), (-b-t)/(2*a)]
where t = sqrt (b^2-4*a*c)
--Lucía Hernández, José Manuel García
raices2 :: Double -> Double -> Double -> [Double]
raices2 a b c |(b^2-4*a*c) >0 = [(-b+sqrt(b^2-4*a*c))/2*a,(-b-sqrt(b^2-4*a*c))/2*a]
|(b^2-4*a*c) == 0 = [-b/2*a, -b/2*a]
|otherwise = []
-- Adolfo Sagrera Vivancos, Lucía González, Ana Sánchez Martín
raices3 a b c | numeroDeRaices a b c == 0 = []
| numeroDeRaices a b c == 1 = [-b/(2*a), -b/(2*a)]
| otherwise = [(-b+sqrt(b^2-4*a*c))/(2*a), (-b-sqrt(b^2-4*a*c))/(2*a)]
-- ---------------------------------------------------------------------
-- Ejercicio 8. Definir el operador
-- (~=) :: (Fractional a, Ord a) => a -> a -> Bool
-- tal que (x ~= y) se verifica si x e y son casi iguales; es decir si
-- el valor absoluto de su diferencia es menor que una milésima. Por
-- ejemplo,
-- 12.3457 ~= 12.3459 == True
-- 12.3457 ~= 12.3479 == False
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos, Cristina Torres
(~=) :: (Fractional a, Ord a) => a -> a -> Bool
x ~= y | abs(x-y) <= 0.001 = True
| otherwise = False
--Lucía Hernández, Laura Arango, Lucía González, Irene Ortega Moncayo
(~=) :: (Fractional a, Ord a) => a -> a -> Bool
x ~= y = if abs(x - y)<0.001 then True
else False
-- Elsa Domínguez, José Manuel García, Ana Sánchez Martín
(~=) :: (Fractional a, Ord a) => a -> a -> Bool
x ~= y = abs (x-y) < 0.001
-- ---------------------------------------------------------------------
-- Ejercicio 9. Comprobar con QuickCheck que la suma de las raíces
-- de la ecuación ax^2 + bx + c = 0 (con a no nulo) es -b/a y su
-- producto es c/a.
--
-- Nota. En la comparación usar ~= en lugar de ==
-- ---------------------------------------------------------------------
-- Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Cristina Torres
-- La propiedad es
prop_raices :: Double -> Double -> Double -> Property
prop_raices a b c = (a /= 0) && not (null (raices a b c)) ==> (sum (raices a b c)) ~= (-b/a) && (product (raices a b c)) ~= (c/a)
-- La comprobación es quickCheck prop_raices
-- +++ OK, passed 100 tests.
-- Ana Sánchez Martín
-- La propiedad es
prop_raices :: Double -> Double -> Double -> Property
prop_raices a b c = a /= 0 && numeroDeRaices a b c /= 0 ==>
(sol1 + sol2) ~= (-b/a) && (sol1 * sol2) ~= (c/a)
where sol1 = raices a b c !! 0
sol2 = raices a b c !! 1
-- La comprobación es quickCheck prop_raices
-- ---------------------------------------------------------------------
-- Ejercicio 10. En geometría, la fórmula de Herón, descubierta por
-- Herón de Alejandría, dice que el área de un triángulo cuyo lados
-- miden a, b y c es la raíz cuadrada de s(s-a)(s-b)(s-c) donde s es el
-- semiperímetro
-- s = (a+b+c)/2
--
-- Definir la función
-- area :: Double -> Double -> Double -> Double
-- tal que (area a b c) es el área del triángulo de lados a, b y c. Por
-- ejemplo,
-- area 3 4 5 == 6.0
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Lucía González, Elsa Domínguez, Adolfo Sagrera Vivancos, José Manuel García,César Fornis, Irene Ortega Moncayo, Cristina Torres, Ana Sánchez Martín
area :: Double -> Double -> Double -> Double
area a b c = sqrt(s*(s-a)*(s-b)*(s-c))
where s = (a+b+c)/2
-- ---------------------------------------------------------------------
-- Ejercicio 11. Los intervalos cerrados se pueden representar mediante
-- una lista de dos números (el primero es el extremo inferior del
-- intervalo y el segundo el superior).
--
-- Definir la función
-- interseccion :: Ord a => [a] -> [a] -> [a]
-- tal que (interseccion i1 i2) es la intersección de los intervalos i1 e
-- i2. Por ejemplo,
-- interseccion [] [3,5] == []
-- interseccion [3,5] [] == []
-- interseccion [2,4] [6,9] == []
-- interseccion [2,6] [6,9] == [6,6]
-- interseccion [2,6] [0,9] == [2,6]
-- interseccion [2,6] [0,4] == [2,4]
-- interseccion [4,6] [0,4] == [4,4]
-- interseccion [5,6] [0,4] == []
-- ---------------------------------------------------------------------
--Lucía Hernández, Ana Sánchez Martín
interseccion :: Ord a => [a] -> [a] -> [a]
interseccion [] _ = []
interseccion _ []= []
interseccion i1 i2 | last i1<head i2 = []
|head i1>last i2 = []
|otherwise = [maximum [head i1,head i2], minimum [last i1,last i2]]
--Laura Arango, Elsa Domínguez, César Fornis, Lucía González
interseccion1 :: Ord a => [a] -> [a] -> [a]
interseccion1 i1 i2 | i1==[] || i2==[] || head i1>last i2 || last i1<head i2 = []
| otherwise = [max (head i1)(head i2), min (last i1)(last i2)]
--José Manuel García, Fernando Martínez Ortega, Irene Ortega Moncayo
interseccion2 :: Ord a => [a] -> [a] -> [a]
interseccion2 i1 i2 | null i1 || null i2 || a > d || b < c = []
| a <= c && b <= d = [c,b]
| a >= c && b <= d = [a,b]
| a >= c && b >= d = [a,d]
| a <= c && b >= d = [c,d]
where a = head i1
b = last i1
c = head i2
d = last i2
-- Adolfo Sagrera Vivancos, Cristina Torres
interseccion3 :: Ord a => [a] -> [a] -> [a]
interseccion3 i1 i2 | null i1 || null i2 || a > d || b < c = []
| otherwise = [max a c, min b d]
where a = head i1
b = last i1
c = head i2
d = last i2
-- ---------------------------------------------------------------------
-- Ejercicio 12. Comprobar con QuickCheck que la intersección de
-- intervalos es conmutativa.
-- ---------------------------------------------------------------------
--Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García, Lucía González, Adolfo Sagrera Vivancos, Irene Ortega Moncayo, Cristina Torres, Ana Sánchez Martín
-- La propiedad es
prop_interseccion :: Int -> Int -> Int -> Int -> Bool
prop_interseccion a1 a2 b1 b2 = interseccion [a1,a2] [b1,b2] == interseccion [b1,b2] [a1,a2]
-- La comprobación es quickCheck prop_interseccion
+++ OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- Ejercicio 13.1. Los números racionales pueden representarse mediante
-- pares de números enteros. Por ejemplo, el número 2/5 puede
-- representarse mediante el par (2,5).
--
-- Definir la función
-- formaReducida :: (Int,Int) -> (Int,Int)
-- tal que (formaReducida x) es la forma reducida del número racional
-- x. Por ejemplo,
-- formaReducida (4,10) == (2,5)
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, José Manuel García, Lucía González, Irene Ortega Moncayo, Cristina Torres
formaReducida :: (Int,Int) -> (Int,Int)
formaReducida (a,b) = (div a z, div b z)
where z = gcd a b
-- Adolfo Sagrera Vivancos
formaReducida1 :: (Int,Int) -> (Int,Int)
formaReducida1 (a,b) = (s*abs(div a z), abs(div b z)) where z = gcd a b
s = signum (a*b)
-- Elsa Domínguez
formaReducida2 :: (Int,Int) -> (Int,Int)
formaReducida2 (a,b) | a == 0 && b == 0 = (0,0)
| otherwise = (s*abs(div a z), abs(div b z))
where z = gcd a b
s = signum (a*b)
-- Ana Sánchez Martín
formaReducida :: (Int,Int) -> (Int,Int)
formaReducida (0,_) = (0,1)
formaReducida (_,0) = (1,0)
formaReducida (a,b) = (div a (gcd a b), div b (gcd a b))
-- ---------------------------------------------------------------------
-- Ejercicio 13.2. Definir la función
-- sumaRacional :: (Int,Int) -> (Int,Int) -> (Int,Int)
-- tal que (sumaRacional x y) es la suma de los números racionales x e
-- y, expresada en forma reducida. Por ejemplo,
-- sumaRacional (2,3) (5,6) == (3,2)
-- ---------------------------------------------------------------------
--Lucía Hernández
sumaRacional :: (Int,Int) -> (Int,Int) -> (Int,Int)
sumaRacional (a,b) (c,d) = if b<d then formaReducida((div s b)*a + c, s)
else formaReducida(a+ (div s d)*c, s)
where s = lcm b d
-- Elsa Domínguez, José Manuel García, Lucía González, Irene Ortega Moncayo, Cristina Torres, Ana Sánchez Martín
sumaRacional1 :: (Int,Int) -> (Int,Int) -> (Int,Int)
sumaRacional1 (a,b) (c,d) = formaReducida (a*d + c*b, b*d)
--Pelayo Infante
sumaRacional2 :: (Int,Int) -> (Int,Int) -> (Int,Int)
sumaRacional2 (a,b) (c,d) = formaReducida ((x), (lcm b d))
where x= y+ ((div (lcm b d) d)*c)
where y= (div(lcm b d) b)*a
--Adolfo Sagrera Vivancos
sumaRacional3 :: (Int,Int) -> (Int,Int) -> (Int,Int)
sumaRacional3 (a,b) (c,d) = formaReducida(((div t b)*a + (div t d)*c), t) where t = lcm b d
-- ---------------------------------------------------------------------
-- Ejercicio 13.3. Definir la función
-- productoRacional :: (Int,Int) -> (Int,Int) -> (Int,Int)
-- tal que (productoRacional x y) es el producto de los números
-- racionales x e y. Por ejemplo,
-- productoRacional (2,3) (5,6) == (5,9)
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero
productoRacional :: (Int,Int) -> (Int,Int) -> (Int,Int)
productoRacional (a,b) (c,d) = formaReducida (x,t)
where x = a*c
t = b*d
-- Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García, Adolfo Sagrera Vivancos, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
productoRacional1 :: (Int,Int) -> (Int,Int) -> (Int,Int)
productoRacional1 (a,b) (c,d) = formaReducida (a*c, b*d)
-- ----------------------------------------------------------------------------
-- Ejercicio 13.4. Definir la función
-- cocienteRacional :: (Int,Int) -> (Int,Int) -> (Int,Int)
-- tal que '(cocienteRacional x y)' es el cociente de los números racionales
-- 'x' e 'y'. Por ejemplo,
-- cocienteRacional (2,3) (5,6) == (4,5)
-- ----------------------------------------------------------------------------
-- Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García, Adolfo Sagrera Vivancos, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
cocienteRacional :: (Int,Int) -> (Int,Int) -> (Int,Int)
cocienteRacional (x1,x2) (y1,y2) = formaReducida (x1*y2, x2*y1)
-- ---------------------------------------------------------------------
-- Ejercicio 13.5. Definir la función
-- igualdadRacional :: (Int,Int) -> (Int,Int) -> Bool
-- tal que (igualdadRacional x y) se verifica si los números racionales
-- x e y son iguales. Por ejemplo,
-- igualdadRacional (6,9) (10,15) == True
-- igualdadRacional (6,9) (11,15) == False
-- igualdadRacional (0,2) (0,-5) == True
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo
igualdadRacional :: (Int,Int) -> (Int,Int) -> Bool
igualdadRacional (a,b) (c,d) = formaReducida (a,b) == formaReducida (c,d)
-- Laura Arango
igualdadRacional1 :: (Int,Int) -> (Int,Int) -> Bool
igualdadRacional1 (a,b) (c,d) = formaReducida (a,b) == formaReducida (c,d)
|| (a==0 && c==0)
|| (b==0 && d==0)
-- José Manuel García
igualdadRacional3 :: (Int,Int) -> (Int,Int) -> Bool
igualdadRacional3 (a,b) (c,d) = if (a == 0 && c == 0) || (b == 0 && d == 0)
then True
else formaReducida (a,b) == formaReducida (c,d)
-- César Fornis Catalán, Ana Sánchez Martín
igualdadRacional4 :: (Int,Int) -> (Int,Int) -> Bool
igualdadRacional4 (a,b) (c,d) = a*d == b*c
-- ---------------------------------------------------------------------
-- Ejercicio 13.6. Comprobar con QuickCheck la propiedad distributiva
-- del producto racional respecto de la suma.
-- ---------------------------------------------------------------------
-- Elsa Domínguez, Irene Ortega Moncayo, Adolfo Sagrera Vivancos, Ana Sánchez Martín
-- La propiedad es
prop_distributiva :: (Int,Int) -> (Int,Int) -> (Int,Int) -> Property
prop_distributiva x y z = (fst x * snd x /= 0) && (fst y * snd y /= 0) && (fst z * snd z /= 0) ==>
igualdadRacional (productoRacional (sumaRacional x y) z) (sumaRacional (productoRacional x z) (productoRacional y z))
-- La comprobación es quickCheck prop_distributiva
-- +++ OK, passed 100 tests.
-- ----------------------------------------------------------------------------
-- Ejercicio 14. Los números complejos se pueden representar mediante pares de
-- números reales. Por ejemplo, el número 2+5i se puede representar mediante
-- el par (2,5).
-- ----------------------------------------------------------------------------
-- Lo siguiente significa que el tipo Complejo es lo mismo que decir (Double,Double)
type Complejo = (Double,Double)
-- ----------------------------------------------------------------------------
-- Ejercicio 14.1. Definir la función
-- sumaComplejos :: Complejo -> Complejo -> Complejo
-- tal que '(sumaComplejos x y)' es la suma de los números complejos 'x' e 'y'.
-- Por ejemplo,
-- sumaComplejos (2,3) (5,6) == (7.0,9.0)
-- ----------------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, Irene Ortega Moncayo, José Manuel García, Adolfo Sagrera Vivancos, Lucía González, Ana Sánchez Martín
sumaComplejos :: Complejo -> Complejo -> Complejo
sumaComplejos (x1,x2) (y1,y2) = (x1+y1, x2+y2)
-- ----------------------------------------------------------------------------
-- Ejercicio 14.2. Definir la función
-- productoComplejos :: Complejo -> Complejo -> Complejo
-- tal que '(productoComplejos x y)' es el producto de los números complejos
-- 'x' e 'y'. Por ejemplo,
-- productoComplejos (2,3) (5,6) == (-8.0,27.0)
-- ----------------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García, Adolfo Sagrera Vivancos, Irene Ortega Moncayo, Lucía González, Ana Sánchez Martín
productoComplejos :: Complejo -> Complejo -> Complejo
productoComplejos (x1,x2) (y1,y2) = ((x1*y1 - x2*y2),(x2*y1 + x1*y2))
-- ----------------------------------------------------------------------------
-- Ejercicio 14.3. Definir la función
-- cocienteComplejos :: Complejo -> Complejo -> Complejo
-- tal que '(cocienteComplejos x y)' es el cociente de los números complejos
-- 'x' e 'y'. Por ejemplo,
-- cocienteComplejos (3,2) (1,-2) == (-0.2,1.6)
-- ----------------------------------------------------------------------------
-- Ana Sosa Caballero, Laura Arango, Lucía González, Irene Ortega Moncayo
cocienteComplejos :: Complejo -> Complejo -> Complejo
cocienteComplejos (x1,x2) (y1,y2) = (((x1*y1 + x2*y2)/ t), ((x2*y1 - x1*y2)/t))
where t = (y1^2 + y2^2)
-- Elsa Domínguez, Adolfo Sagrera Vivancos
cocienteComplejos :: Complejo -> Complejo -> Complejo
cocienteComplejos (x1,x2) (y1,y2) = (a,b)
where a = fst (productoComplejos (x1,x2) (y1,-y2))/(y1^2 + y2^2)
b = snd (productoComplejos (x1,x2) (y1,-y2))/(y1^2 + y2^2)
-- Ana Sánchez Martín
cocienteComplejos :: Complejo -> Complejo -> Complejo
cocienteComplejos (x1,x2) (y1,y2) = (fst(numero)/modulo, snd(numero)/modulo)
where numero = productoComplejos (x1,x2) (y1,-y2)
modulo = y1^2 + y2^2
-- ----------------------------------------------------------------------------
-- Ejercicio 14.4. Definir la función
-- conjugado :: Complejo -> Complejo
-- tal que '(conjugado x)' es el conjugado del número complejo 'x'. Por
-- ejemplo,
-- conjugado (2,3) == (2.0,-3.0)
-- ----------------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, Irene Ortega Moncayo, José Manuel García, Adolfo Sagrera Vivancos, Lucía González, Ana Sánchez Martín
conjugado :: Complejo -> Complejo
conjugado (x1,x2) = (x1, -x2)
-- ----------------------------------------------------------------------------
-- Ejercicio 15. Los rectángulos pueden representarse por sus dimensiones, base
-- y altura, como un par de números enteros. Por ejemplo, (5,3) representa un
-- rectángulo de base 5 y altura 3.
--
-- Definir la función
-- mayorRectangulo :: (Int,Int) -> (Int,Int) -> (Int,Int)
-- tal que '(mayorRectangulo r1 r2)' es el rectángulo de mayor área entre 'r1'
-- y 'r2'. Por ejemplo,
-- mayorRectangulo (4,6) (3,7) == (4,6)
-- mayorRectangulo (4,6) (3,8) == (4,6)
-- mayorRectangulo (4,6) (3,9) == (3,9)
-- ----------------------------------------------------------------------------
-- Ana Sosa Caballero
mayorRectangulo :: (Int,Int) -> (Int,Int) -> (Int,Int)
mayorRectangulo (x1,y1) (x2,y2) = if t >= p then (x1,y1) else (x2,y2)
where t = x1*y1
p = x2*y2
-- Lucía Hernández, Laura Arango, Elsa Domínguez, Lucía González, Irene Ortega Moncayo
mayorRectangulo1 :: (Int,Int) -> (Int,Int) -> (Int,Int)
mayorRectangulo1 (x1,y1) (x2,y2) = if x1*y1 >= x2*y2 then (x1,y1)
else (x2,y2)
-- Adolfo Sagrera Vivancos
mayorRectangulo2 :: (Int,Int) -> (Int,Int) -> (Int,Int)
mayorRectangulo2 (x1,y1) (x2,y2) | t > s = (x1, y1)
| s > t = (x2, y2)
| otherwise = (x1, y1)
where t = x1*y1
s = x2*y2
-- Ana Sánchez Martín
mayorRectangulo :: (Int,Int) -> (Int,Int) -> (Int,Int)
mayorRectangulo (x1,y1) (x2,y2) = if x1*y1 >= x2*y2
then (x1,y1)
else (x2,y2)
-- ----------------------------------------------------------------------------
-- Ejercicio 16. Definir la función
-- cuadrante :: (Int,Int) -> Int
-- tal que '(cuadrante p)' es el cuadrante en el que se encuentra el punto 'p'.
-- Si el punto está sobre los ejes el resultado debe ser 0. Por ejemplo,
-- cuadrante (0,4) == 0
-- cuadrante (-3,0) == 0
-- cuadrante (0,0) == 0
-- cuadrante (3,5) == 1
-- cuadrante (-3,5) == 2
-- cuadrante (-3,-5) == 3
-- cuadrante (3,-5) == 4
-- ----------------------------------------------------------------------------
-- Ana Sosa Caballero
cuadrante :: (Int,Int) -> Int
cuadrante (x1,x2) | or [x1 == 0, x2 == 0] = 0
| and [x1 > 0, x2 > 0] = 1
| and [x1 < 0, x2 > 0] = 2
| and [x1 < 0, x2 < 0] = 3
| otherwise = 4
--Lucía Hernández
cuadrante1 :: (Int,Int) -> Int
cuadrante1 (0,_) = 0
cuadrante1 (_,0) = 0
cuadrante1 (x1,x2) | x1>0 && x2>0 = 1
| x1<0 && x2>0 = 2
| x1<0 && x2<0 = 3
| otherwise = 4
--Laura Arango, Elsa Domínguez, Irene Ortega Moncayo
cuadrante2 :: (Int,Int) -> Int
cuadrante2 (x1,x2) | x1>0 && x2>0 = 1
| x1<0 && x2>0 = 2
| x1<0 && x2<0 = 3
| x1>0 && x2<0 = 4
| otherwise = 0
-- Adolfo Sagrera Vivancos, Lucía González
cuadrante3 :: (Int,Int) -> Int
cuadrante3 (x1,x2) | x1 == 0 || x2 == 0 = 0
| x1 == 0 && x2 == 0 = 0
| x1 > 0 && x2 > 0 = 1
| x1 < 0 && x2 > 0 = 2
| x1 < 0 && x2 < 0 = 3
| otherwise = 4
-- José Manuel García, Ana Sánchez Martín
cuadrante4 :: (Int,Int) -> Int
cuadrante4 (x1,x2) | x1 * x2 == 0 = 0
| x1 > 0 && x2 > 0 = 1
| x1 < 0 && x2 > 0 = 2
| x1 < 0 && x2 < 0 = 3
| x1 > 0 && x2 < 0 = 4
-- ----------------------------------------------------------------------------
-- Ejercicio 17. Definir la función
-- simetricoH :: (Int,Int) -> (Int,Int)
-- tal que '(simetricoH p)' es el punto simétrico de 'p' respecto del eje
-- horizontal. Por ejemplo,
-- simetricoH (2,5) == (2,-5)
-- simetricoH (2,-5) == (2,5)
-- ----------------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Adolfo Sagrera Vivancos, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
simetricoH :: (Int,Int) -> (Int,Int)
simetricoH (x1,x2) = (x1,-x2)
-- Elsa Domínguez
simetricoH1 :: (Int,Int) -> (Int,Int)
simetricoH1 p = (fst p,-snd p)
-- ----------------------------------------------------------------------------
-- Ejercicio 18. Definir la función
-- simetricoV :: (Int,Int) -> (Int,Int)
-- tal que '(simetricoV p)' es el punto simétrico de 'p' respecto del eje
-- vertical. Por ejemplo,
-- simetricoV (2,5) == (-2,5)
-- simetricoV (2,-5) == (-2,-5)
-- ----------------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Adolfo Sagrera Vivancos, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
simetricoV :: (Int,Int) -> (Int,Int)
simetricoV (x1,x2) = (-x1,x2)
- Elsa Domínguez
simetricoV1 :: (Int,Int) -> (Int,Int)
simetricoV1 p = (-fst p,snd p)
-- ----------------------------------------------------------------------------
-- Ejercicio 19. Definir la función
-- distancia :: (Float,Float) -> (Float,Float) -> Float
-- tal que '(distancia p1 p2)' es la distancia entre los puntos 'p1' y 'p2'.
-- Por ejemplo,
-- distancia (1,2) (4,6) == 5.0
-- ----------------------------------------------------------------------------
-- Ana Sosa Caballero, Laura Arango, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
distancia :: (Float,Float) -> (Float,Float) -> Float
distancia (x1,x2) (y1,y2) = sqrt((x1-y1)^2 + (x2-y2)^2)
-- Lucía Hernández
distancia1 :: (Float,Float) -> (Float,Float) -> Float
distancia1 p1 p2 = sqrt((fst p2 - fst p1)^2 + (snd p2-snd p1)^2)
-- Adolfo Sagrera Vivancos
distancia2 :: (Float,Float) -> (Float,Float) -> Float
distancia2 (x1,x2) (y1,y2) = sqrt(t^2 + s^2)
where t = x1-y1
s = x2-y2
-- ----------------------------------------------------------------------------
-- Ejercicio 20. Comprobar con QuickCheck que se verifica la propiedad
-- triangular de la distancia; es decir, dados tres puntos p1, p2 y p3, la
-- distancia de p1 a p3 es menor o igual que la suma de las distancias de p1 a
-- p2 y de p2 a p3.
-- ----------------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, Adolfo Sagrera Vivancos, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
-- La propiedad es
prop_triangular :: (Float,Float) -> (Float,Float) -> (Float,Float) -> Bool
prop_triangular p1 p2 p3 = distancia p1 p3 <= distancia p1 p2 + distancia p2 p3
-- La comprobación es
-- > quickCheck prop_triangular
+++ OK, passed 100 tests.
-- ----------------------------------------------------------------------------
-- Ejercicio 21. Definir la función
-- puntoMedio :: (Float,Float) -> (Float,Float) -> (Float,Float)
-- tal que '(puntoMedio p1 p2)' es el punto medio entre los puntos 'p1' y 'p2'.
-- Por ejemplo,
-- puntoMedio (0,2) (0,6) == (0.0,4.0)
-- puntoMedio (-1,2) (7,6) == (3.0,4.0)
-- ----------------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
puntoMedio :: (Float,Float) -> (Float,Float) -> (Float,Float)
puntoMedio (x1,x2) (y1,y2) = ((x1+y1)/2, (x2+y2)/2)
-- Adolfo Sagrera Vivancos
puntoMedio1 :: (Float,Float) -> (Float,Float) -> (Float,Float)
puntoMedio1 (x1,x2) (y1,y2) = (t/2, s/2)
where t = x1 + y1
s = x2 + y2
-- ---------------------------------------------------------------------
-- Repaso de operaciones lógicas --
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
-- Ejercicio 22.1. La disyunción excluyente xor de dos fórmulas se
-- verifica si una es verdadera y la otra es falsa. Su tabla de verdad
-- es
-- x | y | xor x y
-- ------+-------+---------
-- True | True | False
-- True | False | True
-- False | True | True
-- False | False | False
--
-- Definir la función
-- xor1 :: Bool -> Bool -> Bool
-- tal que (xor1 x y) es la disyunción excluyente de x e y, calculada a
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea
-- de la tabla.
-- ---------------------------------------------------------------------
-- Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
xor1 :: Bool -> Bool -> Bool
xor1 True True = False
xor1 True False = True
xor1 False True = True
xor1 False False = False
-- ---------------------------------------------------------------------
-- Ejercicio 22.2. Definir la función
-- xor2 :: Bool -> Bool -> Bool
-- tal que (xor2 x y) es la disyunción excluyente de x e y, calculada a
-- partir de la tabla de verdad y patrones. Usar 2 ecuaciones, una por
-- cada valor del primer argumento.
-- ---------------------------------------------------------------------
--Lucía Hernández
xor2 :: Bool -> Bool -> Bool
xor2 x y | y/= x = True
| y == x = False
-- Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
xor2' :: Bool -> Bool -> Bool
xor2' True y = not y
xor2' False y = y
-- ---------------------------------------------------------------------
-- Ejercicio 22.3. Definir la función
-- xor3 :: Bool -> Bool -> Bool
-- tal que (xor3 x y) es la disyunción excluyente de x e y, calculada
-- a partir de la disyunción (||), conjunción (&&) y negación (not).
-- Usar 1 ecuación.
-- ---------------------------------------------------------------------
-- Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
xor3 :: Bool -> Bool -> Bool
xor3 x y = (x && not y) || (y && not x)
-- ---------------------------------------------------------------------
-- Ejercicio 22.4. Definir la función
-- xor4 :: Bool -> Bool -> Bool
-- tal que (xor3 x y) es la disyunción excluyente de x e y, calculada
-- a partir de desigualdad (/=). Usar 1 ecuación.
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero
xor4 :: Bool -> Bool -> Bool
xor4 x y = if x == y then False else True
-- Lucía Hernández, Adolfo Sagrera Vivancos, Lucía González, Irene Ortega Moncayo
xor4' :: Bool -> Bool -> Bool
xor4' x y = if x/=y then True else False
-- Elsa Domínguez, Ana Sánchez Martín
xor4'' :: Bool -> Bool -> Bool
xor4'' x y = x /= y
-- ---------------------------------------------------------------------
-- Ejercicio 22.5. Comprobar con QuickCheck que las cuatro definiciones
-- de xor son equivalentes.
-- ---------------------------------------------------------------------
-- Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
-- La propiedad es
prop_xor_equivalentes :: Bool -> Bool -> Bool
prop_xor_equivalentes x y = xor1 x y == xor2 x y && xor2 x y == xor3 x y && xor3 x y == xor4 x y
-- La comprobación es quickCheck prop_xor_equivalentes
+++ OK, passed 100 tests
-- ---------------------------------------------------------------------
-- Ejercicio 23.1 Definir la función
-- or3 :: Bool -> Bool -> Bool -> Bool
-- tal que (or3 a b c) es la disyunción entre a, b y c; es decir,
-- ocurre a o b o c. Definir la función usando '||'. Por ejemplo,
-- or3 True True False == True
-- or3 False False False == False
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
or3 :: Bool -> Bool -> Bool-> Bool
or3 a b c = a || b || c
-- Adolfo Sagrera Vivancos
or3'' :: Bool -> Bool -> Bool-> Bool
or3'' a b c | a==True || b==True || c==True = True
| otherwise = False
-- ---------------------------------------------------------------------
-- Ejercicio 23.2 Definir la función
-- or3' :: Bool -> Bool -> Bool -> Bool
-- tal que (or3' a b c) es la disyunción entre a, b y c; es decir,
-- ocurre a o b o c. Definir la función usando 'or' para listas.
-- Por ejemplo,
-- or3' True True False == True
-- or3' False False False == False
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
or3' :: Bool -> Bool -> Bool -> Bool
or3' a b c = or [a,b,c]
-- ---------------------------------------------------------------------
-- Ejercicio 24.1 Definir la función
-- and3 :: Bool -> Bool -> Bool -> Bool
-- tal que (and3 a b c) es la conjunción entre a, b y c; es decir,
-- ocurre a y b y c. Definir la función usando '&&'. Por ejemplo,
-- and3 True True True == True
-- and3 False True False == False
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
and3 :: Bool -> Bool -> Bool -> Bool
and3 a b c = a && b && c
-- ---------------------------------------------------------------------
-- Ejercicio 24.2 Definir la función
-- and3' :: Bool -> Bool -> Bool -> Bool
-- tal que (and3' a b c) es la conjunción entre a, b y c; es decir,
-- ocurre a o b o c. Definir la función usando 'and' para listas.
-- Por ejemplo,
-- and3' True True True == True
-- and3' False True False == False
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Ana Sánchez Martín
and3' :: Bool -> Bool -> Bool -> Bool
and3' a b c = and [a,b,c]
-- ---------------------------------------------------------------------
-- Ejercicio 25.1. Definir la función
-- siglo20 :: Int -> Bool
-- tal que (siglo20 x) indica si el ańo x perteneció al siglo 20; es decir,
-- si está comprendido entre el ańo 1901 y 2000.
-- Por ejemplo,
-- siglo20 1902 == True
-- siglo20 2001 == False
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero, Lucía Hernández, Lucía González, Irene Ortega Moncayo
siglo20 :: Int -> Bool
siglo20 x = if 1901 <= x && x < 2000 then True
else False
-- Elsa Domínguez, Ana Sánchez Martín
siglo201 :: Int -> Bool
siglo201 x = 1901 <= x && x <= 2000
-- Adolfo Sagrera Vivancos
siglo20' :: Int -> Bool
siglo20' x = x > 1901 && x < 2000
-- ---------------------------------------------------------------------
-- Ejercicio 25.2. Definir la función
-- noSiglo20 :: Int -> Bool
-- tal que (noSiglo20 x) indica si el ańo x no perteneció al siglo 20; es decir,
-- si no está comprendido entre el ańo 1901 y 2000.
-- Definirla de tres formas distintas, una usando la función (siglo20 x), otra
-- usando '&&' y otra usando '||'.
--
-- Por ejemplo,
-- noSiglo20 1902 == False
-- noSiglo20 2001 == True
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero
noSiglo20 :: Int -> Bool
noSiglo20 x = not (siglo20 x)
noSiglo20' = undefined
noSiglo20'' x = x < 1901 || x >= 2000
-- Lucía Hernández, Lucía González, Irene Ortega Moncayo
noSiglo20 :: Int -> Bool
noSiglo20 x = not(siglo20 x)
noSiglo20' x = if x <= 2000 && x > 1901 then False
else True
noSiglo20'' x = x=>2000 || x< 1901
-- Elsa Domínguez, Ana Sánchez Martín
noSiglo20 :: Int -> Bool
noSiglo20 x = not (siglo20 x)
noSiglo20' x = not (x >= 1901 && x <= 2000)
noSiglo20'' x = x < 1901 || x > 2000
-- Adolfo Sagrera Vivancos
noSiglo201 :: Int -> Bool
noSiglo201 x = not (siglo20 x)
noSiglo20'1 x = not(x>1901) && not(x<2000)
noSiglo20''1 x = x<1901 || x>2000
-- ---------------------------------------------------------------------
-- Ejercicio 26. Definir la función
-- xnor :: Bool -> Bool -> Bool
-- tal que (xnor a b) se calcula con su tabla de verdad, que
-- es
-- x | y | xnor x y
-- ------+-------+---------
-- False | False | True
-- False | True | False
-- True | False | False
-- True | True | True
--
-- Emplear solo operadores lógicos (&&, ||, not).
--
-- Por ejemplo,
-- xnor True True == True
-- xnor False True == False
-- xnor False False == True
-- ---------------------------------------------------------------------
-- Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín
xnor :: Bool -> Bool -> Bool
xnor x y = (not x && not y) || (x && y)
-- ---------------------------------------------------------------------
-- Ejercicio 27. Definir la función
-- aprueba :: Float -> Float -> Float -> Bool
-- tal que (aprueba n1 n2 n3) indica si con las notas de los
-- exámenes parciales n1, n2 y n3 se consigue aprobar la
-- asignatura. Los criterios para aprobar la asignatura son los siguientes:
-- * La media de las notas debe ser mayor o igual que 5, y
-- * Cada una de las notas de los exámenes parciales son mayor o igual
-- que 4.0,
-- * O en el último exámen se obtuvo un 10 (entonces siempre se aprueba)
-- Por ejemplo,
-- aprueba 5.0 6.0 5.0 == True
-- aprueba 1.5 6.0 8.0 == False
-- aprueba 3.7 1.5 10.0 == True
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero
aprueba :: Float -> Float -> Float -> Bool
aprueba x y z | z == 10 = True
| (x+y+z)/3 >= 5 && and [x>4, y>4, z>4] = True
| otherwise = False
--Lucía Hernández, Ana Sánchez Martín
aprueba :: Float -> Float -> Float -> Bool
aprueba n1 n2 n3 = (n1+n2+n3)/3 >= 5 &&( n1>=4 && n2>=4 && n3>=4) || n3 == 10
-- Elsa Domínguez, Lucía González
aprueba2 :: Float -> Float -> Float -> Bool
aprueba2 n1 n2 n3 | and [n1 >= 4, n2 >= 4, n3 >= 4] = (n1+n2+n3)/3 >= 5
| n3 == 10 = True
| otherwise = False
-- Adolfo Sagrera Vivancos
aprueba3 :: Float -> Float -> Float -> Bool
aprueba3 n1 n2 n3 | (n1+n2+n3)/3 >= 5 && (n1 >= 4 && n2 >= 4 && n3 >= 4) || n3 == 10 = True
| otherwise = False
-- ---------------------------------------------------------------------
-- Ejercicio 28. Comprobar las leyes de Morgan con QuickCheck. Las
-- leyes de Morgan se definen como sigue:
-- * ley 1: no (A o B) == (no A) y (no B)
-- * ley 2: no (A y B) == (no A) o (no B)
-- Consejo: definir cada ley como una función por separado para componer
-- la propiedad
-- ---------------------------------------------------------------------
-- Ana Sosa Caballero
ley1:: Bool -> Bool -> Bool
ley1 a b = not (a || b) == (not a) && (not b)
ley2:: Bool -> Bool -> Bool
ley2 a b = not (a && b) == (not a) || (not b)
-- La propiedad es
prop_leyes_morgan :: Bool -> Bool -> Bool
prop_leyes_morgan a b = ley1 a b == ley2 a b
-- Lucía Hernández, Elsa Domínguez, Lucía González, Irene Ortega Moncayo, Adolfo Sagrera Vivancos, Ana Sánchez Martín
ley1 :: Bool -> Bool -> Bool
ley1 a b = not(a || b) ==( not a && not b)
ley2 :: Bool -> Bool -> Bool
ley2 a b = not (a&&b) == ( not a || not b )
-- La propiedad es
prop_leyes_morgan :: Bool -> Bool -> Bool
prop_leyes_morgan a b= ley1 a b && ley2 a b