<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?action=history&amp;feed=atom&amp;title=Relaci%C3%B3n_2_Sol</id>
	<title>Relación 2 Sol - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?action=history&amp;feed=atom&amp;title=Relaci%C3%B3n_2_Sol"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2_Sol&amp;action=history"/>
	<updated>2026-07-22T18:41:06Z</updated>
	<subtitle>Historial de revisiones de esta página en el wiki</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2_Sol&amp;diff=280&amp;oldid=prev</id>
		<title>Mdelamor: Protegió «Relación 2 Sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2_Sol&amp;diff=280&amp;oldid=prev"/>
		<updated>2021-10-21T20:32:19Z</updated>

		<summary type="html">&lt;p&gt;Protegió «&lt;a href=&quot;/WIKIS/I1M2021G2/index.php/Relaci%C3%B3n_2_Sol&quot; title=&quot;Relación 2 Sol&quot;&gt;Relación 2 Sol&lt;/a&gt;» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;es&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revisión del 20:32 21 oct 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;es&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Sin diferencias)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2_Sol&amp;diff=279&amp;oldid=prev</id>
		<title>Mdelamor: Página creada con «&lt;source lang=&#039;haskell&#039;&gt;  -- I1M 2020-21: Rel_2_sol.hs  -- Definiciones con condicionales, guardas o patrones. -- Departamento de Ciencias de la Computación e I.A. -- Unive…»</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2_Sol&amp;diff=279&amp;oldid=prev"/>
		<updated>2021-10-21T20:32:08Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;  -- I1M 2020-21: Rel_2_sol.hs  -- Definiciones con condicionales, guardas o patrones. -- Departamento de Ciencias de la Computación e I.A. -- Unive…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2020-21: Rel_2_sol.hs &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;
-- Estos ejercicios se corresponden con el tema 4 que se encuentran en  &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-4.html&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;
-- Nota: hacer diferentes definiciones, con ecuaciones, condicionales y&lt;br /&gt;
-- con guardas.  Recuerda poner nombres distintos para cada definicion.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Sol 1. Con condicionales&lt;br /&gt;
divisionSegura :: Double -&amp;gt; Double -&amp;gt; Double&lt;br /&gt;
divisionSegura x y = if y/= 0&lt;br /&gt;
                     then  x/y&lt;br /&gt;
                     else 9999&lt;br /&gt;
&lt;br /&gt;
-- Sol 2. Con guardas&lt;br /&gt;
divisionSegura1 :: Double -&amp;gt; Double -&amp;gt; Double&lt;br /&gt;
divisionSegura1 x y | y/= 0 = x/y&lt;br /&gt;
                    | otherwise = 9999&lt;br /&gt;
                    &lt;br /&gt;
-- Sol 3. Con expresiones case&lt;br /&gt;
divisionSegura2 :: Double -&amp;gt; Double -&amp;gt; Double&lt;br /&gt;
divisionSegura2 x y = case y of&lt;br /&gt;
                        0 -&amp;gt; 9999&lt;br /&gt;
                        otherwise -&amp;gt; x/y&lt;br /&gt;
&lt;br /&gt;
-- Sol 4. Con patrones&lt;br /&gt;
divisionSegura3 :: Double -&amp;gt; Double -&amp;gt; Double&lt;br /&gt;
divisionSegura3 x 0 = 9999&lt;br /&gt;
divisionSegura3 x y = x/y&lt;br /&gt;
&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;
&lt;br /&gt;
intercambia :: (a,b) -&amp;gt; (b,a)&lt;br /&gt;
intercambia  (x,y) = (y,x)&lt;br /&gt;
&lt;br /&gt;
intercambia2 :: (a,b) -&amp;gt; (b,a)&lt;br /&gt;
intercambia2 p = (snd p,fst p)&lt;br /&gt;
&lt;br /&gt;
&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;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_intercambia :: (Int,Int) -&amp;gt; Bool&lt;br /&gt;
prop_intercambia par = intercambia ( intercambia par) == par&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
-- λ&amp;gt; quickCheck prop_intercambia&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&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;
-- Sol 1. Solo para listas no vacías&lt;br /&gt;
ciclo :: [a] -&amp;gt; [a]&lt;br /&gt;
ciclo xs = [last xs ]++ init xs&lt;br /&gt;
&lt;br /&gt;
-- Para todos los casos&lt;br /&gt;
-- Sol 2. Con guardas&lt;br /&gt;
ciclo2 xs | null xs = []&lt;br /&gt;
          | otherwise = last xs :  init 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;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_ciclo :: [Int] -&amp;gt; Bool &lt;br /&gt;
prop_ciclo xs = length xs == length (ciclo xs)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&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;
&lt;br /&gt;
-- 1ª definición:&lt;br /&gt;
numeroMayor :: (Num a, Ord a) =&amp;gt; a -&amp;gt; a -&amp;gt; a&lt;br /&gt;
numeroMayor x y = 10 * max x y + min x y&lt;br /&gt;
 &lt;br /&gt;
-- 2ª definición:&lt;br /&gt;
numeroMayor2 :: (Num a, Ord a) =&amp;gt; a -&amp;gt; a -&amp;gt; a&lt;br /&gt;
numeroMayor2 x y | x &amp;gt; y     = 10*x+y&lt;br /&gt;
                 | otherwise = 10*y+x&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;
&lt;br /&gt;
numeroDeRaices :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; Int&lt;br /&gt;
numeroDeRaices a b c | d &amp;lt; 0     = 0&lt;br /&gt;
                     | d == 0    = 1&lt;br /&gt;
                     | otherwise = 2&lt;br /&gt;
    where d = b^2-4*a*c&lt;br /&gt;
 &lt;br /&gt;
-- 2ª solución&lt;br /&gt;
numeroDeRaices2 :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; Int&lt;br /&gt;
numeroDeRaices2 a b c = 1 + round (signum (b**2-4*a*c))&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;
&lt;br /&gt;
raices :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; [Double]&lt;br /&gt;
raices a b c &lt;br /&gt;
    | d &amp;gt;= 0    = [(-b+e)/t,(-b-e)/t]&lt;br /&gt;
    | otherwise = []&lt;br /&gt;
    where d = b^2 - 4*a*c&lt;br /&gt;
          e = sqrt d&lt;br /&gt;
          t = 2*a&lt;br /&gt;
&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;
&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;
-- --------------------------------------------------------------------- &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 rs) ==&amp;gt; s ~= ((-b)/a) &amp;amp;&amp;amp; p ~= (c/a)&lt;br /&gt;
    where s = sum rs &lt;br /&gt;
          p = product rs&lt;br /&gt;
          rs = raices a b c&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
-- &amp;gt; 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;
&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;
&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 [a1,b1] [a2,b2]&lt;br /&gt;
    | a &amp;lt;= b    = [a,b]&lt;br /&gt;
    | otherwise = []&lt;br /&gt;
    where a = max a1 a2&lt;br /&gt;
          b = min b1 b2&lt;br /&gt;
interseccion _ _ = error &amp;quot;Imposible&amp;quot;&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;
&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 b1 a2 b2 = interseccion [a1,b1] [a2,b2] == interseccion [a2,b2] [a1,b1]&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
-- &amp;gt; 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;
&lt;br /&gt;
formaReducida :: (Int,Int) -&amp;gt; (Int,Int) &lt;br /&gt;
formaReducida (0,_) = (0,1)&lt;br /&gt;
formaReducida (a,b) = (x * signum (a*b), y)&lt;br /&gt;
    where c = gcd a b&lt;br /&gt;
          x = abs (a `div` c)&lt;br /&gt;
          y = abs (b `div` c)&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;
sumaRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
sumaRacional (a,b) (c,d) = formaReducida (a*d+b*c, b*d)&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;
&lt;br /&gt;
productoRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
productoRacional (a,b) (c,d) = formaReducida (a*c, b*d)&lt;br /&gt;
&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;
&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;
&lt;br /&gt;
igualdadRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; Bool&lt;br /&gt;
igualdadRacional (a,b) (c,d) = &lt;br /&gt;
    a*d == b*c&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 = snd x /= 0 &amp;amp;&amp;amp; snd y /= 0 &amp;amp;&amp;amp; snd z /= 0 ==&amp;gt;&lt;br /&gt;
     productoRacional (sumaRacional x y) z == &lt;br /&gt;
            sumaRacional (productoRacional x z) (productoRacional y z)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
-- &amp;gt; quickCheck prop_distributiva &lt;br /&gt;
-- +++ OK, passed 100 tests; 18 discarded.&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;
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;
&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;
&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;
-- ----------------------------------------------------------------------------&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;
&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;
&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;
&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;
&lt;br /&gt;
mayorRectangulo :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
mayorRectangulo (x1,y1) (x2,y2) | t &amp;gt; s = (x1, y1)&lt;br /&gt;
                                | s &amp;gt; t = (x2, y2)&lt;br /&gt;
                                | otherwise = (x1, y1)&lt;br /&gt;
                                where t = x1*y1&lt;br /&gt;
                                      s = x2*y2&lt;br /&gt;
&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;
&lt;br /&gt;
cuadrante :: (Int,Int) -&amp;gt; Int&lt;br /&gt;
cuadrante (0,_) = 0&lt;br /&gt;
cuadrante (_,0) = 0&lt;br /&gt;
cuadrante (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;
&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;
&lt;br /&gt;
simetricoH :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoH (x1,x2) = (x1,-x2)&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;
&lt;br /&gt;
simetricoV :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoV (x1,x2) = (-x1,x2)&lt;br /&gt;
&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;
&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;
-- ----------------------------------------------------------------------------&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;
&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;
-- ----------------------------------------------------------------------------&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;
&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;
&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;
&lt;br /&gt;
xor2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor2 True y = not y&lt;br /&gt;
xor2 False y = y&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;
&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;
&lt;br /&gt;
xor4 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor4 x y = x /= y&lt;br /&gt;
&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;
&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 = x1 == x2 &amp;amp;&amp;amp; x2 == x3 &amp;amp;&amp;amp; x3 == x4&lt;br /&gt;
    where x1 = xor1 x y &lt;br /&gt;
          x2 = xor2 x y &lt;br /&gt;
          x3 = xor3 x y &lt;br /&gt;
          x4 = xor4 x y &lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&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;
&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;
-- ---------------------------------------------------------------------&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;
&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;
-- ---------------------------------------------------------------------&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;
&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;
&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;
&lt;br /&gt;
siglo20 :: Int -&amp;gt; Bool&lt;br /&gt;
siglo20 x = (x&amp;gt;=1901) &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;
&lt;br /&gt;
noSiglo20 :: Int -&amp;gt; Bool&lt;br /&gt;
noSiglo20 x = not( siglo20 x )&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;
-- ---------------------------------------------------------------------&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) calcula &amp;#039;a si y solo si b&amp;#039;. Su tabla de verdad&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;
&lt;br /&gt;
xnor :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xnor a b = (a &amp;amp;&amp;amp; b) || ((not a) &amp;amp;&amp;amp; (not b))&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;
&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.0) &amp;amp;&amp;amp;&lt;br /&gt;
                   (n1 &amp;gt;= 4.0) &amp;amp;&amp;amp; (n2 &amp;gt;= 4.0) &amp;amp;&amp;amp; (n3 &amp;gt;= 4.0)) ||&lt;br /&gt;
                   (n3 == 10.0)&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;
&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;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_leyes_morgan&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
</feed>