<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/WIKIS/I1M2021G2/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fermarort2</id>
	<title>Informática de 1º de Matemáticas [Curso 2021-22, Grupo 2] - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/WIKIS/I1M2021G2/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fermarort2"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php/Especial:Contribuciones/Fermarort2"/>
	<updated>2026-07-19T00:48:44Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=233</id>
		<title>Relación 2</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=233"/>
		<updated>2021-10-15T06:57:32Z</updated>

		<summary type="html">&lt;p&gt;Fermarort2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Rel_2.hs (08 de octubre de 2021)&lt;br /&gt;
-- Definiciones con condicionales, guardas o patrones.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presentan ejercicios con definiciones elementales&lt;br /&gt;
-- (no recursivas) de funciones que usan condicionales, guardas o&lt;br /&gt;
-- patrones. &lt;br /&gt;
--&lt;br /&gt;
-- De forma adicional, se adjuntan ejercicios de repaso para trabajar con&lt;br /&gt;
-- operaciones lógicas sobre valores de verdad (o booleanos), sobre todo&lt;br /&gt;
-- con &amp;amp;&amp;amp;, || y not. &lt;br /&gt;
-- &lt;br /&gt;
-- Estos ejercicios se corresponden con el tema 4 cuyas transparencias&lt;br /&gt;
-- se encuentran en  &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-4.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Esta librería se puede instalar de la siguiente forma:&lt;br /&gt;
-- 1. Abrir cmd (Windows) o Terminal (MacOS y Linux)&lt;br /&gt;
-- 2. Escribir: cabal update&lt;br /&gt;
-- 3. Escribir: cabal install QuickCheck&lt;br /&gt;
&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función &lt;br /&gt;
--    divisionSegura :: Double -&amp;gt; Double -&amp;gt; Double&lt;br /&gt;
-- tal que (divisionSegura x y) es x/y si y no es cero y 9999 en caso&lt;br /&gt;
-- contrario. Por ejemplo,&lt;br /&gt;
--    divisionSegura 7 2  ==  3.5&lt;br /&gt;
--    divisionSegura 7 0  ==  9999.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, José Manuel García, Fernando Martínez Ortega&lt;br /&gt;
divisionSegura :: Double -&amp;gt; Double -&amp;gt; Double&lt;br /&gt;
divisionSegura  x y = if y == 0 then 9999 &lt;br /&gt;
                      else x/y&lt;br /&gt;
-- Laura Arango&lt;br /&gt;
divisionSegura1 :: Double -&amp;gt; Double -&amp;gt; Double&lt;br /&gt;
divisionSegura1 x y | y == 0 = 999&lt;br /&gt;
                    | otherwise = x/y&lt;br /&gt;
-- Alereyvil&lt;br /&gt;
divisionSegura x y | y/=0 = x/y&lt;br /&gt;
                   | y==0 = 9999.0&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función &lt;br /&gt;
--    intercambia :: (a,b) -&amp;gt; (b,a)&lt;br /&gt;
-- tal que (intercambia p)  es el punto obtenido intercambiando las&lt;br /&gt;
-- coordenadas del punto p. Por ejemplo, &lt;br /&gt;
--    intercambia (2,5)  ==  (5,2)&lt;br /&gt;
--    intercambia (5,2)  ==  (2,5)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos, José Manuel García, Fernando Martínez Ortega&lt;br /&gt;
intercambia :: (a,b) -&amp;gt; (b,a)&lt;br /&gt;
intercambia (a,b) = (b,a)&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Elsa Domínguez&lt;br /&gt;
intercambia1 :: (a,b) -&amp;gt; (b,a)&lt;br /&gt;
intercambia1 p = (snd p, fst p)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Comprobar con QuickCheck que la función intercambia es&lt;br /&gt;
-- idempotente; es decir, si se aplica dos veces es lo mismo que no&lt;br /&gt;
-- aplicarla ninguna.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos, José Manuel García, Fernando Martínez Ortega&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_intercambia :: (Int,Int) -&amp;gt; Bool&lt;br /&gt;
prop_intercambia (a,b) = intercambia (intercambia (a,b)) == (a,b)&lt;br /&gt;
-- La comprobación es quickCheck prop_intercambia&lt;br /&gt;
+++ OK, passed 100 tests&lt;br /&gt;
--Lucía Hernández, Laura Arango, Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_intercambia1 :: (Int,Int) -&amp;gt; Bool&lt;br /&gt;
prop_intercambia1 p  = intercambia1 (intercambia1 p) == p &lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_intercambia1&lt;br /&gt;
+++OK, passed 100 tests.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. Definir una función &lt;br /&gt;
--    ciclo :: [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (ciclo xs) es la lista obtenida permutando cíclicamente los&lt;br /&gt;
-- elementos de la lista xs, pasando el último elemento al principio de&lt;br /&gt;
-- la lista. Por ejemplo, &lt;br /&gt;
--    ciclo [2,5,7,9]  == [9,2,5,7]&lt;br /&gt;
--    ciclo []         == []&lt;br /&gt;
--    ciclo [2]        == [2]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
ciclo :: [a] -&amp;gt; [a]&lt;br /&gt;
ciclo xs | length xs == 0   = xs&lt;br /&gt;
         | otherwise        = last xs : init xs  &lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
ciclo1 :: [a] -&amp;gt; [a]&lt;br /&gt;
ciclo1 xs =if length xs == 0 then []&lt;br /&gt;
         else last xs:init xs&lt;br /&gt;
--Laura Arango&lt;br /&gt;
ciclo2 :: [a] -&amp;gt; [a]&lt;br /&gt;
ciclo2 [] = []&lt;br /&gt;
ciclo2 xs = last xs : init xs&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
ciclo3 xs  |length xs == 0 = []&lt;br /&gt;
           |otherwise = last xs:init xs &lt;br /&gt;
-- José Manuel García&lt;br /&gt;
ciclo4 :: [a] -&amp;gt; [a]&lt;br /&gt;
ciclo4 xs = take (length xs) ((drop (length xs - 1) xs) ++ xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Comprobar que la longitud es un invariante de la&lt;br /&gt;
-- función ciclo; es decir, la longitud de (ciclo xs) es la misma que la&lt;br /&gt;
-- de xs.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Elsa Domínguez, Lucía Hernández, Laura Arango, Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_ciclo :: [Int] -&amp;gt; Bool &lt;br /&gt;
prop_ciclo xs = length (ciclo xs) == length xs&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_ciclo&lt;br /&gt;
+++OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir la función &lt;br /&gt;
--    numeroMayor :: (Num a, Ord a) =&amp;gt; a -&amp;gt; a -&amp;gt; a&lt;br /&gt;
-- tal que (numeroMayor x y) es el mayor número de dos cifras que puede&lt;br /&gt;
-- construirse con los dígitos x e y. Por ejemplo,  &lt;br /&gt;
--    numeroMayor 2 5 ==  52&lt;br /&gt;
--    numeroMayor 5 2 ==  52&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Elsa Domínguez, Lucía Hernández, Laura Arango&lt;br /&gt;
numeroMayor :: (Num a, Ord a) =&amp;gt; a -&amp;gt; a -&amp;gt; a&lt;br /&gt;
numeroMayor x y = if x &amp;gt; y then (x*10 + y) else (y*10+x)&lt;br /&gt;
-- Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
numeroMayor1 x y | x&amp;lt;y = (y*10+x)&lt;br /&gt;
                | x&amp;gt;y = (x*10+y)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Definir la función &lt;br /&gt;
--    numeroDeRaices :: (Num t, Ord t) =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Int&lt;br /&gt;
-- tal que (numeroDeRaices a b c) es el número de raíces reales de la&lt;br /&gt;
-- ecuación a*x^2 + b*x + c = 0. Por ejemplo,&lt;br /&gt;
--    numeroDeRaices 2 0 3    ==  0&lt;br /&gt;
--    numeroDeRaices 4 4 1    ==  1&lt;br /&gt;
--    numeroDeRaices 5 23 12  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
numeroDeRaices :: (Num t, Ord t) =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Int&lt;br /&gt;
numeroDeRaices a b c | t &amp;lt; 0 = 0&lt;br /&gt;
                     | t == 0 = 1&lt;br /&gt;
                     | otherwise = 2&lt;br /&gt;
                     where t =  b^2 - 4*a*c&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
numeroDeRaices1 :: (Num t, Ord t) =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Int&lt;br /&gt;
numeroDeRaices1 a b c | b^2-4*a*c &amp;lt; 0   = 0&lt;br /&gt;
                      | b^2-4*a*c == 0  = 1&lt;br /&gt;
                      | otherwise       = 2&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
numeroDeRaices2 :: (Num t, Ord t) =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Int&lt;br /&gt;
numeroDeRaices2 a b c |(b^2-4*a*c) &amp;gt;0 = 2&lt;br /&gt;
                      |(b^2-4*a*c) == 0 = 1&lt;br /&gt;
                      |otherwise = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir la función &lt;br /&gt;
--    raices :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; [Double]&lt;br /&gt;
-- tal que (raices a b c) es la lista de las raíces reales de la&lt;br /&gt;
-- ecuación ax^2 + bx + c = 0. Por ejemplo, &lt;br /&gt;
--    raices 1 3 2    ==  [-1.0,-2.0]&lt;br /&gt;
--    raices 1 (-2) 1 ==  [1.0,1.0]&lt;br /&gt;
--    raices 1 0 1    ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
raices :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; [Double]&lt;br /&gt;
raices a b c | b == 0 = []&lt;br /&gt;
             | otherwise = [(-b+t)/2*a, (-b-t)/2*a]&lt;br /&gt;
             where t =  b^2 - 4*a*c&lt;br /&gt;
-- Elsa Domínguez, Laura Arango&lt;br /&gt;
raices1 :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; [Double]&lt;br /&gt;
raices1 a b c | b^2-4*a*c == 0  = [-b/2*a, -b/2*a]&lt;br /&gt;
              | b^2-4*a*c &amp;lt; 0   = []&lt;br /&gt;
              | b^2-4*a*c &amp;gt; 0   = [(-b+t)/(2*a), (-b-t)/(2*a)]&lt;br /&gt;
              where t = sqrt (b^2-4*a*c)&lt;br /&gt;
--Lucía Hernández, José Manuel García&lt;br /&gt;
raices2 :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; [Double]&lt;br /&gt;
raices2 a b c |(b^2-4*a*c) &amp;gt;0 =  [(-b+sqrt(b^2-4*a*c))/2*a,(-b-sqrt(b^2-4*a*c))/2*a]&lt;br /&gt;
             |(b^2-4*a*c) == 0 = [-b/2*a, -b/2*a]&lt;br /&gt;
             |otherwise = []&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
raices3 a b c | numeroDeRaices a b c == 0 = []&lt;br /&gt;
             | numeroDeRaices a b c == 1 = [-b/(2*a), -b/(2*a)]&lt;br /&gt;
      | otherwise = [(-b+sqrt(b^2-4*a*c))/(2*a), (-b-sqrt(b^2-4*a*c))/(2*a)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir el operador&lt;br /&gt;
--    (~=) :: (Fractional a, Ord a) =&amp;gt; a -&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
-- tal que (x ~= y) se verifica si x e y son casi iguales; es decir si&lt;br /&gt;
-- el valor absoluto de su diferencia es menor que una milésima. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    12.3457 ~= 12.3459  ==  True&lt;br /&gt;
--    12.3457 ~= 12.3479  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
(~=) :: (Fractional a, Ord a) =&amp;gt; a -&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
x ~= y | abs(x-y) &amp;lt;= 0.001 = True&lt;br /&gt;
       | otherwise = False&lt;br /&gt;
--Lucía Hernández, Laura Arango&lt;br /&gt;
(~=) :: (Fractional a, Ord a) =&amp;gt; a -&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
x ~= y = if abs(x - y)&amp;lt;0.001 then True&lt;br /&gt;
         else False&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
(~=) :: (Fractional a, Ord a) =&amp;gt; a -&amp;gt; a -&amp;gt; Bool &lt;br /&gt;
x ~= y = abs (x-y) &amp;lt; 0.001&lt;br /&gt;
-- --------------------------------------------------------------------- &lt;br /&gt;
-- Ejercicio 9. Comprobar con QuickCheck que la suma de las raíces&lt;br /&gt;
-- de la ecuación ax^2 + bx + c = 0 (con a no nulo) es -b/a y su&lt;br /&gt;
-- producto es c/a.&lt;br /&gt;
--&lt;br /&gt;
-- Nota. En la comparación usar ~= en lugar de ==&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es &lt;br /&gt;
prop_raices :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; Property&lt;br /&gt;
prop_raices a b c = (a /= 0) &amp;amp;&amp;amp; not (null (raices a b c)) ==&amp;gt; (sum (raices a b c)) ~= (-b/a) &amp;amp;&amp;amp; (product (raices a b c)) ~= (c/a) &lt;br /&gt;
-- La comprobación es quickCheck prop_raices&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. En geometría, la fórmula de Herón, descubierta por&lt;br /&gt;
-- Herón de Alejandría, dice que el área de un triángulo cuyo lados&lt;br /&gt;
-- miden a, b y c es la raíz cuadrada de s(s-a)(s-b)(s-c) donde s es el&lt;br /&gt;
-- semiperímetro &lt;br /&gt;
--    s = (a+b+c)/2&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    area :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; Double &lt;br /&gt;
-- tal que (area a b c) es el área del triángulo de lados a, b y c. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    area 3 4 5  ==  6.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, Adolfo Sagrera Vivancos, José Manuel García,César Fornis&lt;br /&gt;
area :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; Double &lt;br /&gt;
area a b c = sqrt(s*(s-a)*(s-b)*(s-c))&lt;br /&gt;
     where s = (a+b+c)/2&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Los intervalos cerrados se pueden representar mediante&lt;br /&gt;
-- una lista de dos números (el primero es el extremo inferior del&lt;br /&gt;
-- intervalo y el segundo el superior). &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    interseccion :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (interseccion i1 i2) es la intersección de los intervalos i1 e&lt;br /&gt;
-- i2. Por ejemplo,&lt;br /&gt;
--    interseccion [] [3,5]     ==  []&lt;br /&gt;
--    interseccion [3,5] []     ==  []&lt;br /&gt;
--    interseccion [2,4] [6,9]  ==  []&lt;br /&gt;
--    interseccion [2,6] [6,9]  ==  [6,6]&lt;br /&gt;
--    interseccion [2,6] [0,9]  ==  [2,6]&lt;br /&gt;
--    interseccion [2,6] [0,4]  ==  [2,4]&lt;br /&gt;
--    interseccion [4,6] [0,4]  ==  [4,4]&lt;br /&gt;
--    interseccion [5,6] [0,4]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
interseccion :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccion [] _ = []&lt;br /&gt;
interseccion _ []= []&lt;br /&gt;
interseccion i1 i2  | last i1&amp;lt;head i2 = []&lt;br /&gt;
                    |head i1&amp;gt;last i2 = [] &lt;br /&gt;
                    |otherwise = [maximum [head i1,head i2], minimum [last i1,last i2]]&lt;br /&gt;
--Laura Arango, Elsa Domínguez, César Fornis&lt;br /&gt;
interseccion1 :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccion1 i1 i2 | i1==[] || i2==[] || head i1&amp;gt;last i2 || last i1&amp;lt;head i2 = []&lt;br /&gt;
                    | otherwise = [max (head i1)(head i2), min (last i1)(last i2)]&lt;br /&gt;
--José Manuel García, Fernando Martínez Ortega&lt;br /&gt;
interseccion2 :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccion2 i1 i2 | null i1 || null i2 || a &amp;gt; d || b &amp;lt; c = []&lt;br /&gt;
                   | a &amp;lt;= c &amp;amp;&amp;amp; b &amp;lt;= d = [c,b]&lt;br /&gt;
                   | a &amp;gt;= c &amp;amp;&amp;amp; b &amp;lt;= d = [a,b]&lt;br /&gt;
                   | a &amp;gt;= c &amp;amp;&amp;amp; b &amp;gt;= d = [a,d]&lt;br /&gt;
                   | a &amp;lt;= c &amp;amp;&amp;amp; b &amp;gt;= d = [c,d]   &lt;br /&gt;
             where a = head i1&lt;br /&gt;
                   b = last i1&lt;br /&gt;
                   c = head i2&lt;br /&gt;
                   d = last i2&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Comprobar con QuickCheck que la intersección de&lt;br /&gt;
-- intervalos es conmutativa.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_interseccion :: Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_interseccion a1 a2 b1 b2 = interseccion [a1,a2] [b1,b2] == interseccion [b1,b2] [a1,a2]  &lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_interseccion&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.1. Los números racionales pueden representarse mediante&lt;br /&gt;
-- pares de números enteros. Por ejemplo, el número 2/5 puede&lt;br /&gt;
-- representarse mediante el par (2,5). &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    formaReducida :: (Int,Int) -&amp;gt; (Int,Int) &lt;br /&gt;
-- tal que (formaReducida x) es la forma reducida del número racional&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    formaReducida (4,10)  ==  (2,5)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García&lt;br /&gt;
formaReducida :: (Int,Int) -&amp;gt; (Int,Int) &lt;br /&gt;
formaReducida (a,b) = (div a z, div b z)&lt;br /&gt;
                  where z = gcd a b&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.2. Definir la función &lt;br /&gt;
--    sumaRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que (sumaRacional x y) es la suma de los números racionales x e&lt;br /&gt;
-- y, expresada en forma reducida. Por ejemplo, &lt;br /&gt;
--    sumaRacional (2,3) (5,6)  ==  (3,2)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
sumaRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
sumaRacional (a,b) (c,d) = if b&amp;lt;d then formaReducida((div s b)*a + c, s)&lt;br /&gt;
                           else formaReducida(a+ (div s d)*c, s)&lt;br /&gt;
                   where s = lcm b d&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
sumaRacional1 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
sumaRacional1 (a,b) (c,d) = formaReducida (a*d + c*b, b*d)&lt;br /&gt;
--Pelayo Infante &lt;br /&gt;
sumaRacional2 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
sumaRacional2 (a,b) (c,d) = formaReducida ((x), (lcm b d))&lt;br /&gt;
                                         where x= y+ ((div (lcm b d) d)*c)&lt;br /&gt;
                                                where y=  (div(lcm b d) b)*a&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Definir la función &lt;br /&gt;
--    productoRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que (productoRacional x y) es el producto de los números&lt;br /&gt;
-- racionales x e y. Por ejemplo, &lt;br /&gt;
--    productoRacional (2,3) (5,6)  ==  (5,9)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
productoRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
productoRacional (a,b) (c,d) = formaReducida (x,t)&lt;br /&gt;
                             where x = a*c&lt;br /&gt;
                                   t = b*d&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García&lt;br /&gt;
productoRacional1 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
productoRacional1 (a,b) (c,d) = formaReducida (a*c, b*d)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. Definir la función&lt;br /&gt;
--    cocienteRacional ::  (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que &amp;#039;(cocienteRacional x y)&amp;#039; es el cociente de los números racionales&lt;br /&gt;
-- &amp;#039;x&amp;#039; e &amp;#039;y&amp;#039;. Por ejemplo,&lt;br /&gt;
--    cocienteRacional (2,3) (5,6)  ==  (4,5)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García&lt;br /&gt;
cocienteRacional ::  (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
cocienteRacional (x1,x2) (y1,y2) = formaReducida (x1*y2, x2*y1)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. Definir la función &lt;br /&gt;
--    igualdadRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualdadRacional x y) se verifica si los números racionales&lt;br /&gt;
-- x e y son iguales. Por ejemplo, &lt;br /&gt;
--    igualdadRacional (6,9) (10,15)  ==  True&lt;br /&gt;
--    igualdadRacional (6,9) (11,15)  ==  False&lt;br /&gt;
--    igualdadRacional (0,2) (0,-5)   ==  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández&lt;br /&gt;
igualdadRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; Bool&lt;br /&gt;
igualdadRacional (a,b) (c,d) = formaReducida (a,b) == formaReducida (c,d)&lt;br /&gt;
-- Laura Arango&lt;br /&gt;
igualdadRacional1 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; Bool&lt;br /&gt;
igualdadRacional1 (a,b) (c,d) = formaReducida (a,b) == formaReducida (c,d)&lt;br /&gt;
                               || (a==0 &amp;amp;&amp;amp; c==0)&lt;br /&gt;
                               || (b==0 &amp;amp;&amp;amp; d==0)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
igualdadRacional2 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; Bool&lt;br /&gt;
igualdadRacional2 (a,b) (c,d) | a == 0 &amp;amp;&amp;amp; c == 0  = True&lt;br /&gt;
                              | b == 0 &amp;amp;&amp;amp; d == 0  = True&lt;br /&gt;
                              | otherwise         = formaReducida (a,b) == formaReducida (c,d)&lt;br /&gt;
-- José Manuel García&lt;br /&gt;
igualdadRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; Bool&lt;br /&gt;
igualdadRacional3 (a,b) (c,d) = if (a == 0 &amp;amp;&amp;amp; c == 0) || (b == 0 &amp;amp;&amp;amp; d == 0)&lt;br /&gt;
                                then True&lt;br /&gt;
                                else formaReducida (a,b) == formaReducida (c,d)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck la propiedad distributiva&lt;br /&gt;
-- del producto racional respecto de la suma.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_distributiva :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; Property&lt;br /&gt;
prop_distributiva x y z = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. Los números complejos se pueden representar mediante pares de &lt;br /&gt;
-- números reales. Por ejemplo, el número 2+5i se puede representar mediante &lt;br /&gt;
-- el par (2,5).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lo siguiente significa que el tipo Complejo es lo mismo que decir (Double,Double)&lt;br /&gt;
type Complejo = (Double,Double)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14.1. Definir la función&lt;br /&gt;
--    sumaComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
-- tal que &amp;#039;(sumaComplejos x y)&amp;#039; es la suma de los números complejos &amp;#039;x&amp;#039; e &amp;#039;y&amp;#039;.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    sumaComplejos (2,3) (5,6)  ==  (7.0,9.0)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García&lt;br /&gt;
sumaComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
sumaComplejos (x1,x2) (y1,y2) = (x1+y1, x2+y2)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14.2. Definir la función&lt;br /&gt;
--    productoComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
-- tal que &amp;#039;(productoComplejos x y)&amp;#039; es el producto de los números complejos&lt;br /&gt;
-- &amp;#039;x&amp;#039; e &amp;#039;y&amp;#039;. Por ejemplo,&lt;br /&gt;
--    productoComplejos (2,3) (5,6)  ==  (-8.0,27.0)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García&lt;br /&gt;
productoComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
productoComplejos (x1,x2) (y1,y2) = ((x1*y1 - x2*y2),(x2*y1 + x1*y2))&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14.3. Definir la función&lt;br /&gt;
--    cocienteComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
-- tal que &amp;#039;(cocienteComplejos x y)&amp;#039; es el cociente de los números complejos&lt;br /&gt;
-- &amp;#039;x&amp;#039; e &amp;#039;y&amp;#039;. Por ejemplo,&lt;br /&gt;
--    cocienteComplejos (3,2) (1,-2)  ==  (-0.2,1.6)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Laura Arango&lt;br /&gt;
cocienteComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
cocienteComplejos (x1,x2) (y1,y2) = (((x1*y1 + x2*y2)/ t), ((x2*y1 - x1*y2)/t))&lt;br /&gt;
                  where t = (y1^2 + y2^2)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
cocienteComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
cocienteComplejos (x1,x2) (y1,y2) = (a,b)&lt;br /&gt;
                   where a = fst (productoComplejos (x1,x2) (y1,-y2))/(y1^2 + y2^2)&lt;br /&gt;
                         b = snd (productoComplejos (x1,x2) (y1,-y2))/(y1^2 + y2^2)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14.4. Definir la función&lt;br /&gt;
--    conjugado :: Complejo -&amp;gt; Complejo&lt;br /&gt;
-- tal que &amp;#039;(conjugado x)&amp;#039; es el conjugado del número complejo &amp;#039;x&amp;#039;. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    conjugado (2,3)  ==  (2.0,-3.0)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez&lt;br /&gt;
conjugado :: Complejo -&amp;gt; Complejo&lt;br /&gt;
conjugado (x1,x2) = (x1, -x2)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15. Los rectángulos pueden representarse por sus dimensiones, base&lt;br /&gt;
-- y altura, como un par de números enteros. Por ejemplo, (5,3) representa un&lt;br /&gt;
-- rectángulo de base 5 y altura 3.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    mayorRectangulo :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que &amp;#039;(mayorRectangulo r1 r2)&amp;#039; es el rectángulo de mayor área entre &amp;#039;r1&amp;#039;&lt;br /&gt;
-- y &amp;#039;r2&amp;#039;. Por ejemplo,&lt;br /&gt;
--    mayorRectangulo (4,6) (3,7)  ==  (4,6)&lt;br /&gt;
--    mayorRectangulo (4,6) (3,8)  ==  (4,6)&lt;br /&gt;
--    mayorRectangulo (4,6) (3,9)  ==  (3,9)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
mayorRectangulo :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
mayorRectangulo (x1,y1) (x2,y2) = if t &amp;gt;= p then (x1,y1) else (x2,y2)&lt;br /&gt;
                where t = x1*y1&lt;br /&gt;
                      p = x2*y2&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Elsa Domínguez&lt;br /&gt;
mayorRectangulo1 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
mayorRectangulo1 (x1,y1) (x2,y2) = if x1*y1 &amp;gt;= x2*y2 then (x1,y1)&lt;br /&gt;
                                  else (x2,y2)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16. Definir la función&lt;br /&gt;
--    cuadrante :: (Int,Int) -&amp;gt; Int&lt;br /&gt;
-- tal que &amp;#039;(cuadrante p)&amp;#039; es el cuadrante en el que se encuentra el punto &amp;#039;p&amp;#039;.&lt;br /&gt;
-- Si el punto está sobre los ejes el resultado debe ser 0. Por ejemplo,&lt;br /&gt;
--    cuadrante (0,4)    ==  0&lt;br /&gt;
--    cuadrante (-3,0)   ==  0&lt;br /&gt;
--    cuadrante (0,0)    ==  0&lt;br /&gt;
--    cuadrante (3,5)    ==  1&lt;br /&gt;
--    cuadrante (-3,5)   ==  2&lt;br /&gt;
--    cuadrante (-3,-5)  ==  3&lt;br /&gt;
--    cuadrante (3,-5)   ==  4&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
cuadrante :: (Int,Int) -&amp;gt; Int&lt;br /&gt;
cuadrante (x1,x2) | or [x1 == 0, x2 == 0] = 0&lt;br /&gt;
                  | and [x1 &amp;gt; 0, x2 &amp;gt; 0] = 1&lt;br /&gt;
                  | and [x1 &amp;lt; 0, x2 &amp;gt; 0] = 2&lt;br /&gt;
                  | and [x1 &amp;lt; 0, x2 &amp;lt; 0] = 3&lt;br /&gt;
                  | otherwise = 4&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
cuadrante1 :: (Int,Int) -&amp;gt; Int&lt;br /&gt;
cuadrante1 (0,_) = 0&lt;br /&gt;
cuadrante1 (_,0) = 0&lt;br /&gt;
cuadrante1 (x1,x2) | x1&amp;gt;0 &amp;amp;&amp;amp; x2&amp;gt;0 = 1&lt;br /&gt;
                  | x1&amp;lt;0 &amp;amp;&amp;amp; x2&amp;gt;0 = 2&lt;br /&gt;
                  | x1&amp;lt;0 &amp;amp;&amp;amp; x2&amp;lt;0 = 3&lt;br /&gt;
                  | otherwise = 4&lt;br /&gt;
--Laura Arango, Elsa Domínguez&lt;br /&gt;
cuadrante2 :: (Int,Int) -&amp;gt; Int&lt;br /&gt;
cuadrante2 (x1,x2) | x1&amp;gt;0 &amp;amp;&amp;amp; x2&amp;gt;0 = 1&lt;br /&gt;
                   | x1&amp;lt;0 &amp;amp;&amp;amp; x2&amp;gt;0 = 2&lt;br /&gt;
                   | x1&amp;lt;0 &amp;amp;&amp;amp; x2&amp;lt;0 = 3&lt;br /&gt;
                   | x1&amp;gt;0 &amp;amp;&amp;amp; x2&amp;lt;0 = 4&lt;br /&gt;
                   | otherwise    = 0&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 17. Definir la función&lt;br /&gt;
--    simetricoH :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que &amp;#039;(simetricoH p)&amp;#039; es el punto simétrico de &amp;#039;p&amp;#039; respecto del eje&lt;br /&gt;
-- horizontal. Por ejemplo,&lt;br /&gt;
--    simetricoH (2,5)   ==  (2,-5)&lt;br /&gt;
--    simetricoH (2,-5)  ==  (2,5)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango&lt;br /&gt;
simetricoH :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoH (x1,x2) = (x1,-x2)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
simetricoH1 :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoH1 p = (fst p,-snd p)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 18. Definir la función&lt;br /&gt;
--    simetricoV :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que &amp;#039;(simetricoV p)&amp;#039; es el punto simétrico de &amp;#039;p&amp;#039; respecto del eje&lt;br /&gt;
-- vertical. Por ejemplo,&lt;br /&gt;
--    simetricoV (2,5)   ==  (-2,5)&lt;br /&gt;
--    simetricoV (2,-5)  ==  (-2,-5)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango&lt;br /&gt;
simetricoV :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoV (x1,x2) = (-x1,x2)&lt;br /&gt;
- Elsa Domínguez&lt;br /&gt;
simetricoV1 :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoV1 p = (-fst p,snd p)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19. Definir la función&lt;br /&gt;
--    distancia :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; Float&lt;br /&gt;
-- tal que &amp;#039;(distancia p1 p2)&amp;#039; es la distancia entre los puntos &amp;#039;p1&amp;#039; y &amp;#039;p2&amp;#039;.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    distancia (1,2) (4,6)  ==  5.0&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez&lt;br /&gt;
distancia :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; Float&lt;br /&gt;
distancia (x1,x2) (y1,y2) = sqrt((x1-y1)^2 + (x2-y2)^2)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20. Comprobar con QuickCheck que se verifica la propiedad&lt;br /&gt;
-- triangular de la distancia; es decir, dados tres puntos p1, p2 y p3, la&lt;br /&gt;
-- distancia de p1 a p3 es menor o igual que la suma de las distancias de p1 a&lt;br /&gt;
-- p2 y de p2 a p3.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_triangular :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; Bool&lt;br /&gt;
prop_triangular p1 p2 p3 = distancia p1 p3 &amp;lt;= distancia p1 p2 + distancia p2 p3&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    &amp;gt; quickCheck prop_triangular&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 21. Definir la función&lt;br /&gt;
--    puntoMedio :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; (Float,Float)&lt;br /&gt;
-- tal que &amp;#039;(puntoMedio p1 p2)&amp;#039; es el punto medio entre los puntos &amp;#039;p1&amp;#039; y &amp;#039;p2&amp;#039;.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    puntoMedio (0,2) (0,6)   ==  (0.0,4.0)&lt;br /&gt;
--    puntoMedio (-1,2) (7,6)  ==  (3.0,4.0)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez&lt;br /&gt;
puntoMedio :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; (Float,Float)&lt;br /&gt;
puntoMedio (x1,x2) (y1,y2) = ((x1+y1)/2, (x2+y2)/2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Repaso de operaciones lógicas                                      --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa. Su tabla de verdad&lt;br /&gt;
-- es&lt;br /&gt;
--    x     | y     | xor x y&lt;br /&gt;
--    ------+-------+---------&lt;br /&gt;
--    True  | True  | False &lt;br /&gt;
--    True  | False | True&lt;br /&gt;
--    False | True  | True&lt;br /&gt;
--    False | False | False&lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    xor1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor1 x y) es la disyunción excluyente de x e y, calculada a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
xor1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor1 True True  = False&lt;br /&gt;
xor1 True False = True&lt;br /&gt;
xor1 False True = True&lt;br /&gt;
xor1 False False = False&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.2. Definir la función &lt;br /&gt;
--    xor2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor2 x y) es la disyunción excluyente de x e y, calculada a&lt;br /&gt;
-- partir de la tabla de verdad y patrones. Usar 2 ecuaciones, una por&lt;br /&gt;
-- cada valor del primer argumento. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
xor2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor2 x y  | y/= x =  True&lt;br /&gt;
          | y == x = False&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.3. Definir la función &lt;br /&gt;
--    xor3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor3 x y) es la disyunción excluyente de x e y, calculada &lt;br /&gt;
-- a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación (not). &lt;br /&gt;
-- Usar 1 ecuación. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
xor3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor3 x y =  (x &amp;amp;&amp;amp; not y) || (y &amp;amp;&amp;amp; not x)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.4. Definir la función &lt;br /&gt;
--    xor4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor3 x y) es la disyunción excluyente de x e y, calculada&lt;br /&gt;
-- a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
xor4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor4 x y = if x == y then False else True&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
xor4&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor4&amp;#039; x y = if x/=y then True else False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.5. Comprobar con QuickCheck que las cuatro definiciones&lt;br /&gt;
-- de xor son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_xor_equivalentes :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
prop_xor_equivalentes x y = xor1 x y == xor2 x y &amp;amp;&amp;amp; xor2 x y == xor3 x y &amp;amp;&amp;amp; xor3 x y == xor4 x y&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_xor_equivalentes&lt;br /&gt;
+++ OK, passed 100 tests&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 23.1 Definir la función &lt;br /&gt;
--    or3 :: Bool -&amp;gt; Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (or3 a b c) es la disyunción entre a, b y c; es decir,&lt;br /&gt;
-- ocurre a o b o c. Definir la función usando &amp;#039;||&amp;#039;. Por ejemplo,&lt;br /&gt;
--    or3 True True False  ==  True&lt;br /&gt;
--    or3 False False False ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández&lt;br /&gt;
or3 :: Bool -&amp;gt; Bool -&amp;gt; Bool-&amp;gt; Bool &lt;br /&gt;
or3 a b c  = a || b || c&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 23.2 Definir la función &lt;br /&gt;
--    or3&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (or3&amp;#039; a b c) es la disyunción entre a, b y c; es decir,&lt;br /&gt;
-- ocurre a o b o c. Definir la función usando &amp;#039;or&amp;#039; para listas.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    or3&amp;#039; True True False  ==  True&lt;br /&gt;
--    or3&amp;#039; False False False ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández&lt;br /&gt;
or3&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
or3&amp;#039; a b c = or [a,b,c]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 24.1 Definir la función &lt;br /&gt;
--    and3 :: Bool -&amp;gt; Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (and3 a b c) es la conjunción entre a, b y c; es decir,&lt;br /&gt;
-- ocurre a y b y c. Definir la función usando &amp;#039;&amp;amp;&amp;amp;&amp;#039;. Por ejemplo,&lt;br /&gt;
--    and3 True True True  ==  True&lt;br /&gt;
--    and3 False True False ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández&lt;br /&gt;
and3 :: Bool -&amp;gt; Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
and3 a b c = a &amp;amp;&amp;amp; b &amp;amp;&amp;amp; c&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 24.2 Definir la función &lt;br /&gt;
--    and3&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
-- tal que (and3&amp;#039; a b c) es la conjunción entre a, b y c; es decir,&lt;br /&gt;
-- ocurre a o b o c. Definir la función usando &amp;#039;and&amp;#039; para listas.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    and3&amp;#039; True True True  ==  True&lt;br /&gt;
--    and3&amp;#039; False True False ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández&lt;br /&gt;
and3&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
and3&amp;#039; a b c = and[a,b,c]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 25.1. Definir la función &lt;br /&gt;
--    siglo20 :: Int -&amp;gt; Bool &lt;br /&gt;
-- tal que (siglo20 x) indica si el ańo x perteneció al siglo 20; es decir,&lt;br /&gt;
-- si está comprendido entre el ańo 1901 y 2000.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    siglo20 1902  == True&lt;br /&gt;
--    siglo20 2001 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández&lt;br /&gt;
siglo20 :: Int -&amp;gt; Bool&lt;br /&gt;
siglo20 x = if  1901 &amp;lt;= x &amp;amp;&amp;amp; x &amp;lt; 2000 then True&lt;br /&gt;
            else False&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
siglo201 :: Int -&amp;gt; Bool&lt;br /&gt;
siglo201 x = 1901 &amp;lt;= x &amp;amp;&amp;amp; x &amp;lt;= 2000&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 25.2. Definir la función &lt;br /&gt;
--    noSiglo20 :: Int -&amp;gt; Bool &lt;br /&gt;
-- tal que (noSiglo20 x) indica si el ańo x no perteneció al siglo 20; es decir,&lt;br /&gt;
-- si no está comprendido entre el ańo 1901 y 2000.&lt;br /&gt;
-- Definirla de tres formas distintas, una usando la función (siglo20 x), otra&lt;br /&gt;
-- usando &amp;#039;&amp;amp;&amp;amp;&amp;#039; y otra usando &amp;#039;||&amp;#039;.&lt;br /&gt;
--&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    noSiglo20 1902  == False&lt;br /&gt;
--    noSiglo20 2001 == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
noSiglo20 :: Int -&amp;gt; Bool&lt;br /&gt;
noSiglo20 x = not (siglo20 x)&lt;br /&gt;
noSiglo20&amp;#039; = undefined  &lt;br /&gt;
noSiglo20&amp;#039;&amp;#039; x = x &amp;lt; 1901 || x &amp;gt;= 2000&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
noSiglo20 :: Int -&amp;gt; Bool&lt;br /&gt;
noSiglo20 x = not(siglo20 x)&lt;br /&gt;
noSiglo20&amp;#039; x = if x &amp;lt;= 2000 &amp;amp;&amp;amp; x &amp;gt; 1901 then False&lt;br /&gt;
             else True&lt;br /&gt;
noSiglo20&amp;#039;&amp;#039; x  = x=&amp;gt;2000 || x&amp;lt; 1901&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
noSiglo20 :: Int -&amp;gt; Bool&lt;br /&gt;
noSiglo20 x = siglo20 x == False&lt;br /&gt;
noSiglo20&amp;#039; x = not (x &amp;gt;= 1901 &amp;amp;&amp;amp; x &amp;lt;= 2000) &lt;br /&gt;
noSiglo20&amp;#039;&amp;#039; x = x &amp;lt; 1901 || x &amp;gt; 2000  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 26. Definir la función &lt;br /&gt;
--    xnor :: Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
-- tal que (xnor a b) se calcula con su tabla de verdad, que&lt;br /&gt;
-- es&lt;br /&gt;
--    x     | y     | xnor x y&lt;br /&gt;
--    ------+-------+---------&lt;br /&gt;
--    False | False | True &lt;br /&gt;
--    False | True  | False&lt;br /&gt;
--    True  | False | False&lt;br /&gt;
--    True  | True  | True&lt;br /&gt;
--&lt;br /&gt;
-- Emplear solo operadores lógicos (&amp;amp;&amp;amp;, ||, not).&lt;br /&gt;
-- &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    xnor True True  ==  True&lt;br /&gt;
--    xnor False True ==  False&lt;br /&gt;
--    xnor False False  ==  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
&lt;br /&gt;
xnor :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xnor x y =  (not x &amp;amp;&amp;amp; not y) || (x &amp;amp;&amp;amp;  y)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 27. Definir la función &lt;br /&gt;
--    aprueba :: Float -&amp;gt; Float -&amp;gt; Float -&amp;gt; Bool&lt;br /&gt;
-- tal que (aprueba n1 n2 n3) indica si con las notas de los&lt;br /&gt;
-- exámenes parciales n1, n2 y n3 se consigue aprobar la&lt;br /&gt;
-- asignatura. Los criterios para aprobar la asignatura son los siguientes:&lt;br /&gt;
--   * La media de las notas debe ser mayor o igual que 5, y&lt;br /&gt;
--   * Cada una de las notas de los exámenes parciales son mayor o igual&lt;br /&gt;
--     que 4.0,&lt;br /&gt;
--   * O en el último exámen se obtuvo un 10 (entonces siempre se aprueba)&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    aprueba 5.0 6.0 5.0 == True&lt;br /&gt;
--    aprueba 1.5 6.0 8.0 == False&lt;br /&gt;
--    aprueba 3.7 1.5 10.0 == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
aprueba :: Float -&amp;gt; Float -&amp;gt; Float -&amp;gt; Bool&lt;br /&gt;
aprueba x y z | z == 10 = True&lt;br /&gt;
              | (x+y+z)/3 &amp;gt;= 5 &amp;amp;&amp;amp; and [x&amp;gt;4, y&amp;gt;4, z&amp;gt;4] = True&lt;br /&gt;
              | otherwise = False&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
aprueba :: Float -&amp;gt; Float -&amp;gt; Float -&amp;gt; Bool&lt;br /&gt;
aprueba n1 n2 n3 = (n1+n2+n3)/3 &amp;gt;= 5 &amp;amp;&amp;amp;( n1&amp;gt;=4 &amp;amp;&amp;amp; n2&amp;gt;=4 &amp;amp;&amp;amp; n3&amp;gt;=4) || n3 == 10 &lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
aprueba2 :: Float -&amp;gt; Float -&amp;gt; Float -&amp;gt; Bool&lt;br /&gt;
aprueba2 n1 n2 n3 | and [n1 &amp;gt; 4, n2 &amp;gt; 4, n3 &amp;gt; 4] = (n1+n2+n3)/3 &amp;gt;= 5&lt;br /&gt;
                  | n3 == 10.0                   = True&lt;br /&gt;
                  | otherwise                    = False &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 28. Comprobar las leyes de Morgan con QuickCheck. Las&lt;br /&gt;
-- leyes de Morgan se definen como sigue:&lt;br /&gt;
--   * ley 1: no (A o B) == (no A) y (no B)&lt;br /&gt;
--   * ley 2: no (A y B) == (no A) o (no B)&lt;br /&gt;
-- Consejo: definir cada ley como una función por separado para componer&lt;br /&gt;
-- la propiedad&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
ley1:: Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
ley1 a b = not (a || b) == (not a) &amp;amp;&amp;amp; (not b)&lt;br /&gt;
&lt;br /&gt;
ley2:: Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
ley2 a b =  not (a &amp;amp;&amp;amp; b) == (not a) || (not b)&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_leyes_morgan :: Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
prop_leyes_morgan a b = ley1 a b == ley2 a b&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
&lt;br /&gt;
ley1:: Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
ley1 a b = not(a || b) ==( not a &amp;amp;&amp;amp; not b)&lt;br /&gt;
&lt;br /&gt;
ley2:: Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
ley2 a b = not (a&amp;amp;&amp;amp;b) == ( not a  || not b )&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_leyes_morgan :: Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
prop_leyes_morgan a b= ley1 a b &amp;amp;&amp;amp; ley2 a b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fermarort2</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=232</id>
		<title>Relación 2</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=232"/>
		<updated>2021-10-15T06:54:38Z</updated>

		<summary type="html">&lt;p&gt;Fermarort2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Rel_2.hs (08 de octubre de 2021)&lt;br /&gt;
-- Definiciones con condicionales, guardas o patrones.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presentan ejercicios con definiciones elementales&lt;br /&gt;
-- (no recursivas) de funciones que usan condicionales, guardas o&lt;br /&gt;
-- patrones. &lt;br /&gt;
--&lt;br /&gt;
-- De forma adicional, se adjuntan ejercicios de repaso para trabajar con&lt;br /&gt;
-- operaciones lógicas sobre valores de verdad (o booleanos), sobre todo&lt;br /&gt;
-- con &amp;amp;&amp;amp;, || y not. &lt;br /&gt;
-- &lt;br /&gt;
-- Estos ejercicios se corresponden con el tema 4 cuyas transparencias&lt;br /&gt;
-- se encuentran en  &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-4.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Esta librería se puede instalar de la siguiente forma:&lt;br /&gt;
-- 1. Abrir cmd (Windows) o Terminal (MacOS y Linux)&lt;br /&gt;
-- 2. Escribir: cabal update&lt;br /&gt;
-- 3. Escribir: cabal install QuickCheck&lt;br /&gt;
&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función &lt;br /&gt;
--    divisionSegura :: Double -&amp;gt; Double -&amp;gt; Double&lt;br /&gt;
-- tal que (divisionSegura x y) es x/y si y no es cero y 9999 en caso&lt;br /&gt;
-- contrario. Por ejemplo,&lt;br /&gt;
--    divisionSegura 7 2  ==  3.5&lt;br /&gt;
--    divisionSegura 7 0  ==  9999.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, José Manuel García, Fernando Martínez Ortega&lt;br /&gt;
divisionSegura :: Double -&amp;gt; Double -&amp;gt; Double&lt;br /&gt;
divisionSegura  x y = if y == 0 then 9999 &lt;br /&gt;
                      else x/y&lt;br /&gt;
-- Laura Arango&lt;br /&gt;
divisionSegura1 :: Double -&amp;gt; Double -&amp;gt; Double&lt;br /&gt;
divisionSegura1 x y | y == 0 = 999&lt;br /&gt;
                    | otherwise = x/y&lt;br /&gt;
-- Alereyvil&lt;br /&gt;
divisionSegura x y | y/=0 = x/y&lt;br /&gt;
                   | y==0 = 9999.0&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función &lt;br /&gt;
--    intercambia :: (a,b) -&amp;gt; (b,a)&lt;br /&gt;
-- tal que (intercambia p)  es el punto obtenido intercambiando las&lt;br /&gt;
-- coordenadas del punto p. Por ejemplo, &lt;br /&gt;
--    intercambia (2,5)  ==  (5,2)&lt;br /&gt;
--    intercambia (5,2)  ==  (2,5)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
intercambia :: (a,b) -&amp;gt; (b,a)&lt;br /&gt;
intercambia (a,b) = (b,a)&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Elsa Domínguez&lt;br /&gt;
intercambia1 :: (a,b) -&amp;gt; (b,a)&lt;br /&gt;
intercambia1 p = (snd p, fst p)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Comprobar con QuickCheck que la función intercambia es&lt;br /&gt;
-- idempotente; es decir, si se aplica dos veces es lo mismo que no&lt;br /&gt;
-- aplicarla ninguna.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_intercambia :: (Int,Int) -&amp;gt; Bool&lt;br /&gt;
prop_intercambia (a,b) = intercambia (intercambia (a,b)) == (a,b)&lt;br /&gt;
-- La comprobación es quickCheck prop_intercambia&lt;br /&gt;
+++ OK, passed 100 tests&lt;br /&gt;
--Lucía Hernández, Laura Arango, Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_intercambia1 :: (Int,Int) -&amp;gt; Bool&lt;br /&gt;
prop_intercambia1 p  = intercambia1 (intercambia1 p) == p &lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_intercambia1&lt;br /&gt;
+++OK, passed 100 tests.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. Definir una función &lt;br /&gt;
--    ciclo :: [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (ciclo xs) es la lista obtenida permutando cíclicamente los&lt;br /&gt;
-- elementos de la lista xs, pasando el último elemento al principio de&lt;br /&gt;
-- la lista. Por ejemplo, &lt;br /&gt;
--    ciclo [2,5,7,9]  == [9,2,5,7]&lt;br /&gt;
--    ciclo []         == []&lt;br /&gt;
--    ciclo [2]        == [2]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
ciclo :: [a] -&amp;gt; [a]&lt;br /&gt;
ciclo xs | length xs == 0   = xs&lt;br /&gt;
         | otherwise        = last xs : init xs  &lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
ciclo1 :: [a] -&amp;gt; [a]&lt;br /&gt;
ciclo1 xs =if length xs == 0 then []&lt;br /&gt;
         else last xs:init xs&lt;br /&gt;
--Laura Arango&lt;br /&gt;
ciclo2 :: [a] -&amp;gt; [a]&lt;br /&gt;
ciclo2 [] = []&lt;br /&gt;
ciclo2 xs = last xs : init xs&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
ciclo3 xs  |length xs == 0 = []&lt;br /&gt;
           |otherwise = last xs:init xs &lt;br /&gt;
-- José Manuel García&lt;br /&gt;
ciclo4 :: [a] -&amp;gt; [a]&lt;br /&gt;
ciclo4 xs = take (length xs) ((drop (length xs - 1) xs) ++ xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Comprobar que la longitud es un invariante de la&lt;br /&gt;
-- función ciclo; es decir, la longitud de (ciclo xs) es la misma que la&lt;br /&gt;
-- de xs.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Elsa Domínguez, Lucía Hernández, Laura Arango, Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_ciclo :: [Int] -&amp;gt; Bool &lt;br /&gt;
prop_ciclo xs = length (ciclo xs) == length xs&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_ciclo&lt;br /&gt;
+++OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir la función &lt;br /&gt;
--    numeroMayor :: (Num a, Ord a) =&amp;gt; a -&amp;gt; a -&amp;gt; a&lt;br /&gt;
-- tal que (numeroMayor x y) es el mayor número de dos cifras que puede&lt;br /&gt;
-- construirse con los dígitos x e y. Por ejemplo,  &lt;br /&gt;
--    numeroMayor 2 5 ==  52&lt;br /&gt;
--    numeroMayor 5 2 ==  52&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Elsa Domínguez, Lucía Hernández, Laura Arango&lt;br /&gt;
numeroMayor :: (Num a, Ord a) =&amp;gt; a -&amp;gt; a -&amp;gt; a&lt;br /&gt;
numeroMayor x y = if x &amp;gt; y then (x*10 + y) else (y*10+x)&lt;br /&gt;
-- Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
numeroMayor1 x y | x&amp;lt;y = (y*10+x)&lt;br /&gt;
                | x&amp;gt;y = (x*10+y)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Definir la función &lt;br /&gt;
--    numeroDeRaices :: (Num t, Ord t) =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Int&lt;br /&gt;
-- tal que (numeroDeRaices a b c) es el número de raíces reales de la&lt;br /&gt;
-- ecuación a*x^2 + b*x + c = 0. Por ejemplo,&lt;br /&gt;
--    numeroDeRaices 2 0 3    ==  0&lt;br /&gt;
--    numeroDeRaices 4 4 1    ==  1&lt;br /&gt;
--    numeroDeRaices 5 23 12  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
numeroDeRaices :: (Num t, Ord t) =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Int&lt;br /&gt;
numeroDeRaices a b c | t &amp;lt; 0 = 0&lt;br /&gt;
                     | t == 0 = 1&lt;br /&gt;
                     | otherwise = 2&lt;br /&gt;
                     where t =  b^2 - 4*a*c&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
numeroDeRaices1 :: (Num t, Ord t) =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Int&lt;br /&gt;
numeroDeRaices1 a b c | b^2-4*a*c &amp;lt; 0   = 0&lt;br /&gt;
                      | b^2-4*a*c == 0  = 1&lt;br /&gt;
                      | otherwise       = 2&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
numeroDeRaices2 :: (Num t, Ord t) =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Int&lt;br /&gt;
numeroDeRaices2 a b c |(b^2-4*a*c) &amp;gt;0 = 2&lt;br /&gt;
                      |(b^2-4*a*c) == 0 = 1&lt;br /&gt;
                      |otherwise = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir la función &lt;br /&gt;
--    raices :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; [Double]&lt;br /&gt;
-- tal que (raices a b c) es la lista de las raíces reales de la&lt;br /&gt;
-- ecuación ax^2 + bx + c = 0. Por ejemplo, &lt;br /&gt;
--    raices 1 3 2    ==  [-1.0,-2.0]&lt;br /&gt;
--    raices 1 (-2) 1 ==  [1.0,1.0]&lt;br /&gt;
--    raices 1 0 1    ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
raices :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; [Double]&lt;br /&gt;
raices a b c | b == 0 = []&lt;br /&gt;
             | otherwise = [(-b+t)/2*a, (-b-t)/2*a]&lt;br /&gt;
             where t =  b^2 - 4*a*c&lt;br /&gt;
-- Elsa Domínguez, Laura Arango&lt;br /&gt;
raices1 :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; [Double]&lt;br /&gt;
raices1 a b c | b^2-4*a*c == 0  = [-b/2*a, -b/2*a]&lt;br /&gt;
              | b^2-4*a*c &amp;lt; 0   = []&lt;br /&gt;
              | b^2-4*a*c &amp;gt; 0   = [(-b+t)/(2*a), (-b-t)/(2*a)]&lt;br /&gt;
              where t = sqrt (b^2-4*a*c)&lt;br /&gt;
--Lucía Hernández, José Manuel García&lt;br /&gt;
raices2 :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; [Double]&lt;br /&gt;
raices2 a b c |(b^2-4*a*c) &amp;gt;0 =  [(-b+sqrt(b^2-4*a*c))/2*a,(-b-sqrt(b^2-4*a*c))/2*a]&lt;br /&gt;
             |(b^2-4*a*c) == 0 = [-b/2*a, -b/2*a]&lt;br /&gt;
             |otherwise = []&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
raices3 a b c | numeroDeRaices a b c == 0 = []&lt;br /&gt;
             | numeroDeRaices a b c == 1 = [-b/(2*a), -b/(2*a)]&lt;br /&gt;
      | otherwise = [(-b+sqrt(b^2-4*a*c))/(2*a), (-b-sqrt(b^2-4*a*c))/(2*a)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir el operador&lt;br /&gt;
--    (~=) :: (Fractional a, Ord a) =&amp;gt; a -&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
-- tal que (x ~= y) se verifica si x e y son casi iguales; es decir si&lt;br /&gt;
-- el valor absoluto de su diferencia es menor que una milésima. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    12.3457 ~= 12.3459  ==  True&lt;br /&gt;
--    12.3457 ~= 12.3479  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
(~=) :: (Fractional a, Ord a) =&amp;gt; a -&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
x ~= y | abs(x-y) &amp;lt;= 0.001 = True&lt;br /&gt;
       | otherwise = False&lt;br /&gt;
--Lucía Hernández, Laura Arango&lt;br /&gt;
(~=) :: (Fractional a, Ord a) =&amp;gt; a -&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
x ~= y = if abs(x - y)&amp;lt;0.001 then True&lt;br /&gt;
         else False&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
(~=) :: (Fractional a, Ord a) =&amp;gt; a -&amp;gt; a -&amp;gt; Bool &lt;br /&gt;
x ~= y = abs (x-y) &amp;lt; 0.001&lt;br /&gt;
-- --------------------------------------------------------------------- &lt;br /&gt;
-- Ejercicio 9. Comprobar con QuickCheck que la suma de las raíces&lt;br /&gt;
-- de la ecuación ax^2 + bx + c = 0 (con a no nulo) es -b/a y su&lt;br /&gt;
-- producto es c/a.&lt;br /&gt;
--&lt;br /&gt;
-- Nota. En la comparación usar ~= en lugar de ==&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es &lt;br /&gt;
prop_raices :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; Property&lt;br /&gt;
prop_raices a b c = (a /= 0) &amp;amp;&amp;amp; not (null (raices a b c)) ==&amp;gt; (sum (raices a b c)) ~= (-b/a) &amp;amp;&amp;amp; (product (raices a b c)) ~= (c/a) &lt;br /&gt;
-- La comprobación es quickCheck prop_raices&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. En geometría, la fórmula de Herón, descubierta por&lt;br /&gt;
-- Herón de Alejandría, dice que el área de un triángulo cuyo lados&lt;br /&gt;
-- miden a, b y c es la raíz cuadrada de s(s-a)(s-b)(s-c) donde s es el&lt;br /&gt;
-- semiperímetro &lt;br /&gt;
--    s = (a+b+c)/2&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    area :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; Double &lt;br /&gt;
-- tal que (area a b c) es el área del triángulo de lados a, b y c. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    area 3 4 5  ==  6.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, Adolfo Sagrera Vivancos, José Manuel García,César Fornis&lt;br /&gt;
area :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; Double &lt;br /&gt;
area a b c = sqrt(s*(s-a)*(s-b)*(s-c))&lt;br /&gt;
     where s = (a+b+c)/2&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Los intervalos cerrados se pueden representar mediante&lt;br /&gt;
-- una lista de dos números (el primero es el extremo inferior del&lt;br /&gt;
-- intervalo y el segundo el superior). &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    interseccion :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (interseccion i1 i2) es la intersección de los intervalos i1 e&lt;br /&gt;
-- i2. Por ejemplo,&lt;br /&gt;
--    interseccion [] [3,5]     ==  []&lt;br /&gt;
--    interseccion [3,5] []     ==  []&lt;br /&gt;
--    interseccion [2,4] [6,9]  ==  []&lt;br /&gt;
--    interseccion [2,6] [6,9]  ==  [6,6]&lt;br /&gt;
--    interseccion [2,6] [0,9]  ==  [2,6]&lt;br /&gt;
--    interseccion [2,6] [0,4]  ==  [2,4]&lt;br /&gt;
--    interseccion [4,6] [0,4]  ==  [4,4]&lt;br /&gt;
--    interseccion [5,6] [0,4]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
interseccion :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccion [] _ = []&lt;br /&gt;
interseccion _ []= []&lt;br /&gt;
interseccion i1 i2  | last i1&amp;lt;head i2 = []&lt;br /&gt;
                    |head i1&amp;gt;last i2 = [] &lt;br /&gt;
                    |otherwise = [maximum [head i1,head i2], minimum [last i1,last i2]]&lt;br /&gt;
--Laura Arango, Elsa Domínguez, César Fornis&lt;br /&gt;
interseccion1 :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccion1 i1 i2 | i1==[] || i2==[] || head i1&amp;gt;last i2 || last i1&amp;lt;head i2 = []&lt;br /&gt;
                    | otherwise = [max (head i1)(head i2), min (last i1)(last i2)]&lt;br /&gt;
--José Manuel García&lt;br /&gt;
interseccion2 :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccion2 i1 i2 | null i1 || null i2 || a &amp;gt; d || b &amp;lt; c = []&lt;br /&gt;
                   | a &amp;lt;= c &amp;amp;&amp;amp; b &amp;lt;= d = [c,b]&lt;br /&gt;
                   | a &amp;gt;= c &amp;amp;&amp;amp; b &amp;lt;= d = [a,b]&lt;br /&gt;
                   | a &amp;gt;= c &amp;amp;&amp;amp; b &amp;gt;= d = [a,d]&lt;br /&gt;
                   | a &amp;lt;= c &amp;amp;&amp;amp; b &amp;gt;= d = [c,d]   &lt;br /&gt;
             where a = head i1&lt;br /&gt;
                   b = last i1&lt;br /&gt;
                   c = head i2&lt;br /&gt;
                   d = last i2&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Comprobar con QuickCheck que la intersección de&lt;br /&gt;
-- intervalos es conmutativa.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_interseccion :: Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_interseccion a1 a2 b1 b2 = interseccion [a1,a2] [b1,b2] == interseccion [b1,b2] [a1,a2]  &lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_interseccion&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.1. Los números racionales pueden representarse mediante&lt;br /&gt;
-- pares de números enteros. Por ejemplo, el número 2/5 puede&lt;br /&gt;
-- representarse mediante el par (2,5). &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    formaReducida :: (Int,Int) -&amp;gt; (Int,Int) &lt;br /&gt;
-- tal que (formaReducida x) es la forma reducida del número racional&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    formaReducida (4,10)  ==  (2,5)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García&lt;br /&gt;
formaReducida :: (Int,Int) -&amp;gt; (Int,Int) &lt;br /&gt;
formaReducida (a,b) = (div a z, div b z)&lt;br /&gt;
                  where z = gcd a b&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.2. Definir la función &lt;br /&gt;
--    sumaRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que (sumaRacional x y) es la suma de los números racionales x e&lt;br /&gt;
-- y, expresada en forma reducida. Por ejemplo, &lt;br /&gt;
--    sumaRacional (2,3) (5,6)  ==  (3,2)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
sumaRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
sumaRacional (a,b) (c,d) = if b&amp;lt;d then formaReducida((div s b)*a + c, s)&lt;br /&gt;
                           else formaReducida(a+ (div s d)*c, s)&lt;br /&gt;
                   where s = lcm b d&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
sumaRacional1 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
sumaRacional1 (a,b) (c,d) = formaReducida (a*d + c*b, b*d)&lt;br /&gt;
--Pelayo Infante &lt;br /&gt;
sumaRacional2 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
sumaRacional2 (a,b) (c,d) = formaReducida ((x), (lcm b d))&lt;br /&gt;
                                         where x= y+ ((div (lcm b d) d)*c)&lt;br /&gt;
                                                where y=  (div(lcm b d) b)*a&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. Definir la función &lt;br /&gt;
--    productoRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que (productoRacional x y) es el producto de los números&lt;br /&gt;
-- racionales x e y. Por ejemplo, &lt;br /&gt;
--    productoRacional (2,3) (5,6)  ==  (5,9)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
productoRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
productoRacional (a,b) (c,d) = formaReducida (x,t)&lt;br /&gt;
                             where x = a*c&lt;br /&gt;
                                   t = b*d&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García&lt;br /&gt;
productoRacional1 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
productoRacional1 (a,b) (c,d) = formaReducida (a*c, b*d)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. Definir la función&lt;br /&gt;
--    cocienteRacional ::  (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que &amp;#039;(cocienteRacional x y)&amp;#039; es el cociente de los números racionales&lt;br /&gt;
-- &amp;#039;x&amp;#039; e &amp;#039;y&amp;#039;. Por ejemplo,&lt;br /&gt;
--    cocienteRacional (2,3) (5,6)  ==  (4,5)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García&lt;br /&gt;
cocienteRacional ::  (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
cocienteRacional (x1,x2) (y1,y2) = formaReducida (x1*y2, x2*y1)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.5. Definir la función &lt;br /&gt;
--    igualdadRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualdadRacional x y) se verifica si los números racionales&lt;br /&gt;
-- x e y son iguales. Por ejemplo, &lt;br /&gt;
--    igualdadRacional (6,9) (10,15)  ==  True&lt;br /&gt;
--    igualdadRacional (6,9) (11,15)  ==  False&lt;br /&gt;
--    igualdadRacional (0,2) (0,-5)   ==  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández&lt;br /&gt;
igualdadRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; Bool&lt;br /&gt;
igualdadRacional (a,b) (c,d) = formaReducida (a,b) == formaReducida (c,d)&lt;br /&gt;
-- Laura Arango&lt;br /&gt;
igualdadRacional1 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; Bool&lt;br /&gt;
igualdadRacional1 (a,b) (c,d) = formaReducida (a,b) == formaReducida (c,d)&lt;br /&gt;
                               || (a==0 &amp;amp;&amp;amp; c==0)&lt;br /&gt;
                               || (b==0 &amp;amp;&amp;amp; d==0)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
igualdadRacional2 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; Bool&lt;br /&gt;
igualdadRacional2 (a,b) (c,d) | a == 0 &amp;amp;&amp;amp; c == 0  = True&lt;br /&gt;
                              | b == 0 &amp;amp;&amp;amp; d == 0  = True&lt;br /&gt;
                              | otherwise         = formaReducida (a,b) == formaReducida (c,d)&lt;br /&gt;
-- José Manuel García&lt;br /&gt;
igualdadRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; Bool&lt;br /&gt;
igualdadRacional3 (a,b) (c,d) = if (a == 0 &amp;amp;&amp;amp; c == 0) || (b == 0 &amp;amp;&amp;amp; d == 0)&lt;br /&gt;
                                then True&lt;br /&gt;
                                else formaReducida (a,b) == formaReducida (c,d)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.6. Comprobar con QuickCheck la propiedad distributiva&lt;br /&gt;
-- del producto racional respecto de la suma.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_distributiva :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; Property&lt;br /&gt;
prop_distributiva x y z = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. Los números complejos se pueden representar mediante pares de &lt;br /&gt;
-- números reales. Por ejemplo, el número 2+5i se puede representar mediante &lt;br /&gt;
-- el par (2,5).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lo siguiente significa que el tipo Complejo es lo mismo que decir (Double,Double)&lt;br /&gt;
type Complejo = (Double,Double)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14.1. Definir la función&lt;br /&gt;
--    sumaComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
-- tal que &amp;#039;(sumaComplejos x y)&amp;#039; es la suma de los números complejos &amp;#039;x&amp;#039; e &amp;#039;y&amp;#039;.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    sumaComplejos (2,3) (5,6)  ==  (7.0,9.0)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García&lt;br /&gt;
sumaComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
sumaComplejos (x1,x2) (y1,y2) = (x1+y1, x2+y2)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14.2. Definir la función&lt;br /&gt;
--    productoComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
-- tal que &amp;#039;(productoComplejos x y)&amp;#039; es el producto de los números complejos&lt;br /&gt;
-- &amp;#039;x&amp;#039; e &amp;#039;y&amp;#039;. Por ejemplo,&lt;br /&gt;
--    productoComplejos (2,3) (5,6)  ==  (-8.0,27.0)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez, José Manuel García&lt;br /&gt;
productoComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
productoComplejos (x1,x2) (y1,y2) = ((x1*y1 - x2*y2),(x2*y1 + x1*y2))&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14.3. Definir la función&lt;br /&gt;
--    cocienteComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
-- tal que &amp;#039;(cocienteComplejos x y)&amp;#039; es el cociente de los números complejos&lt;br /&gt;
-- &amp;#039;x&amp;#039; e &amp;#039;y&amp;#039;. Por ejemplo,&lt;br /&gt;
--    cocienteComplejos (3,2) (1,-2)  ==  (-0.2,1.6)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Laura Arango&lt;br /&gt;
cocienteComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
cocienteComplejos (x1,x2) (y1,y2) = (((x1*y1 + x2*y2)/ t), ((x2*y1 - x1*y2)/t))&lt;br /&gt;
                  where t = (y1^2 + y2^2)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
cocienteComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
cocienteComplejos (x1,x2) (y1,y2) = (a,b)&lt;br /&gt;
                   where a = fst (productoComplejos (x1,x2) (y1,-y2))/(y1^2 + y2^2)&lt;br /&gt;
                         b = snd (productoComplejos (x1,x2) (y1,-y2))/(y1^2 + y2^2)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14.4. Definir la función&lt;br /&gt;
--    conjugado :: Complejo -&amp;gt; Complejo&lt;br /&gt;
-- tal que &amp;#039;(conjugado x)&amp;#039; es el conjugado del número complejo &amp;#039;x&amp;#039;. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    conjugado (2,3)  ==  (2.0,-3.0)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez&lt;br /&gt;
conjugado :: Complejo -&amp;gt; Complejo&lt;br /&gt;
conjugado (x1,x2) = (x1, -x2)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15. Los rectángulos pueden representarse por sus dimensiones, base&lt;br /&gt;
-- y altura, como un par de números enteros. Por ejemplo, (5,3) representa un&lt;br /&gt;
-- rectángulo de base 5 y altura 3.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    mayorRectangulo :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que &amp;#039;(mayorRectangulo r1 r2)&amp;#039; es el rectángulo de mayor área entre &amp;#039;r1&amp;#039;&lt;br /&gt;
-- y &amp;#039;r2&amp;#039;. Por ejemplo,&lt;br /&gt;
--    mayorRectangulo (4,6) (3,7)  ==  (4,6)&lt;br /&gt;
--    mayorRectangulo (4,6) (3,8)  ==  (4,6)&lt;br /&gt;
--    mayorRectangulo (4,6) (3,9)  ==  (3,9)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
mayorRectangulo :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
mayorRectangulo (x1,y1) (x2,y2) = if t &amp;gt;= p then (x1,y1) else (x2,y2)&lt;br /&gt;
                where t = x1*y1&lt;br /&gt;
                      p = x2*y2&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Elsa Domínguez&lt;br /&gt;
mayorRectangulo1 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
mayorRectangulo1 (x1,y1) (x2,y2) = if x1*y1 &amp;gt;= x2*y2 then (x1,y1)&lt;br /&gt;
                                  else (x2,y2)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16. Definir la función&lt;br /&gt;
--    cuadrante :: (Int,Int) -&amp;gt; Int&lt;br /&gt;
-- tal que &amp;#039;(cuadrante p)&amp;#039; es el cuadrante en el que se encuentra el punto &amp;#039;p&amp;#039;.&lt;br /&gt;
-- Si el punto está sobre los ejes el resultado debe ser 0. Por ejemplo,&lt;br /&gt;
--    cuadrante (0,4)    ==  0&lt;br /&gt;
--    cuadrante (-3,0)   ==  0&lt;br /&gt;
--    cuadrante (0,0)    ==  0&lt;br /&gt;
--    cuadrante (3,5)    ==  1&lt;br /&gt;
--    cuadrante (-3,5)   ==  2&lt;br /&gt;
--    cuadrante (-3,-5)  ==  3&lt;br /&gt;
--    cuadrante (3,-5)   ==  4&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
cuadrante :: (Int,Int) -&amp;gt; Int&lt;br /&gt;
cuadrante (x1,x2) | or [x1 == 0, x2 == 0] = 0&lt;br /&gt;
                  | and [x1 &amp;gt; 0, x2 &amp;gt; 0] = 1&lt;br /&gt;
                  | and [x1 &amp;lt; 0, x2 &amp;gt; 0] = 2&lt;br /&gt;
                  | and [x1 &amp;lt; 0, x2 &amp;lt; 0] = 3&lt;br /&gt;
                  | otherwise = 4&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
cuadrante1 :: (Int,Int) -&amp;gt; Int&lt;br /&gt;
cuadrante1 (0,_) = 0&lt;br /&gt;
cuadrante1 (_,0) = 0&lt;br /&gt;
cuadrante1 (x1,x2) | x1&amp;gt;0 &amp;amp;&amp;amp; x2&amp;gt;0 = 1&lt;br /&gt;
                  | x1&amp;lt;0 &amp;amp;&amp;amp; x2&amp;gt;0 = 2&lt;br /&gt;
                  | x1&amp;lt;0 &amp;amp;&amp;amp; x2&amp;lt;0 = 3&lt;br /&gt;
                  | otherwise = 4&lt;br /&gt;
--Laura Arango, Elsa Domínguez&lt;br /&gt;
cuadrante2 :: (Int,Int) -&amp;gt; Int&lt;br /&gt;
cuadrante2 (x1,x2) | x1&amp;gt;0 &amp;amp;&amp;amp; x2&amp;gt;0 = 1&lt;br /&gt;
                   | x1&amp;lt;0 &amp;amp;&amp;amp; x2&amp;gt;0 = 2&lt;br /&gt;
                   | x1&amp;lt;0 &amp;amp;&amp;amp; x2&amp;lt;0 = 3&lt;br /&gt;
                   | x1&amp;gt;0 &amp;amp;&amp;amp; x2&amp;lt;0 = 4&lt;br /&gt;
                   | otherwise    = 0&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 17. Definir la función&lt;br /&gt;
--    simetricoH :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que &amp;#039;(simetricoH p)&amp;#039; es el punto simétrico de &amp;#039;p&amp;#039; respecto del eje&lt;br /&gt;
-- horizontal. Por ejemplo,&lt;br /&gt;
--    simetricoH (2,5)   ==  (2,-5)&lt;br /&gt;
--    simetricoH (2,-5)  ==  (2,5)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango&lt;br /&gt;
simetricoH :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoH (x1,x2) = (x1,-x2)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
simetricoH1 :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoH1 p = (fst p,-snd p)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 18. Definir la función&lt;br /&gt;
--    simetricoV :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que &amp;#039;(simetricoV p)&amp;#039; es el punto simétrico de &amp;#039;p&amp;#039; respecto del eje&lt;br /&gt;
-- vertical. Por ejemplo,&lt;br /&gt;
--    simetricoV (2,5)   ==  (-2,5)&lt;br /&gt;
--    simetricoV (2,-5)  ==  (-2,-5)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango&lt;br /&gt;
simetricoV :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoV (x1,x2) = (-x1,x2)&lt;br /&gt;
- Elsa Domínguez&lt;br /&gt;
simetricoV1 :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoV1 p = (-fst p,snd p)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19. Definir la función&lt;br /&gt;
--    distancia :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; Float&lt;br /&gt;
-- tal que &amp;#039;(distancia p1 p2)&amp;#039; es la distancia entre los puntos &amp;#039;p1&amp;#039; y &amp;#039;p2&amp;#039;.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    distancia (1,2) (4,6)  ==  5.0&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez&lt;br /&gt;
distancia :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; Float&lt;br /&gt;
distancia (x1,x2) (y1,y2) = sqrt((x1-y1)^2 + (x2-y2)^2)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20. Comprobar con QuickCheck que se verifica la propiedad&lt;br /&gt;
-- triangular de la distancia; es decir, dados tres puntos p1, p2 y p3, la&lt;br /&gt;
-- distancia de p1 a p3 es menor o igual que la suma de las distancias de p1 a&lt;br /&gt;
-- p2 y de p2 a p3.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_triangular :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; Bool&lt;br /&gt;
prop_triangular p1 p2 p3 = distancia p1 p3 &amp;lt;= distancia p1 p2 + distancia p2 p3&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    &amp;gt; quickCheck prop_triangular&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 21. Definir la función&lt;br /&gt;
--    puntoMedio :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; (Float,Float)&lt;br /&gt;
-- tal que &amp;#039;(puntoMedio p1 p2)&amp;#039; es el punto medio entre los puntos &amp;#039;p1&amp;#039; y &amp;#039;p2&amp;#039;.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    puntoMedio (0,2) (0,6)   ==  (0.0,4.0)&lt;br /&gt;
--    puntoMedio (-1,2) (7,6)  ==  (3.0,4.0)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Laura Arango, Elsa Domínguez&lt;br /&gt;
puntoMedio :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; (Float,Float)&lt;br /&gt;
puntoMedio (x1,x2) (y1,y2) = ((x1+y1)/2, (x2+y2)/2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Repaso de operaciones lógicas                                      --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa. Su tabla de verdad&lt;br /&gt;
-- es&lt;br /&gt;
--    x     | y     | xor x y&lt;br /&gt;
--    ------+-------+---------&lt;br /&gt;
--    True  | True  | False &lt;br /&gt;
--    True  | False | True&lt;br /&gt;
--    False | True  | True&lt;br /&gt;
--    False | False | False&lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    xor1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor1 x y) es la disyunción excluyente de x e y, calculada a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
xor1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor1 True True  = False&lt;br /&gt;
xor1 True False = True&lt;br /&gt;
xor1 False True = True&lt;br /&gt;
xor1 False False = False&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.2. Definir la función &lt;br /&gt;
--    xor2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor2 x y) es la disyunción excluyente de x e y, calculada a&lt;br /&gt;
-- partir de la tabla de verdad y patrones. Usar 2 ecuaciones, una por&lt;br /&gt;
-- cada valor del primer argumento. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
xor2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor2 x y  | y/= x =  True&lt;br /&gt;
          | y == x = False&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.3. Definir la función &lt;br /&gt;
--    xor3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor3 x y) es la disyunción excluyente de x e y, calculada &lt;br /&gt;
-- a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación (not). &lt;br /&gt;
-- Usar 1 ecuación. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
xor3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor3 x y =  (x &amp;amp;&amp;amp; not y) || (y &amp;amp;&amp;amp; not x)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.4. Definir la función &lt;br /&gt;
--    xor4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor3 x y) es la disyunción excluyente de x e y, calculada&lt;br /&gt;
-- a partir de desigualdad (/=). Usar 1 ecuación.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
xor4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor4 x y = if x == y then False else True&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
xor4&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor4&amp;#039; x y = if x/=y then True else False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.5. Comprobar con QuickCheck que las cuatro definiciones&lt;br /&gt;
-- de xor son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_xor_equivalentes :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
prop_xor_equivalentes x y = xor1 x y == xor2 x y &amp;amp;&amp;amp; xor2 x y == xor3 x y &amp;amp;&amp;amp; xor3 x y == xor4 x y&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_xor_equivalentes&lt;br /&gt;
+++ OK, passed 100 tests&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 23.1 Definir la función &lt;br /&gt;
--    or3 :: Bool -&amp;gt; Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (or3 a b c) es la disyunción entre a, b y c; es decir,&lt;br /&gt;
-- ocurre a o b o c. Definir la función usando &amp;#039;||&amp;#039;. Por ejemplo,&lt;br /&gt;
--    or3 True True False  ==  True&lt;br /&gt;
--    or3 False False False ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández&lt;br /&gt;
or3 :: Bool -&amp;gt; Bool -&amp;gt; Bool-&amp;gt; Bool &lt;br /&gt;
or3 a b c  = a || b || c&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 23.2 Definir la función &lt;br /&gt;
--    or3&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (or3&amp;#039; a b c) es la disyunción entre a, b y c; es decir,&lt;br /&gt;
-- ocurre a o b o c. Definir la función usando &amp;#039;or&amp;#039; para listas.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    or3&amp;#039; True True False  ==  True&lt;br /&gt;
--    or3&amp;#039; False False False ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández&lt;br /&gt;
or3&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
or3&amp;#039; a b c = or [a,b,c]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 24.1 Definir la función &lt;br /&gt;
--    and3 :: Bool -&amp;gt; Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (and3 a b c) es la conjunción entre a, b y c; es decir,&lt;br /&gt;
-- ocurre a y b y c. Definir la función usando &amp;#039;&amp;amp;&amp;amp;&amp;#039;. Por ejemplo,&lt;br /&gt;
--    and3 True True True  ==  True&lt;br /&gt;
--    and3 False True False ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández&lt;br /&gt;
and3 :: Bool -&amp;gt; Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
and3 a b c = a &amp;amp;&amp;amp; b &amp;amp;&amp;amp; c&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 24.2 Definir la función &lt;br /&gt;
--    and3&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
-- tal que (and3&amp;#039; a b c) es la conjunción entre a, b y c; es decir,&lt;br /&gt;
-- ocurre a o b o c. Definir la función usando &amp;#039;and&amp;#039; para listas.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    and3&amp;#039; True True True  ==  True&lt;br /&gt;
--    and3&amp;#039; False True False ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández&lt;br /&gt;
and3&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
and3&amp;#039; a b c = and[a,b,c]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 25.1. Definir la función &lt;br /&gt;
--    siglo20 :: Int -&amp;gt; Bool &lt;br /&gt;
-- tal que (siglo20 x) indica si el ańo x perteneció al siglo 20; es decir,&lt;br /&gt;
-- si está comprendido entre el ańo 1901 y 2000.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    siglo20 1902  == True&lt;br /&gt;
--    siglo20 2001 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández&lt;br /&gt;
siglo20 :: Int -&amp;gt; Bool&lt;br /&gt;
siglo20 x = if  1901 &amp;lt;= x &amp;amp;&amp;amp; x &amp;lt; 2000 then True&lt;br /&gt;
            else False&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
siglo201 :: Int -&amp;gt; Bool&lt;br /&gt;
siglo201 x = 1901 &amp;lt;= x &amp;amp;&amp;amp; x &amp;lt;= 2000&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 25.2. Definir la función &lt;br /&gt;
--    noSiglo20 :: Int -&amp;gt; Bool &lt;br /&gt;
-- tal que (noSiglo20 x) indica si el ańo x no perteneció al siglo 20; es decir,&lt;br /&gt;
-- si no está comprendido entre el ańo 1901 y 2000.&lt;br /&gt;
-- Definirla de tres formas distintas, una usando la función (siglo20 x), otra&lt;br /&gt;
-- usando &amp;#039;&amp;amp;&amp;amp;&amp;#039; y otra usando &amp;#039;||&amp;#039;.&lt;br /&gt;
--&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    noSiglo20 1902  == False&lt;br /&gt;
--    noSiglo20 2001 == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
noSiglo20 :: Int -&amp;gt; Bool&lt;br /&gt;
noSiglo20 x = not (siglo20 x)&lt;br /&gt;
noSiglo20&amp;#039; = undefined  &lt;br /&gt;
noSiglo20&amp;#039;&amp;#039; x = x &amp;lt; 1901 || x &amp;gt;= 2000&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
noSiglo20 :: Int -&amp;gt; Bool&lt;br /&gt;
noSiglo20 x = not(siglo20 x)&lt;br /&gt;
noSiglo20&amp;#039; x = if x &amp;lt;= 2000 &amp;amp;&amp;amp; x &amp;gt; 1901 then False&lt;br /&gt;
             else True&lt;br /&gt;
noSiglo20&amp;#039;&amp;#039; x  = x=&amp;gt;2000 || x&amp;lt; 1901&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
noSiglo20 :: Int -&amp;gt; Bool&lt;br /&gt;
noSiglo20 x = siglo20 x == False&lt;br /&gt;
noSiglo20&amp;#039; x = not (x &amp;gt;= 1901 &amp;amp;&amp;amp; x &amp;lt;= 2000) &lt;br /&gt;
noSiglo20&amp;#039;&amp;#039; x = x &amp;lt; 1901 || x &amp;gt; 2000  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 26. Definir la función &lt;br /&gt;
--    xnor :: Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
-- tal que (xnor a b) se calcula con su tabla de verdad, que&lt;br /&gt;
-- es&lt;br /&gt;
--    x     | y     | xnor x y&lt;br /&gt;
--    ------+-------+---------&lt;br /&gt;
--    False | False | True &lt;br /&gt;
--    False | True  | False&lt;br /&gt;
--    True  | False | False&lt;br /&gt;
--    True  | True  | True&lt;br /&gt;
--&lt;br /&gt;
-- Emplear solo operadores lógicos (&amp;amp;&amp;amp;, ||, not).&lt;br /&gt;
-- &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    xnor True True  ==  True&lt;br /&gt;
--    xnor False True ==  False&lt;br /&gt;
--    xnor False False  ==  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
&lt;br /&gt;
xnor :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xnor x y =  (not x &amp;amp;&amp;amp; not y) || (x &amp;amp;&amp;amp;  y)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 27. Definir la función &lt;br /&gt;
--    aprueba :: Float -&amp;gt; Float -&amp;gt; Float -&amp;gt; Bool&lt;br /&gt;
-- tal que (aprueba n1 n2 n3) indica si con las notas de los&lt;br /&gt;
-- exámenes parciales n1, n2 y n3 se consigue aprobar la&lt;br /&gt;
-- asignatura. Los criterios para aprobar la asignatura son los siguientes:&lt;br /&gt;
--   * La media de las notas debe ser mayor o igual que 5, y&lt;br /&gt;
--   * Cada una de las notas de los exámenes parciales son mayor o igual&lt;br /&gt;
--     que 4.0,&lt;br /&gt;
--   * O en el último exámen se obtuvo un 10 (entonces siempre se aprueba)&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    aprueba 5.0 6.0 5.0 == True&lt;br /&gt;
--    aprueba 1.5 6.0 8.0 == False&lt;br /&gt;
--    aprueba 3.7 1.5 10.0 == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
aprueba :: Float -&amp;gt; Float -&amp;gt; Float -&amp;gt; Bool&lt;br /&gt;
aprueba x y z | z == 10 = True&lt;br /&gt;
              | (x+y+z)/3 &amp;gt;= 5 &amp;amp;&amp;amp; and [x&amp;gt;4, y&amp;gt;4, z&amp;gt;4] = True&lt;br /&gt;
              | otherwise = False&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
aprueba :: Float -&amp;gt; Float -&amp;gt; Float -&amp;gt; Bool&lt;br /&gt;
aprueba n1 n2 n3 = (n1+n2+n3)/3 &amp;gt;= 5 &amp;amp;&amp;amp;( n1&amp;gt;=4 &amp;amp;&amp;amp; n2&amp;gt;=4 &amp;amp;&amp;amp; n3&amp;gt;=4) || n3 == 10 &lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
aprueba2 :: Float -&amp;gt; Float -&amp;gt; Float -&amp;gt; Bool&lt;br /&gt;
aprueba2 n1 n2 n3 | and [n1 &amp;gt; 4, n2 &amp;gt; 4, n3 &amp;gt; 4] = (n1+n2+n3)/3 &amp;gt;= 5&lt;br /&gt;
                  | n3 == 10.0                   = True&lt;br /&gt;
                  | otherwise                    = False &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 28. Comprobar las leyes de Morgan con QuickCheck. Las&lt;br /&gt;
-- leyes de Morgan se definen como sigue:&lt;br /&gt;
--   * ley 1: no (A o B) == (no A) y (no B)&lt;br /&gt;
--   * ley 2: no (A y B) == (no A) o (no B)&lt;br /&gt;
-- Consejo: definir cada ley como una función por separado para componer&lt;br /&gt;
-- la propiedad&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
ley1:: Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
ley1 a b = not (a || b) == (not a) &amp;amp;&amp;amp; (not b)&lt;br /&gt;
&lt;br /&gt;
ley2:: Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
ley2 a b =  not (a &amp;amp;&amp;amp; b) == (not a) || (not b)&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_leyes_morgan :: Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
prop_leyes_morgan a b = ley1 a b == ley2 a b&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
&lt;br /&gt;
ley1:: Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
ley1 a b = not(a || b) ==( not a &amp;amp;&amp;amp; not b)&lt;br /&gt;
&lt;br /&gt;
ley2:: Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
ley2 a b = not (a&amp;amp;&amp;amp;b) == ( not a  || not b )&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_leyes_morgan :: Bool -&amp;gt; Bool -&amp;gt; Bool &lt;br /&gt;
prop_leyes_morgan a b= ley1 a b &amp;amp;&amp;amp; ley2 a b&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fermarort2</name></author>
	</entry>
</feed>