<?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=Josgarver4</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=Josgarver4"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php/Especial:Contribuciones/Josgarver4"/>
	<updated>2026-07-18T13:35:06Z</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_13&amp;diff=599</id>
		<title>Relación 13</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13&amp;diff=599"/>
		<updated>2022-02-11T09:23:40Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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: Relación 13 (14 de enero de 2022)&lt;br /&gt;
-- Tipos de datos algebraicos (II).&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 presenta ejercicios sobre distintos tipos de&lt;br /&gt;
-- datos algebraicos. Concretamente,&lt;br /&gt;
--    * Árboles binarios:&lt;br /&gt;
--      + Árboles binarios con valores en los nodos.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas y en los nodos.&lt;br /&gt;
--      + Árboles booleanos.  &lt;br /&gt;
--    * Árboles generales&lt;br /&gt;
--    * Expresiones aritméticas&lt;br /&gt;
--      + Expresiones aritméticas básicas.&lt;br /&gt;
--      + Expresiones aritméticas con una variable.&lt;br /&gt;
--      + Expresiones aritméticas con varias variables.&lt;br /&gt;
--      + Expresiones aritméticas generales. &lt;br /&gt;
--      + Expresiones aritméticas con tipo de operaciones.&lt;br /&gt;
--    * Expresiones vectoriales&lt;br /&gt;
-- &lt;br /&gt;
-- Los ejercicios corresponden al tema 9 que se encuentran en &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/temas/tema-9.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Los árboles binarios con valores en los nodos se&lt;br /&gt;
-- pueden definir por&lt;br /&gt;
--    data Arbol1 a = H1 &lt;br /&gt;
--                  | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
--                  deriving (Show, Eq)&lt;br /&gt;
-- Por ejemplo, el árbol&lt;br /&gt;
--         9                &lt;br /&gt;
--        / \    &lt;br /&gt;
--       /   \   &lt;br /&gt;
--      8     6  &lt;br /&gt;
--     / \   / \ &lt;br /&gt;
--    3   2 4   5&lt;br /&gt;
-- se puede representar por&lt;br /&gt;
--    N1 9 (N1 8 (N1 3 H1 H1) (N1 2 H1 H1)) (N1 6 (N1 4 H1 H1) (N1 5 H1 H1))&lt;br /&gt;
--&lt;br /&gt;
-- Definir por recursión la función &lt;br /&gt;
--    sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
-- tal (sumaArbol x) es la suma de los valores que hay en el árbol&lt;br /&gt;
-- x. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; sumaArbol (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))  &lt;br /&gt;
--    21&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol1 a = H1 &lt;br /&gt;
             | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
&lt;br /&gt;
sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
sumaArbol = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García, Elsa Domínguez&lt;br /&gt;
sumaArbol1 :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
sumaArbol1 (H1 ) = 0&lt;br /&gt;
sumaArbol1 (N1 x i d) = x + (sumaArbol1 i) + (sumaArbol1 d)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la función &lt;br /&gt;
--    mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
-- tal que (mapArbol f x) es el árbol que resulta de sustituir cada nodo&lt;br /&gt;
-- n del árbol x por (f n). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; mapArbol (+1) (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    N1 3 (N1 6 (N1 4 H1 H1) (N1 8 H1 H1)) (N1 5 H1 H1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
mapArbol = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García, Elsa Domínguez&lt;br /&gt;
mapArbol1 :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
mapArbol1 f (H1) = (H1)&lt;br /&gt;
mapArbol1 f (N1 x i d) = (N1 (f x) (mapArbol1 f i) (mapArbol1 f d))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la función&lt;br /&gt;
--    ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (ramaIzquierda a) es la lista de los valores de los nodos de&lt;br /&gt;
-- la rama izquierda del árbol a. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; ramaIzquierda (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    [2,5,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
ramaIzquierda = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García, Elsa Domínguez&lt;br /&gt;
ramaIzquierda1 :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
ramaIzquierda1 (H1) = []&lt;br /&gt;
ramaIzquierda1 (N1 x i d) = x : ramaIzquierda1 (i)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.4. Diremos que un árbol está balanceado si para cada nodo&lt;br /&gt;
-- v la diferencia entre el número de nodos (con valor) de sus subárboles&lt;br /&gt;
-- izquierdo y derecho es menor o igual que uno.  &lt;br /&gt;
--&lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (balanceado a) se verifica si el árbol a está balanceado. Por &lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 H1 H1))           == True&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 (N1 4 H1 H1) H1)) == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
balanceado H1 = True&lt;br /&gt;
balanceado (N1 _ i d) = abs (nNodos i - nNodos d) &amp;lt;= 1 &amp;amp;&amp;amp; balanceado i &amp;amp;&amp;amp; balanceado d&lt;br /&gt;
&lt;br /&gt;
nNodos (H1) = 0&lt;br /&gt;
nNodos (N1 _ i d) = 1 + nNodos i + nNodos d&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
cuantosNodos H1 = 0&lt;br /&gt;
cuantosNodos (N1 x i d) = 1 + (cuantosNodos i) + (cuantosNodos d)&lt;br /&gt;
&lt;br /&gt;
balanceado1 :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
balanceado1 H1 = True&lt;br /&gt;
balanceado1 (N1 x i d) | (cuantosNodos i) - (cuantosNodos d) &amp;lt;= 1 =&lt;br /&gt;
                                               (balanceado1 i) &amp;amp;&amp;amp; (balanceado1 d)&lt;br /&gt;
                      | otherwise = False&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Los árboles binarios con valores en las hojas se pueden&lt;br /&gt;
-- definir por&lt;br /&gt;
--    data Arbol2 a = H2 a&lt;br /&gt;
--                  | N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
--                  deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles &lt;br /&gt;
--    árbol1          árbol2       árbol3     árbol4 &lt;br /&gt;
--       o              o           o           o    &lt;br /&gt;
--      / \            / \         / \         / \   &lt;br /&gt;
--     1   o          o   3       o   3       o   1  &lt;br /&gt;
--        / \        / \         / \         / \     &lt;br /&gt;
--       2   3      1   2       1   4       2   3    &lt;br /&gt;
-- se representan por&lt;br /&gt;
--    arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
--    arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
--    arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
--    arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
--    arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualBorde t1 t2) se verifica si los bordes de los árboles&lt;br /&gt;
-- t1 y t2 son iguales. Por ejemplo,&lt;br /&gt;
--    igualBorde arbol1 arbol2  ==  True&lt;br /&gt;
--    igualBorde arbol1 arbol3  ==  False&lt;br /&gt;
--    igualBorde arbol1 arbol4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol2 a = N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
              | H2 a&lt;br /&gt;
              deriving Show&lt;br /&gt;
&lt;br /&gt;
arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
igualBorde t1 t2 = borde t1 == borde t2&lt;br /&gt;
&lt;br /&gt;
borde (H2 a) = [a]&lt;br /&gt;
borde (N2 i d) = borde i ++ borde d&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
igualBorde1 :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
igualBorde1 t1 t2 = (listaBorde t1) == (listaBorde t2)&lt;br /&gt;
&lt;br /&gt;
listaBorde (N2 i d) = (listaBorde i) ++ (listaBorde d) &lt;br /&gt;
listaBorde (H2 x) = [x] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Los árboles binarios con valores en las hojas y en los&lt;br /&gt;
-- nodos se definen por&lt;br /&gt;
--    data Arbol3 a = H3 a&lt;br /&gt;
--                 | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--         5              8             5           5&lt;br /&gt;
--        / \            / \           / \         / \&lt;br /&gt;
--       /   \          /   \         /   \       /   \&lt;br /&gt;
--      9     7        9     3       9     2     4     7&lt;br /&gt;
--     / \   / \      / \   / \     / \               / \&lt;br /&gt;
--    1   4 6   8    1   4 6   2   1   4             6   2&lt;br /&gt;
-- se pueden representar por&lt;br /&gt;
--    ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
--    ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
--    ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
--    ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
--    ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualEstructura :: Arbol3 -&amp;gt; Arbol3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualEstructura a1 a1) se verifica si los árboles a1 y a2 &lt;br /&gt;
-- tienen la misma estructura. Por ejemplo,&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol2 == True&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol3 == False&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol4 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol3 a = H3 a&lt;br /&gt;
              | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
              deriving Show&lt;br /&gt;
&lt;br /&gt;
ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
igualEstructura :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
igualEstructura (H3 _) (H3 _) = True&lt;br /&gt;
igualEstructura (N3 _ i1 d1) (N3 _ i2 d2) = (igualEstructura i1 i2) &amp;amp;&amp;amp; (igualEstructura d1 d2)&lt;br /&gt;
igualEstructura _ _ = False &lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
arbolEstructura (H3 x) = (H3 0)&lt;br /&gt;
arbolEstructura (N3 x i d) = (N3 0 (arbolEstructura i) (arbolEstructura d))&lt;br /&gt;
--Si fuera deriving (Show,Eq):&lt;br /&gt;
--igualEstructura1 :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
--igualEstructura1 t1 t2 = (arbolEstructura t1) == (arbolEstructura t2)&lt;br /&gt;
--Pero como es deriving Show :&lt;br /&gt;
igualEstructura1 :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
igualEstructura1 t1 t2 = show (arbolEstructura t1) == show (arbolEstructura t2)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir la función&lt;br /&gt;
--    algunoArbol :: Arbol3 t -&amp;gt; (t -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
-- tal que (algunoArbol a p) se verifica si algún elemento del árbol a&lt;br /&gt;
-- cumple la propiedad p. Por ejemplo,&lt;br /&gt;
--    algunoArbol3 (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;4)  ==  True&lt;br /&gt;
--    algunoArbol3 (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;7)  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
algunoArbol :: Arbol3 a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
algunoArbol = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García, Elsa Domínguez&lt;br /&gt;
algunoArbol3 :: Arbol3 a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
algunoArbol3 (H3 x) p = (p x)&lt;br /&gt;
algunoArbol3 (N3 x i d) p = (p x) || (algunoArbol3 i p) || (algunoArbol3 d p)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Un elemento de un árbol se dirá de nivel k si aparece&lt;br /&gt;
-- en el árbol a distancia k  de la raíz.  &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (nivel k a) es la lista de los elementos de nivel k del árbol&lt;br /&gt;
-- a. Por ejemplo,&lt;br /&gt;
--    nivel 0 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [7]&lt;br /&gt;
--    nivel 1 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [2,9]&lt;br /&gt;
--    nivel 2 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [5,4]&lt;br /&gt;
--    nivel 3 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
nivel 0 (H3 a) = [a]&lt;br /&gt;
nivel 0 (N3 a i d) = [a]&lt;br /&gt;
nivel n (H3 a) = []&lt;br /&gt;
nivel n (N3 a i d) = nivel (n-1) i ++ nivel (n-1) d &lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
nivel1 :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
nivel1 n (H3 x) | n == 0 = [x]&lt;br /&gt;
               | otherwise = []&lt;br /&gt;
nivel1 n (N3 x i d) | n == 0 = [x]&lt;br /&gt;
                   | otherwise = (nivel1 (n-1) i) ++ (nivel1 (n-1) d)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.4.  Los divisores medios de un número son los que ocupan&lt;br /&gt;
-- la posición media entre los divisores de n, ordenados de menor a&lt;br /&gt;
-- mayor. Por ejemplo, los divisores de 60 son &lt;br /&gt;
-- [1,2,3,4,5,6,10,12,15,20,30,60] y sus divisores medios son 6 y 10.&lt;br /&gt;
-- &lt;br /&gt;
-- El árbol de factorización de un número compuesto n se construye de la&lt;br /&gt;
-- siguiente manera: &lt;br /&gt;
--    * la raíz es el número n, &lt;br /&gt;
--    * la rama izquierda es el árbol de factorización de su divisor&lt;br /&gt;
--      medio menor y&lt;br /&gt;
--    * la rama derecha es el árbol de factorización de su divisor&lt;br /&gt;
--      medio mayor&lt;br /&gt;
-- Si el número es primo, su árbol de factorización sólo tiene una hoja&lt;br /&gt;
-- con dicho número. Por ejemplo, el árbol de factorización de 60 es&lt;br /&gt;
--        60&lt;br /&gt;
--       /  \&lt;br /&gt;
--      6    10&lt;br /&gt;
--     / \   / \&lt;br /&gt;
--    2   3 2   5&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    arbolFactorizacion :: Int -&amp;gt; Arbol3&lt;br /&gt;
-- tal que (arbolFactorizacion n) es el árbol de factorización de n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    arbolFactorizacion 60 == N3 60 (N3 6 (H3 2) (H3 3)) (N3 10 (H3 2) (H3 5))&lt;br /&gt;
--    arbolFactorizacion 45 == N3 45 (H3 5) (N3 9 (H3 3) (H3 3))&lt;br /&gt;
--    arbolFactorizacion 7  == H3 7&lt;br /&gt;
--    arbolFactorizacion 14 == N3 14 (H3 2) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 28 == N3 28 (N3 4 (H3 2) (H3 2)) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 84 == N3 84 (H3 7) (N3 12 (H3 3) (N3 4 (H3 2) (H3 2)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adriana Gordillo&lt;br /&gt;
arbolFactorizacion :: Int -&amp;gt; Arbol3 Int&lt;br /&gt;
arbolFactorizacion n | primo n    = (H3 n)&lt;br /&gt;
                     | otherwise  = (N3 n i d)&lt;br /&gt;
                     where i = arbolFactorizacion (divisorMedioMenor n)&lt;br /&gt;
                           d = arbolFactorizacion (divisorMedioMayor n)&lt;br /&gt;
&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..n], rem n x == 0]&lt;br /&gt;
divisorMedioMenor n | even (length (divisores n))  = last (take (div (length (divisores n)) 2) (divisores n)) &lt;br /&gt;
                    | otherwise                    = (divisores n) !! (div (length (divisores n)) 2)&lt;br /&gt;
divisorMedioMayor n | even (length (divisores n))  = head (drop (div (length (divisores n)) 2) (divisores n))&lt;br /&gt;
                    | otherwise                    = (divisores n) !! (div (length (divisores n)) 2)&lt;br /&gt;
&lt;br /&gt;
primo n = length (divisores n) == 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--José Manuel García &lt;br /&gt;
listaDivisores :: Integral a =&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
listaDivisores n = ([x | x&amp;lt;- [1..n], rem n x == 0])&lt;br /&gt;
&lt;br /&gt;
cogeMedio n | (not.even) l = [last (take (1+div l 2) (listaDivisores n))]&lt;br /&gt;
            | otherwise = [last (take (div l 2) (listaDivisores n))] ++&lt;br /&gt;
                          [last (take (1+div l 2) (listaDivisores n))]&lt;br /&gt;
          where l = length (listaDivisores n)&lt;br /&gt;
&lt;br /&gt;
arbolFactorizacion :: Int -&amp;gt; Arbol3 Int&lt;br /&gt;
arbolFactorizacion n | 2 == l = H3 n&lt;br /&gt;
                     | otherwise = ( N3 n (arbolFactorizacion (head (cogeMedio n)))&lt;br /&gt;
                                          ((arbolFactorizacion (last (cogeMedio n)))) )  &lt;br /&gt;
                where l = length (listaDivisores n)  &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se consideran los árboles con operaciones booleanas&lt;br /&gt;
-- definidos por   &lt;br /&gt;
--    data ArbolB = HB Bool &lt;br /&gt;
--                | Conj ArbolB ArbolB&lt;br /&gt;
--                | Disy ArbolB ArbolB&lt;br /&gt;
--                | Neg ArbolB&lt;br /&gt;
-- &lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--                Conj                            Conj          &lt;br /&gt;
--               /   \                           /   \          &lt;br /&gt;
--              /     \                         /     \         &lt;br /&gt;
--           Disy      Conj                  Disy      Conj     &lt;br /&gt;
--          /   \       /  \                /   \      /   \    &lt;br /&gt;
--       Conj    Neg   Neg True          Conj    Neg   Neg  True &lt;br /&gt;
--       /  \    |     |                 /  \    |     |        &lt;br /&gt;
--    True False False False          True False True  False     &lt;br /&gt;
--&lt;br /&gt;
-- se definen por&lt;br /&gt;
--    ej1, ej2:: ArbolB&lt;br /&gt;
--    ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB False)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
--    &lt;br /&gt;
--    ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB True)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorB :: ArbolB -&amp;gt; Bool&lt;br /&gt;
-- tal que (valorB ar) es el resultado de procesar el árbol realizando&lt;br /&gt;
-- las operaciones booleanas especificadas en los nodos. Por ejemplo,&lt;br /&gt;
--    valorB ej1 == True&lt;br /&gt;
--    valorB ej2 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolB = HB Bool &lt;br /&gt;
            | Conj ArbolB ArbolB&lt;br /&gt;
            | Disy ArbolB ArbolB&lt;br /&gt;
            | Neg ArbolB&lt;br /&gt;
&lt;br /&gt;
ej1, ej2:: ArbolB&lt;br /&gt;
ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB False)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB True)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
valorB :: ArbolB -&amp;gt; Bool&lt;br /&gt;
valorB (HB a) = a&lt;br /&gt;
valorB (Conj i d) = valorB i &amp;amp;&amp;amp; valorB d&lt;br /&gt;
valorB (Disy i d) = valorB i || valorB d&lt;br /&gt;
valorB (Neg x) = not (valorB x)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Los árboles generales se pueden representar mediante el&lt;br /&gt;
-- siguiente tipo de dato  &lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--                  deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3               3&lt;br /&gt;
--     / \             /|\            / | \&lt;br /&gt;
--    2   3           / | \          /  |  \&lt;br /&gt;
--        |          5  4  7        5   4   7&lt;br /&gt;
--        4          |     /\       |   |  / \&lt;br /&gt;
--                   6    2  1      6   1 2   1&lt;br /&gt;
--                                     / \&lt;br /&gt;
--                                    2   3&lt;br /&gt;
--                                        |&lt;br /&gt;
--                                        4&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
--    ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
--    ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (ramifica a1 a2 p) el árbol que resulta de ańadir una copia&lt;br /&gt;
-- del árbol a2 a los nodos de a1 que cumplen un predicado p. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;4) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;3) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []]]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;2) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;1) =&amp;gt; NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;0) =&amp;gt; NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []],NG 8 []]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
              deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
&lt;br /&gt;
-- Nicolás Rodríguez, Elsa Domínguez&lt;br /&gt;
ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
ramifica (NG a []) x p | p a        = NG a [x]&lt;br /&gt;
                       | otherwise  = NG a []&lt;br /&gt;
ramifica (NG a xs) x p | p a        = NG a ([ramifica ys x p | ys &amp;lt;- xs] ++ [x])&lt;br /&gt;
                       | otherwise  = NG a [ramifica ys x p | ys &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--José Manuel García &lt;br /&gt;
ramifica1 :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
ramifica1 (NG x xs) (a) f | (f x) = (NG x ( ([ramifica1 y a f | y &amp;lt;-xs ]) ++ [a] ) )&lt;br /&gt;
                         | otherwise = (NG x ([ramifica1 y a f | y &amp;lt;-xs ]) )&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir la función&lt;br /&gt;
--    nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (nHojas x) es el número de hojas del árbol x. Por ejemplo,&lt;br /&gt;
--    nHojasG ejG1  ==  2&lt;br /&gt;
--    nHojasG ejG2  ==  4&lt;br /&gt;
--    nHojasG ejG3  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez&lt;br /&gt;
nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
nHojasG (NG _ []) = 1&lt;br /&gt;
nHojasG (NG _ xs) = sum [nHojasG ys | ys &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir la función&lt;br /&gt;
--    profundidad :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (profundidadG x) es la profundidad del árbol x. Por ejemplo,&lt;br /&gt;
--    profundidadG ejG1  ==  2&lt;br /&gt;
--    profundidadG ejG2  ==  2&lt;br /&gt;
--    profundidadG ejG3  ==  4&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez&lt;br /&gt;
profundidadG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
profundidadG (NG _ []) = 0&lt;br /&gt;
profundidadG (NG _ xs) = 1 + maximum [profundidadG ys | ys &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.4. Definir la función&lt;br /&gt;
--    bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (bin2gen x) es la traducción del árbol x definido con el tipo&lt;br /&gt;
-- &amp;quot;Arbol3&amp;quot; (es decir, árbol binario) a &amp;quot;ArbolG&amp;quot; (es decir, árbol&lt;br /&gt;
-- genérico). Por ejemplo,&lt;br /&gt;
--    bin2gen (N3 9 (N3 3 (H3 2) (H3 4)) (H3 7)) ==  (NG 9 [NG 3 [NG 2 [],NG 4 []], NG 7 []])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez, Adriana Gordillo&lt;br /&gt;
bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
bin2gen (H3 a) = NG a []&lt;br /&gt;
bin2gen (N3 a i d) = NG a [bin2gen i, bin2gen d]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Las expresiones aritméticas básicas pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr1 = C1 Int &lt;br /&gt;
--               | S1 Expr1 Expr1 &lt;br /&gt;
--               | P1 Expr1 Expr1  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(3+7) se representa por&lt;br /&gt;
--    P1 (C1 2) (S1 (C1 3) (C1 7))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor e) es el valor de la expresión aritmética e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valor (P1 (C1 2) (S1 (C1 3) (C1 7)))  ==  20&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr1 = C1 Int &lt;br /&gt;
           | S1 Expr1 Expr1 &lt;br /&gt;
           | P1 Expr1 Expr1  &lt;br /&gt;
           deriving Show&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez, Adriana Gordillo                  &lt;br /&gt;
valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
valor (C1 a) = a&lt;br /&gt;
valor (S1 i d) = valor i + valor d&lt;br /&gt;
valor (P1 i d) = valor i * valor d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir la función  &lt;br /&gt;
--    aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
-- tal que (aplica f e) es la expresión obtenida aplicando la función f&lt;br /&gt;
-- a cada uno de los números de la expresión e. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; aplica (+2) (S1 (P1 (C1 3) (C1 5)) (P1 (C1 6) (C1 7)))&lt;br /&gt;
--    S1 (P1 (C1 5) (C1 7)) (P1 (C1 8) (C1 9))&lt;br /&gt;
--    ghci&amp;gt; aplica (*2) (S1 (P1 (C1 3) (C1 5)) (P1 (C1 6) (C1 7)))&lt;br /&gt;
--    S1 (P1 (C1 6) (C1 10)) (P1 (C1 12) (C1 14))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez, Adriana Gordillo&lt;br /&gt;
aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
aplica f (C1 a) = C1 (f a)&lt;br /&gt;
aplica f (S1 i d) = S1 (aplica f i) (aplica f d)&lt;br /&gt;
aplica f (P1 i d) = P1 (aplica f i) (aplica f d)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Las expresiones aritméticas construidas con una&lt;br /&gt;
-- variable (denotada por X), los números enteros y las operaciones de&lt;br /&gt;
-- sumar y multiplicar se pueden representar mediante el tipo de datos&lt;br /&gt;
-- Expr2 definido por     &lt;br /&gt;
--    data Expr2 = X&lt;br /&gt;
--               | C2 Int&lt;br /&gt;
--               | S2 Expr2 Expr2&lt;br /&gt;
--               | P2 Expr2 Expr2&lt;br /&gt;
-- Por ejemplo, la expresión &amp;quot;X*(13+X)&amp;quot; se representa por&lt;br /&gt;
-- &amp;quot;P2 X (S2 (C2 13) X)&amp;quot;.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
-- tal que (valorE e n) es el valor de la expresión e cuando se&lt;br /&gt;
-- sustituye su variable por n. Por ejemplo,&lt;br /&gt;
--    valorE (P2 X (S2 (C2 13) X)) 2  ==  30&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Expr2 = X&lt;br /&gt;
           | C2 Int&lt;br /&gt;
           | S2 Expr2 Expr2&lt;br /&gt;
           | P2 Expr2 Expr2&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
valorE X n = n&lt;br /&gt;
valorE (C2 a) n = a&lt;br /&gt;
valorE (S2 i d) n = (valorE i n) + (valorE d n)&lt;br /&gt;
valorE (P2 i d) n = (valorE i n)*(valorE d n)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Definir la función&lt;br /&gt;
--    numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
-- tal que (numVars e) es el número de variables en la expresión e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    numVars (C2 3)                 ==  0&lt;br /&gt;
--    numVars X                      ==  1&lt;br /&gt;
--    numVars (P2 X (S2 (C2 13) X))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
numVars X = 1&lt;br /&gt;
numVars (C2 _) = 0&lt;br /&gt;
numVars (S2 i d) = numVars i + numVars d&lt;br /&gt;
numVars (P2 i d) = numVars i + numVars d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Las expresiones aritméticas con variables pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr3 = C3 Int &lt;br /&gt;
--               | V3 Char &lt;br /&gt;
--               | S3 Expr3 Expr3 &lt;br /&gt;
--               | P3 Expr3 Expr3  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(a+5) se representa por&lt;br /&gt;
--    P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (C3 5))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor3 x e) es el valor3 de la expresión x en el entorno e (es&lt;br /&gt;
-- decir, el valor3 de la expresión donde las variables de x se sustituyen&lt;br /&gt;
-- por los valores según se indican en el entorno e). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; valor3 (P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (V3 &amp;#039;b&amp;#039;))) [(&amp;#039;a&amp;#039;,2),(&amp;#039;b&amp;#039;,5)]&lt;br /&gt;
--    14&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr3 = C3 Int &lt;br /&gt;
           | V3 Char &lt;br /&gt;
           | S3 Expr3 Expr3 &lt;br /&gt;
           | P3 Expr3 Expr3  &lt;br /&gt;
           deriving Show&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez                   &lt;br /&gt;
valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
valor3 (C3 a) _ = a&lt;br /&gt;
valor3 (V3 a) e = head [n | (x,n) &amp;lt;- e, x == a]  &lt;br /&gt;
valor3 (S3 i d) e = (valor3 i e) + (valor3 d e)&lt;br /&gt;
valor3 (P3 i d) e = (valor3 i e)*(valor3 d e)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir la función&lt;br /&gt;
--    sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
-- tal que (sumas e) es el número de sumas en la expresión e. Por &lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  1&lt;br /&gt;
--    sumas (S3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  2&lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (P3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez                    &lt;br /&gt;
sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
sumas (C3 _) = 0&lt;br /&gt;
sumas (V3 _) = 0&lt;br /&gt;
sumas (S3 i d) = 1 + sumas i + sumas d&lt;br /&gt;
sumas (P3 i d) = sumas i + sumas d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Definir la función&lt;br /&gt;
--    sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
-- tal que (sustitucion e s) es la expresión obtenida sustituyendo las&lt;br /&gt;
-- variables de la expresión e según se indica en la sustitución s. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (C3 7))&lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez                    &lt;br /&gt;
sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
sustitucion (C3 a) s = C3 a&lt;br /&gt;
sustitucion (V3 b) s | not (null [n | (x,n) &amp;lt;- s, x == b])  = C3 (head [n | (x,n) &amp;lt;- s, x == b])&lt;br /&gt;
                     | otherwise                            = V3 b&lt;br /&gt;
sustitucion (S3 i d) s = S3 (sustitucion i s) (sustitucion d s)&lt;br /&gt;
sustitucion (P3 i d) s = P3 (sustitucion i s) (sustitucion d s)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.4. Definir la función&lt;br /&gt;
--    reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (reducible a) se verifica si a es una expresión reducible; es&lt;br /&gt;
-- decir, contiene una operación en la que los dos operandos son números. &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    reducible (S3 (C3 3) (C3 4))               == True&lt;br /&gt;
--    reducible (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))             == False&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (C3 4) (C3 5)))   == True&lt;br /&gt;
--    reducible (S3 (V3 &amp;#039;x&amp;#039;) (P3 (C3 4) (C3 5))) == True&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (V3 &amp;#039;x&amp;#039;) (C3 5))) == False&lt;br /&gt;
--    reducible (C3 3)                           == False&lt;br /&gt;
--    reducible (V3 &amp;#039;x&amp;#039;)                         == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
reducible (C3 _) = False&lt;br /&gt;
reducible (V3 _) = False&lt;br /&gt;
reducible (S3 (C3 _) (C3 _)) = True&lt;br /&gt;
reducible (P3 (C3 _) (C3 _)) = True&lt;br /&gt;
reducible (S3 i d) = reducible i || reducible d&lt;br /&gt;
reducible (P3 i d) = reducible i || reducible d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Las expresiones aritméticas generales se pueden definir&lt;br /&gt;
-- usando el siguiente tipo de datos &lt;br /&gt;
--    data Expr4 = C4 Int &lt;br /&gt;
--               | Y &lt;br /&gt;
--               | S4 Expr4 Expr4 &lt;br /&gt;
--               | R4 Expr4 Expr4 &lt;br /&gt;
--               | P4 Expr4 Expr4 &lt;br /&gt;
--               | E4 Expr4 Int&lt;br /&gt;
--               deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, la expresión &lt;br /&gt;
--    3*x - (x+2)^7&lt;br /&gt;
-- se puede definir por&lt;br /&gt;
--    R4 (P4 (C4 3) Y) (E4 (S4 Y (C4 2)) 7)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función  &lt;br /&gt;
--    maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
-- tal que (maximo e xs) es el par formado por el máximo valor de la&lt;br /&gt;
-- expresión e para los puntos de xs y en qué puntos alcanza el&lt;br /&gt;
-- máximo. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; maximo (E4 (S4 (C4 10) (P4 (R4 (C4 1) Y) Y)) 2) [-3..3]&lt;br /&gt;
--    (100,[0,1])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr4 = C4 Int &lt;br /&gt;
          | Y &lt;br /&gt;
          | S4 Expr4 Expr4 &lt;br /&gt;
          | R4 Expr4 Expr4 &lt;br /&gt;
          | P4 Expr4 Expr4 &lt;br /&gt;
          | E4 Expr4 Int&lt;br /&gt;
          deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
maximo e ns = (maximum [valor4 e n | n &amp;lt;- ns], [n | n &amp;lt;- ns, valor4 e n == maximum [valor4 e n | n &amp;lt;- ns]])&lt;br /&gt;
&lt;br /&gt;
valor4 (C4 a) _ = a&lt;br /&gt;
valor4 Y n = n&lt;br /&gt;
valor4 (S4 i d) n = valor4 i n + valor4 d n&lt;br /&gt;
valor4 (R4 i d) n = valor4 i n - valor4 d n&lt;br /&gt;
valor4 (P4 i d) n = (valor4 i n)*(valor4 d n)&lt;br /&gt;
valor4 (E4 i x) n = (valor4 i n)^x&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Las operaciones de suma, resta y multiplicación se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de datos &lt;br /&gt;
--    data Op = Su | Re | Mu&lt;br /&gt;
-- La expresiones aritméticas con dichas operaciones se pueden&lt;br /&gt;
-- representar mediante el siguiente tipo de dato algebraico&lt;br /&gt;
--    data Expr5 = C5 Int &lt;br /&gt;
--               | A Op Expr5 Expr&lt;br /&gt;
-- Por ejemplo, la expresión&lt;br /&gt;
--    (7-3)+(2*5)&lt;br /&gt;
-- se representa por&lt;br /&gt;
--    A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
-- tal que (valorEG e) es el valorEG de la expresión e. Por ejemplo,&lt;br /&gt;
--    valorEG (A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5)))  ==  14&lt;br /&gt;
--    valorEG (A Mu (A Re (C5 7) (C5 3)) (A Su (C5 2) (C5 5)))  ==  28&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Op = Su | Re | Mu&lt;br /&gt;
&lt;br /&gt;
data Expr5 = C5 Int | A Op Expr5 Expr5&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
valorEG (C5 a) = a&lt;br /&gt;
valorEG (A Su i d) = valorEG i + valorEG d&lt;br /&gt;
valorEG (A Re i d) = valorEG i - valorEG d&lt;br /&gt;
valorEG (A Mu i d) = (valorEG i)*(valorEG d)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Se consideran las expresiones vectoriales formadas por&lt;br /&gt;
-- un vector, la suma de dos expresiones vectoriales o el producto de un&lt;br /&gt;
-- entero por una expresión vectorial. El siguiente tipo de dato define&lt;br /&gt;
-- las expresiones vectoriales  &lt;br /&gt;
--    data ExpV = Vec Int Int&lt;br /&gt;
--              | Sum ExpV ExpV&lt;br /&gt;
--              | Mul Int ExpV&lt;br /&gt;
--              deriving Show&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que (valorEV e) es el valorEV de la expresión vectorial c. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valorEV (Vec 1 2)                                  ==  (1,2)&lt;br /&gt;
--    valorEV (Sum (Vec 1 2 ) (Vec 3 4))                 ==  (4,6)&lt;br /&gt;
--    valorEV (Mul 2 (Vec 3 4))                          ==  (6,8)&lt;br /&gt;
--    valorEV (Mul 2 (Sum (Vec 1 2 ) (Vec 3 4)))         ==  (8,12)&lt;br /&gt;
--    valorEV (Sum (Mul 2 (Vec 1 2)) (Mul 2 (Vec 3 4)))  ==  (8,12)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ExpV = Vec Int Int&lt;br /&gt;
          | Sum ExpV ExpV&lt;br /&gt;
          | Mul Int ExpV&lt;br /&gt;
          deriving Show&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
valorEV (Vec a b) = (a,b)&lt;br /&gt;
valorEV (Sum i d) = (fst (valorEV i) + fst (valorEV d), snd (valorEV i) + snd (valorEV d))&lt;br /&gt;
valorEV (Mul i d) = (i*fst (valorEV d), i*snd (valorEV d))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. (Examen 12 de marzo de 2015, grupo 4)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Consideremos los árboles binarios con etiquetas en las&lt;br /&gt;
-- hojas y en los nodos. Por ejemplo,&lt;br /&gt;
--          5       &lt;br /&gt;
--         / \      &lt;br /&gt;
--        2   4      &lt;br /&gt;
--           / \    &lt;br /&gt;
--          7   1&lt;br /&gt;
--             / \&lt;br /&gt;
--            2   3   &lt;br /&gt;
-- &lt;br /&gt;
-- Un camino es una sucesión de nodos desde la raiz hasta una hoja. Por&lt;br /&gt;
-- ejemplo, [5,2] y [5,4,1,2] son caminos que llevan a 2, mientras que&lt;br /&gt;
-- [5,4,1] no es un camino, pues no lleva a una hoja.&lt;br /&gt;
-- &lt;br /&gt;
-- Definimos el tipo de dato Arbol y el ejemplo por&lt;br /&gt;
--    data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
--    &lt;br /&gt;
--    arb1:: Arbol &lt;br /&gt;
--    arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    maxLong :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
-- tal que (maxLong x a) es la longitud máxima de los caminos que&lt;br /&gt;
-- terminan en x. Por ejemplo, &lt;br /&gt;
--    maxLong 3 arb1 == 4&lt;br /&gt;
--    maxLong 2 arb1 == 4&lt;br /&gt;
--    maxLong 7 arb1 == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
             deriving Show&lt;br /&gt;
&lt;br /&gt;
arb1:: Arbol &lt;br /&gt;
arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
maxLong :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
maxLong x a | not (null (caminos x a))  = maximum (map (length) (caminos x a)) &lt;br /&gt;
            | otherwise                 = 0&lt;br /&gt;
            &lt;br /&gt;
caminos x (H a) | x == a     = [[a]]&lt;br /&gt;
                | otherwise  = []&lt;br /&gt;
caminos x (N i a d) = map (a:) (caminos x i ++ caminos x d)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. (Examen 5 de diciembre de 2017, grupo 1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles con un número variable de sucesores se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de dato&lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1         1             1          &lt;br /&gt;
--     / \       / \           / \   &lt;br /&gt;
--    8   3     8   3         8   3  &lt;br /&gt;
--        |        /|\       /|\  |   &lt;br /&gt;
--        4       4 5 6     4 5 6 7&lt;br /&gt;
-- se representan por&lt;br /&gt;
--   ej21, ej22, ej23 :: ArbolG Int&lt;br /&gt;
--   ej21 = NG 1 [NG 8 [],NG 3 [NG 4 []]]&lt;br /&gt;
--   ej22 = NG 1 [NG 8 [], NG 3 [NG 4 [], NG 5 [], NG 6 []]]&lt;br /&gt;
--   ej23 = NG 1 [NG 8 [NG 4 [], NG 5 [], NG 6 []], NG 3 [NG 7 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     caminosDesdeRaiz :: ArbolG a -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (caminosDesdeRaiz x) es la lista de todos los caminos desde&lt;br /&gt;
-- la raiz. Por ejemplo,&lt;br /&gt;
--     caminosDesdeRaiz ej21 == [[1,8],[1,3,4]]&lt;br /&gt;
--     caminosDesdeRaiz ej22 == [[1,8],[1,3,4],[1,3,5],[1,3,6]]&lt;br /&gt;
--     caminosDesdeRaiz ej23 == [[1,8,4],[1,8,5],[1,8,6],[1,3,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ej21, ej22, ej23 :: ArbolG Int&lt;br /&gt;
ej21 = NG 1 [NG 8 [],NG 3 [NG 4 []]]&lt;br /&gt;
ej22 = NG 1 [NG 8 [], NG 3 [NG 4 [], NG 5 [], NG 6 []]]&lt;br /&gt;
ej23 = NG 1 [NG 8 [NG 4 [], NG 5 [], NG 6 []], NG 3 [NG 7 []]]&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez Ruiz&lt;br /&gt;
-- Dos versiones:&lt;br /&gt;
caminosDesdeRaiz :: ArbolG a -&amp;gt; [[a]]&lt;br /&gt;
caminosDesdeRaiz (NG a []) = [[a]]&lt;br /&gt;
caminosDesdeRaiz (NG a xs) = map (a:) (concat [(caminosDesdeRaiz x) | x &amp;lt;- xs])&lt;br /&gt;
&lt;br /&gt;
caminosDesdeRaiz2 :: ArbolG a -&amp;gt; [[a]]&lt;br /&gt;
caminosDesdeRaiz2 (NG a []) = [[a]]&lt;br /&gt;
caminosDesdeRaiz2 (NG a xs) =  [a:ys | y &amp;lt;- xs, ys &amp;lt;- caminosDesdeRaiz2 y]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. (Examen 1 de septiembre de 2016)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles se pueden representar mediante el siguiente&lt;br /&gt;
-- tipo de datos &lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3&lt;br /&gt;
--     / \             /|\ &lt;br /&gt;
--    2   3           / | \&lt;br /&gt;
--        |          5  4  7&lt;br /&gt;
--        4          |     /\ &lt;br /&gt;
--                   6    2  1&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ej31, ej32 :: ArbolG Int&lt;br /&gt;
--    ej31 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ej32 = NG 3 [NG 5 [NG 6 []], NG 4 [], NG 7 [NG 2 [], NG 1 []]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    ramasLargas :: ArbolG b -&amp;gt; [[b]]&lt;br /&gt;
-- tal que (ramasLargas a) es la lista de las ramas más largas del árbol&lt;br /&gt;
-- a. Por ejemplo, &lt;br /&gt;
--    ramas ej31  ==  [[1,3,4]]&lt;br /&gt;
--    ramas ej32  ==  [[3,5,6],[3,7,2],[3,7,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ej31, ej32 :: ArbolG Int&lt;br /&gt;
ej31 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
ej32 = NG 3 [NG 5 [NG 6 []], NG 4 [], NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
ramasLargas :: ArbolG b -&amp;gt; [[b]]&lt;br /&gt;
ramasLargas a = [as | as &amp;lt;- caminosDesdeRaiz a, length as == maximum [length as | as &amp;lt;- caminosDesdeRaiz a]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13&amp;diff=595</id>
		<title>Relación 13</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13&amp;diff=595"/>
		<updated>2022-01-16T13:20:26Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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: Relación 13 (14 de enero de 2022)&lt;br /&gt;
-- Tipos de datos algebraicos (II).&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 presenta ejercicios sobre distintos tipos de&lt;br /&gt;
-- datos algebraicos. Concretamente,&lt;br /&gt;
--    * Árboles binarios:&lt;br /&gt;
--      + Árboles binarios con valores en los nodos.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas y en los nodos.&lt;br /&gt;
--      + Árboles booleanos.  &lt;br /&gt;
--    * Árboles generales&lt;br /&gt;
--    * Expresiones aritméticas&lt;br /&gt;
--      + Expresiones aritméticas básicas.&lt;br /&gt;
--      + Expresiones aritméticas con una variable.&lt;br /&gt;
--      + Expresiones aritméticas con varias variables.&lt;br /&gt;
--      + Expresiones aritméticas generales. &lt;br /&gt;
--      + Expresiones aritméticas con tipo de operaciones.&lt;br /&gt;
--    * Expresiones vectoriales&lt;br /&gt;
-- &lt;br /&gt;
-- Los ejercicios corresponden al tema 9 que se encuentran en &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/temas/tema-9.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Los árboles binarios con valores en los nodos se&lt;br /&gt;
-- pueden definir por&lt;br /&gt;
--    data Arbol1 a = H1 &lt;br /&gt;
--                  | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
--                  deriving (Show, Eq)&lt;br /&gt;
-- Por ejemplo, el árbol&lt;br /&gt;
--         9                &lt;br /&gt;
--        / \    &lt;br /&gt;
--       /   \   &lt;br /&gt;
--      8     6  &lt;br /&gt;
--     / \   / \ &lt;br /&gt;
--    3   2 4   5&lt;br /&gt;
-- se puede representar por&lt;br /&gt;
--    N1 9 (N1 8 (N1 3 H1 H1) (N1 2 H1 H1)) (N1 6 (N1 4 H1 H1) (N1 5 H1 H1))&lt;br /&gt;
--&lt;br /&gt;
-- Definir por recursión la función &lt;br /&gt;
--    sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
-- tal (sumaArbol x) es la suma de los valores que hay en el árbol&lt;br /&gt;
-- x. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; sumaArbol (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))  &lt;br /&gt;
--    21&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol1 a = H1 &lt;br /&gt;
             | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
&lt;br /&gt;
sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
sumaArbol = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sumaArbol1 :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
sumaArbol1 (H1 ) = 0&lt;br /&gt;
sumaArbol1 (N1 x i d) = x + (sumaArbol1 i) + (sumaArbol1 d)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la función &lt;br /&gt;
--    mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
-- tal que (mapArbol f x) es el árbol que resulta de sustituir cada nodo&lt;br /&gt;
-- n del árbol x por (f n). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; mapArbol (+1) (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    N1 3 (N1 6 (N1 4 H1 H1) (N1 8 H1 H1)) (N1 5 H1 H1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
mapArbol = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
mapArbol1 :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
mapArbol1 f (H1) = (H1)&lt;br /&gt;
mapArbol1 f (N1 x i d) = (N1 (f x) (mapArbol1 f i) (mapArbol1 f d))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la función&lt;br /&gt;
--    ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (ramaIzquierda a) es la lista de los valores de los nodos de&lt;br /&gt;
-- la rama izquierda del árbol a. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; ramaIzquierda (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    [2,5,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
ramaIzquierda = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
ramaIzquierda1 :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
ramaIzquierda1 (H1 ) = []&lt;br /&gt;
ramaIzquierda1 (N1 x i d) = x : ramaIzquierda1 (i)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.4. Diremos que un árbol está balanceado si para cada nodo&lt;br /&gt;
-- v la diferencia entre el número de nodos (con valor) de sus subárboles&lt;br /&gt;
-- izquierdo y derecho es menor o igual que uno.  &lt;br /&gt;
--&lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (balanceado a) se verifica si el árbol a está balanceado. Por &lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 H1 H1))           == True&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 (N1 4 H1 H1) H1)) == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
balanceado = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
cuantosNodos H1 = 0&lt;br /&gt;
cuantosNodos (N1 x i d) = 1 + (cuantosNodos i) + (cuantosNodos d)&lt;br /&gt;
&lt;br /&gt;
balanceado1 :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
balanceado1 H1 = True&lt;br /&gt;
balanceado1 (N1 x i d) | (cuantosNodos i) - (cuantosNodos d) &amp;lt;= 1 =&lt;br /&gt;
                                               (balanceado1 i) &amp;amp;&amp;amp; (balanceado1 d)&lt;br /&gt;
                      | otherwise = False&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Los árboles binarios con valores en las hojas se pueden&lt;br /&gt;
-- definir por&lt;br /&gt;
--    data Arbol2 a = H2 a&lt;br /&gt;
--                  | N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
--                  deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles &lt;br /&gt;
--    árbol1          árbol2       árbol3     árbol4 &lt;br /&gt;
--       o              o           o           o    &lt;br /&gt;
--      / \            / \         / \         / \   &lt;br /&gt;
--     1   o          o   3       o   3       o   1  &lt;br /&gt;
--        / \        / \         / \         / \     &lt;br /&gt;
--       2   3      1   2       1   4       2   3    &lt;br /&gt;
-- se representan por&lt;br /&gt;
--    arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
--    arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
--    arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
--    arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
--    arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualBorde t1 t2) se verifica si los bordes de los árboles&lt;br /&gt;
-- t1 y t2 son iguales. Por ejemplo,&lt;br /&gt;
--    igualBorde arbol1 arbol2  ==  True&lt;br /&gt;
--    igualBorde arbol1 arbol3  ==  False&lt;br /&gt;
--    igualBorde arbol1 arbol4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol2 a = N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
              | H2 a&lt;br /&gt;
              deriving Show&lt;br /&gt;
&lt;br /&gt;
arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
&lt;br /&gt;
igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
igualBorde t1 t2 = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
igualBorde1 :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
igualBorde1 t1 t2 = (listaBorde t1) == (listaBorde t2)&lt;br /&gt;
&lt;br /&gt;
listaBorde (N2 i d) = (listaBorde i) ++ (listaBorde d) &lt;br /&gt;
listaBorde (H2 x) = [x] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Los árboles binarios con valores en las hojas y en los&lt;br /&gt;
-- nodos se definen por&lt;br /&gt;
--    data Arbol3 a = H3 a&lt;br /&gt;
--                 | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--         5              8             5           5&lt;br /&gt;
--        / \            / \           / \         / \&lt;br /&gt;
--       /   \          /   \         /   \       /   \&lt;br /&gt;
--      9     7        9     3       9     2     4     7&lt;br /&gt;
--     / \   / \      / \   / \     / \               / \&lt;br /&gt;
--    1   4 6   8    1   4 6   2   1   4             6   2&lt;br /&gt;
-- se pueden representar por&lt;br /&gt;
--    ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
--    ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
--    ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
--    ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
--    ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualEstructura :: Arbol3 -&amp;gt; Arbol3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualEstructura a1 a1) se verifica si los árboles a1 y a2 &lt;br /&gt;
-- tienen la misma estructura. Por ejemplo,&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol2 == True&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol3 == False&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol4 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol3 a = H3 a&lt;br /&gt;
              | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
              deriving Show&lt;br /&gt;
&lt;br /&gt;
ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
&lt;br /&gt;
igualEstructura :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
igualEstructura = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
arbolEstructura (H3 x) = (H3 0)&lt;br /&gt;
arbolEstructura (N3 x i d) = (N3 0 (arbolEstructura i) (arbolEstructura d))&lt;br /&gt;
--Si fuera deriving (Show,Eq):&lt;br /&gt;
--igualEstructura1 :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
--igualEstructura1 t1 t2 = (arbolEstructura t1) == (arbolEstructura t2)&lt;br /&gt;
--Pero como es deriving Show :&lt;br /&gt;
igualEstructura1 :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
igualEstructura1 t1 t2 = show (arbolEstructura t1) == show (arbolEstructura t2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir la función&lt;br /&gt;
--    algunoArbol :: Arbol3 t -&amp;gt; (t -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
-- tal que (algunoArbol a p) se verifica si algún elemento del árbol a&lt;br /&gt;
-- cumple la propiedad p. Por ejemplo,&lt;br /&gt;
--    algunoArbol3 (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;4)  ==  True&lt;br /&gt;
--    algunoArbol3 (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;7)  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
algunoArbol :: Arbol3 a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
algunoArbol = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
algunoArbol3 :: Arbol3 a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
algunoArbol3 (H3 x) p = (p x)&lt;br /&gt;
algunoArbol3 (N3 x i d) p = (p x) || (algunoArbol3 i p) || (algunoArbol3 d p)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Un elemento de un árbol se dirá de nivel k si aparece&lt;br /&gt;
-- en el árbol a distancia k  de la raíz.  &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (nivel k a) es la lista de los elementos de nivel k del árbol&lt;br /&gt;
-- a. Por ejemplo,&lt;br /&gt;
--    nivel 0 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [7]&lt;br /&gt;
--    nivel 1 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [2,9]&lt;br /&gt;
--    nivel 2 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [5,4]&lt;br /&gt;
--    nivel 3 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
nivel = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
nivel1 :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
nivel1 n (H3 x) | n == 0 = [x]&lt;br /&gt;
               | otherwise = []&lt;br /&gt;
nivel1 n (N3 x i d) | n == 0 = [x]&lt;br /&gt;
                   | otherwise = (nivel1 (n-1) i) ++ (nivel1 (n-1) d)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.4.  Los divisores medios de un número son los que ocupan&lt;br /&gt;
-- la posición media entre los divisores de n, ordenados de menor a&lt;br /&gt;
-- mayor. Por ejemplo, los divisores de 60 son &lt;br /&gt;
-- [1,2,3,4,5,6,10,12,15,20,30,60] y sus divisores medios son 6 y 10.&lt;br /&gt;
-- &lt;br /&gt;
-- El árbol de factorización de un número compuesto n se construye de la&lt;br /&gt;
-- siguiente manera: &lt;br /&gt;
--    * la raíz es el número n, &lt;br /&gt;
--    * la rama izquierda es el árbol de factorización de su divisor&lt;br /&gt;
--      medio menor y&lt;br /&gt;
--    * la rama derecha es el árbol de factorización de su divisor&lt;br /&gt;
--      medio mayor&lt;br /&gt;
-- Si el número es primo, su árbol de factorización sólo tiene una hoja&lt;br /&gt;
-- con dicho número. Por ejemplo, el árbol de factorización de 60 es&lt;br /&gt;
--        60&lt;br /&gt;
--       /  \&lt;br /&gt;
--      6    10&lt;br /&gt;
--     / \   / \&lt;br /&gt;
--    2   3 2   5&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    arbolFactorizacion :: Int -&amp;gt; Arbol3&lt;br /&gt;
-- tal que (arbolFactorizacion n) es el árbol de factorización de n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    arbolFactorizacion 60 == N3 60 (N3 6 (H3 2) (H3 3)) (N3 10 (H3 2) (H3 5))&lt;br /&gt;
--    arbolFactorizacion 45 == N3 45 (H3 5) (N3 9 (H3 3) (H3 3))&lt;br /&gt;
--    arbolFactorizacion 7  == H3 7&lt;br /&gt;
--    arbolFactorizacion 14 == N3 14 (H3 2) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 28 == N3 28 (N3 4 (H3 2) (H3 2)) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 84 == N3 84 (H3 7) (N3 12 (H3 3) (N3 4 (H3 2) (H3 2)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adriana Gordillo&lt;br /&gt;
arbolFactorizacion :: Int -&amp;gt; Arbol3 Int&lt;br /&gt;
arbolFactorizacion n | primo n    = (H3 n)&lt;br /&gt;
                     | otherwise  = (N3 n i d)&lt;br /&gt;
                     where i = arbolFactorizacion (divisorMedioMenor n)&lt;br /&gt;
                           d = arbolFactorizacion (divisorMedioMayor n)&lt;br /&gt;
&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..n], rem n x == 0]&lt;br /&gt;
divisorMedioMenor n | even (length (divisores n))  = last (take (div (length (divisores n)) 2) (divisores n)) &lt;br /&gt;
                    | otherwise                    = (divisores n) !! (div (length (divisores n)) 2)&lt;br /&gt;
divisorMedioMayor n | even (length (divisores n))  = head (drop (div (length (divisores n)) 2) (divisores n))&lt;br /&gt;
                    | otherwise                    = (divisores n) !! (div (length (divisores n)) 2)&lt;br /&gt;
&lt;br /&gt;
primo n = length (divisores n) == 2&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se consideran los árboles con operaciones booleanas&lt;br /&gt;
-- definidos por   &lt;br /&gt;
--    data ArbolB = HB Bool &lt;br /&gt;
--                | Conj ArbolB ArbolB&lt;br /&gt;
--                | Disy ArbolB ArbolB&lt;br /&gt;
--                | Neg ArbolB&lt;br /&gt;
-- &lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--                Conj                            Conj          &lt;br /&gt;
--               /   \                           /   \          &lt;br /&gt;
--              /     \                         /     \         &lt;br /&gt;
--           Disy      Conj                  Disy      Conj     &lt;br /&gt;
--          /   \       /  \                /   \      /   \    &lt;br /&gt;
--       Conj    Neg   Neg True          Conj    Neg   Neg  True &lt;br /&gt;
--       /  \    |     |                 /  \    |     |        &lt;br /&gt;
--    True False False False          True False True  False     &lt;br /&gt;
--&lt;br /&gt;
-- se definen por&lt;br /&gt;
--    ej1, ej2:: ArbolB&lt;br /&gt;
--    ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB False)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
--    &lt;br /&gt;
--    ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB True)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorB :: ArbolB -&amp;gt; Bool&lt;br /&gt;
-- tal que (valorB ar) es el resultado de procesar el árbol realizando&lt;br /&gt;
-- las operaciones booleanas especificadas en los nodos. Por ejemplo,&lt;br /&gt;
--    valorB ej1 == True&lt;br /&gt;
--    valorB ej2 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolB = HB Bool &lt;br /&gt;
            | Conj ArbolB ArbolB&lt;br /&gt;
            | Disy ArbolB ArbolB&lt;br /&gt;
            | Neg ArbolB&lt;br /&gt;
&lt;br /&gt;
ej1, ej2:: ArbolB&lt;br /&gt;
ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB False)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB True)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
valorB:: ArbolB -&amp;gt; Bool&lt;br /&gt;
valorB = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Los árboles generales se pueden representar mediante el&lt;br /&gt;
-- siguiente tipo de dato  &lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--                  deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3               3&lt;br /&gt;
--     / \             /|\            / | \&lt;br /&gt;
--    2   3           / | \          /  |  \&lt;br /&gt;
--        |          5  4  7        5   4   7&lt;br /&gt;
--        4          |     /\       |   |  / \&lt;br /&gt;
--                   6    2  1      6   1 2   1&lt;br /&gt;
--                                     / \&lt;br /&gt;
--                                    2   3&lt;br /&gt;
--                                        |&lt;br /&gt;
--                                        4&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
--    ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
--    ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (ramifica a1 a2 p) el árbol que resulta de ańadir una copia&lt;br /&gt;
-- del árbol a2 a los nodos de a1 que cumplen un predicado p. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;4) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;3) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []]]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;2) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;1) =&amp;gt; NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;0) =&amp;gt; NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []],NG 8 []]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
              deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
&lt;br /&gt;
-- Nicolás Rodríguez, Elsa Domínguez&lt;br /&gt;
ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
ramifica (NG a []) x p | p a        = NG a [x]&lt;br /&gt;
                       | otherwise  = NG a []&lt;br /&gt;
ramifica (NG a xs) x p | p a        = NG a ([ramifica ys x p | ys &amp;lt;- xs] ++ [x])&lt;br /&gt;
                       | otherwise  = NG a [ramifica ys x p | ys &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--José Manuel García &lt;br /&gt;
ramifica1 :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
ramifica1 (NG x xs) (a) f | (f x) = (NG x ( ([ramifica1 y a f | y &amp;lt;-xs ]) ++ [a] ) )&lt;br /&gt;
                         | otherwise = (NG x ([ramifica1 y a f | y &amp;lt;-xs ]) )&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir la función&lt;br /&gt;
--    nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (nHojas x) es el número de hojas del árbol x. Por ejemplo,&lt;br /&gt;
--    nHojasG ejG1  ==  2&lt;br /&gt;
--    nHojasG ejG2  ==  4&lt;br /&gt;
--    nHojasG ejG3  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez&lt;br /&gt;
nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
nHojasG (NG _ []) = 1&lt;br /&gt;
nHojasG (NG _ xs) = sum [nHojasG ys | ys &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir la función&lt;br /&gt;
--    profundidad :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (profundidadG x) es la profundidad del árbol x. Por ejemplo,&lt;br /&gt;
--    profundidadG ejG1  ==  2&lt;br /&gt;
--    profundidadG ejG2  ==  2&lt;br /&gt;
--    profundidadG ejG3  ==  4&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez&lt;br /&gt;
profundidadG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
profundidadG (NG _ []) = 0&lt;br /&gt;
profundidadG (NG _ xs) = 1 + maximum [profundidadG ys | ys &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.4. Definir la función&lt;br /&gt;
--    bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (bin2gen x) es la traducción del árbol x definido con el tipo&lt;br /&gt;
-- &amp;quot;Arbol3&amp;quot; (es decir, árbol binario) a &amp;quot;ArbolG&amp;quot; (es decir, árbol&lt;br /&gt;
-- genérico). Por ejemplo,&lt;br /&gt;
--    bin2gen (N3 9 (N3 3 (H3 2) (H3 4)) (H3 7)) ==  (NG 9 [NG 3 [NG 2 [],NG 4 []], NG 7 []])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez, Adriana Gordillo&lt;br /&gt;
bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
bin2gen (H3 a) = NG a []&lt;br /&gt;
bin2gen (N3 a i d) = NG a [bin2gen i, bin2gen d]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Las expresiones aritméticas básicas pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr1 = C1 Int &lt;br /&gt;
--               | S1 Expr1 Expr1 &lt;br /&gt;
--               | P1 Expr1 Expr1  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(3+7) se representa por&lt;br /&gt;
--    P1 (C1 2) (S1 (C1 3) (C1 7))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor e) es el valor de la expresión aritmética e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valor (P1 (C1 2) (S1 (C1 3) (C1 7)))  ==  20&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr1 = C1 Int &lt;br /&gt;
           | S1 Expr1 Expr1 &lt;br /&gt;
           | P1 Expr1 Expr1  &lt;br /&gt;
           deriving Show&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez, Adriana Gordillo                  &lt;br /&gt;
valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
valor (C1 a) = a&lt;br /&gt;
valor (S1 i d) = valor i + valor d&lt;br /&gt;
valor (P1 i d) = valor i * valor d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir la función  &lt;br /&gt;
--    aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
-- tal que (aplica f e) es la expresión obtenida aplicando la función f&lt;br /&gt;
-- a cada uno de los números de la expresión e. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; aplica (+2) (S1 (P1 (C1 3) (C1 5)) (P1 (C1 6) (C1 7)))&lt;br /&gt;
--    S1 (P1 (C1 5) (C1 7)) (P1 (C1 8) (C1 9))&lt;br /&gt;
--    ghci&amp;gt; aplica (*2) (S1 (P1 (C1 3) (C1 5)) (P1 (C1 6) (C1 7)))&lt;br /&gt;
--    S1 (P1 (C1 6) (C1 10)) (P1 (C1 12) (C1 14))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez, Adriana Gordillo&lt;br /&gt;
aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
aplica f (C1 a) = C1 (f a)&lt;br /&gt;
aplica f (S1 i d) = S1 (aplica f i) (aplica f d)&lt;br /&gt;
aplica f (P1 i d) = P1 (aplica f i) (aplica f d)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Las expresiones aritméticas construidas con una&lt;br /&gt;
-- variable (denotada por X), los números enteros y las operaciones de&lt;br /&gt;
-- sumar y multiplicar se pueden representar mediante el tipo de datos&lt;br /&gt;
-- Expr2 definido por     &lt;br /&gt;
--    data Expr2 = X&lt;br /&gt;
--               | C2 Int&lt;br /&gt;
--               | S2 Expr2 Expr2&lt;br /&gt;
--               | P2 Expr2 Expr2&lt;br /&gt;
-- Por ejemplo, la expresión &amp;quot;X*(13+X)&amp;quot; se representa por&lt;br /&gt;
-- &amp;quot;P2 X (S2 (C2 13) X)&amp;quot;.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
-- tal que (valorE e n) es el valor de la expresión e cuando se&lt;br /&gt;
-- sustituye su variable por n. Por ejemplo,&lt;br /&gt;
--    valorE (P2 X (S2 (C2 13) X)) 2  ==  30&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Expr2 = X&lt;br /&gt;
           | C2 Int&lt;br /&gt;
           | S2 Expr2 Expr2&lt;br /&gt;
           | P2 Expr2 Expr2&lt;br /&gt;
&lt;br /&gt;
valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
valorE = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Definir la función&lt;br /&gt;
--    numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
-- tal que (numVars e) es el número de variables en la expresión e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    numVars (C2 3)                 ==  0&lt;br /&gt;
--    numVars X                      ==  1&lt;br /&gt;
--    numVars (P2 X (S2 (C2 13) X))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
numVars = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Las expresiones aritméticas con variables pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr3 = C3 Int &lt;br /&gt;
--               | V3 Char &lt;br /&gt;
--               | S3 Expr3 Expr3 &lt;br /&gt;
--               | P3 Expr3 Expr3  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(a+5) se representa por&lt;br /&gt;
--    P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (C3 5))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor3 x e) es el valor3 de la expresión x en el entorno e (es&lt;br /&gt;
-- decir, el valor3 de la expresión donde las variables de x se sustituyen&lt;br /&gt;
-- por los valores según se indican en el entorno e). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; valor3 (P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (V3 &amp;#039;b&amp;#039;))) [(&amp;#039;a&amp;#039;,2),(&amp;#039;b&amp;#039;,5)]&lt;br /&gt;
--    14&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr3 = C3 Int &lt;br /&gt;
           | V3 Char &lt;br /&gt;
           | S3 Expr3 Expr3 &lt;br /&gt;
           | P3 Expr3 Expr3  &lt;br /&gt;
           deriving Show&lt;br /&gt;
                   &lt;br /&gt;
valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
valor3 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir la función&lt;br /&gt;
--    sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
-- tal que (sumas e) es el número de sumas en la expresión e. Por &lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  1&lt;br /&gt;
--    sumas (S3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  2&lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (P3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
                   &lt;br /&gt;
sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
sumas = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Definir la función&lt;br /&gt;
--    sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
-- tal que (sustitucion e s) es la expresión obtenida sustituyendo las&lt;br /&gt;
-- variables de la expresión e según se indica en la sustitución s. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (C3 7))&lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
                   &lt;br /&gt;
sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
sustitucion = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.4. Definir la función&lt;br /&gt;
--    reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (reducible a) se verifica si a es una expresión reducible; es&lt;br /&gt;
-- decir, contiene una operación en la que los dos operandos son números. &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    reducible (S3 (C3 3) (C3 4))               == True&lt;br /&gt;
--    reducible (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))             == False&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (C3 4) (C3 5)))   == True&lt;br /&gt;
--    reducible (S3 (V3 &amp;#039;x&amp;#039;) (P3 (C3 4) (C3 5))) == True&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (V3 &amp;#039;x&amp;#039;) (C3 5))) == False&lt;br /&gt;
--    reducible (C3 3)                           == False&lt;br /&gt;
--    reducible (V3 &amp;#039;x&amp;#039;)                         == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
reducible = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Las expresiones aritméticas generales se pueden definir&lt;br /&gt;
-- usando el siguiente tipo de datos &lt;br /&gt;
--    data Expr4 = C4 Int &lt;br /&gt;
--               | Y &lt;br /&gt;
--               | S4 Expr4 Expr4 &lt;br /&gt;
--               | R4 Expr4 Expr4 &lt;br /&gt;
--               | P4 Expr4 Expr4 &lt;br /&gt;
--               | E4 Expr4 Int&lt;br /&gt;
--               deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, la expresión &lt;br /&gt;
--    3*x - (x+2)^7&lt;br /&gt;
-- se puede definir por&lt;br /&gt;
--    R4 (P4 (C4 3) Y) (E4 (S4 Y (C4 2)) 7)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función  &lt;br /&gt;
--    maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
-- tal que (maximo e xs) es el par formado por el máximo valor de la&lt;br /&gt;
-- expresión e para los puntos de xs y en qué puntos alcanza el&lt;br /&gt;
-- máximo. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; maximo (E4 (S4 (C4 10) (P4 (R4 (C4 1) Y) Y)) 2) [-3..3]&lt;br /&gt;
--    (100,[0,1])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr4 = C4 Int &lt;br /&gt;
          | Y &lt;br /&gt;
          | S4 Expr4 Expr4 &lt;br /&gt;
          | R4 Expr4 Expr4 &lt;br /&gt;
          | P4 Expr4 Expr4 &lt;br /&gt;
          | E4 Expr4 Int&lt;br /&gt;
          deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
maximo e ns = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Las operaciones de suma, resta y  multiplicación se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de datos &lt;br /&gt;
--    data Op = Su | Re | Mu&lt;br /&gt;
-- La expresiones aritméticas con dichas operaciones se pueden&lt;br /&gt;
-- representar mediante el siguiente tipo de dato algebraico&lt;br /&gt;
--    data Expr5 = C5 Int &lt;br /&gt;
--               | A Op Expr5 Expr&lt;br /&gt;
-- Por ejemplo, la expresión&lt;br /&gt;
--    (7-3)+(2*5)&lt;br /&gt;
-- se representa por&lt;br /&gt;
--    A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
-- tal que (valorEG e) es el valorEG de la expresión e. Por ejemplo,&lt;br /&gt;
--    valorEG (A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5)))  ==  14&lt;br /&gt;
--    valorEG (A Mu (A Re (C5 7) (C5 3)) (A Su (C5 2) (C5 5)))  ==  28&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Op = Su | Re | Mu&lt;br /&gt;
&lt;br /&gt;
data Expr5 = C5 Int | A Op Expr5 Expr5&lt;br /&gt;
&lt;br /&gt;
valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
valorEG = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Se consideran las expresiones vectoriales formadas por&lt;br /&gt;
-- un vector, la suma de dos expresiones vectoriales o el producto de un&lt;br /&gt;
-- entero por una expresión vectorial. El siguiente tipo de dato define&lt;br /&gt;
-- las expresiones vectoriales  &lt;br /&gt;
--    data ExpV = Vec Int Int&lt;br /&gt;
--              | Sum ExpV ExpV&lt;br /&gt;
--              | Mul Int ExpV&lt;br /&gt;
--              deriving Show&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que (valorEV e) es el valorEV de la expresión vectorial c. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valorEV (Vec 1 2)                                  ==  (1,2)&lt;br /&gt;
--    valorEV (Sum (Vec 1 2 ) (Vec 3 4))                 ==  (4,6)&lt;br /&gt;
--    valorEV (Mul 2 (Vec 3 4))                          ==  (6,8)&lt;br /&gt;
--    valorEV (Mul 2 (Sum (Vec 1 2 ) (Vec 3 4)))         ==  (8,12)&lt;br /&gt;
--    valorEV (Sum (Mul 2 (Vec 1 2)) (Mul 2 (Vec 3 4)))  ==  (8,12)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ExpV = Vec Int Int&lt;br /&gt;
          | Sum ExpV ExpV&lt;br /&gt;
          | Mul Int ExpV&lt;br /&gt;
          deriving Show&lt;br /&gt;
&lt;br /&gt;
valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
valorEV = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. (Examen 12 de marzo de 2015, grupo 4)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Consideremos los árboles binarios con etiquetas en las&lt;br /&gt;
-- hojas y en los nodos. Por ejemplo,&lt;br /&gt;
--          5       &lt;br /&gt;
--         / \      &lt;br /&gt;
--        2   4      &lt;br /&gt;
--           / \    &lt;br /&gt;
--          7   1&lt;br /&gt;
--             / \&lt;br /&gt;
--            2   3   &lt;br /&gt;
-- &lt;br /&gt;
-- Un camino es una sucesión de nodos desde la raiz hasta una hoja. Por&lt;br /&gt;
-- ejemplo, [5,2] y [5,4,1,2] son caminos que llevan a 2, mientras que&lt;br /&gt;
-- [5,4,1] no es un camino, pues no lleva a una hoja.&lt;br /&gt;
-- &lt;br /&gt;
-- Definimos el tipo de dato Arbol y el ejemplo por&lt;br /&gt;
--    data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
--    &lt;br /&gt;
--    arb1:: Arbol &lt;br /&gt;
--    arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    maxLong :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
-- tal que (maxLong x a) es la longitud máxima de los caminos que&lt;br /&gt;
-- terminan en x. Por ejemplo, &lt;br /&gt;
--    maxLong 3 arb1 == 4&lt;br /&gt;
--    maxLong 2 arb1 == 4&lt;br /&gt;
--    maxLong 7 arb1 == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
             deriving Show&lt;br /&gt;
&lt;br /&gt;
arb1:: Arbol &lt;br /&gt;
arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
&lt;br /&gt;
maxLong :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
maxLong = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. (Examen 5 de diciembre de 2017, grupo 1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles con un número variable de sucesores se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de dato&lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1         1             1          &lt;br /&gt;
--     / \       / \           / \   &lt;br /&gt;
--    8   3     8   3         8   3  &lt;br /&gt;
--        |        /|\       /|\  |   &lt;br /&gt;
--        4       4 5 6     4 5 6 7&lt;br /&gt;
-- se representan por&lt;br /&gt;
--   ej21, ej22, ej23 :: ArbolG Int&lt;br /&gt;
--   ej21 = NG 1 [NG 8 [],NG 3 [NG 4 []]]&lt;br /&gt;
--   ej22 = NG 1 [NG 8 [], NG 3 [NG 4 [], NG 5 [], NG 6 []]]&lt;br /&gt;
--   ej23 = NG 1 [NG 8 [NG 4 [], NG 5 [], NG 6 []], NG 3 [NG 7 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     caminosDesdeRaiz :: ArbolG a -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (caminosDesdeRaiz x) es la lista de todos los caminos desde&lt;br /&gt;
-- la raiz. Por ejemplo,&lt;br /&gt;
--     caminosDesdeRaiz ej21 == [[1,8],[1,3,4]]&lt;br /&gt;
--     caminosDesdeRaiz ej22 == [[1,8],[1,3,4],[1,3,5],[1,3,6]]&lt;br /&gt;
--     caminosDesdeRaiz ej23 == [[1,8,4],[1,8,5],[1,8,6],[1,3,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ej21, ej22, ej23 :: ArbolG Int&lt;br /&gt;
ej21 = NG 1 [NG 8 [],NG 3 [NG 4 []]]&lt;br /&gt;
ej22 = NG 1 [NG 8 [], NG 3 [NG 4 [], NG 5 [], NG 6 []]]&lt;br /&gt;
ej23 = NG 1 [NG 8 [NG 4 [], NG 5 [], NG 6 []], NG 3 [NG 7 []]]&lt;br /&gt;
&lt;br /&gt;
caminosDesdeRaiz :: ArbolG a -&amp;gt; [[a]]&lt;br /&gt;
caminosDesdeRaiz = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. (Examen 1 de septiembre de 2016)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles se pueden representar mediante el siguiente&lt;br /&gt;
-- tipo de datos &lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3&lt;br /&gt;
--     / \             /|\ &lt;br /&gt;
--    2   3           / | \&lt;br /&gt;
--        |          5  4  7&lt;br /&gt;
--        4          |     /\ &lt;br /&gt;
--                   6    2  1&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ej31, ej32 :: ArbolG Int&lt;br /&gt;
--    ej31 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ej32 = NG 3 [NG 5 [NG 6 []], NG 4 [], NG 7 [NG 2 [], NG 1 []]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    ramasLargas :: ArbolG b -&amp;gt; [[b]]&lt;br /&gt;
-- tal que (ramasLargas a) es la lista de las ramas más largas del árbol&lt;br /&gt;
-- a. Por ejemplo, &lt;br /&gt;
--    ramas ej31  ==  [[1,3,4]]&lt;br /&gt;
--    ramas ej32  ==  [[3,5,6],[3,7,2],[3,7,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ej31, ej32 :: ArbolG Int&lt;br /&gt;
ej31 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
ej32 = NG 3 [NG 5 [NG 6 []], NG 4 [], NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
&lt;br /&gt;
ramasLargas :: ArbolG b -&amp;gt; [[b]]&lt;br /&gt;
ramasLargas = undefined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13&amp;diff=593</id>
		<title>Relación 13</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13&amp;diff=593"/>
		<updated>2022-01-15T14:49:27Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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: Relación 13 (14 de enero de 2022)&lt;br /&gt;
-- Tipos de datos algebraicos (II).&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 presenta ejercicios sobre distintos tipos de&lt;br /&gt;
-- datos algebraicos. Concretamente,&lt;br /&gt;
--    * Árboles binarios:&lt;br /&gt;
--      + Árboles binarios con valores en los nodos.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas y en los nodos.&lt;br /&gt;
--      + Árboles booleanos.  &lt;br /&gt;
--    * Árboles generales&lt;br /&gt;
--    * Expresiones aritméticas&lt;br /&gt;
--      + Expresiones aritméticas básicas.&lt;br /&gt;
--      + Expresiones aritméticas con una variable.&lt;br /&gt;
--      + Expresiones aritméticas con varias variables.&lt;br /&gt;
--      + Expresiones aritméticas generales. &lt;br /&gt;
--      + Expresiones aritméticas con tipo de operaciones.&lt;br /&gt;
--    * Expresiones vectoriales&lt;br /&gt;
-- &lt;br /&gt;
-- Los ejercicios corresponden al tema 9 que se encuentran en &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/temas/tema-9.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Los árboles binarios con valores en los nodos se&lt;br /&gt;
-- pueden definir por&lt;br /&gt;
--    data Arbol1 a = H1 &lt;br /&gt;
--                  | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
--                  deriving (Show, Eq)&lt;br /&gt;
-- Por ejemplo, el árbol&lt;br /&gt;
--         9                &lt;br /&gt;
--        / \    &lt;br /&gt;
--       /   \   &lt;br /&gt;
--      8     6  &lt;br /&gt;
--     / \   / \ &lt;br /&gt;
--    3   2 4   5&lt;br /&gt;
-- se puede representar por&lt;br /&gt;
--    N1 9 (N1 8 (N1 3 H1 H1) (N1 2 H1 H1)) (N1 6 (N1 4 H1 H1) (N1 5 H1 H1))&lt;br /&gt;
--&lt;br /&gt;
-- Definir por recursión la función &lt;br /&gt;
--    sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
-- tal (sumaArbol x) es la suma de los valores que hay en el árbol&lt;br /&gt;
-- x. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; sumaArbol (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))  &lt;br /&gt;
--    21&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol1 a = H1 &lt;br /&gt;
             | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
&lt;br /&gt;
sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
sumaArbol = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sumaArbol1 :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
sumaArbol1 (H1 ) = 0&lt;br /&gt;
sumaArbol1 (N1 x i d) = x + (sumaArbol1 i) + (sumaArbol1 d)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la función &lt;br /&gt;
--    mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
-- tal que (mapArbol f x) es el árbol que resulta de sustituir cada nodo&lt;br /&gt;
-- n del árbol x por (f n). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; mapArbol (+1) (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    N1 3 (N1 6 (N1 4 H1 H1) (N1 8 H1 H1)) (N1 5 H1 H1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
mapArbol = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
mapArbol1 :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
mapArbol1 f (H1) = (H1)&lt;br /&gt;
mapArbol1 f (N1 x i d) = (N1 (f x) (mapArbol1 f i) (mapArbol1 f d))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la función&lt;br /&gt;
--    ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (ramaIzquierda a) es la lista de los valores de los nodos de&lt;br /&gt;
-- la rama izquierda del árbol a. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; ramaIzquierda (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    [2,5,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
ramaIzquierda = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
ramaIzquierda1 :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
ramaIzquierda1 (H1 ) = []&lt;br /&gt;
ramaIzquierda1 (N1 x i d) = x : ramaIzquierda1 (i)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.4. Diremos que un árbol está balanceado si para cada nodo&lt;br /&gt;
-- v la diferencia entre el número de nodos (con valor) de sus subárboles&lt;br /&gt;
-- izquierdo y derecho es menor o igual que uno.  &lt;br /&gt;
--&lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (balanceado a) se verifica si el árbol a está balanceado. Por &lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 H1 H1))           == True&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 (N1 4 H1 H1) H1)) == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
balanceado = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
cuantosNodos H1 = 0&lt;br /&gt;
cuantosNodos (N1 x i d) = 1 + (cuantosNodos i) + (cuantosNodos d)&lt;br /&gt;
&lt;br /&gt;
balanceado1 :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
balanceado1 H1 = True&lt;br /&gt;
balanceado1 (N1 x i d) | (cuantosNodos i) - (cuantosNodos d) &amp;lt;= 1 =&lt;br /&gt;
                                               (balanceado1 i) &amp;amp;&amp;amp; (balanceado1 d)&lt;br /&gt;
                      | otherwise = False&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Los árboles binarios con valores en las hojas se pueden&lt;br /&gt;
-- definir por&lt;br /&gt;
--    data Arbol2 a = H2 a&lt;br /&gt;
--                  | N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
--                  deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles &lt;br /&gt;
--    árbol1          árbol2       árbol3     árbol4 &lt;br /&gt;
--       o              o           o           o    &lt;br /&gt;
--      / \            / \         / \         / \   &lt;br /&gt;
--     1   o          o   3       o   3       o   1  &lt;br /&gt;
--        / \        / \         / \         / \     &lt;br /&gt;
--       2   3      1   2       1   4       2   3    &lt;br /&gt;
-- se representan por&lt;br /&gt;
--    arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
--    arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
--    arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
--    arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
--    arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualBorde t1 t2) se verifica si los bordes de los árboles&lt;br /&gt;
-- t1 y t2 son iguales. Por ejemplo,&lt;br /&gt;
--    igualBorde arbol1 arbol2  ==  True&lt;br /&gt;
--    igualBorde arbol1 arbol3  ==  False&lt;br /&gt;
--    igualBorde arbol1 arbol4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol2 a = N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
              | H2 a&lt;br /&gt;
              deriving Show&lt;br /&gt;
&lt;br /&gt;
arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
&lt;br /&gt;
igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
igualBorde t1 t2 = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
igualBorde1 :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
igualBorde1 t1 t2 = (listaBorde t1) == (listaBorde t2)&lt;br /&gt;
&lt;br /&gt;
listaBorde (N2 i d) = (listaBorde i) ++ (listaBorde d) &lt;br /&gt;
listaBorde (H2 x) = [x] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Los árboles binarios con valores en las hojas y en los&lt;br /&gt;
-- nodos se definen por&lt;br /&gt;
--    data Arbol3 a = H3 a&lt;br /&gt;
--                 | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--         5              8             5           5&lt;br /&gt;
--        / \            / \           / \         / \&lt;br /&gt;
--       /   \          /   \         /   \       /   \&lt;br /&gt;
--      9     7        9     3       9     2     4     7&lt;br /&gt;
--     / \   / \      / \   / \     / \               / \&lt;br /&gt;
--    1   4 6   8    1   4 6   2   1   4             6   2&lt;br /&gt;
-- se pueden representar por&lt;br /&gt;
--    ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
--    ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
--    ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
--    ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
--    ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualEstructura :: Arbol3 -&amp;gt; Arbol3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualEstructura a1 a1) se verifica si los árboles a1 y a2 &lt;br /&gt;
-- tienen la misma estructura. Por ejemplo,&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol2 == True&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol3 == False&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol4 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol3 a = H3 a&lt;br /&gt;
              | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
              deriving Show&lt;br /&gt;
&lt;br /&gt;
ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
&lt;br /&gt;
igualEstructura :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
igualEstructura = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
arbolEstructura (H3 x) = (H3 0)&lt;br /&gt;
arbolEstructura (N3 x i d) = (N3 0 (arbolEstructura i) (arbolEstructura d))&lt;br /&gt;
--Si fuera deriving (Show,Eq):&lt;br /&gt;
--igualEstructura1 :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
--igualEstructura1 t1 t2 = (arbolEstructura t1) == (arbolEstructura t2)&lt;br /&gt;
--Pero como es deriving Show :&lt;br /&gt;
igualEstructura1 :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
igualEstructura1 t1 t2 = show (arbolEstructura t1) == show (arbolEstructura t2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir la función&lt;br /&gt;
--    algunoArbol :: Arbol3 t -&amp;gt; (t -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
-- tal que (algunoArbol a p) se verifica si algún elemento del árbol a&lt;br /&gt;
-- cumple la propiedad p. Por ejemplo,&lt;br /&gt;
--    algunoArbol3 (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;4)  ==  True&lt;br /&gt;
--    algunoArbol3 (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;7)  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
algunoArbol :: Arbol3 a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
algunoArbol = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
algunoArbol3 :: Arbol3 a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
algunoArbol3 (H3 x) p = (p x)&lt;br /&gt;
algunoArbol3 (N3 x i d) p = (p x) || (algunoArbol3 i p) || (algunoArbol3 d p)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Un elemento de un árbol se dirá de nivel k si aparece&lt;br /&gt;
-- en el árbol a distancia k  de la raíz.  &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (nivel k a) es la lista de los elementos de nivel k del árbol&lt;br /&gt;
-- a. Por ejemplo,&lt;br /&gt;
--    nivel 0 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [7]&lt;br /&gt;
--    nivel 1 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [2,9]&lt;br /&gt;
--    nivel 2 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [5,4]&lt;br /&gt;
--    nivel 3 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
nivel = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.4.  Los divisores medios de un número son los que ocupan&lt;br /&gt;
-- la posición media entre los divisores de n, ordenados de menor a&lt;br /&gt;
-- mayor. Por ejemplo, los divisores de 60 son &lt;br /&gt;
-- [1,2,3,4,5,6,10,12,15,20,30,60] y sus divisores medios son 6 y 10.&lt;br /&gt;
-- &lt;br /&gt;
-- El árbol de factorización de un número compuesto n se construye de la&lt;br /&gt;
-- siguiente manera: &lt;br /&gt;
--    * la raíz es el número n, &lt;br /&gt;
--    * la rama izquierda es el árbol de factorización de su divisor&lt;br /&gt;
--      medio menor y&lt;br /&gt;
--    * la rama derecha es el árbol de factorización de su divisor&lt;br /&gt;
--      medio mayor&lt;br /&gt;
-- Si el número es primo, su árbol de factorización sólo tiene una hoja&lt;br /&gt;
-- con dicho número. Por ejemplo, el árbol de factorización de 60 es&lt;br /&gt;
--        60&lt;br /&gt;
--       /  \&lt;br /&gt;
--      6    10&lt;br /&gt;
--     / \   / \&lt;br /&gt;
--    2   3 2   5&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    arbolFactorizacion :: Int -&amp;gt; Arbol3&lt;br /&gt;
-- tal que (arbolFactorizacion n) es el árbol de factorización de n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    arbolFactorizacion 60 == N3 60 (N3 6 (H3 2) (H3 3)) (N3 10 (H3 2) (H3 5))&lt;br /&gt;
--    arbolFactorizacion 45 == N3 45 (H3 5) (N3 9 (H3 3) (H3 3))&lt;br /&gt;
--    arbolFactorizacion 7  == H3 7&lt;br /&gt;
--    arbolFactorizacion 14 == N3 14 (H3 2) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 28 == N3 28 (N3 4 (H3 2) (H3 2)) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 84 == N3 84 (H3 7) (N3 12 (H3 3) (N3 4 (H3 2) (H3 2)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adriana Gordillo&lt;br /&gt;
arbolFactorizacion :: Int -&amp;gt; Arbol3 Int&lt;br /&gt;
arbolFactorizacion n | primo n    = (H3 n)&lt;br /&gt;
                     | otherwise  = (N3 n i d)&lt;br /&gt;
                     where i = arbolFactorizacion (divisorMedioMenor n)&lt;br /&gt;
                           d = arbolFactorizacion (divisorMedioMayor n)&lt;br /&gt;
&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..n], rem n x == 0]&lt;br /&gt;
divisorMedioMenor n | even (length (divisores n))  = last (take (div (length (divisores n)) 2) (divisores n)) &lt;br /&gt;
                    | otherwise                    = (divisores n) !! (div (length (divisores n)) 2)&lt;br /&gt;
divisorMedioMayor n | even (length (divisores n))  = head (drop (div (length (divisores n)) 2) (divisores n))&lt;br /&gt;
                    | otherwise                    = (divisores n) !! (div (length (divisores n)) 2)&lt;br /&gt;
&lt;br /&gt;
primo n = length (divisores n) == 2&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se consideran los árboles con operaciones booleanas&lt;br /&gt;
-- definidos por   &lt;br /&gt;
--    data ArbolB = HB Bool &lt;br /&gt;
--                | Conj ArbolB ArbolB&lt;br /&gt;
--                | Disy ArbolB ArbolB&lt;br /&gt;
--                | Neg ArbolB&lt;br /&gt;
-- &lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--                Conj                            Conj          &lt;br /&gt;
--               /   \                           /   \          &lt;br /&gt;
--              /     \                         /     \         &lt;br /&gt;
--           Disy      Conj                  Disy      Conj     &lt;br /&gt;
--          /   \       /  \                /   \      /   \    &lt;br /&gt;
--       Conj    Neg   Neg True          Conj    Neg   Neg  True &lt;br /&gt;
--       /  \    |     |                 /  \    |     |        &lt;br /&gt;
--    True False False False          True False True  False     &lt;br /&gt;
--&lt;br /&gt;
-- se definen por&lt;br /&gt;
--    ej1, ej2:: ArbolB&lt;br /&gt;
--    ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB False)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
--    &lt;br /&gt;
--    ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB True)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorB :: ArbolB -&amp;gt; Bool&lt;br /&gt;
-- tal que (valorB ar) es el resultado de procesar el árbol realizando&lt;br /&gt;
-- las operaciones booleanas especificadas en los nodos. Por ejemplo,&lt;br /&gt;
--    valorB ej1 == True&lt;br /&gt;
--    valorB ej2 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolB = HB Bool &lt;br /&gt;
            | Conj ArbolB ArbolB&lt;br /&gt;
            | Disy ArbolB ArbolB&lt;br /&gt;
            | Neg ArbolB&lt;br /&gt;
&lt;br /&gt;
ej1, ej2:: ArbolB&lt;br /&gt;
ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB False)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB True)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
valorB:: ArbolB -&amp;gt; Bool&lt;br /&gt;
valorB = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Los árboles generales se pueden representar mediante el&lt;br /&gt;
-- siguiente tipo de dato  &lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--                  deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3               3&lt;br /&gt;
--     / \             /|\            / | \&lt;br /&gt;
--    2   3           / | \          /  |  \&lt;br /&gt;
--        |          5  4  7        5   4   7&lt;br /&gt;
--        4          |     /\       |   |  / \&lt;br /&gt;
--                   6    2  1      6   1 2   1&lt;br /&gt;
--                                     / \&lt;br /&gt;
--                                    2   3&lt;br /&gt;
--                                        |&lt;br /&gt;
--                                        4&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
--    ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
--    ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (ramifica a1 a2 p) el árbol que resulta de ańadir una copia&lt;br /&gt;
-- del árbol a2 a los nodos de a1 que cumplen un predicado p. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;4) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;3) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []]]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;2) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;1) =&amp;gt; NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;0) =&amp;gt; NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []],NG 8 []]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
              deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
&lt;br /&gt;
-- Nicolás Rodríguez, Elsa Domínguez&lt;br /&gt;
ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
ramifica (NG a []) x p | p a        = NG a [x]&lt;br /&gt;
                       | otherwise  = NG a []&lt;br /&gt;
ramifica (NG a xs) x p | p a        = NG a ([ramifica ys x p | ys &amp;lt;- xs] ++ [x])&lt;br /&gt;
                       | otherwise  = NG a [ramifica ys x p | ys &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--José Manuel García &lt;br /&gt;
ramifica1 :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
ramifica1 (NG x xs) (a) f | (f x) = (NG x ( ([ramifica1 y a f | y &amp;lt;-xs ]) ++ [a] ) )&lt;br /&gt;
                         | otherwise = (NG x ([ramifica1 y a f | y &amp;lt;-xs ]) )&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir la función&lt;br /&gt;
--    nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (nHojas x) es el número de hojas del árbol x. Por ejemplo,&lt;br /&gt;
--    nHojasG ejG1  ==  2&lt;br /&gt;
--    nHojasG ejG2  ==  4&lt;br /&gt;
--    nHojasG ejG3  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez&lt;br /&gt;
nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
nHojasG (NG _ []) = 1&lt;br /&gt;
nHojasG (NG _ xs) = sum [nHojasG ys | ys &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir la función&lt;br /&gt;
--    profundidad :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (profundidadG x) es la profundidad del árbol x. Por ejemplo,&lt;br /&gt;
--    profundidadG ejG1  ==  2&lt;br /&gt;
--    profundidadG ejG2  ==  2&lt;br /&gt;
--    profundidadG ejG3  ==  4&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez&lt;br /&gt;
profundidadG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
profundidadG (NG _ []) = 0&lt;br /&gt;
profundidadG (NG _ xs) = 1 + maximum [profundidadG ys | ys &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.4. Definir la función&lt;br /&gt;
--    bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (bin2gen x) es la traducción del árbol x definido con el tipo&lt;br /&gt;
-- &amp;quot;Arbol3&amp;quot; (es decir, árbol binario) a &amp;quot;ArbolG&amp;quot; (es decir, árbol&lt;br /&gt;
-- genérico). Por ejemplo,&lt;br /&gt;
--    bin2gen (N3 9 (N3 3 (H3 2) (H3 4)) (H3 7)) ==  (NG 9 [NG 3 [NG 2 [],NG 4 []], NG 7 []])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez, Adriana Gordillo&lt;br /&gt;
bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
bin2gen (H3 a) = NG a []&lt;br /&gt;
bin2gen (N3 a i d) = NG a [bin2gen i, bin2gen d]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Las expresiones aritméticas básicas pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr1 = C1 Int &lt;br /&gt;
--               | S1 Expr1 Expr1 &lt;br /&gt;
--               | P1 Expr1 Expr1  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(3+7) se representa por&lt;br /&gt;
--    P1 (C1 2) (S1 (C1 3) (C1 7))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor e) es el valor de la expresión aritmética e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valor (P1 (C1 2) (S1 (C1 3) (C1 7)))  ==  20&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr1 = C1 Int &lt;br /&gt;
           | S1 Expr1 Expr1 &lt;br /&gt;
           | P1 Expr1 Expr1  &lt;br /&gt;
           deriving Show&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez, Adriana Gordillo                  &lt;br /&gt;
valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
valor (C1 a) = a&lt;br /&gt;
valor (S1 i d) = valor i + valor d&lt;br /&gt;
valor (P1 i d) = valor i * valor d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir la función  &lt;br /&gt;
--    aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
-- tal que (aplica f e) es la expresión obtenida aplicando la función f&lt;br /&gt;
-- a cada uno de los números de la expresión e. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; aplica (+2) (S1 (P1 (C1 3) (C1 5)) (P1 (C1 6) (C1 7)))&lt;br /&gt;
--    S1 (P1 (C1 5) (C1 7)) (P1 (C1 8) (C1 9))&lt;br /&gt;
--    ghci&amp;gt; aplica (*2) (S1 (P1 (C1 3) (C1 5)) (P1 (C1 6) (C1 7)))&lt;br /&gt;
--    S1 (P1 (C1 6) (C1 10)) (P1 (C1 12) (C1 14))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez, Adriana Gordillo&lt;br /&gt;
aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
aplica f (C1 a) = C1 (f a)&lt;br /&gt;
aplica f (S1 i d) = S1 (aplica f i) (aplica f d)&lt;br /&gt;
aplica f (P1 i d) = P1 (aplica f i) (aplica f d)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Las expresiones aritméticas construidas con una&lt;br /&gt;
-- variable (denotada por X), los números enteros y las operaciones de&lt;br /&gt;
-- sumar y multiplicar se pueden representar mediante el tipo de datos&lt;br /&gt;
-- Expr2 definido por     &lt;br /&gt;
--    data Expr2 = X&lt;br /&gt;
--               | C2 Int&lt;br /&gt;
--               | S2 Expr2 Expr2&lt;br /&gt;
--               | P2 Expr2 Expr2&lt;br /&gt;
-- Por ejemplo, la expresión &amp;quot;X*(13+X)&amp;quot; se representa por&lt;br /&gt;
-- &amp;quot;P2 X (S2 (C2 13) X)&amp;quot;.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
-- tal que (valorE e n) es el valor de la expresión e cuando se&lt;br /&gt;
-- sustituye su variable por n. Por ejemplo,&lt;br /&gt;
--    valorE (P2 X (S2 (C2 13) X)) 2  ==  30&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Expr2 = X&lt;br /&gt;
           | C2 Int&lt;br /&gt;
           | S2 Expr2 Expr2&lt;br /&gt;
           | P2 Expr2 Expr2&lt;br /&gt;
&lt;br /&gt;
valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
valorE = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Definir la función&lt;br /&gt;
--    numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
-- tal que (numVars e) es el número de variables en la expresión e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    numVars (C2 3)                 ==  0&lt;br /&gt;
--    numVars X                      ==  1&lt;br /&gt;
--    numVars (P2 X (S2 (C2 13) X))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
numVars = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Las expresiones aritméticas con variables pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr3 = C3 Int &lt;br /&gt;
--               | V3 Char &lt;br /&gt;
--               | S3 Expr3 Expr3 &lt;br /&gt;
--               | P3 Expr3 Expr3  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(a+5) se representa por&lt;br /&gt;
--    P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (C3 5))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor3 x e) es el valor3 de la expresión x en el entorno e (es&lt;br /&gt;
-- decir, el valor3 de la expresión donde las variables de x se sustituyen&lt;br /&gt;
-- por los valores según se indican en el entorno e). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; valor3 (P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (V3 &amp;#039;b&amp;#039;))) [(&amp;#039;a&amp;#039;,2),(&amp;#039;b&amp;#039;,5)]&lt;br /&gt;
--    14&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr3 = C3 Int &lt;br /&gt;
           | V3 Char &lt;br /&gt;
           | S3 Expr3 Expr3 &lt;br /&gt;
           | P3 Expr3 Expr3  &lt;br /&gt;
           deriving Show&lt;br /&gt;
                   &lt;br /&gt;
valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
valor3 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir la función&lt;br /&gt;
--    sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
-- tal que (sumas e) es el número de sumas en la expresión e. Por &lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  1&lt;br /&gt;
--    sumas (S3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  2&lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (P3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
                   &lt;br /&gt;
sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
sumas = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Definir la función&lt;br /&gt;
--    sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
-- tal que (sustitucion e s) es la expresión obtenida sustituyendo las&lt;br /&gt;
-- variables de la expresión e según se indica en la sustitución s. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (C3 7))&lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
                   &lt;br /&gt;
sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
sustitucion = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.4. Definir la función&lt;br /&gt;
--    reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (reducible a) se verifica si a es una expresión reducible; es&lt;br /&gt;
-- decir, contiene una operación en la que los dos operandos son números. &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    reducible (S3 (C3 3) (C3 4))               == True&lt;br /&gt;
--    reducible (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))             == False&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (C3 4) (C3 5)))   == True&lt;br /&gt;
--    reducible (S3 (V3 &amp;#039;x&amp;#039;) (P3 (C3 4) (C3 5))) == True&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (V3 &amp;#039;x&amp;#039;) (C3 5))) == False&lt;br /&gt;
--    reducible (C3 3)                           == False&lt;br /&gt;
--    reducible (V3 &amp;#039;x&amp;#039;)                         == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
reducible = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Las expresiones aritméticas generales se pueden definir&lt;br /&gt;
-- usando el siguiente tipo de datos &lt;br /&gt;
--    data Expr4 = C4 Int &lt;br /&gt;
--               | Y &lt;br /&gt;
--               | S4 Expr4 Expr4 &lt;br /&gt;
--               | R4 Expr4 Expr4 &lt;br /&gt;
--               | P4 Expr4 Expr4 &lt;br /&gt;
--               | E4 Expr4 Int&lt;br /&gt;
--               deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, la expresión &lt;br /&gt;
--    3*x - (x+2)^7&lt;br /&gt;
-- se puede definir por&lt;br /&gt;
--    R4 (P4 (C4 3) Y) (E4 (S4 Y (C4 2)) 7)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función  &lt;br /&gt;
--    maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
-- tal que (maximo e xs) es el par formado por el máximo valor de la&lt;br /&gt;
-- expresión e para los puntos de xs y en qué puntos alcanza el&lt;br /&gt;
-- máximo. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; maximo (E4 (S4 (C4 10) (P4 (R4 (C4 1) Y) Y)) 2) [-3..3]&lt;br /&gt;
--    (100,[0,1])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr4 = C4 Int &lt;br /&gt;
          | Y &lt;br /&gt;
          | S4 Expr4 Expr4 &lt;br /&gt;
          | R4 Expr4 Expr4 &lt;br /&gt;
          | P4 Expr4 Expr4 &lt;br /&gt;
          | E4 Expr4 Int&lt;br /&gt;
          deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
maximo e ns = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Las operaciones de suma, resta y  multiplicación se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de datos &lt;br /&gt;
--    data Op = Su | Re | Mu&lt;br /&gt;
-- La expresiones aritméticas con dichas operaciones se pueden&lt;br /&gt;
-- representar mediante el siguiente tipo de dato algebraico&lt;br /&gt;
--    data Expr5 = C5 Int &lt;br /&gt;
--               | A Op Expr5 Expr&lt;br /&gt;
-- Por ejemplo, la expresión&lt;br /&gt;
--    (7-3)+(2*5)&lt;br /&gt;
-- se representa por&lt;br /&gt;
--    A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
-- tal que (valorEG e) es el valorEG de la expresión e. Por ejemplo,&lt;br /&gt;
--    valorEG (A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5)))  ==  14&lt;br /&gt;
--    valorEG (A Mu (A Re (C5 7) (C5 3)) (A Su (C5 2) (C5 5)))  ==  28&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Op = Su | Re | Mu&lt;br /&gt;
&lt;br /&gt;
data Expr5 = C5 Int | A Op Expr5 Expr5&lt;br /&gt;
&lt;br /&gt;
valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
valorEG = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Se consideran las expresiones vectoriales formadas por&lt;br /&gt;
-- un vector, la suma de dos expresiones vectoriales o el producto de un&lt;br /&gt;
-- entero por una expresión vectorial. El siguiente tipo de dato define&lt;br /&gt;
-- las expresiones vectoriales  &lt;br /&gt;
--    data ExpV = Vec Int Int&lt;br /&gt;
--              | Sum ExpV ExpV&lt;br /&gt;
--              | Mul Int ExpV&lt;br /&gt;
--              deriving Show&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que (valorEV e) es el valorEV de la expresión vectorial c. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valorEV (Vec 1 2)                                  ==  (1,2)&lt;br /&gt;
--    valorEV (Sum (Vec 1 2 ) (Vec 3 4))                 ==  (4,6)&lt;br /&gt;
--    valorEV (Mul 2 (Vec 3 4))                          ==  (6,8)&lt;br /&gt;
--    valorEV (Mul 2 (Sum (Vec 1 2 ) (Vec 3 4)))         ==  (8,12)&lt;br /&gt;
--    valorEV (Sum (Mul 2 (Vec 1 2)) (Mul 2 (Vec 3 4)))  ==  (8,12)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ExpV = Vec Int Int&lt;br /&gt;
          | Sum ExpV ExpV&lt;br /&gt;
          | Mul Int ExpV&lt;br /&gt;
          deriving Show&lt;br /&gt;
&lt;br /&gt;
valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
valorEV = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. (Examen 12 de marzo de 2015, grupo 4)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Consideremos los árboles binarios con etiquetas en las&lt;br /&gt;
-- hojas y en los nodos. Por ejemplo,&lt;br /&gt;
--          5       &lt;br /&gt;
--         / \      &lt;br /&gt;
--        2   4      &lt;br /&gt;
--           / \    &lt;br /&gt;
--          7   1&lt;br /&gt;
--             / \&lt;br /&gt;
--            2   3   &lt;br /&gt;
-- &lt;br /&gt;
-- Un camino es una sucesión de nodos desde la raiz hasta una hoja. Por&lt;br /&gt;
-- ejemplo, [5,2] y [5,4,1,2] son caminos que llevan a 2, mientras que&lt;br /&gt;
-- [5,4,1] no es un camino, pues no lleva a una hoja.&lt;br /&gt;
-- &lt;br /&gt;
-- Definimos el tipo de dato Arbol y el ejemplo por&lt;br /&gt;
--    data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
--    &lt;br /&gt;
--    arb1:: Arbol &lt;br /&gt;
--    arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    maxLong :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
-- tal que (maxLong x a) es la longitud máxima de los caminos que&lt;br /&gt;
-- terminan en x. Por ejemplo, &lt;br /&gt;
--    maxLong 3 arb1 == 4&lt;br /&gt;
--    maxLong 2 arb1 == 4&lt;br /&gt;
--    maxLong 7 arb1 == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
             deriving Show&lt;br /&gt;
&lt;br /&gt;
arb1:: Arbol &lt;br /&gt;
arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
&lt;br /&gt;
maxLong :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
maxLong = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. (Examen 5 de diciembre de 2017, grupo 1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles con un número variable de sucesores se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de dato&lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1         1             1          &lt;br /&gt;
--     / \       / \           / \   &lt;br /&gt;
--    8   3     8   3         8   3  &lt;br /&gt;
--        |        /|\       /|\  |   &lt;br /&gt;
--        4       4 5 6     4 5 6 7&lt;br /&gt;
-- se representan por&lt;br /&gt;
--   ej21, ej22, ej23 :: ArbolG Int&lt;br /&gt;
--   ej21 = NG 1 [NG 8 [],NG 3 [NG 4 []]]&lt;br /&gt;
--   ej22 = NG 1 [NG 8 [], NG 3 [NG 4 [], NG 5 [], NG 6 []]]&lt;br /&gt;
--   ej23 = NG 1 [NG 8 [NG 4 [], NG 5 [], NG 6 []], NG 3 [NG 7 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     caminosDesdeRaiz :: ArbolG a -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (caminosDesdeRaiz x) es la lista de todos los caminos desde&lt;br /&gt;
-- la raiz. Por ejemplo,&lt;br /&gt;
--     caminosDesdeRaiz ej21 == [[1,8],[1,3,4]]&lt;br /&gt;
--     caminosDesdeRaiz ej22 == [[1,8],[1,3,4],[1,3,5],[1,3,6]]&lt;br /&gt;
--     caminosDesdeRaiz ej23 == [[1,8,4],[1,8,5],[1,8,6],[1,3,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ej21, ej22, ej23 :: ArbolG Int&lt;br /&gt;
ej21 = NG 1 [NG 8 [],NG 3 [NG 4 []]]&lt;br /&gt;
ej22 = NG 1 [NG 8 [], NG 3 [NG 4 [], NG 5 [], NG 6 []]]&lt;br /&gt;
ej23 = NG 1 [NG 8 [NG 4 [], NG 5 [], NG 6 []], NG 3 [NG 7 []]]&lt;br /&gt;
&lt;br /&gt;
caminosDesdeRaiz :: ArbolG a -&amp;gt; [[a]]&lt;br /&gt;
caminosDesdeRaiz = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. (Examen 1 de septiembre de 2016)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles se pueden representar mediante el siguiente&lt;br /&gt;
-- tipo de datos &lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3&lt;br /&gt;
--     / \             /|\ &lt;br /&gt;
--    2   3           / | \&lt;br /&gt;
--        |          5  4  7&lt;br /&gt;
--        4          |     /\ &lt;br /&gt;
--                   6    2  1&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ej31, ej32 :: ArbolG Int&lt;br /&gt;
--    ej31 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ej32 = NG 3 [NG 5 [NG 6 []], NG 4 [], NG 7 [NG 2 [], NG 1 []]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    ramasLargas :: ArbolG b -&amp;gt; [[b]]&lt;br /&gt;
-- tal que (ramasLargas a) es la lista de las ramas más largas del árbol&lt;br /&gt;
-- a. Por ejemplo, &lt;br /&gt;
--    ramas ej31  ==  [[1,3,4]]&lt;br /&gt;
--    ramas ej32  ==  [[3,5,6],[3,7,2],[3,7,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ej31, ej32 :: ArbolG Int&lt;br /&gt;
ej31 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
ej32 = NG 3 [NG 5 [NG 6 []], NG 4 [], NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
&lt;br /&gt;
ramasLargas :: ArbolG b -&amp;gt; [[b]]&lt;br /&gt;
ramasLargas = undefined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13&amp;diff=592</id>
		<title>Relación 13</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13&amp;diff=592"/>
		<updated>2022-01-15T14:32:17Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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: Relación 13 (14 de enero de 2022)&lt;br /&gt;
-- Tipos de datos algebraicos (II).&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 presenta ejercicios sobre distintos tipos de&lt;br /&gt;
-- datos algebraicos. Concretamente,&lt;br /&gt;
--    * Árboles binarios:&lt;br /&gt;
--      + Árboles binarios con valores en los nodos.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas y en los nodos.&lt;br /&gt;
--      + Árboles booleanos.  &lt;br /&gt;
--    * Árboles generales&lt;br /&gt;
--    * Expresiones aritméticas&lt;br /&gt;
--      + Expresiones aritméticas básicas.&lt;br /&gt;
--      + Expresiones aritméticas con una variable.&lt;br /&gt;
--      + Expresiones aritméticas con varias variables.&lt;br /&gt;
--      + Expresiones aritméticas generales. &lt;br /&gt;
--      + Expresiones aritméticas con tipo de operaciones.&lt;br /&gt;
--    * Expresiones vectoriales&lt;br /&gt;
-- &lt;br /&gt;
-- Los ejercicios corresponden al tema 9 que se encuentran en &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/temas/tema-9.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Los árboles binarios con valores en los nodos se&lt;br /&gt;
-- pueden definir por&lt;br /&gt;
--    data Arbol1 a = H1 &lt;br /&gt;
--                  | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
--                  deriving (Show, Eq)&lt;br /&gt;
-- Por ejemplo, el árbol&lt;br /&gt;
--         9                &lt;br /&gt;
--        / \    &lt;br /&gt;
--       /   \   &lt;br /&gt;
--      8     6  &lt;br /&gt;
--     / \   / \ &lt;br /&gt;
--    3   2 4   5&lt;br /&gt;
-- se puede representar por&lt;br /&gt;
--    N1 9 (N1 8 (N1 3 H1 H1) (N1 2 H1 H1)) (N1 6 (N1 4 H1 H1) (N1 5 H1 H1))&lt;br /&gt;
--&lt;br /&gt;
-- Definir por recursión la función &lt;br /&gt;
--    sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
-- tal (sumaArbol x) es la suma de los valores que hay en el árbol&lt;br /&gt;
-- x. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; sumaArbol (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))  &lt;br /&gt;
--    21&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol1 a = H1 &lt;br /&gt;
             | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
&lt;br /&gt;
sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
sumaArbol = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sumaArbol1 :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
sumaArbol1 (H1 ) = 0&lt;br /&gt;
sumaArbol1 (N1 x i d) = x + (sumaArbol1 i) + (sumaArbol1 d)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la función &lt;br /&gt;
--    mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
-- tal que (mapArbol f x) es el árbol que resulta de sustituir cada nodo&lt;br /&gt;
-- n del árbol x por (f n). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; mapArbol (+1) (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    N1 3 (N1 6 (N1 4 H1 H1) (N1 8 H1 H1)) (N1 5 H1 H1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
mapArbol = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
mapArbol1 :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
mapArbol1 f (H1) = (H1)&lt;br /&gt;
mapArbol1 f (N1 x i d) = (N1 (f x) (mapArbol1 f i) (mapArbol1 f d))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la función&lt;br /&gt;
--    ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (ramaIzquierda a) es la lista de los valores de los nodos de&lt;br /&gt;
-- la rama izquierda del árbol a. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; ramaIzquierda (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    [2,5,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
ramaIzquierda = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
ramaIzquierda1 :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
ramaIzquierda1 (H1 ) = []&lt;br /&gt;
ramaIzquierda1 (N1 x i d) = x : ramaIzquierda1 (i)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.4. Diremos que un árbol está balanceado si para cada nodo&lt;br /&gt;
-- v la diferencia entre el número de nodos (con valor) de sus subárboles&lt;br /&gt;
-- izquierdo y derecho es menor o igual que uno.  &lt;br /&gt;
--&lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (balanceado a) se verifica si el árbol a está balanceado. Por &lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 H1 H1))           == True&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 (N1 4 H1 H1) H1)) == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
balanceado = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
cuantosNodos H1 = 0&lt;br /&gt;
cuantosNodos (N1 x i d) = 1 + (cuantosNodos i) + (cuantosNodos d)&lt;br /&gt;
&lt;br /&gt;
balanceado1 :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
balanceado1 H1 = True&lt;br /&gt;
balanceado1 (N1 x i d) | (cuantosNodos i) - (cuantosNodos d) &amp;lt;= 1 =&lt;br /&gt;
                                               (balanceado1 i) &amp;amp;&amp;amp; (balanceado1 d)&lt;br /&gt;
                      | otherwise = False&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Los árboles binarios con valores en las hojas se pueden&lt;br /&gt;
-- definir por&lt;br /&gt;
--    data Arbol2 a = H2 a&lt;br /&gt;
--                  | N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
--                  deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles &lt;br /&gt;
--    árbol1          árbol2       árbol3     árbol4 &lt;br /&gt;
--       o              o           o           o    &lt;br /&gt;
--      / \            / \         / \         / \   &lt;br /&gt;
--     1   o          o   3       o   3       o   1  &lt;br /&gt;
--        / \        / \         / \         / \     &lt;br /&gt;
--       2   3      1   2       1   4       2   3    &lt;br /&gt;
-- se representan por&lt;br /&gt;
--    arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
--    arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
--    arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
--    arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
--    arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualBorde t1 t2) se verifica si los bordes de los árboles&lt;br /&gt;
-- t1 y t2 son iguales. Por ejemplo,&lt;br /&gt;
--    igualBorde arbol1 arbol2  ==  True&lt;br /&gt;
--    igualBorde arbol1 arbol3  ==  False&lt;br /&gt;
--    igualBorde arbol1 arbol4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol2 a = N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
              | H2 a&lt;br /&gt;
              deriving Show&lt;br /&gt;
&lt;br /&gt;
arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
&lt;br /&gt;
igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
igualBorde t1 t2 = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
igualBorde1 :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
igualBorde1 t1 t2 = (listaBorde t1) == (listaBorde t2)&lt;br /&gt;
&lt;br /&gt;
listaBorde (N2 i d) = (listaBorde i) ++ (listaBorde d) &lt;br /&gt;
listaBorde (H2 x) = [x] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Los árboles binarios con valores en las hojas y en los&lt;br /&gt;
-- nodos se definen por&lt;br /&gt;
--    data Arbol3 a = H3 a&lt;br /&gt;
--                 | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--         5              8             5           5&lt;br /&gt;
--        / \            / \           / \         / \&lt;br /&gt;
--       /   \          /   \         /   \       /   \&lt;br /&gt;
--      9     7        9     3       9     2     4     7&lt;br /&gt;
--     / \   / \      / \   / \     / \               / \&lt;br /&gt;
--    1   4 6   8    1   4 6   2   1   4             6   2&lt;br /&gt;
-- se pueden representar por&lt;br /&gt;
--    ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
--    ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
--    ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
--    ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
--    ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualEstructura :: Arbol3 -&amp;gt; Arbol3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualEstructura a1 a1) se verifica si los árboles a1 y a2 &lt;br /&gt;
-- tienen la misma estructura. Por ejemplo,&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol2 == True&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol3 == False&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol4 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol3 a = H3 a&lt;br /&gt;
              | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
              deriving Show&lt;br /&gt;
&lt;br /&gt;
ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
&lt;br /&gt;
igualEstructura :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
igualEstructura = undefined&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
arbolEstructura (H3 x) = (H3 0)&lt;br /&gt;
arbolEstructura (N3 x i d) = (N3 0 (arbolEstructura i) (arbolEstructura d))&lt;br /&gt;
--Si fuera deriving (Show,Eq):&lt;br /&gt;
--igualEstructura1 :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
--igualEstructura1 t1 t2 = (arbolEstructura t1) == (arbolEstructura t2)&lt;br /&gt;
--Pero como es deriving Show :&lt;br /&gt;
igualEstructura1 :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
igualEstructura1 t1 t2 = show (arbolEstructura t1) == show (arbolEstructura t2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir la función&lt;br /&gt;
--    algunoArbol :: Arbol3 t -&amp;gt; (t -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
-- tal que (algunoArbol a p) se verifica si algún elemento del árbol a&lt;br /&gt;
-- cumple la propiedad p. Por ejemplo,&lt;br /&gt;
--    algunoArbol3 (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;4)  ==  True&lt;br /&gt;
--    algunoArbol3 (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;7)  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
algunoArbol :: Arbol3 a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
algunoArbol = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Un elemento de un árbol se dirá de nivel k si aparece&lt;br /&gt;
-- en el árbol a distancia k  de la raíz.  &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (nivel k a) es la lista de los elementos de nivel k del árbol&lt;br /&gt;
-- a. Por ejemplo,&lt;br /&gt;
--    nivel 0 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [7]&lt;br /&gt;
--    nivel 1 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [2,9]&lt;br /&gt;
--    nivel 2 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [5,4]&lt;br /&gt;
--    nivel 3 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
nivel = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.4.  Los divisores medios de un número son los que ocupan&lt;br /&gt;
-- la posición media entre los divisores de n, ordenados de menor a&lt;br /&gt;
-- mayor. Por ejemplo, los divisores de 60 son &lt;br /&gt;
-- [1,2,3,4,5,6,10,12,15,20,30,60] y sus divisores medios son 6 y 10.&lt;br /&gt;
-- &lt;br /&gt;
-- El árbol de factorización de un número compuesto n se construye de la&lt;br /&gt;
-- siguiente manera: &lt;br /&gt;
--    * la raíz es el número n, &lt;br /&gt;
--    * la rama izquierda es el árbol de factorización de su divisor&lt;br /&gt;
--      medio menor y&lt;br /&gt;
--    * la rama derecha es el árbol de factorización de su divisor&lt;br /&gt;
--      medio mayor&lt;br /&gt;
-- Si el número es primo, su árbol de factorización sólo tiene una hoja&lt;br /&gt;
-- con dicho número. Por ejemplo, el árbol de factorización de 60 es&lt;br /&gt;
--        60&lt;br /&gt;
--       /  \&lt;br /&gt;
--      6    10&lt;br /&gt;
--     / \   / \&lt;br /&gt;
--    2   3 2   5&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    arbolFactorizacion :: Int -&amp;gt; Arbol3&lt;br /&gt;
-- tal que (arbolFactorizacion n) es el árbol de factorización de n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    arbolFactorizacion 60 == N3 60 (N3 6 (H3 2) (H3 3)) (N3 10 (H3 2) (H3 5))&lt;br /&gt;
--    arbolFactorizacion 45 == N3 45 (H3 5) (N3 9 (H3 3) (H3 3))&lt;br /&gt;
--    arbolFactorizacion 7  == H3 7&lt;br /&gt;
--    arbolFactorizacion 14 == N3 14 (H3 2) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 28 == N3 28 (N3 4 (H3 2) (H3 2)) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 84 == N3 84 (H3 7) (N3 12 (H3 3) (N3 4 (H3 2) (H3 2)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adriana Gordillo&lt;br /&gt;
arbolFactorizacion :: Int -&amp;gt; Arbol3 Int&lt;br /&gt;
arbolFactorizacion n | primo n    = (H3 n)&lt;br /&gt;
                     | otherwise  = (N3 n i d)&lt;br /&gt;
                     where i = arbolFactorizacion (divisorMedioMenor n)&lt;br /&gt;
                           d = arbolFactorizacion (divisorMedioMayor n)&lt;br /&gt;
&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..n], rem n x == 0]&lt;br /&gt;
divisorMedioMenor n | even (length (divisores n))  = last (take (div (length (divisores n)) 2) (divisores n)) &lt;br /&gt;
                    | otherwise                    = (divisores n) !! (div (length (divisores n)) 2)&lt;br /&gt;
divisorMedioMayor n | even (length (divisores n))  = head (drop (div (length (divisores n)) 2) (divisores n))&lt;br /&gt;
                    | otherwise                    = (divisores n) !! (div (length (divisores n)) 2)&lt;br /&gt;
&lt;br /&gt;
primo n = length (divisores n) == 2&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se consideran los árboles con operaciones booleanas&lt;br /&gt;
-- definidos por   &lt;br /&gt;
--    data ArbolB = HB Bool &lt;br /&gt;
--                | Conj ArbolB ArbolB&lt;br /&gt;
--                | Disy ArbolB ArbolB&lt;br /&gt;
--                | Neg ArbolB&lt;br /&gt;
-- &lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--                Conj                            Conj          &lt;br /&gt;
--               /   \                           /   \          &lt;br /&gt;
--              /     \                         /     \         &lt;br /&gt;
--           Disy      Conj                  Disy      Conj     &lt;br /&gt;
--          /   \       /  \                /   \      /   \    &lt;br /&gt;
--       Conj    Neg   Neg True          Conj    Neg   Neg  True &lt;br /&gt;
--       /  \    |     |                 /  \    |     |        &lt;br /&gt;
--    True False False False          True False True  False     &lt;br /&gt;
--&lt;br /&gt;
-- se definen por&lt;br /&gt;
--    ej1, ej2:: ArbolB&lt;br /&gt;
--    ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB False)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
--    &lt;br /&gt;
--    ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB True)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorB :: ArbolB -&amp;gt; Bool&lt;br /&gt;
-- tal que (valorB ar) es el resultado de procesar el árbol realizando&lt;br /&gt;
-- las operaciones booleanas especificadas en los nodos. Por ejemplo,&lt;br /&gt;
--    valorB ej1 == True&lt;br /&gt;
--    valorB ej2 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolB = HB Bool &lt;br /&gt;
            | Conj ArbolB ArbolB&lt;br /&gt;
            | Disy ArbolB ArbolB&lt;br /&gt;
            | Neg ArbolB&lt;br /&gt;
&lt;br /&gt;
ej1, ej2:: ArbolB&lt;br /&gt;
ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB False)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB True)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
valorB:: ArbolB -&amp;gt; Bool&lt;br /&gt;
valorB = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Los árboles generales se pueden representar mediante el&lt;br /&gt;
-- siguiente tipo de dato  &lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--                  deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3               3&lt;br /&gt;
--     / \             /|\            / | \&lt;br /&gt;
--    2   3           / | \          /  |  \&lt;br /&gt;
--        |          5  4  7        5   4   7&lt;br /&gt;
--        4          |     /\       |   |  / \&lt;br /&gt;
--                   6    2  1      6   1 2   1&lt;br /&gt;
--                                     / \&lt;br /&gt;
--                                    2   3&lt;br /&gt;
--                                        |&lt;br /&gt;
--                                        4&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
--    ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
--    ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (ramifica a1 a2 p) el árbol que resulta de ańadir una copia&lt;br /&gt;
-- del árbol a2 a los nodos de a1 que cumplen un predicado p. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;4) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;3) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []]]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;2) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;1) =&amp;gt; NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;0) =&amp;gt; NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []],NG 8 []]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
              deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
&lt;br /&gt;
-- Nicolás Rodríguez, Elsa Domínguez&lt;br /&gt;
ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
ramifica (NG a []) x p | p a        = NG a [x]&lt;br /&gt;
                       | otherwise  = NG a []&lt;br /&gt;
ramifica (NG a xs) x p | p a        = NG a ([ramifica ys x p | ys &amp;lt;- xs] ++ [x])&lt;br /&gt;
                       | otherwise  = NG a [ramifica ys x p | ys &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--José Manuel García &lt;br /&gt;
ramifica1 :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
ramifica1 (NG x xs) (a) f | (f x) = (NG x ( ([ramifica1 y a f | y &amp;lt;-xs ]) ++ [a] ) )&lt;br /&gt;
                         | otherwise = (NG x ([ramifica1 y a f | y &amp;lt;-xs ]) )&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir la función&lt;br /&gt;
--    nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (nHojas x) es el número de hojas del árbol x. Por ejemplo,&lt;br /&gt;
--    nHojasG ejG1  ==  2&lt;br /&gt;
--    nHojasG ejG2  ==  4&lt;br /&gt;
--    nHojasG ejG3  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez&lt;br /&gt;
nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
nHojasG (NG _ []) = 1&lt;br /&gt;
nHojasG (NG _ xs) = sum [nHojasG ys | ys &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir la función&lt;br /&gt;
--    profundidad :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (profundidadG x) es la profundidad del árbol x. Por ejemplo,&lt;br /&gt;
--    profundidadG ejG1  ==  2&lt;br /&gt;
--    profundidadG ejG2  ==  2&lt;br /&gt;
--    profundidadG ejG3  ==  4&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez&lt;br /&gt;
profundidadG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
profundidadG (NG _ []) = 0&lt;br /&gt;
profundidadG (NG _ xs) = 1 + maximum [profundidadG ys | ys &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.4. Definir la función&lt;br /&gt;
--    bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (bin2gen x) es la traducción del árbol x definido con el tipo&lt;br /&gt;
-- &amp;quot;Arbol3&amp;quot; (es decir, árbol binario) a &amp;quot;ArbolG&amp;quot; (es decir, árbol&lt;br /&gt;
-- genérico). Por ejemplo,&lt;br /&gt;
--    bin2gen (N3 9 (N3 3 (H3 2) (H3 4)) (H3 7)) ==  (NG 9 [NG 3 [NG 2 [],NG 4 []], NG 7 []])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez, Adriana Gordillo&lt;br /&gt;
bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
bin2gen (H3 a) = NG a []&lt;br /&gt;
bin2gen (N3 a i d) = NG a [bin2gen i, bin2gen d]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Las expresiones aritméticas básicas pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr1 = C1 Int &lt;br /&gt;
--               | S1 Expr1 Expr1 &lt;br /&gt;
--               | P1 Expr1 Expr1  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(3+7) se representa por&lt;br /&gt;
--    P1 (C1 2) (S1 (C1 3) (C1 7))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor e) es el valor de la expresión aritmética e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valor (P1 (C1 2) (S1 (C1 3) (C1 7)))  ==  20&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr1 = C1 Int &lt;br /&gt;
           | S1 Expr1 Expr1 &lt;br /&gt;
           | P1 Expr1 Expr1  &lt;br /&gt;
           deriving Show&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez, Adriana Gordillo                  &lt;br /&gt;
valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
valor (C1 a) = a&lt;br /&gt;
valor (S1 i d) = valor i + valor d&lt;br /&gt;
valor (P1 i d) = valor i * valor d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir la función  &lt;br /&gt;
--    aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
-- tal que (aplica f e) es la expresión obtenida aplicando la función f&lt;br /&gt;
-- a cada uno de los números de la expresión e. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; aplica (+2) (S1 (P1 (C1 3) (C1 5)) (P1 (C1 6) (C1 7)))&lt;br /&gt;
--    S1 (P1 (C1 5) (C1 7)) (P1 (C1 8) (C1 9))&lt;br /&gt;
--    ghci&amp;gt; aplica (*2) (S1 (P1 (C1 3) (C1 5)) (P1 (C1 6) (C1 7)))&lt;br /&gt;
--    S1 (P1 (C1 6) (C1 10)) (P1 (C1 12) (C1 14))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Nicolás Rodríguez, Adriana Gordillo&lt;br /&gt;
aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
aplica f (C1 a) = C1 (f a)&lt;br /&gt;
aplica f (S1 i d) = S1 (aplica f i) (aplica f d)&lt;br /&gt;
aplica f (P1 i d) = P1 (aplica f i) (aplica f d)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Las expresiones aritméticas construidas con una&lt;br /&gt;
-- variable (denotada por X), los números enteros y las operaciones de&lt;br /&gt;
-- sumar y multiplicar se pueden representar mediante el tipo de datos&lt;br /&gt;
-- Expr2 definido por     &lt;br /&gt;
--    data Expr2 = X&lt;br /&gt;
--               | C2 Int&lt;br /&gt;
--               | S2 Expr2 Expr2&lt;br /&gt;
--               | P2 Expr2 Expr2&lt;br /&gt;
-- Por ejemplo, la expresión &amp;quot;X*(13+X)&amp;quot; se representa por&lt;br /&gt;
-- &amp;quot;P2 X (S2 (C2 13) X)&amp;quot;.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
-- tal que (valorE e n) es el valor de la expresión e cuando se&lt;br /&gt;
-- sustituye su variable por n. Por ejemplo,&lt;br /&gt;
--    valorE (P2 X (S2 (C2 13) X)) 2  ==  30&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Expr2 = X&lt;br /&gt;
           | C2 Int&lt;br /&gt;
           | S2 Expr2 Expr2&lt;br /&gt;
           | P2 Expr2 Expr2&lt;br /&gt;
&lt;br /&gt;
valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
valorE = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Definir la función&lt;br /&gt;
--    numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
-- tal que (numVars e) es el número de variables en la expresión e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    numVars (C2 3)                 ==  0&lt;br /&gt;
--    numVars X                      ==  1&lt;br /&gt;
--    numVars (P2 X (S2 (C2 13) X))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
numVars = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Las expresiones aritméticas con variables pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr3 = C3 Int &lt;br /&gt;
--               | V3 Char &lt;br /&gt;
--               | S3 Expr3 Expr3 &lt;br /&gt;
--               | P3 Expr3 Expr3  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(a+5) se representa por&lt;br /&gt;
--    P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (C3 5))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor3 x e) es el valor3 de la expresión x en el entorno e (es&lt;br /&gt;
-- decir, el valor3 de la expresión donde las variables de x se sustituyen&lt;br /&gt;
-- por los valores según se indican en el entorno e). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; valor3 (P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (V3 &amp;#039;b&amp;#039;))) [(&amp;#039;a&amp;#039;,2),(&amp;#039;b&amp;#039;,5)]&lt;br /&gt;
--    14&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr3 = C3 Int &lt;br /&gt;
           | V3 Char &lt;br /&gt;
           | S3 Expr3 Expr3 &lt;br /&gt;
           | P3 Expr3 Expr3  &lt;br /&gt;
           deriving Show&lt;br /&gt;
                   &lt;br /&gt;
valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
valor3 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir la función&lt;br /&gt;
--    sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
-- tal que (sumas e) es el número de sumas en la expresión e. Por &lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  1&lt;br /&gt;
--    sumas (S3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  2&lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (P3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
                   &lt;br /&gt;
sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
sumas = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Definir la función&lt;br /&gt;
--    sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
-- tal que (sustitucion e s) es la expresión obtenida sustituyendo las&lt;br /&gt;
-- variables de la expresión e según se indica en la sustitución s. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (C3 7))&lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
                   &lt;br /&gt;
sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
sustitucion = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.4. Definir la función&lt;br /&gt;
--    reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (reducible a) se verifica si a es una expresión reducible; es&lt;br /&gt;
-- decir, contiene una operación en la que los dos operandos son números. &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    reducible (S3 (C3 3) (C3 4))               == True&lt;br /&gt;
--    reducible (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))             == False&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (C3 4) (C3 5)))   == True&lt;br /&gt;
--    reducible (S3 (V3 &amp;#039;x&amp;#039;) (P3 (C3 4) (C3 5))) == True&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (V3 &amp;#039;x&amp;#039;) (C3 5))) == False&lt;br /&gt;
--    reducible (C3 3)                           == False&lt;br /&gt;
--    reducible (V3 &amp;#039;x&amp;#039;)                         == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
reducible = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Las expresiones aritméticas generales se pueden definir&lt;br /&gt;
-- usando el siguiente tipo de datos &lt;br /&gt;
--    data Expr4 = C4 Int &lt;br /&gt;
--               | Y &lt;br /&gt;
--               | S4 Expr4 Expr4 &lt;br /&gt;
--               | R4 Expr4 Expr4 &lt;br /&gt;
--               | P4 Expr4 Expr4 &lt;br /&gt;
--               | E4 Expr4 Int&lt;br /&gt;
--               deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, la expresión &lt;br /&gt;
--    3*x - (x+2)^7&lt;br /&gt;
-- se puede definir por&lt;br /&gt;
--    R4 (P4 (C4 3) Y) (E4 (S4 Y (C4 2)) 7)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función  &lt;br /&gt;
--    maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
-- tal que (maximo e xs) es el par formado por el máximo valor de la&lt;br /&gt;
-- expresión e para los puntos de xs y en qué puntos alcanza el&lt;br /&gt;
-- máximo. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; maximo (E4 (S4 (C4 10) (P4 (R4 (C4 1) Y) Y)) 2) [-3..3]&lt;br /&gt;
--    (100,[0,1])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr4 = C4 Int &lt;br /&gt;
          | Y &lt;br /&gt;
          | S4 Expr4 Expr4 &lt;br /&gt;
          | R4 Expr4 Expr4 &lt;br /&gt;
          | P4 Expr4 Expr4 &lt;br /&gt;
          | E4 Expr4 Int&lt;br /&gt;
          deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
maximo e ns = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Las operaciones de suma, resta y  multiplicación se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de datos &lt;br /&gt;
--    data Op = Su | Re | Mu&lt;br /&gt;
-- La expresiones aritméticas con dichas operaciones se pueden&lt;br /&gt;
-- representar mediante el siguiente tipo de dato algebraico&lt;br /&gt;
--    data Expr5 = C5 Int &lt;br /&gt;
--               | A Op Expr5 Expr&lt;br /&gt;
-- Por ejemplo, la expresión&lt;br /&gt;
--    (7-3)+(2*5)&lt;br /&gt;
-- se representa por&lt;br /&gt;
--    A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
-- tal que (valorEG e) es el valorEG de la expresión e. Por ejemplo,&lt;br /&gt;
--    valorEG (A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5)))  ==  14&lt;br /&gt;
--    valorEG (A Mu (A Re (C5 7) (C5 3)) (A Su (C5 2) (C5 5)))  ==  28&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Op = Su | Re | Mu&lt;br /&gt;
&lt;br /&gt;
data Expr5 = C5 Int | A Op Expr5 Expr5&lt;br /&gt;
&lt;br /&gt;
valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
valorEG = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Se consideran las expresiones vectoriales formadas por&lt;br /&gt;
-- un vector, la suma de dos expresiones vectoriales o el producto de un&lt;br /&gt;
-- entero por una expresión vectorial. El siguiente tipo de dato define&lt;br /&gt;
-- las expresiones vectoriales  &lt;br /&gt;
--    data ExpV = Vec Int Int&lt;br /&gt;
--              | Sum ExpV ExpV&lt;br /&gt;
--              | Mul Int ExpV&lt;br /&gt;
--              deriving Show&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que (valorEV e) es el valorEV de la expresión vectorial c. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valorEV (Vec 1 2)                                  ==  (1,2)&lt;br /&gt;
--    valorEV (Sum (Vec 1 2 ) (Vec 3 4))                 ==  (4,6)&lt;br /&gt;
--    valorEV (Mul 2 (Vec 3 4))                          ==  (6,8)&lt;br /&gt;
--    valorEV (Mul 2 (Sum (Vec 1 2 ) (Vec 3 4)))         ==  (8,12)&lt;br /&gt;
--    valorEV (Sum (Mul 2 (Vec 1 2)) (Mul 2 (Vec 3 4)))  ==  (8,12)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ExpV = Vec Int Int&lt;br /&gt;
          | Sum ExpV ExpV&lt;br /&gt;
          | Mul Int ExpV&lt;br /&gt;
          deriving Show&lt;br /&gt;
&lt;br /&gt;
valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
valorEV = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. (Examen 12 de marzo de 2015, grupo 4)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Consideremos los árboles binarios con etiquetas en las&lt;br /&gt;
-- hojas y en los nodos. Por ejemplo,&lt;br /&gt;
--          5       &lt;br /&gt;
--         / \      &lt;br /&gt;
--        2   4      &lt;br /&gt;
--           / \    &lt;br /&gt;
--          7   1&lt;br /&gt;
--             / \&lt;br /&gt;
--            2   3   &lt;br /&gt;
-- &lt;br /&gt;
-- Un camino es una sucesión de nodos desde la raiz hasta una hoja. Por&lt;br /&gt;
-- ejemplo, [5,2] y [5,4,1,2] son caminos que llevan a 2, mientras que&lt;br /&gt;
-- [5,4,1] no es un camino, pues no lleva a una hoja.&lt;br /&gt;
-- &lt;br /&gt;
-- Definimos el tipo de dato Arbol y el ejemplo por&lt;br /&gt;
--    data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
--    &lt;br /&gt;
--    arb1:: Arbol &lt;br /&gt;
--    arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    maxLong :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
-- tal que (maxLong x a) es la longitud máxima de los caminos que&lt;br /&gt;
-- terminan en x. Por ejemplo, &lt;br /&gt;
--    maxLong 3 arb1 == 4&lt;br /&gt;
--    maxLong 2 arb1 == 4&lt;br /&gt;
--    maxLong 7 arb1 == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
             deriving Show&lt;br /&gt;
&lt;br /&gt;
arb1:: Arbol &lt;br /&gt;
arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
&lt;br /&gt;
maxLong :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
maxLong = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. (Examen 5 de diciembre de 2017, grupo 1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles con un número variable de sucesores se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de dato&lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1         1             1          &lt;br /&gt;
--     / \       / \           / \   &lt;br /&gt;
--    8   3     8   3         8   3  &lt;br /&gt;
--        |        /|\       /|\  |   &lt;br /&gt;
--        4       4 5 6     4 5 6 7&lt;br /&gt;
-- se representan por&lt;br /&gt;
--   ej21, ej22, ej23 :: ArbolG Int&lt;br /&gt;
--   ej21 = NG 1 [NG 8 [],NG 3 [NG 4 []]]&lt;br /&gt;
--   ej22 = NG 1 [NG 8 [], NG 3 [NG 4 [], NG 5 [], NG 6 []]]&lt;br /&gt;
--   ej23 = NG 1 [NG 8 [NG 4 [], NG 5 [], NG 6 []], NG 3 [NG 7 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     caminosDesdeRaiz :: ArbolG a -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (caminosDesdeRaiz x) es la lista de todos los caminos desde&lt;br /&gt;
-- la raiz. Por ejemplo,&lt;br /&gt;
--     caminosDesdeRaiz ej21 == [[1,8],[1,3,4]]&lt;br /&gt;
--     caminosDesdeRaiz ej22 == [[1,8],[1,3,4],[1,3,5],[1,3,6]]&lt;br /&gt;
--     caminosDesdeRaiz ej23 == [[1,8,4],[1,8,5],[1,8,6],[1,3,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ej21, ej22, ej23 :: ArbolG Int&lt;br /&gt;
ej21 = NG 1 [NG 8 [],NG 3 [NG 4 []]]&lt;br /&gt;
ej22 = NG 1 [NG 8 [], NG 3 [NG 4 [], NG 5 [], NG 6 []]]&lt;br /&gt;
ej23 = NG 1 [NG 8 [NG 4 [], NG 5 [], NG 6 []], NG 3 [NG 7 []]]&lt;br /&gt;
&lt;br /&gt;
caminosDesdeRaiz :: ArbolG a -&amp;gt; [[a]]&lt;br /&gt;
caminosDesdeRaiz = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. (Examen 1 de septiembre de 2016)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles se pueden representar mediante el siguiente&lt;br /&gt;
-- tipo de datos &lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3&lt;br /&gt;
--     / \             /|\ &lt;br /&gt;
--    2   3           / | \&lt;br /&gt;
--        |          5  4  7&lt;br /&gt;
--        4          |     /\ &lt;br /&gt;
--                   6    2  1&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ej31, ej32 :: ArbolG Int&lt;br /&gt;
--    ej31 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ej32 = NG 3 [NG 5 [NG 6 []], NG 4 [], NG 7 [NG 2 [], NG 1 []]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    ramasLargas :: ArbolG b -&amp;gt; [[b]]&lt;br /&gt;
-- tal que (ramasLargas a) es la lista de las ramas más largas del árbol&lt;br /&gt;
-- a. Por ejemplo, &lt;br /&gt;
--    ramas ej31  ==  [[1,3,4]]&lt;br /&gt;
--    ramas ej32  ==  [[3,5,6],[3,7,2],[3,7,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ej31, ej32 :: ArbolG Int&lt;br /&gt;
ej31 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
ej32 = NG 3 [NG 5 [NG 6 []], NG 4 [], NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
&lt;br /&gt;
ramasLargas :: ArbolG b -&amp;gt; [[b]]&lt;br /&gt;
ramasLargas = undefined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13&amp;diff=589</id>
		<title>Relación 13</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_13&amp;diff=589"/>
		<updated>2022-01-14T09:23:59Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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: Relación 13 (14 de enero de 2022)&lt;br /&gt;
-- Tipos de datos algebraicos (II).&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 presenta ejercicios sobre distintos tipos de&lt;br /&gt;
-- datos algebraicos. Concretamente,&lt;br /&gt;
--    * Árboles binarios:&lt;br /&gt;
--      + Árboles binarios con valores en los nodos.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas.&lt;br /&gt;
--      + Árboles binarios con valores en las hojas y en los nodos.&lt;br /&gt;
--      + Árboles booleanos.  &lt;br /&gt;
--    * Árboles generales&lt;br /&gt;
--    * Expresiones aritméticas&lt;br /&gt;
--      + Expresiones aritméticas básicas.&lt;br /&gt;
--      + Expresiones aritméticas con una variable.&lt;br /&gt;
--      + Expresiones aritméticas con varias variables.&lt;br /&gt;
--      + Expresiones aritméticas generales. &lt;br /&gt;
--      + Expresiones aritméticas con tipo de operaciones.&lt;br /&gt;
--    * Expresiones vectoriales&lt;br /&gt;
-- &lt;br /&gt;
-- Los ejercicios corresponden al tema 9 que se encuentran en &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/temas/tema-9.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Los árboles binarios con valores en los nodos se&lt;br /&gt;
-- pueden definir por&lt;br /&gt;
--    data Arbol1 a = H1 &lt;br /&gt;
--                  | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
--                  deriving (Show, Eq)&lt;br /&gt;
-- Por ejemplo, el árbol&lt;br /&gt;
--         9                &lt;br /&gt;
--        / \    &lt;br /&gt;
--       /   \   &lt;br /&gt;
--      8     6  &lt;br /&gt;
--     / \   / \ &lt;br /&gt;
--    3   2 4   5&lt;br /&gt;
-- se puede representar por&lt;br /&gt;
--    N1 9 (N1 8 (N1 3 H1 H1) (N1 2 H1 H1)) (N1 6 (N1 4 H1 H1) (N1 5 H1 H1))&lt;br /&gt;
--&lt;br /&gt;
-- Definir por recursión la función &lt;br /&gt;
--    sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
-- tal (sumaArbol x) es la suma de los valores que hay en el árbol&lt;br /&gt;
-- x. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; sumaArbol (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))  &lt;br /&gt;
--    21&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol1 a = H1 &lt;br /&gt;
             | N1 a (Arbol1 a) (Arbol1 a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
&lt;br /&gt;
sumaArbol :: Num a =&amp;gt; Arbol1 a -&amp;gt; a&lt;br /&gt;
sumaArbol = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la función &lt;br /&gt;
--    mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
-- tal que (mapArbol f x) es el árbol que resulta de sustituir cada nodo&lt;br /&gt;
-- n del árbol x por (f n). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; mapArbol (+1) (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    N1 3 (N1 6 (N1 4 H1 H1) (N1 8 H1 H1)) (N1 5 H1 H1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
mapArbol :: (a -&amp;gt; b) -&amp;gt; Arbol1 a -&amp;gt; Arbol1 b&lt;br /&gt;
mapArbol = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la función&lt;br /&gt;
--    ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (ramaIzquierda a) es la lista de los valores de los nodos de&lt;br /&gt;
-- la rama izquierda del árbol a. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; ramaIzquierda (N1 2 (N1 5 (N1 3 H1 H1) (N1 7 H1 H1)) (N1 4 H1 H1))&lt;br /&gt;
--    [2,5,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ramaIzquierda :: Arbol1 a -&amp;gt; [a]&lt;br /&gt;
ramaIzquierda = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.4. Diremos que un árbol está balanceado si para cada nodo&lt;br /&gt;
-- v la diferencia entre el número de nodos (con valor) de sus subárboles&lt;br /&gt;
-- izquierdo y derecho es menor o igual que uno.  &lt;br /&gt;
--&lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (balanceado a) se verifica si el árbol a está balanceado. Por &lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 H1 H1))           == True&lt;br /&gt;
--    balanceado (N1 5 H1 (N1 3 (N1 4 H1 H1) H1)) == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
balanceado :: Arbol1 a -&amp;gt; Bool&lt;br /&gt;
balanceado = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Los árboles binarios con valores en las hojas se pueden&lt;br /&gt;
-- definir por&lt;br /&gt;
--    data Arbol2 a = H2 a&lt;br /&gt;
--                  | N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
--                  deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles &lt;br /&gt;
--    árbol1          árbol2       árbol3     árbol4 &lt;br /&gt;
--       o              o           o           o    &lt;br /&gt;
--      / \            / \         / \         / \   &lt;br /&gt;
--     1   o          o   3       o   3       o   1  &lt;br /&gt;
--        / \        / \         / \         / \     &lt;br /&gt;
--       2   3      1   2       1   4       2   3    &lt;br /&gt;
-- se representan por&lt;br /&gt;
--    arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
--    arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
--    arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
--    arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
--    arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualBorde t1 t2) se verifica si los bordes de los árboles&lt;br /&gt;
-- t1 y t2 son iguales. Por ejemplo,&lt;br /&gt;
--    igualBorde arbol1 arbol2  ==  True&lt;br /&gt;
--    igualBorde arbol1 arbol3  ==  False&lt;br /&gt;
--    igualBorde arbol1 arbol4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol2 a = N2 (Arbol2 a) (Arbol2 a) &lt;br /&gt;
              | H2 a&lt;br /&gt;
              deriving Show&lt;br /&gt;
&lt;br /&gt;
arbol1, arbol2, arbol3, arbol4 :: Arbol2 Int&lt;br /&gt;
arbol1 = N2 (H2 1) (N2 (H2 2) (H2 3))&lt;br /&gt;
arbol2 = N2 (N2 (H2 1) (H2 2)) (H2 3)&lt;br /&gt;
arbol3 = N2 (N2 (H2 1) (H2 4)) (H2 3)&lt;br /&gt;
arbol4 = N2 (N2 (H2 2) (H2 3)) (H2 1)&lt;br /&gt;
&lt;br /&gt;
igualBorde :: Eq a =&amp;gt; Arbol2 a -&amp;gt; Arbol2 a -&amp;gt; Bool&lt;br /&gt;
igualBorde t1 t2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Los árboles binarios con valores en las hojas y en los&lt;br /&gt;
-- nodos se definen por&lt;br /&gt;
--    data Arbol3 a = H3 a&lt;br /&gt;
--                 | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--         5              8             5           5&lt;br /&gt;
--        / \            / \           / \         / \&lt;br /&gt;
--       /   \          /   \         /   \       /   \&lt;br /&gt;
--      9     7        9     3       9     2     4     7&lt;br /&gt;
--     / \   / \      / \   / \     / \               / \&lt;br /&gt;
--    1   4 6   8    1   4 6   2   1   4             6   2&lt;br /&gt;
-- se pueden representar por&lt;br /&gt;
--    ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
--    ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
--    ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
--    ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
--    ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    igualEstructura :: Arbol3 -&amp;gt; Arbol3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (igualEstructura a1 a1) se verifica si los árboles a1 y a2 &lt;br /&gt;
-- tienen la misma estructura. Por ejemplo,&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol2 == True&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol3 == False&lt;br /&gt;
--    igualEstructura ej3arbol1 ej3arbol4 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol3 a = H3 a&lt;br /&gt;
              | N3 a (Arbol3 a) (Arbol3 a) &lt;br /&gt;
              deriving Show&lt;br /&gt;
&lt;br /&gt;
ej3arbol1, ej3arbol2, ej3arbol3, ej3arbol4 :: Arbol3 Int&lt;br /&gt;
ej3arbol1 = N3 5 (N3 9 (H3 1) (H3 4)) (N3 7 (H3 6) (H3 8))&lt;br /&gt;
ej3arbol2 = N3 8 (N3 9 (H3 1) (H3 4)) (N3 3 (H3 6) (H3 2))&lt;br /&gt;
ej3arbol3 = N3 5 (N3 9 (H3 1) (H3 4)) (H3 2)&lt;br /&gt;
ej3arbol4 = N3 5 (H3 4) (N3 7 (H3 6) (H3 2))&lt;br /&gt;
&lt;br /&gt;
igualEstructura :: Arbol3 a -&amp;gt; Arbol3 a -&amp;gt; Bool&lt;br /&gt;
igualEstructura = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir la función&lt;br /&gt;
--    algunoArbol :: Arbol3 t -&amp;gt; (t -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
-- tal que (algunoArbol a p) se verifica si algún elemento del árbol a&lt;br /&gt;
-- cumple la propiedad p. Por ejemplo,&lt;br /&gt;
--    algunoArbol3 (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;4)  ==  True&lt;br /&gt;
--    algunoArbol3 (N3 5 (N3 3 (H3 1) (H3 4)) (H3 2)) (&amp;gt;7)  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
algunoArbol :: Arbol3 a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; Bool&lt;br /&gt;
algunoArbol = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Un elemento de un árbol se dirá de nivel k si aparece&lt;br /&gt;
-- en el árbol a distancia k  de la raíz.  &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
-- tal que (nivel k a) es la lista de los elementos de nivel k del árbol&lt;br /&gt;
-- a. Por ejemplo,&lt;br /&gt;
--    nivel 0 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [7]&lt;br /&gt;
--    nivel 1 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [2,9]&lt;br /&gt;
--    nivel 2 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  [5,4]&lt;br /&gt;
--    nivel 3 (N3 7 (N3 2 (H3 5) (H3 4)) (H3 9))  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nivel :: Int -&amp;gt; Arbol3 a -&amp;gt; [a]&lt;br /&gt;
nivel = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.4.  Los divisores medios de un número son los que ocupan&lt;br /&gt;
-- la posición media entre los divisores de n, ordenados de menor a&lt;br /&gt;
-- mayor. Por ejemplo, los divisores de 60 son &lt;br /&gt;
-- [1,2,3,4,5,6,10,12,15,20,30,60] y sus divisores medios son 6 y 10.&lt;br /&gt;
-- &lt;br /&gt;
-- El árbol de factorización de un número compuesto n se construye de la&lt;br /&gt;
-- siguiente manera: &lt;br /&gt;
--    * la raíz es el número n, &lt;br /&gt;
--    * la rama izquierda es el árbol de factorización de su divisor&lt;br /&gt;
--      medio menor y&lt;br /&gt;
--    * la rama derecha es el árbol de factorización de su divisor&lt;br /&gt;
--      medio mayor&lt;br /&gt;
-- Si el número es primo, su árbol de factorización sólo tiene una hoja&lt;br /&gt;
-- con dicho número. Por ejemplo, el árbol de factorización de 60 es&lt;br /&gt;
--        60&lt;br /&gt;
--       /  \&lt;br /&gt;
--      6    10&lt;br /&gt;
--     / \   / \&lt;br /&gt;
--    2   3 2   5&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    arbolFactorizacion :: Int -&amp;gt; Arbol3&lt;br /&gt;
-- tal que (arbolFactorizacion n) es el árbol de factorización de n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    arbolFactorizacion 60 == N3 60 (N3 6 (H3 2) (H3 3)) (N3 10 (H3 2) (H3 5))&lt;br /&gt;
--    arbolFactorizacion 45 == N3 45 (H3 5) (N3 9 (H3 3) (H3 3))&lt;br /&gt;
--    arbolFactorizacion 7  == H3 7&lt;br /&gt;
--    arbolFactorizacion 14 == N3 14 (H3 2) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 28 == N3 28 (N3 4 (H3 2) (H3 2)) (H3 7)&lt;br /&gt;
--    arbolFactorizacion 84 == N3 84 (H3 7) (N3 12 (H3 3) (N3 4 (H3 2) (H3 2)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adriana Gordillo&lt;br /&gt;
arbolFactorizacion :: Int -&amp;gt; Arbol3 Int&lt;br /&gt;
arbolFactorizacion n | primo n    = (H3 n)&lt;br /&gt;
                     | otherwise  = (N3 n i d)&lt;br /&gt;
                     where i = arbolFactorizacion (divisorMedioMenor n)&lt;br /&gt;
                           d = arbolFactorizacion (divisorMedioMayor n)&lt;br /&gt;
&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..n], rem n x == 0]&lt;br /&gt;
divisorMedioMenor n | even (length (divisores n))  = last (take (div (length (divisores n)) 2) (divisores n)) &lt;br /&gt;
                    | otherwise                    = (divisores n) !! (div (length (divisores n)) 2)&lt;br /&gt;
divisorMedioMayor n | even (length (divisores n))  = head (drop (div (length (divisores n)) 2) (divisores n))&lt;br /&gt;
                    | otherwise                    = (divisores n) !! (div (length (divisores n)) 2)&lt;br /&gt;
&lt;br /&gt;
primo n = length (divisores n) == 2&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se consideran los árboles con operaciones booleanas&lt;br /&gt;
-- definidos por   &lt;br /&gt;
--    data ArbolB = HB Bool &lt;br /&gt;
--                | Conj ArbolB ArbolB&lt;br /&gt;
--                | Disy ArbolB ArbolB&lt;br /&gt;
--                | Neg ArbolB&lt;br /&gt;
-- &lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--                Conj                            Conj          &lt;br /&gt;
--               /   \                           /   \          &lt;br /&gt;
--              /     \                         /     \         &lt;br /&gt;
--           Disy      Conj                  Disy      Conj     &lt;br /&gt;
--          /   \       /  \                /   \      /   \    &lt;br /&gt;
--       Conj    Neg   Neg True          Conj    Neg   Neg  True &lt;br /&gt;
--       /  \    |     |                 /  \    |     |        &lt;br /&gt;
--    True False False False          True False True  False     &lt;br /&gt;
--&lt;br /&gt;
-- se definen por&lt;br /&gt;
--    ej1, ej2:: ArbolB&lt;br /&gt;
--    ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB False)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
--    &lt;br /&gt;
--    ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
--                     (Neg (HB True)))&lt;br /&gt;
--               (Conj (Neg (HB False))&lt;br /&gt;
--                     (HB True))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorB :: ArbolB -&amp;gt; Bool&lt;br /&gt;
-- tal que (valorB ar) es el resultado de procesar el árbol realizando&lt;br /&gt;
-- las operaciones booleanas especificadas en los nodos. Por ejemplo,&lt;br /&gt;
--    valorB ej1 == True&lt;br /&gt;
--    valorB ej2 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolB = HB Bool &lt;br /&gt;
            | Conj ArbolB ArbolB&lt;br /&gt;
            | Disy ArbolB ArbolB&lt;br /&gt;
            | Neg ArbolB&lt;br /&gt;
&lt;br /&gt;
ej1, ej2:: ArbolB&lt;br /&gt;
ej1 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB False)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
ej2 = Conj (Disy (Conj (HB True) (HB False))&lt;br /&gt;
                 (Neg (HB True)))&lt;br /&gt;
           (Conj (Neg (HB False))&lt;br /&gt;
                 (HB True))&lt;br /&gt;
&lt;br /&gt;
valorB:: ArbolB -&amp;gt; Bool&lt;br /&gt;
valorB = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Los árboles generales se pueden representar mediante el&lt;br /&gt;
-- siguiente tipo de dato  &lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--                  deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3               3&lt;br /&gt;
--     / \             /|\            / | \&lt;br /&gt;
--    2   3           / | \          /  |  \&lt;br /&gt;
--        |          5  4  7        5   4   7&lt;br /&gt;
--        4          |     /\       |   |  / \&lt;br /&gt;
--                   6    2  1      6   1 2   1&lt;br /&gt;
--                                     / \&lt;br /&gt;
--                                    2   3&lt;br /&gt;
--                                        |&lt;br /&gt;
--                                        4&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
--    ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
--    ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
--                 NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
--                 NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (ramifica a1 a2 p) el árbol que resulta de ańadir una copia&lt;br /&gt;
-- del árbol a2 a los nodos de a1 que cumplen un predicado p. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;4) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;3) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []]]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;2) =&amp;gt; NG 1 [NG 2 [],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;1) =&amp;gt; NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []]]&lt;br /&gt;
--    ramifica ejG1 (NG 8 []) (&amp;gt;0) =&amp;gt; NG 1 [NG 2 [NG 8 []],NG 3 [NG 4 [NG 8 []],NG 8 []],NG 8 []]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
              deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
ejG1, ejG2, ejG3 :: ArbolG Int&lt;br /&gt;
ejG1 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
ejG2 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
ejG3 = NG 3 [NG 5 [NG 6 []], &lt;br /&gt;
           NG 4 [NG 1 [NG 2 [],NG 3 [NG 4 []]]], &lt;br /&gt;
           NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
&lt;br /&gt;
-- Nicolás Rodríguez, Elsa Domínguez&lt;br /&gt;
ramifica :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
ramifica (NG a []) x p | p a        = NG a [x]&lt;br /&gt;
                       | otherwise  = NG a []&lt;br /&gt;
ramifica (NG a xs) x p | p a        = NG a ([ramifica ys x p | ys &amp;lt;- xs] ++ [x])&lt;br /&gt;
                       | otherwise  = NG a [ramifica ys x p | ys &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--José Manuel García &lt;br /&gt;
ramifica1 :: ArbolG a -&amp;gt; ArbolG a -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; ArbolG a&lt;br /&gt;
ramifica1 (NG x xs) (a) f | (f x) = (NG x ( ([ramifica1 y a f | y &amp;lt;-xs ]) ++ [a] ) )&lt;br /&gt;
                         | otherwise = (NG x ([ramifica1 y a f | y &amp;lt;-xs ]) )&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir la función&lt;br /&gt;
--    nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (nHojas x) es el número de hojas del árbol x. Por ejemplo,&lt;br /&gt;
--    nHojasG ejG1  ==  2&lt;br /&gt;
--    nHojasG ejG2  ==  4&lt;br /&gt;
--    nHojasG ejG3  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nHojasG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
nHojasG = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir la función&lt;br /&gt;
--    profundidad :: ArbolG a -&amp;gt; Int&lt;br /&gt;
-- tal que (profundidadG x) es la profundidad del árbol x. Por ejemplo,&lt;br /&gt;
--    profundidadG ejG1  ==  2&lt;br /&gt;
--    profundidadG ejG2  ==  2&lt;br /&gt;
--    profundidadG ejG3  ==  4&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
profundidadG :: ArbolG a -&amp;gt; Int&lt;br /&gt;
profundidadG = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.4. Definir la función&lt;br /&gt;
--    bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
-- tal que (bin2gen x) es la traducción del árbol x definido con el tipo&lt;br /&gt;
-- &amp;quot;Arbol3&amp;quot; (es decir, árbol binario) a &amp;quot;ArbolG&amp;quot; (es decir, árbol&lt;br /&gt;
-- genérico). Por ejemplo,&lt;br /&gt;
--    bin2gen (N3 9 (N3 3 (H3 2) (H3 4)) (H3 7)) ==  (NG 9 [NG 3 [NG 2 [],NG 4 []], NG 7 []])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
bin2gen :: Arbol3 a -&amp;gt; ArbolG a&lt;br /&gt;
bin2gen = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Las expresiones aritméticas básicas pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr1 = C1 Int &lt;br /&gt;
--               | S1 Expr1 Expr1 &lt;br /&gt;
--               | P1 Expr1 Expr1  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(3+7) se representa por&lt;br /&gt;
--    P1 (C1 2) (S1 (C1 3) (C1 7))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor e) es el valor de la expresión aritmética e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valor (P1 (C1 2) (S1 (C1 3) (C1 7)))  ==  20&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr1 = C1 Int &lt;br /&gt;
           | S1 Expr1 Expr1 &lt;br /&gt;
           | P1 Expr1 Expr1  &lt;br /&gt;
           deriving Show&lt;br /&gt;
                   &lt;br /&gt;
valor :: Expr1 -&amp;gt; Int                   &lt;br /&gt;
valor = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir la función  &lt;br /&gt;
--    aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
-- tal que (aplica f e) es la expresión obtenida aplicando la función f&lt;br /&gt;
-- a cada uno de los números de la expresión e. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; aplica (+2) (S1 (P1 (C1 3) (C1 5)) (P1 (C1 6) (C1 7)))&lt;br /&gt;
--    S1 (P1 (C1 5) (C1 7)) (P1 (C1 8) (C1 9))&lt;br /&gt;
--    ghci&amp;gt; aplica (*2) (S1 (P1 (C1 3) (C1 5)) (P1 (C1 6) (C1 7)))&lt;br /&gt;
--    S1 (P1 (C1 6) (C1 10)) (P1 (C1 12) (C1 14))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
aplica :: (Int -&amp;gt; Int) -&amp;gt; Expr1 -&amp;gt; Expr1&lt;br /&gt;
aplica = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Las expresiones aritméticas construidas con una&lt;br /&gt;
-- variable (denotada por X), los números enteros y las operaciones de&lt;br /&gt;
-- sumar y multiplicar se pueden representar mediante el tipo de datos&lt;br /&gt;
-- Expr2 definido por     &lt;br /&gt;
--    data Expr2 = X&lt;br /&gt;
--               | C2 Int&lt;br /&gt;
--               | S2 Expr2 Expr2&lt;br /&gt;
--               | P2 Expr2 Expr2&lt;br /&gt;
-- Por ejemplo, la expresión &amp;quot;X*(13+X)&amp;quot; se representa por&lt;br /&gt;
-- &amp;quot;P2 X (S2 (C2 13) X)&amp;quot;.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
-- tal que (valorE e n) es el valor de la expresión e cuando se&lt;br /&gt;
-- sustituye su variable por n. Por ejemplo,&lt;br /&gt;
--    valorE (P2 X (S2 (C2 13) X)) 2  ==  30&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Expr2 = X&lt;br /&gt;
           | C2 Int&lt;br /&gt;
           | S2 Expr2 Expr2&lt;br /&gt;
           | P2 Expr2 Expr2&lt;br /&gt;
&lt;br /&gt;
valorE :: Expr2 -&amp;gt; Int -&amp;gt; Int&lt;br /&gt;
valorE = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Definir la función&lt;br /&gt;
--    numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
-- tal que (numVars e) es el número de variables en la expresión e. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    numVars (C2 3)                 ==  0&lt;br /&gt;
--    numVars X                      ==  1&lt;br /&gt;
--    numVars (P2 X (S2 (C2 13) X))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numVars :: Expr2 -&amp;gt; Int&lt;br /&gt;
numVars = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Las expresiones aritméticas con variables pueden&lt;br /&gt;
-- representarse usando el siguiente tipo de datos  &lt;br /&gt;
--    data Expr3 = C3 Int &lt;br /&gt;
--               | V3 Char &lt;br /&gt;
--               | S3 Expr3 Expr3 &lt;br /&gt;
--               | P3 Expr3 Expr3  &lt;br /&gt;
--               deriving Show&lt;br /&gt;
-- Por ejemplo, la expresión 2*(a+5) se representa por&lt;br /&gt;
--    P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (C3 5))&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
-- tal que (valor3 x e) es el valor3 de la expresión x en el entorno e (es&lt;br /&gt;
-- decir, el valor3 de la expresión donde las variables de x se sustituyen&lt;br /&gt;
-- por los valores según se indican en el entorno e). Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; valor3 (P3 (C3 2) (S3 (V3 &amp;#039;a&amp;#039;) (V3 &amp;#039;b&amp;#039;))) [(&amp;#039;a&amp;#039;,2),(&amp;#039;b&amp;#039;,5)]&lt;br /&gt;
--    14&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr3 = C3 Int &lt;br /&gt;
           | V3 Char &lt;br /&gt;
           | S3 Expr3 Expr3 &lt;br /&gt;
           | P3 Expr3 Expr3  &lt;br /&gt;
           deriving Show&lt;br /&gt;
                   &lt;br /&gt;
valor3 :: Expr3 -&amp;gt; [(Char,Int)] -&amp;gt; Int                   &lt;br /&gt;
valor3 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir la función&lt;br /&gt;
--    sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
-- tal que (sumas e) es el número de sumas en la expresión e. Por &lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  1&lt;br /&gt;
--    sumas (S3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  2&lt;br /&gt;
--    sumas (P3 (V3 &amp;#039;z&amp;#039;) (P3 (C3 3) (V3 &amp;#039;x&amp;#039;)))  ==  0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
                   &lt;br /&gt;
sumas :: Expr3 -&amp;gt; Int&lt;br /&gt;
sumas = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Definir la función&lt;br /&gt;
--    sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
-- tal que (sustitucion e s) es la expresión obtenida sustituyendo las&lt;br /&gt;
-- variables de la expresión e según se indica en la sustitución s. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (C3 7))&lt;br /&gt;
--    ghci&amp;gt; sustitucion (P3 (V3 &amp;#039;z&amp;#039;) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))) [(&amp;#039;x&amp;#039;,7),(&amp;#039;z&amp;#039;,9)]&lt;br /&gt;
--    P3 (C3 9) (S3 (C3 3) (V3 &amp;#039;y&amp;#039;))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
                   &lt;br /&gt;
sustitucion :: Expr3 -&amp;gt; [(Char, Int)] -&amp;gt; Expr3&lt;br /&gt;
sustitucion = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.4. Definir la función&lt;br /&gt;
--    reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
-- tal que (reducible a) se verifica si a es una expresión reducible; es&lt;br /&gt;
-- decir, contiene una operación en la que los dos operandos son números. &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    reducible (S3 (C3 3) (C3 4))               == True&lt;br /&gt;
--    reducible (S3 (C3 3) (V3 &amp;#039;x&amp;#039;))             == False&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (C3 4) (C3 5)))   == True&lt;br /&gt;
--    reducible (S3 (V3 &amp;#039;x&amp;#039;) (P3 (C3 4) (C3 5))) == True&lt;br /&gt;
--    reducible (S3 (C3 3) (P3 (V3 &amp;#039;x&amp;#039;) (C3 5))) == False&lt;br /&gt;
--    reducible (C3 3)                           == False&lt;br /&gt;
--    reducible (V3 &amp;#039;x&amp;#039;)                         == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
reducible :: Expr3 -&amp;gt; Bool&lt;br /&gt;
reducible = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Las expresiones aritméticas generales se pueden definir&lt;br /&gt;
-- usando el siguiente tipo de datos &lt;br /&gt;
--    data Expr4 = C4 Int &lt;br /&gt;
--               | Y &lt;br /&gt;
--               | S4 Expr4 Expr4 &lt;br /&gt;
--               | R4 Expr4 Expr4 &lt;br /&gt;
--               | P4 Expr4 Expr4 &lt;br /&gt;
--               | E4 Expr4 Int&lt;br /&gt;
--               deriving (Eq, Show)&lt;br /&gt;
-- Por ejemplo, la expresión &lt;br /&gt;
--    3*x - (x+2)^7&lt;br /&gt;
-- se puede definir por&lt;br /&gt;
--    R4 (P4 (C4 3) Y) (E4 (S4 Y (C4 2)) 7)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función  &lt;br /&gt;
--    maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
-- tal que (maximo e xs) es el par formado por el máximo valor de la&lt;br /&gt;
-- expresión e para los puntos de xs y en qué puntos alcanza el&lt;br /&gt;
-- máximo. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; maximo (E4 (S4 (C4 10) (P4 (R4 (C4 1) Y) Y)) 2) [-3..3]&lt;br /&gt;
--    (100,[0,1])&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Expr4 = C4 Int &lt;br /&gt;
          | Y &lt;br /&gt;
          | S4 Expr4 Expr4 &lt;br /&gt;
          | R4 Expr4 Expr4 &lt;br /&gt;
          | P4 Expr4 Expr4 &lt;br /&gt;
          | E4 Expr4 Int&lt;br /&gt;
          deriving (Eq, Show)&lt;br /&gt;
&lt;br /&gt;
maximo :: Expr4 -&amp;gt; [Int] -&amp;gt; (Int,[Int])&lt;br /&gt;
maximo e ns = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Las operaciones de suma, resta y  multiplicación se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de datos &lt;br /&gt;
--    data Op = Su | Re | Mu&lt;br /&gt;
-- La expresiones aritméticas con dichas operaciones se pueden&lt;br /&gt;
-- representar mediante el siguiente tipo de dato algebraico&lt;br /&gt;
--    data Expr5 = C5 Int &lt;br /&gt;
--               | A Op Expr5 Expr&lt;br /&gt;
-- Por ejemplo, la expresión&lt;br /&gt;
--    (7-3)+(2*5)&lt;br /&gt;
-- se representa por&lt;br /&gt;
--    A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5))&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
-- tal que (valorEG e) es el valorEG de la expresión e. Por ejemplo,&lt;br /&gt;
--    valorEG (A Su (A Re (C5 7) (C5 3)) (A Mu (C5 2) (C5 5)))  ==  14&lt;br /&gt;
--    valorEG (A Mu (A Re (C5 7) (C5 3)) (A Su (C5 2) (C5 5)))  ==  28&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Op = Su | Re | Mu&lt;br /&gt;
&lt;br /&gt;
data Expr5 = C5 Int | A Op Expr5 Expr5&lt;br /&gt;
&lt;br /&gt;
valorEG :: Expr5 -&amp;gt; Int&lt;br /&gt;
valorEG = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Se consideran las expresiones vectoriales formadas por&lt;br /&gt;
-- un vector, la suma de dos expresiones vectoriales o el producto de un&lt;br /&gt;
-- entero por una expresión vectorial. El siguiente tipo de dato define&lt;br /&gt;
-- las expresiones vectoriales  &lt;br /&gt;
--    data ExpV = Vec Int Int&lt;br /&gt;
--              | Sum ExpV ExpV&lt;br /&gt;
--              | Mul Int ExpV&lt;br /&gt;
--              deriving Show&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que (valorEV e) es el valorEV de la expresión vectorial c. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    valorEV (Vec 1 2)                                  ==  (1,2)&lt;br /&gt;
--    valorEV (Sum (Vec 1 2 ) (Vec 3 4))                 ==  (4,6)&lt;br /&gt;
--    valorEV (Mul 2 (Vec 3 4))                          ==  (6,8)&lt;br /&gt;
--    valorEV (Mul 2 (Sum (Vec 1 2 ) (Vec 3 4)))         ==  (8,12)&lt;br /&gt;
--    valorEV (Sum (Mul 2 (Vec 1 2)) (Mul 2 (Vec 3 4)))  ==  (8,12)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data ExpV = Vec Int Int&lt;br /&gt;
          | Sum ExpV ExpV&lt;br /&gt;
          | Mul Int ExpV&lt;br /&gt;
          deriving Show&lt;br /&gt;
&lt;br /&gt;
valorEV :: ExpV -&amp;gt; (Int,Int)&lt;br /&gt;
valorEV = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. (Examen 12 de marzo de 2015, grupo 4)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Consideremos los árboles binarios con etiquetas en las&lt;br /&gt;
-- hojas y en los nodos. Por ejemplo,&lt;br /&gt;
--          5       &lt;br /&gt;
--         / \      &lt;br /&gt;
--        2   4      &lt;br /&gt;
--           / \    &lt;br /&gt;
--          7   1&lt;br /&gt;
--             / \&lt;br /&gt;
--            2   3   &lt;br /&gt;
-- &lt;br /&gt;
-- Un camino es una sucesión de nodos desde la raiz hasta una hoja. Por&lt;br /&gt;
-- ejemplo, [5,2] y [5,4,1,2] son caminos que llevan a 2, mientras que&lt;br /&gt;
-- [5,4,1] no es un camino, pues no lleva a una hoja.&lt;br /&gt;
-- &lt;br /&gt;
-- Definimos el tipo de dato Arbol y el ejemplo por&lt;br /&gt;
--    data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
--                 deriving Show&lt;br /&gt;
--    &lt;br /&gt;
--    arb1:: Arbol &lt;br /&gt;
--    arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    maxLong :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
-- tal que (maxLong x a) es la longitud máxima de los caminos que&lt;br /&gt;
-- terminan en x. Por ejemplo, &lt;br /&gt;
--    maxLong 3 arb1 == 4&lt;br /&gt;
--    maxLong 2 arb1 == 4&lt;br /&gt;
--    maxLong 7 arb1 == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol = H Int | N Arbol Int Arbol &lt;br /&gt;
             deriving Show&lt;br /&gt;
&lt;br /&gt;
arb1:: Arbol &lt;br /&gt;
arb1 = N (H 2) 5 (N (H 7) 4 (N (H 2) 1 (H 3)))&lt;br /&gt;
&lt;br /&gt;
maxLong :: Int -&amp;gt; Arbol -&amp;gt; Int&lt;br /&gt;
maxLong = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. (Examen 5 de diciembre de 2017, grupo 1)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles con un número variable de sucesores se&lt;br /&gt;
-- pueden representar mediante el siguiente tipo de dato&lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1         1             1          &lt;br /&gt;
--     / \       / \           / \   &lt;br /&gt;
--    8   3     8   3         8   3  &lt;br /&gt;
--        |        /|\       /|\  |   &lt;br /&gt;
--        4       4 5 6     4 5 6 7&lt;br /&gt;
-- se representan por&lt;br /&gt;
--   ej21, ej22, ej23 :: ArbolG Int&lt;br /&gt;
--   ej21 = NG 1 [NG 8 [],NG 3 [NG 4 []]]&lt;br /&gt;
--   ej22 = NG 1 [NG 8 [], NG 3 [NG 4 [], NG 5 [], NG 6 []]]&lt;br /&gt;
--   ej23 = NG 1 [NG 8 [NG 4 [], NG 5 [], NG 6 []], NG 3 [NG 7 []]]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--     caminosDesdeRaiz :: ArbolG a -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (caminosDesdeRaiz x) es la lista de todos los caminos desde&lt;br /&gt;
-- la raiz. Por ejemplo,&lt;br /&gt;
--     caminosDesdeRaiz ej21 == [[1,8],[1,3,4]]&lt;br /&gt;
--     caminosDesdeRaiz ej22 == [[1,8],[1,3,4],[1,3,5],[1,3,6]]&lt;br /&gt;
--     caminosDesdeRaiz ej23 == [[1,8,4],[1,8,5],[1,8,6],[1,3,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ej21, ej22, ej23 :: ArbolG Int&lt;br /&gt;
ej21 = NG 1 [NG 8 [],NG 3 [NG 4 []]]&lt;br /&gt;
ej22 = NG 1 [NG 8 [], NG 3 [NG 4 [], NG 5 [], NG 6 []]]&lt;br /&gt;
ej23 = NG 1 [NG 8 [NG 4 [], NG 5 [], NG 6 []], NG 3 [NG 7 []]]&lt;br /&gt;
&lt;br /&gt;
caminosDesdeRaiz :: ArbolG a -&amp;gt; [[a]]&lt;br /&gt;
caminosDesdeRaiz = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. (Examen 1 de septiembre de 2016)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Los árboles se pueden representar mediante el siguiente&lt;br /&gt;
-- tipo de datos &lt;br /&gt;
--    data ArbolG a = NG a [ArbolG a]&lt;br /&gt;
--      deriving Show&lt;br /&gt;
-- Por ejemplo, los árboles&lt;br /&gt;
--      1               3&lt;br /&gt;
--     / \             /|\ &lt;br /&gt;
--    2   3           / | \&lt;br /&gt;
--        |          5  4  7&lt;br /&gt;
--        4          |     /\ &lt;br /&gt;
--                   6    2  1&lt;br /&gt;
-- se representan por&lt;br /&gt;
--    ej31, ej32 :: ArbolG Int&lt;br /&gt;
--    ej31 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
--    ej32 = NG 3 [NG 5 [NG 6 []], NG 4 [], NG 7 [NG 2 [], NG 1 []]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    ramasLargas :: ArbolG b -&amp;gt; [[b]]&lt;br /&gt;
-- tal que (ramasLargas a) es la lista de las ramas más largas del árbol&lt;br /&gt;
-- a. Por ejemplo, &lt;br /&gt;
--    ramas ej31  ==  [[1,3,4]]&lt;br /&gt;
--    ramas ej32  ==  [[3,5,6],[3,7,2],[3,7,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ej31, ej32 :: ArbolG Int&lt;br /&gt;
ej31 = NG 1 [NG 2 [],NG 3 [NG 4 []]]&lt;br /&gt;
ej32 = NG 3 [NG 5 [NG 6 []], NG 4 [], NG 7 [NG 2 [], NG 1 []]]&lt;br /&gt;
&lt;br /&gt;
ramasLargas :: ArbolG b -&amp;gt; [[b]]&lt;br /&gt;
ramasLargas = undefined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_11&amp;diff=551</id>
		<title>Relación 11</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_11&amp;diff=551"/>
		<updated>2021-12-17T08:26:02Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_11.hs (17 de diciembre de 2021)&lt;br /&gt;
-- Evaluación perezosa y listas infinitas.&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 listas infinitas y&lt;br /&gt;
-- evaluación perezosa. Estos ejercicios corresponden al tema 10 cuyas&lt;br /&gt;
-- transparencias se encuentran en  &lt;br /&gt;
--   https://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-10.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Definir, por recursión, la función &lt;br /&gt;
--    repite :: a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repite x) es la lista infinita cuyos elementos son x. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    repite 5           ==  [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,...&lt;br /&gt;
--    take 3 (repite 5)  ==  [5,5,5]&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función repite es equivalente a la función repeat definida&lt;br /&gt;
-- en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
repite :: a -&amp;gt; [a]&lt;br /&gt;
repite x = [x] ++ repite x&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir, por comprensión, la función &lt;br /&gt;
--    repiteC :: a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteC x) es la lista infinita cuyos elementos son x. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    repiteC 5           ==  [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,...&lt;br /&gt;
--    take 3 (repiteC 5)  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteC es equivalente a la función repeat definida&lt;br /&gt;
-- en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
repiteC :: a -&amp;gt; [a]&lt;br /&gt;
repiteC x = [x | _ &amp;lt;- [1..]]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir, por recursión, la función &lt;br /&gt;
--    repiteFinitaR :: Int-&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteFinitaR n x) es la lista con n elementos iguales a&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    repiteFinitaR 3 5  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteFinitaR es equivalente a la función replicate&lt;br /&gt;
-- definida en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
repiteFinitaR :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
repiteFinitaR n x | n &amp;lt;= 0     = []&lt;br /&gt;
                  | otherwise  = [x] ++ repiteFinitaR (n-1) x&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir, por comprensión, la función &lt;br /&gt;
--    repiteFinitaC :: Int-&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteFinitaC n x) es la lista con n elementos iguales a&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    repiteFinitaC 3 5  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteFinitaC es equivalente a la función replicate&lt;br /&gt;
-- definida en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
repiteFinitaC :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
repiteFinitaC n x = [x | _ &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.3. Definir, usando repite, la función &lt;br /&gt;
--    repiteFinita :: Int-&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (repiteFinita n x) es la lista con n elementos iguales a&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    repiteFinita 3 5  ==  [5,5,5]&lt;br /&gt;
--&lt;br /&gt;
-- Nota: La función repiteFinita es equivalente a la función replicate&lt;br /&gt;
-- definida en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
repiteFinita :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
repiteFinita n x = take n (repite x)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.4. Comprobar con QuickCheck que las funciones&lt;br /&gt;
-- repiteFinitaR, repiteFinitaC y repiteFinita son equivalentes a&lt;br /&gt;
-- replicate. &lt;br /&gt;
--&lt;br /&gt;
-- Nota. Al hacer la comprobación limitar el tamańo de las pruebas como&lt;br /&gt;
-- se indica a continuación&lt;br /&gt;
--    quickCheckWith (stdArgs {maxSize=7}) prop_repiteFinitaEquiv&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_repiteFinitaEquiv :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_repiteFinitaEquiv n x = repiteFinitaR n x == replicate n x &amp;amp;&amp;amp; repiteFinitaC n x == replicate n x &amp;amp;&amp;amp; repiteFinita n x == replicate n x&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheckWith (stdArgs {maxSize=7})&lt;br /&gt;
-- prop_repiteFinitaEquiv&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.5. Comprobar con QuickCheck que la longitud de&lt;br /&gt;
-- (repiteFinita n x) es n, si n es positivo y 0 si no lo es.&lt;br /&gt;
--&lt;br /&gt;
-- Nota. Al hacer la comprobación limitar el tamańo de las pruebas como&lt;br /&gt;
-- se indica a continuación&lt;br /&gt;
--    quickCheckWith (stdArgs {maxSize=30}) prop_repiteFinitaLongitud&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_repiteFinitaLongitud :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_repiteFinitaLongitud n x = if n &amp;gt; 0 then length (repiteFinita n x) == n else length (repiteFinita n x) == 0&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheckWith (stdArgs {maxSize=30}) prop_repiteFinitaLongitud&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.6. Comprobar con QuickCheck que todos los elementos de &lt;br /&gt;
-- (repiteFinita n x) son iguales a x.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_repiteFinitaIguales :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_repiteFinitaIguales n x = all (==x) (repiteFinita n x)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_repiteFinitaIguales &lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir, por comprensión, la función&lt;br /&gt;
--    ecoC :: String -&amp;gt; String&lt;br /&gt;
-- tal que (ecoC xs) es la cadena obtenida a partir de la cadena xs&lt;br /&gt;
-- repitiendo cada elemento tantas veces como indica su posición: el&lt;br /&gt;
-- primer elemento se repite 1 vez, el segundo 2 veces y así&lt;br /&gt;
-- sucesivamente. Por ejemplo, &lt;br /&gt;
--    ecoC &amp;quot;abcd&amp;quot;  ==  &amp;quot;abbcccdddd&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
ecoC :: String -&amp;gt; String&lt;br /&gt;
ecoC xs = concat [replicate n x| (x,n) &amp;lt;- zip xs [1..]]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir, por recursión, la función&lt;br /&gt;
--    ecoR :: String -&amp;gt; String&lt;br /&gt;
-- tal que (ecoR xs) es la cadena obtenida a partir de la cadena xs&lt;br /&gt;
-- repitiendo cada elemento tantas veces como indica su posición: el&lt;br /&gt;
-- primer elemento se repite 1 vez, el segundo 2 veces y así&lt;br /&gt;
-- sucesivamente. Por ejemplo, &lt;br /&gt;
--    ecoR &amp;quot;abcd&amp;quot;  ==  &amp;quot;abbcccdddd&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
ecoR :: String -&amp;gt; String&lt;br /&gt;
ecoR xs = aux 1 xs&lt;br /&gt;
        where aux n [] = []&lt;br /&gt;
              aux n (x:xs) = replicate n x ++ aux (n+1) xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir, por recursión, la función&lt;br /&gt;
--    itera :: (a -&amp;gt; a) -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (itera f x) es la lista cuyo primer elemento es x y los&lt;br /&gt;
-- siguientes elementos se calculan aplicando la función f al elemento&lt;br /&gt;
-- anterior. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; itera (+1) 3&lt;br /&gt;
--    [3,4,5,6,7,8,9,10,11,12,{Interrupted!}&lt;br /&gt;
--    ghci&amp;gt; itera (*2) 1&lt;br /&gt;
--    [1,2,4,8,16,32,64,{Interrupted!}&lt;br /&gt;
--    ghci&amp;gt; itera (`div` 10) 1972&lt;br /&gt;
--    [1972,197,19,1,0,0,0,0,0,0,{Interrupted!}&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función repite es equivalente a la función iterate definida&lt;br /&gt;
-- en el preludio de Haskell.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
itera :: (a -&amp;gt; a) -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
itera f x = x : itera f (f x)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por recursión, la función&lt;br /&gt;
--    agrupaR :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupaR n xs) es la lista formada por listas de n elementos&lt;br /&gt;
-- consecutivos de la lista xs (salvo posiblemente la última que puede&lt;br /&gt;
-- tener menos de n elementos). Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; agrupaR 2 [3,1,5,8,2,7]&lt;br /&gt;
--    [[3,1],[5,8],[2,7]]&lt;br /&gt;
--    ghci&amp;gt; agrupaR 2 [3,1,5,8,2,7,9] &lt;br /&gt;
--    [[3,1],[5,8],[2,7],[9]]&lt;br /&gt;
--    ghci&amp;gt; agrupaR 5 &amp;quot;todo necio confunde valor y precio&amp;quot;&lt;br /&gt;
--    [&amp;quot;todo &amp;quot;,&amp;quot;necio&amp;quot;,&amp;quot; conf&amp;quot;,&amp;quot;unde &amp;quot;,&amp;quot;valor&amp;quot;,&amp;quot; y pr&amp;quot;,&amp;quot;ecio&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
agrupaR :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
agrupaR _ [] = []&lt;br /&gt;
agrupaR n xs = [take n xs] ++ agrupaR n (drop n xs) &lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, de manera no recursiva con iterate, la función&lt;br /&gt;
--    agrupa :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupa n xs) es la lista formada por listas de n elementos&lt;br /&gt;
-- consecutivos de la lista xs (salvo posiblemente la última que puede&lt;br /&gt;
-- tener menos de n elementos). Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; agrupa 2 [3,1,5,8,2,7]&lt;br /&gt;
--    [[3,1],[5,8],[2,7]]&lt;br /&gt;
--    ghci&amp;gt; agrupa 2 [3,1,5,8,2,7,9] &lt;br /&gt;
--    [[3,1],[5,8],[2,7],[9]]&lt;br /&gt;
--    ghci&amp;gt; agrupa 5 &amp;quot;todo necio confunde valor y precio&amp;quot;&lt;br /&gt;
--    [&amp;quot;todo &amp;quot;,&amp;quot;necio&amp;quot;,&amp;quot; conf&amp;quot;,&amp;quot;unde &amp;quot;,&amp;quot;valor&amp;quot;,&amp;quot; y pr&amp;quot;,&amp;quot;ecio&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
agrupa :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
agrupa n xs = takeWhile (not.null) (map (take n) (iterate (drop n) xs))&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Comprobar con QuickCheck que todos los grupos de&lt;br /&gt;
-- (agrupa n xs) tienen longitud n (salvo el último que puede tener una&lt;br /&gt;
-- longitud menor). &lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
--prop_AgrupaLongitud :: Int -&amp;gt; [Int] -&amp;gt; Property&lt;br /&gt;
prop_AgrupaLongitud n xs = n&amp;gt;0 &amp;amp;&amp;amp; not (null xs) ==&amp;gt; and [length ys == n | ys &amp;lt;- init (agrupa n xs)] &amp;amp;&amp;amp; length (last (agrupa n xs)) &amp;lt;= n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_AgrupaLongitud&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.4. Comprobar con QuickCheck que combinando todos los&lt;br /&gt;
-- grupos de ((agrupa n xs)) se obtiene la lista xs. &lt;br /&gt;
-- ---------------------------------------------------------------------------- &lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La segunda propiedad es&lt;br /&gt;
prop_AgrupaCombina :: Int -&amp;gt; [Int] -&amp;gt; Property&lt;br /&gt;
prop_AgrupaCombina n xs = n&amp;gt;0 ==&amp;gt; concat (agrupa n xs) == xs&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_AgrupaCombina&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Sea la siguiente operación, aplicable a cualquier&lt;br /&gt;
-- número entero positivo:  &lt;br /&gt;
--    * Si el número es par, se divide entre 2.&lt;br /&gt;
--    * Si el número es impar, se multiplica por 3 y se suma 1.&lt;br /&gt;
-- Dado un número cualquiera, podemos considerar su órbita, es decir,&lt;br /&gt;
-- las imágenes sucesivas al iterar la función. Por ejemplo, la órbita&lt;br /&gt;
-- de 13 es&lt;br /&gt;
--    13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1,...&lt;br /&gt;
-- Si observamos este ejemplo, la órbita de 13 es periódica, es decir,&lt;br /&gt;
-- se repite indefinidamente a partir de un momento dado). La conjetura&lt;br /&gt;
-- de Collatz dice que siempre alcanzaremos el 1 para cualquier número&lt;br /&gt;
-- con el que comencemos. Ejemplos:  &lt;br /&gt;
--    * Empezando en n = 6 se obtiene 6, 3, 10, 5, 16, 8, 4, 2, 1.&lt;br /&gt;
--    * Empezando en n = 11 se obtiene: 11, 34, 17, 52, 26, 13, 40, 20,&lt;br /&gt;
--      10, 5, 16, 8, 4, 2, 1. &lt;br /&gt;
--    * Empezando en n = 27, la sucesión tiene 112 pasos, llegando hasta&lt;br /&gt;
--      9232 antes de descender a 1:  27, 82, 41, 124, 62, 31, 94, 47,&lt;br /&gt;
--      142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274,&lt;br /&gt;
--      137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263,&lt;br /&gt;
--      790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502,&lt;br /&gt;
--      251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958,&lt;br /&gt;
--      479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644,&lt;br /&gt;
--      1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308,&lt;br /&gt;
--      1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122,&lt;br /&gt;
--      61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5,&lt;br /&gt;
--      16, 8, 4, 2, 1. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    siguiente :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (siguiente n) es el siguiente de n en la sucesión de&lt;br /&gt;
-- Collatz. Por ejemplo,&lt;br /&gt;
--    siguiente 13  ==  40&lt;br /&gt;
--    siguiente 40  ==  20&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
siguiente :: Integer -&amp;gt; Integer&lt;br /&gt;
siguiente n = if even n then div n 2 else n*3 + 1&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir, por recursión, la función &lt;br /&gt;
--    collatzR :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (collatzR n) es la órbita de CollatzR de n hasta alcanzar el&lt;br /&gt;
-- 1. Por ejemplo,&lt;br /&gt;
--    collatzR 13  ==  [13,40,20,10,5,16,8,4,2,1]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
collatzR :: Integer -&amp;gt; [Integer]&lt;br /&gt;
collatzR 1 = [1]&lt;br /&gt;
collatzR n = n : collatzR (siguiente n) &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Definir, sin recursión y con iterate, la función &lt;br /&gt;
--    collatz :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (collatz n) es la órbita de Collatz d n hasta alcanzar el&lt;br /&gt;
-- 1. Por ejemplo,&lt;br /&gt;
--    collatz 13  ==  [13,40,20,10,5,16,8,4,2,1]&lt;br /&gt;
-- Indicación: Usar takeWhile e iterate.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
collatz :: Integer -&amp;gt; [Integer]&lt;br /&gt;
collatz n = takeWhile (/=1) (iterate siguiente n) ++ [1]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.4. Definir la función&lt;br /&gt;
--    menorCollatzMayor :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (menorCollatzMayor x) es el menor número cuya órbita de&lt;br /&gt;
-- Collatz tiene más de x elementos. Por ejemplo,&lt;br /&gt;
--    menorCollatzMayor 100  ==  27&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
menorCollatzMayor :: Int -&amp;gt; Integer&lt;br /&gt;
menorCollatzMayor x = head [n | n &amp;lt;- [1..], length (collatz n) &amp;gt; x]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.5. Definir la función&lt;br /&gt;
--    menorCollatzSupera :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (menorCollatzSupera x) es el menor número cuya órbita de&lt;br /&gt;
-- Collatz tiene algún elemento mayor que x. Por ejemplo,&lt;br /&gt;
--    menorCollatzSupera 100  ==  15&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
menorCollatzSupera :: Integer -&amp;gt; Integer&lt;br /&gt;
menorCollatzSupera x = head [n | n &amp;lt;- [1..], any (&amp;gt;x) (collatz n)]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
menorCollatzSupera :: Integer -&amp;gt; Integer&lt;br /&gt;
menorCollatzSupera x = head [t | t &amp;lt;- [1..],&lt;br /&gt;
                                   not $ null [ q| q &amp;lt;- (collatz t), q &amp;gt; x ] ]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir, usando takeWhile y map, la función&lt;br /&gt;
--    potenciasMenores :: Int -&amp;gt; Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (potenciasMenores x y) es la lista de las potencias de x&lt;br /&gt;
-- menores que y. Por ejemplo,&lt;br /&gt;
--    potenciasMenores 2 1000  ==  [2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
potenciasMenores :: Int -&amp;gt; Int -&amp;gt; [Int]&lt;br /&gt;
potenciasMenores x y = takeWhile (&amp;lt;y) (map (x^) [1..]) &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, usando la criba de Eratóstenes, la constante&lt;br /&gt;
--    primos :: Integral a =&amp;gt; [a]&lt;br /&gt;
-- cuyo valor es la lista de los números primos. Por ejemplo,&lt;br /&gt;
--    take 10 primos  ==  [2,3,5,7,11,13,17,19,23,29]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primos :: Integral a =&amp;gt; [a]&lt;br /&gt;
primos = criba [2..]&lt;br /&gt;
&lt;br /&gt;
criba (p:xs) = p : criba [x | x &amp;lt;- xs, x `mod` p /= 0]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, usando primos, la función&lt;br /&gt;
--    primo :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
-- tal que (primo n) se verifica si n es primo. Por ejemplo,&lt;br /&gt;
--    primo 7  ==  True&lt;br /&gt;
--    primo 9  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primo :: Int -&amp;gt; Bool&lt;br /&gt;
primo n = last (takeWhile (&amp;lt;=n) primos) == n&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Definir la función&lt;br /&gt;
--    sumaDeDosPrimos :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sumaDeDosPrimos n) es la lista de las distintas&lt;br /&gt;
-- descomposiciones de n como suma de dos números primos. Por ejemplo, &lt;br /&gt;
--    sumaDeDosPrimos 30  ==  [(7,23),(11,19),(13,17)]&lt;br /&gt;
--    sumaDeDosPrimos 10  ==  [(3,7),(5,5)]&lt;br /&gt;
-- Calcular, usando la función sumaDeDosPrimos, el menor número que&lt;br /&gt;
-- puede escribirse de 10 formas distintas como suma de dos primos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sumaDeDosPrimos :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
sumaDeDosPrimos n = [(x,n-x) | x &amp;lt;- [2..div n 2], primo x, primo (n-x)]&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es head [n | n &amp;lt;- [4..], length (sumaDeDosPrimos n) == 10]&lt;br /&gt;
-- 114&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § La lista infinita de factoriales                                 --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por comprensión, la función&lt;br /&gt;
--    factoriales1 :: [Integer]&lt;br /&gt;
-- tal que factoriales1 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales1  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = [factorial n | n &amp;lt;- [0..]]&lt;br /&gt;
&lt;br /&gt;
factorial n = product [1..n]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, usando zipWith, la función&lt;br /&gt;
--    factoriales2 :: [Integer]&lt;br /&gt;
-- tal que factoriales2 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales2  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = 1 : zipWith (*) [1..] factoriales2&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. Definir, por recursión, la función&lt;br /&gt;
--    factoriales3 :: [Integer]&lt;br /&gt;
-- tal que factoriales3 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales3  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = 1 : aux 1 [1..]&lt;br /&gt;
             where aux v (x:xs) = (v*x) : aux (v*x) xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.4. Definir, usando scanl1, la función&lt;br /&gt;
--    factoriales4 :: [Integer]&lt;br /&gt;
-- tal que factoriales4 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales4  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = 1 : scanl1 (*) [1..]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.5. Definir, usando iterate, la función&lt;br /&gt;
--    factoriales5 :: [Integer]&lt;br /&gt;
-- tal que factoriales5 es la lista de los factoriales. Por ejemplo,&lt;br /&gt;
--    take 10 factoriales5  ==  [1,1,2,6,24,120,720,5040,40320,362880]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = map snd (iterate f (1,1))&lt;br /&gt;
             where f (x,y) = (x+1,x*y)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § La sucesión de Fibonacci                                         --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.1. La sucesión de Fibonacci está definida por&lt;br /&gt;
--    f(0) = 0&lt;br /&gt;
--    f(1) = 1&lt;br /&gt;
--    f(n) = f(n-1)+f(n-2), si n &amp;gt; 1.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    fib :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (fib n) es el n-ésimo término de la sucesión de Fibonacci. &lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    fib 8  ==  21&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
fib :: Integer -&amp;gt; Integer&lt;br /&gt;
fib 0 = 0&lt;br /&gt;
fib 1 = 1&lt;br /&gt;
fib n = fib (n-1) + fib (n-2)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.2. Definir, por comprensión, la función&lt;br /&gt;
--    fibs1 :: [Integer]&lt;br /&gt;
-- tal que fibs1 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs1  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
fibs1 :: [Integer]&lt;br /&gt;
fibs1 = [fib n | n &amp;lt;- [0..]]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.3. Definir, por recursión, la función&lt;br /&gt;
--    fibs2 :: [Integer]&lt;br /&gt;
-- tal que fibs2 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs2  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
fibs2 :: [Integer]&lt;br /&gt;
fibs2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.4. Definir, por recursión con zipWith, la función&lt;br /&gt;
--    fibs3 :: [Integer]&lt;br /&gt;
-- tal que fibs3 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs3  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
fibs3 :: [Integer]&lt;br /&gt;
fibs3 = 0 : 1 : zipWith (+) fibs3 (tail fibs3)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.5. Definir, por recursión con acumuladores, la función &lt;br /&gt;
--    fibs4 :: [Integer]&lt;br /&gt;
-- tal que fibs4 es la sucesión de Fibonacci. Por ejemplo,&lt;br /&gt;
--    take 10 fibs4  ==  [0,1,1,2,3,5,8,13,21,34]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
fibs4 :: [Integer]&lt;br /&gt;
fibs4 = aux 0 1&lt;br /&gt;
      where aux x y = x : aux y (x+y)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § El triángulo de Pascal                                           --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.1. El triángulo de Pascal es un triángulo de números&lt;br /&gt;
--          1&lt;br /&gt;
--         1 1&lt;br /&gt;
--        1 2 1&lt;br /&gt;
--      1  3 3  1&lt;br /&gt;
--     1 4  6  4 1&lt;br /&gt;
--    1 5 10 10 5 1&lt;br /&gt;
--   ...............&lt;br /&gt;
-- construido de la siguiente forma&lt;br /&gt;
-- * la primera fila está formada por el número 1;&lt;br /&gt;
-- * las filas siguientes se construyen sumando los números adyacentes&lt;br /&gt;
--   de la fila superior y ańadiendo un 1 al principio y al final de la&lt;br /&gt;
--   fila. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir, con iterate y zipWith, la función&lt;br /&gt;
--    pascal1 :: [[Integer]]&lt;br /&gt;
-- tal que pascal es la lista de las líneas del triángulo de Pascal. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; take 6 pascal1&lt;br /&gt;
--    [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],[1,5,10,10,5,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
pascal1 :: [[Integer]]&lt;br /&gt;
pascal1 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.2. Definir, con map y zipWith, la función&lt;br /&gt;
--    pascal2 :: [[Integer]]&lt;br /&gt;
-- tal que pascal es la lista de las líneas del triángulo de Pascal. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    ghci&amp;gt; take 6 pascal2&lt;br /&gt;
--    [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],[1,5,10,10,5,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 2ª definición (con map):&lt;br /&gt;
pascal2 :: [[Integer]]&lt;br /&gt;
pascal2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.3. Escribir la traza del cálculo de la expresión&lt;br /&gt;
--    take 4 pascal2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=546</id>
		<title>Relación 10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=546"/>
		<updated>2021-12-14T21:06:37Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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: Relación 10&lt;br /&gt;
-- Propiedades del número 2021.&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 sobre propiedades del número&lt;br /&gt;
-- 2021.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Data.List&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Consideramos todos los primos menores que 100:&lt;br /&gt;
--    2, 3, 5, 7, 11, ..., 89, 97&lt;br /&gt;
-- y formamos los correspondientes pares de dominó:&lt;br /&gt;
--    (2,3), (3,5), (5,7), ..., (83,89), (89,97).&lt;br /&gt;
-- La suma de los números en todos los pares es 2021.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDominoPrimos n) es la suma de los números de los pares&lt;br /&gt;
-- de dominó formada a partir de los primos menores que n. Por ejemplo,&lt;br /&gt;
--    sumaDominoPrimos 100 == 2021&lt;br /&gt;
--    sumaDominoPrimos 200 == 8253&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos n = sum $ map f (zip (primosHasta n) (tail (primosHasta n)))&lt;br /&gt;
                   where f (a,b) = a+b&lt;br /&gt;
                         &lt;br /&gt;
primosHasta n = takeWhile (&amp;lt;n) primes &lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
listaPrimosN :: Integer -&amp;gt; [Integer] -- Para obtener la lista de los números primos menores que n.&lt;br /&gt;
listaPrimosN n = [p | p &amp;lt;- (take (fromInteger n :: Int) (primes)), p &amp;lt; n]&lt;br /&gt;
&lt;br /&gt;
sumaDominoPrimos1 :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos1 n =  sum [a+b | (a,b) &amp;lt;- (zip (listaPrimosN n) (tail (listaPrimosN n)))]&lt;br /&gt;
&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
sumaDominoPrimos&amp;#039; :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos&amp;#039; n = sum [a+b | (a,b) &amp;lt;- zip ps (tail ps)]&lt;br /&gt;
                    where ps = takeWhile (&amp;lt;n) primes&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la constante&lt;br /&gt;
--   sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
-- tal que sucSumaDominoPrimos es la sucesión de los números que son&lt;br /&gt;
-- suma de pares de dominó formado con números primos. Por ejemplo,&lt;br /&gt;
--   λ&amp;gt; take 25 sucSumaDominoPrimos&lt;br /&gt;
--   [5,13,25,43,67,97,133,175,227,287,355,433,517,607,707,819,939,1067,&lt;br /&gt;
--    1205,1349,1501,1663,1835,2021,2219]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos = [sumaDominoPrimos n | n &amp;lt;- [4..], isPrime n]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sucSumaDominoPrimos1 :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos1 = [sumaDominoPrimos1 x| x &amp;lt;- drop 2 primes]&lt;br /&gt;
&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
sucSumaDominoPrimos&amp;#039; :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos&amp;#039; = tail [sumaDominoPrimos p |  p &amp;lt;- (tail  primes)]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la sucesión&lt;br /&gt;
--   esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumaDominoPrimos n) se verifica si n es un número de la&lt;br /&gt;
-- sucesión anterior. Por ejemplo,&lt;br /&gt;
--  esSumaDominoPrimos 2021    == True&lt;br /&gt;
--  esSumaDominoPrimos 1234509 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos n = elem n (takeWhile (&amp;lt;=n) sucSumaDominoPrimos)&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esSumaDominoPrimos1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos1 n = head (dropWhile (&amp;lt;n) sucSumaDominoPrimos1) == n&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. El número 2021 es la suma de 33 más la suma de los 33&lt;br /&gt;
-- primeros números primos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumSumaPrimos n) es la suma de n más los n primeros números&lt;br /&gt;
-- primos. Por ejemplo,&lt;br /&gt;
--   sumSumaPrimos 33 == 2021&lt;br /&gt;
--   sumSumaPrimos 52 == 5641&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n =  fromIntegral (n + sum (take n primes))&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n = read (show $ sum $ n : take n primes) :: Integer&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir la función&lt;br /&gt;
--    esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumSumaPrimos n) se verifica si n es de la suma de m más&lt;br /&gt;
-- los m primeros primos, para algún entero m. Por ejemplo,&lt;br /&gt;
--    esSumSumaPrimos 2021       == True&lt;br /&gt;
--    esSumSumaPrimos 120        == False&lt;br /&gt;
--    esSumSumaPrimos 1234567893 == False&lt;br /&gt;
--    esSumSumaPrimos 774511387  == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez , Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos) &lt;br /&gt;
&lt;br /&gt;
sucSumSumaPrimos = map sumSumaPrimos [1..]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Un número semiprimo es un número natural que es producto&lt;br /&gt;
-- de dos números primos no necesariamente distintos. Por ejemplo, 26 es&lt;br /&gt;
-- semiprimo (porque 26 = 2×13) y 49 también lo es (porque 49 = 7×7).&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    semiprimos  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esSemiprimo n) se verifica si n es semiprimo. Por ejemplo,&lt;br /&gt;
--      esSemiprimo 26          ==  True&lt;br /&gt;
--      esSemiprimo 49          ==  True&lt;br /&gt;
--      esSemiprimo 8           ==  False&lt;br /&gt;
--      esSemiprimo 2021        ==  True&lt;br /&gt;
--      esSemiprimo (21+10^14)  ==  True&lt;br /&gt;
-- + semiprimos es la sucesión de números semiprimos. Por ejemplo,&lt;br /&gt;
--      take 10 semiprimos   ==  [4,6,9,10,14,15,21,22,25,26]&lt;br /&gt;
--      semiprimos !! 580    ==  2021&lt;br /&gt;
--      semiprimos !! 10000  ==  40886&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo n = or [a*b == n | a &amp;lt;- primeFactors n, b &amp;lt;- primeFactors n]&lt;br /&gt;
&lt;br /&gt;
semiprimos :: [Integer]&lt;br /&gt;
semiprimos = filter esSemiprimo [4..]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esSemiprimo1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo1 n = length (primeFactors n) == 2&lt;br /&gt;
&lt;br /&gt;
semiprimos1 :: [Integer]&lt;br /&gt;
semiprimos1 = [x | x&amp;lt;- [1..], esSemiprimo1 x]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un número natural n es un número entero Blum si&lt;br /&gt;
-- n = p × q es un semiprimo para el que p y q son distintos primos&lt;br /&gt;
-- congruentes con 3 módulo 4. Es decir, p y q tienen que ser de la&lt;br /&gt;
-- forma 4 t + 3, para algún número entero t. Los números enteros de&lt;br /&gt;
-- esta forma se denominan números primos de Blum.  Los primeros enteros&lt;br /&gt;
-- de Blum son&lt;br /&gt;
--    21, 33, 57, 69, 77, 93, 129, 133, 141, 161, 177, ...&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBlum  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBlum n) se verifica si n es un número de Blum. Por ejemplo,&lt;br /&gt;
--      esBlum 26          ==  False&lt;br /&gt;
--      esBlum 49          ==  False&lt;br /&gt;
--      esBlum 77          ==  True&lt;br /&gt;
--      esBlum 2021        ==  True&lt;br /&gt;
--      esBlum (21+10^14)  ==  True&lt;br /&gt;
-- + sucBlum es la sucesión de números de Blum. Por ejemplo,&lt;br /&gt;
--      take 10 sucBlum  ==  [21,33,57,69,77,93,129,133,141,161]&lt;br /&gt;
--      sucBlum !! 132    ==  2021&lt;br /&gt;
--      sucBlum !! 10000  ==  186821&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
esBlum n = and [esSemiprimo n, p /= q, rem p 4 == 3, rem q 4 == 3]&lt;br /&gt;
         where p = head (primeFactors n) &lt;br /&gt;
               q = last (primeFactors n)&lt;br /&gt;
              &lt;br /&gt;
sucBlum :: [Integer]&lt;br /&gt;
sucBlum = filter esBlum semiprimos&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Un número semiprimo n = p x q es brillante si p y q&lt;br /&gt;
-- tienen el mismo número de dígitos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBrillantes  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBrillante n) se verifica si n es brillante. Por ejemplo,&lt;br /&gt;
--      esBrillante 26          ==  False&lt;br /&gt;
--      esBrillante 49          ==  True&lt;br /&gt;
--      esBrillante 77          ==  False&lt;br /&gt;
--      esBrillante 2021        ==  True&lt;br /&gt;
--      esBrillante (21+10^14)  ==  False&lt;br /&gt;
-- + sucBrillantes es la sucesión de números brillantes. Por ejemplo,&lt;br /&gt;
--      take 10 sucBrillante   ==  [4,6,9,10,14,15,21,25,35,49]&lt;br /&gt;
--      sucBrillante !! 130    ==  2021&lt;br /&gt;
--      sucBrillante !! 10000  ==  696649&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
esBrillante n = esSemiprimo n &amp;amp;&amp;amp; length (show p) == length (show q)&lt;br /&gt;
              where p = head (primeFactors n)&lt;br /&gt;
                    q = last (primeFactors n)&lt;br /&gt;
                      &lt;br /&gt;
sucBrillante :: [Integer]&lt;br /&gt;
sucBrillante = filter esBrillante [4..]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Un número natural es amable si se puede expresar como&lt;br /&gt;
-- suma de, al menos, dos números naturales consecutivos. Por ejemplo,&lt;br /&gt;
-- 2021 es amable pues&lt;br /&gt;
--    2021 = 20 + 21 + ... + 65 + 66.&lt;br /&gt;
-- La mayoría de los números naturales son amables, por lo que vamos a&lt;br /&gt;
-- calcular la lista de los números no amables.&lt;br /&gt;
--&lt;br /&gt;
-- Los primeros números no amables son&lt;br /&gt;
--    1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,&lt;br /&gt;
--    16384, 32768, 65536, 131072, 262144&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sucesionesConSuma :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sucesionesConSuma n) es la lista de los pares formados por&lt;br /&gt;
-- el primero y por el último elemento de las sucesiones de números&lt;br /&gt;
-- naturales consecutivos con suma n. Por ejemplo,&lt;br /&gt;
--    sucesionesConSuma 15             == [(1,5),(4,6),(7,8)]&lt;br /&gt;
--    sucesionesConSuma 2021           == [(20,66),(26,68),(1010,1011)]&lt;br /&gt;
--    length (sucesionesConSuma 2021)  == 3&lt;br /&gt;
--    length (sucesionesConSuma 3000)  == 7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucesionesConSuma :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma n = [(a,b) | a &amp;lt;- [1..div n 2], b &amp;lt;- [a..n-a], (a+b)*(fromIntegral $ length [a..b]) == 2*n]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sucesionesConSuma1 :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma1 n = [(a,b) | a &amp;lt;- [1..(div n 2)], b &amp;lt;- [a..(n-a)], sum [a..b] == n, n&amp;gt;0]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir las funciones&lt;br /&gt;
--    noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucNoAmables :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (noAmable n) se verifica si n es un número no amable. Por ejemplo,&lt;br /&gt;
--    noAmable 2021 == False&lt;br /&gt;
--    noAmable 1024 == True&lt;br /&gt;
-- + sucNoAmables es la lista de números naturales no amables. Por&lt;br /&gt;
--   ejemplo,&lt;br /&gt;
--    take 10 sucNoAmables == [1,2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
noAmable n = null (sucesionesConSuma n)&lt;br /&gt;
&lt;br /&gt;
sucNoAmables :: [Integer]&lt;br /&gt;
sucNoAmables = filter noAmable [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que un número natural es no&lt;br /&gt;
-- amable si y sólo si es potencia de 2.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propNoAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable n = noAmable (abs n+1) == esPotenciaDeDos (abs n+1)&lt;br /&gt;
&lt;br /&gt;
esPotenciaDeDos n = elem n [2^i | i &amp;lt;- [0..20]]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
propNoAmable1 :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable1 1 = True -- Porque 1 == 2^0&lt;br /&gt;
propNoAmable1 n = noAmable n&amp;#039; == (2 == last (primeFactors n&amp;#039;))&lt;br /&gt;
             where n&amp;#039; | n &amp;lt; -1 = abs n &lt;br /&gt;
                      | n == -1 = 2&lt;br /&gt;
                      | n == 0 = 2&lt;br /&gt;
                      | otherwise = n&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Un número natural se denomina aritmético si la media&lt;br /&gt;
-- aritmética de sus divisores es un número entero.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esAritmetico n) se verifica si n es un número aritmético.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    esAritmetico 2021 == True&lt;br /&gt;
--    esAritmetico 24   == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico n = rem (sum (divisores n)) (fromIntegral $ (length (divisores n))) == 0&lt;br /&gt;
&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..div n 2], rem n x == 0] ++ [n]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
calculoMAF :: Integer -&amp;gt; Float&lt;br /&gt;
calculoMAF n = ( fromIntegral $ sum (primeFactors n) :: Float)  / (read $ show $ length (primeFactors n) :: Float)&lt;br /&gt;
esAritmetico1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico1 n = (show (round $ calculoMAF n)) ++ &amp;quot;.0&amp;quot; == (show $ calculoMAF n)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que todos los primos excepto&lt;br /&gt;
-- el 2 son aritméticos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primosAritmeticos :: Int -&amp;gt; Bool&lt;br /&gt;
primosAritmeticos n = all esAritmetico (take n (tail primes))&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primosAritmeticos1 :: Int -&amp;gt; Bool&lt;br /&gt;
primosAritmeticos1 n = if (isPrime n) &amp;amp;&amp;amp; (n/= 2) then (esAritmetico1 (read (show n) :: Integer)) else True &lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck primosAritmeticos&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Definir la función&lt;br /&gt;
--    sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (sucAritmeticosConsecutivos n) es una sucesión de n números&lt;br /&gt;
-- aritméticos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 5&lt;br /&gt;
--    [19,20,21,22,23]&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 20&lt;br /&gt;
--    [4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,&lt;br /&gt;
--     4968,4969,4970,4971,4972,4973,4974]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
sucAritmeticosConsecutivos n = head (filter consecutivos (listaDeLongitud n sucAritmeticos))&lt;br /&gt;
&lt;br /&gt;
sucAritmeticos = filter esAritmetico [1..]&lt;br /&gt;
consecutivos xs = xs == [minimum xs..maximum xs]&lt;br /&gt;
listaDeLongitud n xs = map (take n) (tails xs)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. El número 2021 tiene las propiedades siguientes:&lt;br /&gt;
-- + sumándole su inverso es un número palíndromo: 2021 + 1202 = 3223&lt;br /&gt;
-- + multiplicándolo por su inverso también lo es: 2021 * 1202 = 2429242&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (masInvPalindromo n) se verifica si n más su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--     masInvPalindromo 2021  == True&lt;br /&gt;
--      masInvPalindromo 109   == False&lt;br /&gt;
-- + (prodInvPalindromo n) se verifica si n por su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--      prodInvPalindromo 2021 == True&lt;br /&gt;
--      prodInvPalindromo 1097 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
masInvPalindromo n = palindromo (n + inverso n)&lt;br /&gt;
&lt;br /&gt;
inverso n = read (reverse (show n)) :: Integer&lt;br /&gt;
palindromo n = n == inverso n&lt;br /&gt;
&lt;br /&gt;
prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
prodInvPalindromo n = palindromo (n * inverso n)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2.. Comprobar con QuickCheck que todo número&lt;br /&gt;
-- prodInvPalindromo es masInvPalindromo.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
propInvPalindromo n = not (prodInvPalindromo (abs n)) || masInvPalindromo (abs n)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck propInvPalindromo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Comprobar que el número 2021 es el menor  número&lt;br /&gt;
-- natural que verifica las siguientes propiedades:&lt;br /&gt;
--  (+) es la concatenación de dos enteros consecutivos (20 y 21)&lt;br /&gt;
--  (+) es el producto de dos primos consecutivos (43 y 47)&lt;br /&gt;
--&lt;br /&gt;
-- Para ello, definir las funciones&lt;br /&gt;
--    esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    especiales :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esConcatConsecutivos n) se verifica si n es la concatenación de&lt;br /&gt;
--   dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--      esConcatConsecutivos 2021 == True&lt;br /&gt;
-- + (esProdprimosConsecutivos n) se verifica si n es el producto de dos&lt;br /&gt;
--   primos consecutivos&lt;br /&gt;
--      esProdprimosConsecutivos 2021 == True&lt;br /&gt;
-- + espaciales es la lista de números naturales que verifican las dos&lt;br /&gt;
--   propiedaes anteriores&lt;br /&gt;
--      head especiales == 2021&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
-- esConcatConsecutivos&lt;br /&gt;
-- ====================&lt;br /&gt;
&lt;br /&gt;
esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esConcatConsecutivos n = elem n (takeWhile (&amp;lt;=n) concatEnterosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
concatEnterosConsecutivos = map f (listaDeLongitud 2 [0..])&lt;br /&gt;
                          where f [a,b] = read (show a ++ show b) :: Integer&lt;br /&gt;
&lt;br /&gt;
-- esProdprimosConsecutivos&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esProdprimosConsecutivos n = elem n (takeWhile (&amp;lt;=n) prodprimosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
prodprimosConsecutivos = map f (listaDeLongitud 2 primes)&lt;br /&gt;
                       where f [a,b] = a*b&lt;br /&gt;
&lt;br /&gt;
-- especiales&lt;br /&gt;
-- ==========&lt;br /&gt;
&lt;br /&gt;
especiales :: [Integer]&lt;br /&gt;
especiales = [n | n &amp;lt;- prodprimosConsecutivos, esConcatConsecutivos n]&lt;br /&gt;
&lt;br /&gt;
-- Primer número especial:&lt;br /&gt;
-- head especiales&lt;br /&gt;
-- 2021&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=545</id>
		<title>Relación 10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=545"/>
		<updated>2021-12-14T20:55:26Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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: Relación 10&lt;br /&gt;
-- Propiedades del número 2021.&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 sobre propiedades del número&lt;br /&gt;
-- 2021.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Data.List&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Consideramos todos los primos menores que 100:&lt;br /&gt;
--    2, 3, 5, 7, 11, ..., 89, 97&lt;br /&gt;
-- y formamos los correspondientes pares de dominó:&lt;br /&gt;
--    (2,3), (3,5), (5,7), ..., (83,89), (89,97).&lt;br /&gt;
-- La suma de los números en todos los pares es 2021.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDominoPrimos n) es la suma de los números de los pares&lt;br /&gt;
-- de dominó formada a partir de los primos menores que n. Por ejemplo,&lt;br /&gt;
--    sumaDominoPrimos 100 == 2021&lt;br /&gt;
--    sumaDominoPrimos 200 == 8253&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos n = sum $ map f (zip (primosHasta n) (tail (primosHasta n)))&lt;br /&gt;
                   where f (a,b) = a+b&lt;br /&gt;
                         &lt;br /&gt;
primosHasta n = takeWhile (&amp;lt;n) primes &lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
listaPrimosN :: Integer -&amp;gt; [Integer] -- Para obtener la lista de los números primos menores que n.&lt;br /&gt;
listaPrimosN n = [p | p &amp;lt;- (take (fromInteger n :: Int) (primes)), p &amp;lt; n]&lt;br /&gt;
&lt;br /&gt;
sumaDominoPrimos1 :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos1 n =  sum [a+b | (a,b) &amp;lt;- (zip (listaPrimosN n) (tail (listaPrimosN n)))]&lt;br /&gt;
&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
sumaDominoPrimos&amp;#039; :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos&amp;#039; n = sum [a+b | (a,b) &amp;lt;- zip ps (tail ps)]&lt;br /&gt;
                    where ps = takeWhile (&amp;lt;n) primes&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la constante&lt;br /&gt;
--   sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
-- tal que sucSumaDominoPrimos es la sucesión de los números que son&lt;br /&gt;
-- suma de pares de dominó formado con números primos. Por ejemplo,&lt;br /&gt;
--   λ&amp;gt; take 25 sucSumaDominoPrimos&lt;br /&gt;
--   [5,13,25,43,67,97,133,175,227,287,355,433,517,607,707,819,939,1067,&lt;br /&gt;
--    1205,1349,1501,1663,1835,2021,2219]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos = [sumaDominoPrimos n | n &amp;lt;- [4..], isPrime n]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sucSumaDominoPrimos1 :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos1 = [sumaDominoPrimos1 x| x &amp;lt;- drop 2 primes]&lt;br /&gt;
&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
sucSumaDominoPrimos&amp;#039; :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos&amp;#039; = tail [sumaDominoPrimos p |  p &amp;lt;- (tail  primes)]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la sucesión&lt;br /&gt;
--   esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumaDominoPrimos n) se verifica si n es un número de la&lt;br /&gt;
-- sucesión anterior. Por ejemplo,&lt;br /&gt;
--  esSumaDominoPrimos 2021    == True&lt;br /&gt;
--  esSumaDominoPrimos 1234509 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos n = elem n (takeWhile (&amp;lt;=n) sucSumaDominoPrimos)&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esSumaDominoPrimos1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos1 n = head (dropWhile (&amp;lt;n) sucSumaDominoPrimos1) == n&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. El número 2021 es la suma de 33 más la suma de los 33&lt;br /&gt;
-- primeros números primos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumSumaPrimos n) es la suma de n más los n primeros números&lt;br /&gt;
-- primos. Por ejemplo,&lt;br /&gt;
--   sumSumaPrimos 33 == 2021&lt;br /&gt;
--   sumSumaPrimos 52 == 5641&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n =  fromIntegral (n + sum (take n primes))&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n = read (show $ sum $ n : take n primes) :: Integer&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir la función&lt;br /&gt;
--    esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumSumaPrimos n) se verifica si n es de la suma de m más&lt;br /&gt;
-- los m primeros primos, para algún entero m. Por ejemplo,&lt;br /&gt;
--    esSumSumaPrimos 2021       == True&lt;br /&gt;
--    esSumSumaPrimos 120        == False&lt;br /&gt;
--    esSumSumaPrimos 1234567893 == False&lt;br /&gt;
--    esSumSumaPrimos 774511387  == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez , Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos) &lt;br /&gt;
&lt;br /&gt;
sucSumSumaPrimos = map sumSumaPrimos [1..]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Un número semiprimo es un número natural que es producto&lt;br /&gt;
-- de dos números primos no necesariamente distintos. Por ejemplo, 26 es&lt;br /&gt;
-- semiprimo (porque 26 = 2×13) y 49 también lo es (porque 49 = 7×7).&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    semiprimos  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esSemiprimo n) se verifica si n es semiprimo. Por ejemplo,&lt;br /&gt;
--      esSemiprimo 26          ==  True&lt;br /&gt;
--      esSemiprimo 49          ==  True&lt;br /&gt;
--      esSemiprimo 8           ==  False&lt;br /&gt;
--      esSemiprimo 2021        ==  True&lt;br /&gt;
--      esSemiprimo (21+10^14)  ==  True&lt;br /&gt;
-- + semiprimos es la sucesión de números semiprimos. Por ejemplo,&lt;br /&gt;
--      take 10 semiprimos   ==  [4,6,9,10,14,15,21,22,25,26]&lt;br /&gt;
--      semiprimos !! 580    ==  2021&lt;br /&gt;
--      semiprimos !! 10000  ==  40886&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo n = or [a*b == n | a &amp;lt;- primeFactors n, b &amp;lt;- primeFactors n]&lt;br /&gt;
&lt;br /&gt;
semiprimos :: [Integer]&lt;br /&gt;
semiprimos = filter esSemiprimo [4..]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esSemiprimo1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo1 n = length (primeFactors n) == 2&lt;br /&gt;
&lt;br /&gt;
semiprimos1 :: [Integer]&lt;br /&gt;
semiprimos1 = [x | x&amp;lt;- [1..], esSemiprimo1 x]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un número natural n es un número entero Blum si&lt;br /&gt;
-- n = p × q es un semiprimo para el que p y q son distintos primos&lt;br /&gt;
-- congruentes con 3 módulo 4. Es decir, p y q tienen que ser de la&lt;br /&gt;
-- forma 4 t + 3, para algún número entero t. Los números enteros de&lt;br /&gt;
-- esta forma se denominan números primos de Blum.  Los primeros enteros&lt;br /&gt;
-- de Blum son&lt;br /&gt;
--    21, 33, 57, 69, 77, 93, 129, 133, 141, 161, 177, ...&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBlum  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBlum n) se verifica si n es un número de Blum. Por ejemplo,&lt;br /&gt;
--      esBlum 26          ==  False&lt;br /&gt;
--      esBlum 49          ==  False&lt;br /&gt;
--      esBlum 77          ==  True&lt;br /&gt;
--      esBlum 2021        ==  True&lt;br /&gt;
--      esBlum (21+10^14)  ==  True&lt;br /&gt;
-- + sucBlum es la sucesión de números de Blum. Por ejemplo,&lt;br /&gt;
--      take 10 sucBlum  ==  [21,33,57,69,77,93,129,133,141,161]&lt;br /&gt;
--      sucBlum !! 132    ==  2021&lt;br /&gt;
--      sucBlum !! 10000  ==  186821&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
esBlum n = and [esSemiprimo n, p /= q, rem p 4 == 3, rem q 4 == 3]&lt;br /&gt;
         where p = head (primeFactors n) &lt;br /&gt;
               q = last (primeFactors n)&lt;br /&gt;
              &lt;br /&gt;
sucBlum :: [Integer]&lt;br /&gt;
sucBlum = filter esBlum semiprimos&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Un número semiprimo n = p x q es brillante si p y q&lt;br /&gt;
-- tienen el mismo número de dígitos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBrillantes  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBrillante n) se verifica si n es brillante. Por ejemplo,&lt;br /&gt;
--      esBrillante 26          ==  False&lt;br /&gt;
--      esBrillante 49          ==  True&lt;br /&gt;
--      esBrillante 77          ==  False&lt;br /&gt;
--      esBrillante 2021        ==  True&lt;br /&gt;
--      esBrillante (21+10^14)  ==  False&lt;br /&gt;
-- + sucBrillantes es la sucesión de números brillantes. Por ejemplo,&lt;br /&gt;
--      take 10 sucBrillante   ==  [4,6,9,10,14,15,21,25,35,49]&lt;br /&gt;
--      sucBrillante !! 130    ==  2021&lt;br /&gt;
--      sucBrillante !! 10000  ==  696649&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
esBrillante n = esSemiprimo n &amp;amp;&amp;amp; length (show p) == length (show q)&lt;br /&gt;
              where p = head (primeFactors n)&lt;br /&gt;
                    q = last (primeFactors n)&lt;br /&gt;
                      &lt;br /&gt;
sucBrillante :: [Integer]&lt;br /&gt;
sucBrillante = filter esBrillante [4..]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Un número natural es amable si se puede expresar como&lt;br /&gt;
-- suma de, al menos, dos números naturales consecutivos. Por ejemplo,&lt;br /&gt;
-- 2021 es amable pues&lt;br /&gt;
--    2021 = 20 + 21 + ... + 65 + 66.&lt;br /&gt;
-- La mayoría de los números naturales son amables, por lo que vamos a&lt;br /&gt;
-- calcular la lista de los números no amables.&lt;br /&gt;
--&lt;br /&gt;
-- Los primeros números no amables son&lt;br /&gt;
--    1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,&lt;br /&gt;
--    16384, 32768, 65536, 131072, 262144&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sucesionesConSuma :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sucesionesConSuma n) es la lista de los pares formados por&lt;br /&gt;
-- el primero y por el último elemento de las sucesiones de números&lt;br /&gt;
-- naturales consecutivos con suma n. Por ejemplo,&lt;br /&gt;
--    sucesionesConSuma 15             == [(1,5),(4,6),(7,8)]&lt;br /&gt;
--    sucesionesConSuma 2021           == [(20,66),(26,68),(1010,1011)]&lt;br /&gt;
--    length (sucesionesConSuma 2021)  == 3&lt;br /&gt;
--    length (sucesionesConSuma 3000)  == 7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucesionesConSuma :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma n = [(a,b) | a &amp;lt;- [1..div n 2], b &amp;lt;- [a..n-a], (a+b)*(fromIntegral $ length [a..b]) == 2*n]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sucesionesConSuma1 :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma1 n = [(a,b) | a &amp;lt;- [1..(div n 2)], b &amp;lt;- [a..(n-a)], sum [a..b] == n, n&amp;gt;0]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir las funciones&lt;br /&gt;
--    noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucNoAmables :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (noAmable n) se verifica si n es un número no amable. Por ejemplo,&lt;br /&gt;
--    noAmable 2021 == False&lt;br /&gt;
--    noAmable 1024 == True&lt;br /&gt;
-- + sucNoAmables es la lista de números naturales no amables. Por&lt;br /&gt;
--   ejemplo,&lt;br /&gt;
--    take 10 sucNoAmables == [1,2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
noAmable n = null (sucesionesConSuma n)&lt;br /&gt;
&lt;br /&gt;
sucNoAmables :: [Integer]&lt;br /&gt;
sucNoAmables = filter noAmable [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que un número natural es no&lt;br /&gt;
-- amable si y sólo si es potencia de 2.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propNoAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable n = noAmable (abs n+1) == esPotenciaDeDos (abs n+1)&lt;br /&gt;
&lt;br /&gt;
esPotenciaDeDos n = elem n [2^i | i &amp;lt;- [0..20]]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
propNoAmable1 :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable1 1 = True -- Porque 1 == 2^0&lt;br /&gt;
propNoAmable1 n = noAmable n&amp;#039; == (2 == last (primeFactors n&amp;#039;))&lt;br /&gt;
             where n&amp;#039; | n &amp;lt; -1 = abs n &lt;br /&gt;
                      | n == -1 = 2&lt;br /&gt;
                      | n == 0 = 2&lt;br /&gt;
                      | otherwise = n&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Un número natural se denomina aritmético si la media&lt;br /&gt;
-- aritmética de sus divisores es un número entero.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esAritmetico n) se verifica si n es un número aritmético.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    esAritmetico 2021 == True&lt;br /&gt;
--    esAritmetico 24   == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico n = rem (sum (divisores n)) (fromIntegral $ (length (divisores n))) == 0&lt;br /&gt;
&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..div n 2], rem n x == 0] ++ [n]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
calculoMAF :: Integer -&amp;gt; Float&lt;br /&gt;
calculoMAF n = ( fromIntegral $ sum (primeFactors n) :: Float)  / (read $ show $ length (primeFactors n) :: Float)&lt;br /&gt;
esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico n = (show (round $ calculoMAF n)) ++ &amp;quot;.0&amp;quot; == (show $ calculoMAF n)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que todos los primos excepto&lt;br /&gt;
-- el 2 son aritméticos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primosAritmeticos :: Int -&amp;gt; Bool&lt;br /&gt;
primosAritmeticos n = all esAritmetico (take n (tail primes))&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck primosAritmeticos&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Definir la función&lt;br /&gt;
--    sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (sucAritmeticosConsecutivos n) es una sucesión de n números&lt;br /&gt;
-- aritméticos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 5&lt;br /&gt;
--    [19,20,21,22,23]&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 20&lt;br /&gt;
--    [4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,&lt;br /&gt;
--     4968,4969,4970,4971,4972,4973,4974]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
sucAritmeticosConsecutivos n = head (filter consecutivos (listaDeLongitud n sucAritmeticos))&lt;br /&gt;
&lt;br /&gt;
sucAritmeticos = filter esAritmetico [1..]&lt;br /&gt;
consecutivos xs = xs == [minimum xs..maximum xs]&lt;br /&gt;
listaDeLongitud n xs = map (take n) (tails xs)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. El número 2021 tiene las propiedades siguientes:&lt;br /&gt;
-- + sumándole su inverso es un número palíndromo: 2021 + 1202 = 3223&lt;br /&gt;
-- + multiplicándolo por su inverso también lo es: 2021 * 1202 = 2429242&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (masInvPalindromo n) se verifica si n más su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--     masInvPalindromo 2021  == True&lt;br /&gt;
--      masInvPalindromo 109   == False&lt;br /&gt;
-- + (prodInvPalindromo n) se verifica si n por su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--      prodInvPalindromo 2021 == True&lt;br /&gt;
--      prodInvPalindromo 1097 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
masInvPalindromo n = palindromo (n + inverso n)&lt;br /&gt;
&lt;br /&gt;
inverso n = read (reverse (show n)) :: Integer&lt;br /&gt;
palindromo n = n == inverso n&lt;br /&gt;
&lt;br /&gt;
prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
prodInvPalindromo n = palindromo (n * inverso n)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2.. Comprobar con QuickCheck que todo número&lt;br /&gt;
-- prodInvPalindromo es masInvPalindromo.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
propInvPalindromo n = not (prodInvPalindromo (abs n)) || masInvPalindromo (abs n)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck propInvPalindromo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Comprobar que el número 2021 es el menor  número&lt;br /&gt;
-- natural que verifica las siguientes propiedades:&lt;br /&gt;
--  (+) es la concatenación de dos enteros consecutivos (20 y 21)&lt;br /&gt;
--  (+) es el producto de dos primos consecutivos (43 y 47)&lt;br /&gt;
--&lt;br /&gt;
-- Para ello, definir las funciones&lt;br /&gt;
--    esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    especiales :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esConcatConsecutivos n) se verifica si n es la concatenación de&lt;br /&gt;
--   dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--      esConcatConsecutivos 2021 == True&lt;br /&gt;
-- + (esProdprimosConsecutivos n) se verifica si n es el producto de dos&lt;br /&gt;
--   primos consecutivos&lt;br /&gt;
--      esProdprimosConsecutivos 2021 == True&lt;br /&gt;
-- + espaciales es la lista de números naturales que verifican las dos&lt;br /&gt;
--   propiedaes anteriores&lt;br /&gt;
--      head especiales == 2021&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
-- esConcatConsecutivos&lt;br /&gt;
-- ====================&lt;br /&gt;
&lt;br /&gt;
esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esConcatConsecutivos n = elem n (takeWhile (&amp;lt;=n) concatEnterosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
concatEnterosConsecutivos = map f (listaDeLongitud 2 [0..])&lt;br /&gt;
                          where f [a,b] = read (show a ++ show b) :: Integer&lt;br /&gt;
&lt;br /&gt;
-- esProdprimosConsecutivos&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esProdprimosConsecutivos n = elem n (takeWhile (&amp;lt;=n) prodprimosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
prodprimosConsecutivos = map f (listaDeLongitud 2 primes)&lt;br /&gt;
                       where f [a,b] = a*b&lt;br /&gt;
&lt;br /&gt;
-- especiales&lt;br /&gt;
-- ==========&lt;br /&gt;
&lt;br /&gt;
especiales :: [Integer]&lt;br /&gt;
especiales = [n | n &amp;lt;- prodprimosConsecutivos, esConcatConsecutivos n]&lt;br /&gt;
&lt;br /&gt;
-- Primer número especial:&lt;br /&gt;
-- head especiales&lt;br /&gt;
-- 2021&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=537</id>
		<title>Relación 10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=537"/>
		<updated>2021-12-12T19:45:44Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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: Relación 10&lt;br /&gt;
-- Propiedades del número 2021.&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 sobre propiedades del número&lt;br /&gt;
-- 2021.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Data.List&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Consideramos todos los primos menores que 100:&lt;br /&gt;
--    2, 3, 5, 7, 11, ..., 89, 97&lt;br /&gt;
-- y formamos los correspondientes pares de dominó:&lt;br /&gt;
--    (2,3), (3,5), (5,7), ..., (83,89), (89,97).&lt;br /&gt;
-- La suma de los números en todos los pares es 2021.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDominoPrimos n) es la suma de los números de los pares&lt;br /&gt;
-- de dominó formada a partir de los primos menores que n. Por ejemplo,&lt;br /&gt;
--    sumaDominoPrimos 100 == 2021&lt;br /&gt;
--    sumaDominoPrimos 200 == 8253&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos n = sum $ map f (zip (primosHasta n) (tail (primosHasta n)))&lt;br /&gt;
                   where f (a,b) = a+b&lt;br /&gt;
                         &lt;br /&gt;
primosHasta n = takeWhile (&amp;lt;n) primes &lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
listaPrimosN :: Integer -&amp;gt; [Integer] -- Para obtener la lista de los números primos menores que n.&lt;br /&gt;
listaPrimosN n = [p | p &amp;lt;- (take (fromInteger n :: Int) (primes)), p &amp;lt; n]&lt;br /&gt;
&lt;br /&gt;
sumaDominoPrimos1 :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos1 n =  sum [a+b | (a,b) &amp;lt;- (zip (listaPrimosN n) (tail (listaPrimosN n)))]&lt;br /&gt;
&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
sumaDominoPrimos&amp;#039; :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos&amp;#039; n = sum [a+b | (a,b) &amp;lt;- zip ps (tail ps)]&lt;br /&gt;
                    where ps = takeWhile (&amp;lt;n) primes&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la constante&lt;br /&gt;
--   sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
-- tal que sucSumaDominoPrimos es la sucesión de los números que son&lt;br /&gt;
-- suma de pares de dominó formado con números primos. Por ejemplo,&lt;br /&gt;
--   λ&amp;gt; take 25 sucSumaDominoPrimos&lt;br /&gt;
--   [5,13,25,43,67,97,133,175,227,287,355,433,517,607,707,819,939,1067,&lt;br /&gt;
--    1205,1349,1501,1663,1835,2021,2219]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos = [sumaDominoPrimos n | n &amp;lt;- [3..], isPrime n]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sucSumaDominoPrimos1 :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos1 = [sumaDominoPrimos1 x| x &amp;lt;- drop 2 primes]&lt;br /&gt;
&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
sucSumaDominoPrimos&amp;#039; :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos&amp;#039; = tail [sumaDominoPrimos p |  p &amp;lt;- (tail  primes)]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la sucesión&lt;br /&gt;
--   esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumaDominoPrimos n) se verifica si n es un número de la&lt;br /&gt;
-- sucesión anterior. Por ejemplo,&lt;br /&gt;
--  esSumaDominoPrimos 2021    == True&lt;br /&gt;
--  esSumaDominoPrimos 1234509 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos n = elem n (takeWhile (&amp;lt;=n) sucSumaDominoPrimos)&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esSumaDominoPrimos1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos1 n = head (dropWhile (&amp;lt;n) sucSumaDominoPrimos1) == n&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. El número 2021 es la suma de 33 más la suma de los 33&lt;br /&gt;
-- primeros números primos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumSumaPrimos n) es la suma de n más los n primeros números&lt;br /&gt;
-- primos. Por ejemplo,&lt;br /&gt;
--   sumSumaPrimos 33 == 2021&lt;br /&gt;
--   sumSumaPrimos 52 == 5641&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n =  fromIntegral (n + sum (take n primes))&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n = read (show $ sum $ n : take n primes) :: Integer&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir la función&lt;br /&gt;
--    esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumSumaPrimos n) se verifica si n es de la suma de m más&lt;br /&gt;
-- los m primeros primos, para algún entero m. Por ejemplo,&lt;br /&gt;
--    esSumSumaPrimos 2021       == True&lt;br /&gt;
--    esSumSumaPrimos 120        == False&lt;br /&gt;
--    esSumSumaPrimos 1234567893 == False&lt;br /&gt;
--    esSumSumaPrimos 774511387  == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez , Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos) &lt;br /&gt;
&lt;br /&gt;
sucSumSumaPrimos = map sumSumaPrimos [1..]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Un número semiprimo es un número natural que es producto&lt;br /&gt;
-- de dos números primos no necesariamente distintos. Por ejemplo, 26 es&lt;br /&gt;
-- semiprimo (porque 26 = 2×13) y 49 también lo es (porque 49 = 7×7).&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    semiprimos  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esSemiprimo n) se verifica si n es semiprimo. Por ejemplo,&lt;br /&gt;
--      esSemiprimo 26          ==  True&lt;br /&gt;
--      esSemiprimo 49          ==  True&lt;br /&gt;
--      esSemiprimo 8           ==  False&lt;br /&gt;
--      esSemiprimo 2021        ==  True&lt;br /&gt;
--      esSemiprimo (21+10^14)  ==  True&lt;br /&gt;
-- + semiprimos es la sucesión de números semiprimos. Por ejemplo,&lt;br /&gt;
--      take 10 semiprimos   ==  [4,6,9,10,14,15,21,22,25,26]&lt;br /&gt;
--      semiprimos !! 580    ==  2021&lt;br /&gt;
--      semiprimos !! 10000  ==  40886&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo n = or [a*b == n | a &amp;lt;- primeFactors n, b &amp;lt;- primeFactors n]&lt;br /&gt;
&lt;br /&gt;
semiprimos :: [Integer]&lt;br /&gt;
semiprimos = filter esSemiprimo [4..]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esSemiprimo1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo1 n = length (primeFactors n) == 2&lt;br /&gt;
&lt;br /&gt;
semiprimos1 :: [Integer]&lt;br /&gt;
semiprimos1 = [x | x&amp;lt;- [1..], esSemiprimo1 x]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un número natural n es un número entero Blum si&lt;br /&gt;
-- n = p × q es un semiprimo para el que p y q son distintos primos&lt;br /&gt;
-- congruentes con 3 módulo 4. Es decir, p y q tienen que ser de la&lt;br /&gt;
-- forma 4 t + 3, para algún número entero t. Los números enteros de&lt;br /&gt;
-- esta forma se denominan números primos de Blum.  Los primeros enteros&lt;br /&gt;
-- de Blum son&lt;br /&gt;
--    21, 33, 57, 69, 77, 93, 129, 133, 141, 161, 177, ...&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBlum  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBlum n) se verifica si n es un número de Blum. Por ejemplo,&lt;br /&gt;
--      esBlum 26          ==  False&lt;br /&gt;
--      esBlum 49          ==  False&lt;br /&gt;
--      esBlum 77          ==  True&lt;br /&gt;
--      esBlum 2021        ==  True&lt;br /&gt;
--      esBlum (21+10^14)  ==  True&lt;br /&gt;
-- + sucBlum es la sucesión de números de Blum. Por ejemplo,&lt;br /&gt;
--      take 10 sucBlum  ==  [21,33,57,69,77,93,129,133,141,161]&lt;br /&gt;
--      sucBlum !! 132    ==  2021&lt;br /&gt;
--      sucBlum !! 10000  ==  186821&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
esBlum n = and [esSemiprimo n, p /= q, rem p 4 == 3, rem q 4 == 3]&lt;br /&gt;
         where p = head (primeFactors n) &lt;br /&gt;
               q = last (primeFactors n)&lt;br /&gt;
              &lt;br /&gt;
sucBlum :: [Integer]&lt;br /&gt;
sucBlum = filter esBlum semiprimos&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Un número semiprimo n = p x q es brillante si p y q&lt;br /&gt;
-- tienen el mismo número de dígitos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBrillantes  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBrillante n) se verifica si n es brillante. Por ejemplo,&lt;br /&gt;
--      esBrillante 26          ==  False&lt;br /&gt;
--      esBrillante 49          ==  True&lt;br /&gt;
--      esBrillante 77          ==  False&lt;br /&gt;
--      esBrillante 2021        ==  True&lt;br /&gt;
--      esBrillante (21+10^14)  ==  False&lt;br /&gt;
-- + sucBrillantes es la sucesión de números brillantes. Por ejemplo,&lt;br /&gt;
--      take 10 sucBrillante   ==  [4,6,9,10,14,15,21,25,35,49]&lt;br /&gt;
--      sucBrillante !! 130    ==  2021&lt;br /&gt;
--      sucBrillante !! 10000  ==  696649&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
esBrillante n = esSemiprimo n &amp;amp;&amp;amp; length (show p) == length (show q)&lt;br /&gt;
              where p = head (primeFactors n)&lt;br /&gt;
                    q = last (primeFactors n)&lt;br /&gt;
                      &lt;br /&gt;
sucBrillante :: [Integer]&lt;br /&gt;
sucBrillante = filter esBrillante [4..]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Un número natural es amable si se puede expresar como&lt;br /&gt;
-- suma de, al menos, dos números naturales consecutivos. Por ejemplo,&lt;br /&gt;
-- 2021 es amable pues&lt;br /&gt;
--    2021 = 20 + 21 + ... + 65 + 66.&lt;br /&gt;
-- La mayoría de los números naturales son amables, por lo que vamos a&lt;br /&gt;
-- calcular la lista de los números no amables.&lt;br /&gt;
--&lt;br /&gt;
-- Los primeros números no amables son&lt;br /&gt;
--    1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,&lt;br /&gt;
--    16384, 32768, 65536, 131072, 262144&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sucesionesConSuma :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sucesionesConSuma n) es la lista de los pares formados por&lt;br /&gt;
-- el primero y por el último elemento de las sucesiones de números&lt;br /&gt;
-- naturales consecutivos con suma n. Por ejemplo,&lt;br /&gt;
--    sucesionesConSuma 15             == [(1,5),(4,6),(7,8)]&lt;br /&gt;
--    sucesionesConSuma 2021           == [(20,66),(26,68),(1010,1011)]&lt;br /&gt;
--    length (sucesionesConSuma 2021)  == 3&lt;br /&gt;
--    length (sucesionesConSuma 3000)  == 7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucesionesConSuma :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma n = [(a,b) | a &amp;lt;- [1..div n 2], b &amp;lt;- [a..n-a], (a+b)*(fromIntegral $ length [a..b]) == 2*n]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sucesionesConSuma1 :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma1 n = [(a,b) | a &amp;lt;- [1..(div n 2)], b &amp;lt;- [a..(n-a)], sum [a..b] == n, n&amp;gt;0]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir las funciones&lt;br /&gt;
--    noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucNoAmables :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (noAmable n) se verifica si n es un número no amable. Por ejemplo,&lt;br /&gt;
--    noAmable 2021 == False&lt;br /&gt;
--    noAmable 1024 == True&lt;br /&gt;
-- + sucNoAmables es la lista de números naturales no amables. Por&lt;br /&gt;
--   ejemplo,&lt;br /&gt;
--    take 10 sucNoAmables == [1,2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
noAmable n = null (sucesionesConSuma n)&lt;br /&gt;
&lt;br /&gt;
sucNoAmables :: [Integer]&lt;br /&gt;
sucNoAmables = filter noAmable [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que un número natural es no&lt;br /&gt;
-- amable si y sólo si es potencia de 2.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propNoAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable n = noAmable (abs n+1) == esPotenciaDeDos (abs n+1)&lt;br /&gt;
&lt;br /&gt;
esPotenciaDeDos n = elem n [2^i | i &amp;lt;- [0..20]]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
propNoAmable1 :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable1 1 = True -- Porque 1 == 2^0&lt;br /&gt;
propNoAmable1 n = noAmable n&amp;#039; == (2 == last (primeFactors n&amp;#039;))&lt;br /&gt;
             where n&amp;#039; | n &amp;lt; -1 = abs n &lt;br /&gt;
                      | n == -1 = 2&lt;br /&gt;
                      | n == 0 = 2&lt;br /&gt;
                      | otherwise = n&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Un número natural se denomina aritmético si la media&lt;br /&gt;
-- aritmética de sus divisores es un número entero.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esAritmetico n) se verifica si n es un número aritmético.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    esAritmetico 2021 == True&lt;br /&gt;
--    esAritmetico 24   == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico n = rem (sum (divisores n)) (fromIntegral $ (length (divisores n))) == 0&lt;br /&gt;
&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..div n 2], rem n x == 0] ++ [n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que todos los primos excepto&lt;br /&gt;
-- el 2 son aritméticos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primosAritmeticos :: Int -&amp;gt; Bool&lt;br /&gt;
primosAritmeticos n = all esAritmetico (take n (tail primes))&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck primosAritmeticos&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Definir la función&lt;br /&gt;
--    sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (sucAritmeticosConsecutivos n) es una sucesión de n números&lt;br /&gt;
-- aritméticos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 5&lt;br /&gt;
--    [19,20,21,22,23]&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 20&lt;br /&gt;
--    [4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,&lt;br /&gt;
--     4968,4969,4970,4971,4972,4973,4974]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
sucAritmeticosConsecutivos n = head (filter consecutivos (listaDeLongitud n sucAritmeticos))&lt;br /&gt;
&lt;br /&gt;
sucAritmeticos = filter esAritmetico [1..]&lt;br /&gt;
consecutivos xs = xs == [minimum xs..maximum xs]&lt;br /&gt;
listaDeLongitud n xs = map (take n) (tails xs)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. El número 2021 tiene las propiedades siguientes:&lt;br /&gt;
-- + sumándole su inverso es un número palíndromo: 2021 + 1202 = 3223&lt;br /&gt;
-- + multiplicándolo por su inverso también lo es: 2021 * 1202 = 2429242&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (masInvPalindromo n) se verifica si n más su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--     masInvPalindromo 2021  == True&lt;br /&gt;
--      masInvPalindromo 109   == False&lt;br /&gt;
-- + (prodInvPalindromo n) se verifica si n por su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--      prodInvPalindromo 2021 == True&lt;br /&gt;
--      prodInvPalindromo 1097 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
masInvPalindromo n = palindromo (n + inverso n)&lt;br /&gt;
&lt;br /&gt;
inverso n = read (reverse (show n)) :: Integer&lt;br /&gt;
palindromo n = n == inverso n&lt;br /&gt;
&lt;br /&gt;
prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
prodInvPalindromo n = palindromo (n * inverso n)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2.. Comprobar con QuickCheck que todo número&lt;br /&gt;
-- prodInvPalindromo es masInvPalindromo.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
propInvPalindromo n = not (prodInvPalindromo (abs n)) || masInvPalindromo (abs n)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck propInvPalindromo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Comprobar que el número 2021 es el menor  número&lt;br /&gt;
-- natural que verifica las siguientes propiedades:&lt;br /&gt;
--  (+) es la concatenación de dos enteros consecutivos (20 y 21)&lt;br /&gt;
--  (+) es el producto de dos primos consecutivos (43 y 47)&lt;br /&gt;
--&lt;br /&gt;
-- Para ello, definir las funciones&lt;br /&gt;
--    esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    especiales :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esConcatConsecutivos n) se verifica si n es la concatenación de&lt;br /&gt;
--   dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--      esConcatConsecutivos 2021 == True&lt;br /&gt;
-- + (esProdprimosConsecutivos n) se verifica si n es el producto de dos&lt;br /&gt;
--   primos consecutivos&lt;br /&gt;
--      esProdprimosConsecutivos 2021 == True&lt;br /&gt;
-- + espaciales es la lista de números naturales que verifican las dos&lt;br /&gt;
--   propiedaes anteriores&lt;br /&gt;
--      head especiales == 2021&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
-- esConcatConsecutivos&lt;br /&gt;
-- ====================&lt;br /&gt;
&lt;br /&gt;
esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esConcatConsecutivos n = elem n (takeWhile (&amp;lt;=n) concatEnterosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
concatEnterosConsecutivos = map f (listaDeLongitud 2 [0..])&lt;br /&gt;
                          where f [a,b] = read (show a ++ show b) :: Integer&lt;br /&gt;
&lt;br /&gt;
-- esProdprimosConsecutivos&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esProdprimosConsecutivos n = elem n (takeWhile (&amp;lt;=n) prodprimosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
prodprimosConsecutivos = map f (listaDeLongitud 2 primes)&lt;br /&gt;
                       where f [a,b] = a*b&lt;br /&gt;
&lt;br /&gt;
-- especiales&lt;br /&gt;
-- ==========&lt;br /&gt;
&lt;br /&gt;
especiales :: [Integer]&lt;br /&gt;
especiales = [n | n &amp;lt;- prodprimosConsecutivos, esConcatConsecutivos n]&lt;br /&gt;
&lt;br /&gt;
-- Primer número especial:&lt;br /&gt;
-- head especiales&lt;br /&gt;
-- 2021&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=536</id>
		<title>Relación 10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=536"/>
		<updated>2021-12-12T19:09:39Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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: Relación 10&lt;br /&gt;
-- Propiedades del número 2021.&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 sobre propiedades del número&lt;br /&gt;
-- 2021.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Data.List&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Consideramos todos los primos menores que 100:&lt;br /&gt;
--    2, 3, 5, 7, 11, ..., 89, 97&lt;br /&gt;
-- y formamos los correspondientes pares de dominó:&lt;br /&gt;
--    (2,3), (3,5), (5,7), ..., (83,89), (89,97).&lt;br /&gt;
-- La suma de los números en todos los pares es 2021.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDominoPrimos n) es la suma de los números de los pares&lt;br /&gt;
-- de dominó formada a partir de los primos menores que n. Por ejemplo,&lt;br /&gt;
--    sumaDominoPrimos 100 == 2021&lt;br /&gt;
--    sumaDominoPrimos 200 == 8253&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos n = sum $ map f (zip (primosHasta n) (tail (primosHasta n)))&lt;br /&gt;
                   where f (a,b) = a+b&lt;br /&gt;
                         &lt;br /&gt;
primosHasta n = takeWhile (&amp;lt;n) primes &lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
listaPrimosN :: Integer -&amp;gt; [Integer] -- Para obtener la lista de los números primos menores que n.&lt;br /&gt;
listaPrimosN n = [p | p &amp;lt;- (take (fromInteger n :: Int) (primes)), p &amp;lt; n]&lt;br /&gt;
&lt;br /&gt;
sumaDominoPrimos1 :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos1 n =  sum [a+b | (a,b) &amp;lt;- (zip (listaPrimosN n) (tail (listaPrimosN n)))]&lt;br /&gt;
&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
sumaDominoPrimos&amp;#039; :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos&amp;#039; n = sum [a+b | (a,b) &amp;lt;- zip ps (tail ps)]&lt;br /&gt;
                    where ps = takeWhile (&amp;lt;n) primes&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la constante&lt;br /&gt;
--   sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
-- tal que sucSumaDominoPrimos es la sucesión de los números que son&lt;br /&gt;
-- suma de pares de dominó formado con números primos. Por ejemplo,&lt;br /&gt;
--   λ&amp;gt; take 25 sucSumaDominoPrimos&lt;br /&gt;
--   [5,13,25,43,67,97,133,175,227,287,355,433,517,607,707,819,939,1067,&lt;br /&gt;
--    1205,1349,1501,1663,1835,2021,2219]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos = [sumaDominoPrimos n | n &amp;lt;- [3..], isPrime n]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sucSumaDominoPrimos1 :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos1 = [sumaDominoPrimos1 x| x &amp;lt;- drop 2 primes]&lt;br /&gt;
&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
sucSumaDominoPrimos&amp;#039; :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos&amp;#039; = tail [sumaDominoPrimos p |  p &amp;lt;- (tail  primes)]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la sucesión&lt;br /&gt;
--   esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumaDominoPrimos n) se verifica si n es un número de la&lt;br /&gt;
-- sucesión anterior. Por ejemplo,&lt;br /&gt;
--  esSumaDominoPrimos 2021    == True&lt;br /&gt;
--  esSumaDominoPrimos 1234509 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos n = elem n (takeWhile (&amp;lt;=n) sucSumaDominoPrimos)&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esSumaDominoPrimos1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos1 n = head (dropWhile (&amp;lt;n) sucSumaDominoPrimos1) == n&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. El número 2021 es la suma de 33 más la suma de los 33&lt;br /&gt;
-- primeros números primos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumSumaPrimos n) es la suma de n más los n primeros números&lt;br /&gt;
-- primos. Por ejemplo,&lt;br /&gt;
--   sumSumaPrimos 33 == 2021&lt;br /&gt;
--   sumSumaPrimos 52 == 5641&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n =  fromIntegral (n + sum (take n primes))&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n = read (show $ sum $ n : take n primes) :: Integer&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir la función&lt;br /&gt;
--    esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumSumaPrimos n) se verifica si n es de la suma de m más&lt;br /&gt;
-- los m primeros primos, para algún entero m. Por ejemplo,&lt;br /&gt;
--    esSumSumaPrimos 2021       == True&lt;br /&gt;
--    esSumSumaPrimos 120        == False&lt;br /&gt;
--    esSumSumaPrimos 1234567893 == False&lt;br /&gt;
--    esSumSumaPrimos 774511387  == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez , Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos) &lt;br /&gt;
&lt;br /&gt;
sucSumSumaPrimos = map sumSumaPrimos [1..]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Un número semiprimo es un número natural que es producto&lt;br /&gt;
-- de dos números primos no necesariamente distintos. Por ejemplo, 26 es&lt;br /&gt;
-- semiprimo (porque 26 = 2×13) y 49 también lo es (porque 49 = 7×7).&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    semiprimos  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esSemiprimo n) se verifica si n es semiprimo. Por ejemplo,&lt;br /&gt;
--      esSemiprimo 26          ==  True&lt;br /&gt;
--      esSemiprimo 49          ==  True&lt;br /&gt;
--      esSemiprimo 8           ==  False&lt;br /&gt;
--      esSemiprimo 2021        ==  True&lt;br /&gt;
--      esSemiprimo (21+10^14)  ==  True&lt;br /&gt;
-- + semiprimos es la sucesión de números semiprimos. Por ejemplo,&lt;br /&gt;
--      take 10 semiprimos   ==  [4,6,9,10,14,15,21,22,25,26]&lt;br /&gt;
--      semiprimos !! 580    ==  2021&lt;br /&gt;
--      semiprimos !! 10000  ==  40886&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo n = or [a*b == n | a &amp;lt;- primeFactors n, b &amp;lt;- primeFactors n]&lt;br /&gt;
&lt;br /&gt;
semiprimos :: [Integer]&lt;br /&gt;
semiprimos = filter esSemiprimo [4..]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esSemiprimo1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo1 n = length (primeFactors n) == 2&lt;br /&gt;
&lt;br /&gt;
semiprimos1 :: [Integer]&lt;br /&gt;
semiprimos1 = [x | x&amp;lt;- [1..], esSemiprimo1 x]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un número natural n es un número entero Blum si&lt;br /&gt;
-- n = p × q es un semiprimo para el que p y q son distintos primos&lt;br /&gt;
-- congruentes con 3 módulo 4. Es decir, p y q tienen que ser de la&lt;br /&gt;
-- forma 4 t + 3, para algún número entero t. Los números enteros de&lt;br /&gt;
-- esta forma se denominan números primos de Blum.  Los primeros enteros&lt;br /&gt;
-- de Blum son&lt;br /&gt;
--    21, 33, 57, 69, 77, 93, 129, 133, 141, 161, 177, ...&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBlum  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBlum n) se verifica si n es un número de Blum. Por ejemplo,&lt;br /&gt;
--      esBlum 26          ==  False&lt;br /&gt;
--      esBlum 49          ==  False&lt;br /&gt;
--      esBlum 77          ==  True&lt;br /&gt;
--      esBlum 2021        ==  True&lt;br /&gt;
--      esBlum (21+10^14)  ==  True&lt;br /&gt;
-- + sucBlum es la sucesión de números de Blum. Por ejemplo,&lt;br /&gt;
--      take 10 sucBlum  ==  [21,33,57,69,77,93,129,133,141,161]&lt;br /&gt;
--      sucBlum !! 132    ==  2021&lt;br /&gt;
--      sucBlum !! 10000  ==  186821&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
esBlum n = and [esSemiprimo n, p /= q, rem p 4 == 3, rem q 4 == 3]&lt;br /&gt;
         where p = head (primeFactors n) &lt;br /&gt;
               q = last (primeFactors n)&lt;br /&gt;
              &lt;br /&gt;
sucBlum :: [Integer]&lt;br /&gt;
sucBlum = filter esBlum semiprimos&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Un número semiprimo n = p x q es brillante si p y q&lt;br /&gt;
-- tienen el mismo número de dígitos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBrillantes  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBrillante n) se verifica si n es brillante. Por ejemplo,&lt;br /&gt;
--      esBrillante 26          ==  False&lt;br /&gt;
--      esBrillante 49          ==  True&lt;br /&gt;
--      esBrillante 77          ==  False&lt;br /&gt;
--      esBrillante 2021        ==  True&lt;br /&gt;
--      esBrillante (21+10^14)  ==  False&lt;br /&gt;
-- + sucBrillantes es la sucesión de números brillantes. Por ejemplo,&lt;br /&gt;
--      take 10 sucBrillante   ==  [4,6,9,10,14,15,21,25,35,49]&lt;br /&gt;
--      sucBrillante !! 130    ==  2021&lt;br /&gt;
--      sucBrillante !! 10000  ==  696649&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
esBrillante n = esSemiprimo n &amp;amp;&amp;amp; length (show p) == length (show q)&lt;br /&gt;
              where p = head (primeFactors n)&lt;br /&gt;
                    q = last (primeFactors n)&lt;br /&gt;
                      &lt;br /&gt;
sucBrillante :: [Integer]&lt;br /&gt;
sucBrillante = filter esBrillante [4..]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Un número natural es amable si se puede expresar como&lt;br /&gt;
-- suma de, al menos, dos números naturales consecutivos. Por ejemplo,&lt;br /&gt;
-- 2021 es amable pues&lt;br /&gt;
--    2021 = 20 + 21 + ... + 65 + 66.&lt;br /&gt;
-- La mayoría de los números naturales son amables, por lo que vamos a&lt;br /&gt;
-- calcular la lista de los números no amables.&lt;br /&gt;
--&lt;br /&gt;
-- Los primeros números no amables son&lt;br /&gt;
--    1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,&lt;br /&gt;
--    16384, 32768, 65536, 131072, 262144&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sucesionesConSuma :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sucesionesConSuma n) es la lista de los pares formados por&lt;br /&gt;
-- el primero y por el último elemento de las sucesiones de números&lt;br /&gt;
-- naturales consecutivos con suma n. Por ejemplo,&lt;br /&gt;
--    sucesionesConSuma 15             == [(1,5),(4,6),(7,8)]&lt;br /&gt;
--    sucesionesConSuma 2021           == [(20,66),(26,68),(1010,1011)]&lt;br /&gt;
--    length (sucesionesConSuma 2021)  == 3&lt;br /&gt;
--    length (sucesionesConSuma 3000)  == 7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucesionesConSuma :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma n = [(a,b) | a &amp;lt;- [1..div n 2], b &amp;lt;- [a..n-a], (a+b)*(fromIntegral $ length [a..b]) == 2*n]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sucesionesConSuma1 :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma1 n = [(a,b) | a &amp;lt;- [1..(div n 2)], b &amp;lt;- [a..(n-a)], sum [a..b] == n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir las funciones&lt;br /&gt;
--    noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucNoAmables :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (noAmable n) se verifica si n es un número no amable. Por ejemplo,&lt;br /&gt;
--    noAmable 2021 == False&lt;br /&gt;
--    noAmable 1024 == True&lt;br /&gt;
-- + sucNoAmables es la lista de números naturales no amables. Por&lt;br /&gt;
--   ejemplo,&lt;br /&gt;
--    take 10 sucNoAmables == [1,2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
noAmable n = null (sucesionesConSuma n)&lt;br /&gt;
&lt;br /&gt;
sucNoAmables :: [Integer]&lt;br /&gt;
sucNoAmables = filter noAmable [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que un número natural es no&lt;br /&gt;
-- amable si y sólo si es potencia de 2.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propNoAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable n = noAmable (abs n+1) == esPotenciaDeDos (abs n+1)&lt;br /&gt;
&lt;br /&gt;
esPotenciaDeDos n = elem n [2^i | i &amp;lt;- [0..20]]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Un número natural se denomina aritmético si la media&lt;br /&gt;
-- aritmética de sus divisores es un número entero.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esAritmetico n) se verifica si n es un número aritmético.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    esAritmetico 2021 == True&lt;br /&gt;
--    esAritmetico 24   == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico n = rem (sum (divisores n)) (fromIntegral $ (length (divisores n))) == 0&lt;br /&gt;
&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..div n 2], rem n x == 0] ++ [n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que todos los primos excepto&lt;br /&gt;
-- el 2 son aritméticos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primosAritmeticos :: Int -&amp;gt; Bool&lt;br /&gt;
primosAritmeticos n = all esAritmetico (take n (tail primes))&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck primosAritmeticos&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Definir la función&lt;br /&gt;
--    sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (sucAritmeticosConsecutivos n) es una sucesión de n números&lt;br /&gt;
-- aritméticos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 5&lt;br /&gt;
--    [19,20,21,22,23]&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 20&lt;br /&gt;
--    [4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,&lt;br /&gt;
--     4968,4969,4970,4971,4972,4973,4974]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
sucAritmeticosConsecutivos n = head (filter consecutivos (listaDeLongitud n sucAritmeticos))&lt;br /&gt;
&lt;br /&gt;
sucAritmeticos = filter esAritmetico [1..]&lt;br /&gt;
consecutivos xs = xs == [minimum xs..maximum xs]&lt;br /&gt;
listaDeLongitud n xs = map (take n) (tails xs)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. El número 2021 tiene las propiedades siguientes:&lt;br /&gt;
-- + sumándole su inverso es un número palíndromo: 2021 + 1202 = 3223&lt;br /&gt;
-- + multiplicándolo por su inverso también lo es: 2021 * 1202 = 2429242&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (masInvPalindromo n) se verifica si n más su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--     masInvPalindromo 2021  == True&lt;br /&gt;
--      masInvPalindromo 109   == False&lt;br /&gt;
-- + (prodInvPalindromo n) se verifica si n por su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--      prodInvPalindromo 2021 == True&lt;br /&gt;
--      prodInvPalindromo 1097 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
masInvPalindromo n = palindromo (n + inverso n)&lt;br /&gt;
&lt;br /&gt;
inverso n = read (reverse (show n)) :: Integer&lt;br /&gt;
palindromo n = n == inverso n&lt;br /&gt;
&lt;br /&gt;
prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
prodInvPalindromo n = palindromo (n * inverso n)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2.. Comprobar con QuickCheck que todo número&lt;br /&gt;
-- prodInvPalindromo es masInvPalindromo.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
propInvPalindromo n = not (prodInvPalindromo (abs n)) || masInvPalindromo (abs n)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck propInvPalindromo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Comprobar que el número 2021 es el menor  número&lt;br /&gt;
-- natural que verifica las siguientes propiedades:&lt;br /&gt;
--  (+) es la concatenación de dos enteros consecutivos (20 y 21)&lt;br /&gt;
--  (+) es el producto de dos primos consecutivos (43 y 47)&lt;br /&gt;
--&lt;br /&gt;
-- Para ello, definir las funciones&lt;br /&gt;
--    esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    especiales :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esConcatConsecutivos n) se verifica si n es la concatenación de&lt;br /&gt;
--   dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--      esConcatConsecutivos 2021 == True&lt;br /&gt;
-- + (esProdprimosConsecutivos n) se verifica si n es el producto de dos&lt;br /&gt;
--   primos consecutivos&lt;br /&gt;
--      esProdprimosConsecutivos 2021 == True&lt;br /&gt;
-- + espaciales es la lista de números naturales que verifican las dos&lt;br /&gt;
--   propiedaes anteriores&lt;br /&gt;
--      head especiales == 2021&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
-- esConcatConsecutivos&lt;br /&gt;
-- ====================&lt;br /&gt;
&lt;br /&gt;
esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esConcatConsecutivos n = elem n (takeWhile (&amp;lt;=n) concatEnterosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
concatEnterosConsecutivos = map f (listaDeLongitud 2 [0..])&lt;br /&gt;
                          where f [a,b] = read (show a ++ show b) :: Integer&lt;br /&gt;
&lt;br /&gt;
-- esProdprimosConsecutivos&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esProdprimosConsecutivos n = elem n (takeWhile (&amp;lt;=n) prodprimosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
prodprimosConsecutivos = map f (listaDeLongitud 2 primes)&lt;br /&gt;
                       where f [a,b] = a*b&lt;br /&gt;
&lt;br /&gt;
-- especiales&lt;br /&gt;
-- ==========&lt;br /&gt;
&lt;br /&gt;
especiales :: [Integer]&lt;br /&gt;
especiales = [n | n &amp;lt;- prodprimosConsecutivos, esConcatConsecutivos n]&lt;br /&gt;
&lt;br /&gt;
-- Primer número especial:&lt;br /&gt;
-- head especiales&lt;br /&gt;
-- 2021&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=535</id>
		<title>Relación 10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=535"/>
		<updated>2021-12-12T19:03:52Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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: Relación 10&lt;br /&gt;
-- Propiedades del número 2021.&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 sobre propiedades del número&lt;br /&gt;
-- 2021.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Data.List&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Consideramos todos los primos menores que 100:&lt;br /&gt;
--    2, 3, 5, 7, 11, ..., 89, 97&lt;br /&gt;
-- y formamos los correspondientes pares de dominó:&lt;br /&gt;
--    (2,3), (3,5), (5,7), ..., (83,89), (89,97).&lt;br /&gt;
-- La suma de los números en todos los pares es 2021.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDominoPrimos n) es la suma de los números de los pares&lt;br /&gt;
-- de dominó formada a partir de los primos menores que n. Por ejemplo,&lt;br /&gt;
--    sumaDominoPrimos 100 == 2021&lt;br /&gt;
--    sumaDominoPrimos 200 == 8253&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos n = sum $ map f (zip (primosHasta n) (tail (primosHasta n)))&lt;br /&gt;
                   where f (a,b) = a+b&lt;br /&gt;
                         &lt;br /&gt;
primosHasta n = takeWhile (&amp;lt;n) primes &lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
listaPrimosN :: Integer -&amp;gt; [Integer] -- Para obtener la lista de los números primos menores que n.&lt;br /&gt;
listaPrimosN n = [p | p &amp;lt;- (take (fromInteger n :: Int) (primes)), p &amp;lt; n]&lt;br /&gt;
&lt;br /&gt;
sumaDominoPrimos1 :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos1 n =  sum [a+b | (a,b) &amp;lt;- (zip (listaPrimosN n) (tail (listaPrimosN n)))]&lt;br /&gt;
&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
sumaDominoPrimos&amp;#039; :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos&amp;#039; n = sum [a+b | (a,b) &amp;lt;- zip ps (tail ps)]&lt;br /&gt;
                    where ps = takeWhile (&amp;lt;n) primes&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la constante&lt;br /&gt;
--   sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
-- tal que sucSumaDominoPrimos es la sucesión de los números que son&lt;br /&gt;
-- suma de pares de dominó formado con números primos. Por ejemplo,&lt;br /&gt;
--   λ&amp;gt; take 25 sucSumaDominoPrimos&lt;br /&gt;
--   [5,13,25,43,67,97,133,175,227,287,355,433,517,607,707,819,939,1067,&lt;br /&gt;
--    1205,1349,1501,1663,1835,2021,2219]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos = [sumaDominoPrimos n | n &amp;lt;- [3..], isPrime n]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sucSumaDominoPrimos1 :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos1 = [sumaDominoPrimos1 x| x &amp;lt;- drop 2 primes]&lt;br /&gt;
&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
sucSumaDominoPrimos&amp;#039; :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos&amp;#039; = tail [sumaDominoPrimos p |  p &amp;lt;- (tail  primes)]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la sucesión&lt;br /&gt;
--   esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumaDominoPrimos n) se verifica si n es un número de la&lt;br /&gt;
-- sucesión anterior. Por ejemplo,&lt;br /&gt;
--  esSumaDominoPrimos 2021    == True&lt;br /&gt;
--  esSumaDominoPrimos 1234509 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos n = elem n (takeWhile (&amp;lt;=n) sucSumaDominoPrimos)&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esSumaDominoPrimos1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos1 n = head (dropWhile (&amp;lt;n) sucSumaDominoPrimos1) == n&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. El número 2021 es la suma de 33 más la suma de los 33&lt;br /&gt;
-- primeros números primos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumSumaPrimos n) es la suma de n más los n primeros números&lt;br /&gt;
-- primos. Por ejemplo,&lt;br /&gt;
--   sumSumaPrimos 33 == 2021&lt;br /&gt;
--   sumSumaPrimos 52 == 5641&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n =  fromIntegral (n + sum (take n primes))&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n = read (show $ sum $ n : take n primes) :: Integer&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir la función&lt;br /&gt;
--    esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumSumaPrimos n) se verifica si n es de la suma de m más&lt;br /&gt;
-- los m primeros primos, para algún entero m. Por ejemplo,&lt;br /&gt;
--    esSumSumaPrimos 2021       == True&lt;br /&gt;
--    esSumSumaPrimos 120        == False&lt;br /&gt;
--    esSumSumaPrimos 1234567893 == False&lt;br /&gt;
--    esSumSumaPrimos 774511387  == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez , Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos) &lt;br /&gt;
&lt;br /&gt;
sucSumSumaPrimos = map sumSumaPrimos [1..]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Un número semiprimo es un número natural que es producto&lt;br /&gt;
-- de dos números primos no necesariamente distintos. Por ejemplo, 26 es&lt;br /&gt;
-- semiprimo (porque 26 = 2×13) y 49 también lo es (porque 49 = 7×7).&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    semiprimos  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esSemiprimo n) se verifica si n es semiprimo. Por ejemplo,&lt;br /&gt;
--      esSemiprimo 26          ==  True&lt;br /&gt;
--      esSemiprimo 49          ==  True&lt;br /&gt;
--      esSemiprimo 8           ==  False&lt;br /&gt;
--      esSemiprimo 2021        ==  True&lt;br /&gt;
--      esSemiprimo (21+10^14)  ==  True&lt;br /&gt;
-- + semiprimos es la sucesión de números semiprimos. Por ejemplo,&lt;br /&gt;
--      take 10 semiprimos   ==  [4,6,9,10,14,15,21,22,25,26]&lt;br /&gt;
--      semiprimos !! 580    ==  2021&lt;br /&gt;
--      semiprimos !! 10000  ==  40886&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo n = or [a*b == n | a &amp;lt;- primeFactors n, b &amp;lt;- primeFactors n]&lt;br /&gt;
&lt;br /&gt;
semiprimos :: [Integer]&lt;br /&gt;
semiprimos = filter esSemiprimo [4..]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esSemiprimo1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo1 n = length (primeFactors n) == 2&lt;br /&gt;
&lt;br /&gt;
semiprimos1 :: [Integer]&lt;br /&gt;
semiprimos1 = [x | x&amp;lt;- [1..], esSemiprimo1 x]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un número natural n es un número entero Blum si&lt;br /&gt;
-- n = p × q es un semiprimo para el que p y q son distintos primos&lt;br /&gt;
-- congruentes con 3 módulo 4. Es decir, p y q tienen que ser de la&lt;br /&gt;
-- forma 4 t + 3, para algún número entero t. Los números enteros de&lt;br /&gt;
-- esta forma se denominan números primos de Blum.  Los primeros enteros&lt;br /&gt;
-- de Blum son&lt;br /&gt;
--    21, 33, 57, 69, 77, 93, 129, 133, 141, 161, 177, ...&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBlum  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBlum n) se verifica si n es un número de Blum. Por ejemplo,&lt;br /&gt;
--      esBlum 26          ==  False&lt;br /&gt;
--      esBlum 49          ==  False&lt;br /&gt;
--      esBlum 77          ==  True&lt;br /&gt;
--      esBlum 2021        ==  True&lt;br /&gt;
--      esBlum (21+10^14)  ==  True&lt;br /&gt;
-- + sucBlum es la sucesión de números de Blum. Por ejemplo,&lt;br /&gt;
--      take 10 sucBlum  ==  [21,33,57,69,77,93,129,133,141,161]&lt;br /&gt;
--      sucBlum !! 132    ==  2021&lt;br /&gt;
--      sucBlum !! 10000  ==  186821&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
esBlum n = and [esSemiprimo n, p /= q, rem p 4 == 3, rem q 4 == 3]&lt;br /&gt;
         where p = head (primeFactors n) &lt;br /&gt;
               q = last (primeFactors n)&lt;br /&gt;
              &lt;br /&gt;
sucBlum :: [Integer]&lt;br /&gt;
sucBlum = filter esBlum semiprimos&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Un número semiprimo n = p x q es brillante si p y q&lt;br /&gt;
-- tienen el mismo número de dígitos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBrillantes  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBrillante n) se verifica si n es brillante. Por ejemplo,&lt;br /&gt;
--      esBrillante 26          ==  False&lt;br /&gt;
--      esBrillante 49          ==  True&lt;br /&gt;
--      esBrillante 77          ==  False&lt;br /&gt;
--      esBrillante 2021        ==  True&lt;br /&gt;
--      esBrillante (21+10^14)  ==  False&lt;br /&gt;
-- + sucBrillantes es la sucesión de números brillantes. Por ejemplo,&lt;br /&gt;
--      take 10 sucBrillante   ==  [4,6,9,10,14,15,21,25,35,49]&lt;br /&gt;
--      sucBrillante !! 130    ==  2021&lt;br /&gt;
--      sucBrillante !! 10000  ==  696649&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, José Manuel García&lt;br /&gt;
esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
esBrillante n = esSemiprimo n &amp;amp;&amp;amp; length (show p) == length (show q)&lt;br /&gt;
              where p = head (primeFactors n)&lt;br /&gt;
                    q = last (primeFactors n)&lt;br /&gt;
                      &lt;br /&gt;
sucBrillante :: [Integer]&lt;br /&gt;
sucBrillante = filter esBrillante [4..]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Un número natural es amable si se puede expresar como&lt;br /&gt;
-- suma de, al menos, dos números naturales consecutivos. Por ejemplo,&lt;br /&gt;
-- 2021 es amable pues&lt;br /&gt;
--    2021 = 20 + 21 + ... + 65 + 66.&lt;br /&gt;
-- La mayoría de los números naturales son amables, por lo que vamos a&lt;br /&gt;
-- calcular la lista de los números no amables.&lt;br /&gt;
--&lt;br /&gt;
-- Los primeros números no amables son&lt;br /&gt;
--    1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,&lt;br /&gt;
--    16384, 32768, 65536, 131072, 262144&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sucesionesConSuma :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sucesionesConSuma n) es la lista de los pares formados por&lt;br /&gt;
-- el primero y por el último elemento de las sucesiones de números&lt;br /&gt;
-- naturales consecutivos con suma n. Por ejemplo,&lt;br /&gt;
--    sucesionesConSuma 15             == [(1,5),(4,6),(7,8)]&lt;br /&gt;
--    sucesionesConSuma 2021           == [(20,66),(26,68),(1010,1011)]&lt;br /&gt;
--    length (sucesionesConSuma 2021)  == 3&lt;br /&gt;
--    length (sucesionesConSuma 3000)  == 7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucesionesConSuma :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma n = [(a,b) | a &amp;lt;- [1..div n 2], b &amp;lt;- [a..n-a], (a+b)*(fromIntegral $ length [a..b]) == 2*n]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sucesionesConSuma1 :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma1 n = [(a,b) | a &amp;lt;- [1..(div n 2)], b &amp;lt;- [a..(n-a)], sum [a..b] == n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir las funciones&lt;br /&gt;
--    noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucNoAmables :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (noAmable n) se verifica si n es un número no amable. Por ejemplo,&lt;br /&gt;
--    noAmable 2021 == False&lt;br /&gt;
--    noAmable 1024 == True&lt;br /&gt;
-- + sucNoAmables es la lista de números naturales no amables. Por&lt;br /&gt;
--   ejemplo,&lt;br /&gt;
--    take 10 sucNoAmables == [1,2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
noAmable n = null (sucesionesConSuma n)&lt;br /&gt;
&lt;br /&gt;
sucNoAmables :: [Integer]&lt;br /&gt;
sucNoAmables = filter noAmable [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que un número natural es no&lt;br /&gt;
-- amable si y sólo si es potencia de 2.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propNoAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable n = noAmable (abs n+1) == esPotenciaDeDos (abs n+1)&lt;br /&gt;
&lt;br /&gt;
esPotenciaDeDos n = elem n [2^i | i &amp;lt;- [0..20]]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Un número natural se denomina aritmético si la media&lt;br /&gt;
-- aritmética de sus divisores es un número entero.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esAritmetico n) se verifica si n es un número aritmético.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    esAritmetico 2021 == True&lt;br /&gt;
--    esAritmetico 24   == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico n = rem (sum (divisores n)) (fromIntegral $ (length (divisores n))) == 0&lt;br /&gt;
&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..div n 2], rem n x == 0] ++ [n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que todos los primos excepto&lt;br /&gt;
-- el 2 son aritméticos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primosAritmeticos :: Int -&amp;gt; Bool&lt;br /&gt;
primosAritmeticos n = all esAritmetico (take n (tail primes))&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck primosAritmeticos&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Definir la función&lt;br /&gt;
--    sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (sucAritmeticosConsecutivos n) es una sucesión de n números&lt;br /&gt;
-- aritméticos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 5&lt;br /&gt;
--    [19,20,21,22,23]&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 20&lt;br /&gt;
--    [4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,&lt;br /&gt;
--     4968,4969,4970,4971,4972,4973,4974]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
sucAritmeticosConsecutivos n = head (filter consecutivos (listaDeLongitud n sucAritmeticos))&lt;br /&gt;
&lt;br /&gt;
sucAritmeticos = filter esAritmetico [1..]&lt;br /&gt;
consecutivos xs = xs == [minimum xs..maximum xs]&lt;br /&gt;
listaDeLongitud n xs = map (take n) (tails xs)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. El número 2021 tiene las propiedades siguientes:&lt;br /&gt;
-- + sumándole su inverso es un número palíndromo: 2021 + 1202 = 3223&lt;br /&gt;
-- + multiplicándolo por su inverso también lo es: 2021 * 1202 = 2429242&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (masInvPalindromo n) se verifica si n más su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--     masInvPalindromo 2021  == True&lt;br /&gt;
--      masInvPalindromo 109   == False&lt;br /&gt;
-- + (prodInvPalindromo n) se verifica si n por su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--      prodInvPalindromo 2021 == True&lt;br /&gt;
--      prodInvPalindromo 1097 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
masInvPalindromo n = palindromo (n + inverso n)&lt;br /&gt;
&lt;br /&gt;
inverso n = read (reverse (show n)) :: Integer&lt;br /&gt;
palindromo n = n == inverso n&lt;br /&gt;
&lt;br /&gt;
prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
prodInvPalindromo n = palindromo (n * inverso n)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2.. Comprobar con QuickCheck que todo número&lt;br /&gt;
-- prodInvPalindromo es masInvPalindromo.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
propInvPalindromo n = not (prodInvPalindromo (abs n)) || masInvPalindromo (abs n)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck propInvPalindromo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Comprobar que el número 2021 es el menor  número&lt;br /&gt;
-- natural que verifica las siguientes propiedades:&lt;br /&gt;
--  (+) es la concatenación de dos enteros consecutivos (20 y 21)&lt;br /&gt;
--  (+) es el producto de dos primos consecutivos (43 y 47)&lt;br /&gt;
--&lt;br /&gt;
-- Para ello, definir las funciones&lt;br /&gt;
--    esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    especiales :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esConcatConsecutivos n) se verifica si n es la concatenación de&lt;br /&gt;
--   dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--      esConcatConsecutivos 2021 == True&lt;br /&gt;
-- + (esProdprimosConsecutivos n) se verifica si n es el producto de dos&lt;br /&gt;
--   primos consecutivos&lt;br /&gt;
--      esProdprimosConsecutivos 2021 == True&lt;br /&gt;
-- + espaciales es la lista de números naturales que verifican las dos&lt;br /&gt;
--   propiedaes anteriores&lt;br /&gt;
--      head especiales == 2021&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
-- esConcatConsecutivos&lt;br /&gt;
-- ====================&lt;br /&gt;
&lt;br /&gt;
esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esConcatConsecutivos n = elem n (takeWhile (&amp;lt;=n) concatEnterosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
concatEnterosConsecutivos = map f (listaDeLongitud 2 [0..])&lt;br /&gt;
                          where f [a,b] = read (show a ++ show b) :: Integer&lt;br /&gt;
&lt;br /&gt;
-- esProdprimosConsecutivos&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esProdprimosConsecutivos n = elem n (takeWhile (&amp;lt;=n) prodprimosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
prodprimosConsecutivos = map f (listaDeLongitud 2 primes)&lt;br /&gt;
                       where f [a,b] = a*b&lt;br /&gt;
&lt;br /&gt;
-- especiales&lt;br /&gt;
-- ==========&lt;br /&gt;
&lt;br /&gt;
especiales :: [Integer]&lt;br /&gt;
especiales = [n | n &amp;lt;- prodprimosConsecutivos, esConcatConsecutivos n]&lt;br /&gt;
&lt;br /&gt;
-- Primer número especial:&lt;br /&gt;
-- head especiales&lt;br /&gt;
-- 2021&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=526</id>
		<title>Relación 10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=526"/>
		<updated>2021-12-10T09:50:06Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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: Relación 10&lt;br /&gt;
-- Propiedades del número 2021.&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 sobre propiedades del número&lt;br /&gt;
-- 2021.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Data.List&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Consideramos todos los primos menores que 100:&lt;br /&gt;
--    2, 3, 5, 7, 11, ..., 89, 97&lt;br /&gt;
-- y formamos los correspondientes pares de dominó:&lt;br /&gt;
--    (2,3), (3,5), (5,7), ..., (83,89), (89,97).&lt;br /&gt;
-- La suma de los números en todos los pares es 2021.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDominoPrimos n) es la suma de los números de los pares&lt;br /&gt;
-- de dominó formada a partir de los primos menores que n. Por ejemplo,&lt;br /&gt;
--    sumaDominoPrimos 100 == 2021&lt;br /&gt;
--    sumaDominoPrimos 200 == 8253&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos n = sum $ map f (zip (primosHasta n) (tail (primosHasta n)))&lt;br /&gt;
                   where f (a,b) = a+b&lt;br /&gt;
                         &lt;br /&gt;
primosHasta n = takeWhile (&amp;lt;n) primes &lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
listaPrimosN :: Integer -&amp;gt; [Integer] -- Para obtener la lista de los números primos menores que n.&lt;br /&gt;
listaPrimosN n = [p | p &amp;lt;- (take (fromInteger n :: Int) (primes)), p &amp;lt; n]&lt;br /&gt;
&lt;br /&gt;
sumaDominoPrimos1 :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos1 n =  sum [a+b | (a,b) &amp;lt;- (zip (listaPrimosN n) (tail (listaPrimosN n)))]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la constante&lt;br /&gt;
--   sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
-- tal que sucSumaDominoPrimos es la sucesión de los números que son&lt;br /&gt;
-- suma de pares de dominó formado con números primos. Por ejemplo,&lt;br /&gt;
--   λ&amp;gt; take 25 sucSumaDominoPrimos&lt;br /&gt;
--   [5,13,25,43,67,97,133,175,227,287,355,433,517,607,707,819,939,1067,&lt;br /&gt;
--    1205,1349,1501,1663,1835,2021,2219]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos = [sumaDominoPrimos n | n &amp;lt;- [4..], isPrime n]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sucSumaDominoPrimos1 :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos1 = [sumaDominoPrimos1 x| x &amp;lt;- drop 2 primes]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la sucesión&lt;br /&gt;
--   esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumaDominoPrimos n) se verifica si n es un número de la&lt;br /&gt;
-- sucesión anterior. Por ejemplo,&lt;br /&gt;
--  esSumaDominoPrimos 2021    == True&lt;br /&gt;
--  esSumaDominoPrimos 1234509 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos n = elem n (takeWhile (&amp;lt;=n) sucSumaDominoPrimos)&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esSumaDominoPrimos1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos1 n = head (dropWhile (&amp;lt;n) sucSumaDominoPrimos1) == n&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. El número 2021 es la suma de 33 más la suma de los 33&lt;br /&gt;
-- primeros números primos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumSumaPrimos n) es la suma de n más los n primeros números&lt;br /&gt;
-- primos. Por ejemplo,&lt;br /&gt;
--   sumSumaPrimos 33 == 2021&lt;br /&gt;
--   sumSumaPrimos 52 == 5641&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n =  fromIntegral (n + sum (take n primes))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir la función&lt;br /&gt;
--    esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumSumaPrimos n) se verifica si n es de la suma de m más&lt;br /&gt;
-- los m primeros primos, para algún entero m. Por ejemplo,&lt;br /&gt;
--    esSumSumaPrimos 2021       == True&lt;br /&gt;
--    esSumSumaPrimos 120        == False&lt;br /&gt;
--    esSumSumaPrimos 1234567893 == False&lt;br /&gt;
--    esSumSumaPrimos 774511387  == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos) &lt;br /&gt;
&lt;br /&gt;
sucSumSumaPrimos = map sumSumaPrimos [1..]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Un número semiprimo es un número natural que es producto&lt;br /&gt;
-- de dos números primos no necesariamente distintos. Por ejemplo, 26 es&lt;br /&gt;
-- semiprimo (porque 26 = 2×13) y 49 también lo es (porque 49 = 7×7).&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    semiprimos  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esSemiprimo n) se verifica si n es semiprimo. Por ejemplo,&lt;br /&gt;
--      esSemiprimo 26          ==  True&lt;br /&gt;
--      esSemiprimo 49          ==  True&lt;br /&gt;
--      esSemiprimo 8           ==  False&lt;br /&gt;
--      esSemiprimo 2021        ==  True&lt;br /&gt;
--      esSemiprimo (21+10^14)  ==  True&lt;br /&gt;
-- + semiprimos es la sucesión de números semiprimos. Por ejemplo,&lt;br /&gt;
--      take 10 semiprimos   ==  [4,6,9,10,14,15,21,22,25,26]&lt;br /&gt;
--      semiprimos !! 580    ==  2021&lt;br /&gt;
--      semiprimos !! 10000  ==  40886&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo n = or [a*b == n | a &amp;lt;- primeFactors n, b &amp;lt;- primeFactors n]&lt;br /&gt;
&lt;br /&gt;
semiprimos :: [Integer]&lt;br /&gt;
semiprimos = filter esSemiprimo [4..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un número natural n es un número entero Blum si&lt;br /&gt;
-- n = p × q es un semiprimo para el que p y q son distintos primos&lt;br /&gt;
-- congruentes con 3 módulo 4. Es decir, p y q tienen que ser de la&lt;br /&gt;
-- forma 4 t + 3, para algún número entero t. Los números enteros de&lt;br /&gt;
-- esta forma se denominan números primos de Blum.  Los primeros enteros&lt;br /&gt;
-- de Blum son&lt;br /&gt;
--    21, 33, 57, 69, 77, 93, 129, 133, 141, 161, 177, ...&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBlum  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBlum n) se verifica si n es un número de Blum. Por ejemplo,&lt;br /&gt;
--      esBlum 26          ==  False&lt;br /&gt;
--      esBlum 49          ==  False&lt;br /&gt;
--      esBlum 77          ==  True&lt;br /&gt;
--      esBlum 2021        ==  True&lt;br /&gt;
--      esBlum (21+10^14)  ==  True&lt;br /&gt;
-- + sucBlum es la sucesión de números de Blum. Por ejemplo,&lt;br /&gt;
--      take 10 sucBlum  ==  [21,33,57,69,77,93,129,133,141,161]&lt;br /&gt;
--      sucBlum !! 132    ==  2021&lt;br /&gt;
--      sucBlum !! 10000  ==  186821&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
esBlum n = and [esSemiprimo n, p /= q, rem p 4 == 3, rem q 4 == 3]&lt;br /&gt;
         where p = head (primeFactors n) &lt;br /&gt;
               q = last (primeFactors n)&lt;br /&gt;
              &lt;br /&gt;
sucBlum :: [Integer]&lt;br /&gt;
sucBlum = filter esBlum semiprimos&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Un número semiprimo n = p x q es brillante si p y q&lt;br /&gt;
-- tienen el mismo número de dígitos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBrillantes  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBrillante n) se verifica si n es brillante. Por ejemplo,&lt;br /&gt;
--      esBrillante 26          ==  False&lt;br /&gt;
--      esBrillante 49          ==  True&lt;br /&gt;
--      esBrillante 77          ==  False&lt;br /&gt;
--      esBrillante 2021        ==  True&lt;br /&gt;
--      esBrillante (21+10^14)  ==  False&lt;br /&gt;
-- + sucBrillantes es la sucesión de números brillantes. Por ejemplo,&lt;br /&gt;
--      take 10 sucBrillante   ==  [4,6,9,10,14,15,21,25,35,49]&lt;br /&gt;
--      sucBrillante !! 130    ==  2021&lt;br /&gt;
--      sucBrillante !! 10000  ==  696649&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
esBrillante n = esSemiprimo n &amp;amp;&amp;amp; length (show p) == length (show q)&lt;br /&gt;
              where p = head (primeFactors n)&lt;br /&gt;
                    q = last (primeFactors n)&lt;br /&gt;
                      &lt;br /&gt;
sucBrillante :: [Integer]&lt;br /&gt;
sucBrillante = filter esBrillante [4..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Un número natural es amable si se puede expresar como&lt;br /&gt;
-- suma de, al menos, dos números naturales consecutivos. Por ejemplo,&lt;br /&gt;
-- 2021 es amable pues&lt;br /&gt;
--    2021 = 20 + 21 + ... + 65 + 66.&lt;br /&gt;
-- La mayoría de los números naturales son amables, por lo que vamos a&lt;br /&gt;
-- calcular la lista de los números no amables.&lt;br /&gt;
--&lt;br /&gt;
-- Los primeros números no amables son&lt;br /&gt;
--    1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,&lt;br /&gt;
--    16384, 32768, 65536, 131072, 262144&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sucesionesConSuma :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sucesionesConSuma n) es la lista de los pares formados por&lt;br /&gt;
-- el primero y por el último elemento de las sucesiones de números&lt;br /&gt;
-- naturales consecutivos con suma n. Por ejemplo,&lt;br /&gt;
--    sucesionesConSuma 15             == [(1,5),(4,6),(7,8)]&lt;br /&gt;
--    sucesionesConSuma 2021           == [(20,66),(26,68),(1010,1011)]&lt;br /&gt;
--    length (sucesionesConSuma 2021)  == 3&lt;br /&gt;
--    length (sucesionesConSuma 3000)  == 7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucesionesConSuma :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma n = [(a,b) | a &amp;lt;- [1..div n 2], b &amp;lt;- [a..n-a], (a+b)*(fromIntegral $ length [a..b]) == 2*n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir las funciones&lt;br /&gt;
--    noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucNoAmables :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (noAmable n) se verifica si n es un número no amable. Por ejemplo,&lt;br /&gt;
--    noAmable 2021 == False&lt;br /&gt;
--    noAmable 1024 == True&lt;br /&gt;
-- + sucNoAmables es la lista de números naturales no amables. Por&lt;br /&gt;
--   ejemplo,&lt;br /&gt;
--    take 10 sucNoAmables == [1,2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
noAmable n = null (sucesionesConSuma n)&lt;br /&gt;
&lt;br /&gt;
sucNoAmables :: [Integer]&lt;br /&gt;
sucNoAmables = filter noAmable [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que un número natural es no&lt;br /&gt;
-- amable si y sólo si es potencia de 2.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propNoAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable n = noAmable (abs n+1) == esPotenciaDeDos (abs n+1)&lt;br /&gt;
&lt;br /&gt;
esPotenciaDeDos n = elem n [2^i | i &amp;lt;- [0..20]]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Un número natural se denomina aritmético si la media&lt;br /&gt;
-- aritmética de sus divisores es un número entero.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esAritmetico n) se verifica si n es un número aritmético.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    esAritmetico 2021 == True&lt;br /&gt;
--    esAritmetico 24   == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico n = rem (sum (divisores n)) (fromIntegral $ (length (divisores n))) == 0&lt;br /&gt;
&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..div n 2], rem n x == 0] ++ [n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que todos los primos excepto&lt;br /&gt;
-- el 2 son aritméticos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primosAritmeticos :: Int -&amp;gt; Bool&lt;br /&gt;
primosAritmeticos n = all esAritmetico (take n (tail primes))&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck primosAritmeticos&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Definir la función&lt;br /&gt;
--    sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (sucAritmeticosConsecutivos n) es una sucesión de n números&lt;br /&gt;
-- aritméticos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 5&lt;br /&gt;
--    [19,20,21,22,23]&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 20&lt;br /&gt;
--    [4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,&lt;br /&gt;
--     4968,4969,4970,4971,4972,4973,4974]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
sucAritmeticosConsecutivos n = head (filter consecutivos (listaDeLongitud n sucAritmeticos))&lt;br /&gt;
&lt;br /&gt;
sucAritmeticos = filter esAritmetico [1..]&lt;br /&gt;
consecutivos xs = xs == [minimum xs..maximum xs]&lt;br /&gt;
listaDeLongitud n xs = map (take n) (tails xs)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. El número 2021 tiene las propiedades siguientes:&lt;br /&gt;
-- + sumándole su inverso es un número palíndromo: 2021 + 1202 = 3223&lt;br /&gt;
-- + multiplicándolo por su inverso también lo es: 2021 * 1202 = 2429242&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (masInvPalindromo n) se verifica si n más su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--     masInvPalindromo 2021  == True&lt;br /&gt;
--      masInvPalindromo 109   == False&lt;br /&gt;
-- + (prodInvPalindromo n) se verifica si n por su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--      prodInvPalindromo 2021 == True&lt;br /&gt;
--      prodInvPalindromo 1097 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
masInvPalindromo n = palindromo (n + inverso n)&lt;br /&gt;
&lt;br /&gt;
inverso n = read (reverse (show n)) :: Integer&lt;br /&gt;
palindromo n = n == inverso n&lt;br /&gt;
&lt;br /&gt;
prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
prodInvPalindromo n = palindromo (n * inverso n)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2.. Comprobar con QuickCheck que todo número&lt;br /&gt;
-- prodInvPalindromo es masInvPalindromo.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
propInvPalindromo n = not (prodInvPalindromo (abs n)) || masInvPalindromo (abs n)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck propInvPalindromo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Comprobar que el número 2021 es el menor  número&lt;br /&gt;
-- natural que verifica las siguientes propiedades:&lt;br /&gt;
--  (+) es la concatenación de dos enteros consecutivos (20 y 21)&lt;br /&gt;
--  (+) es el producto de dos primos consecutivos (43 y 47)&lt;br /&gt;
--&lt;br /&gt;
-- Para ello, definir las funciones&lt;br /&gt;
--    esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    especiales :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esConcatConsecutivos n) se verifica si n es la concatenación de&lt;br /&gt;
--   dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--      esConcatConsecutivos 2021 == True&lt;br /&gt;
-- + (esProdprimosConsecutivos n) se verifica si n es el producto de dos&lt;br /&gt;
--   primos consecutivos&lt;br /&gt;
--      esProdprimosConsecutivos 2021 == True&lt;br /&gt;
-- + espaciales es la lista de números naturales que verifican las dos&lt;br /&gt;
--   propiedaes anteriores&lt;br /&gt;
--      head especiales == 2021&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
-- esConcatConsecutivos&lt;br /&gt;
-- ====================&lt;br /&gt;
&lt;br /&gt;
esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esConcatConsecutivos n = elem n (takeWhile (&amp;lt;=n) concatEnterosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
concatEnterosConsecutivos = map f (listaDeLongitud 2 [0..])&lt;br /&gt;
                          where f [a,b] = read (show a ++ show b) :: Integer&lt;br /&gt;
&lt;br /&gt;
-- esProdprimosConsecutivos&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esProdprimosConsecutivos n = elem n (takeWhile (&amp;lt;=n) prodprimosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
prodprimosConsecutivos = map f (listaDeLongitud 2 primes)&lt;br /&gt;
                       where f [a,b] = a*b&lt;br /&gt;
&lt;br /&gt;
-- especiales&lt;br /&gt;
-- ==========&lt;br /&gt;
&lt;br /&gt;
especiales :: [Integer]&lt;br /&gt;
especiales = [n | n &amp;lt;- prodprimosConsecutivos, esConcatConsecutivos n]&lt;br /&gt;
&lt;br /&gt;
-- Primer número especial:&lt;br /&gt;
-- head especiales&lt;br /&gt;
-- 2021&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=525</id>
		<title>Relación 10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=525"/>
		<updated>2021-12-10T09:43:24Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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: Relación 10&lt;br /&gt;
-- Propiedades del número 2021.&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 sobre propiedades del número&lt;br /&gt;
-- 2021.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Data.List&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Consideramos todos los primos menores que 100:&lt;br /&gt;
--    2, 3, 5, 7, 11, ..., 89, 97&lt;br /&gt;
-- y formamos los correspondientes pares de dominó:&lt;br /&gt;
--    (2,3), (3,5), (5,7), ..., (83,89), (89,97).&lt;br /&gt;
-- La suma de los números en todos los pares es 2021.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDominoPrimos n) es la suma de los números de los pares&lt;br /&gt;
-- de dominó formada a partir de los primos menores que n. Por ejemplo,&lt;br /&gt;
--    sumaDominoPrimos 100 == 2021&lt;br /&gt;
--    sumaDominoPrimos 200 == 8253&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos n = sum $ map f (zip (primosHasta n) (tail (primosHasta n)))&lt;br /&gt;
                   where f (a,b) = a+b&lt;br /&gt;
                         &lt;br /&gt;
primosHasta n = takeWhile (&amp;lt;n) primes &lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
listaPrimosN :: Integer -&amp;gt; [Integer] -- Para obtener la lista de los números primos menores que n.&lt;br /&gt;
listaPrimosN n = [p | p &amp;lt;- (take (fromInteger n :: Int) (primes)), p &amp;lt; n]&lt;br /&gt;
&lt;br /&gt;
sumaDominoPrimos1 :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos1 n =  sum [a+b | (a,b) &amp;lt;- (zip (listaPrimosN n) (tail (listaPrimosN n)))]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la constante&lt;br /&gt;
--   sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
-- tal que sucSumaDominoPrimos es la sucesión de los números que son&lt;br /&gt;
-- suma de pares de dominó formado con números primos. Por ejemplo,&lt;br /&gt;
--   λ&amp;gt; take 25 sucSumaDominoPrimos&lt;br /&gt;
--   [5,13,25,43,67,97,133,175,227,287,355,433,517,607,707,819,939,1067,&lt;br /&gt;
--    1205,1349,1501,1663,1835,2021,2219]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos = [sumaDominoPrimos n | n &amp;lt;- [4..], isPrime n]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
sucSumaDominoPrimos1 :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos1 = [sumaDominoPrimos1 x| x &amp;lt;- drop 2 primes]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la sucesión&lt;br /&gt;
--   esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumaDominoPrimos n) se verifica si n es un número de la&lt;br /&gt;
-- sucesión anterior. Por ejemplo,&lt;br /&gt;
--  esSumaDominoPrimos 2021    == True&lt;br /&gt;
--  esSumaDominoPrimos 1234509 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos n = elem n (takeWhile (&amp;lt;=n) sucSumaDominoPrimos)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. El número 2021 es la suma de 33 más la suma de los 33&lt;br /&gt;
-- primeros números primos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumSumaPrimos n) es la suma de n más los n primeros números&lt;br /&gt;
-- primos. Por ejemplo,&lt;br /&gt;
--   sumSumaPrimos 33 == 2021&lt;br /&gt;
--   sumSumaPrimos 52 == 5641&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n =  fromIntegral (n + sum (take n primes))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir la función&lt;br /&gt;
--    esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumSumaPrimos n) se verifica si n es de la suma de m más&lt;br /&gt;
-- los m primeros primos, para algún entero m. Por ejemplo,&lt;br /&gt;
--    esSumSumaPrimos 2021       == True&lt;br /&gt;
--    esSumSumaPrimos 120        == False&lt;br /&gt;
--    esSumSumaPrimos 1234567893 == False&lt;br /&gt;
--    esSumSumaPrimos 774511387  == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos) &lt;br /&gt;
&lt;br /&gt;
sucSumSumaPrimos = map sumSumaPrimos [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Un número semiprimo es un número natural que es producto&lt;br /&gt;
-- de dos números primos no necesariamente distintos. Por ejemplo, 26 es&lt;br /&gt;
-- semiprimo (porque 26 = 2×13) y 49 también lo es (porque 49 = 7×7).&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    semiprimos  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esSemiprimo n) se verifica si n es semiprimo. Por ejemplo,&lt;br /&gt;
--      esSemiprimo 26          ==  True&lt;br /&gt;
--      esSemiprimo 49          ==  True&lt;br /&gt;
--      esSemiprimo 8           ==  False&lt;br /&gt;
--      esSemiprimo 2021        ==  True&lt;br /&gt;
--      esSemiprimo (21+10^14)  ==  True&lt;br /&gt;
-- + semiprimos es la sucesión de números semiprimos. Por ejemplo,&lt;br /&gt;
--      take 10 semiprimos   ==  [4,6,9,10,14,15,21,22,25,26]&lt;br /&gt;
--      semiprimos !! 580    ==  2021&lt;br /&gt;
--      semiprimos !! 10000  ==  40886&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo n = or [a*b == n | a &amp;lt;- primeFactors n, b &amp;lt;- primeFactors n]&lt;br /&gt;
&lt;br /&gt;
semiprimos :: [Integer]&lt;br /&gt;
semiprimos = filter esSemiprimo [4..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un número natural n es un número entero Blum si&lt;br /&gt;
-- n = p × q es un semiprimo para el que p y q son distintos primos&lt;br /&gt;
-- congruentes con 3 módulo 4. Es decir, p y q tienen que ser de la&lt;br /&gt;
-- forma 4 t + 3, para algún número entero t. Los números enteros de&lt;br /&gt;
-- esta forma se denominan números primos de Blum.  Los primeros enteros&lt;br /&gt;
-- de Blum son&lt;br /&gt;
--    21, 33, 57, 69, 77, 93, 129, 133, 141, 161, 177, ...&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBlum  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBlum n) se verifica si n es un número de Blum. Por ejemplo,&lt;br /&gt;
--      esBlum 26          ==  False&lt;br /&gt;
--      esBlum 49          ==  False&lt;br /&gt;
--      esBlum 77          ==  True&lt;br /&gt;
--      esBlum 2021        ==  True&lt;br /&gt;
--      esBlum (21+10^14)  ==  True&lt;br /&gt;
-- + sucBlum es la sucesión de números de Blum. Por ejemplo,&lt;br /&gt;
--      take 10 sucBlum  ==  [21,33,57,69,77,93,129,133,141,161]&lt;br /&gt;
--      sucBlum !! 132    ==  2021&lt;br /&gt;
--      sucBlum !! 10000  ==  186821&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
esBlum n = and [esSemiprimo n, p /= q, rem p 4 == 3, rem q 4 == 3]&lt;br /&gt;
         where p = head (primeFactors n) &lt;br /&gt;
               q = last (primeFactors n)&lt;br /&gt;
              &lt;br /&gt;
sucBlum :: [Integer]&lt;br /&gt;
sucBlum = filter esBlum semiprimos&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Un número semiprimo n = p x q es brillante si p y q&lt;br /&gt;
-- tienen el mismo número de dígitos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBrillantes  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBrillante n) se verifica si n es brillante. Por ejemplo,&lt;br /&gt;
--      esBrillante 26          ==  False&lt;br /&gt;
--      esBrillante 49          ==  True&lt;br /&gt;
--      esBrillante 77          ==  False&lt;br /&gt;
--      esBrillante 2021        ==  True&lt;br /&gt;
--      esBrillante (21+10^14)  ==  False&lt;br /&gt;
-- + sucBrillantes es la sucesión de números brillantes. Por ejemplo,&lt;br /&gt;
--      take 10 sucBrillante   ==  [4,6,9,10,14,15,21,25,35,49]&lt;br /&gt;
--      sucBrillante !! 130    ==  2021&lt;br /&gt;
--      sucBrillante !! 10000  ==  696649&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
esBrillante n = esSemiprimo n &amp;amp;&amp;amp; length (show p) == length (show q)&lt;br /&gt;
              where p = head (primeFactors n)&lt;br /&gt;
                    q = last (primeFactors n)&lt;br /&gt;
                      &lt;br /&gt;
sucBrillante :: [Integer]&lt;br /&gt;
sucBrillante = filter esBrillante [4..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Un número natural es amable si se puede expresar como&lt;br /&gt;
-- suma de, al menos, dos números naturales consecutivos. Por ejemplo,&lt;br /&gt;
-- 2021 es amable pues&lt;br /&gt;
--    2021 = 20 + 21 + ... + 65 + 66.&lt;br /&gt;
-- La mayoría de los números naturales son amables, por lo que vamos a&lt;br /&gt;
-- calcular la lista de los números no amables.&lt;br /&gt;
--&lt;br /&gt;
-- Los primeros números no amables son&lt;br /&gt;
--    1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,&lt;br /&gt;
--    16384, 32768, 65536, 131072, 262144&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sucesionesConSuma :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sucesionesConSuma n) es la lista de los pares formados por&lt;br /&gt;
-- el primero y por el último elemento de las sucesiones de números&lt;br /&gt;
-- naturales consecutivos con suma n. Por ejemplo,&lt;br /&gt;
--    sucesionesConSuma 15             == [(1,5),(4,6),(7,8)]&lt;br /&gt;
--    sucesionesConSuma 2021           == [(20,66),(26,68),(1010,1011)]&lt;br /&gt;
--    length (sucesionesConSuma 2021)  == 3&lt;br /&gt;
--    length (sucesionesConSuma 3000)  == 7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucesionesConSuma :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma n = [(a,b) | a &amp;lt;- [1..div n 2], b &amp;lt;- [a..n-a], (a+b)*(fromIntegral $ length [a..b]) == 2*n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir las funciones&lt;br /&gt;
--    noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucNoAmables :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (noAmable n) se verifica si n es un número no amable. Por ejemplo,&lt;br /&gt;
--    noAmable 2021 == False&lt;br /&gt;
--    noAmable 1024 == True&lt;br /&gt;
-- + sucNoAmables es la lista de números naturales no amables. Por&lt;br /&gt;
--   ejemplo,&lt;br /&gt;
--    take 10 sucNoAmables == [1,2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
noAmable n = null (sucesionesConSuma n)&lt;br /&gt;
&lt;br /&gt;
sucNoAmables :: [Integer]&lt;br /&gt;
sucNoAmables = filter noAmable [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que un número natural es no&lt;br /&gt;
-- amable si y sólo si es potencia de 2.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propNoAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable n = noAmable (abs n+1) == esPotenciaDeDos (abs n+1)&lt;br /&gt;
&lt;br /&gt;
esPotenciaDeDos n = elem n [2^i | i &amp;lt;- [0..20]]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Un número natural se denomina aritmético si la media&lt;br /&gt;
-- aritmética de sus divisores es un número entero.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esAritmetico n) se verifica si n es un número aritmético.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    esAritmetico 2021 == True&lt;br /&gt;
--    esAritmetico 24   == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico n = rem (sum (divisores n)) (fromIntegral $ (length (divisores n))) == 0&lt;br /&gt;
&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..div n 2], rem n x == 0] ++ [n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que todos los primos excepto&lt;br /&gt;
-- el 2 son aritméticos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primosAritmeticos :: Int -&amp;gt; Bool&lt;br /&gt;
primosAritmeticos n = all esAritmetico (take n (tail primes))&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck primosAritmeticos&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Definir la función&lt;br /&gt;
--    sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (sucAritmeticosConsecutivos n) es una sucesión de n números&lt;br /&gt;
-- aritméticos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 5&lt;br /&gt;
--    [19,20,21,22,23]&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 20&lt;br /&gt;
--    [4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,&lt;br /&gt;
--     4968,4969,4970,4971,4972,4973,4974]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
sucAritmeticosConsecutivos n = head (filter consecutivos (listaDeLongitud n sucAritmeticos))&lt;br /&gt;
&lt;br /&gt;
sucAritmeticos = filter esAritmetico [1..]&lt;br /&gt;
consecutivos xs = xs == [minimum xs..maximum xs]&lt;br /&gt;
listaDeLongitud n xs = map (take n) (tails xs)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. El número 2021 tiene las propiedades siguientes:&lt;br /&gt;
-- + sumándole su inverso es un número palíndromo: 2021 + 1202 = 3223&lt;br /&gt;
-- + multiplicándolo por su inverso también lo es: 2021 * 1202 = 2429242&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (masInvPalindromo n) se verifica si n más su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--     masInvPalindromo 2021  == True&lt;br /&gt;
--      masInvPalindromo 109   == False&lt;br /&gt;
-- + (prodInvPalindromo n) se verifica si n por su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--      prodInvPalindromo 2021 == True&lt;br /&gt;
--      prodInvPalindromo 1097 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
masInvPalindromo n = palindromo (n + inverso n)&lt;br /&gt;
&lt;br /&gt;
inverso n = read (reverse (show n)) :: Integer&lt;br /&gt;
palindromo n = n == inverso n&lt;br /&gt;
&lt;br /&gt;
prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
prodInvPalindromo n = palindromo (n * inverso n)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2.. Comprobar con QuickCheck que todo número&lt;br /&gt;
-- prodInvPalindromo es masInvPalindromo.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
propInvPalindromo n = not (prodInvPalindromo (abs n)) || masInvPalindromo (abs n)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck propInvPalindromo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Comprobar que el número 2021 es el menor  número&lt;br /&gt;
-- natural que verifica las siguientes propiedades:&lt;br /&gt;
--  (+) es la concatenación de dos enteros consecutivos (20 y 21)&lt;br /&gt;
--  (+) es el producto de dos primos consecutivos (43 y 47)&lt;br /&gt;
--&lt;br /&gt;
-- Para ello, definir las funciones&lt;br /&gt;
--    esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    especiales :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esConcatConsecutivos n) se verifica si n es la concatenación de&lt;br /&gt;
--   dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--      esConcatConsecutivos 2021 == True&lt;br /&gt;
-- + (esProdprimosConsecutivos n) se verifica si n es el producto de dos&lt;br /&gt;
--   primos consecutivos&lt;br /&gt;
--      esProdprimosConsecutivos 2021 == True&lt;br /&gt;
-- + espaciales es la lista de números naturales que verifican las dos&lt;br /&gt;
--   propiedaes anteriores&lt;br /&gt;
--      head especiales == 2021&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
-- esConcatConsecutivos&lt;br /&gt;
-- ====================&lt;br /&gt;
&lt;br /&gt;
esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esConcatConsecutivos n = elem n (takeWhile (&amp;lt;=n) concatEnterosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
concatEnterosConsecutivos = map f (listaDeLongitud 2 [0..])&lt;br /&gt;
                          where f [a,b] = read (show a ++ show b) :: Integer&lt;br /&gt;
&lt;br /&gt;
-- esProdprimosConsecutivos&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esProdprimosConsecutivos n = elem n (takeWhile (&amp;lt;=n) prodprimosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
prodprimosConsecutivos = map f (listaDeLongitud 2 primes)&lt;br /&gt;
                       where f [a,b] = a*b&lt;br /&gt;
&lt;br /&gt;
-- especiales&lt;br /&gt;
-- ==========&lt;br /&gt;
&lt;br /&gt;
especiales :: [Integer]&lt;br /&gt;
especiales = [n | n &amp;lt;- prodprimosConsecutivos, esConcatConsecutivos n]&lt;br /&gt;
&lt;br /&gt;
-- Primer número especial:&lt;br /&gt;
-- head especiales&lt;br /&gt;
-- 2021&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=524</id>
		<title>Relación 10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=524"/>
		<updated>2021-12-10T08:48:15Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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: Relación 10&lt;br /&gt;
-- Propiedades del número 2021.&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 sobre propiedades del número&lt;br /&gt;
-- 2021.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Data.List&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Consideramos todos los primos menores que 100:&lt;br /&gt;
--    2, 3, 5, 7, 11, ..., 89, 97&lt;br /&gt;
-- y formamos los correspondientes pares de dominó:&lt;br /&gt;
--    (2,3), (3,5), (5,7), ..., (83,89), (89,97).&lt;br /&gt;
-- La suma de los números en todos los pares es 2021.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDominoPrimos n) es la suma de los números de los pares&lt;br /&gt;
-- de dominó formada a partir de los primos menores que n. Por ejemplo,&lt;br /&gt;
--    sumaDominoPrimos 100 == 2021&lt;br /&gt;
--    sumaDominoPrimos 200 == 8253&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos n = sum $ map f (zip (primosHasta n) (tail (primosHasta n)))&lt;br /&gt;
                   where f (a,b) = a+b&lt;br /&gt;
                         &lt;br /&gt;
primosHasta n = takeWhile (&amp;lt;n) primes &lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
listaPrimosN :: Integer -&amp;gt; [Integer] -- Para obtener la lista de los números primos menores que n.&lt;br /&gt;
listaPrimosN n = [p | p &amp;lt;- (take (fromInteger n :: Int) (primes)), p &amp;lt; n]&lt;br /&gt;
&lt;br /&gt;
sumaDominoPrimos1 :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos1 n =  sum [a+b | (a,b) &amp;lt;- (zip (listaPrimosN n) (tail (listaPrimosN n)))]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la constante&lt;br /&gt;
--   sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
-- tal que sucSumaDominoPrimos es la sucesión de los números que son&lt;br /&gt;
-- suma de pares de dominó formado con números primos. Por ejemplo,&lt;br /&gt;
--   λ&amp;gt; take 25 sucSumaDominoPrimos&lt;br /&gt;
--   [5,13,25,43,67,97,133,175,227,287,355,433,517,607,707,819,939,1067,&lt;br /&gt;
--    1205,1349,1501,1663,1835,2021,2219]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos = [sumaDominoPrimos n | n &amp;lt;- [4..], isPrime n]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la sucesión&lt;br /&gt;
--   esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumaDominoPrimos n) se verifica si n es un número de la&lt;br /&gt;
-- sucesión anterior. Por ejemplo,&lt;br /&gt;
--  esSumaDominoPrimos 2021    == True&lt;br /&gt;
--  esSumaDominoPrimos 1234509 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos n = elem n (takeWhile (&amp;lt;=n) sucSumaDominoPrimos)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. El número 2021 es la suma de 33 más la suma de los 33&lt;br /&gt;
-- primeros números primos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumSumaPrimos n) es la suma de n más los n primeros números&lt;br /&gt;
-- primos. Por ejemplo,&lt;br /&gt;
--   sumSumaPrimos 33 == 2021&lt;br /&gt;
--   sumSumaPrimos 52 == 5641&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n =  fromIntegral (n + sum (take n primes))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir la función&lt;br /&gt;
--    esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumSumaPrimos n) se verifica si n es de la suma de m más&lt;br /&gt;
-- los m primeros primos, para algún entero m. Por ejemplo,&lt;br /&gt;
--    esSumSumaPrimos 2021       == True&lt;br /&gt;
--    esSumSumaPrimos 120        == False&lt;br /&gt;
--    esSumSumaPrimos 1234567893 == False&lt;br /&gt;
--    esSumSumaPrimos 774511387  == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos) &lt;br /&gt;
&lt;br /&gt;
sucSumSumaPrimos = map sumSumaPrimos [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Un número semiprimo es un número natural que es producto&lt;br /&gt;
-- de dos números primos no necesariamente distintos. Por ejemplo, 26 es&lt;br /&gt;
-- semiprimo (porque 26 = 2×13) y 49 también lo es (porque 49 = 7×7).&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    semiprimos  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esSemiprimo n) se verifica si n es semiprimo. Por ejemplo,&lt;br /&gt;
--      esSemiprimo 26          ==  True&lt;br /&gt;
--      esSemiprimo 49          ==  True&lt;br /&gt;
--      esSemiprimo 8           ==  False&lt;br /&gt;
--      esSemiprimo 2021        ==  True&lt;br /&gt;
--      esSemiprimo (21+10^14)  ==  True&lt;br /&gt;
-- + semiprimos es la sucesión de números semiprimos. Por ejemplo,&lt;br /&gt;
--      take 10 semiprimos   ==  [4,6,9,10,14,15,21,22,25,26]&lt;br /&gt;
--      semiprimos !! 580    ==  2021&lt;br /&gt;
--      semiprimos !! 10000  ==  40886&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo n = or [a*b == n | a &amp;lt;- primeFactors n, b &amp;lt;- primeFactors n]&lt;br /&gt;
&lt;br /&gt;
semiprimos :: [Integer]&lt;br /&gt;
semiprimos = filter esSemiprimo [4..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un número natural n es un número entero Blum si&lt;br /&gt;
-- n = p × q es un semiprimo para el que p y q son distintos primos&lt;br /&gt;
-- congruentes con 3 módulo 4. Es decir, p y q tienen que ser de la&lt;br /&gt;
-- forma 4 t + 3, para algún número entero t. Los números enteros de&lt;br /&gt;
-- esta forma se denominan números primos de Blum.  Los primeros enteros&lt;br /&gt;
-- de Blum son&lt;br /&gt;
--    21, 33, 57, 69, 77, 93, 129, 133, 141, 161, 177, ...&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBlum  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBlum n) se verifica si n es un número de Blum. Por ejemplo,&lt;br /&gt;
--      esBlum 26          ==  False&lt;br /&gt;
--      esBlum 49          ==  False&lt;br /&gt;
--      esBlum 77          ==  True&lt;br /&gt;
--      esBlum 2021        ==  True&lt;br /&gt;
--      esBlum (21+10^14)  ==  True&lt;br /&gt;
-- + sucBlum es la sucesión de números de Blum. Por ejemplo,&lt;br /&gt;
--      take 10 sucBlum  ==  [21,33,57,69,77,93,129,133,141,161]&lt;br /&gt;
--      sucBlum !! 132    ==  2021&lt;br /&gt;
--      sucBlum !! 10000  ==  186821&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
esBlum n = and [esSemiprimo n, p /= q, rem p 4 == 3, rem q 4 == 3]&lt;br /&gt;
         where p = head (primeFactors n) &lt;br /&gt;
               q = last (primeFactors n)&lt;br /&gt;
              &lt;br /&gt;
sucBlum :: [Integer]&lt;br /&gt;
sucBlum = filter esBlum semiprimos&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Un número semiprimo n = p x q es brillante si p y q&lt;br /&gt;
-- tienen el mismo número de dígitos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBrillantes  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBrillante n) se verifica si n es brillante. Por ejemplo,&lt;br /&gt;
--      esBrillante 26          ==  False&lt;br /&gt;
--      esBrillante 49          ==  True&lt;br /&gt;
--      esBrillante 77          ==  False&lt;br /&gt;
--      esBrillante 2021        ==  True&lt;br /&gt;
--      esBrillante (21+10^14)  ==  False&lt;br /&gt;
-- + sucBrillantes es la sucesión de números brillantes. Por ejemplo,&lt;br /&gt;
--      take 10 sucBrillante   ==  [4,6,9,10,14,15,21,25,35,49]&lt;br /&gt;
--      sucBrillante !! 130    ==  2021&lt;br /&gt;
--      sucBrillante !! 10000  ==  696649&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
esBrillante n = esSemiprimo n &amp;amp;&amp;amp; length (show p) == length (show q)&lt;br /&gt;
              where p = head (primeFactors n)&lt;br /&gt;
                    q = last (primeFactors n)&lt;br /&gt;
                      &lt;br /&gt;
sucBrillante :: [Integer]&lt;br /&gt;
sucBrillante = filter esBrillante [4..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Un número natural es amable si se puede expresar como&lt;br /&gt;
-- suma de, al menos, dos números naturales consecutivos. Por ejemplo,&lt;br /&gt;
-- 2021 es amable pues&lt;br /&gt;
--    2021 = 20 + 21 + ... + 65 + 66.&lt;br /&gt;
-- La mayoría de los números naturales son amables, por lo que vamos a&lt;br /&gt;
-- calcular la lista de los números no amables.&lt;br /&gt;
--&lt;br /&gt;
-- Los primeros números no amables son&lt;br /&gt;
--    1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,&lt;br /&gt;
--    16384, 32768, 65536, 131072, 262144&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sucesionesConSuma :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sucesionesConSuma n) es la lista de los pares formados por&lt;br /&gt;
-- el primero y por el último elemento de las sucesiones de números&lt;br /&gt;
-- naturales consecutivos con suma n. Por ejemplo,&lt;br /&gt;
--    sucesionesConSuma 15             == [(1,5),(4,6),(7,8)]&lt;br /&gt;
--    sucesionesConSuma 2021           == [(20,66),(26,68),(1010,1011)]&lt;br /&gt;
--    length (sucesionesConSuma 2021)  == 3&lt;br /&gt;
--    length (sucesionesConSuma 3000)  == 7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucesionesConSuma :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma n = [(a,b) | a &amp;lt;- [1..div n 2], b &amp;lt;- [a..n-a], (a+b)*(fromIntegral $ length [a..b]) == 2*n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir las funciones&lt;br /&gt;
--    noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucNoAmables :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (noAmable n) se verifica si n es un número no amable. Por ejemplo,&lt;br /&gt;
--    noAmable 2021 == False&lt;br /&gt;
--    noAmable 1024 == True&lt;br /&gt;
-- + sucNoAmables es la lista de números naturales no amables. Por&lt;br /&gt;
--   ejemplo,&lt;br /&gt;
--    take 10 sucNoAmables == [1,2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
noAmable n = null (sucesionesConSuma n)&lt;br /&gt;
&lt;br /&gt;
sucNoAmables :: [Integer]&lt;br /&gt;
sucNoAmables = filter noAmable [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que un número natural es no&lt;br /&gt;
-- amable si y sólo si es potencia de 2.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propNoAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable n = noAmable (abs n+1) == esPotenciaDeDos (abs n+1)&lt;br /&gt;
&lt;br /&gt;
esPotenciaDeDos n = elem n [2^i | i &amp;lt;- [0..20]]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Un número natural se denomina aritmético si la media&lt;br /&gt;
-- aritmética de sus divisores es un número entero.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esAritmetico n) se verifica si n es un número aritmético.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    esAritmetico 2021 == True&lt;br /&gt;
--    esAritmetico 24   == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico n = rem (sum (divisores n)) (fromIntegral $ (length (divisores n))) == 0&lt;br /&gt;
&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..div n 2], rem n x == 0] ++ [n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que todos los primos excepto&lt;br /&gt;
-- el 2 son aritméticos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primosAritmeticos :: Int -&amp;gt; Bool&lt;br /&gt;
primosAritmeticos n = all esAritmetico (take n (tail primes))&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck primosAritmeticos&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Definir la función&lt;br /&gt;
--    sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (sucAritmeticosConsecutivos n) es una sucesión de n números&lt;br /&gt;
-- aritméticos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 5&lt;br /&gt;
--    [19,20,21,22,23]&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 20&lt;br /&gt;
--    [4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,&lt;br /&gt;
--     4968,4969,4970,4971,4972,4973,4974]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
sucAritmeticosConsecutivos n = head (filter consecutivos (listaDeLongitud n sucAritmeticos))&lt;br /&gt;
&lt;br /&gt;
sucAritmeticos = filter esAritmetico [1..]&lt;br /&gt;
consecutivos xs = xs == [minimum xs..maximum xs]&lt;br /&gt;
listaDeLongitud n xs = map (take n) (tails xs)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. El número 2021 tiene las propiedades siguientes:&lt;br /&gt;
-- + sumándole su inverso es un número palíndromo: 2021 + 1202 = 3223&lt;br /&gt;
-- + multiplicándolo por su inverso también lo es: 2021 * 1202 = 2429242&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (masInvPalindromo n) se verifica si n más su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--     masInvPalindromo 2021  == True&lt;br /&gt;
--      masInvPalindromo 109   == False&lt;br /&gt;
-- + (prodInvPalindromo n) se verifica si n por su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--      prodInvPalindromo 2021 == True&lt;br /&gt;
--      prodInvPalindromo 1097 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
masInvPalindromo n = palindromo (n + inverso n)&lt;br /&gt;
&lt;br /&gt;
inverso n = read (reverse (show n)) :: Integer&lt;br /&gt;
palindromo n = n == inverso n&lt;br /&gt;
&lt;br /&gt;
prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
prodInvPalindromo n = palindromo (n * inverso n)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2.. Comprobar con QuickCheck que todo número&lt;br /&gt;
-- prodInvPalindromo es masInvPalindromo.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
propInvPalindromo n = not (prodInvPalindromo (abs n)) || masInvPalindromo (abs n)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck propInvPalindromo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Comprobar que el número 2021 es el menor  número&lt;br /&gt;
-- natural que verifica las siguientes propiedades:&lt;br /&gt;
--  (+) es la concatenación de dos enteros consecutivos (20 y 21)&lt;br /&gt;
--  (+) es el producto de dos primos consecutivos (43 y 47)&lt;br /&gt;
--&lt;br /&gt;
-- Para ello, definir las funciones&lt;br /&gt;
--    esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    especiales :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esConcatConsecutivos n) se verifica si n es la concatenación de&lt;br /&gt;
--   dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--      esConcatConsecutivos 2021 == True&lt;br /&gt;
-- + (esProdprimosConsecutivos n) se verifica si n es el producto de dos&lt;br /&gt;
--   primos consecutivos&lt;br /&gt;
--      esProdprimosConsecutivos 2021 == True&lt;br /&gt;
-- + espaciales es la lista de números naturales que verifican las dos&lt;br /&gt;
--   propiedaes anteriores&lt;br /&gt;
--      head especiales == 2021&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
-- esConcatConsecutivos&lt;br /&gt;
-- ====================&lt;br /&gt;
&lt;br /&gt;
esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esConcatConsecutivos n = elem n (takeWhile (&amp;lt;=n) concatEnterosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
concatEnterosConsecutivos = map f (listaDeLongitud 2 [0..])&lt;br /&gt;
                          where f [a,b] = read (show a ++ show b) :: Integer&lt;br /&gt;
&lt;br /&gt;
-- esProdprimosConsecutivos&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esProdprimosConsecutivos n = elem n (takeWhile (&amp;lt;=n) prodprimosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
prodprimosConsecutivos = map f (listaDeLongitud 2 primes)&lt;br /&gt;
                       where f [a,b] = a*b&lt;br /&gt;
&lt;br /&gt;
-- especiales&lt;br /&gt;
-- ==========&lt;br /&gt;
&lt;br /&gt;
especiales :: [Integer]&lt;br /&gt;
especiales = [n | n &amp;lt;- prodprimosConsecutivos, esConcatConsecutivos n]&lt;br /&gt;
&lt;br /&gt;
-- Primer número especial:&lt;br /&gt;
-- head especiales&lt;br /&gt;
-- 2021&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=523</id>
		<title>Relación 10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10&amp;diff=523"/>
		<updated>2021-12-10T08:47:51Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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: Relación 10&lt;br /&gt;
-- Propiedades del número 2021.&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 sobre propiedades del número&lt;br /&gt;
-- 2021.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Data.List&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Consideramos todos los primos menores que 100:&lt;br /&gt;
--    2, 3, 5, 7, 11, ..., 89, 97&lt;br /&gt;
-- y formamos los correspondientes pares de dominó:&lt;br /&gt;
--    (2,3), (3,5), (5,7), ..., (83,89), (89,97).&lt;br /&gt;
-- La suma de los números en todos los pares es 2021.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDominoPrimos n) es la suma de los números de los pares&lt;br /&gt;
-- de dominó formada a partir de los primos menores que n. Por ejemplo,&lt;br /&gt;
--    sumaDominoPrimos 100 == 2021&lt;br /&gt;
--    sumaDominoPrimos 200 == 8253&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos n = sum $ map f (zip (primosHasta n) (tail (primosHasta n)))&lt;br /&gt;
                   where f (a,b) = a+b&lt;br /&gt;
                         &lt;br /&gt;
primosHasta n = takeWhile (&amp;lt;n) primes &lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
listaPrimosN :: Integer -&amp;gt; [Integer] -- Para obtener la lista de los números primos menores que n.&lt;br /&gt;
listaPrimosN n = [p | p &amp;lt;- (take (fromInteger n :: Int) (primes)), p &amp;lt; n]&lt;br /&gt;
&lt;br /&gt;
sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos n =  sum [a+b | (a,b) &amp;lt;- (zip (listaPrimosN n) (tail (listaPrimosN n)))]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la constante&lt;br /&gt;
--   sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
-- tal que sucSumaDominoPrimos es la sucesión de los números que son&lt;br /&gt;
-- suma de pares de dominó formado con números primos. Por ejemplo,&lt;br /&gt;
--   λ&amp;gt; take 25 sucSumaDominoPrimos&lt;br /&gt;
--   [5,13,25,43,67,97,133,175,227,287,355,433,517,607,707,819,939,1067,&lt;br /&gt;
--    1205,1349,1501,1663,1835,2021,2219]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos = [sumaDominoPrimos n | n &amp;lt;- [4..], isPrime n]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la sucesión&lt;br /&gt;
--   esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumaDominoPrimos n) se verifica si n es un número de la&lt;br /&gt;
-- sucesión anterior. Por ejemplo,&lt;br /&gt;
--  esSumaDominoPrimos 2021    == True&lt;br /&gt;
--  esSumaDominoPrimos 1234509 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos n = elem n (takeWhile (&amp;lt;=n) sucSumaDominoPrimos)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. El número 2021 es la suma de 33 más la suma de los 33&lt;br /&gt;
-- primeros números primos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumSumaPrimos n) es la suma de n más los n primeros números&lt;br /&gt;
-- primos. Por ejemplo,&lt;br /&gt;
--   sumSumaPrimos 33 == 2021&lt;br /&gt;
--   sumSumaPrimos 52 == 5641&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n =  fromIntegral (n + sum (take n primes))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir la función&lt;br /&gt;
--    esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumSumaPrimos n) se verifica si n es de la suma de m más&lt;br /&gt;
-- los m primeros primos, para algún entero m. Por ejemplo,&lt;br /&gt;
--    esSumSumaPrimos 2021       == True&lt;br /&gt;
--    esSumSumaPrimos 120        == False&lt;br /&gt;
--    esSumSumaPrimos 1234567893 == False&lt;br /&gt;
--    esSumSumaPrimos 774511387  == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos) &lt;br /&gt;
&lt;br /&gt;
sucSumSumaPrimos = map sumSumaPrimos [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Un número semiprimo es un número natural que es producto&lt;br /&gt;
-- de dos números primos no necesariamente distintos. Por ejemplo, 26 es&lt;br /&gt;
-- semiprimo (porque 26 = 2×13) y 49 también lo es (porque 49 = 7×7).&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    semiprimos  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esSemiprimo n) se verifica si n es semiprimo. Por ejemplo,&lt;br /&gt;
--      esSemiprimo 26          ==  True&lt;br /&gt;
--      esSemiprimo 49          ==  True&lt;br /&gt;
--      esSemiprimo 8           ==  False&lt;br /&gt;
--      esSemiprimo 2021        ==  True&lt;br /&gt;
--      esSemiprimo (21+10^14)  ==  True&lt;br /&gt;
-- + semiprimos es la sucesión de números semiprimos. Por ejemplo,&lt;br /&gt;
--      take 10 semiprimos   ==  [4,6,9,10,14,15,21,22,25,26]&lt;br /&gt;
--      semiprimos !! 580    ==  2021&lt;br /&gt;
--      semiprimos !! 10000  ==  40886&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo n = or [a*b == n | a &amp;lt;- primeFactors n, b &amp;lt;- primeFactors n]&lt;br /&gt;
&lt;br /&gt;
semiprimos :: [Integer]&lt;br /&gt;
semiprimos = filter esSemiprimo [4..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un número natural n es un número entero Blum si&lt;br /&gt;
-- n = p × q es un semiprimo para el que p y q son distintos primos&lt;br /&gt;
-- congruentes con 3 módulo 4. Es decir, p y q tienen que ser de la&lt;br /&gt;
-- forma 4 t + 3, para algún número entero t. Los números enteros de&lt;br /&gt;
-- esta forma se denominan números primos de Blum.  Los primeros enteros&lt;br /&gt;
-- de Blum son&lt;br /&gt;
--    21, 33, 57, 69, 77, 93, 129, 133, 141, 161, 177, ...&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBlum  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBlum n) se verifica si n es un número de Blum. Por ejemplo,&lt;br /&gt;
--      esBlum 26          ==  False&lt;br /&gt;
--      esBlum 49          ==  False&lt;br /&gt;
--      esBlum 77          ==  True&lt;br /&gt;
--      esBlum 2021        ==  True&lt;br /&gt;
--      esBlum (21+10^14)  ==  True&lt;br /&gt;
-- + sucBlum es la sucesión de números de Blum. Por ejemplo,&lt;br /&gt;
--      take 10 sucBlum  ==  [21,33,57,69,77,93,129,133,141,161]&lt;br /&gt;
--      sucBlum !! 132    ==  2021&lt;br /&gt;
--      sucBlum !! 10000  ==  186821&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
esBlum n = and [esSemiprimo n, p /= q, rem p 4 == 3, rem q 4 == 3]&lt;br /&gt;
         where p = head (primeFactors n) &lt;br /&gt;
               q = last (primeFactors n)&lt;br /&gt;
              &lt;br /&gt;
sucBlum :: [Integer]&lt;br /&gt;
sucBlum = filter esBlum semiprimos&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Un número semiprimo n = p x q es brillante si p y q&lt;br /&gt;
-- tienen el mismo número de dígitos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBrillantes  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBrillante n) se verifica si n es brillante. Por ejemplo,&lt;br /&gt;
--      esBrillante 26          ==  False&lt;br /&gt;
--      esBrillante 49          ==  True&lt;br /&gt;
--      esBrillante 77          ==  False&lt;br /&gt;
--      esBrillante 2021        ==  True&lt;br /&gt;
--      esBrillante (21+10^14)  ==  False&lt;br /&gt;
-- + sucBrillantes es la sucesión de números brillantes. Por ejemplo,&lt;br /&gt;
--      take 10 sucBrillante   ==  [4,6,9,10,14,15,21,25,35,49]&lt;br /&gt;
--      sucBrillante !! 130    ==  2021&lt;br /&gt;
--      sucBrillante !! 10000  ==  696649&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
esBrillante n = esSemiprimo n &amp;amp;&amp;amp; length (show p) == length (show q)&lt;br /&gt;
              where p = head (primeFactors n)&lt;br /&gt;
                    q = last (primeFactors n)&lt;br /&gt;
                      &lt;br /&gt;
sucBrillante :: [Integer]&lt;br /&gt;
sucBrillante = filter esBrillante [4..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Un número natural es amable si se puede expresar como&lt;br /&gt;
-- suma de, al menos, dos números naturales consecutivos. Por ejemplo,&lt;br /&gt;
-- 2021 es amable pues&lt;br /&gt;
--    2021 = 20 + 21 + ... + 65 + 66.&lt;br /&gt;
-- La mayoría de los números naturales son amables, por lo que vamos a&lt;br /&gt;
-- calcular la lista de los números no amables.&lt;br /&gt;
--&lt;br /&gt;
-- Los primeros números no amables son&lt;br /&gt;
--    1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,&lt;br /&gt;
--    16384, 32768, 65536, 131072, 262144&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sucesionesConSuma :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sucesionesConSuma n) es la lista de los pares formados por&lt;br /&gt;
-- el primero y por el último elemento de las sucesiones de números&lt;br /&gt;
-- naturales consecutivos con suma n. Por ejemplo,&lt;br /&gt;
--    sucesionesConSuma 15             == [(1,5),(4,6),(7,8)]&lt;br /&gt;
--    sucesionesConSuma 2021           == [(20,66),(26,68),(1010,1011)]&lt;br /&gt;
--    length (sucesionesConSuma 2021)  == 3&lt;br /&gt;
--    length (sucesionesConSuma 3000)  == 7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucesionesConSuma :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma n = [(a,b) | a &amp;lt;- [1..div n 2], b &amp;lt;- [a..n-a], (a+b)*(fromIntegral $ length [a..b]) == 2*n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir las funciones&lt;br /&gt;
--    noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucNoAmables :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (noAmable n) se verifica si n es un número no amable. Por ejemplo,&lt;br /&gt;
--    noAmable 2021 == False&lt;br /&gt;
--    noAmable 1024 == True&lt;br /&gt;
-- + sucNoAmables es la lista de números naturales no amables. Por&lt;br /&gt;
--   ejemplo,&lt;br /&gt;
--    take 10 sucNoAmables == [1,2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
noAmable n = null (sucesionesConSuma n)&lt;br /&gt;
&lt;br /&gt;
sucNoAmables :: [Integer]&lt;br /&gt;
sucNoAmables = filter noAmable [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que un número natural es no&lt;br /&gt;
-- amable si y sólo si es potencia de 2.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propNoAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable n = noAmable (abs n+1) == esPotenciaDeDos (abs n+1)&lt;br /&gt;
&lt;br /&gt;
esPotenciaDeDos n = elem n [2^i | i &amp;lt;- [0..20]]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Un número natural se denomina aritmético si la media&lt;br /&gt;
-- aritmética de sus divisores es un número entero.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esAritmetico n) se verifica si n es un número aritmético.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    esAritmetico 2021 == True&lt;br /&gt;
--    esAritmetico 24   == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico n = rem (sum (divisores n)) (fromIntegral $ (length (divisores n))) == 0&lt;br /&gt;
&lt;br /&gt;
divisores n = [x | x &amp;lt;- [1..div n 2], rem n x == 0] ++ [n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que todos los primos excepto&lt;br /&gt;
-- el 2 son aritméticos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primosAritmeticos :: Int -&amp;gt; Bool&lt;br /&gt;
primosAritmeticos n = all esAritmetico (take n (tail primes))&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck primosAritmeticos&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Definir la función&lt;br /&gt;
--    sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (sucAritmeticosConsecutivos n) es una sucesión de n números&lt;br /&gt;
-- aritméticos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 5&lt;br /&gt;
--    [19,20,21,22,23]&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 20&lt;br /&gt;
--    [4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,&lt;br /&gt;
--     4968,4969,4970,4971,4972,4973,4974]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
sucAritmeticosConsecutivos n = head (filter consecutivos (listaDeLongitud n sucAritmeticos))&lt;br /&gt;
&lt;br /&gt;
sucAritmeticos = filter esAritmetico [1..]&lt;br /&gt;
consecutivos xs = xs == [minimum xs..maximum xs]&lt;br /&gt;
listaDeLongitud n xs = map (take n) (tails xs)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. El número 2021 tiene las propiedades siguientes:&lt;br /&gt;
-- + sumándole su inverso es un número palíndromo: 2021 + 1202 = 3223&lt;br /&gt;
-- + multiplicándolo por su inverso también lo es: 2021 * 1202 = 2429242&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (masInvPalindromo n) se verifica si n más su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--     masInvPalindromo 2021  == True&lt;br /&gt;
--      masInvPalindromo 109   == False&lt;br /&gt;
-- + (prodInvPalindromo n) se verifica si n por su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--      prodInvPalindromo 2021 == True&lt;br /&gt;
--      prodInvPalindromo 1097 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
masInvPalindromo n = palindromo (n + inverso n)&lt;br /&gt;
&lt;br /&gt;
inverso n = read (reverse (show n)) :: Integer&lt;br /&gt;
palindromo n = n == inverso n&lt;br /&gt;
&lt;br /&gt;
prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
prodInvPalindromo n = palindromo (n * inverso n)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2.. Comprobar con QuickCheck que todo número&lt;br /&gt;
-- prodInvPalindromo es masInvPalindromo.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
propInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
propInvPalindromo n = not (prodInvPalindromo (abs n)) || masInvPalindromo (abs n)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck propInvPalindromo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Comprobar que el número 2021 es el menor  número&lt;br /&gt;
-- natural que verifica las siguientes propiedades:&lt;br /&gt;
--  (+) es la concatenación de dos enteros consecutivos (20 y 21)&lt;br /&gt;
--  (+) es el producto de dos primos consecutivos (43 y 47)&lt;br /&gt;
--&lt;br /&gt;
-- Para ello, definir las funciones&lt;br /&gt;
--    esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    especiales :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esConcatConsecutivos n) se verifica si n es la concatenación de&lt;br /&gt;
--   dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--      esConcatConsecutivos 2021 == True&lt;br /&gt;
-- + (esProdprimosConsecutivos n) se verifica si n es el producto de dos&lt;br /&gt;
--   primos consecutivos&lt;br /&gt;
--      esProdprimosConsecutivos 2021 == True&lt;br /&gt;
-- + espaciales es la lista de números naturales que verifican las dos&lt;br /&gt;
--   propiedaes anteriores&lt;br /&gt;
--      head especiales == 2021&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
-- esConcatConsecutivos&lt;br /&gt;
-- ====================&lt;br /&gt;
&lt;br /&gt;
esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esConcatConsecutivos n = elem n (takeWhile (&amp;lt;=n) concatEnterosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
concatEnterosConsecutivos = map f (listaDeLongitud 2 [0..])&lt;br /&gt;
                          where f [a,b] = read (show a ++ show b) :: Integer&lt;br /&gt;
&lt;br /&gt;
-- esProdprimosConsecutivos&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esProdprimosConsecutivos n = elem n (takeWhile (&amp;lt;=n) prodprimosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
prodprimosConsecutivos = map f (listaDeLongitud 2 primes)&lt;br /&gt;
                       where f [a,b] = a*b&lt;br /&gt;
&lt;br /&gt;
-- especiales&lt;br /&gt;
-- ==========&lt;br /&gt;
&lt;br /&gt;
especiales :: [Integer]&lt;br /&gt;
especiales = [n | n &amp;lt;- prodprimosConsecutivos, esConcatConsecutivos n]&lt;br /&gt;
&lt;br /&gt;
-- Primer número especial:&lt;br /&gt;
-- head especiales&lt;br /&gt;
-- 2021&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8&amp;diff=501</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8&amp;diff=501"/>
		<updated>2021-12-03T09:01:26Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_8.hs (24 de noviembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados.&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;
-- Esta relación tiene contiene ejercicios con funciones de orden&lt;br /&gt;
-- superior y definiciones por plegado correspondientes al tema 7 &lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-7.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&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;
--    segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos&lt;br /&gt;
-- elementos verifican la propiedad p. Por ejemplo,&lt;br /&gt;
--    segmentos even [1,2,0,4,9,6,4,5,7,2]  ==  [[2,0,4],[6,4],[2]]&lt;br /&gt;
--    segmentos odd  [1,2,0,4,9,6,4,5,7,2]  ==  [[1],[9],[5,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
segmentos1 :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos1 p [] = []&lt;br /&gt;
segmentos1 p (x:xs) | p x = [a] ++ segmentos1 p (dropWhile p (x:xs)) &lt;br /&gt;
                    | otherwise = segmentos1 p xs&lt;br /&gt;
                    where a = takeWhile p (x:xs) &lt;br /&gt;
segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos p [] = []&lt;br /&gt;
segmentos p (x:xs) &lt;br /&gt;
    | p x =  (takeWhile p (x:xs)) : segmentos p (dropWhile p (x:xs)) &lt;br /&gt;
    | otherwise = segmentos p (dropWhile (not.p) xs)&lt;br /&gt;
                 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir, por comprensión, la función&lt;br /&gt;
--    relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosC r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC r xs = and [r a b | (a,b) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
--José Manuel García&lt;br /&gt;
relacionadosC1 :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC1 r xs = (length [1 | (a,b) &amp;lt;- (zip xs (tail xs)), a `r` b]) ==&lt;br /&gt;
                     (length (zip xs (tail xs)))&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
relacionadosC&amp;#039; :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC&amp;#039; r xs = and [ r x y   | (x,y) &amp;lt;- agrupa1 xs]&lt;br /&gt;
agrupa1&amp;#039; xs = zip xs (tail xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir, por recursión, la función&lt;br /&gt;
--    relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosR r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Adolfo Sagrera Vivancos&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR r [] = True&lt;br /&gt;
relacionadosR r [x] = True&lt;br /&gt;
relacionadosR r (x:y:zs) = (r x y) &amp;amp;&amp;amp; relacionadosR r (y:zs)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR r [x1,x2] = x1 `r` x2&lt;br /&gt;
relacionadosR r (x1:x2:xs) = (x1 `r`x2) &amp;amp;&amp;amp; (relacionadosR r (x2:xs))&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR _ [] = False&lt;br /&gt;
relacionadosR r [x,y] = r x y&lt;br /&gt;
relacionadosR r (x:y:xs) | r x y =  relacionadosR r (y:xs)&lt;br /&gt;
                         | otherwise = False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupa xss) es la lista de las listas obtenidas agrupando&lt;br /&gt;
-- los primeros elementos, los segundos, ... Por ejemplo, &lt;br /&gt;
--    agrupa [[1..6],[7..9],[10..20]]  ==  [[1,7,10],[2,8,11],[3,9,12]]&lt;br /&gt;
--    agrupa []                        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
agrupa [] = []&lt;br /&gt;
agrupa xss | any null xss =  []&lt;br /&gt;
           | otherwise =[map head xss] ++ agrupa (map tail xss) &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickChek que la longitud de todos los&lt;br /&gt;
-- elementos de (agrupa xs) es igual a la longitud de xs.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_agrupa :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_agrupa xss = and [length xs == length xss | xs &amp;lt;- agrupa xss]&lt;br /&gt;
          &lt;br /&gt;
-- La comprobación es quickCheck prop_agrupa&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir, por recursión, la función &lt;br /&gt;
--    concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatR xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatR [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatR [] = []&lt;br /&gt;
concatR (x:xs) = x ++ concatR xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por comprensión, la función&lt;br /&gt;
--    filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaC f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaC (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaC f p xs = [f x | x &amp;lt;- xs, p x]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, usando map y filter, la función&lt;br /&gt;
--    filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaMF f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaMF (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaMF f p xs = map f (filter p xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir, por recursión, la función&lt;br /&gt;
--    filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaR f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaR (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaR f p [] = []&lt;br /&gt;
filtraAplicaR f p (x:xs) | p x        = [f x] ++ filtraAplicaR f p xs&lt;br /&gt;
                         | (not.p) x  = filtraAplicaR f p xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Definir, mediante recursión, la función&lt;br /&gt;
--    maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumR [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumR [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumR [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumR es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR [x] = x&lt;br /&gt;
maximumR (x:xs) = max x (maximumR xs)&lt;br /&gt;
&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR [x] = x&lt;br /&gt;
maximumR (x:xs) | x &amp;gt; (head xs) = maximumR (x:(tail xs))&lt;br /&gt;
                | otherwise = maximumR (xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función de plegado foldr1 está definida por &lt;br /&gt;
--    foldr1 :: (a -&amp;gt; a -&amp;gt; a) -&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
--    foldr1 _ [x]    =  x&lt;br /&gt;
--    foldr1 f (x:xs) =  f x (foldr1 f xs)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir, mediante plegado con foldr1, la función&lt;br /&gt;
--    maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumP [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumP [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumP [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumP es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumP xs = foldr1 max xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir, usando foldr, la función &lt;br /&gt;
--    concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatP xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatP [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatP xs = foldr (++) [] xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que la funciones concatR,&lt;br /&gt;
-- concatP y concat son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_concat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_concat xss = concatR xss == concat xss &amp;amp;&amp;amp; concatP xss == concat xss&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_concat&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que la longitud de &lt;br /&gt;
-- (concatP xss) es la suma de las longitudes de los elementos de xss.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_longConcat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_longConcat xss = length (concatP xss) == sum [length xs | xs &amp;lt;- xss]&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_longConcat&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir, por plegado, la función&lt;br /&gt;
--    filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaP f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaP (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaP f p xs = foldr g [] xs&lt;br /&gt;
                     where g x recu | p x        = [f x] ++ recu&lt;br /&gt;
                                    | (not.p) x  = recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
filtraAplicaPr :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaPr f p xs = foldr fr [] xs&lt;br /&gt;
                 where fr x ys | p x = [f x] ++ ys&lt;br /&gt;
                               | otherwise = ys&lt;br /&gt;
&lt;br /&gt;
filtraAplicaPl :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaPl f p xs = foldl fl [] xs&lt;br /&gt;
                 where fl ys x | p x = ys ++ [f x]&lt;br /&gt;
                               | otherwise = ys&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, con la función all, la función&lt;br /&gt;
--    relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosA r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosA r xs = all (f) (zip xs ys)&lt;br /&gt;
  where ys = tail xs&lt;br /&gt;
        f (x,y) = r x y&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, con la función foldr, la función&lt;br /&gt;
--    relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosP r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosP r xs = foldr f True ys&lt;br /&gt;
  where ys = zip xs (tail xs)&lt;br /&gt;
        f (x,y) recu = (r x y) &amp;amp;&amp;amp; recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
relacionadosP1 :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosP1 p xs = length (foldr f [last xs] xs) == length xs&lt;br /&gt;
                where f x xs | x `p` head (xs) = x : xs&lt;br /&gt;
                             | otherwise = XS&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. (Basado en el ejercicio 4 del primer parcial del&lt;br /&gt;
-- grupo E de 2017)&lt;br /&gt;
-- Una lista se dirá muy creciente si cada elemento es mayor estricto&lt;br /&gt;
-- que el triple del siguiente. &lt;br /&gt;
-- Empleando tan solo (relacionadosA p xs), define el predicado &lt;br /&gt;
--          muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
-- tal que (muyCreciente xs) se verifica si xs es muy creciente. Por&lt;br /&gt;
-- ejemplo:&lt;br /&gt;
-- muyCreciente [1,5,23,115]  == True&lt;br /&gt;
-- muyCreciente [1,2,7,14]    == False&lt;br /&gt;
-- muyCreciente [7]           == True&lt;br /&gt;
-- muyCreciente []            == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Adriana Gordillo, Elsa Domínguez &lt;br /&gt;
muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
muyCreciente xs = relacionadosA p xs&lt;br /&gt;
  where p x y = 3*x&amp;lt;y&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
muyCrecientePr :: [Integer] -&amp;gt; Bool&lt;br /&gt;
muyCrecientePr [] = True&lt;br /&gt;
muyCrecientePr xs = (foldr f [last xs] (init xs)) == xs&lt;br /&gt;
                where f x xs | 3*x &amp;lt; head xs  = x:xs&lt;br /&gt;
                             | otherwise = xs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=500</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=500"/>
		<updated>2021-12-03T08:55:40Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_9.hs (01 de diciembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (II)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- El siguiente módulo hay que instalarlo:&lt;br /&gt;
--cabal install Primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
resultadoPosC :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosC f xs = [x | x &amp;lt;- xs, f x &amp;gt; 0]&lt;br /&gt;
&lt;br /&gt;
resultadoPosS :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS f xs = filter g xs&lt;br /&gt;
                   where g x = f x &amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
resultadoPosR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosR f [] = []&lt;br /&gt;
resultadoPosR f (x:xs) | f x &amp;gt; 0    = x : resultadoPosR f xs&lt;br /&gt;
                       | otherwise  = resultadoPosR f xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosPR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosPR f xs = foldr g [] xs&lt;br /&gt;
                    where g prim recu | f prim &amp;gt; 0 = prim : recu&lt;br /&gt;
                                      | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
intercalaC :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaC y xs = concat [if x&amp;lt;y then [y,x] else [x] | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
intercalaS :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaS y xs = concat (map f xs)&lt;br /&gt;
                where f x = if x&amp;lt;y then [y,x] else [x]&lt;br /&gt;
&lt;br /&gt;
intercalaR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaR y [] = []&lt;br /&gt;
intercalaR y (x:xs) | x&amp;lt;y  = [y,x] ++ intercalaR y xs&lt;br /&gt;
                    | x&amp;gt;y  = [x] ++ intercalaR y xs&lt;br /&gt;
&lt;br /&gt;
intercalaPR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaPR y xs = foldr g [] xs&lt;br /&gt;
                 where g x recu | x&amp;lt;y  = [y,x] ++ recu&lt;br /&gt;
                                | x&amp;gt;y  = [x] ++ recu&lt;br /&gt;
&lt;br /&gt;
intercalaA :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaA y xs = aux [] xs&lt;br /&gt;
                where aux v [] = v&lt;br /&gt;
                      aux v (x:xs) | x&amp;lt;y        = aux (v++[y,x]) xs&lt;br /&gt;
                                   | otherwise  = aux (v++[x]) xs&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
intercala1 :: (Ord a, Num a) =&amp;gt; a -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
intercala1 n xs = concat [if a &amp;lt; n then [n,a] else [a] | a&amp;lt;-xs]&lt;br /&gt;
&lt;br /&gt;
intercala2 :: (Ord a, Num a) =&amp;gt; a -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
intercala22 n xs = concat (map f xs)&lt;br /&gt;
                  where f x = if x &amp;lt; n then [n,x] else [x]&lt;br /&gt;
&lt;br /&gt;
intercala3 :: (Ord a, Num a) =&amp;gt; a -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
intercala3 n [] = []&lt;br /&gt;
intercala3 n (x:xs) = (if x &amp;lt; n then [n,x] else [x]) ++ (intercala3 n (xs))&lt;br /&gt;
&lt;br /&gt;
intercala4 n (x:xs) = (foldr (p) [] (x:xs) )&lt;br /&gt;
                      where p prim recu | prim &amp;lt; n = (n : prim:recu)&lt;br /&gt;
                                        | otherwise = (prim:recu)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
dec2ent1 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent1 xs = read (concat [show x| x &amp;lt;- (sort xs)]) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent2 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent2 xs = read (concat (map show (sort xs))) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent3 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent3Aux :: Show a =&amp;gt; [a] -&amp;gt; [Char]&lt;br /&gt;
dec2ent3Aux [] = []&lt;br /&gt;
dec2ent3Aux (x:xs) = (show x) ++ (dec2ent3Aux xs)&lt;br /&gt;
dec2ent3 xs = read (dec2ent3Aux (sort xs)) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent4 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent4 xs = read (concat (foldr f [] (sort xs))) :: Integer&lt;br /&gt;
            where f prim recu = show prim :recu&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
dec2entC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entC xs = sum [x*10^i | (x,i) &amp;lt;- zip xs (reverse [0..length xs-1])]&lt;br /&gt;
&lt;br /&gt;
dec2entS :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS xs = sum (map f xs)&lt;br /&gt;
            where f x = x*10^(length (dropWhile (/=x) xs) -1)&lt;br /&gt;
&lt;br /&gt;
dec2entR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR [] = 0&lt;br /&gt;
dec2entR (x:xs) = x*10^(length xs) + dec2entR xs&lt;br /&gt;
&lt;br /&gt;
dec2entPR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entPR xs = foldr f 0 xs&lt;br /&gt;
             where f x recu = x*10^(length (dropWhile (/=x) xs) -1) + recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
diferenciaC :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaC xs ys = [x | x &amp;lt;- xs, notElem x ys]&lt;br /&gt;
  &lt;br /&gt;
diferenciaS :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaS xs ys = concat (map f xs)&lt;br /&gt;
                  where f x | notElem x ys  = [x]&lt;br /&gt;
                            | otherwise     = []&lt;br /&gt;
  &lt;br /&gt;
diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaR [] _ = []&lt;br /&gt;
diferenciaR (x:xs) ys | notElem x ys  = [x] ++ diferenciaR xs ys&lt;br /&gt;
                      | otherwise     = diferenciaR xs ys&lt;br /&gt;
  &lt;br /&gt;
diferenciaPR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaPR xs ys = foldr g [] xs&lt;br /&gt;
                   where g x recu | notElem x ys  = [x] ++ recu&lt;br /&gt;
                                  | otherwise     = recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
diferencia1 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia1 xs ys = [x | x &amp;lt;- xs, not (elem x ys) ] -- ++ [y | y &amp;lt;- ys, not (elem y xs) ]&lt;br /&gt;
&lt;br /&gt;
diferencia2 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia2 (x:xs) ys = filter f (x:xs)&lt;br /&gt;
                   where f a = not (elem a ys)&lt;br /&gt;
&lt;br /&gt;
diferencia3 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia3 [] _ = []&lt;br /&gt;
diferencia3 (x:xs) ys | not (elem x ys) = x : (diferencia3 xs ys)&lt;br /&gt;
                      | otherwise = (diferencia3 xs ys)&lt;br /&gt;
&lt;br /&gt;
diferencia4 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia4 (x:xs) ys = foldr f [] (x:xs)&lt;br /&gt;
                     where f prim recu | not (elem prim ys) = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primerosYultimos1 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos1 xss = ([head x | x &amp;lt;- xss, not (null x)], [last x | x &amp;lt;- xss, not (null x)]) &lt;br /&gt;
&lt;br /&gt;
noVacios :: Foldable t =&amp;gt; [t a] -&amp;gt; [t a]&lt;br /&gt;
noVacios xss = filter (not.null) xss&lt;br /&gt;
primerosYultimos2 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos2 xss = (map head (noVacios xss), map last (noVacios xss))&lt;br /&gt;
&lt;br /&gt;
primeros3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
primeros3 [] = []&lt;br /&gt;
primeros3 (xs:xss) | not (null xs) = (head xs) : (primeros3 xss)&lt;br /&gt;
                   | otherwise = (primeros3 xss)&lt;br /&gt;
ultimos3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
ultimos3 [] = []&lt;br /&gt;
ultimos3 (xs:xss) | not (null xs) = (last xs) : (ultimos3 xss)&lt;br /&gt;
                  | otherwise = (ultimos3 xss)&lt;br /&gt;
primerosYultimos3 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos3 xss = (primeros3 xss, ultimos3 xss )&lt;br /&gt;
&lt;br /&gt;
primeros4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]&lt;br /&gt;
primeros4 xss = foldr p4 [] xss&lt;br /&gt;
             where p4 prim recu | not (null prim) = head prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
ultimos4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]                                &lt;br /&gt;
ultimos4 xss = foldr u4 [] xss&lt;br /&gt;
             where u4 prim recu | not (null prim) = last prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
primerosYultimos4 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos4 xss = (primeros4 xss, ultimos4 xss)&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
primerosYultimosC :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosC xss = (concat [(take 1  xs) | xs &amp;lt;- xss], concat [take 1 (reverse xs) | xs &amp;lt;- xss])&lt;br /&gt;
                     &lt;br /&gt;
primerosYultimosS :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosS xss = (concat (map (take 1) xss), concat (map (take 1) (map reverse xss)))&lt;br /&gt;
&lt;br /&gt;
primerosYultimosR :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosR xss = (primerosR xss, ultimosR xss)&lt;br /&gt;
&lt;br /&gt;
primerosR [] = []&lt;br /&gt;
primerosR (xs:xss) | null xs    = primerosR xss&lt;br /&gt;
                   | otherwise  = [head xs] ++ primerosR xss&lt;br /&gt;
ultimosR [] = []&lt;br /&gt;
ultimosR (xs:xss) | null xs    = ultimosR xss&lt;br /&gt;
                  | otherwise  = [last xs] ++ ultimosR xss&lt;br /&gt;
                  &lt;br /&gt;
primerosYultimosPR :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
primerosYultimosPR xss = (primerosPR xss, ultimosPR xss) &lt;br /&gt;
&lt;br /&gt;
primerosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [head x] ++ recu&lt;br /&gt;
ultimosPR xss = foldr f [] xss&lt;br /&gt;
              where f x recu | null x     = recu&lt;br /&gt;
                             | otherwise  = [last x] ++ recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primo1 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo1 x = [1,x]==[a| a&amp;lt;- [1..x], rem x a == 0] -- Me dice si un número es primo&lt;br /&gt;
hermanada1 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada1 xs = sum [1 | (a,b) &amp;lt;- (zip xs (tail xs)), (if ((a/=1) &amp;amp;&amp;amp; (b/=1))&lt;br /&gt;
                                                  then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo1 (gcd a b)))&lt;br /&gt;
                                                  else True),&lt;br /&gt;
                                                                                a&amp;gt;0, b&amp;gt;0 ] == (length xs) -1&lt;br /&gt;
          -- a,b &amp;gt; 0 porque tienen que ser extrictamente positivos&lt;br /&gt;
          -- ((length xs) - 1) == length (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
primo2 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo2 x = filter p2 [1..x] == [1,x]&lt;br /&gt;
         where p2 b = (rem x b == 0)&lt;br /&gt;
hermanada2 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada2 xs = and (map prop2 (zip xs (tail xs)))&lt;br /&gt;
           where prop2 (a,b) = if a&amp;gt;0 &amp;amp;&amp;amp; b&amp;gt;0&lt;br /&gt;
                               then (if ((a/=1) &amp;amp;&amp;amp; (b/=1)) then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo2 (gcd a b))) else True)&lt;br /&gt;
                               else False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primo3 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo3 n = noHayNumerosDivisoresDe n 2 (n - 1)&lt;br /&gt;
noHayNumerosDivisoresDe :: Integral t =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Bool&lt;br /&gt;
noHayNumerosDivisoresDe n minimo maximo   | minimo &amp;gt;= maximo  = True&lt;br /&gt;
                                          | rem n minimo == 0 = False&lt;br /&gt;
                                          | otherwise         = noHayNumerosDivisoresDe n (minimo + 1) maximo&lt;br /&gt;
hermanada3 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada3 [b] = True&lt;br /&gt;
hermanada3 (a:b:xs) = (if ((a/=1) &amp;amp;&amp;amp; (b/=1)) then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo2 (gcd a b))) else True)&lt;br /&gt;
                      &amp;amp;&amp;amp; hermanada3 (b:xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hermanada4 xs = undefined&lt;br /&gt;
---------------------------------------------------------------------------------------&lt;br /&gt;
--Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
hermanadaC :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaC xs | elem 0 xs  = False&lt;br /&gt;
              | otherwise  = and [(gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y))) | (x,y) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
        &lt;br /&gt;
hermanadaS :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaS xs | elem 0 xs  = False&lt;br /&gt;
              | otherwise  = and (map f (zip xs (tail xs)))&lt;br /&gt;
              where f (x,y) = (gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y)))&lt;br /&gt;
                                    &lt;br /&gt;
hermanadaR :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanadaR [x] = True&lt;br /&gt;
hermanadaR (x:y:xs) | elem 0 (x:y:xs)  = False&lt;br /&gt;
                    | otherwise        = ((gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y)))) &amp;amp;&amp;amp; hermanadaR (y:xs)&lt;br /&gt;
&lt;br /&gt;
hermanadaPR :: [Int] -&amp;gt; Bool   &lt;br /&gt;
hermanadaPR xs | elem 0 xs = False&lt;br /&gt;
               | otherwise = foldr f True (zip xs (tail xs))&lt;br /&gt;
               where f (x,y) recu = ((gcd x y == x) || (gcd x y == y) || not (null (primeFactors (gcd x y)))) &amp;amp;&amp;amp; recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
permanentes1 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes1 xs = [a | (a,b) &amp;lt;- (zip xs (init (tails xs))), a == maximum b ]&lt;br /&gt;
&lt;br /&gt;
permanentes2 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes2 xs = map head (filter p2 (init (tails xs)))&lt;br /&gt;
              where p2 (x:xs) = x == maximum (x:xs)&lt;br /&gt;
&lt;br /&gt;
comparacion3 :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
comparacion3 a [] = True&lt;br /&gt;
comparacion3 a b = a &amp;gt;= b &lt;br /&gt;
permanentes3 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes3 [] = []&lt;br /&gt;
permanentes3 (x:xs) | [x] `comparacion3` [maximum3 xs] = x : permanentes3 xs&lt;br /&gt;
                    | otherwise = permanentes3 xs&lt;br /&gt;
                 where maximum3 [] = if x &amp;lt; 0 then x else -x&lt;br /&gt;
                       maximum3 xs = maximum xs&lt;br /&gt;
&lt;br /&gt;
permanentes4:: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes4 (x:xs) = foldr f4 [] (x:xs)&lt;br /&gt;
                    where f4 prim recu | [prim] `comparacion3` [maximum3 recu] = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
                          maximum3 [] = if x &amp;lt; 0 then x else -x&lt;br /&gt;
                          maximum3 xs = maximum xs&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
permanentesC :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesC xs = [x | (x, xs&amp;#039;) &amp;lt;- zip xs (tails (drop 1 xs)), xs&amp;#039; == [] || x &amp;gt;= maximum xs&amp;#039;] &lt;br /&gt;
&lt;br /&gt;
permanentesS :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesS xs = filter p xs&lt;br /&gt;
                where p x = x == maximum (dropWhile (/=x) xs)&lt;br /&gt;
  &lt;br /&gt;
permanentesR :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesR [] = []&lt;br /&gt;
permanentesR [x] = [x] &lt;br /&gt;
permanentesR (x:xs) | x &amp;gt;= maximum xs  = [x] ++ permanentesR xs&lt;br /&gt;
                    | otherwise        = permanentesR xs&lt;br /&gt;
                    &lt;br /&gt;
permanentesPR :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentesPR (x:xs) = foldr f [] (x:xs)&lt;br /&gt;
                     where f x recu | x &amp;gt;= maximum&amp;#039; (dropWhile (/=x) xs)  = [x] ++ recu&lt;br /&gt;
                                    | otherwise                           = recu&lt;br /&gt;
maximum&amp;#039; xs | null xs    = 0&lt;br /&gt;
            | otherwise  = maximum xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esPrimo :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
esPrimo x = filter p2 [1..x] == [1,x]&lt;br /&gt;
         where p2 b = (rem x b == 0)&lt;br /&gt;
muyPrimo :: Integer -&amp;gt; Bool         &lt;br /&gt;
muyPrimo n | esPrimo n = length (show n) == sum [1 | a &amp;lt;- (descomposicion n), esPrimo (read a :: Integer) ]&lt;br /&gt;
           | otherwise = False&lt;br /&gt;
           where descomposicion n =  [reverse x | x &amp;lt;- (init(tails (reverse (show n))))] &lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
muyPrimo&amp;#039; :: Integer -&amp;gt; Bool&lt;br /&gt;
muyPrimo&amp;#039; n = and (map isPrime (lista n))&lt;br /&gt;
lista n = [read a :: Integer | a &amp;lt;- tail (inits (show n))] &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
calculoMuyPrimo = sum [1 | x &amp;lt;- [10000..99999], muyPrimo x] -- Tras unos minutos, sale 15.&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
muyPrimos5cifras = sum [1 | x &amp;lt;- [10000..99999], muyPrimo&amp;#039; x] -- Sale 15 &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8&amp;diff=499</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8&amp;diff=499"/>
		<updated>2021-12-03T08:25:48Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_8.hs (24 de noviembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados.&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;
-- Esta relación tiene contiene ejercicios con funciones de orden&lt;br /&gt;
-- superior y definiciones por plegado correspondientes al tema 7 &lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-7.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&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;
--    segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos&lt;br /&gt;
-- elementos verifican la propiedad p. Por ejemplo,&lt;br /&gt;
--    segmentos even [1,2,0,4,9,6,4,5,7,2]  ==  [[2,0,4],[6,4],[2]]&lt;br /&gt;
--    segmentos odd  [1,2,0,4,9,6,4,5,7,2]  ==  [[1],[9],[5,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
segmentos1 :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos1 p [] = []&lt;br /&gt;
segmentos1 p (x:xs) | p x = [a] ++ segmentos1 p (dropWhile p (x:xs)) &lt;br /&gt;
                    | otherwise = segmentos1 p xs&lt;br /&gt;
                    where a = takeWhile p (x:xs) &lt;br /&gt;
segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos p [] = []&lt;br /&gt;
segmentos p (x:xs) &lt;br /&gt;
    | p x =  (takeWhile p (x:xs)) : segmentos p (dropWhile p (x:xs)) &lt;br /&gt;
    | otherwise = segmentos p (dropWhile (not.p) xs)&lt;br /&gt;
                 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir, por comprensión, la función&lt;br /&gt;
--    relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosC r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC r xs = and [r a b | (a,b) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
--José Manuel García&lt;br /&gt;
relacionadosC1 :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC1 r xs = (length [1 | (a,b) &amp;lt;- (zip xs (tail xs)), a `r` b]) ==&lt;br /&gt;
                     (length (zip xs (tail xs)))&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
relacionadosC&amp;#039; :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC&amp;#039; r xs = and [ r x y   | (x,y) &amp;lt;- agrupa1 xs]&lt;br /&gt;
agrupa1&amp;#039; xs = zip xs (tail xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir, por recursión, la función&lt;br /&gt;
--    relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosR r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Adolfo Sagrera Vivancos&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR r [] = True&lt;br /&gt;
relacionadosR r [x] = True&lt;br /&gt;
relacionadosR r (x:y:zs) = (r x y) &amp;amp;&amp;amp; relacionadosR r (y:zs)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR r [x1,x2] = x1 `r` x2&lt;br /&gt;
relacionadosR r (x1:x2:xs) = (x1 `r`x2) &amp;amp;&amp;amp; (relacionadosR r (x2:xs))&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR _ [] = False&lt;br /&gt;
relacionadosR r [x,y] = r x y&lt;br /&gt;
relacionadosR r (x:y:xs) | r x y =  relacionadosR r (y:xs)&lt;br /&gt;
                         | otherwise = False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupa xss) es la lista de las listas obtenidas agrupando&lt;br /&gt;
-- los primeros elementos, los segundos, ... Por ejemplo, &lt;br /&gt;
--    agrupa [[1..6],[7..9],[10..20]]  ==  [[1,7,10],[2,8,11],[3,9,12]]&lt;br /&gt;
--    agrupa []                        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
agrupa [] = []&lt;br /&gt;
agrupa xss | any null xss =  []&lt;br /&gt;
           | otherwise =[map head xss] ++ agrupa (map tail xss) &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickChek que la longitud de todos los&lt;br /&gt;
-- elementos de (agrupa xs) es igual a la longitud de xs.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_agrupa :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_agrupa xss = and [length xs == length xss | xs &amp;lt;- agrupa xss]&lt;br /&gt;
          &lt;br /&gt;
-- La comprobación es quickCheck prop_agrupa&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir, por recursión, la función &lt;br /&gt;
--    concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatR xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatR [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatR [] = []&lt;br /&gt;
concatR (x:xs) = x ++ concatR xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por comprensión, la función&lt;br /&gt;
--    filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaC f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaC (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaC f p xs = [f x | x &amp;lt;- xs, p x]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, usando map y filter, la función&lt;br /&gt;
--    filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaMF f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaMF (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaMF f p xs = map f (filter p xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir, por recursión, la función&lt;br /&gt;
--    filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaR f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaR (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaR f p [] = []&lt;br /&gt;
filtraAplicaR f p (x:xs) | p x        = [f x] ++ filtraAplicaR f p xs&lt;br /&gt;
                         | (not.p) x  = filtraAplicaR f p xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Definir, mediante recursión, la función&lt;br /&gt;
--    maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumR [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumR [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumR [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumR es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR [x] = x&lt;br /&gt;
maximumR (x:xs) = max x (maximumR xs)&lt;br /&gt;
&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR [x] = x&lt;br /&gt;
maximumR (x:xs) | x &amp;gt; (head xs) = maximumR (x:(tail xs))&lt;br /&gt;
                | otherwise = maximumR (xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función de plegado foldr1 está definida por &lt;br /&gt;
--    foldr1 :: (a -&amp;gt; a -&amp;gt; a) -&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
--    foldr1 _ [x]    =  x&lt;br /&gt;
--    foldr1 f (x:xs) =  f x (foldr1 f xs)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir, mediante plegado con foldr1, la función&lt;br /&gt;
--    maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumP [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumP [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumP [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumP es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumP xs = foldr1 max xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir, usando foldr, la función &lt;br /&gt;
--    concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatP xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatP [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatP xs = foldr (++) [] xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que la funciones concatR,&lt;br /&gt;
-- concatP y concat son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_concat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_concat xss = concatR xss == concat xss &amp;amp;&amp;amp; concatP xss == concat xss&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_concat&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que la longitud de &lt;br /&gt;
-- (concatP xss) es la suma de las longitudes de los elementos de xss.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_longConcat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_longConcat xss = length (concatP xss) == sum [length xs | xs &amp;lt;- xss]&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_longConcat&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir, por plegado, la función&lt;br /&gt;
--    filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaP f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaP (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaP f p xs = foldr g [] xs&lt;br /&gt;
                     where g x recu | p x        = [f x] ++ recu&lt;br /&gt;
                                    | (not.p) x  = recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
filtraAplicaPr :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaPr f p xs = foldr fr [] xs&lt;br /&gt;
                 where fr x ys | p x = [f x] ++ ys&lt;br /&gt;
                               | otherwise = ys&lt;br /&gt;
&lt;br /&gt;
filtraAplicaPl :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaPl f p xs = foldl fl [] xs&lt;br /&gt;
                 where fl ys x | p x = ys ++ [f x]&lt;br /&gt;
                               | otherwise = ys&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, con la función all, la función&lt;br /&gt;
--    relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosA r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosA r xs = all (f) (zip xs ys)&lt;br /&gt;
  where ys = tail xs&lt;br /&gt;
        f (x,y) = r x y&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, con la función foldr, la función&lt;br /&gt;
--    relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosP r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosP r xs = foldr f True ys&lt;br /&gt;
  where ys = zip xs (tail xs)&lt;br /&gt;
        f (x,y) recu = (r x y) &amp;amp;&amp;amp; recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
relacionadosP1 :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosP1 p xs = length (foldr f [last xs] xs) == length xs&lt;br /&gt;
                where f x xs | x `p` head (xs) = x : xs&lt;br /&gt;
                             | otherwise = XS&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. (Basado en el ejercicio 4 del primer parcial del&lt;br /&gt;
-- grupo E de 2017)&lt;br /&gt;
-- Una lista se dirá muy creciente si cada elemento es mayor estricto&lt;br /&gt;
-- que el triple del siguiente. &lt;br /&gt;
-- Empleando tan solo (relacionadosA p xs), define el predicado &lt;br /&gt;
--          muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
-- tal que (muyCreciente xs) se verifica si xs es muy creciente. Por&lt;br /&gt;
-- ejemplo:&lt;br /&gt;
-- muyCreciente [1,5,23,115]  == True&lt;br /&gt;
-- muyCreciente [1,2,7,14]    == False&lt;br /&gt;
-- muyCreciente [7]           == True&lt;br /&gt;
-- muyCreciente []            == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Adriana Gordillo, Elsa Domínguez &lt;br /&gt;
muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
muyCreciente xs = relacionadosA p xs&lt;br /&gt;
  where p x y = 3*x&amp;lt;y&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
muyCreciente1 :: [Integer] -&amp;gt; Bool&lt;br /&gt;
muyCreciente1 [] = True&lt;br /&gt;
muyCreciente1 xs = reverse (foldl f [head xs&amp;#039;] xs&amp;#039;) == xs&lt;br /&gt;
                where f xs&amp;#039; x | last xs&amp;#039; &amp;gt; 3*x = xs&amp;#039; ++ [x]&lt;br /&gt;
                             | otherwise = xs&amp;#039;&lt;br /&gt;
                      xs&amp;#039; = reverse xs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8&amp;diff=498</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8&amp;diff=498"/>
		<updated>2021-12-03T08:09:29Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_8.hs (24 de noviembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados.&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;
-- Esta relación tiene contiene ejercicios con funciones de orden&lt;br /&gt;
-- superior y definiciones por plegado correspondientes al tema 7 &lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-7.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&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;
--    segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos&lt;br /&gt;
-- elementos verifican la propiedad p. Por ejemplo,&lt;br /&gt;
--    segmentos even [1,2,0,4,9,6,4,5,7,2]  ==  [[2,0,4],[6,4],[2]]&lt;br /&gt;
--    segmentos odd  [1,2,0,4,9,6,4,5,7,2]  ==  [[1],[9],[5,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
segmentos1 :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos1 p [] = []&lt;br /&gt;
segmentos1 p (x:xs) | p x = [a] ++ segmentos1 p (dropWhile p (x:xs)) &lt;br /&gt;
                    | otherwise = segmentos1 p xs&lt;br /&gt;
                    where a = takeWhile p (x:xs) &lt;br /&gt;
segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos p [] = []&lt;br /&gt;
segmentos p (x:xs) &lt;br /&gt;
    | p x =  (takeWhile p (x:xs)) : segmentos p (dropWhile p (x:xs)) &lt;br /&gt;
    | otherwise = segmentos p (dropWhile (not.p) xs)&lt;br /&gt;
                 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir, por comprensión, la función&lt;br /&gt;
--    relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosC r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC r xs = and [r a b | (a,b) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
--José Manuel García&lt;br /&gt;
relacionadosC1 :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC1 r xs = (length [1 | (a,b) &amp;lt;- (zip xs (tail xs)), a `r` b]) ==&lt;br /&gt;
                     (length (zip xs (tail xs)))&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
relacionadosC&amp;#039; :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC&amp;#039; r xs = and [ r x y   | (x,y) &amp;lt;- agrupa1 xs]&lt;br /&gt;
agrupa1&amp;#039; xs = zip xs (tail xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir, por recursión, la función&lt;br /&gt;
--    relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosR r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Adolfo Sagrera Vivancos&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR r [] = True&lt;br /&gt;
relacionadosR r [x] = True&lt;br /&gt;
relacionadosR r (x:y:zs) = (r x y) &amp;amp;&amp;amp; relacionadosR r (y:zs)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR r [x1,x2] = x1 `r` x2&lt;br /&gt;
relacionadosR r (x1:x2:xs) = (x1 `r`x2) &amp;amp;&amp;amp; (relacionadosR r (x2:xs))&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR _ [] = False&lt;br /&gt;
relacionadosR r [x,y] = r x y&lt;br /&gt;
relacionadosR r (x:y:xs) | r x y =  relacionadosR r (y:xs)&lt;br /&gt;
                         | otherwise = False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupa xss) es la lista de las listas obtenidas agrupando&lt;br /&gt;
-- los primeros elementos, los segundos, ... Por ejemplo, &lt;br /&gt;
--    agrupa [[1..6],[7..9],[10..20]]  ==  [[1,7,10],[2,8,11],[3,9,12]]&lt;br /&gt;
--    agrupa []                        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
agrupa [] = []&lt;br /&gt;
agrupa xss | any null xss =  []&lt;br /&gt;
           | otherwise =[map head xss] ++ agrupa (map tail xss) &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickChek que la longitud de todos los&lt;br /&gt;
-- elementos de (agrupa xs) es igual a la longitud de xs.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_agrupa :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_agrupa xss = and [length xs == length xss | xs &amp;lt;- agrupa xss]&lt;br /&gt;
          &lt;br /&gt;
-- La comprobación es quickCheck prop_agrupa&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir, por recursión, la función &lt;br /&gt;
--    concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatR xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatR [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatR [] = []&lt;br /&gt;
concatR (x:xs) = x ++ concatR xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por comprensión, la función&lt;br /&gt;
--    filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaC f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaC (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaC f p xs = [f x | x &amp;lt;- xs, p x]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, usando map y filter, la función&lt;br /&gt;
--    filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaMF f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaMF (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaMF f p xs = map f (filter p xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir, por recursión, la función&lt;br /&gt;
--    filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaR f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaR (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaR f p [] = []&lt;br /&gt;
filtraAplicaR f p (x:xs) | p x        = [f x] ++ filtraAplicaR f p xs&lt;br /&gt;
                         | (not.p) x  = filtraAplicaR f p xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Definir, mediante recursión, la función&lt;br /&gt;
--    maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumR [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumR [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumR [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumR es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR [x] = x&lt;br /&gt;
maximumR (x:xs) = max x (maximumR xs)&lt;br /&gt;
&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR [x] = x&lt;br /&gt;
maximumR (x:xs) | x &amp;gt; (head xs) = maximumR (x:(tail xs))&lt;br /&gt;
                | otherwise = maximumR (xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función de plegado foldr1 está definida por &lt;br /&gt;
--    foldr1 :: (a -&amp;gt; a -&amp;gt; a) -&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
--    foldr1 _ [x]    =  x&lt;br /&gt;
--    foldr1 f (x:xs) =  f x (foldr1 f xs)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir, mediante plegado con foldr1, la función&lt;br /&gt;
--    maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumP [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumP [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumP [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumP es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumP xs = foldr1 max xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir, usando foldr, la función &lt;br /&gt;
--    concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatP xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatP [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatP xs = foldr (++) [] xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que la funciones concatR,&lt;br /&gt;
-- concatP y concat son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_concat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_concat xss = concatR xss == concat xss &amp;amp;&amp;amp; concatP xss == concat xss&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_concat&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que la longitud de &lt;br /&gt;
-- (concatP xss) es la suma de las longitudes de los elementos de xss.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_longConcat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_longConcat xss = length (concatP xss) == sum [length xs | xs &amp;lt;- xss]&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_longConcat&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir, por plegado, la función&lt;br /&gt;
--    filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaP f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaP (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaP f p xs = foldr g [] xs&lt;br /&gt;
                     where g x recu | p x        = [f x] ++ recu&lt;br /&gt;
                                    | (not.p) x  = recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
filtraAplicaPr :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaPr f p xs = foldr fr [] xs&lt;br /&gt;
                 where fr x ys | p x = [f x] ++ ys&lt;br /&gt;
                               | otherwise = ys&lt;br /&gt;
&lt;br /&gt;
filtraAplicaPl :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaPl f p xs = foldl fl [] xs&lt;br /&gt;
                 where fl ys x | p x = ys ++ [f x]&lt;br /&gt;
                               | otherwise = ys&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, con la función all, la función&lt;br /&gt;
--    relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosA r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosA r xs = all (f) (zip xs ys)&lt;br /&gt;
  where ys = tail xs&lt;br /&gt;
        f (x,y) = r x y&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, con la función foldr, la función&lt;br /&gt;
--    relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosP r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosP r xs = foldr f True ys&lt;br /&gt;
  where ys = zip xs (tail xs)&lt;br /&gt;
        f (x,y) recu = (r x y) &amp;amp;&amp;amp; recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosP p xs = length (foldr f [last xs] xs) == length xs&lt;br /&gt;
                where f x xs | x `p` head (xs) = x : xs&lt;br /&gt;
                             | otherwise = XS&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. (Basado en el ejercicio 4 del primer parcial del&lt;br /&gt;
-- grupo E de 2017)&lt;br /&gt;
-- Una lista se dirá muy creciente si cada elemento es mayor estricto&lt;br /&gt;
-- que el triple del siguiente. &lt;br /&gt;
-- Empleando tan solo (relacionadosA p xs), define el predicado &lt;br /&gt;
--          muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
-- tal que (muyCreciente xs) se verifica si xs es muy creciente. Por&lt;br /&gt;
-- ejemplo:&lt;br /&gt;
-- muyCreciente [1,5,23,115]  == True&lt;br /&gt;
-- muyCreciente [1,2,7,14]    == False&lt;br /&gt;
-- muyCreciente [7]           == True&lt;br /&gt;
-- muyCreciente []            == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Adriana Gordillo, Elsa Domínguez &lt;br /&gt;
muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
muyCreciente xs = relacionadosA p xs&lt;br /&gt;
  where p x y = 3*x&amp;lt;y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8&amp;diff=490</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8&amp;diff=490"/>
		<updated>2021-12-01T08:34:25Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_8.hs (24 de noviembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados.&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;
-- Esta relación tiene contiene ejercicios con funciones de orden&lt;br /&gt;
-- superior y definiciones por plegado correspondientes al tema 7 &lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-7.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&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;
--    segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos&lt;br /&gt;
-- elementos verifican la propiedad p. Por ejemplo,&lt;br /&gt;
--    segmentos even [1,2,0,4,9,6,4,5,7,2]  ==  [[2,0,4],[6,4],[2]]&lt;br /&gt;
--    segmentos odd  [1,2,0,4,9,6,4,5,7,2]  ==  [[1],[9],[5,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
segmentos1 :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos1 p [] = []&lt;br /&gt;
segmentos1 p (x:xs) | p x = [a] ++ segmentos1 p (dropWhile p (x:xs)) &lt;br /&gt;
                    | otherwise = segmentos1 p xs&lt;br /&gt;
                    where a = takeWhile p (x:xs) &lt;br /&gt;
segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos p [] = []&lt;br /&gt;
segmentos p (x:xs) &lt;br /&gt;
    | p x =  (takeWhile p (x:xs)) : segmentos p (dropWhile p (x:xs)) &lt;br /&gt;
    | otherwise = segmentos p (dropWhile (not.p) xs)&lt;br /&gt;
                 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir, por comprensión, la función&lt;br /&gt;
--    relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosC r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC r xs = and [r a b | (a,b) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
--José Manuel García&lt;br /&gt;
relacionadosC1 :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC1 r xs = (length [1 | (a,b) &amp;lt;- (zip xs (tail xs)), a `r` b]) ==&lt;br /&gt;
                     (length (zip xs (tail xs)))&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
relacionadosC&amp;#039; :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC&amp;#039; r xs = and [ r x y   | (x,y) &amp;lt;- agrupa1 xs]&lt;br /&gt;
agrupa1&amp;#039; xs = zip xs (tail xs)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir, por recursión, la función&lt;br /&gt;
--    relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosR r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Adolfo Sagrera Vivancos&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR r [] = True&lt;br /&gt;
relacionadosR r [x] = True&lt;br /&gt;
relacionadosR r (x:y:zs) = (r x y) &amp;amp;&amp;amp; relacionadosR r (y:zs)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR r [x1,x2] = x1 `r` x2&lt;br /&gt;
relacionadosR r (x1:x2:xs) = (x1 `r`x2) &amp;amp;&amp;amp; (relacionadosR r (x2:xs))&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR _ [] = False&lt;br /&gt;
relacionadosR r [x,y] = r x y&lt;br /&gt;
relacionadosR r (x:y:xs) | r x y =  relacionadosR r (y:xs)&lt;br /&gt;
                         | otherwise = False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupa xss) es la lista de las listas obtenidas agrupando&lt;br /&gt;
-- los primeros elementos, los segundos, ... Por ejemplo, &lt;br /&gt;
--    agrupa [[1..6],[7..9],[10..20]]  ==  [[1,7,10],[2,8,11],[3,9,12]]&lt;br /&gt;
--    agrupa []                        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
agrupa [] = []&lt;br /&gt;
agrupa xss | any null xss =  []&lt;br /&gt;
           | otherwise =[map head xss] ++ agrupa (map tail xss) &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickChek que la longitud de todos los&lt;br /&gt;
-- elementos de (agrupa xs) es igual a la longitud de xs.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_agrupa :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_agrupa xss = and [length xs == length xss | xs &amp;lt;- agrupa xss]&lt;br /&gt;
          &lt;br /&gt;
-- La comprobación es quickCheck prop_agrupa&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir, por recursión, la función &lt;br /&gt;
--    concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatR xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatR [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatR [] = []&lt;br /&gt;
concatR (x:xs) = x ++ concatR xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por comprensión, la función&lt;br /&gt;
--    filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaC f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaC (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaC f p xs = [f x | x &amp;lt;- xs, p x]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, usando map y filter, la función&lt;br /&gt;
--    filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaMF f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaMF (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaMF f p xs = map f (filter p xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir, por recursión, la función&lt;br /&gt;
--    filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaR f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaR (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaR f p [] = []&lt;br /&gt;
filtraAplicaR f p (x:xs) | p x        = [f x] ++ filtraAplicaR f p xs&lt;br /&gt;
                         | (not.p) x  = filtraAplicaR f p xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Definir, mediante recursión, la función&lt;br /&gt;
--    maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumR [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumR [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumR [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumR es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR [x] = x&lt;br /&gt;
maximumR (x:xs) = max x (maximumR XS)&lt;br /&gt;
&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR [x] = x&lt;br /&gt;
maximumR (x:xs) | x &amp;gt; (head xs) = maximumR (x:(tail xs))&lt;br /&gt;
                | otherwise = maximumR (xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función de plegado foldr1 está definida por &lt;br /&gt;
--    foldr1 :: (a -&amp;gt; a -&amp;gt; a) -&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
--    foldr1 _ [x]    =  x&lt;br /&gt;
--    foldr1 f (x:xs) =  f x (foldr1 f xs)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir, mediante plegado con foldr1, la función&lt;br /&gt;
--    maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumP [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumP [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumP [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumP es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumP xs = foldr1 max xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir, usando foldr, la función &lt;br /&gt;
--    concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatP xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatP [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatP xs = foldr (++) [] xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que la funciones concatR,&lt;br /&gt;
-- concatP y concat son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_concat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_concat xss = concatR xss == concat xss &amp;amp;&amp;amp; concatP xss == concat xss&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_concat&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que la longitud de &lt;br /&gt;
-- (concatP xss) es la suma de las longitudes de los elementos de xss.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_longConcat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_longConcat xss = length (concatP xss) == sum [length xs | xs &amp;lt;- xss]&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_longConcat&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir, por plegado, la función&lt;br /&gt;
--    filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaP f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaP (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaP f p xs = foldr g [] xs&lt;br /&gt;
                     where g x recu | p x        = [f x] ++ recu&lt;br /&gt;
                                    | (not.p) x  = recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
filtraAplicaPr :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaPr f p xs = foldr fr [] xs&lt;br /&gt;
                 where fr x ys | p x = [f x] ++ ys&lt;br /&gt;
                               | otherwise = ys&lt;br /&gt;
&lt;br /&gt;
filtraAplicaPl :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaPl f p xs = foldl fl [] xs&lt;br /&gt;
                 where fl ys x | p x = ys ++ [f x]&lt;br /&gt;
                               | otherwise = ys&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, con la función all, la función&lt;br /&gt;
--    relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosA r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosA = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, con la función foldr, la función&lt;br /&gt;
--    relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosP r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosP = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. (Basado en el ejercicio 4 del primer parcial del&lt;br /&gt;
-- grupo E de 2017)&lt;br /&gt;
-- Una lista se dirá muy creciente si cada elemento es mayor estricto&lt;br /&gt;
-- que el triple del siguiente. &lt;br /&gt;
-- Empleando tan solo (relacionadosA p xs), define el predicado &lt;br /&gt;
--          muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
-- tal que (muyCreciente xs) se verifica si xs es muy creciente. Por&lt;br /&gt;
-- ejemplo:&lt;br /&gt;
-- muyCreciente [1,5,23,115]  == True&lt;br /&gt;
-- muyCreciente [1,2,7,14]    == False&lt;br /&gt;
-- muyCreciente [7]           == True&lt;br /&gt;
-- muyCreciente []            == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
muyCreciente xs = undefined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=478</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=478"/>
		<updated>2021-11-27T22:48:29Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_9.hs (01 de diciembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (II)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- El siguiente módulo hay que instalarlo:&lt;br /&gt;
--cabal install Primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
resultadoPosC :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosC f xs = [x | x &amp;lt;- xs, f x &amp;gt; 0]&lt;br /&gt;
&lt;br /&gt;
resultadoPosS :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS f xs = filter g xs&lt;br /&gt;
                   where g x = f x &amp;gt; 0&lt;br /&gt;
resultadoPosS1 :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS1 f xs = filter (\ x -&amp;gt; f x &amp;gt; 0) xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosR f [] = []&lt;br /&gt;
resultadoPosR f (x:xs) | f x &amp;gt; 0    = x : resultadoPosR f xs&lt;br /&gt;
                       | otherwise  = resultadoPosR f xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosPR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosPR f xs = foldr g [] xs&lt;br /&gt;
                    where g prim recu | f prim &amp;gt; 0 = prim : recu&lt;br /&gt;
                                      | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
intercalaC :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaC y xs = concat [if x&amp;lt;y then [y,x] else [x] | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
intercalaS :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaS y xs = concat (map f xs)&lt;br /&gt;
                where f x = if x&amp;lt;y then [y,x] else [x]&lt;br /&gt;
&lt;br /&gt;
intercalaR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaR y [] = []&lt;br /&gt;
intercalaR y (x:xs) | x&amp;lt;y  = [y,x] ++ intercalaR y xs&lt;br /&gt;
                    | x&amp;gt;y  = [x] ++ intercalaR y xs&lt;br /&gt;
&lt;br /&gt;
intercalaPR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaPR y xs = foldr g [] xs&lt;br /&gt;
                 where g x recu | x&amp;lt;y  = [y,x] ++ recu&lt;br /&gt;
                                | x&amp;gt;y  = [x] ++ recu&lt;br /&gt;
&lt;br /&gt;
intercalaA :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaA y xs = aux [] xs&lt;br /&gt;
                where aux v [] = v&lt;br /&gt;
                      aux v (x:xs) | x&amp;lt;y        = aux (v++[y,x]) xs&lt;br /&gt;
                                   | otherwise  = aux (v++[x]) xs&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
dec2ent1 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent1 xs = read (concat [show x| x &amp;lt;- (sort xs)]) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent2 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent2 xs = read (concat (map show (sort xs))) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent3 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent3Aux :: Show a =&amp;gt; [a] -&amp;gt; [Char]&lt;br /&gt;
dec2ent3Aux [] = []&lt;br /&gt;
dec2ent3Aux (x:xs) = (show x) ++ (dec2ent3Aux xs)&lt;br /&gt;
dec2ent3 xs = read (dec2ent3Aux (sort xs)) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent4 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent4 xs = read (concat (foldr f [] (sort xs))) :: Integer&lt;br /&gt;
            where f prim recu = show prim :recu&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
dec2entC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entC xs = sum [x*10^i | (x,i) &amp;lt;- zip xs (reverse [0..length xs-1])]&lt;br /&gt;
&lt;br /&gt;
dec2entS :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS xs = sum (map f xs)&lt;br /&gt;
           where f x = x*10^(length (dropWhile (/=x) xs) -1)&lt;br /&gt;
&lt;br /&gt;
dec2entR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR [] = 0&lt;br /&gt;
dec2entR (x:xs) = x*10^(length xs) + dec2entR xs&lt;br /&gt;
&lt;br /&gt;
dec2entPR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entPR xs = foldr f 0 xs&lt;br /&gt;
             where f x recu = x*10^(length (dropWhile (/=x) xs) -1) + recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
diferenciaC :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaC xs ys = [x | x &amp;lt;- xs, notElem x ys]&lt;br /&gt;
  &lt;br /&gt;
diferenciaS :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaS xs ys = undefined &lt;br /&gt;
  &lt;br /&gt;
diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaR [] [] = []&lt;br /&gt;
diferenciaR [] ys = []&lt;br /&gt;
diferenciaR (x:xs) ys | notElem x ys  = [x] ++ diferenciaR xs ys&lt;br /&gt;
                      | otherwise     = diferenciaR xs ys&lt;br /&gt;
  &lt;br /&gt;
diferenciaPR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaPR xs ys = foldr g [] xs&lt;br /&gt;
                   where g x recu | notElem x ys  = [x] ++ recu&lt;br /&gt;
                                  | otherwise     = recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
diferencia1 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia1 xs ys = [x | x &amp;lt;- xs, not (elem x ys) ] -- ++ [y | y &amp;lt;- ys, not (elem y xs) ]&lt;br /&gt;
&lt;br /&gt;
diferencia2 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia2 (x:xs) ys = filter f (x:xs)&lt;br /&gt;
                   where f a = not (elem a ys)&lt;br /&gt;
&lt;br /&gt;
diferencia3 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia3 [] _ = []&lt;br /&gt;
diferencia3 (x:xs) ys | not (elem x ys) = x : (diferencia3 xs ys)&lt;br /&gt;
                      | otherwise = (diferencia3 xs ys)&lt;br /&gt;
&lt;br /&gt;
diferencia4 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia4 (x:xs) ys = foldr f [] (x:xs)&lt;br /&gt;
                     where f prim recu | not (elem prim ys) = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primerosYultimos1 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos1 xss = ([head x | x &amp;lt;- xss, not (null x)], [last x | x &amp;lt;- xss, not (null x)]) &lt;br /&gt;
&lt;br /&gt;
noVacios :: Foldable t =&amp;gt; [t a] -&amp;gt; [t a]&lt;br /&gt;
noVacios xss = filter (not.null) xss&lt;br /&gt;
primerosYultimos2 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos2 xss = (map head (noVacios xss), map last (noVacios xss))&lt;br /&gt;
&lt;br /&gt;
primeros3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
primeros3 [] = []&lt;br /&gt;
primeros3 (xs:xss) | not (null xs) = (head xs) : (primeros3 xss)&lt;br /&gt;
                   | otherwise = (primeros3 xss)&lt;br /&gt;
ultimos3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
ultimos3 [] = []&lt;br /&gt;
ultimos3 (xs:xss) | not (null xs) = (last xs) : (ultimos3 xss)&lt;br /&gt;
                  | otherwise = (ultimos3 xss)&lt;br /&gt;
primerosYultimos3 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos3 xss = (primeros3 xss, ultimos3 xss )&lt;br /&gt;
&lt;br /&gt;
primeros4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]&lt;br /&gt;
primeros4 xss = foldr p4 [] xss&lt;br /&gt;
             where p4 prim recu | not (null prim) = head prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
ultimos4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]                                &lt;br /&gt;
ultimos4 xss = foldr u4 [] xss&lt;br /&gt;
             where u4 prim recu | not (null prim) = last prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
primerosYultimos4 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos4 xss = (primeros4 xss, ultimos4 xss)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primo1 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo1 x = [1,x]==[a| a&amp;lt;- [1..x], rem x a == 0] -- Me dice si un número es primo&lt;br /&gt;
hermanada1 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada1 xs = sum [1 | (a,b) &amp;lt;- (zip xs (tail xs)), (if ((a/=1) &amp;amp;&amp;amp; (b/=1))&lt;br /&gt;
                                                  then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo1 (gcd a b)))&lt;br /&gt;
                                                  else True),&lt;br /&gt;
                                                                                a&amp;gt;0, b&amp;gt;0 ] == (length xs) -1&lt;br /&gt;
          -- a,b &amp;gt; 0 porque tienen que ser extrictamente positivos&lt;br /&gt;
          -- ((length xs) - 1) == length (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
primo2 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo2 x = filter p2 [1..x] == [1,x]&lt;br /&gt;
         where p2 b = (rem x b == 0)&lt;br /&gt;
hermanada2 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada2 xs = and (map prop2 (zip xs (tail xs)))&lt;br /&gt;
           where prop2 (a,b) = if a&amp;gt;0 &amp;amp;&amp;amp; b&amp;gt;0&lt;br /&gt;
                               then (if ((a/=1) &amp;amp;&amp;amp; (b/=1)) then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo2 (gcd a b))) else True)&lt;br /&gt;
                               else False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primo3 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo3 n = noHayNumerosDivisoresDe n 2 (n - 1)&lt;br /&gt;
noHayNumerosDivisoresDe :: Integral t =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Bool&lt;br /&gt;
noHayNumerosDivisoresDe n minimo maximo   | minimo &amp;gt;= maximo  = True&lt;br /&gt;
                                          | rem n minimo == 0 = False&lt;br /&gt;
                                          | otherwise         = noHayNumerosDivisoresDe n (minimo + 1) maximo&lt;br /&gt;
hermanada3 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada3 [b] = True&lt;br /&gt;
hermanada3 (a:b:xs) = (if ((a/=1) &amp;amp;&amp;amp; (b/=1)) then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo2 (gcd a b))) else True)&lt;br /&gt;
                      &amp;amp;&amp;amp; hermanada3 (b:xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hermanada4 xs = undefined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
permanentes1 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes1 xs = [a | (a,b) &amp;lt;- (zip xs (init (tails xs))), a == maximum b ]&lt;br /&gt;
&lt;br /&gt;
permanentes2 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes2 xs = map head (filter p2 (init (tails xs)))&lt;br /&gt;
              where p2 (x:xs) = x == maximum (x:xs)&lt;br /&gt;
&lt;br /&gt;
comparacion3 :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
comparacion3 a [] = True&lt;br /&gt;
comparacion3 a b = a &amp;gt;= b &lt;br /&gt;
permanentes3 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes3 [] = []&lt;br /&gt;
permanentes3 (x:xs) | [x] `comparacion3` [maximum3 xs] = x : permanentes3 xs&lt;br /&gt;
                    | otherwise = permanentes3 xs&lt;br /&gt;
                 where maximum3 [] = if x &amp;lt; 0 then x else -x&lt;br /&gt;
                       maximum3 xs = maximum xs&lt;br /&gt;
&lt;br /&gt;
permanentes4:: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes4 (x:xs) = foldr f4 [] (x:xs)&lt;br /&gt;
                    where f4 prim recu | [prim] `comparacion3` [maximum3 recu] = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
                          maximum3 [] = if x &amp;lt; 0 then x else -x&lt;br /&gt;
                          maximum3 xs = maximum xs&lt;br /&gt;
               &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
esPrimo :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
esPrimo x = filter p2 [1..x] == [1,x]&lt;br /&gt;
         where p2 b = (rem x b == 0)&lt;br /&gt;
muyPrimo :: Integer -&amp;gt; Bool         &lt;br /&gt;
muyPrimo n | esPrimo n = length (show n) == sum [1 | a &amp;lt;- (descomposicion n), esPrimo (read a :: Integer) ]&lt;br /&gt;
           | otherwise = False&lt;br /&gt;
           where descomposicion n =  [reverse x | x &amp;lt;- (init(tails (reverse (show n))))] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
calculoMuyPrimo = sum [1 | x &amp;lt;- [10000..99999], muyPrimo x] -- Tras unos minutos, sale 15.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=477</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=477"/>
		<updated>2021-11-27T21:24:36Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_9.hs (01 de diciembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (II)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- El siguiente módulo hay que instalarlo:&lt;br /&gt;
--cabal install Primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
resultadoPosC :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosC f xs = [x | x &amp;lt;- xs, f x &amp;gt; 0]&lt;br /&gt;
&lt;br /&gt;
resultadoPosS :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS f xs = filter g xs&lt;br /&gt;
                   where g x = f x &amp;gt; 0&lt;br /&gt;
resultadoPosS1 :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS1 f xs = filter (\ x -&amp;gt; f x &amp;gt; 0) xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosR f [] = []&lt;br /&gt;
resultadoPosR f (x:xs) | f x &amp;gt; 0    = x : resultadoPosR f xs&lt;br /&gt;
                       | otherwise  = resultadoPosR f xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosPR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosPR f xs = foldr g [] xs&lt;br /&gt;
                    where g prim recu | f prim &amp;gt; 0 = prim : recu&lt;br /&gt;
                                      | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
intercalaC :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaC y xs = concat [if x&amp;lt;y then [y,x] else [x] | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
intercalaS :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaS y xs = concat (map f xs)&lt;br /&gt;
                where f x = if x&amp;lt;y then [y,x] else [x]&lt;br /&gt;
&lt;br /&gt;
intercalaR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaR y [] = []&lt;br /&gt;
intercalaR y (x:xs) | x&amp;lt;y  = [y,x] ++ intercalaR y xs&lt;br /&gt;
                    | x&amp;gt;y  = [x] ++ intercalaR y xs&lt;br /&gt;
&lt;br /&gt;
intercalaPR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaPR y xs = foldr g [] xs&lt;br /&gt;
                 where g x recu | x&amp;lt;y  = [y,x] ++ recu&lt;br /&gt;
                                | x&amp;gt;y  = [x] ++ recu&lt;br /&gt;
&lt;br /&gt;
intercalaA :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaA y xs = aux [] xs&lt;br /&gt;
                where aux v [] = v&lt;br /&gt;
                      aux v (x:xs) | x&amp;lt;y        = aux (v++[y,x]) xs&lt;br /&gt;
                                   | otherwise  = aux (v++[x]) xs&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
dec2ent1 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent1 xs = read (concat [show x| x &amp;lt;- (sort xs)]) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent2 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent2 xs = read (concat (map show (sort xs))) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent3 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent3Aux :: Show a =&amp;gt; [a] -&amp;gt; [Char]&lt;br /&gt;
dec2ent3Aux [] = []&lt;br /&gt;
dec2ent3Aux (x:xs) = (show x) ++ (dec2ent3Aux xs)&lt;br /&gt;
dec2ent3 xs = read (dec2ent3Aux (sort xs)) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent4 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent4 xs = read (concat (foldr f [] (sort xs))) :: Integer&lt;br /&gt;
            where f prim recu = show prim :recu&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
dec2entC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entC xs = sum [x*10^i | (x,i) &amp;lt;- zip xs (reverse [0..length xs-1])]&lt;br /&gt;
&lt;br /&gt;
dec2entS :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS xs = sum (map f xs)&lt;br /&gt;
           where f x = x*10^(length (dropWhile (/=x) xs) -1)&lt;br /&gt;
&lt;br /&gt;
dec2entR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR [] = 0&lt;br /&gt;
dec2entR (x:xs) = x*10^(length xs) + dec2entR xs&lt;br /&gt;
&lt;br /&gt;
dec2entPR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entPR xs = foldr f 0 xs&lt;br /&gt;
             where f x recu = x*10^(length (dropWhile (/=x) xs) -1) + recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
diferenciaC :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaC xs ys = [x | x &amp;lt;- xs, notElem x ys]&lt;br /&gt;
  &lt;br /&gt;
diferenciaS :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaS xs ys = undefined &lt;br /&gt;
  &lt;br /&gt;
diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaR [] [] = []&lt;br /&gt;
diferenciaR [] ys = []&lt;br /&gt;
diferenciaR (x:xs) ys | notElem x ys  = [x] ++ diferenciaR xs ys&lt;br /&gt;
                      | otherwise     = diferenciaR xs ys&lt;br /&gt;
  &lt;br /&gt;
diferenciaPR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaPR xs ys = foldr g [] xs&lt;br /&gt;
                   where g x recu | notElem x ys  = [x] ++ recu&lt;br /&gt;
                                  | otherwise     = recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
diferencia1 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia1 xs ys = [x | x &amp;lt;- xs, not (elem x ys) ] -- ++ [y | y &amp;lt;- ys, not (elem y xs) ]&lt;br /&gt;
&lt;br /&gt;
diferencia2 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia2 (x:xs) ys = filter f (x:xs)&lt;br /&gt;
                   where f a = not (elem a ys)&lt;br /&gt;
&lt;br /&gt;
diferencia3 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia3 [] _ = []&lt;br /&gt;
diferencia3 (x:xs) ys | not (elem x ys) = x : (diferencia3 xs ys)&lt;br /&gt;
                      | otherwise = (diferencia3 xs ys)&lt;br /&gt;
&lt;br /&gt;
diferencia4 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia4 (x:xs) ys = foldr f [] (x:xs)&lt;br /&gt;
                     where f prim recu | not (elem prim ys) = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primerosYultimos1 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos1 xss = ([head x | x &amp;lt;- xss, not (null x)], [last x | x &amp;lt;- xss, not (null x)]) &lt;br /&gt;
&lt;br /&gt;
noVacios :: Foldable t =&amp;gt; [t a] -&amp;gt; [t a]&lt;br /&gt;
noVacios xss = filter (not.null) xss&lt;br /&gt;
primerosYultimos2 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos2 xss = (map head (noVacios xss), map last (noVacios xss))&lt;br /&gt;
&lt;br /&gt;
primeros3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
primeros3 [] = []&lt;br /&gt;
primeros3 (xs:xss) | not (null xs) = (head xs) : (primeros3 xss)&lt;br /&gt;
                   | otherwise = (primeros3 xss)&lt;br /&gt;
ultimos3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
ultimos3 [] = []&lt;br /&gt;
ultimos3 (xs:xss) | not (null xs) = (last xs) : (ultimos3 xss)&lt;br /&gt;
                  | otherwise = (ultimos3 xss)&lt;br /&gt;
primerosYultimos3 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos3 xss = (primeros3 xss, ultimos3 xss )&lt;br /&gt;
&lt;br /&gt;
primeros4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]&lt;br /&gt;
primeros4 xss = foldr p4 [] xss&lt;br /&gt;
             where p4 prim recu | not (null prim) = head prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
ultimos4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]                                &lt;br /&gt;
ultimos4 xss = foldr u4 [] xss&lt;br /&gt;
             where u4 prim recu | not (null prim) = last prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
primerosYultimos4 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos4 xss = (primeros4 xss, ultimos4 xss)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primo1 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo1 x = [1,x]==[a| a&amp;lt;- [1..x], rem x a == 0] -- Me dice si un número es primo&lt;br /&gt;
hermanada1 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada1 xs = sum [1 | (a,b) &amp;lt;- (zip xs (tail xs)), (if ((a/=1) &amp;amp;&amp;amp; (b/=1))&lt;br /&gt;
                                                  then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo1 (gcd a b)))&lt;br /&gt;
                                                  else True),&lt;br /&gt;
                                                                                a&amp;gt;0, b&amp;gt;0 ] == (length xs) -1&lt;br /&gt;
          -- a,b &amp;gt; 0 porque tienen que ser extrictamente positivos&lt;br /&gt;
          -- ((length xs) - 1) == length (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
primo2 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo2 x = filter p2 [1..x] == [1,x]&lt;br /&gt;
         where p2 b = (rem x b == 0)&lt;br /&gt;
hermanada2 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada2 xs = and (map prop2 (zip xs (tail xs)))&lt;br /&gt;
           where prop2 (a,b) = if a&amp;gt;0 &amp;amp;&amp;amp; b&amp;gt;0&lt;br /&gt;
                               then (if ((a/=1) &amp;amp;&amp;amp; (b/=1)) then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo2 (gcd a b))) else True)&lt;br /&gt;
                               else False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primo3 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo3 n = noHayNumerosDivisoresDe n 2 (n - 1)&lt;br /&gt;
noHayNumerosDivisoresDe :: Integral t =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Bool&lt;br /&gt;
noHayNumerosDivisoresDe n minimo maximo   | minimo &amp;gt;= maximo  = True&lt;br /&gt;
                                          | rem n minimo == 0 = False&lt;br /&gt;
                                          | otherwise         = noHayNumerosDivisoresDe n (minimo + 1) maximo&lt;br /&gt;
hermanada3 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada3 [b] = True&lt;br /&gt;
hermanada3 (a:b:xs) = (if ((a/=1) &amp;amp;&amp;amp; (b/=1)) then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo2 (gcd a b))) else True)&lt;br /&gt;
                      &amp;amp;&amp;amp; hermanada3 (b:xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hermanada4 xs = undefined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
permanentes1 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes1 xs = [a | (a,b) &amp;lt;- (zip xs (init (tails xs))), a == maximum b ]&lt;br /&gt;
&lt;br /&gt;
permanentes2 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes2 xs = map head (filter p2 (init (tails xs)))&lt;br /&gt;
              where p2 (x:xs) = x == maximum (x:xs)&lt;br /&gt;
&lt;br /&gt;
comparacion3 :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
comparacion3 a [] = True&lt;br /&gt;
comparacion3 a b = a &amp;gt;= b &lt;br /&gt;
permanentes3 :: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes3 [] = []&lt;br /&gt;
permanentes3 (x:xs) | [x] `comparacion3` [maximum3 xs] = x : permanentes3 xs&lt;br /&gt;
                    | otherwise = permanentes3 xs&lt;br /&gt;
                 where maximum3 [] = if x &amp;lt; 0 then x else -x&lt;br /&gt;
                       maximum3 xs = maximum xs&lt;br /&gt;
&lt;br /&gt;
permanentes4:: [Int] -&amp;gt; [Int]&lt;br /&gt;
permanentes4 (x:xs) = foldr f4 [] (x:xs)&lt;br /&gt;
                    where f4 prim recu | [prim] `comparacion3` [maximum3 recu] = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
                          maximum3 [] = if x &amp;lt; 0 then x else -x&lt;br /&gt;
                          maximum3 xs = maximum xs&lt;br /&gt;
               &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=476</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=476"/>
		<updated>2021-11-27T17:03:25Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_9.hs (01 de diciembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (II)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- El siguiente módulo hay que instalarlo:&lt;br /&gt;
--cabal install Primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
resultadoPosC :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosC f xs = [x | x &amp;lt;- xs, f x &amp;gt; 0]&lt;br /&gt;
&lt;br /&gt;
resultadoPosS :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS f xs = filter g xs&lt;br /&gt;
                   where g x = f x &amp;gt; 0&lt;br /&gt;
resultadoPosS1 :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS1 f xs = filter (\ x -&amp;gt; f x &amp;gt; 0) xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosR f [] = []&lt;br /&gt;
resultadoPosR f (x:xs) | f x &amp;gt; 0    = x : resultadoPosR f xs&lt;br /&gt;
                       | otherwise  = resultadoPosR f xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosPR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosPR f xs = foldr g [] xs&lt;br /&gt;
                    where g prim recu | f prim &amp;gt; 0 = prim : recu&lt;br /&gt;
                                      | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
intercalaC :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaC y xs = concat [if x&amp;lt;y then [y,x] else [x] | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
intercalaS :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaS y xs = concat (map f xs)&lt;br /&gt;
                where f x = if x&amp;lt;y then [y,x] else [x]&lt;br /&gt;
&lt;br /&gt;
intercalaR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaR y [] = []&lt;br /&gt;
intercalaR y (x:xs) | x&amp;lt;y  = [y,x] ++ intercalaR y xs&lt;br /&gt;
                    | x&amp;gt;y  = [x] ++ intercalaR y xs&lt;br /&gt;
&lt;br /&gt;
intercalaPR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaPR y xs = foldr g [] xs&lt;br /&gt;
                 where g x recu | x&amp;lt;y  = [y,x] ++ recu&lt;br /&gt;
                                | x&amp;gt;y  = [x] ++ recu&lt;br /&gt;
&lt;br /&gt;
intercalaA :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaA y xs = aux [] xs&lt;br /&gt;
                where aux v [] = v&lt;br /&gt;
                      aux v (x:xs) | x&amp;lt;y        = aux (v++[y,x]) xs&lt;br /&gt;
                                   | otherwise  = aux (v++[x]) xs&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
dec2ent1 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent1 xs = read (concat [show x| x &amp;lt;- (sort xs)]) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent2 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent2 xs = read (concat (map show (sort xs))) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent3 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent3Aux :: Show a =&amp;gt; [a] -&amp;gt; [Char]&lt;br /&gt;
dec2ent3Aux [] = []&lt;br /&gt;
dec2ent3Aux (x:xs) = (show x) ++ (dec2ent3Aux xs)&lt;br /&gt;
dec2ent3 xs = read (dec2ent3Aux (sort xs)) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent4 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent4 xs = read (concat (foldr f [] (sort xs))) :: Integer&lt;br /&gt;
            where f prim recu = show prim :recu&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
dec2entC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entC xs = sum [x*10^i | (x,i) &amp;lt;- zip xs (reverse [0..length xs-1])]&lt;br /&gt;
&lt;br /&gt;
dec2entS :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS xs = sum (map f xs)&lt;br /&gt;
           where f x = x*10^(length (dropWhile (/=x) xs) -1)&lt;br /&gt;
&lt;br /&gt;
dec2entR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR [] = 0&lt;br /&gt;
dec2entR (x:xs) = x*10^(length xs) + dec2entR xs&lt;br /&gt;
&lt;br /&gt;
dec2entPR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entPR xs = foldr f 0 xs&lt;br /&gt;
             where f x recu = x*10^(length (dropWhile (/=x) xs) -1) + recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
diferenciaC :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaC xs ys = [x | x &amp;lt;- xs, notElem x ys]&lt;br /&gt;
  &lt;br /&gt;
diferenciaS :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaS xs ys = undefined &lt;br /&gt;
  &lt;br /&gt;
diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaR [] [] = []&lt;br /&gt;
diferenciaR [] ys = []&lt;br /&gt;
diferenciaR (x:xs) ys | notElem x ys  = [x] ++ diferenciaR xs ys&lt;br /&gt;
                      | otherwise     = diferenciaR xs ys&lt;br /&gt;
  &lt;br /&gt;
diferenciaPR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaPR xs ys = foldr g [] xs&lt;br /&gt;
                   where g x recu | notElem x ys  = [x] ++ recu&lt;br /&gt;
                                  | otherwise     = recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
diferencia1 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia1 xs ys = [x | x &amp;lt;- xs, not (elem x ys) ] -- ++ [y | y &amp;lt;- ys, not (elem y xs) ]&lt;br /&gt;
&lt;br /&gt;
diferencia2 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia2 (x:xs) ys = filter f (x:xs)&lt;br /&gt;
                   where f a = not (elem a ys)&lt;br /&gt;
&lt;br /&gt;
diferencia3 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia3 [] _ = []&lt;br /&gt;
diferencia3 (x:xs) ys | not (elem x ys) = x : (diferencia3 xs ys)&lt;br /&gt;
                      | otherwise = (diferencia3 xs ys)&lt;br /&gt;
&lt;br /&gt;
diferencia4 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia4 (x:xs) ys = foldr f [] (x:xs)&lt;br /&gt;
                     where f prim recu | not (elem prim ys) = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primerosYultimos1 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos1 xss = ([head x | x &amp;lt;- xss, not (null x)], [last x | x &amp;lt;- xss, not (null x)]) &lt;br /&gt;
&lt;br /&gt;
noVacios :: Foldable t =&amp;gt; [t a] -&amp;gt; [t a]&lt;br /&gt;
noVacios xss = filter (not.null) xss&lt;br /&gt;
primerosYultimos2 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos2 xss = (map head (noVacios xss), map last (noVacios xss))&lt;br /&gt;
&lt;br /&gt;
primeros3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
primeros3 [] = []&lt;br /&gt;
primeros3 (xs:xss) | not (null xs) = (head xs) : (primeros3 xss)&lt;br /&gt;
                   | otherwise = (primeros3 xss)&lt;br /&gt;
ultimos3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
ultimos3 [] = []&lt;br /&gt;
ultimos3 (xs:xss) | not (null xs) = (last xs) : (ultimos3 xss)&lt;br /&gt;
                  | otherwise = (ultimos3 xss)&lt;br /&gt;
primerosYultimos3 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos3 xss = (primeros3 xss, ultimos3 xss )&lt;br /&gt;
&lt;br /&gt;
primeros4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]&lt;br /&gt;
primeros4 xss = foldr p4 [] xss&lt;br /&gt;
             where p4 prim recu | not (null prim) = head prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
ultimos4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]                                &lt;br /&gt;
ultimos4 xss = foldr u4 [] xss&lt;br /&gt;
             where u4 prim recu | not (null prim) = last prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
primerosYultimos4 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos4 xss = (primeros4 xss, ultimos4 xss)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primo1 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo1 x = [1,x]==[a| a&amp;lt;- [1..x], rem x a == 0] -- Me dice si un número es primo&lt;br /&gt;
hermanada1 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada1 xs = sum [1 | (a,b) &amp;lt;- (zip xs (tail xs)), (if ((a/=1) &amp;amp;&amp;amp; (b/=1))&lt;br /&gt;
                                                  then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo1 (gcd a b)))&lt;br /&gt;
                                                  else True),&lt;br /&gt;
                                                                                a&amp;gt;0, b&amp;gt;0 ] == (length xs) -1&lt;br /&gt;
          -- a,b &amp;gt; 0 porque tienen que ser extrictamente positivos&lt;br /&gt;
          -- ((length xs) - 1) == length (zip xs (tail xs))&lt;br /&gt;
&lt;br /&gt;
primo2 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo2 x = filter p2 [1..x] == [1,x]&lt;br /&gt;
         where p2 b = (rem x b == 0)&lt;br /&gt;
hermanada2 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada2 xs = and (map prop2 (zip xs (tail xs)))&lt;br /&gt;
           where prop2 (a,b) = if a&amp;gt;0 &amp;amp;&amp;amp; b&amp;gt;0&lt;br /&gt;
                               then (if ((a/=1) &amp;amp;&amp;amp; (b/=1)) then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo2 (gcd a b))) else True)&lt;br /&gt;
                               else False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
primo3 :: Integral a =&amp;gt; a -&amp;gt; Bool&lt;br /&gt;
primo3 n = noHayNumerosDivisoresDe n 2 (n - 1)&lt;br /&gt;
noHayNumerosDivisoresDe :: Integral t =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Bool&lt;br /&gt;
noHayNumerosDivisoresDe n minimo maximo   | minimo &amp;gt;= maximo  = True&lt;br /&gt;
                                          | rem n minimo == 0 = False&lt;br /&gt;
                                          | otherwise         = noHayNumerosDivisoresDe n (minimo + 1) maximo&lt;br /&gt;
hermanada3 :: [Int] -&amp;gt; Bool&lt;br /&gt;
hermanada3 [b] = True&lt;br /&gt;
hermanada3 (a:b:xs) = (if ((a/=1) &amp;amp;&amp;amp; (b/=1)) then ((gcd a b /= 1) &amp;amp;&amp;amp; (primo2 (gcd a b))) else True)&lt;br /&gt;
                      &amp;amp;&amp;amp; hermanada3 (b:xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hermanada4 xs = undefined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
               &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=475</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=475"/>
		<updated>2021-11-27T13:52:33Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_9.hs (01 de diciembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (II)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- El siguiente módulo hay que instalarlo:&lt;br /&gt;
--cabal install Primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
resultadoPosC :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosC f xs = [x | x &amp;lt;- xs, f x &amp;gt; 0]&lt;br /&gt;
&lt;br /&gt;
resultadoPosS :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS f xs = filter g xs&lt;br /&gt;
                   where g x = f x &amp;gt; 0&lt;br /&gt;
resultadoPosS1 :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS1 f xs = filter (\ x -&amp;gt; f x &amp;gt; 0) xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosR f [] = []&lt;br /&gt;
resultadoPosR f (x:xs) | f x &amp;gt; 0    = x : resultadoPosR f xs&lt;br /&gt;
                       | otherwise  = resultadoPosR f xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosPR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosPR f xs = foldr g [] xs&lt;br /&gt;
                    where g prim recu | f prim &amp;gt; 0 = prim : recu&lt;br /&gt;
                                      | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
intercalaC :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaC y xs = concat [if x&amp;lt;y then [y,x] else [x] | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
intercalaS :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaS y xs = concat (map f xs)&lt;br /&gt;
                where f x = if x&amp;lt;y then [y,x] else [x]&lt;br /&gt;
&lt;br /&gt;
intercalaR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaR y [] = []&lt;br /&gt;
intercalaR y (x:xs) | x&amp;lt;y  = [y,x] ++ intercalaR y xs&lt;br /&gt;
                    | x&amp;gt;y  = [x] ++ intercalaR y xs&lt;br /&gt;
&lt;br /&gt;
intercalaPR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaPR y xs = foldr g [] xs&lt;br /&gt;
                 where g x recu | x&amp;lt;y  = [y,x] ++ recu&lt;br /&gt;
                                | x&amp;gt;y  = [x] ++ recu&lt;br /&gt;
&lt;br /&gt;
intercalaA :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaA y xs = aux [] xs&lt;br /&gt;
                where aux v [] = v&lt;br /&gt;
                      aux v (x:xs) | x&amp;lt;y        = aux (v++[y,x]) xs&lt;br /&gt;
                                   | otherwise  = aux (v++[x]) xs&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
dec2ent1 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent1 xs = read (concat [show x| x &amp;lt;- (sort xs)]) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent2 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent2 xs = read (concat (map show (sort xs))) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent3 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent3Aux :: Show a =&amp;gt; [a] -&amp;gt; [Char]&lt;br /&gt;
dec2ent3Aux [] = []&lt;br /&gt;
dec2ent3Aux (x:xs) = (show x) ++ (dec2ent3Aux xs)&lt;br /&gt;
dec2ent3 xs = read (dec2ent3Aux (sort xs)) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent4 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent4 xs = read (concat (foldr f [] (sort xs))) :: Integer&lt;br /&gt;
            where f prim recu = show prim :recu&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
dec2entC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entC xs = sum [x*10^i | (x,i) &amp;lt;- zip xs (reverse [0..length xs-1])]&lt;br /&gt;
&lt;br /&gt;
dec2entS :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS xs = sum (map f xs)&lt;br /&gt;
           where f x = x*10^(length (dropWhile (/=x) xs) -1)&lt;br /&gt;
&lt;br /&gt;
dec2entR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR [] = 0&lt;br /&gt;
dec2entR (x:xs) = x*10^(length xs) + dec2entR xs&lt;br /&gt;
&lt;br /&gt;
dec2entPR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entPR xs = foldr f 0 xs&lt;br /&gt;
             where f x recu = x*10^(length (dropWhile (/=x) xs) -1) + recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
diferenciaC :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaC xs ys = [x | x &amp;lt;- xs, notElem x ys]&lt;br /&gt;
  &lt;br /&gt;
diferenciaS :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaS xs ys = undefined &lt;br /&gt;
  &lt;br /&gt;
diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaR [] [] = []&lt;br /&gt;
diferenciaR [] ys = []&lt;br /&gt;
diferenciaR (x:xs) ys | notElem x ys  = [x] ++ diferenciaR xs ys&lt;br /&gt;
                      | otherwise     = diferenciaR xs ys&lt;br /&gt;
  &lt;br /&gt;
diferenciaPR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaPR xs ys = foldr g [] xs&lt;br /&gt;
                   where g x recu | notElem x ys  = [x] ++ recu&lt;br /&gt;
                                  | otherwise     = recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
diferencia1 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia1 xs ys = [x | x &amp;lt;- xs, not (elem x ys) ] -- ++ [y | y &amp;lt;- ys, not (elem y xs) ]&lt;br /&gt;
&lt;br /&gt;
diferencia2 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia2 (x:xs) ys = filter f (x:xs)&lt;br /&gt;
                   where f a = not (elem a ys)&lt;br /&gt;
&lt;br /&gt;
diferencia3 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia3 [] _ = []&lt;br /&gt;
diferencia3 (x:xs) ys | not (elem x ys) = x : (diferencia3 xs ys)&lt;br /&gt;
                      | otherwise = (diferencia3 xs ys)&lt;br /&gt;
&lt;br /&gt;
diferencia4 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia4 (x:xs) ys = foldr f [] (x:xs)&lt;br /&gt;
                     where f prim recu | not (elem prim ys) = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
primerosYultimos1 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos1 xss = ([head x | x &amp;lt;- xss, not (null x)], [last x | x &amp;lt;- xss, not (null x)]) &lt;br /&gt;
&lt;br /&gt;
noVacios :: Foldable t =&amp;gt; [t a] -&amp;gt; [t a]&lt;br /&gt;
noVacios xss = filter (not.null) xss&lt;br /&gt;
primerosYultimos2 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos2 xss = (map head (noVacios xss), map last (noVacios xss))&lt;br /&gt;
&lt;br /&gt;
primeros3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
primeros3 [] = []&lt;br /&gt;
primeros3 (xs:xss) | not (null xs) = (head xs) : (primeros3 xss)&lt;br /&gt;
                   | otherwise = (primeros3 xss)&lt;br /&gt;
ultimos3 :: [[a]] -&amp;gt; [a]&lt;br /&gt;
ultimos3 [] = []&lt;br /&gt;
ultimos3 (xs:xss) | not (null xs) = (last xs) : (ultimos3 xss)&lt;br /&gt;
                  | otherwise = (ultimos3 xss)&lt;br /&gt;
primerosYultimos3 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos3 xss = (primeros3 xss, ultimos3 xss )&lt;br /&gt;
&lt;br /&gt;
primeros4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]&lt;br /&gt;
primeros4 xss = foldr p4 [] xss&lt;br /&gt;
             where p4 prim recu | not (null prim) = head prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
ultimos4 :: Foldable t =&amp;gt; t [a] -&amp;gt; [a]                                &lt;br /&gt;
ultimos4 xss = foldr u4 [] xss&lt;br /&gt;
             where u4 prim recu | not (null prim) = last prim : recu&lt;br /&gt;
                                | otherwise = recu&lt;br /&gt;
primerosYultimos4 :: [[a]] -&amp;gt; ([a], [a])&lt;br /&gt;
primerosYultimos4 xss = (primeros4 xss, ultimos4 xss)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
               &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=474</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=474"/>
		<updated>2021-11-27T13:02:12Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_9.hs (01 de diciembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (II)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- El siguiente módulo hay que instalarlo:&lt;br /&gt;
--cabal install Primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
resultadoPosC :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosC f xs = [x | x &amp;lt;- xs, f x &amp;gt; 0]&lt;br /&gt;
&lt;br /&gt;
resultadoPosS :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS f xs = filter g xs&lt;br /&gt;
                   where g x = f x &amp;gt; 0&lt;br /&gt;
resultadoPosS1 :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosS1 f xs = filter (\ x -&amp;gt; f x &amp;gt; 0) xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosR f [] = []&lt;br /&gt;
resultadoPosR f (x:xs) | f x &amp;gt; 0    = x : resultadoPosR f xs&lt;br /&gt;
                       | otherwise  = resultadoPosR f xs&lt;br /&gt;
&lt;br /&gt;
resultadoPosPR :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
resultadoPosPR f xs = foldr g [] xs&lt;br /&gt;
                    where g prim recu | f prim &amp;gt; 0 = prim : recu&lt;br /&gt;
                                      | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
intercalaC :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaC y xs = concat [if x&amp;lt;y then [y,x] else [x] | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
intercalaS :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaS y xs = concat (map f xs)&lt;br /&gt;
                where f x = if x&amp;lt;y then [y,x] else [x]&lt;br /&gt;
&lt;br /&gt;
intercalaR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaR y [] = []&lt;br /&gt;
intercalaR y (x:xs) | x&amp;lt;y  = [y,x] ++ intercalaR y xs&lt;br /&gt;
                    | x&amp;gt;y  = [x] ++ intercalaR y xs&lt;br /&gt;
&lt;br /&gt;
intercalaPR :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaPR y xs = foldr g [] xs&lt;br /&gt;
                 where g x recu | x&amp;lt;y  = [y,x] ++ recu&lt;br /&gt;
                                | x&amp;gt;y  = [x] ++ recu&lt;br /&gt;
&lt;br /&gt;
intercalaA :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
intercalaA y xs = aux [] xs&lt;br /&gt;
                where aux v [] = v&lt;br /&gt;
                      aux v (x:xs) | x&amp;lt;y        = aux (v++[y,x]) xs&lt;br /&gt;
                                   | otherwise  = aux (v++[x]) xs&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
dec2ent1 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent1 xs = read (concat [show x| x &amp;lt;- (sort xs)]) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent2 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent2 xs = read (concat (map show (sort xs))) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent3 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent3Aux :: Show a =&amp;gt; [a] -&amp;gt; [Char]&lt;br /&gt;
dec2ent3Aux [] = []&lt;br /&gt;
dec2ent3Aux (x:xs) = (show x) ++ (dec2ent3Aux xs)&lt;br /&gt;
dec2ent3 xs = read (dec2ent3Aux (sort xs)) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent4 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent4 xs = read (concat (foldr f [] (sort xs))) :: Integer&lt;br /&gt;
            where f prim recu = show prim :recu&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
dec2entC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entC xs = sum [x*10^i | (x,i) &amp;lt;- zip xs (reverse [0..length xs-1])]&lt;br /&gt;
&lt;br /&gt;
dec2entS :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entS xs = sum (map f xs)&lt;br /&gt;
           where f x = x*10^(length (dropWhile (/=x) xs) -1)&lt;br /&gt;
&lt;br /&gt;
dec2entR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entR [] = 0&lt;br /&gt;
dec2entR (x:xs) = x*10^(length xs) + dec2entR xs&lt;br /&gt;
&lt;br /&gt;
dec2entPR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2entPR xs = foldr f 0 xs&lt;br /&gt;
             where f x recu = x*10^(length (dropWhile (/=x) xs) -1) + recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
diferenciaC :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaC xs ys = [x | x &amp;lt;- xs, notElem x ys]&lt;br /&gt;
  &lt;br /&gt;
diferenciaS :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaS xs ys = undefined &lt;br /&gt;
  &lt;br /&gt;
diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaR [] [] = []&lt;br /&gt;
diferenciaR [] ys = []&lt;br /&gt;
diferenciaR (x:xs) ys | notElem x ys  = [x] ++ diferenciaR xs ys&lt;br /&gt;
                      | otherwise     = diferenciaR xs ys&lt;br /&gt;
  &lt;br /&gt;
diferenciaPR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaPR xs ys = foldr g [] xs&lt;br /&gt;
                   where g x recu | notElem x ys  = [x] ++ recu&lt;br /&gt;
                                  | otherwise     = recu&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
diferencia1 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia1 xs ys = [x | x &amp;lt;- xs, not (elem x ys) ] -- ++ [y | y &amp;lt;- ys, not (elem y xs) ]&lt;br /&gt;
&lt;br /&gt;
diferencia2 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia2 (x:xs) ys = filter f (x:xs)&lt;br /&gt;
                   where f a = not (elem a ys)&lt;br /&gt;
&lt;br /&gt;
diferencia3 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia3 [] _ = []&lt;br /&gt;
diferencia3 (x:xs) ys | not (elem x ys) = x : (diferencia3 xs ys)&lt;br /&gt;
                      | otherwise = (diferencia3 xs ys)&lt;br /&gt;
&lt;br /&gt;
diferencia4 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia4 (x:xs) ys = foldr f [] (x:xs)&lt;br /&gt;
                     where f prim recu | not (elem prim ys) = prim : recu&lt;br /&gt;
                                       | otherwise = recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
               &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=470</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=470"/>
		<updated>2021-11-26T09:04:50Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_9.hs (01 de diciembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados (II)&lt;br /&gt;
-- Departamento de Ciencias de la Computación e Inteligencia Artificial&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
-- Librerías auxiliares&lt;br /&gt;
-- ============================================================================&lt;br /&gt;
import Data.Char&lt;br /&gt;
import Data.List&lt;br /&gt;
-- El siguiente módulo hay que instalarlo:&lt;br /&gt;
--cabal install Primes&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Se considera la función&lt;br /&gt;
--      resultadoPos :: (a -&amp;gt; Integer) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (resultadoPos f xs) es la lista de los elementos de la lista&lt;br /&gt;
-- xs tales que el valor de la función f sobre ellos es positivo. Por ejemplo,&lt;br /&gt;
--   resultadoPos head [[-1,2],[-9,4],[2,3]]       ==  [[2,3]]&lt;br /&gt;
--   resultadoPos sum [[1,2],[9],[-8,3],[],[3,5]]  ==  [[1,2],[9],[3,5]]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...),&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- -----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Se considera la función&lt;br /&gt;
--     intercala :: Int -&amp;gt; [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (intercala y xs) es la lista que resulta de intercalar el elemento&lt;br /&gt;
-- y delante de todos los elementos de la lista xs que sean menores que y.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--   intercala 5 [1,2,6,3,7,9]  ==  [5,1,5,2,6,5,3,7,9]&lt;br /&gt;
--   intercala 5 [6,7,9,8]      ==  [6,7,9,8]&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Se considera la función&lt;br /&gt;
--    dec2ent :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (dec2ent xs) es el número entero cuyas cifras ordenadas son los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo,&lt;br /&gt;
--   dec2ent [2,3,4,5]  ==  2345&lt;br /&gt;
--   dec2ent [1..9]     ==  123456789&lt;br /&gt;
--&lt;br /&gt;
-- Defie esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
dec2ent1 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent1 xs = read (concat [show x| x &amp;lt;- (sort xs)]) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent2 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent2 xs = read (concat (map show (sort xs))) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent3 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent3Aux :: Show a =&amp;gt; [a] -&amp;gt; [Char]&lt;br /&gt;
dec2ent3Aux [] = []&lt;br /&gt;
dec2ent3Aux (x:xs) = (show x) ++ (dec2ent3Aux xs)&lt;br /&gt;
dec2ent3 xs = read (dec2ent3Aux (sort xs)) :: Integer&lt;br /&gt;
&lt;br /&gt;
dec2ent4 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
dec2ent4 xs = read (concat (foldr f [] (sort xs))) :: Integer&lt;br /&gt;
            where f prim recu = show prim :recu&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Se considera la función&lt;br /&gt;
--     diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, el conjunto de los elementos de la lista xs que no se&lt;br /&gt;
-- encuentran en la lista ys. Por ejemplo,&lt;br /&gt;
--   diferencia [2,3,5,6] [5,2,7]  ==  [3,6]&lt;br /&gt;
--   diferencia [1,3,5,7] [2,4,6]  ==  [1,3,5,7]&lt;br /&gt;
--   diferencia [1,3] [1..9]       ==  []&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Se considera la función&lt;br /&gt;
--   primerosYultimos :: [[a]] -&amp;gt; ([a],[a])&lt;br /&gt;
-- tal que (primerosYultimos xss) es el par formado por la lista de los&lt;br /&gt;
-- primeros elementos de las listas no vacías de xss y la lista de los&lt;br /&gt;
-- últimos elementos de las listas no vacías de xss. Por ejemplo,&lt;br /&gt;
--   primerosYultimos [[1,2],[5,3,4],[],[9]]  ==  ([1,5,9],[2,4,9])&lt;br /&gt;
--   primerosYultimos [[1,2],[1,2,3],[1..4]]  ==  ([1,1,1],[2,3,4])&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Define esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Una lista hermanada es una lista de números estrictamente&lt;br /&gt;
-- positivos en la que cada elemento tiene algún factor primo en común con el&lt;br /&gt;
-- siguiente, en caso de que exista, o alguno de los dos es un 1. Por ejemplo,&lt;br /&gt;
-- [2,6,3,9,1,5] es una lista hermanada.&lt;br /&gt;
&lt;br /&gt;
-- Se considera la función&lt;br /&gt;
--    hermanada :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (hermanada xs) comprueba que la lista xs es hermanada según la&lt;br /&gt;
-- definición anterior. Por ejemplo,&lt;br /&gt;
--    hermanada [2,6,3,9,1,5]  ==  True&lt;br /&gt;
--    hermanada [2,3,5]        ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;gcd&amp;#039;&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un elemento de una lista es permanente si ninguno de los que&lt;br /&gt;
-- vienen a continuación en la lista es mayor que él. Consideramos la función&lt;br /&gt;
--   permanentes :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (permanentes xs) es la lista de los elementos permanentes de la&lt;br /&gt;
-- lista xs. Por ejemplo,&lt;br /&gt;
--   permanentes [80,1,7,8,4]  ==  [80,8,4]&lt;br /&gt;
&lt;br /&gt;
-- Se pide definir esta función&lt;br /&gt;
-- 1) por comprensión,&lt;br /&gt;
-- 2) por orden superior (map, filter, ...)&lt;br /&gt;
-- 3) por recursión,&lt;br /&gt;
-- 4) por plegado (con &amp;#039;foldr&amp;#039;).&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Nota: Usa la función &amp;#039;tails&amp;#039; de Data.List.&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
               &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Un número entero positivo n es muy primo si es n primo&lt;br /&gt;
-- y todos los números que resultan de ir suprimimiendo la última cifra&lt;br /&gt;
-- también son primos. Por ejemplo, 7193 es muy primo pues los números&lt;br /&gt;
-- 7193, 719, 71 y 7 son todos primos. &lt;br /&gt;
-- &lt;br /&gt;
-- Define la función &lt;br /&gt;
--    muyPrimo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- que (muyPrimo n) se verifica si n es muy primo. Por ejemplo,&lt;br /&gt;
--    muyPrimo 7193  == True&lt;br /&gt;
--    muyPrimo 71932 == False&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- ¿Cuántos números de cinco cifras son muy primos?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8&amp;diff=469</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8&amp;diff=469"/>
		<updated>2021-11-26T08:00:42Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_8.hs (24 de noviembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados.&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;
-- Esta relación tiene contiene ejercicios con funciones de orden&lt;br /&gt;
-- superior y definiciones por plegado correspondientes al tema 7 &lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-7.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&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;
--    segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos&lt;br /&gt;
-- elementos verifican la propiedad p. Por ejemplo,&lt;br /&gt;
--    segmentos even [1,2,0,4,9,6,4,5,7,2]  ==  [[2,0,4],[6,4],[2]]&lt;br /&gt;
--    segmentos odd  [1,2,0,4,9,6,4,5,7,2]  ==  [[1],[9],[5,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
segmentos1 :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos1 p [] = []&lt;br /&gt;
segmentos1 p (x:xs) | p x = [a] ++ segmentos1 p (dropWhile p (x:xs)) &lt;br /&gt;
                    | otherwise = segmentos1 p xs&lt;br /&gt;
                    where a = takeWhile p (x:xs) &lt;br /&gt;
segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos p [] = []&lt;br /&gt;
segmentos p (x:xs) &lt;br /&gt;
    | p x =  (takeWhile p (x:xs)) : segmentos p (dropWhile p (x:xs)) &lt;br /&gt;
    | otherwise = segmentos p (dropWhile (not.p) xs)&lt;br /&gt;
                 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir, por comprensión, la función&lt;br /&gt;
--    relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosC r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández&lt;br /&gt;
relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC r xs = and [r a b | (a,b) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
--José Manuel García&lt;br /&gt;
relacionadosC1 :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC1 r xs = (length [1 | (a,b) &amp;lt;- (zip xs (tail xs)), a `r` b]) ==&lt;br /&gt;
                     (length (zip xs (tail xs)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir, por recursión, la función&lt;br /&gt;
--    relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosR r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosR (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR r [] = True&lt;br /&gt;
relacionadosR r [x] = True&lt;br /&gt;
relacionadosR r (x:y:zs) = (r x y) &amp;amp;&amp;amp; relacionadosR r (y:zs)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR r [x1,x2] = x1 `r` x2&lt;br /&gt;
relacionadosR r (x1:x2:xs) = (x1 `r`x2) &amp;amp;&amp;amp; (relacionadosR r (x2:xs))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupa xss) es la lista de las listas obtenidas agrupando&lt;br /&gt;
-- los primeros elementos, los segundos, ... Por ejemplo, &lt;br /&gt;
--    agrupa [[1..6],[7..9],[10..20]]  ==  [[1,7,10],[2,8,11],[3,9,12]]&lt;br /&gt;
--    agrupa []                        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
agrupa [] = []&lt;br /&gt;
agrupa xss | any null xss =  []&lt;br /&gt;
           | otherwise =[map head xss] ++ agrupa (map tail xss) &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickChek que la longitud de todos los&lt;br /&gt;
-- elementos de (agrupa xs) es igual a la longitud de xs.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_agrupa :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_agrupa xss = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir, por recursión, la función &lt;br /&gt;
--    concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatR xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatR [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández&lt;br /&gt;
concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatR [] = []&lt;br /&gt;
concatR (x:xs) = x ++ concatR xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por comprensión, la función&lt;br /&gt;
--    filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaC f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaC (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández&lt;br /&gt;
filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaC f p xs = [f x | x &amp;lt;- xs, p x]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, usando map y filter, la función&lt;br /&gt;
--    filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaMF f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaMF (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández&lt;br /&gt;
filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaMF f p xs = map f (filter p xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir, por recursión, la función&lt;br /&gt;
--    filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaR f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaR (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaR f p [] = []&lt;br /&gt;
filtraAplicaR f p (x:xs) | p x        = [f x] ++ filtraAplicaR f p xs&lt;br /&gt;
                         | (not.p) x  = filtraAplicaR f p xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Definir, mediante recursión, la función&lt;br /&gt;
--    maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumR [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumR [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumR [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumR es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR [x] = x&lt;br /&gt;
maximumR (x:xs) = max x (maximumR xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función de plegado foldr1 está definida por &lt;br /&gt;
--    foldr1 :: (a -&amp;gt; a -&amp;gt; a) -&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
--    foldr1 _ [x]    =  x&lt;br /&gt;
--    foldr1 f (x:xs) =  f x (foldr1 f xs)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir, mediante plegado con foldr1, la función&lt;br /&gt;
--    maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumP [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumP [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumP [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumP es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumP = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir, usando foldr, la función &lt;br /&gt;
--    concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatP xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatP [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatP = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que la funciones concatR,&lt;br /&gt;
-- concatP y concat son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_concat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_concat xss = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que la longitud de &lt;br /&gt;
-- (concatP xss) es la suma de las longitudes de los elementos de xss.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_longConcat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_longConcat xss = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir, por plegado, la función&lt;br /&gt;
--    filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaP f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaP (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaP f p = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, con la función all, la función&lt;br /&gt;
--    relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosA r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosA (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosA :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosA = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, con la función foldr, la función&lt;br /&gt;
--    relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosP r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosP (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
relacionadosP :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosP = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. (Basado en el ejercicio 4 del primer parcial del&lt;br /&gt;
-- grupo E de 2017)&lt;br /&gt;
-- Una lista se dirá muy creciente si cada elemento es mayor estricto&lt;br /&gt;
-- que el triple del siguiente. &lt;br /&gt;
-- Empleando tan solo (relacionadosA p xs), define el predicado &lt;br /&gt;
--          muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
-- tal que (muyCreciente xs) se verifica si xs es muy creciente. Por&lt;br /&gt;
-- ejemplo:&lt;br /&gt;
-- muyCreciente [1,5,23,115]  == True&lt;br /&gt;
-- muyCreciente [1,2,7,14]    == False&lt;br /&gt;
-- muyCreciente [7]           == True&lt;br /&gt;
-- muyCreciente []            == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
muyCreciente :: [Integer] -&amp;gt; Bool&lt;br /&gt;
muyCreciente xs = undefined&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_7&amp;diff=425</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_7&amp;diff=425"/>
		<updated>2021-11-17T09:24:58Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_7.hs &lt;br /&gt;
-- Definiciones por recursión y por comprensión &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;
-- Esta relación es de repaso y servirá para seguir practicando los&lt;br /&gt;
-- conceptos de recursión y comprensión&lt;br /&gt;
-- En esta relación se presentan ejercicios con dos definiciones (una&lt;br /&gt;
-- por recursión y otra por comprensión) y la comprobación de la&lt;br /&gt;
-- equivalencia de las dos definiciones con QuickCheck. Los ejercicios&lt;br /&gt;
-- corresponden a los temas 5 y 6 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Operaciones conjuntistas sobre listas.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Definir, por comprensión, la función&lt;br /&gt;
--    subconjunto :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (subconjunto xs ys) se verifica si xs es un subconjunto de&lt;br /&gt;
-- ys; es decir, si todos los elementos de xs pertenecen a ys. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    subconjunto [3,2,3] [2,5,3,5]  ==  True&lt;br /&gt;
--    subconjunto [3,2,3] [2,5,6,5]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Lucía González , Adolfo Sagrera&lt;br /&gt;
subconjunto :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
subconjunto xs ys = and [elem x ys | x&amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- Sara Cerro&lt;br /&gt;
subconjunto :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
subconjunto xs ys = length [ x | x &amp;lt;- xs, elem x ys] == length xs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir, por recursión, la función&lt;br /&gt;
--    subconjuntoR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (subconjuntoR xs ys) se verifica si xs es un subconjunto de&lt;br /&gt;
-- ys; es decir, si todos los elementos de xs pertenecen a ys. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    subconjuntoR [3,2,3] [2,5,3,5]  ==  True&lt;br /&gt;
--    subconjuntoR [3,2,3] [2,5,6,5]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Adolfo Sagrera Vivancos, Lucía González Guillén&lt;br /&gt;
subconjuntoR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
subconjuntoR [] _ = True&lt;br /&gt;
subconjuntoR (x:xs) ys | elem x ys = subconjuntoR xs ys&lt;br /&gt;
                       | otherwise = False&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Comprobar con QuickCheck que las definiciones&lt;br /&gt;
-- subconjunto y subconjuntoR son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_subconjuntoR :: [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_subconjuntoR xs ys = (subconjunto xs ys) == (subconjuntoR xs ys)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_subconjuntoR&lt;br /&gt;
-- +++ OK, passed 100 tests&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.4. Definir, mediante all, la función &lt;br /&gt;
--    subconjuntoA :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (subconjuntoA xs ys) se verifica si xs es un subconjunto de&lt;br /&gt;
-- ys. Por ejemplo,&lt;br /&gt;
--    subconjuntoA [1,3,2,3] [1,2,3]  ==  True&lt;br /&gt;
--    subconjuntoA [1,3,4,3] [1,2,3]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
subconjuntoA :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
subconjuntoA = undefined&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.5. Comprobar con QuickCheck que las funciones subconjunto&lt;br /&gt;
-- y subconjuntoA son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_subconjuntoA :: [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_subconjuntoA = undefined&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función&lt;br /&gt;
--    iguales :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (iguales xs ys) se verifica si xs e ys son iguales; es decir,&lt;br /&gt;
-- tienen los mismos elementos. Por ejemplo, &lt;br /&gt;
--    iguales [3,2,3] [2,3]    ==  True&lt;br /&gt;
--    iguales [3,2,3] [2,3,2]  ==  True&lt;br /&gt;
--    iguales [3,2,3] [2,3,4]  ==  False&lt;br /&gt;
--    iguales [2,3] [4,5]      ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
iguales :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
iguales xs ys = subconjuntoR xs ys &amp;amp;&amp;amp; subconjuntoR ys xs&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González&lt;br /&gt;
iguales1 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
iguales1 xs ys = and [ elem x ys &amp;amp;&amp;amp; elem y xs | x &amp;lt;- xs, y &amp;lt;- ys]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir, por comprensión, la función&lt;br /&gt;
--    union :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (union xs ys) es la unión de los conjuntos xs e ys. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    union [3,2,5] [5,7,3,4]  ==  [3,2,5,7,4]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
union1 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
union1 xs ys = [x | x&amp;lt;- nub(xs++ys)]&lt;br /&gt;
-- &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir, por comprensión, la función&lt;br /&gt;
--    unionR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (unionR xs ys) es la unión de los conjuntos xs e ys. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    unionR [3,2,5] [5,7,3,4]  ==  [2,5,7,3,4]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
unionR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
unionR [] xs = nub xs&lt;br /&gt;
unionR xs [] = nub xs&lt;br /&gt;
unionR (x:xs) ys | not(elem x ys) = x: unionR xs ys&lt;br /&gt;
                 | otherwise = unionR xs ys&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Comprobar con QuickCheck que union y unionR son&lt;br /&gt;
-- equivalentes. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_union :: [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_union xs ys  = (union1 xs ys == unionR xs ys) ||&lt;br /&gt;
                    (iguales (union1 xs ys) (unionR xs ys))&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Comprobar con QuickCheck que la unión es conmutativa.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_union_conmutativa :: [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_union_conmutativa xs ys =(union1 xs ys == union1 ys xs) ||&lt;br /&gt;
                    (iguales (union1 xs ys) (union1 ys xs))&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por comprensión, la función&lt;br /&gt;
--    interseccion :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (interseccion xs ys) es la intersección de xs e ys. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    interseccion [3,2,5] [5,7,3,4]  ==  [3,5]&lt;br /&gt;
--    interseccion [3,2,5] [9,7,6,4]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
interseccion :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccion xs ys  = [ x | x&amp;lt;- xs, elem x ys]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, por recursión, la función&lt;br /&gt;
--    interseccionR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (interseccionR xs ys) es la intersección de xs e ys. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    interseccionR [3,2,5] [5,7,3,4]  ==  [3,5]&lt;br /&gt;
--    interseccionR [3,2,5] [9,7,6,4]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
interseccionR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccionR [] _ = []&lt;br /&gt;
interseccionR _ [] = []&lt;br /&gt;
interseccionR (x:xs) ys | elem x ys = x : interseccionR xs ys&lt;br /&gt;
                        | otherwise = interseccionR xs ys&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Comprobar con QuickCheck que interseccion e&lt;br /&gt;
-- interseccionR son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_interseccion :: [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_interseccion xs ys = interseccion xs ys == interseccionR xs ys&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Comprobar con QuickCheck si se cumple la siguiente&lt;br /&gt;
-- propiedad &lt;br /&gt;
--    A ∪ (B ∩ C) = (A ∪ B) ∩ C&lt;br /&gt;
-- donde se considera la igualdad como conjuntos. En el caso de que no&lt;br /&gt;
-- se cumpla verificar el contraejemplo calculado por QuickCheck.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
prop_union_interseccion :: [Int] -&amp;gt; [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_union_interseccion xs ys zs = union1 xs (interseccion ys zs) == interseccion (union xs ys) zs&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir, por comprensión, la función&lt;br /&gt;
--    diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferencia xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, la lista de los elementos que sólo pertenecen a xs. Por&lt;br /&gt;
-- ejemplo,  &lt;br /&gt;
--    diferencia [3,2,5,6] [5,7,3,4]  ==  [2,6]&lt;br /&gt;
--    diferencia [3,2,5] [5,7,3,2]    ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
diferencia :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferencia xs ys = [x | x&amp;lt;-xs, not(elem x ys)] &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Definir, por recursión, la función&lt;br /&gt;
--    diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (diferenciaR xs ys) es la diferencia entre los conjuntos xs e&lt;br /&gt;
-- ys; es decir, la lista de los elementos que sólo pertenecen a xs. Por&lt;br /&gt;
-- ejemplo,  &lt;br /&gt;
--    diferenciaR [3,2,5,6] [5,7,3,4]  ==  [2,6]&lt;br /&gt;
--    diferenciaR [3,2,5] [5,7,3,2]    ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
diferenciaR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
diferenciaR xs [] = xs&lt;br /&gt;
diferenciaR [] _ = []&lt;br /&gt;
diferenciaR (x:xs) ys | not(elem x ys) = x: diferenciaR xs ys&lt;br /&gt;
                      | otherwise = diferenciaR xs ys&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que diferencia y diferenciaR &lt;br /&gt;
-- son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_diferencia :: [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_diferencia xs ys = diferenciaR xs ys == diferencia xs ys&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Comprobar con QuickCheck si la diferencia es&lt;br /&gt;
-- conmutativa. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
&lt;br /&gt;
prop_diferencia_conmutativa :: [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_diferencia_conmutativa xs ys = diferenciaR xs ys == diferenciaR ys xs&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_diferencia_conmutativa&lt;br /&gt;
-- *** Failed! Falsifiable (after 2 tests and 1 shrink):&lt;br /&gt;
-- []&lt;br /&gt;
-- [0]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Comprobar con QuickCheck si se cumple la siguiente&lt;br /&gt;
-- propiedad: A \ B ⊂ A&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_diferencia_subconjunto :: [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_diferencia_subconjunto = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Comprobar con QuickCheck si se cumple la siguiente&lt;br /&gt;
-- propiedad: (A \ B) ∩ B = ∅.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_diferencia_interseccion :: [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_diferencia_interseccion = undefined&lt;br /&gt;
                &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.1. Definir, por comprensión, la función&lt;br /&gt;
--    producto :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [(a,a)]&lt;br /&gt;
-- tal que (producto xs ys) es el producto cartesiano de xs e ys. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--   producto [1,3] [2,4] == [(1,2),(1,4),(3,2),(3,4)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
producto :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [(a,a)]&lt;br /&gt;
producto xs ys = [(a,b) | (a,b) &amp;lt;- zip xs ys ++ zip xs ys&amp;#039;]&lt;br /&gt;
                where ys&amp;#039; = reverse ys&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.2. Definir, por recursión, la función&lt;br /&gt;
--    productoR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [(a,a)]&lt;br /&gt;
-- tal que (productoR xs ys) es el producto cartesiano de xs e ys. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--   productoR [1,3] [2,4] == [(1,2),(1,4),(3,2),(3,4)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
productoR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [(a,a)]&lt;br /&gt;
productoR [] _ = []&lt;br /&gt;
productoR _ [] = []&lt;br /&gt;
productoR (x:xs) (y:ys) = (x,y): productoR xs (y:ys)&lt;br /&gt;
--Adriana Gordillo &lt;br /&gt;
productoR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [(a,a)]&lt;br /&gt;
productoR _ [] = []&lt;br /&gt;
productoR [] _ = []&lt;br /&gt;
productoR (x:xs) ys = zip (take (length ys) (repeat x) ) ys ++ productoR xs ys&lt;br /&gt;
&lt;br /&gt;
--Fernando Ruiz Mazo&lt;br /&gt;
productoR&amp;#039;&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [(a,a)]&lt;br /&gt;
productoR&amp;#039;&amp;#039; [] ys = []&lt;br /&gt;
productoR&amp;#039;&amp;#039; xs [] = []&lt;br /&gt;
productoR&amp;#039;&amp;#039; (x:xs) ys = [ (x,b) | b &amp;lt;- ys ] ++ productoR xs ys&lt;br /&gt;
&lt;br /&gt;
--José Manuel García &lt;br /&gt;
productoR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [(a,a)]&lt;br /&gt;
productoR1 _ [] = []&lt;br /&gt;
productoR1 (x:xs) (y:ys) = [(x,y)] ++ productoR1 (x:xs) ys&lt;br /&gt;
productoR [] _ = []&lt;br /&gt;
productoR (x:xs) (y:ys) = (productoR1 (x:xs) (y:ys) ) ++ (productoR xs (y:ys))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.3. Comprobar con QuickCheck que producto y productoR &lt;br /&gt;
-- son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_producto :: [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_producto = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Comprobar con QuickCheck que el número de elementos&lt;br /&gt;
-- de (producto xs ys) es el producto del número de elementos de xs y de&lt;br /&gt;
-- ys. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_elementos_producto :: [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_elementos_producto = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. Definir la función &lt;br /&gt;
--    subconjuntos :: [a] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (subconjuntos xs) es la lista de las subconjuntos de la lista&lt;br /&gt;
-- xs. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; subconjuntos [2,3,4]&lt;br /&gt;
--    [[2,3,4],[2,3],[2,4],[2],[3,4],[3],[4],[]]&lt;br /&gt;
--    ghci&amp;gt; subconjuntos [1,2,3,4]&lt;br /&gt;
--    [[1,2,3,4],[1,2,3],[1,2,4],[1,2],[1,3,4],[1,3],[1,4],[1],&lt;br /&gt;
--       [2,3,4],  [2,3],  [2,4],  [2],  [3,4],  [3],  [4], []]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
Adriana Gordillo&lt;br /&gt;
subconjuntos :: [a] -&amp;gt; [[a]]&lt;br /&gt;
subconjuntos = subconjuntos xs = [take k cs | cs&amp;lt;-css, k&amp;lt;-[1..length xs-1]]++[xs,[]]&lt;br /&gt;
 where css= [ (drop n xs) ++ (take n xs) |n&amp;lt;-[0..length xs -1]]&lt;br /&gt;
&lt;br /&gt;
--Fernando Ruiz Mazo&lt;br /&gt;
subconjuntosR :: [a] -&amp;gt; [[a]]&lt;br /&gt;
subconjuntosR [] = [[]]&lt;br /&gt;
subconjuntosR (x:xs) = [ x : ys | ys &amp;lt;- subconjuntos xs ] ++ subconjuntos xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. Comprobar con QuickChek que el número de elementos de&lt;br /&gt;
-- (subconjuntos xs) es 2 elevado al número de elementos de xs.&lt;br /&gt;
--&lt;br /&gt;
-- Nota. Al hacer la comprobación limitar el tamaño de las pruebas como&lt;br /&gt;
-- se indica a continuación&lt;br /&gt;
--    quickCheckWith (stdArgs {maxSize=7}) prop_subconjuntos&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_subconjuntos :: [Int] -&amp;gt; Bool&lt;br /&gt;
prop_subconjuntos = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicios variados&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15.1 Se quiere formar una escalera con bloques cuadrados,&lt;br /&gt;
-- de forma que tenga un número determinado de escalones. Por ejemplo,&lt;br /&gt;
-- una escalera con tres escalones tendría la siguiente forma:&lt;br /&gt;
--        XX&lt;br /&gt;
--      XXXX&lt;br /&gt;
--    XXXXXX&lt;br /&gt;
-- Definir, por recursión, la función &lt;br /&gt;
--    numeroBloquesR :: Integer -&amp;gt; Integer    &lt;br /&gt;
-- tal que (numeroBloquesR n) es el número de bloques necesarios para&lt;br /&gt;
-- construir una escalera con n escalones. Por ejemplo,&lt;br /&gt;
--    numeroBloquesR 1   == 2&lt;br /&gt;
--    numeroBloquesR 3   == 12&lt;br /&gt;
--    numeroBloquesR 10  == 110&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numeroBloquesR :: Integer -&amp;gt; Integer    &lt;br /&gt;
numeroBloquesR = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15.2. Definir, por comprensión, la función &lt;br /&gt;
--    numeroBloquesC :: Integer -&amp;gt; Integer    &lt;br /&gt;
-- tal que (numeroBloquesC n) es el número de bloques necesarios para&lt;br /&gt;
-- construir una escalera con n escalones. Por ejemplo,&lt;br /&gt;
--    numeroBloquesC 1   == 2&lt;br /&gt;
--    numeroBloquesC 3   == 12&lt;br /&gt;
--    numeroBloquesC 10  == 110&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numeroBloquesC :: Integer -&amp;gt; Integer    &lt;br /&gt;
numeroBloquesC n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15.3. Comprobar con QuickCheck que (numeroBloquesC n) es&lt;br /&gt;
-- igual a n+n^2.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_numeroBloquesR n = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16. Definir la función &lt;br /&gt;
--    esDigito :: Integer -&amp;gt; Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esDigito x n) se verifica si x es un dígito de n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    esDigito 4 1041  ==  True&lt;br /&gt;
--    esDigito 3 1041  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
digitos n | n&amp;lt;10 = [n]&lt;br /&gt;
          | otherwise = digitos (div n 10) ++ [rem n 10]&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
esDigito :: Integer -&amp;gt; Integer -&amp;gt; Bool&lt;br /&gt;
esDigito x n = elem x (digitos n)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 17. Definir la función&lt;br /&gt;
--    numeroDeDigitos :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (numeroDeDigitos x) es el número de dígitos de x. Por ejemplo,&lt;br /&gt;
--    numeroDeDigitos 34047  ==  5&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
numeroDeDigitos :: Integer -&amp;gt; Int&lt;br /&gt;
numeroDeDigitos x = length(digitos x)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 18.1 Definir, por recursión, la función &lt;br /&gt;
--    listaNumeroR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (listaNumeroR xs) es el número formado por los dígitos xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    listaNumeroR [5]        == 5&lt;br /&gt;
--    listaNumeroR [1,3,4,7]  == 1347&lt;br /&gt;
--    listaNumeroR [0,0,1]    == 1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
listaNumeroR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroR [x] = x&lt;br /&gt;
listaNumeroR (x:xs) = x*10^(length xs) + listaNumeroR xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 18.2. Definir, por comprensión, la función &lt;br /&gt;
--    listaNumeroC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (listaNumeroC xs) es el número formado por los dígitos xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    listaNumeroC [5]        == 5&lt;br /&gt;
--    listaNumeroC [1,3,4,7]  == 1347&lt;br /&gt;
--    listaNumeroC [0,0,1]    == 1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
listaNumeroC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroC xs = sum [x*(10^s) | (x,s)&amp;lt;- zip xs ys]&lt;br /&gt;
                where ys = reverse [0..length xs-1]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19.1. Definir, por recursión, la función &lt;br /&gt;
--    pegaNumerosR :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (pegaNumerosR x y) es el número resultante de &amp;quot;pegar&amp;quot; los&lt;br /&gt;
-- números x e y. Por ejemplo, &lt;br /&gt;
--    pegaNumerosR 12 987   ==  12987&lt;br /&gt;
--    pegaNumerosR 1204 7   ==  12047&lt;br /&gt;
--    pegaNumerosR 100 100  ==  100100&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
pegaNumerosR :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
pegaNumerosR x y = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19.2. Definir, sin usar recursión, la función &lt;br /&gt;
--    pegaNumerosNR :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (pegaNumerosNR x y) es el número resultante de &amp;quot;pegar&amp;quot; los&lt;br /&gt;
-- números x e y. Por ejemplo, &lt;br /&gt;
--    pegaNumerosNR 12 987   ==  12987&lt;br /&gt;
--    pegaNumerosNR 1204 7   ==  12047&lt;br /&gt;
--    pegaNumerosNR 100 100  ==  100100&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
pegaNumerosNR :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
pegaNumerosNR x y = x*10^(length (digitos y)) + y&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19.3. Comprobar con QuickCheck que las funciones&lt;br /&gt;
-- pegaNumerosR y pegaNumerosNR son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_pegaNumeros x y = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20.1. Definir, por recursión, la función &lt;br /&gt;
--    primerDigitoR :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (primerDigitoR n) es el primer dígito de n. Por ejemplo, &lt;br /&gt;
--    primerDigitoR 425  ==  4&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
primerDigitoR :: Integer -&amp;gt; Integer&lt;br /&gt;
primerDigitoR n | n&amp;lt;10 = n&lt;br /&gt;
                 | otherwise = primerDigitoR (div n 10)&lt;br /&gt;
  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20.2. Definir, sin usar recursión, la función &lt;br /&gt;
--    primerDigitoNR :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (primerDigitoNR n) es la primera digito de n. Por ejemplo, &lt;br /&gt;
--    primerDigitoNR 425  ==  4&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
primerDigitoNR :: Integer -&amp;gt; Integer&lt;br /&gt;
primerDigitoNR n = head (digitos n)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20.3. Comprobar con QuickCheck que las funciones&lt;br /&gt;
-- primerDigitoR y primerDigitoNR son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_primerDigito x = primerDigitoR x == primerDigitoNR x&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 21.1. Definir la función &lt;br /&gt;
--    inverso :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (inverso n) es el número obtenido escribiendo los dígitos de n&lt;br /&gt;
-- en orden inverso. Por ejemplo, &lt;br /&gt;
--    inverso 42578  ==  87524&lt;br /&gt;
--    inverso 203    ==    302&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
inverso :: Integer -&amp;gt; Integer&lt;br /&gt;
inverso n = listaNumeroC (reverse (digitos n))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.2. Definir, usando show y read, la función &lt;br /&gt;
--    inverso&amp;#039; :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (inverso&amp;#039; n) es el número obtenido escribiendo los dígitos de n&lt;br /&gt;
-- en orden inverso&amp;#039;. Por ejemplo, &lt;br /&gt;
--    inverso&amp;#039; 42578  ==  87524&lt;br /&gt;
--    inverso&amp;#039; 203    ==    302&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
inverso&amp;#039; :: Integer -&amp;gt; Integer&lt;br /&gt;
inverso&amp;#039; n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.3. Comprobar con QuickCheck que las funciones&lt;br /&gt;
-- inverso e inverso&amp;#039; son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_inverso n = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 23. Definir la función &lt;br /&gt;
--    capicua :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (capicua n) se verifica si si los dígitos que n son las mismas&lt;br /&gt;
-- de izquierda a derecha que de derecha a izquierda. Por ejemplo,&lt;br /&gt;
--    capicua 1234  =  False&lt;br /&gt;
--    capicua 1221  =  True&lt;br /&gt;
--    capicua 4     =  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
capicua :: Integer -&amp;gt; Bool&lt;br /&gt;
capicua n = reverse(digitos n) == digitos n&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 24. (Problema 16 del proyecto Euler) El problema se&lt;br /&gt;
-- encuentra en http://goo.gl/4uWh y consiste en calcular la suma de los&lt;br /&gt;
-- dígitos de 2^1000. Lo resolveremos mediante los distintos apartados de&lt;br /&gt;
-- este ejercicio.  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 24.1. Definir la función&lt;br /&gt;
--    euler16 :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (euler16 n) es la suma de los dígitos de 2^n. Por ejemplo,&lt;br /&gt;
--    euler16 4  ==  7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
euler16 :: Integer -&amp;gt; Integer&lt;br /&gt;
euler16 n = sum(digitos (2^n))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 24.2. Calcular la suma de los dígitos de 2^1000.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
--    *Main&amp;gt; euler16 1000&lt;br /&gt;
--    1366&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 25. En el enunciado de uno de los problemas de las&lt;br /&gt;
-- Olimpiadas matemáticas de Brasil se define el primitivo de un número&lt;br /&gt;
-- como sigue: &lt;br /&gt;
--    Dado un número natural N, multiplicamos todos sus dígitos,&lt;br /&gt;
--    repetimos este procedimiento hasta que quede un solo dígito al&lt;br /&gt;
--    cual llamamos primitivo de N. Por ejemplo para 327: 3x2x7 = 42 y &lt;br /&gt;
--    4x2 = 8. Por lo tanto, el primitivo de 327 es 8.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    primitivo :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (primitivo n) es el primitivo de n. Por ejemplo.&lt;br /&gt;
--    primitivo 327  ==  8&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
primitivo :: Integer -&amp;gt; Integer&lt;br /&gt;
primitivo n | n&amp;lt;10 = n&lt;br /&gt;
            | otherwise = primitivo (product(digitos n))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 26. Dos números son equivalentes si la media de sus dígitos&lt;br /&gt;
-- son iguales. Por ejemplo, 3205 y 41 son equvalentes ya que &lt;br /&gt;
-- (3+2+0+5)/4 = (4+1)/2. Definir la función &lt;br /&gt;
--    equivalentes :: Integer -&amp;gt; Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (equivalentes x y) se verifica si los números x e y son&lt;br /&gt;
-- equivalentes. Por ejemplo,&lt;br /&gt;
--    equivalentes 3205 41  ==  True&lt;br /&gt;
--    equivalentes 3205 25  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
equivalentes :: Integer -&amp;gt; Integer -&amp;gt; Bool&lt;br /&gt;
equivalentes x y = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 27. Un número x es especial si el número de ocurrencia de&lt;br /&gt;
-- cada dígito d de x en x^2 es el doble del número de ocurrencias de d&lt;br /&gt;
-- en x. Por ejemplo, 72576 es especial porque tiene un 2, un 5, un 6 y&lt;br /&gt;
-- dos 7 y su cuadrado es 5267275776 que tiene exactamente dos 2, dos 5,&lt;br /&gt;
-- dos 6 y cuatro 7.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    especial :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (especial x) se verifica si x es un número especial. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    especial 72576  ==  True&lt;br /&gt;
--    especial 12     ==  False&lt;br /&gt;
-- Calcular el menor número especial mayor que 72576.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
especial :: Integer -&amp;gt; Bool&lt;br /&gt;
especial x = undefined&lt;br /&gt;
&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_6&amp;diff=396</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_6&amp;diff=396"/>
		<updated>2021-11-10T10:45:56Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Rel_6.hs (5 de noviembre de 2021)&lt;br /&gt;
-- Definiciones por recursión &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 por&lt;br /&gt;
-- recursión correspondientes al tema 6 cuyas transparencias se &lt;br /&gt;
-- encuentran en  &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-6.html&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Definir por recursión la función&lt;br /&gt;
--    potencia :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (potencia x n) es x elevado al número natural n. Por ejemplo,  &lt;br /&gt;
--    potencia 2 3  ==  8&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Irene Ortega, Ana Sánchez Martín&lt;br /&gt;
potencia :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
potencia _ 0 = 1&lt;br /&gt;
potencia x n = x* potencia x (n-1)&lt;br /&gt;
&lt;br /&gt;
-- Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
potencia :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
potencia _ 0 = 1&lt;br /&gt;
potencia x n | n &amp;gt; 0 = x * potencia x (n-1)&lt;br /&gt;
             | n &amp;lt; 0 = error &amp;quot;n tiene que ser un natural (&amp;gt;=0)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Comprobar con QuickCheck que la función potencia es&lt;br /&gt;
-- equivalente a la predefinida (^).&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_potencia :: Integer -&amp;gt; Integer -&amp;gt; Property&lt;br /&gt;
prop_potencia x n = n&amp;gt;=0 ==&amp;gt; x^n == potencia x n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_potencia&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Dados dos números naturales, a y b, es posible&lt;br /&gt;
-- calcular su máximo común divisor mediante el Algoritmo de&lt;br /&gt;
-- Euclides. Este algoritmo se puede resumir en la siguiente fórmula:&lt;br /&gt;
--    mcd(a,b) = a,                   si b = 0&lt;br /&gt;
--             = mcd (b, a módulo b), si b &amp;gt; 0&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    mcd :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (mcd a b) es el máximo común divisor de a y b calculado&lt;br /&gt;
-- mediante el algoritmo de Euclides. Por ejemplo,&lt;br /&gt;
--    mcd 30 45  ==  15&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Irene Ortega, Elsa Domínguez&lt;br /&gt;
mcd :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
mcd a 0 = a&lt;br /&gt;
mcd a b = mcd b (mod a b)&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
mcd1 :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
mcd1 a b | b==0 = a&lt;br /&gt;
        | b &amp;gt; 0 = mcd b (mod a b)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir y comprobar la propiedad prop_mcd según la&lt;br /&gt;
-- cual el máximo común divisor de dos números a y b (ambos mayores que&lt;br /&gt;
-- 0) es siempre mayor o igual que 1 y además es menor o igual que el&lt;br /&gt;
-- menor de los números a  y b. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_mcd :: Integer -&amp;gt; Integer -&amp;gt; Property&lt;br /&gt;
prop_mcd a b = a&amp;gt;0 &amp;amp;&amp;amp; b&amp;gt;0 ==&amp;gt; mcd a b &amp;gt;=1 &amp;amp;&amp;amp; mcd a b &amp;lt;= min a b&lt;br /&gt;
&lt;br /&gt;
-- Su comprobación es quickCheck prop_mcd&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.3. Teniendo en cuenta que buscamos el máximo común&lt;br /&gt;
-- divisor de a y b, sería razonable pensar que el máximo común divisor&lt;br /&gt;
-- siempre sería igual o menor que la mitad del máximo de a y b. Definir&lt;br /&gt;
-- esta propiedad y comprobarla.  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--- Lucía Hernández&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_mcd_div :: Integer -&amp;gt; Integer -&amp;gt; Property&lt;br /&gt;
prop_mcd_div a b = a&amp;gt;0 &amp;amp;&amp;amp; b&amp;gt;0 ==&amp;gt; (mcd a b) &amp;lt;= div (max a b)2&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_mcd_div&lt;br /&gt;
*** Failed! Falsifiable (after 1 test):&lt;br /&gt;
1&lt;br /&gt;
1&lt;br /&gt;
-- Nicolás Rodríguez Ruiz, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
prop_mcd_div :: Integer -&amp;gt; Integer -&amp;gt; Property&lt;br /&gt;
prop_mcd_div a b = a&amp;gt;0 &amp;amp;&amp;amp; b&amp;gt;0 &amp;amp;&amp;amp; a/=b==&amp;gt; mcd a b &amp;lt;= (max a b) `div` 2&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
-- +++ OK, passed 100 tests; 407 discarded.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1, Definir por recursión la función&lt;br /&gt;
--    pertenece :: Eq a =&amp;gt; a -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (pertenece x xs) se verifica si x pertenece a la lista xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    pertenece 3 [2,3,5]  ==  True&lt;br /&gt;
--    pertenece 4 [2,3,5]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Irene Ortega, Ana Sánchez Martín&lt;br /&gt;
pertenece :: Eq a =&amp;gt; a -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
pertenece _ [] = False&lt;br /&gt;
pertenece n (x:xs) | n == x = True&lt;br /&gt;
                   |otherwise =  pertenece n xs&lt;br /&gt;
-- Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
pertenece :: Eq a =&amp;gt; a -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
pertenece _ [] = False&lt;br /&gt;
pertenece y (x:xs) = y==x || pertenece y xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con quickCheck que pertenece es equivalente&lt;br /&gt;
-- a elem. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_pertenece :: Int -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_pertenece x xs = pertenece x xs == elem x xs&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_pertenece&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. Definir por recursión la función&lt;br /&gt;
--    concatenaListas :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatenaListas xss) es la lista obtenida concatenando las listas de&lt;br /&gt;
-- xss. Por ejemplo,&lt;br /&gt;
--    concatenaListas [[1..3],[5..7],[8..10]]  ==  [1,2,3,5,6,7,8,9,10]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández , Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
concatenaListas :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatenaListas  []  = []&lt;br /&gt;
concatenaListas (xs:xss) = xs ++ concatenaListas xss&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Comprobar con QuickCheck que concatenaListas es&lt;br /&gt;
-- equivalente a concat. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Nicolás Rodrígez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_concat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_concat xss = concat xss == concatenaListas xss&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 5.1. Definir por recursión la función&lt;br /&gt;
--    coge :: Int -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (coge n xs) es la lista de los n primeros elementos de&lt;br /&gt;
-- xs. Por ejemplo, &lt;br /&gt;
--    coge   3  [4..12]  ==  [4,5,6]&lt;br /&gt;
--    coge (-3) [4..12]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
coge :: Int -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
coge _ [] = []&lt;br /&gt;
coge n (x:xs) | n&amp;lt;=0 = []&lt;br /&gt;
              | otherwise = x : coge (n-1) xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Comprobar con QuickCheck que coge es equivalente a&lt;br /&gt;
-- take. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_coge :: Int -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_coge n xs = coge n xs == take n xs&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_coge&lt;br /&gt;
+++ OK, passed 100 tests&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Definir, por recursión, la función &lt;br /&gt;
--    sumaCuadradosR :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaCuadradosR n) es la suma de los cuadrados de los números&lt;br /&gt;
-- de 1 a n. Por ejemplo, &lt;br /&gt;
--    sumaCuadradosR 4  ==  30 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Ana Sánchez Martín&lt;br /&gt;
sumaCuadradosR :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaCuadradosR 0 = 0&lt;br /&gt;
sumaCuadradosR n = n^2 + sumaCuadradosR (n-1)&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
sumaCuadradosR :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaCuadradosR 1 = 1&lt;br /&gt;
sumaCuadradosR n | n &amp;lt; 0      = error &amp;quot;n debe ser mayor que cero&amp;quot;&lt;br /&gt;
                 | otherwise  = n^2 + sumaCuadradosR (n-1)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Comprobar con QuickCheck si sumaCuadradosR n es igual a&lt;br /&gt;
-- n(n+1)(2n+1)/6. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_SumaCuadrados :: Integer -&amp;gt; Property&lt;br /&gt;
prop_SumaCuadrados n = n&amp;gt;=1 ==&amp;gt; sumaCuadradosR n == div (n*(n+1)*(2*n+1)) 6&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es  quickCheck  prop_SumaCuadrados&lt;br /&gt;
+++ OK, passed 100 tests&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Definir, por comprensión, la función &lt;br /&gt;
--    sumaCuadradosC :: Integer --&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaCuadradosC n) es la suma de los cuadrados de los números&lt;br /&gt;
-- de 1 a n. Por ejemplo, &lt;br /&gt;
--    sumaCuadradosC 4  ==  30 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
sumaCuadradosC :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaCuadradosC n  = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.4. Comprobar con QuickCheck que las funciones&lt;br /&gt;
-- sumaCuadradosR y sumaCuadradosC son equivalentes sobre los números&lt;br /&gt;
-- naturales. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_sumaCuadradosR :: Integer -&amp;gt; Property&lt;br /&gt;
prop_sumaCuadradosR n = n&amp;gt;=1 ==&amp;gt; sumaCuadradosR n == sumaCuadradosC n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es  quickCheck  prop_sumaCuadradosR&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir, por recursión, la función&lt;br /&gt;
--    digitosR :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (digitosR n) es la lista de los dígitos del número n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    digitosR 320274  ==  [3,2,0,2,7,4]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
digitosR :: Integer -&amp;gt; [Integer]&lt;br /&gt;
digitosR n = if n&amp;lt;10 then [n]&lt;br /&gt;
          else   digitosR (div n 10) ++ [rem n 10]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Definir, por comprensión, la función&lt;br /&gt;
--    digitosC :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (digitosC n) es la lista de los dígitos del número n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    digitosC 320274  ==  [3,2,0,2,7,4]&lt;br /&gt;
-- Indicación: Usar las funciones show y read.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
digitosC :: Integer -&amp;gt; [Integer]&lt;br /&gt;
digitosC n = [read [x] | x &amp;lt;- show n]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que las funciones digitosR y&lt;br /&gt;
-- digitosC son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_digitos :: Integer -&amp;gt; Property&lt;br /&gt;
prop_digitos n = n&amp;gt;=0 ==&amp;gt; digitosR n == digitosC n&lt;br /&gt;
  &lt;br /&gt;
-- La comprobación es quickCheck  prop_digitos&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por recursión, la función &lt;br /&gt;
--    sumaDigitosR :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDigitosR n) es la suma de los dígitos de n. Por ejemplo,&lt;br /&gt;
--    sumaDigitosR 3     ==  3&lt;br /&gt;
--    sumaDigitosR 2454  == 15&lt;br /&gt;
--    sumaDigitosR 20045 == 11&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
sumaDigitosR :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDigitosR n = if n&amp;lt;10 then n&lt;br /&gt;
                else rem n 10 + sumaDigitosR (div n 10)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sumaDigitosR&amp;#039; :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDigitosR&amp;#039; 0 = 0 &lt;br /&gt;
sumaDigitosR&amp;#039; n | n &amp;lt; 0      = error &amp;quot;no es posible&amp;quot;&lt;br /&gt;
                | otherwise  = rem n 10 + sumaDigitosR (div n 10)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, sin usar recursión, la función &lt;br /&gt;
--    sumaDigitosNR :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDigitosNR n) es la suma de los dígitos de n. Por ejemplo,&lt;br /&gt;
--    sumaDigitosNR 3     ==  3&lt;br /&gt;
--    sumaDigitosNR 2454  == 15&lt;br /&gt;
--    sumaDigitosNR 20045 == 11&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
sumaDigitosNR :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDigitosNR n = sum (digitosR n)&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
sumaDigitosNR :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDigitosNR n = sum (digitosC n)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Comprobar con QuickCheck que las funciones sumaDigitosR&lt;br /&gt;
-- y sumaDigitosNR son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_sumaDigitos :: Integer -&amp;gt; Property&lt;br /&gt;
prop_sumaDigitos n = n&amp;gt;= 0 ==&amp;gt; sumaDigitosR n  == sumaDigitosNR n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es  quickCheck prop_sumaDigitos&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por recursión, la función &lt;br /&gt;
--    listaNumeroR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (listaNumeroR xs) es el número formado por los dígitos xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    listaNumeroR [5]        == 5&lt;br /&gt;
--    listaNumeroR [1,3,4,7]  == 1347&lt;br /&gt;
--    listaNumeroR [0,0,1]    == 1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Ana Sánchez Martín&lt;br /&gt;
listaNumeroR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroR [] = 0&lt;br /&gt;
listaNumeroR [x] = x&lt;br /&gt;
listaNumeroR (x:xs) = x*10^(length (xs)) + listaNumeroR xs&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
listaNumeroR&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroR&amp;#039; [] = 0&lt;br /&gt;
listaNumeroR&amp;#039; [x] = x&lt;br /&gt;
listaNumeroR&amp;#039; xs = last xs + (listaNumeroR (init xs))*10&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
listaNumeroR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroR (x:xs) = read ( (show x) ++ listaNumeroR&amp;#039; xs) :: Integer&lt;br /&gt;
listaNumeroR&amp;#039; :: [Integer] -&amp;gt; [Char]&lt;br /&gt;
listaNumeroR&amp;#039; [] = []&lt;br /&gt;
listaNumeroR&amp;#039; (x:xs) = show x ++ listaNumeroR&amp;#039; xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por comprensión, la función &lt;br /&gt;
--    listaNumeroC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (listaNumeroC xs) es el número formado por los dígitos xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    listaNumeroC [5]        == 5&lt;br /&gt;
--    listaNumeroC [1,3,4,7]  == 1347&lt;br /&gt;
--    listaNumeroC [0,0,1]    == 1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Ana Sánchez Martín&lt;br /&gt;
listaNumeroC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroC xs = sum [x*10^s | (x,s) &amp;lt;- zip(reverse xs) [0..length xs -1]]&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
listaNumeroC&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroC&amp;#039; xs = sum [ x*(10^y)  | (x,y) &amp;lt;- agrupa1 xs]&lt;br /&gt;
agrupa1 xs = zip (reverse xs) [0..]&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
listaNumeroC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroC xs = read [stringToChar t | t &amp;lt;- [show a | a &amp;lt;- xs]] :: Integer&lt;br /&gt;
stringToChar :: String -&amp;gt; Char&lt;br /&gt;
stringToChar x = head (x)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. Comprobar con QuickCheck que las funciones&lt;br /&gt;
-- listaNumeroR y listaNumeroC son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández, Elsa Domínguez, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_listaNumero :: [Integer] -&amp;gt; Bool&lt;br /&gt;
prop_listaNumero xs = listaNumeroR xs == listaNumeroC xs&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_listaNumero&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
prop_listaNumero&amp;#039; xs = not(null xs) ==&amp;gt; listaNumeroR xs == listaNumeroC xs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.1. Definir, por recursión, la función &lt;br /&gt;
--    mayorExponenteR :: Integer -&amp;gt; Integer -&amp;gt; Integer &lt;br /&gt;
-- tal que (mayorExponenteR a b) es el exponente de la mayor potencia de&lt;br /&gt;
-- a que divide b. Por ejemplo,&lt;br /&gt;
--    mayorExponenteR 2 8    ==  3&lt;br /&gt;
--    mayorExponenteR 2 9    ==  0&lt;br /&gt;
--    mayorExponenteR 5 100  ==  2&lt;br /&gt;
--    mayorExponenteR 2 60   ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
mayorExponenteR :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
mayorExponenteR  _ 0 = 0&lt;br /&gt;
mayorExponenteR a b | mod b a == 0  = 1 + mayorExponenteR a( div b a)&lt;br /&gt;
                    | otherwise     = 0&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.2. Definir, por comprensión, la función &lt;br /&gt;
--    mayorExponenteC :: Integer -&amp;gt; Integer -&amp;gt; Integer &lt;br /&gt;
-- tal que (mayorExponenteC a b) es el exponente de la mayor potencia de&lt;br /&gt;
-- a que divide a b. Por ejemplo,&lt;br /&gt;
--    mayorExponenteC 2 8    ==  3&lt;br /&gt;
--    mayorExponenteC 5 100  ==  2&lt;br /&gt;
--    mayorExponenteC 5 101  ==  0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
mayorExponenteC :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
mayorExponenteC a b = last [s | s&amp;lt;- [0..b], mod b (a^s) == 0]&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
mayorExponenteC&amp;#039; :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
mayorExponenteC&amp;#039; a b | rem b a /= 0  = 0  -- mejora la eficiencia &lt;br /&gt;
                     | otherwise     = last [x | x &amp;lt;- [0..32], rem b (a^x) == 0]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_6&amp;diff=395</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_6&amp;diff=395"/>
		<updated>2021-11-10T09:35:09Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Rel_6.hs (5 de noviembre de 2021)&lt;br /&gt;
-- Definiciones por recursión &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 por&lt;br /&gt;
-- recursión correspondientes al tema 6 cuyas transparencias se &lt;br /&gt;
-- encuentran en  &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-6.html&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Definir por recursión la función&lt;br /&gt;
--    potencia :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (potencia x n) es x elevado al número natural n. Por ejemplo,  &lt;br /&gt;
--    potencia 2 3  ==  8&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Irene Ortega, Ana Sánchez Martín&lt;br /&gt;
potencia :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
potencia _ 0 = 1&lt;br /&gt;
potencia x n = x* potencia x (n-1)&lt;br /&gt;
&lt;br /&gt;
-- Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
potencia :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
potencia _ 0 = 1&lt;br /&gt;
potencia x n | n &amp;gt; 0 = x * potencia x (n-1)&lt;br /&gt;
             | n &amp;lt; 0 = error &amp;quot;n tiene que ser un natural (&amp;gt;=0)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Comprobar con QuickCheck que la función potencia es&lt;br /&gt;
-- equivalente a la predefinida (^).&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_potencia :: Integer -&amp;gt; Integer -&amp;gt; Property&lt;br /&gt;
prop_potencia x n = n&amp;gt;=0 ==&amp;gt; x^n == potencia x n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_potencia&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Dados dos números naturales, a y b, es posible&lt;br /&gt;
-- calcular su máximo común divisor mediante el Algoritmo de&lt;br /&gt;
-- Euclides. Este algoritmo se puede resumir en la siguiente fórmula:&lt;br /&gt;
--    mcd(a,b) = a,                   si b = 0&lt;br /&gt;
--             = mcd (b, a módulo b), si b &amp;gt; 0&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    mcd :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (mcd a b) es el máximo común divisor de a y b calculado&lt;br /&gt;
-- mediante el algoritmo de Euclides. Por ejemplo,&lt;br /&gt;
--    mcd 30 45  ==  15&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Irene Ortega, Elsa Domínguez&lt;br /&gt;
mcd :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
mcd a 0 = a&lt;br /&gt;
mcd a b = mcd b (mod a b)&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
mcd1 :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
mcd1 a b | b==0 = a&lt;br /&gt;
        | b &amp;gt; 0 = mcd b (mod a b)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir y comprobar la propiedad prop_mcd según la&lt;br /&gt;
-- cual el máximo común divisor de dos números a y b (ambos mayores que&lt;br /&gt;
-- 0) es siempre mayor o igual que 1 y además es menor o igual que el&lt;br /&gt;
-- menor de los números a  y b. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_mcd :: Integer -&amp;gt; Integer -&amp;gt; Property&lt;br /&gt;
prop_mcd a b = a&amp;gt;0 &amp;amp;&amp;amp; b&amp;gt;0 ==&amp;gt; mcd a b &amp;gt;=1 &amp;amp;&amp;amp; mcd a b &amp;lt;= min a b&lt;br /&gt;
&lt;br /&gt;
-- Su comprobación es quickCheck prop_mcd&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.3. Teniendo en cuenta que buscamos el máximo común&lt;br /&gt;
-- divisor de a y b, sería razonable pensar que el máximo común divisor&lt;br /&gt;
-- siempre sería igual o menor que la mitad del máximo de a y b. Definir&lt;br /&gt;
-- esta propiedad y comprobarla.  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--- Lucía Hernández&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_mcd_div :: Integer -&amp;gt; Integer -&amp;gt; Property&lt;br /&gt;
prop_mcd_div a b = a&amp;gt;0 &amp;amp;&amp;amp; b&amp;gt;0 ==&amp;gt; (mcd a b) &amp;lt;= div (max a b)2&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_mcd_div&lt;br /&gt;
*** Failed! Falsifiable (after 1 test):&lt;br /&gt;
1&lt;br /&gt;
1&lt;br /&gt;
-- Nicolás Rodríguez Ruiz, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
prop_mcd_div :: Integer -&amp;gt; Integer -&amp;gt; Property&lt;br /&gt;
prop_mcd_div a b = a&amp;gt;0 &amp;amp;&amp;amp; b&amp;gt;0 &amp;amp;&amp;amp; a/=b==&amp;gt; mcd a b &amp;lt;= (max a b) `div` 2&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
-- +++ OK, passed 100 tests; 407 discarded.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1, Definir por recursión la función&lt;br /&gt;
--    pertenece :: Eq a =&amp;gt; a -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (pertenece x xs) se verifica si x pertenece a la lista xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    pertenece 3 [2,3,5]  ==  True&lt;br /&gt;
--    pertenece 4 [2,3,5]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Irene Ortega, Ana Sánchez Martín&lt;br /&gt;
pertenece :: Eq a =&amp;gt; a -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
pertenece _ [] = False&lt;br /&gt;
pertenece n (x:xs) | n == x = True&lt;br /&gt;
                   |otherwise =  pertenece n xs&lt;br /&gt;
-- Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
pertenece :: Eq a =&amp;gt; a -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
pertenece _ [] = False&lt;br /&gt;
pertenece y (x:xs) = y==x || pertenece y xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con quickCheck que pertenece es equivalente&lt;br /&gt;
-- a elem. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Irene Ortega, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_pertenece :: Int -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_pertenece x xs = pertenece x xs == elem x xs&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_pertenece&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. Definir por recursión la función&lt;br /&gt;
--    concatenaListas :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatenaListas xss) es la lista obtenida concatenando las listas de&lt;br /&gt;
-- xss. Por ejemplo,&lt;br /&gt;
--    concatenaListas [[1..3],[5..7],[8..10]]  ==  [1,2,3,5,6,7,8,9,10]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández , Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
concatenaListas :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatenaListas  []  = []&lt;br /&gt;
concatenaListas (xs:xss) = xs ++ concatenaListas xss&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Comprobar con QuickCheck que concatenaListas es&lt;br /&gt;
-- equivalente a concat. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Nicolás Rodrígez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_concat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_concat xss = concat xss == concatenaListas xss&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 5.1. Definir por recursión la función&lt;br /&gt;
--    coge :: Int -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (coge n xs) es la lista de los n primeros elementos de&lt;br /&gt;
-- xs. Por ejemplo, &lt;br /&gt;
--    coge   3  [4..12]  ==  [4,5,6]&lt;br /&gt;
--    coge (-3) [4..12]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
coge :: Int -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
coge _ [] = []&lt;br /&gt;
coge n (x:xs) | n&amp;lt;=0 = []&lt;br /&gt;
              | otherwise = x : coge (n-1) xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Comprobar con QuickCheck que coge es equivalente a&lt;br /&gt;
-- take. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_coge :: Int -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_coge n xs = coge n xs == take n xs&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_coge&lt;br /&gt;
+++ OK, passed 100 tests&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Definir, por recursión, la función &lt;br /&gt;
--    sumaCuadradosR :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaCuadradosR n) es la suma de los cuadrados de los números&lt;br /&gt;
-- de 1 a n. Por ejemplo, &lt;br /&gt;
--    sumaCuadradosR 4  ==  30 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Ana Sánchez Martín&lt;br /&gt;
sumaCuadradosR :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaCuadradosR 0 = 0&lt;br /&gt;
sumaCuadradosR n = n^2 + sumaCuadradosR (n-1)&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
sumaCuadradosR :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaCuadradosR 1 = 1&lt;br /&gt;
sumaCuadradosR n | n &amp;lt; 0      = error &amp;quot;n debe ser mayor que cero&amp;quot;&lt;br /&gt;
                 | otherwise  = n^2 + sumaCuadradosR (n-1)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Comprobar con QuickCheck si sumaCuadradosR n es igual a&lt;br /&gt;
-- n(n+1)(2n+1)/6. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_SumaCuadrados :: Integer -&amp;gt; Property&lt;br /&gt;
prop_SumaCuadrados n = n&amp;gt;=1 ==&amp;gt; sumaCuadradosR n == div (n*(n+1)*(2*n+1)) 6&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es  quickCheck  prop_SumaCuadrados&lt;br /&gt;
+++ OK, passed 100 tests&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Definir, por comprensión, la función &lt;br /&gt;
--    sumaCuadradosC :: Integer --&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaCuadradosC n) es la suma de los cuadrados de los números&lt;br /&gt;
-- de 1 a n. Por ejemplo, &lt;br /&gt;
--    sumaCuadradosC 4  ==  30 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
sumaCuadradosC :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaCuadradosC n  = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.4. Comprobar con QuickCheck que las funciones&lt;br /&gt;
-- sumaCuadradosR y sumaCuadradosC son equivalentes sobre los números&lt;br /&gt;
-- naturales. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_sumaCuadradosR :: Integer -&amp;gt; Property&lt;br /&gt;
prop_sumaCuadradosR n = n&amp;gt;=1 ==&amp;gt; sumaCuadradosR n == sumaCuadradosC n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es  quickCheck  prop_sumaCuadradosR&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir, por recursión, la función&lt;br /&gt;
--    digitosR :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (digitosR n) es la lista de los dígitos del número n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    digitosR 320274  ==  [3,2,0,2,7,4]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
digitosR :: Integer -&amp;gt; [Integer]&lt;br /&gt;
digitosR n = if n&amp;lt;10 then [n]&lt;br /&gt;
          else   digitosR (div n 10) ++ [rem n 10]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Definir, por comprensión, la función&lt;br /&gt;
--    digitosC :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (digitosC n) es la lista de los dígitos del número n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    digitosC 320274  ==  [3,2,0,2,7,4]&lt;br /&gt;
-- Indicación: Usar las funciones show y read.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
digitosC :: Integer -&amp;gt; [Integer]&lt;br /&gt;
digitosC n = [read [x] | x &amp;lt;- show n]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que las funciones digitosR y&lt;br /&gt;
-- digitosC son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_digitos :: Integer -&amp;gt; Property&lt;br /&gt;
prop_digitos n = n&amp;gt;=0 ==&amp;gt; digitosR n == digitosC n&lt;br /&gt;
  &lt;br /&gt;
-- La comprobación es quickCheck  prop_digitos&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por recursión, la función &lt;br /&gt;
--    sumaDigitosR :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDigitosR n) es la suma de los dígitos de n. Por ejemplo,&lt;br /&gt;
--    sumaDigitosR 3     ==  3&lt;br /&gt;
--    sumaDigitosR 2454  == 15&lt;br /&gt;
--    sumaDigitosR 20045 == 11&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
sumaDigitosR :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDigitosR n = if n&amp;lt;10 then n&lt;br /&gt;
                else rem n 10 + sumaDigitosR (div n 10)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
sumaDigitosR&amp;#039; :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDigitosR&amp;#039; 0 = 0 &lt;br /&gt;
sumaDigitosR&amp;#039; n | n &amp;lt; 0      = error &amp;quot;no es posible&amp;quot;&lt;br /&gt;
                | otherwise  = rem n 10 + sumaDigitosR (div n 10)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, sin usar recursión, la función &lt;br /&gt;
--    sumaDigitosNR :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDigitosNR n) es la suma de los dígitos de n. Por ejemplo,&lt;br /&gt;
--    sumaDigitosNR 3     ==  3&lt;br /&gt;
--    sumaDigitosNR 2454  == 15&lt;br /&gt;
--    sumaDigitosNR 20045 == 11&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
sumaDigitosNR :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDigitosNR n = sum (digitosR n)&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
sumaDigitosNR :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDigitosNR n = sum (digitosC n)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Comprobar con QuickCheck que las funciones sumaDigitosR&lt;br /&gt;
-- y sumaDigitosNR son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_sumaDigitos :: Integer -&amp;gt; Property&lt;br /&gt;
prop_sumaDigitos n = n&amp;gt;= 0 ==&amp;gt; sumaDigitosR n  == sumaDigitosNR n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es  quickCheck prop_sumaDigitos&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por recursión, la función &lt;br /&gt;
--    listaNumeroR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (listaNumeroR xs) es el número formado por los dígitos xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    listaNumeroR [5]        == 5&lt;br /&gt;
--    listaNumeroR [1,3,4,7]  == 1347&lt;br /&gt;
--    listaNumeroR [0,0,1]    == 1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Ana Sánchez Martín&lt;br /&gt;
listaNumeroR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroR [] = 0&lt;br /&gt;
listaNumeroR [x] = x&lt;br /&gt;
listaNumeroR (x:xs) = x*10^(length (xs)) + listaNumeroR xs&lt;br /&gt;
-- Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
listaNumeroR&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroR&amp;#039; [] = 0&lt;br /&gt;
listaNumeroR&amp;#039; [x] = x&lt;br /&gt;
listaNumeroR&amp;#039; xs = last xs + (listaNumeroR (init xs))*10&lt;br /&gt;
&lt;br /&gt;
--José Manuel García&lt;br /&gt;
listaNumeroR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroR (x:xs) = read ( (show x) ++ listaNumeroR&amp;#039; xs) :: Integer&lt;br /&gt;
listaNumeroR&amp;#039; :: [Integer] -&amp;gt; [Char]&lt;br /&gt;
listaNumeroR&amp;#039; [] = []&lt;br /&gt;
listaNumeroR&amp;#039; (x:xs) = show x ++ listaNumeroR&amp;#039; xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por comprensión, la función &lt;br /&gt;
--    listaNumeroC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (listaNumeroC xs) es el número formado por los dígitos xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    listaNumeroC [5]        == 5&lt;br /&gt;
--    listaNumeroC [1,3,4,7]  == 1347&lt;br /&gt;
--    listaNumeroC [0,0,1]    == 1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Ana Sánchez Martín&lt;br /&gt;
listaNumeroC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroC xs = sum [x*10^s | (x,s) &amp;lt;- zip(reverse xs) [0..length xs -1]]&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
listaNumeroC&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroC&amp;#039; xs = sum [ x*(10^y)  | (x,y) &amp;lt;- agrupa1 xs]&lt;br /&gt;
agrupa1 xs = zip (reverse xs) [0..]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. Comprobar con QuickCheck que las funciones&lt;br /&gt;
-- listaNumeroR y listaNumeroC son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández, Elsa Domínguez, Ana Sánchez Martín&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_listaNumero :: [Integer] -&amp;gt; Bool&lt;br /&gt;
prop_listaNumero xs = listaNumeroR xs == listaNumeroC xs&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_listaNumero&lt;br /&gt;
+++ OK, passed 100 tests.&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
prop_listaNumero&amp;#039; xs = not(null xs) ==&amp;gt; listaNumeroR xs == listaNumeroC xs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.1. Definir, por recursión, la función &lt;br /&gt;
--    mayorExponenteR :: Integer -&amp;gt; Integer -&amp;gt; Integer &lt;br /&gt;
-- tal que (mayorExponenteR a b) es el exponente de la mayor potencia de&lt;br /&gt;
-- a que divide b. Por ejemplo,&lt;br /&gt;
--    mayorExponenteR 2 8    ==  3&lt;br /&gt;
--    mayorExponenteR 2 9    ==  0&lt;br /&gt;
--    mayorExponenteR 5 100  ==  2&lt;br /&gt;
--    mayorExponenteR 2 60   ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
mayorExponenteR :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
mayorExponenteR  _ 0 = 0&lt;br /&gt;
mayorExponenteR a b | mod b a == 0  = 1 + mayorExponenteR a( div b a)&lt;br /&gt;
                    | otherwise     = 0&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.2. Definir, por comprensión, la función &lt;br /&gt;
--    mayorExponenteC :: Integer -&amp;gt; Integer -&amp;gt; Integer &lt;br /&gt;
-- tal que (mayorExponenteC a b) es el exponente de la mayor potencia de&lt;br /&gt;
-- a que divide a b. Por ejemplo,&lt;br /&gt;
--    mayorExponenteC 2 8    ==  3&lt;br /&gt;
--    mayorExponenteC 5 100  ==  2&lt;br /&gt;
--    mayorExponenteC 5 101  ==  0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
mayorExponenteC :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
mayorExponenteC a b = last [s | s&amp;lt;- [0..b], mod b (a^s) == 0]&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
mayorExponenteC&amp;#039; :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
mayorExponenteC&amp;#039; a b | rem b a /= 0  = 0  -- mejora la eficiencia &lt;br /&gt;
                     | otherwise     = last [x | x &amp;lt;- [0..32], rem b (a^x) == 0]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_4&amp;diff=316</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_4&amp;diff=316"/>
		<updated>2021-10-27T08:39:42Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_4.hs (27 de Octubre de 2021)&lt;br /&gt;
-- Definiciones por comprensión (II)&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 por&lt;br /&gt;
-- comprensión correspondientes al tema 5.&lt;br /&gt;
-- &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&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;
--    divisoresPrimos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (divisoresPrimos x) es la lista de los divisores primos de x. &lt;br /&gt;
-- Por ejemplo, &lt;br /&gt;
--    divisoresPrimos 40  ==  [2,5]&lt;br /&gt;
--    divisoresPrimos 70  ==  [2,5,7]&lt;br /&gt;
-- ------------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
divisores :: Int -&amp;gt; [Int]&lt;br /&gt;
divisores n = [x | x&amp;lt;-[1..n], mod n x == 0]&lt;br /&gt;
primo :: Int -&amp;gt; Bool&lt;br /&gt;
primo n = divisores n == [1,n]&lt;br /&gt;
&lt;br /&gt;
divisoresPrimos :: Int -&amp;gt; [Int]&lt;br /&gt;
divisoresPrimos n = [ x | x &amp;lt;- divisores n, primo x]&lt;br /&gt;
&lt;br /&gt;
-- José Manuel García&lt;br /&gt;
d x = [n | n &amp;lt;- [1..x], rem x n == 0]&lt;br /&gt;
sumad x = sum (d x)&lt;br /&gt;
&lt;br /&gt;
amigos :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
amigos a b = if a == b then False else sumad a == sumad b&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Un número es libre de cuadrados si no es divisible por el&lt;br /&gt;
-- cuadrado de ningún entero mayor que 1. Por ejemplo, 70 es libre de&lt;br /&gt;
-- cuadrado porque sólo es divisible por 1, 2, 5, 7 y 70; en cambio, 40&lt;br /&gt;
-- no es libre de cuadrados porque es divisible por 2^2. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función  &lt;br /&gt;
--    libreDeCuadrados :: Int -&amp;gt; Bool&lt;br /&gt;
-- tal que (libreDeCuadrados x) se verifica si x es libre de cuadrados. &lt;br /&gt;
-- Por ejemplo,  &lt;br /&gt;
--    libreDeCuadrados 70  ==  True&lt;br /&gt;
--    libreDeCuadrados 40  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
libreDeCuadrados :: Int -&amp;gt; Bool&lt;br /&gt;
libreDeCuadrados n = null [x | x&amp;lt;- cuadrados n, mod n x == 0]&lt;br /&gt;
          where cuadrados n = [x^2 | x&amp;lt;-[2..n]]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. [Del problema 21 del Proyecto Euler]. Sea d(n) la suma&lt;br /&gt;
-- de los divisores propios de n. Si d(a) = b y d(b) = a, siendo a&lt;br /&gt;
-- distinto de b,  &lt;br /&gt;
-- decimos que a y b son un par de números amigos. Por ejemplo, los&lt;br /&gt;
-- divisores propios de 220 son 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 y&lt;br /&gt;
-- 110; por tanto, d(220) = 284. Los divisores propios de 284 son 1, 2,&lt;br /&gt;
-- 4, 71 y 142; por tanto,  d(284) = 220.  Luego, 220 y 284 son dos&lt;br /&gt;
-- números amigos. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    amigos :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
-- tal que (amigos a b) se verifica si a y b son números amigos. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    amigos 6 6       == False&lt;br /&gt;
--    amigos 220 248   == False&lt;br /&gt;
--    amigos 220 284   == True&lt;br /&gt;
--    amigos 100 200   == False&lt;br /&gt;
--    amigos 1184 1210 == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
divisores :: Int -&amp;gt; [Int]&lt;br /&gt;
divisores n = [x | x&amp;lt;-[1..n], mod n x == 0]&lt;br /&gt;
&lt;br /&gt;
amigos :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
amigos a b = and [sumaDivisores a == b &amp;amp;&amp;amp; sumaDivisores b == a, a/=b]&lt;br /&gt;
         where sumaDivisores n  = sum(divisores n) - n&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. (Problema 211 del proyecto Euler) Dado un entero&lt;br /&gt;
-- positivo n, consideremos la suma de los cuadrados de sus divisores,&lt;br /&gt;
-- Por ejemplo,  &lt;br /&gt;
--    f(10) = 1 + 4 + 25 + 100 = 130&lt;br /&gt;
--    f(42) = 1 + 4 +  9 +  36 + 49 + 196 + 441 + 1764 = 2500&lt;br /&gt;
-- Decimos que n es especial si f(n) es un cuadrado perfecto. En los&lt;br /&gt;
-- ejemplos anteriores, 42 es especial y 10 no lo es.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    especial:: Int -&amp;gt; Bool&lt;br /&gt;
-- tal que (especial x) se verifica si x es un número es especial. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    especial 42  ==  True&lt;br /&gt;
--    especial 10  ==  False&lt;br /&gt;
--&lt;br /&gt;
-- Calcular todos los números especiales de tres cifras.&lt;br /&gt;
-- El resultado es:&lt;br /&gt;
-- λ&amp;gt; calculo&lt;br /&gt;
-- [246,287,728]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
sumaDivisoresCuadrados n = sum [ x^2  | x&amp;lt;- divisores n]&lt;br /&gt;
especial :: Int -&amp;gt; Bool&lt;br /&gt;
especial n = x^2 == sumaDivisoresCuadrados n&lt;br /&gt;
  where s = fromIntegral (sumaDivisoresCuadrados n)&lt;br /&gt;
        x = floor (sqrt s)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. La multiplicidad de x en y es la mayor potencia de x&lt;br /&gt;
-- que divide a y. Por ejemplo, la multiplicidad de 2 en 40 es 3 porque&lt;br /&gt;
-- 40 es divisible por 2^3 y no lo es por 2^4. Además, la multiplicidad&lt;br /&gt;
-- de 1 en cualquier número se supone igual a 1. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    multiplicidad :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (multiplicidad x y) es la&lt;br /&gt;
-- multiplicidad de x en y. Por ejemplo,&lt;br /&gt;
--    multiplicidad 2 40  ==  3&lt;br /&gt;
--    multiplicidad 5 40  ==  1&lt;br /&gt;
--    multiplicidad 3 40  ==  0&lt;br /&gt;
--    multiplicidad 1 40  ==  1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
multiplicidad :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
multiplicidad = undefined&lt;br /&gt;
&lt;br /&gt;
-- -------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Sea t una lista de pares de la forma &lt;br /&gt;
--    (nombre, [(asig_1, nota_1),...,(asig_k, nota.k)])&lt;br /&gt;
-- Por ejemplo, &lt;br /&gt;
--    t1 = [(&amp;quot;Ana&amp;quot;,[(&amp;quot;Alg&amp;quot;,1),(&amp;quot;Cal&amp;quot;,3),(&amp;quot;Inf&amp;quot;,8),(&amp;quot;Fis&amp;quot;,2)]),&lt;br /&gt;
--          (&amp;quot;Juan&amp;quot;,[(&amp;quot;Alg&amp;quot;,5),(&amp;quot;Cal&amp;quot;,1),(&amp;quot;Inf&amp;quot;,2),(&amp;quot;Fis&amp;quot;,9)]),&lt;br /&gt;
--          (&amp;quot;Alba&amp;quot;,[(&amp;quot;Alg&amp;quot;,5),(&amp;quot;Cal&amp;quot;,6),(&amp;quot;Inf&amp;quot;,6),(&amp;quot;Fis&amp;quot;,5)]),&lt;br /&gt;
--          (&amp;quot;Pedro&amp;quot;,[(&amp;quot;Alg&amp;quot;,9),(&amp;quot;Cal&amp;quot;,5),(&amp;quot;Inf&amp;quot;,3),(&amp;quot;Fis&amp;quot;,1)])]&lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    calificaciones :: [(String,[(String,Int)])] -&amp;gt; String -&amp;gt; [(String,Int)]&lt;br /&gt;
-- tal que (calificaciones t p) es la lista de las calificaciones de la&lt;br /&gt;
-- persona p en la lista t. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; calificaciones t1 &amp;quot;Pedro&amp;quot;&lt;br /&gt;
--    [(&amp;quot;Alg&amp;quot;,9),(&amp;quot;Cal&amp;quot;,5),(&amp;quot;Inf&amp;quot;,3),(&amp;quot;Fis&amp;quot;,1)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
t1 :: [(String,[(String,Int)])]&lt;br /&gt;
t1 = [(&amp;quot;Ana&amp;quot;,[(&amp;quot;Alg&amp;quot;,1),(&amp;quot;Cal&amp;quot;,3),(&amp;quot;Inf&amp;quot;,8),(&amp;quot;Fis&amp;quot;,2)]),&lt;br /&gt;
      (&amp;quot;Juan&amp;quot;,[(&amp;quot;Alg&amp;quot;,5),(&amp;quot;Cal&amp;quot;,1),(&amp;quot;Inf&amp;quot;,2),(&amp;quot;Fis&amp;quot;,9)]),&lt;br /&gt;
      (&amp;quot;Alba&amp;quot;,[(&amp;quot;Alg&amp;quot;,5),(&amp;quot;Cal&amp;quot;,6),(&amp;quot;Inf&amp;quot;,6),(&amp;quot;Fis&amp;quot;,5)]),&lt;br /&gt;
      (&amp;quot;Pedro&amp;quot;,[(&amp;quot;Alg&amp;quot;,9),(&amp;quot;Cal&amp;quot;,5),(&amp;quot;Inf&amp;quot;,3),(&amp;quot;Fis&amp;quot;,1)])]&lt;br /&gt;
&lt;br /&gt;
calificaciones :: [(String,[(String,Int)])] -&amp;gt; String -&amp;gt; [(String,Int)]&lt;br /&gt;
calificaciones t p = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir la función  &lt;br /&gt;
--    todasAprobadas :: [(String,[(String,Int)])] -&amp;gt; String -&amp;gt; Bool&lt;br /&gt;
-- tal que (todasAprobadas t p) se cumple si en la lista t, p tiene&lt;br /&gt;
-- todas las asignaturas aprobadas. Por ejemplo,&lt;br /&gt;
--    todasAprobadas t1 &amp;quot;Alba&amp;quot;  ==  True&lt;br /&gt;
--    todasAprobadas t1 &amp;quot;Pedro&amp;quot; ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
todasAprobadas :: [(String,[(String,Int)])] -&amp;gt; String -&amp;gt; Bool&lt;br /&gt;
todasAprobadas t p = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Definir la función  &lt;br /&gt;
--    aprobados :: [(String,[(String,Int)])] -&amp;gt; [String]&lt;br /&gt;
-- tal que (aprobados t) es la lista de los alumnos de la lista de notas&lt;br /&gt;
-- t que han aprobado todas las asignaturas.Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; aprobados t1  ==  [&amp;quot;Alba&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
aprobados :: [(String,[(String,Int)])] -&amp;gt; [String]&lt;br /&gt;
aprobados t = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Un número n es de Angelini si n y 2n tienen algún&lt;br /&gt;
-- dígito común. Por ejemplo, 2014 es un número de Angelini ya que 2014&lt;br /&gt;
-- y su doble (4028) comparten los dígitos 4 y 0.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    angelini :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (angelini n) se verifica si n es un número de Angelini. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    angelini 2014  ==  True&lt;br /&gt;
--    angelini 2067  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
angelini :: Integer -&amp;gt; Bool&lt;br /&gt;
angelini n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir la función &lt;br /&gt;
--    unitarios :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal (unitarios n) es la lista de números [n,nn, nnn, ....]. Por&lt;br /&gt;
-- ejemplo.  &lt;br /&gt;
--    take 7 (unitarios 3) == [3,33,333,3333,33333,333333,3333333]&lt;br /&gt;
--    take 3 (unitarios 1) == [1,11,111]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
unitarios :: Int -&amp;gt; [Int]&lt;br /&gt;
unitarios x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir la función &lt;br /&gt;
--    multiplosUnitarios :: Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (multiplosUnitarios x y n) es la lista de los n primeros&lt;br /&gt;
-- múltiplos de x cuyo único dígito es y. Por ejemplo,&lt;br /&gt;
--    multiplosUnitarios 7 1 2  == [111111,111111111111]&lt;br /&gt;
--    multiplosUnitarios 11 3 5 == [33,3333,333333,33333333,3333333333]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
multiplosUnitarios :: Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; [Int]&lt;br /&gt;
multiplosUnitarios x y n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Definir la función &lt;br /&gt;
--    masOcurrentes :: Eq a =&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (masOcurrentes xs) es la lista de los elementos de xs que&lt;br /&gt;
-- ocurren el máximo número de veces. Por ejemplo,&lt;br /&gt;
--    masOcurrentes [1,2,3,4,3,2,3,1,4] == [3,3,3]&lt;br /&gt;
--    masOcurrentes [1,2,3,4,5,2,3,1,4] == [1,2,3,4,2,3,1,4]&lt;br /&gt;
--    masOcurrentes &amp;quot;Salamanca&amp;quot;         == &amp;quot;aaaa&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
masOcurrentes :: Eq a =&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
masOcurrentes xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. La suma de la serie&lt;br /&gt;
--    1/1^2 + 1/2^2 + 1/3^2 + 1/4^2 + ...&lt;br /&gt;
-- es pi^2/6. Por tanto, pi se puede aproximar mediante la raíz cuadrada&lt;br /&gt;
-- de 6 por la suma de la serie.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función aproximaPi tal que (aproximaPi n) es la aproximación &lt;br /&gt;
-- de pi obtenida mediante n términos de la serie. Por ejemplo, &lt;br /&gt;
--    aproximaPi 4    == 2.9226129861250305&lt;br /&gt;
--    aproximaPi 1000 == 3.1406380562059946&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
aproximaPi n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Una representación de 20 en base 2 es [0,0,1,0,1] pues&lt;br /&gt;
-- 20 = 1*2^2 + 1*2^4. Y una representación de 46 en base 3 es [1,0,2,1]&lt;br /&gt;
-- pues 46 = 1*3^0 + 0*3^1 + 2*3^2 + 1*3^3.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    deBaseABase10 :: Int -&amp;gt; [Int] -&amp;gt; Int&lt;br /&gt;
-- tal que (deBaseABase10 b xs) es el número n tal que su representación&lt;br /&gt;
-- en base b es xs. Por ejemplo, &lt;br /&gt;
--    deBaseABase10 2 [0,0,1,0,1]      == 20&lt;br /&gt;
--    deBaseABase10 2 [1,1,0,1]        == 11&lt;br /&gt;
--    deBaseABase10 3 [1,0,2,1]        == 46&lt;br /&gt;
--    deBaseABase10 5 [0,2,1,3,1,4,1]  == 2916&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
deBaseABase10 :: Int -&amp;gt; [Int] -&amp;gt; Int&lt;br /&gt;
deBaseABase10 b xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12.1. Definir la función &lt;br /&gt;
--    conPos :: [a] -&amp;gt; [(a,Int)]&lt;br /&gt;
-- tal que (conPos xs) es la lista obtenida a partir de xs especificando&lt;br /&gt;
-- las posiciones de sus elementos. Por ejemplo, &lt;br /&gt;
--    conPos [1,5,0,7] == [(1,0),(5,1),(0,2),(7,3)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
conPos :: [a] -&amp;gt; [(a,Int)]&lt;br /&gt;
conPos xs = [ (x,y) | (x,y)&amp;lt;- zip xs ys]&lt;br /&gt;
       where ys = [0..length xs - 1]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12.2. Definir la &lt;br /&gt;
--    pares :: [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (pares cs) es la cadena formada por los caracteres en&lt;br /&gt;
-- posición par de cs. Por ejemplo,  &lt;br /&gt;
--    pares &amp;quot;el cielo sobre berlin&amp;quot; == &amp;quot;e il or eln&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
pares :: [a] -&amp;gt; [a]&lt;br /&gt;
pares cs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. Dos listas xs, ys de la misma longitud son&lt;br /&gt;
-- perpendiculares si el producto escalar de ambas es 0, donde el&lt;br /&gt;
-- producto escalar de dos listas de enteros xs e ys viene&lt;br /&gt;
-- dado por la suma de los productos de los elementos correspondientes.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    perpendiculares :: (Num a, Eq a) =&amp;gt; [a] -&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (perpendiculares xs yss) es la lista de los elementos de yss&lt;br /&gt;
-- que son perpendiculares a xs. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; perpendiculares [1,0,1] [[0,1,0], [2,3,1], [-1,7,1],[3,1,0]]&lt;br /&gt;
--    [[0,1,0],[-1,7,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
perpendiculares :: (Num a, Eq a) =&amp;gt; [a] -&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
perpendiculares xs yss = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. Dada una lista de números enteros, definiremos el&lt;br /&gt;
-- mayor salto como el mayor valor de las diferencias (en valor&lt;br /&gt;
-- absoluto) entre números consecutivos de la lista. Por ejemplo, dada&lt;br /&gt;
-- la lista [2,5,-3] las distancias son &lt;br /&gt;
--    3 (valor absoluto de la resta 2 - 5) y&lt;br /&gt;
--    8 (valor absoluto de la resta de 5 y (-3))&lt;br /&gt;
-- Por tanto, su mayor salto es 8. No está definido el mayor salto para&lt;br /&gt;
-- listas con menos de 2 elementos&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    mayorSalto :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (mayorSalto xs) es el mayor salto de la lista xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    mayorSalto [1,5]              == 4&lt;br /&gt;
--    mayorSalto [10,-10,1,4,20,-2] == 22&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
mayorSalto :: [Integer] -&amp;gt; Integer&lt;br /&gt;
mayorSalto xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15. Definir la función&lt;br /&gt;
--    longCamino :: [(Float,Float)] -&amp;gt; Float&lt;br /&gt;
-- tal que (longCamino xs) es la longitud del camino determinado por los&lt;br /&gt;
-- puntos del plano listados en xs. Por ejemplo,&lt;br /&gt;
--    longCamino [(0,0),(1,0),(2,1),(2,0)] == 3.4142137&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
longCamino :: [(Float,Float)] -&amp;gt; Float&lt;br /&gt;
longCamino xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16. Definir la función&lt;br /&gt;
--    numeroConsecutivos :: (Num a, Eq a) =&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
-- tal que (numeroConsecutivosC xs) es la cantidad de números&lt;br /&gt;
-- consecutivos que aparecen al comienzo de la lista xs. Por ejemplo, &lt;br /&gt;
--    numeroConsecutivosC [1,3,5,7,9]      ==  1&lt;br /&gt;
--    numeroConsecutivosC [1,2,3,4,5,7,9]  ==  5&lt;br /&gt;
--    numeroConsecutivosC []               ==  0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numeroConsecutivos :: (Num a, Eq a) =&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
numeroConsecutivos = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 17. Definir la función&lt;br /&gt;
--    sumaEquidistantes :: Num a =&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (sumaEquidistantes xs) es la lista sumando el primer elemento&lt;br /&gt;
-- de xs con el último, el segundo con el penúltimo y así&lt;br /&gt;
-- sucesivamente. Por ejemplo, &lt;br /&gt;
--    sumaEquidistantes [6,5,3,1]              ==  [7,8]&lt;br /&gt;
--    sumaEquidistantes [6,5,3]                ==  [9,10]&lt;br /&gt;
--    sumaEquidistantes [3,2,3,2]              ==  [5,5]&lt;br /&gt;
--    sumaEquidistantes [6,5,3,1,2,0,4,7,8,9]  ==  [15,13,10,5,2]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaEquidistantes :: Num a =&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
sumaEquidistantes xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 18. La distancia entre dos números es el valor absoluto de&lt;br /&gt;
-- su diferencia. Por ejemplo, la distancia entre 2 y 5 es 3. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    cercanos :: [Int] -&amp;gt; [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (cercanos xs ys) es la lista de pares de elementos de xs e ys&lt;br /&gt;
-- cuya distancia es mínima. Por ejemplo,&lt;br /&gt;
--    cercanos [3,7,2,1] [5,11,9]  ==  [(3,5),(7,5),(7,9)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cercanos :: [Int] -&amp;gt; [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
cercanos xs ys = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19. [De la IMO 1996]. Una sucesión [a(0),a(1),...,a(n)] &lt;br /&gt;
-- se denomina cuadrática si para cada i   {1, 2,..., n} se cumple que &lt;br /&gt;
--    |a(i)- a(i-1)| = i^2 .&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    esCuadratica :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (esCuadratica xs) se verifica si xs cuadrática.  Por ejemplo,&lt;br /&gt;
--    esCuadratica [2,1,-3,6]                      == True&lt;br /&gt;
--    esCuadratica [2,1,3,5]                       == False&lt;br /&gt;
--    esCuadratica [3,4,8,17,33,58,94,45,-19,-100] == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esCuadratica :: [Int] -&amp;gt; Bool&lt;br /&gt;
esCuadratica xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20.1. Definir las funciones  &lt;br /&gt;
--    ultima, primera :: Int -&amp;gt; Int  &lt;br /&gt;
-- tales que&lt;br /&gt;
-- * (ultima n) es la última cifra del número natural n y&lt;br /&gt;
-- * (primera n) es la primera cifra del número natural n.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    ultima  711 = 1         &lt;br /&gt;
--    primera 711 = 7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ultima, primera :: Int -&amp;gt; Int  &lt;br /&gt;
ultima n  = undefined&lt;br /&gt;
primera n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20.2. Definir la función&lt;br /&gt;
--    encadenadoC :: [Int] -&amp;gt; Bool&lt;br /&gt;
-- tal que (encadenadoC xs) se verifica si xs es una lista de enteros&lt;br /&gt;
-- positivos encadenados (es decir, la última cifra de cada número&lt;br /&gt;
-- coincide con la primera del siguiente en la lista). Por ejemplo,&lt;br /&gt;
--   encadenadoC [711,1024,413,367]  ==  True&lt;br /&gt;
--   encadenadoC [711,1024,213,367]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
encadenadoC :: [Int] -&amp;gt; Bool&lt;br /&gt;
encadenadoC xs = undefined&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_3&amp;diff=254</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_3&amp;diff=254"/>
		<updated>2021-10-20T10:06:25Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_3.hs (20 de Octubre de 2021)&lt;br /&gt;
-- Definiciones por comprensión&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 por&lt;br /&gt;
-- comprensión correspondientes al tema 5 que se encuentra&lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-5.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir, por comprensión, la función &lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer &lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + n^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- José Manuel García, Lucía Hernández&lt;br /&gt;
sumaDeCuadrados :: Integer -&amp;gt; Integer &lt;br /&gt;
sumaDeCuadrados n = sum [(x^2) | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir por comprensión la función &lt;br /&gt;
--    replica :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (replica n x) es la lista formada por n copias del elemento&lt;br /&gt;
-- x. Por ejemplo,  &lt;br /&gt;
--    replica 4 7     ==  [7,7,7,7]&lt;br /&gt;
--    replica 3 True  ==  [True, True, True]&lt;br /&gt;
-- Nota: La función replica es equivalente a la predefinida replicate.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- José Manuel García&lt;br /&gt;
replica :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
replica n x = [x | _ &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función &lt;br /&gt;
--    suma :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal (suma n) es la suma de los n primeros números. Por ejemplo,&lt;br /&gt;
--    suma 3  ==  6&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- José Manuel García&lt;br /&gt;
suma :: Integer -&amp;gt; Integer&lt;br /&gt;
suma n = sum [x | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Los triángulos aritméticos se forman como sigue&lt;br /&gt;
--     1&lt;br /&gt;
--     2  3&lt;br /&gt;
--     4  5  6&lt;br /&gt;
--     7  8  9 10&lt;br /&gt;
--    11 12 13 14 15&lt;br /&gt;
--    16 17 18 19 20 21&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    linea :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (linea n) es la línea n-ésima de los triángulos&lt;br /&gt;
-- aritméticos. Por ejemplo,  &lt;br /&gt;
--    linea 4  ==  [7,8,9,10]&lt;br /&gt;
--    linea 5  ==  [11,12,13,14,15]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- José Manuel García&lt;br /&gt;
linea :: Integer -&amp;gt; [Integer]&lt;br /&gt;
linea n = [(1 + sum [1..n-1])..(1 + sum [1..n-1])+(n-1)]&lt;br /&gt;
-- cada primer elemento de cada fila sigue la siguiente sucesión:&lt;br /&gt;
-- F1 : 1  = 1&lt;br /&gt;
-- F2 : 1 + 1 = 2&lt;br /&gt;
-- F3 : 1 + 1 + 2 = 4&lt;br /&gt;
-- F4 : 1 + 1 + 2 + 3 = 7&lt;br /&gt;
-- F5 : 1 + 1 + 2 + 3 + 4 = 11&lt;br /&gt;
-- ...&lt;br /&gt;
-- Además, la Fila n tiene n elementos (Ej. la fila 3 es [4,5,6], tiene 3 elementos)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Definir la función &lt;br /&gt;
--    triangulo :: Integer -&amp;gt; [[Integer]]&lt;br /&gt;
-- tal que (triangulo n) es el triángulo aritmético de altura n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    triangulo 3  ==  [[1],[2,3],[4,5,6]]&lt;br /&gt;
--    triangulo 4  ==  [[1],[2,3],[4,5,6],[7,8,9,10]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- José Manuel García&lt;br /&gt;
triangulo :: Integer -&amp;gt; [[Integer]]&lt;br /&gt;
triangulo n = [linea x | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir por comprensión la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo,  &lt;br /&gt;
--    perfectos 500  ==  [6,28,496]&lt;br /&gt;
-- Indicación: Usar la función factores del tema 5.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Un número natural n se denomina abundante si es menor&lt;br /&gt;
-- que la suma de sus divisores propios. Por ejemplo, 12 y 30 son&lt;br /&gt;
-- abundantes pero 5 y 28 no lo son.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    numeroAbundante :: Int -&amp;gt; Bool&lt;br /&gt;
-- tal que (numeroAbundante n) se verifica si n es un número&lt;br /&gt;
-- abundante. Por ejemplo,  &lt;br /&gt;
--    numeroAbundante 5  == False&lt;br /&gt;
--    numeroAbundante 12 == True&lt;br /&gt;
--    numeroAbundante 28 == False&lt;br /&gt;
--    numeroAbundante 30 == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numeroAbundante :: Int -&amp;gt; Bool&lt;br /&gt;
numeroAbundante n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir la función  &lt;br /&gt;
--    numerosAbundantesMenores :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (numerosAbundantesMenores n) es la lista de números&lt;br /&gt;
-- abundantes menores o iguales que n. Por ejemplo,&lt;br /&gt;
--    numerosAbundantesMenores 50  ==  [12,18,20,24,30,36,40,42,48]&lt;br /&gt;
--    numerosAbundantesMenores 48  ==  [12,18,20,24,30,36,40,42,48]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numerosAbundantesMenores :: Int -&amp;gt; [Int]&lt;br /&gt;
numerosAbundantesMenores n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir la función &lt;br /&gt;
--    todosPares :: Int -&amp;gt; Bool&lt;br /&gt;
-- tal que (todosPares n) se verifica si todos los números abundantes&lt;br /&gt;
-- menores o iguales que n son pares. Por ejemplo,&lt;br /&gt;
--    todosPares 10    ==  True&lt;br /&gt;
--    todosPares 100   ==  True&lt;br /&gt;
--    todosPares 1000  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
todosPares :: Int -&amp;gt; Bool&lt;br /&gt;
todosPares n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.4. Definir la constante &lt;br /&gt;
--    primerAbundanteImpar :: Int&lt;br /&gt;
-- que calcule el primer número natural abundante impar. Determinar el&lt;br /&gt;
-- valor de dicho número.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
primerAbundanteImpar :: Int&lt;br /&gt;
primerAbundanteImpar = undefined&lt;br /&gt;
&lt;br /&gt;
-- Su cálculo es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6 (Problema 1 del proyecto Euler) Definir la función &lt;br /&gt;
--    euler1 :: Int -&amp;gt; Int&lt;br /&gt;
-- tal que (euler1 n) es la suma de todos los múltiplos de 3 ó 5 menores&lt;br /&gt;
-- que n. Por ejemplo,&lt;br /&gt;
--    euler1 10  ==  23&lt;br /&gt;
-- &lt;br /&gt;
-- Calcular la suma de todos los múltiplos de 3 ó 5 menores que 1000.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
euler1 :: Int -&amp;gt; Int&lt;br /&gt;
euler1 n = undefined&lt;br /&gt;
&lt;br /&gt;
-- Cálculo:&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir la función &lt;br /&gt;
--    circulo :: Int -&amp;gt; Int&lt;br /&gt;
-- tal que (circulo n) es el la cantidad de pares de números naturales&lt;br /&gt;
-- (x,y) que se encuentran dentro del círculo de radio n. Por ejemplo, &lt;br /&gt;
--    circulo 3  ==  9&lt;br /&gt;
--    circulo 4  ==  15&lt;br /&gt;
--    circulo 5  ==  22&lt;br /&gt;
--    circulo 100  ==  7949&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
circulo :: Int -&amp;gt; Int&lt;br /&gt;
circulo n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir la función &lt;br /&gt;
--    aproxE :: Double -&amp;gt; [Double]&lt;br /&gt;
-- tal que (aproXE n) es la lista cuyos elementos son los términos de la&lt;br /&gt;
-- sucesión (1+1/m)**m desde 1 hasta n. Por ejemplo, &lt;br /&gt;
--    aproxE 1 == [2.0]&lt;br /&gt;
--    aproxE 4 == [2.0,2.25,2.37037037037037,2.44140625]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
aproxE :: Double -&amp;gt; [Double]&lt;br /&gt;
aproxE n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. żCuál es el límite de la sucesión (1+1/m)**m ?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Definir la función &lt;br /&gt;
--    errorAproxE :: Double -&amp;gt; Double&lt;br /&gt;
-- tal que (errorE x) es el menor número de términos de la sucesión&lt;br /&gt;
-- (1+1/m)**m necesarios para obtener su límite con un error menor que&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    errorAproxE 0.1    ==  13.0&lt;br /&gt;
--    errorAproxE 0.01   ==  135.0&lt;br /&gt;
--    errorAproxE 0.001  ==  1359.0&lt;br /&gt;
-- Indicación: En Haskell, e se calcula como (exp 1).&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
errorAproxE :: Double -&amp;gt; Double&lt;br /&gt;
errorAproxE x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir la función&lt;br /&gt;
--    aproxLimSeno :: Double -&amp;gt; [Double]&lt;br /&gt;
-- tal que (aproxLimSeno n) es la lista cuyos elementos son los términos&lt;br /&gt;
-- de la sucesión  &lt;br /&gt;
--    sen(1/m) &lt;br /&gt;
--    --------&lt;br /&gt;
--      1/m &lt;br /&gt;
-- desde 1 hasta n. Por ejemplo,&lt;br /&gt;
--    aproxLimSeno 1 == [0.8414709848078965]&lt;br /&gt;
--    aproxLimSeno 2 == [0.8414709848078965,0.958851077208406]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
aproxLimSeno :: Double -&amp;gt; [Double]&lt;br /&gt;
aproxLimSeno n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. żCuál es el límite de la sucesión sen(1/m)/(1/m) ?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. Definir la función &lt;br /&gt;
--    errorLimSeno :: Double -&amp;gt; Double&lt;br /&gt;
-- tal que (errorLimSeno x) es el menor número de términos de la sucesión &lt;br /&gt;
-- sen(1/m)/(1/m) necesarios para obtener su límite con un error menor&lt;br /&gt;
-- que x. Por ejemplo, &lt;br /&gt;
--    errorLimSeno 0.1     ==   2.0&lt;br /&gt;
--    errorLimSeno 0.01    ==   5.0&lt;br /&gt;
--    errorLimSeno 0.001   ==  13.0&lt;br /&gt;
--    errorLimSeno 0.0001  ==  41.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
errorLimSeno :: Double -&amp;gt; Double&lt;br /&gt;
errorLimSeno x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.1. Definir la función &lt;br /&gt;
--    calculaPi :: Double -&amp;gt; Double&lt;br /&gt;
-- tal que (calculaPi n) es la aproximación del número pi calculada&lt;br /&gt;
-- mediante la expresión &lt;br /&gt;
--    4*(1 - 1/3 + 1/5 - 1/7 + ...+ (-1)**n/(2*n+1))&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    calculaPi 3    ==  2.8952380952380956&lt;br /&gt;
--    calculaPi 300  ==  3.1449149035588526&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
calculaPi :: Double -&amp;gt; Double&lt;br /&gt;
calculaPi n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.2. Definir la función &lt;br /&gt;
--    errorPi :: Double -&amp;gt; Double&lt;br /&gt;
-- tal que (errorPi x) es el menor número de términos de la serie&lt;br /&gt;
--    4*(1 - 1/3 + 1/5 - 1/7 + ...+ (-1)**n/(2*n+1))&lt;br /&gt;
-- necesarios para obtener pi con un error menor que x. Por ejemplo,&lt;br /&gt;
--    errorPi 0.1    ==    9.0&lt;br /&gt;
--    errorPi 0.01   ==   99.0&lt;br /&gt;
--    errorPi 0.001  ==  999.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
errorPi :: Double -&amp;gt; Double&lt;br /&gt;
errorPi x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.1. Una terna (x,y,z) de enteros positivos es pitagórica&lt;br /&gt;
-- si x^2 + y^2 = z^2. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir, por comprensión, la función &lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int,Int,Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    pitagoricas 10  ==  [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int,Int,Int)]&lt;br /&gt;
pitagoricas n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.2. Definir la función &lt;br /&gt;
--    numeroDePares :: (Int,Int,Int) -&amp;gt; Int&lt;br /&gt;
-- tal que (numeroDePares t) es el número de elementos pares de la terna&lt;br /&gt;
-- t. Por ejemplo,&lt;br /&gt;
--    numeroDePares (3,5,7)  ==  0&lt;br /&gt;
--    numeroDePares (3,6,7)  ==  1&lt;br /&gt;
--    numeroDePares (3,6,4)  ==  2&lt;br /&gt;
--    numeroDePares (4,6,4)  ==  3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numeroDePares :: (Int,Int,Int) -&amp;gt; Int&lt;br /&gt;
numeroDePares (x,y,z) = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.3. Definir la función&lt;br /&gt;
--    conjetura :: Int -&amp;gt; Bool&lt;br /&gt;
-- tal que (conjetura n) se verifica si todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n tiene un número impar de números&lt;br /&gt;
-- pares. Por ejemplo,&lt;br /&gt;
--    conjetura 10  ==  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
conjetura :: Int -&amp;gt; Bool&lt;br /&gt;
conjetura n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.4. Demostrar la conjetura para todas las ternas&lt;br /&gt;
-- pitagóricas. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12.1. (Problema 9 del Proyecto Euler). Una terna pitagórica&lt;br /&gt;
-- es una terna de números naturales (a,b,c) tal que a&amp;lt;b&amp;lt;c y&lt;br /&gt;
-- a^2+b^2=c^2. Por ejemplo (3,4,5) es una terna pitagórica. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    ternasPitagoricas :: Integer -&amp;gt; [[Integer]]&lt;br /&gt;
-- tal que (ternasPitagoricas x) es la lista de las ternas pitagóricas&lt;br /&gt;
-- cuya suma es x. Por ejemplo,&lt;br /&gt;
--    ternasPitagoricas 12  ==  [(3,4,5)]&lt;br /&gt;
--    ternasPitagoricas 60  ==  [(10,24,26),(15,20,25)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ternasPitagoricas :: Integer -&amp;gt; [(Integer,Integer,Integer)]&lt;br /&gt;
ternasPitagoricas x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12.2. Definir la constante &lt;br /&gt;
--    euler9 :: Integer&lt;br /&gt;
-- tal que euler9 es producto abc donde (a,b,c) es la única terna&lt;br /&gt;
-- pitagórica tal que a+b+c=1000.  &lt;br /&gt;
--&lt;br /&gt;
-- Calcular el valor de euler9.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
euler9 :: Integer&lt;br /&gt;
euler9 = undefined&lt;br /&gt;
&lt;br /&gt;
-- El cálculo del valor de euler9 es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. El producto escalar de dos listas de enteros xs y ys de&lt;br /&gt;
-- longitud n viene dado por la suma de los productos de los elementos&lt;br /&gt;
-- correspondientes. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir por comprensión la función &lt;br /&gt;
--    productoEscalar :: [Int] -&amp;gt; [Int] -&amp;gt; Int&lt;br /&gt;
-- tal que (productoEscalar xs ys) es el producto escalar de las listas&lt;br /&gt;
-- xs e ys. Por ejemplo,&lt;br /&gt;
--    productoEscalar [1,2,3] [4,5,6]  ==  32&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
productoEscalar :: [Int] -&amp;gt; [Int] -&amp;gt; Int&lt;br /&gt;
productoEscalar xs ys = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15. Los polinomios pueden representarse de forma dispersa o&lt;br /&gt;
-- densa. Por ejemplo, el polinomio 6x^4-5x^2+4x-7 se puede representar&lt;br /&gt;
-- de forma dispersa por [6,0,-5,4,-7] y de forma densa por&lt;br /&gt;
-- [(4,6),(2,-5),(1,4),(0,-7)].  &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    densa :: [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (densa xs) es la representación densa del polinomio cuya&lt;br /&gt;
-- representación dispersa es xs. Por ejemplo, &lt;br /&gt;
--   densa [6,0,-5,4,-7]  ==  [(4,6),(2,-5),(1,4),(0,-7)]&lt;br /&gt;
--   densa [6,0,0,3,0,4]  ==  [(5,6),(2,3),(0,4)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
densa :: [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
densa xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16.0. La bases de datos sobre actividades de personas pueden&lt;br /&gt;
-- representarse mediante listas de elementos de la forma (a,b,c,d),&lt;br /&gt;
-- donde a es el nombre de la persona, b su actividad, c su fecha de&lt;br /&gt;
-- nacimiento y d la de su fallecimiento. Un ejemplo es la siguiente que&lt;br /&gt;
-- usaremos a lo largo de este ejercicio,&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
personas :: [(String,String,Int,Int)]&lt;br /&gt;
personas = [(&amp;quot;Cervantes&amp;quot;,&amp;quot;Literatura&amp;quot;,1547,1616),&lt;br /&gt;
            (&amp;quot;Velazquez&amp;quot;,&amp;quot;Pintura&amp;quot;,1599,1660),&lt;br /&gt;
            (&amp;quot;Picasso&amp;quot;,&amp;quot;Pintura&amp;quot;,1881,1973),&lt;br /&gt;
            (&amp;quot;Beethoven&amp;quot;,&amp;quot;Musica&amp;quot;,1770,1823),&lt;br /&gt;
            (&amp;quot;Poincare&amp;quot;,&amp;quot;Ciencia&amp;quot;,1854,1912),&lt;br /&gt;
            (&amp;quot;Quevedo&amp;quot;,&amp;quot;Literatura&amp;quot;,1580,1654),&lt;br /&gt;
            (&amp;quot;Goya&amp;quot;,&amp;quot;Pintura&amp;quot;,1746,1828),&lt;br /&gt;
            (&amp;quot;Einstein&amp;quot;,&amp;quot;Ciencia&amp;quot;,1879,1955),&lt;br /&gt;
            (&amp;quot;Mozart&amp;quot;,&amp;quot;Musica&amp;quot;,1756,1791),&lt;br /&gt;
            (&amp;quot;Botticelli&amp;quot;,&amp;quot;Pintura&amp;quot;,1445,1510),&lt;br /&gt;
            (&amp;quot;Borromini&amp;quot;,&amp;quot;Arquitectura&amp;quot;,1599,1667),&lt;br /&gt;
            (&amp;quot;Bach&amp;quot;,&amp;quot;Musica&amp;quot;,1685,1750)]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16.1. Definir la función&lt;br /&gt;
--    nombres :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
-- tal que (nombres bd) es la lista de los nombres de las personas de la&lt;br /&gt;
-- base de datos bd. Por ejemplo,  &lt;br /&gt;
--    ghci&amp;gt; nombres personas&lt;br /&gt;
--     [&amp;quot;Cervantes&amp;quot;,&amp;quot;Velazquez&amp;quot;,&amp;quot;Picasso&amp;quot;,&amp;quot;Beethoven&amp;quot;,&amp;quot;Poincare&amp;quot;,&lt;br /&gt;
--      &amp;quot;Quevedo&amp;quot;,&amp;quot;Goya&amp;quot;,&amp;quot;Einstein&amp;quot;,&amp;quot;Mozart&amp;quot;,&amp;quot;Botticelli&amp;quot;,&amp;quot;Borromini&amp;quot;,&amp;quot;Bach&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nombres :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
nombres bd = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16.2. Definir la función&lt;br /&gt;
--    musicos :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
-- tal que (musicos bd) es la lista de los nombres de los músicos de la&lt;br /&gt;
-- base de datos bd. Por ejemplo,  &lt;br /&gt;
--    musicos personas  ==  [&amp;quot;Beethoven&amp;quot;,&amp;quot;Mozart&amp;quot;,&amp;quot;Bach&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
musicos :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
musicos bd = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16.3. Definir la función &lt;br /&gt;
--    seleccion :: [(String,String,Int,Int)] -&amp;gt; String -&amp;gt; [String]&lt;br /&gt;
-- tal que (seleccion bd m) es la lista de los nombres de las personas&lt;br /&gt;
-- de la base de datos bd cuya actividad es m. Por ejemplo,  &lt;br /&gt;
--    ghci&amp;gt; seleccion personas &amp;quot;Pintura&amp;quot;&lt;br /&gt;
--    [&amp;quot;Velazquez&amp;quot;,&amp;quot;Picasso&amp;quot;,&amp;quot;Goya&amp;quot;,&amp;quot;Botticelli&amp;quot;]&lt;br /&gt;
--    ghci&amp;gt; seleccion personas &amp;quot;Musica&amp;quot;&lt;br /&gt;
--    [&amp;quot;Beethoven&amp;quot;,&amp;quot;Mozart&amp;quot;,&amp;quot;Bach&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
seleccion :: [(String,String,Int,Int)] -&amp;gt; String -&amp;gt; [String]&lt;br /&gt;
seleccion bd m = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16.4. Definir, usando el apartado anterior, la función&lt;br /&gt;
--    musicos&amp;#039; :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
-- tal que (musicos&amp;#039; bd) es la lista de los nombres de los músicos de la&lt;br /&gt;
-- base de datos bd. Por ejemplo,   &lt;br /&gt;
--    ghci&amp;gt; musicos&amp;#039; personas&lt;br /&gt;
--    [&amp;quot;Beethoven&amp;quot;,&amp;quot;Mozart&amp;quot;,&amp;quot;Bach&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
musicos&amp;#039; :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
musicos&amp;#039; bd = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16.5. Definir la función &lt;br /&gt;
--    vivas :: [(String,String,Int,Int)] -&amp;gt; Int -&amp;gt; [String]&lt;br /&gt;
-- tal que (vivas bd a) es la lista de los nombres de las personas de la&lt;br /&gt;
-- base de datos bd  que estaban vivas en el ańo a. Por ejemplo,  &lt;br /&gt;
--    ghci&amp;gt; vivas personas 1600&lt;br /&gt;
--    [&amp;quot;Cervantes&amp;quot;,&amp;quot;Velazquez&amp;quot;,&amp;quot;Quevedo&amp;quot;,&amp;quot;Borromini&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
vivas :: [(String,String,Int,Int)] -&amp;gt; Int -&amp;gt; [String]&lt;br /&gt;
vivas ps a = undefined&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_3&amp;diff=252</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_3&amp;diff=252"/>
		<updated>2021-10-20T10:02:38Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_3.hs (20 de Octubre de 2021)&lt;br /&gt;
-- Definiciones por comprensión&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 por&lt;br /&gt;
-- comprensión correspondientes al tema 5 que se encuentra&lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-5.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir, por comprensión, la función &lt;br /&gt;
--    sumaDeCuadrados :: Integer -&amp;gt; Integer &lt;br /&gt;
-- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los&lt;br /&gt;
-- primeros n números; es decir, 1^2 + 2^2 + ... + n^2. Por ejemplo,&lt;br /&gt;
--    sumaDeCuadrados 3    ==  14&lt;br /&gt;
--    sumaDeCuadrados 100  ==  338350&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- José Manuel García&lt;br /&gt;
sumaDeCuadrados :: Integer -&amp;gt; Integer &lt;br /&gt;
sumaDeCuadrados n = sum [(x^2) | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir por comprensión la función &lt;br /&gt;
--    replica :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- tal que (replica n x) es la lista formada por n copias del elemento&lt;br /&gt;
-- x. Por ejemplo,  &lt;br /&gt;
--    replica 4 7     ==  [7,7,7,7]&lt;br /&gt;
--    replica 3 True  ==  [True, True, True]&lt;br /&gt;
-- Nota: La función replica es equivalente a la predefinida replicate.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- José Manuel García&lt;br /&gt;
replica :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
replica n x = [x | _ &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función &lt;br /&gt;
--    suma :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal (suma n) es la suma de los n primeros números. Por ejemplo,&lt;br /&gt;
--    suma 3  ==  6&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- José Manuel García&lt;br /&gt;
suma :: Integer -&amp;gt; Integer&lt;br /&gt;
suma n = sum [x | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Los triángulos aritméticos se forman como sigue&lt;br /&gt;
--     1&lt;br /&gt;
--     2  3&lt;br /&gt;
--     4  5  6&lt;br /&gt;
--     7  8  9 10&lt;br /&gt;
--    11 12 13 14 15&lt;br /&gt;
--    16 17 18 19 20 21&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    linea :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (linea n) es la línea n-ésima de los triángulos&lt;br /&gt;
-- aritméticos. Por ejemplo,  &lt;br /&gt;
--    linea 4  ==  [7,8,9,10]&lt;br /&gt;
--    linea 5  ==  [11,12,13,14,15]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- José Manuel García&lt;br /&gt;
linea :: Integer -&amp;gt; [Integer]&lt;br /&gt;
linea n = [(1 + sum [1..n-1])..(1 + sum [1..n-1])+(n-1)]&lt;br /&gt;
-- cada primer elemento de cada fila sigue la siguiente sucesión:&lt;br /&gt;
-- F1 : 1  = 1&lt;br /&gt;
-- F2 : 1 + 1 = 2&lt;br /&gt;
-- F3 : 1 + 1 + 2 = 4&lt;br /&gt;
-- F4 : 1 + 1 + 2 + 3 = 7&lt;br /&gt;
-- F5 : 1 + 1 + 2 + 3 + 4 = 11&lt;br /&gt;
-- ...&lt;br /&gt;
-- Además, la Fila n tiene n elementos (Ej. la fila 3 es [4,5,6], tiene 3 elementos)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Definir la función &lt;br /&gt;
--    triangulo :: Integer -&amp;gt; [[Integer]]&lt;br /&gt;
-- tal que (triangulo n) es el triángulo aritmético de altura n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    triangulo 3  ==  [[1],[2,3],[4,5,6]]&lt;br /&gt;
--    triangulo 4  ==  [[1],[2,3],[4,5,6],[7,8,9,10]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
triangulo :: Integer -&amp;gt; [[Integer]]&lt;br /&gt;
triangulo n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un entero positivo es perfecto si es igual a la suma de&lt;br /&gt;
-- sus factores, excluyendo el propio número. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir por comprensión la función &lt;br /&gt;
--    perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (perfectos n) es la lista de todos los números perfectos&lt;br /&gt;
-- menores que n. Por ejemplo,  &lt;br /&gt;
--    perfectos 500  ==  [6,28,496]&lt;br /&gt;
-- Indicación: Usar la función factores del tema 5.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Un número natural n se denomina abundante si es menor&lt;br /&gt;
-- que la suma de sus divisores propios. Por ejemplo, 12 y 30 son&lt;br /&gt;
-- abundantes pero 5 y 28 no lo son.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    numeroAbundante :: Int -&amp;gt; Bool&lt;br /&gt;
-- tal que (numeroAbundante n) se verifica si n es un número&lt;br /&gt;
-- abundante. Por ejemplo,  &lt;br /&gt;
--    numeroAbundante 5  == False&lt;br /&gt;
--    numeroAbundante 12 == True&lt;br /&gt;
--    numeroAbundante 28 == False&lt;br /&gt;
--    numeroAbundante 30 == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numeroAbundante :: Int -&amp;gt; Bool&lt;br /&gt;
numeroAbundante n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir la función  &lt;br /&gt;
--    numerosAbundantesMenores :: Int -&amp;gt; [Int]&lt;br /&gt;
-- tal que (numerosAbundantesMenores n) es la lista de números&lt;br /&gt;
-- abundantes menores o iguales que n. Por ejemplo,&lt;br /&gt;
--    numerosAbundantesMenores 50  ==  [12,18,20,24,30,36,40,42,48]&lt;br /&gt;
--    numerosAbundantesMenores 48  ==  [12,18,20,24,30,36,40,42,48]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numerosAbundantesMenores :: Int -&amp;gt; [Int]&lt;br /&gt;
numerosAbundantesMenores n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir la función &lt;br /&gt;
--    todosPares :: Int -&amp;gt; Bool&lt;br /&gt;
-- tal que (todosPares n) se verifica si todos los números abundantes&lt;br /&gt;
-- menores o iguales que n son pares. Por ejemplo,&lt;br /&gt;
--    todosPares 10    ==  True&lt;br /&gt;
--    todosPares 100   ==  True&lt;br /&gt;
--    todosPares 1000  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
todosPares :: Int -&amp;gt; Bool&lt;br /&gt;
todosPares n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.4. Definir la constante &lt;br /&gt;
--    primerAbundanteImpar :: Int&lt;br /&gt;
-- que calcule el primer número natural abundante impar. Determinar el&lt;br /&gt;
-- valor de dicho número.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
primerAbundanteImpar :: Int&lt;br /&gt;
primerAbundanteImpar = undefined&lt;br /&gt;
&lt;br /&gt;
-- Su cálculo es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6 (Problema 1 del proyecto Euler) Definir la función &lt;br /&gt;
--    euler1 :: Int -&amp;gt; Int&lt;br /&gt;
-- tal que (euler1 n) es la suma de todos los múltiplos de 3 ó 5 menores&lt;br /&gt;
-- que n. Por ejemplo,&lt;br /&gt;
--    euler1 10  ==  23&lt;br /&gt;
-- &lt;br /&gt;
-- Calcular la suma de todos los múltiplos de 3 ó 5 menores que 1000.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
euler1 :: Int -&amp;gt; Int&lt;br /&gt;
euler1 n = undefined&lt;br /&gt;
&lt;br /&gt;
-- Cálculo:&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir la función &lt;br /&gt;
--    circulo :: Int -&amp;gt; Int&lt;br /&gt;
-- tal que (circulo n) es el la cantidad de pares de números naturales&lt;br /&gt;
-- (x,y) que se encuentran dentro del círculo de radio n. Por ejemplo, &lt;br /&gt;
--    circulo 3  ==  9&lt;br /&gt;
--    circulo 4  ==  15&lt;br /&gt;
--    circulo 5  ==  22&lt;br /&gt;
--    circulo 100  ==  7949&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
circulo :: Int -&amp;gt; Int&lt;br /&gt;
circulo n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir la función &lt;br /&gt;
--    aproxE :: Double -&amp;gt; [Double]&lt;br /&gt;
-- tal que (aproXE n) es la lista cuyos elementos son los términos de la&lt;br /&gt;
-- sucesión (1+1/m)**m desde 1 hasta n. Por ejemplo, &lt;br /&gt;
--    aproxE 1 == [2.0]&lt;br /&gt;
--    aproxE 4 == [2.0,2.25,2.37037037037037,2.44140625]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
aproxE :: Double -&amp;gt; [Double]&lt;br /&gt;
aproxE n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. żCuál es el límite de la sucesión (1+1/m)**m ?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Definir la función &lt;br /&gt;
--    errorAproxE :: Double -&amp;gt; Double&lt;br /&gt;
-- tal que (errorE x) es el menor número de términos de la sucesión&lt;br /&gt;
-- (1+1/m)**m necesarios para obtener su límite con un error menor que&lt;br /&gt;
-- x. Por ejemplo, &lt;br /&gt;
--    errorAproxE 0.1    ==  13.0&lt;br /&gt;
--    errorAproxE 0.01   ==  135.0&lt;br /&gt;
--    errorAproxE 0.001  ==  1359.0&lt;br /&gt;
-- Indicación: En Haskell, e se calcula como (exp 1).&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
errorAproxE :: Double -&amp;gt; Double&lt;br /&gt;
errorAproxE x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir la función&lt;br /&gt;
--    aproxLimSeno :: Double -&amp;gt; [Double]&lt;br /&gt;
-- tal que (aproxLimSeno n) es la lista cuyos elementos son los términos&lt;br /&gt;
-- de la sucesión  &lt;br /&gt;
--    sen(1/m) &lt;br /&gt;
--    --------&lt;br /&gt;
--      1/m &lt;br /&gt;
-- desde 1 hasta n. Por ejemplo,&lt;br /&gt;
--    aproxLimSeno 1 == [0.8414709848078965]&lt;br /&gt;
--    aproxLimSeno 2 == [0.8414709848078965,0.958851077208406]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
aproxLimSeno :: Double -&amp;gt; [Double]&lt;br /&gt;
aproxLimSeno n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. żCuál es el límite de la sucesión sen(1/m)/(1/m) ?&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. Definir la función &lt;br /&gt;
--    errorLimSeno :: Double -&amp;gt; Double&lt;br /&gt;
-- tal que (errorLimSeno x) es el menor número de términos de la sucesión &lt;br /&gt;
-- sen(1/m)/(1/m) necesarios para obtener su límite con un error menor&lt;br /&gt;
-- que x. Por ejemplo, &lt;br /&gt;
--    errorLimSeno 0.1     ==   2.0&lt;br /&gt;
--    errorLimSeno 0.01    ==   5.0&lt;br /&gt;
--    errorLimSeno 0.001   ==  13.0&lt;br /&gt;
--    errorLimSeno 0.0001  ==  41.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
errorLimSeno :: Double -&amp;gt; Double&lt;br /&gt;
errorLimSeno x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.1. Definir la función &lt;br /&gt;
--    calculaPi :: Double -&amp;gt; Double&lt;br /&gt;
-- tal que (calculaPi n) es la aproximación del número pi calculada&lt;br /&gt;
-- mediante la expresión &lt;br /&gt;
--    4*(1 - 1/3 + 1/5 - 1/7 + ...+ (-1)**n/(2*n+1))&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    calculaPi 3    ==  2.8952380952380956&lt;br /&gt;
--    calculaPi 300  ==  3.1449149035588526&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
calculaPi :: Double -&amp;gt; Double&lt;br /&gt;
calculaPi n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.2. Definir la función &lt;br /&gt;
--    errorPi :: Double -&amp;gt; Double&lt;br /&gt;
-- tal que (errorPi x) es el menor número de términos de la serie&lt;br /&gt;
--    4*(1 - 1/3 + 1/5 - 1/7 + ...+ (-1)**n/(2*n+1))&lt;br /&gt;
-- necesarios para obtener pi con un error menor que x. Por ejemplo,&lt;br /&gt;
--    errorPi 0.1    ==    9.0&lt;br /&gt;
--    errorPi 0.01   ==   99.0&lt;br /&gt;
--    errorPi 0.001  ==  999.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
errorPi :: Double -&amp;gt; Double&lt;br /&gt;
errorPi x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.1. Una terna (x,y,z) de enteros positivos es pitagórica&lt;br /&gt;
-- si x^2 + y^2 = z^2. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir, por comprensión, la función &lt;br /&gt;
--    pitagoricas :: Int -&amp;gt; [(Int,Int,Int)]&lt;br /&gt;
-- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n. Por ejemplo, &lt;br /&gt;
--    pitagoricas 10  ==  [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int,Int,Int)]&lt;br /&gt;
pitagoricas n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.2. Definir la función &lt;br /&gt;
--    numeroDePares :: (Int,Int,Int) -&amp;gt; Int&lt;br /&gt;
-- tal que (numeroDePares t) es el número de elementos pares de la terna&lt;br /&gt;
-- t. Por ejemplo,&lt;br /&gt;
--    numeroDePares (3,5,7)  ==  0&lt;br /&gt;
--    numeroDePares (3,6,7)  ==  1&lt;br /&gt;
--    numeroDePares (3,6,4)  ==  2&lt;br /&gt;
--    numeroDePares (4,6,4)  ==  3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
numeroDePares :: (Int,Int,Int) -&amp;gt; Int&lt;br /&gt;
numeroDePares (x,y,z) = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.3. Definir la función&lt;br /&gt;
--    conjetura :: Int -&amp;gt; Bool&lt;br /&gt;
-- tal que (conjetura n) se verifica si todas las ternas pitagóricas&lt;br /&gt;
-- cuyas componentes están entre 1 y n tiene un número impar de números&lt;br /&gt;
-- pares. Por ejemplo,&lt;br /&gt;
--    conjetura 10  ==  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
conjetura :: Int -&amp;gt; Bool&lt;br /&gt;
conjetura n = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11.4. Demostrar la conjetura para todas las ternas&lt;br /&gt;
-- pitagóricas. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12.1. (Problema 9 del Proyecto Euler). Una terna pitagórica&lt;br /&gt;
-- es una terna de números naturales (a,b,c) tal que a&amp;lt;b&amp;lt;c y&lt;br /&gt;
-- a^2+b^2=c^2. Por ejemplo (3,4,5) es una terna pitagórica. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    ternasPitagoricas :: Integer -&amp;gt; [[Integer]]&lt;br /&gt;
-- tal que (ternasPitagoricas x) es la lista de las ternas pitagóricas&lt;br /&gt;
-- cuya suma es x. Por ejemplo,&lt;br /&gt;
--    ternasPitagoricas 12  ==  [(3,4,5)]&lt;br /&gt;
--    ternasPitagoricas 60  ==  [(10,24,26),(15,20,25)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ternasPitagoricas :: Integer -&amp;gt; [(Integer,Integer,Integer)]&lt;br /&gt;
ternasPitagoricas x = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12.2. Definir la constante &lt;br /&gt;
--    euler9 :: Integer&lt;br /&gt;
-- tal que euler9 es producto abc donde (a,b,c) es la única terna&lt;br /&gt;
-- pitagórica tal que a+b+c=1000.  &lt;br /&gt;
--&lt;br /&gt;
-- Calcular el valor de euler9.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
euler9 :: Integer&lt;br /&gt;
euler9 = undefined&lt;br /&gt;
&lt;br /&gt;
-- El cálculo del valor de euler9 es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. El producto escalar de dos listas de enteros xs y ys de&lt;br /&gt;
-- longitud n viene dado por la suma de los productos de los elementos&lt;br /&gt;
-- correspondientes. &lt;br /&gt;
-- &lt;br /&gt;
-- Definir por comprensión la función &lt;br /&gt;
--    productoEscalar :: [Int] -&amp;gt; [Int] -&amp;gt; Int&lt;br /&gt;
-- tal que (productoEscalar xs ys) es el producto escalar de las listas&lt;br /&gt;
-- xs e ys. Por ejemplo,&lt;br /&gt;
--    productoEscalar [1,2,3] [4,5,6]  ==  32&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
productoEscalar :: [Int] -&amp;gt; [Int] -&amp;gt; Int&lt;br /&gt;
productoEscalar xs ys = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. Definir, por comprensión, la función&lt;br /&gt;
--    sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos&lt;br /&gt;
-- consecutivos de la lista xs. Por ejemplo,&lt;br /&gt;
--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]&lt;br /&gt;
--    sumaConsecutivos [3]        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15. Los polinomios pueden representarse de forma dispersa o&lt;br /&gt;
-- densa. Por ejemplo, el polinomio 6x^4-5x^2+4x-7 se puede representar&lt;br /&gt;
-- de forma dispersa por [6,0,-5,4,-7] y de forma densa por&lt;br /&gt;
-- [(4,6),(2,-5),(1,4),(0,-7)].  &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    densa :: [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (densa xs) es la representación densa del polinomio cuya&lt;br /&gt;
-- representación dispersa es xs. Por ejemplo, &lt;br /&gt;
--   densa [6,0,-5,4,-7]  ==  [(4,6),(2,-5),(1,4),(0,-7)]&lt;br /&gt;
--   densa [6,0,0,3,0,4]  ==  [(5,6),(2,3),(0,4)]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
densa :: [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
densa xs = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16.0. La bases de datos sobre actividades de personas pueden&lt;br /&gt;
-- representarse mediante listas de elementos de la forma (a,b,c,d),&lt;br /&gt;
-- donde a es el nombre de la persona, b su actividad, c su fecha de&lt;br /&gt;
-- nacimiento y d la de su fallecimiento. Un ejemplo es la siguiente que&lt;br /&gt;
-- usaremos a lo largo de este ejercicio,&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
personas :: [(String,String,Int,Int)]&lt;br /&gt;
personas = [(&amp;quot;Cervantes&amp;quot;,&amp;quot;Literatura&amp;quot;,1547,1616),&lt;br /&gt;
            (&amp;quot;Velazquez&amp;quot;,&amp;quot;Pintura&amp;quot;,1599,1660),&lt;br /&gt;
            (&amp;quot;Picasso&amp;quot;,&amp;quot;Pintura&amp;quot;,1881,1973),&lt;br /&gt;
            (&amp;quot;Beethoven&amp;quot;,&amp;quot;Musica&amp;quot;,1770,1823),&lt;br /&gt;
            (&amp;quot;Poincare&amp;quot;,&amp;quot;Ciencia&amp;quot;,1854,1912),&lt;br /&gt;
            (&amp;quot;Quevedo&amp;quot;,&amp;quot;Literatura&amp;quot;,1580,1654),&lt;br /&gt;
            (&amp;quot;Goya&amp;quot;,&amp;quot;Pintura&amp;quot;,1746,1828),&lt;br /&gt;
            (&amp;quot;Einstein&amp;quot;,&amp;quot;Ciencia&amp;quot;,1879,1955),&lt;br /&gt;
            (&amp;quot;Mozart&amp;quot;,&amp;quot;Musica&amp;quot;,1756,1791),&lt;br /&gt;
            (&amp;quot;Botticelli&amp;quot;,&amp;quot;Pintura&amp;quot;,1445,1510),&lt;br /&gt;
            (&amp;quot;Borromini&amp;quot;,&amp;quot;Arquitectura&amp;quot;,1599,1667),&lt;br /&gt;
            (&amp;quot;Bach&amp;quot;,&amp;quot;Musica&amp;quot;,1685,1750)]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16.1. Definir la función&lt;br /&gt;
--    nombres :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
-- tal que (nombres bd) es la lista de los nombres de las personas de la&lt;br /&gt;
-- base de datos bd. Por ejemplo,  &lt;br /&gt;
--    ghci&amp;gt; nombres personas&lt;br /&gt;
--     [&amp;quot;Cervantes&amp;quot;,&amp;quot;Velazquez&amp;quot;,&amp;quot;Picasso&amp;quot;,&amp;quot;Beethoven&amp;quot;,&amp;quot;Poincare&amp;quot;,&lt;br /&gt;
--      &amp;quot;Quevedo&amp;quot;,&amp;quot;Goya&amp;quot;,&amp;quot;Einstein&amp;quot;,&amp;quot;Mozart&amp;quot;,&amp;quot;Botticelli&amp;quot;,&amp;quot;Borromini&amp;quot;,&amp;quot;Bach&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
nombres :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
nombres bd = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16.2. Definir la función&lt;br /&gt;
--    musicos :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
-- tal que (musicos bd) es la lista de los nombres de los músicos de la&lt;br /&gt;
-- base de datos bd. Por ejemplo,  &lt;br /&gt;
--    musicos personas  ==  [&amp;quot;Beethoven&amp;quot;,&amp;quot;Mozart&amp;quot;,&amp;quot;Bach&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
musicos :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
musicos bd = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16.3. Definir la función &lt;br /&gt;
--    seleccion :: [(String,String,Int,Int)] -&amp;gt; String -&amp;gt; [String]&lt;br /&gt;
-- tal que (seleccion bd m) es la lista de los nombres de las personas&lt;br /&gt;
-- de la base de datos bd cuya actividad es m. Por ejemplo,  &lt;br /&gt;
--    ghci&amp;gt; seleccion personas &amp;quot;Pintura&amp;quot;&lt;br /&gt;
--    [&amp;quot;Velazquez&amp;quot;,&amp;quot;Picasso&amp;quot;,&amp;quot;Goya&amp;quot;,&amp;quot;Botticelli&amp;quot;]&lt;br /&gt;
--    ghci&amp;gt; seleccion personas &amp;quot;Musica&amp;quot;&lt;br /&gt;
--    [&amp;quot;Beethoven&amp;quot;,&amp;quot;Mozart&amp;quot;,&amp;quot;Bach&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
seleccion :: [(String,String,Int,Int)] -&amp;gt; String -&amp;gt; [String]&lt;br /&gt;
seleccion bd m = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16.4. Definir, usando el apartado anterior, la función&lt;br /&gt;
--    musicos&amp;#039; :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
-- tal que (musicos&amp;#039; bd) es la lista de los nombres de los músicos de la&lt;br /&gt;
-- base de datos bd. Por ejemplo,   &lt;br /&gt;
--    ghci&amp;gt; musicos&amp;#039; personas&lt;br /&gt;
--    [&amp;quot;Beethoven&amp;quot;,&amp;quot;Mozart&amp;quot;,&amp;quot;Bach&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
musicos&amp;#039; :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
musicos&amp;#039; bd = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16.5. Definir la función &lt;br /&gt;
--    vivas :: [(String,String,Int,Int)] -&amp;gt; Int -&amp;gt; [String]&lt;br /&gt;
-- tal que (vivas bd a) es la lista de los nombres de las personas de la&lt;br /&gt;
-- base de datos bd  que estaban vivas en el ańo a. Por ejemplo,  &lt;br /&gt;
--    ghci&amp;gt; vivas personas 1600&lt;br /&gt;
--    [&amp;quot;Cervantes&amp;quot;,&amp;quot;Velazquez&amp;quot;,&amp;quot;Quevedo&amp;quot;,&amp;quot;Borromini&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
vivas :: [(String,String,Int,Int)] -&amp;gt; Int -&amp;gt; [String]&lt;br /&gt;
vivas ps a = undefined&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=251</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=251"/>
		<updated>2021-10-20T06:50:18Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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,Lucía González, Adolfo Sagrera Vivancos, José Manuel García, Fernando Martínez Ortega, Ángela Pérez Ríos&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,Lucía González, Adolfo Sagrera Vivancos, José Manuel García, Fernando Martínez Ortega, Ángela Pérez Ríos&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, Lucía González, José Manuel García, Fernando Martínez Ortega, Ángela Pérez Ríos&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, Lucía González&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,Lucía González,Laura Arango, Adolfo Sagrera Vivancos, José Manuel García, Ángela Pérez Ríos&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, Lucía González&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, Lucía González&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, Lucía González&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, Lucía González&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;
-- Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González&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, Lucía González, 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, Lucía González&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;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
interseccion3 ::  Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccion3 i1 i2 | null i1 || null i2 || a &amp;gt; d || b &amp;lt; c = []&lt;br /&gt;
                    | otherwise = [max a c, min b 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;
-- 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, Lucía González, Adolfo Sagrera Vivancos&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, José Manuel García, Lucía González&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;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
formaReducida1 :: (Int,Int) -&amp;gt; (Int,Int) &lt;br /&gt;
formaReducida1 (a,b) = (s*abs(div a z), abs(div b z)) where z = gcd a b&lt;br /&gt;
                                                           s = signum (a*b)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
formaReducida2 :: (Int,Int) -&amp;gt; (Int,Int) &lt;br /&gt;
formaReducida2 (a,b) | a == 0 &amp;amp;&amp;amp; b == 0  = (0,0)&lt;br /&gt;
                     | otherwise         = (s*abs(div a z), abs(div b z))&lt;br /&gt;
                                         where z = gcd a b&lt;br /&gt;
                                               s = signum (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, Lucía González&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;
--Adolfo Sagrera Vivancos&lt;br /&gt;
sumaRacional3 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
sumaRacional3 (a,b) (c,d) = formaReducida(((div t b)*a + (div t d)*c), t) where t = lcm 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;
-- 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, Adolfo Sagrera Vivancos, Lucía González&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, Adolfo Sagrera Vivancos, Lucía González&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, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González&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;
-- José Manuel García&lt;br /&gt;
igualdadRacional3 :: (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;
-- César Fornis Catalán&lt;br /&gt;
igualdadRacional4 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; Bool&lt;br /&gt;
igualdadRacional4 (a,b) (c,d) = 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;
-- Elsa Domínguez&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 = (fst x * snd x /= 0) &amp;amp;&amp;amp; (fst y * snd y /= 0) &amp;amp;&amp;amp; (fst z * snd z /= 0) ==&amp;gt; &lt;br /&gt;
  igualdadRacional (productoRacional (sumaRacional x y) z) (sumaRacional (productoRacional x z) (productoRacional y z)) &lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_distributiva&lt;br /&gt;
-- +++ OK, passed 100 tests.&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, Adolfo Sagrera Vivancos, Lucía González&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, Adolfo Sagrera Vivancos,  Lucía González&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,  Lucía González&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, Adolfo Sagrera Vivancos&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, José Manuel García, Adolfo Sagrera Vivancos,  Lucía González&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,  Lucía González&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;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
mayorRectangulo2 :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
mayorRectangulo2 (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;
-- 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;
-- Adolfo Sagrera Vivancos, Lucía González&lt;br /&gt;
cuadrante3 :: (Int,Int) -&amp;gt; Int&lt;br /&gt;
cuadrante3 (x1,x2) | x1 == 0 || x2 == 0 = 0&lt;br /&gt;
                  | x1 == 0 &amp;amp;&amp;amp; x2 == 0 = 0&lt;br /&gt;
                  | 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;
-- José Manuel García&lt;br /&gt;
cuadrante4 :: (Int,Int) -&amp;gt; Int&lt;br /&gt;
cuadrante4 (x1,x2) | x1 * x2 == 0 = 0&lt;br /&gt;
                   | 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;
                  &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, Adolfo Sagrera Vivancos, Lucía González&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, Adolfo Sagrera Vivancos, Lucía González&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, Laura Arango, Elsa Domínguez, Lucía González&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;
-- Lucía Hernández&lt;br /&gt;
distancia1 :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; Float&lt;br /&gt;
distancia1 p1 p2  =  sqrt((fst p2 - fst p1)^2 + (snd p2-snd p1)^2)&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
distancia2 :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; Float&lt;br /&gt;
distancia2 (x1,x2) (y1,y2) = sqrt(t^2 + s^2)&lt;br /&gt;
                          where t = x1-y1&lt;br /&gt;
                                s = x2-y2&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, Adolfo Sagrera Vivancos, Lucía González&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, Lucía González&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;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
puntoMedio1 :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; (Float,Float)&lt;br /&gt;
puntoMedio1 (x1,x2) (y1,y2) = (t/2, s/2)&lt;br /&gt;
                           where t = x1 + y1&lt;br /&gt;
                                 s = x2 + y2&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, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González&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;
-- Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González&lt;br /&gt;
xor2&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor2&amp;#039; True y = not y&lt;br /&gt;
xor2&amp;#039; 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;
-- Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González&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, Adolfo Sagrera Vivancos, Lucía González&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;
-- Elsa Domínguez&lt;br /&gt;
xor4&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor4&amp;#039;&amp;#039; 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;
-- Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González&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, Elsa Domínguez, Lucía González&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;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
or3&amp;#039;&amp;#039; :: Bool -&amp;gt; Bool -&amp;gt; Bool-&amp;gt; Bool &lt;br /&gt;
or3&amp;#039;&amp;#039; a b c | a==True || b==True || c==True = True&lt;br /&gt;
          | otherwise = False&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;
-- Ana Sosa Caballero, Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González&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, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González&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, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González&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, Lucía González&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;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
siglo20&amp;#039; :: Int -&amp;gt; Bool&lt;br /&gt;
siglo20&amp;#039; 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;
-- 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, Lucía González&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 = 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;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
noSiglo201 :: Int -&amp;gt; Bool&lt;br /&gt;
noSiglo201 x = not (siglo20 x)&lt;br /&gt;
noSiglo20&amp;#039;1 x = not(x&amp;gt;1901) &amp;amp;&amp;amp; not(x&amp;lt;2000)&lt;br /&gt;
noSiglo20&amp;#039;&amp;#039;1 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, Adolfo Sagrera Vivancos, Elsa Domínguez, Lucía González&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, Lucía González&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                         = True&lt;br /&gt;
                  | otherwise                        = False &lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
aprueba3 :: Float -&amp;gt; Float -&amp;gt; Float -&amp;gt; Bool&lt;br /&gt;
aprueba3 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 = True&lt;br /&gt;
                 | otherwise = False&lt;br /&gt;
&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, Elsa Domínguez, Lucía González&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>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=234</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=234"/>
		<updated>2021-10-15T07:04:06Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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;
igualdadRacional3 :: (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, José Manuel García&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>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=231</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=231"/>
		<updated>2021-10-15T06:40:01Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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&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>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=229</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=229"/>
		<updated>2021-10-14T19:18:44Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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&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&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&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&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&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>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=227</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=227"/>
		<updated>2021-10-14T18:05:16Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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&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&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&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;
                   &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;
&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&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&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;
-- ---------------------------------------------------------------------&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&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&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>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=225</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=225"/>
		<updated>2021-10-14T17:47:39Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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&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&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&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;
                   &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&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;
&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&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&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;
-- ---------------------------------------------------------------------&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&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&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>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=224</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=224"/>
		<updated>2021-10-14T15:26:33Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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&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&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&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;
                   &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&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&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;
&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&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&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;
-- ---------------------------------------------------------------------&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&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&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>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=218</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=218"/>
		<updated>2021-10-10T20:08:44Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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&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&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&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 &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 = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&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&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&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;
&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&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&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&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;
&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&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&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;
-- ---------------------------------------------------------------------&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&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&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>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=217</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=217"/>
		<updated>2021-10-10T19:59:44Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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&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&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&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&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 &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 = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&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&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&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;
&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&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&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&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;
&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&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&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;
-- ---------------------------------------------------------------------&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&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&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>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=204</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=204"/>
		<updated>2021-10-08T08:06:50Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_1.hs (24 de septiembre de 2021)&lt;br /&gt;
-- Definiciones por composición sobre números, listas y booleanos. &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;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- En esta relación se plantean ejercicios con definiciones de funciones &lt;br /&gt;
-- por composición sobre números, listas y booleanos.&lt;br /&gt;
-- &lt;br /&gt;
-- Para solucionar los ejercicios puede ser útil el manual de&lt;br /&gt;
-- funciones de Haskell que se encuentra en http://bit.ly/1uJZiqi y su&lt;br /&gt;
-- resumen en http://bit.ly/ZwSMHO&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Manuel Alcaide García, Lucía Hernández, Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Irene Ortega Moncayo, Laura Arango, Ana Sosa Caballero, Adolfo Sagrera Vivancos, Pelayo INfante Pérez, Sara Cerro Torres, Manuel Fco Moreno, Virginia Sánchez, Carmen Blanco, José Manuel Garcia, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
-- Antonio López García, César Fornis Catalán&lt;br /&gt;
media3 x y z = (sum [x,y,z])/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función sumaMonedas tal que &lt;br /&gt;
-- (sumaMonedas a b c d e) es la suma de los euros correspondientes a &lt;br /&gt;
-- a monedas de 1 euro, b de 2 euros, c de 5 euros, d 10 euros y&lt;br /&gt;
-- e de 20 euros. Por ejemplo,&lt;br /&gt;
--    sumaMonedas 0 0 0 0 1  ==  20&lt;br /&gt;
--    sumaMonedas 0 0 8 0 3  == 100&lt;br /&gt;
--    sumaMonedas 1 1 1 1 1  ==  38&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Lucía Hernández, Manuel Fco Moreno, Laura Arango, Ana Sosa Caballero, Sara Cerro Torres, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez&lt;br /&gt;
sumamonedas a b c d e = a+b*2+c*5+d*10+e*20&lt;br /&gt;
-- Antonio López García, Irene Ortega, César Fornis Catalán, Virginia Sánchez, Elsa Domínguez&lt;br /&gt;
sumaMonedas a b c d e = sum [a, b*2, c*5, d*10, e*20]&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González, Pelayo Infante, Francisco José Espinosa, Carmen Blanco, José Manuel García&lt;br /&gt;
sumaMonedas a b c d e = a*1+b*2+c*5+d*10+e*20&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función volumenEsfera tal que &lt;br /&gt;
-- (volumenEsfera r) es el volumen de la esfera de radio r. Por ejemplo,&lt;br /&gt;
--    volumenEsfera 10  ==  4188.790204786391&lt;br /&gt;
-- Indicación: Usar la constante pi.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Adriana Gordillo Melero, Lucía Hernández, Nicolás Rodríguez Ruiz, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Pelayo Infante, Sara Cerro Torres, José Manuel García, Manuel Fco Moreno, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
 volumenEsfera r = (4/3)*pi*r^3&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Carmen Blanco&lt;br /&gt;
volumenEsfera r =(4/3)*(pi*r^3)&lt;br /&gt;
-- Irene Ortega&lt;br /&gt;
volumenEsfera r = pi*(r^3)*4/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
-- César Fornis Catalán, Virginia Sánchez&lt;br /&gt;
volumenEsfera r = (4*pi*r^3)/3&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir la función areaDeCoronaCircular tal que &lt;br /&gt;
-- (areaDeCoronaCircular r1 r2) es el área de una corona circular de&lt;br /&gt;
-- radio interior r1 y radio exterior r2. Por ejemplo,&lt;br /&gt;
--    areaDeCoronaCircular 1 2 == 9.42477796076938&lt;br /&gt;
--    areaDeCoronaCircular 2 5 == 65.97344572538566&lt;br /&gt;
--    areaDeCoronaCircular 3 5 == 50.26548245743669&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Adriana Gordillo Melero, Antonio López García, Lucía González, Nicolás Rodríguez Ruiz, Sara Cerro Torres, Elsa Domínguez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*r2^2 - pi*r1^2&lt;br /&gt;
--Álvaro Cano, Ana Sosa Caballero, Irene Ortega, César Fornis Catalán,Manuel Fco Moreno, José Manuel García, Rafael Gómez, Iván García Rodríguez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*(r2^2-r1^2)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
areaDeCoronaCircular r1 r2 = areaCirculo r2 - areaCirculo r1&lt;br /&gt;
                             where areaCirculo r = pi*r^2&lt;br /&gt;
--Adolfo Sagrera Vivancos, Pelayo Infante , Francisco José Espinosa, Jaime Chaves Navarro&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*r2^2)-(pi*r1^2)&lt;br /&gt;
-- Carmen Blanco&lt;br /&gt;
-- Virginia Sánchez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*(r2)^2) - (pi*(r1)^2)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- Indicación: Usar la función rem&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Adriana Gordillo Melero, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Adolfo Sagrera Vivancos Francisco José Espinosa, Lucía González, Nicolás Rodríguez Ruiz, Irene Ortega, Carmen Blanco, Manuel Fco Moreno, César Fornis Catalán, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Definir la función maxTres tal que (maxTres x y z) es&lt;br /&gt;
-- el máximo de x, y y z. Por ejemplo,&lt;br /&gt;
--    maxTres 6 2 4  ==  6&lt;br /&gt;
--    maxTres 6 7 4  ==  7&lt;br /&gt;
--    maxTres 6 7 9  ==  9&lt;br /&gt;
-- Indicación: Usar la función max.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adriana Gordillo, Irene Ortega, Nicolás Rodríguez Ruiz, Manuel Fco Moreno, Rafael Gómez, Jaime Chaves Navarro&lt;br /&gt;
maxTres x y z = max(max x y)(z)&lt;br /&gt;
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos, Iván García Rodríguez&lt;br /&gt;
maxTres x y z = max x t&lt;br /&gt;
                where t = max y z&lt;br /&gt;
&lt;br /&gt;
-- Antonio López García, Lucía González, Carmen Blanco&lt;br /&gt;
maxTres x y z = maximum [x,y,z]&lt;br /&gt;
--César Fornis Catalán, José Manuel García, Elsa Domínguez&lt;br /&gt;
maxTres x y z = max (max x y) z&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir la función rota1 tal que (rota1 xs) es la lista&lt;br /&gt;
-- obtenida poniendo el primer elemento de xs al final de la lista. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    rota1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adriana Gordillo, Ana Sosa Caballero , Irene Ortega, Lucía González, Nicolás Rodríguez Ruiz, Carmen Blanco, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Manuel Fco Moreno, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
rota1 xs = tail xs ++ [head xs]&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
rota1 xs = drop 1 xs ++ take 1 xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Adriana Gordillo, Ana Sosa Caballero, Antonio López García, Irene Ortega, Lucía González, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Manuel Fco Moreno, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
rota n xs = drop n xs ++ take n xs&lt;br /&gt;
&lt;br /&gt;
-- Fernando Ruiz (mejora para conseguir rotar el vector un número mayor de veces que de elementos en el vector)&lt;br /&gt;
rota n xs = drop (mod n (length xs)) xs ++ take (mod n (length xs)) xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Definir la función rango tal que (rango xs) es la&lt;br /&gt;
-- lista formada por el menor y mayor elemento de xs.&lt;br /&gt;
--    rango [3,2,7,5]  ==  [2,7]&lt;br /&gt;
-- Indicación: Se pueden usar minimum y maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Irene Ortega, Lucía González, Manuel Fco Moreno, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Jaime Chaves Navarro, Sara Cerro Torres, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
rango xs = [minimum xs] ++ [maximum xs]&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García, Iván García Rodríguez&lt;br /&gt;
rango xs = [minimum xs, maximum xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir la función palindromo tal que (palindromo xs) se&lt;br /&gt;
-- verifica si xs es un palíndromo; es decir, es lo mismo leer xs de&lt;br /&gt;
-- izquierda a derecha que de derecha a izquierda. Por ejemplo,&lt;br /&gt;
--    palindromo [3,2,5,2,3]    ==  True&lt;br /&gt;
--    palindromo [3,2,5,6,2,3]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Álvaro Cano, José Manuel Sánchez Parra, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía Hernández, Manuel Alcaide, Lucía González , Irene Ortega, José Manuel García ,Rafael Gómez, Manuel Fco Moreno, Adolfo Sagrera Vivancos, Jaime Chaves Navarro, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
palindromo xs = xs == reverse xs&lt;br /&gt;
--Iván García Rodríguez&lt;br /&gt;
palindromo xs = if xs==reverse xs&lt;br /&gt;
  then &amp;quot;True&amp;quot;&lt;br /&gt;
  else &amp;quot;False&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Definir la función interior tal que (interior xs) es la&lt;br /&gt;
-- lista obtenida eliminando los extremos de la lista xs. Por ejemplo,&lt;br /&gt;
--    interior [2,5,3,7,3]  ==  [5,3,7]&lt;br /&gt;
--    interior [2..7]       ==  [3,4,5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández, Ana Sosa Caballero, Lucía González, Manuel Fco Moreno, Adolfo Sagrera Vivancos, Adriana Gordillo&lt;br /&gt;
interior xs = tail (init xs)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
interior xs = drop 1 (init xs)&lt;br /&gt;
--Fernando Ruiz, Antonio López García, Irene Ortega, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
interior xs = init (tail xs)&lt;br /&gt;
--Manuel Alcaide García&lt;br /&gt;
interior xs = init (drop 1 xs)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
interior xs = reverse (take ((length js)-1) js)&lt;br /&gt;
         where js = reverse (take ((length xs)-1) xs)&lt;br /&gt;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
interior xs = reverse(tail(reverse(tail xs)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función finales tal que (finales n xs) es la&lt;br /&gt;
-- lista formada por los n finales elementos de xs. Por ejemplo,&lt;br /&gt;
--    finales 3 [2,5,4,7,9,6]  ==  [7,9,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Álvaro Cano&lt;br /&gt;
finales n xs = drop n xs&lt;br /&gt;
-- Lucía Hernández, Adolfo Sagrera Vivancos, Nicolás Rodríguez Ruiz&lt;br /&gt;
finales n xs = reverse (take n (reverse xs))&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero&lt;br /&gt;
finales n xs = drop m xs&lt;br /&gt;
               where m = length xs - n&lt;br /&gt;
-- Antonio López García, Fernando Ruiz Mazo, Pelayo Infante, Manuel Fco Moreno, Manuel Alcaide García, Irene Ortega, Adriana Gordillo, Iván García Rodríguez, Elsa Domínguez, Lucía González&lt;br /&gt;
finales n xs = drop (length xs - n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. Definir la función segmento tal que (segmento m n xs) es&lt;br /&gt;
-- la lista de los elementos de xs comprendidos entre las posiciones m y&lt;br /&gt;
-- n. Por ejemplo,&lt;br /&gt;
--    segmento 3 4 [3,4,1,2,7,9,0]  ==  [1,2]&lt;br /&gt;
--    segmento 3 5 [3,4,1,2,7,9,0]  ==  [1,2,7]&lt;br /&gt;
--    segmento 5 3 [3,4,1,2,7,9,0]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
segmento m n xs = drop (m-1) (reverse (drop a ys))&lt;br /&gt;
                  where a  = length xs - n&lt;br /&gt;
                        ys = reverse xs&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García, Lucía González, Manuel Fco Moreno, Iván García Rodríguez, Adolfo Sagrera Vivancos&lt;br /&gt;
segmento m n xs = drop (m-1) (take n xs)&lt;br /&gt;
-- Fernando Ruiz &lt;br /&gt;
segmento m n xs = reverse (drop ((length xs)-n+m-2)(reverse (drop (m-1) xs)))&lt;br /&gt;
--Lucía Hernández, José Manuel García&lt;br /&gt;
segmento m n xs = take (n-m+1)(drop(m-1) xs)&lt;br /&gt;
--Manuel Alcaide García, Irene Ortega, Nicolás Rodríguez Ruiz&lt;br /&gt;
segmento m n xs = take (n-(m-1)) (drop (m-1) xs)&lt;br /&gt;
--Pelayo Infante,]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango&lt;br /&gt;
extremos n xs = take n xs ++ finales n XS&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Fernando Ruiz, Adriana Gordillo, Manuel Fco Moreno,Adolfo Sagrera Vivancos, Nicolás Rodríguez Ruiz, Lucía González&lt;br /&gt;
extremos n xs = take n xs ++ reverse (take n (reverse xs))&lt;br /&gt;
-- Irene Ortega, Pelayo Infante, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
extremos n xs = take n xs  ++  drop (length xs-n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15. Definir la función mediano tal que (mediano x y z) es el&lt;br /&gt;
-- número mediano de los tres números x, y y z. Por ejemplo,&lt;br /&gt;
--    mediano 3 2 5  ==  3&lt;br /&gt;
--    mediano 2 4 5  ==  4&lt;br /&gt;
--    mediano 2 6 5  ==  5&lt;br /&gt;
--    mediano 2 6 6  ==  6&lt;br /&gt;
-- Indicación: Usar maximum y minimum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango, José Manuel García&lt;br /&gt;
 mediano x y z = max x (min y z) (Contraejemplo : mediano 8 10 3)&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
mediano x y z = minimum [maximum [x,y], z] (Contraejemplo : mediano 8 10 3)&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
mediano x y z = maximum [minimum [x,y], minimum[x,z], minimum[y,z]]&lt;br /&gt;
-- Fernando Ruiz Mazo, Irene Ortega&lt;br /&gt;
mediano x y z = minimum ([maximum [x,y]] ++ [maximum [y,z]] ++ [maximum [x,z]])&lt;br /&gt;
-- Adriana Gordillo, Elsa Domínguez, Adolfo Sagrera Vivancos, Manuel Fco Moreno&lt;br /&gt;
mediano x y z = (x+y+z)-maximum[x,y,z]-minimum[x,y,z]&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
mediano x y z = maximum [minimum [x,y], minimum [maximum[x,y],z]]&lt;br /&gt;
-- Iván García Rodríguez&lt;br /&gt;
mediano x y z = max x a where a=min y z&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16. Definir la función tresIguales tal que &lt;br /&gt;
-- (tresIguales x y z) se verifica si los elementos x, y y z son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    tresIguales 4 4 4  ==  True&lt;br /&gt;
--    tresIguales 4 3 4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Lucía Hernández, Irene Ortega, Adriana Gordillo, Manuel Fco Moreno, Elsa Domínguez, Nicolás Rodríguez Ruiz&lt;br /&gt;
tresIguales x y z = x==y &amp;amp;&amp;amp; x==z&lt;br /&gt;
--Pelayo Infante&lt;br /&gt;
tresIguales x y z = x^3==x*y*z&lt;br /&gt;
--Iván García Rodríguez&lt;br /&gt;
tresIguales x y z = if x==y &amp;amp;&amp;amp; y==z&lt;br /&gt;
  then &amp;quot;True&amp;quot;&lt;br /&gt;
  else &amp;quot;False&amp;quot;&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González&lt;br /&gt;
tresIguales x y z = x==y &amp;amp;&amp;amp; y==z&lt;br /&gt;
--José Manuel García&lt;br /&gt;
tresIguales x y z = if x == y &amp;amp;&amp;amp; x == z then True else False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 17. Definir la función tresDiferentes tal que &lt;br /&gt;
-- (tresDiferentes x y z) se verifica si los elementos x, y y z son&lt;br /&gt;
-- distintos. Por ejemplo, &lt;br /&gt;
--    tresDiferentes 3 5 2  ==  True&lt;br /&gt;
--    tresDiferentes 3 5 3  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Lucía Hernández, Adriana Gordillo&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; x/=z&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
tresDiferentes x y z = and [x/=y, y/=z, x/=z]&lt;br /&gt;
--Irene Ortega&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; x/=z &amp;amp;&amp;amp; y/=x&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González, Manuel Fco Moreno&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; y/=z &amp;amp;&amp;amp; x/=z&lt;br /&gt;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
tresDiferentes x y z = not(x==y || x==z || z==y)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
tresDiferentes x y z = if x /= y &amp;amp;&amp;amp; x /= z &amp;amp;&amp;amp; y /= z then True else False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 18. Definir la función cuatroIguales tal que &lt;br /&gt;
-- (cuatroIguales x y z u) se verifica si los elementos x, y, z y u son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    cuatroIguales 5 5 5 5   ==  True&lt;br /&gt;
--    cuatroIguales 5 5 4 5   ==  False&lt;br /&gt;
-- Indicación: Usar la función tresIguales.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Elsa Domínguez, Lucía González&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z == True &amp;amp;&amp;amp; x==u&lt;br /&gt;
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Adolfo Sagrera Vivancos, Manuel Fco Moreno, Adriana Gordillo, Irene Ortega&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z &amp;amp;&amp;amp; x==u&lt;br /&gt;
-- José Manuel García&lt;br /&gt;
cuatroIguales x y z u = x==y &amp;amp;&amp;amp; y==z &amp;amp;&amp;amp; z==u&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicios para trabajar con Data.List. Ver:&lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/Funciones_basicas.html&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19. Definir la función unicos, tal que (unicos xs)&lt;br /&gt;
-- devuelva la cantidad de elementos únicos que hay en la lista xs.&lt;br /&gt;
-- Por ejemplo, &lt;br /&gt;
--    unicos [1,4,8,2,1,4,6,1]  == 5 &lt;br /&gt;
--    unicos [10,9,8,10,5,10]  == 4&lt;br /&gt;
--    unicos [10,9,8]  == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Lucía Hernández, Adriana Gordillo, Elsa Domínguez, Lucía González, Manuel Fco Moreno, Adolfo Sagrera Vivancos, José Manuel García, Irene Ortega&lt;br /&gt;
unicos xs = length (nub xs)&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
unicos xs = length(group(sort xs))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20. Definir la función segundoMinimo, tal que (segundoMinimo xs)&lt;br /&gt;
-- devuelve el segundo elemento más pequeńo de la lista xs, obviando &lt;br /&gt;
-- repeticiones. Por ejemplo, &lt;br /&gt;
--    segundoMinimo [6,9,2,4]  ==  4&lt;br /&gt;
--    segundoMinimo [0.5,1.2,0.5,4.4,0.5]  ==  1.2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango&lt;br /&gt;
segundoMinimo xs = sort (nub xs) !! 1&lt;br /&gt;
--Lucía Hernández, Irene Ortega&lt;br /&gt;
segundoMinimo xs = minimum (delete(minimum (xs))(nub xs))&lt;br /&gt;
-- Adriana Gordillo&lt;br /&gt;
segundoMinimo xs = minimum (filter (&amp;gt;minimum xs) xs)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
segundoMinimo xs = head (tail(nub (sort xs)))&lt;br /&gt;
-- Manuel Fco Moreno&lt;br /&gt;
segundoMinimo xs = last (take 2 (sort(nub xs)))&lt;br /&gt;
--Pelayo Infante, Lucía González&lt;br /&gt;
segundoMinimo xs = head ( drop 1 (sort (nub xs)))&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
segundoMinimo xs = minimum (drop 1(sort(nub xs))) &lt;br /&gt;
--José Manuel García&lt;br /&gt;
segundoMinimo xs = minimum (delete (minimum js) js)&lt;br /&gt;
                   where js = nub xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 21. Definir la función kMaximo, tal que (kMaximo n xs) &lt;br /&gt;
-- devuelve el k-máximo elemento de xs (es decir, el que está en la&lt;br /&gt;
-- posición k de valores más altos), obviando repeticiones. Por ejemplo, &lt;br /&gt;
--    kMaximo 2 [6,9,2,4]  == 6&lt;br /&gt;
--    kMaximo 3 [10,9,8,10,5]  == 8&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Elsa Domínguez, Lucía González, Manuel Fco Moreno&lt;br /&gt;
kMaximo k xs = reverse (sort (nub xs)) !! (k-1)&lt;br /&gt;
--José Manuel Sánchez Parra&lt;br /&gt;
kMaximo k xs = maximum(take k xs)&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
kMaximo k xs = head(drop(k-1) (reverse(sort (nub xs))))&lt;br /&gt;
--Antonio Medinilla Garófano&lt;br /&gt;
quitarMaximo xs = delete (maximum xs) xs&lt;br /&gt;
kMaximo k xs = maximum ((iterate quitarMaximo (nub xs)) !! (k-1))&lt;br /&gt;
--Fernando Ruiz Mazo&lt;br /&gt;
kMaximoRecursivo k xs = if k==1 then maximum(nub(xs)) else kMaximoRecursivo (k-1) (init(sort(nub xs)))&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
kMaximo k xs = maximum(drop (k-1)(reverse(sort(nub xs))))&lt;br /&gt;
--César Fornis Catalán&lt;br /&gt;
kMaximo k xs = head(drop (k-1) (reverse(sort(nub xs))))&lt;br /&gt;
--José Manuel García&lt;br /&gt;
kMaximo k xs = head (js \\ (take (k-1) js))&lt;br /&gt;
              where js = reverse (sort (nub xs))&lt;br /&gt;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
kMaximo k xs = sort(nub xs) !! ((length (nub(xs))) - k)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22. Definir la función numPermut, tal que (numPermut xs) &lt;br /&gt;
-- devuelve el número de permutaciones sin repetición posibles con los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo, &lt;br /&gt;
--    numPermut [6,2,4]  == 6&lt;br /&gt;
--    numPermut [10,8,10,5]  == 24&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Manuel Fco Moreno, Lucía Hernández, José Manuel Sánchez Parra, Elsa Domínguez, Lucía González, Adolfo Sagrera Vivancos, Irene Ortega&lt;br /&gt;
numPermut xs = length (permutations xs)&lt;br /&gt;
--Nicolás Rodríguez Ruiz, José Manuel García&lt;br /&gt;
numPermut xs = product [1..(length xs)]&lt;br /&gt;
--César Fornis Catalán&lt;br /&gt;
numPermut xs = length (permutations(nub xs))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 23 Definir la función numPares, tal que (numPares xs)&lt;br /&gt;
-- devuelva cuantos números pares en total (sin repeticiones) aparecen&lt;br /&gt;
-- en la lista xs. Por ejemplo, &lt;br /&gt;
--    numPares [1,4,8,2,1,4,6,1]  == 4&lt;br /&gt;
--    numPares [10,9,8,10,5,10]  == 2&lt;br /&gt;
--    numPares [10,9,8]  == 2&lt;br /&gt;
-- Indicación: puede ser útil la función partitions&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, José Manuel Sánchez Parra, Elsa Domínguez&lt;br /&gt;
numPares xs = length (nub (filter even xs))&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
numPares xs = length(group (sort (filter even xs)))&lt;br /&gt;
--Lucía Hernández, Adolfo Sagrera Vivancos, José Manuel García &lt;br /&gt;
numPares xs = length(fst(partition even (nub xs)))&lt;br /&gt;
--Lucía González, Manuel Fco Moreno&lt;br /&gt;
numPares xs =  length (filter even (nub xs))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=197</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=197"/>
		<updated>2021-10-08T07:36:35Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_1.hs (24 de septiembre de 2021)&lt;br /&gt;
-- Definiciones por composición sobre números, listas y booleanos. &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;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- En esta relación se plantean ejercicios con definiciones de funciones &lt;br /&gt;
-- por composición sobre números, listas y booleanos.&lt;br /&gt;
-- &lt;br /&gt;
-- Para solucionar los ejercicios puede ser útil el manual de&lt;br /&gt;
-- funciones de Haskell que se encuentra en http://bit.ly/1uJZiqi y su&lt;br /&gt;
-- resumen en http://bit.ly/ZwSMHO&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Manuel Alcaide García, Lucía Hernández, Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Irene Ortega Moncayo, Laura Arango, Ana Sosa Caballero, Adolfo Sagrera Vivancos, Pelayo INfante Pérez, Sara Cerro Torres, Manuel Fco Moreno, Virginia Sánchez, Carmen Blanco, José Manuel Garcia, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
-- Antonio López García, César Fornis Catalán&lt;br /&gt;
media3 x y z = (sum [x,y,z])/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función sumaMonedas tal que &lt;br /&gt;
-- (sumaMonedas a b c d e) es la suma de los euros correspondientes a &lt;br /&gt;
-- a monedas de 1 euro, b de 2 euros, c de 5 euros, d 10 euros y&lt;br /&gt;
-- e de 20 euros. Por ejemplo,&lt;br /&gt;
--    sumaMonedas 0 0 0 0 1  ==  20&lt;br /&gt;
--    sumaMonedas 0 0 8 0 3  == 100&lt;br /&gt;
--    sumaMonedas 1 1 1 1 1  ==  38&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Lucía Hernández, Manuel Fco Moreno, Laura Arango, Ana Sosa Caballero, Sara Cerro Torres, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez&lt;br /&gt;
sumamonedas a b c d e = a+b*2+c*5+d*10+e*20&lt;br /&gt;
-- Antonio López García, Irene Ortega, César Fornis Catalán, Virginia Sánchez, Elsa Domínguez&lt;br /&gt;
sumaMonedas a b c d e = sum [a, b*2, c*5, d*10, e*20]&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González, Pelayo Infante, Francisco José Espinosa, Carmen Blanco, José Manuel García&lt;br /&gt;
sumaMonedas a b c d e = a*1+b*2+c*5+d*10+e*20&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función volumenEsfera tal que &lt;br /&gt;
-- (volumenEsfera r) es el volumen de la esfera de radio r. Por ejemplo,&lt;br /&gt;
--    volumenEsfera 10  ==  4188.790204786391&lt;br /&gt;
-- Indicación: Usar la constante pi.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Adriana Gordillo Melero, Lucía Hernández, Nicolás Rodríguez Ruiz, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Pelayo Infante, Sara Cerro Torres, José Manuel García, Manuel Fco Moreno, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
 volumenEsfera r = (4/3)*pi*r^3&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Carmen Blanco&lt;br /&gt;
volumenEsfera r =(4/3)*(pi*r^3)&lt;br /&gt;
-- Irene Ortega&lt;br /&gt;
volumenEsfera r = pi*(r^3)*4/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
-- César Fornis Catalán, Virginia Sánchez&lt;br /&gt;
volumenEsfera r = (4*pi*r^3)/3&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir la función areaDeCoronaCircular tal que &lt;br /&gt;
-- (areaDeCoronaCircular r1 r2) es el área de una corona circular de&lt;br /&gt;
-- radio interior r1 y radio exterior r2. Por ejemplo,&lt;br /&gt;
--    areaDeCoronaCircular 1 2 == 9.42477796076938&lt;br /&gt;
--    areaDeCoronaCircular 2 5 == 65.97344572538566&lt;br /&gt;
--    areaDeCoronaCircular 3 5 == 50.26548245743669&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Adriana Gordillo Melero, Antonio López García, Lucía González, Nicolás Rodríguez Ruiz, Sara Cerro Torres, Elsa Domínguez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*r2^2 - pi*r1^2&lt;br /&gt;
--Álvaro Cano, Ana Sosa Caballero, Irene Ortega, César Fornis Catalán,Manuel Fco Moreno, José Manuel García, Rafael Gómez, Iván García Rodríguez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*(r2^2-r1^2)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
areaDeCoronaCircular r1 r2 = areaCirculo r2 - areaCirculo r1&lt;br /&gt;
                             where areaCirculo r = pi*r^2&lt;br /&gt;
--Adolfo Sagrera Vivancos, Pelayo Infante , Francisco José Espinosa, Jaime Chaves Navarro&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*r2^2)-(pi*r1^2)&lt;br /&gt;
-- Carmen Blanco&lt;br /&gt;
-- Virginia Sánchez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*(r2)^2) - (pi*(r1)^2)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- Indicación: Usar la función rem&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Adriana Gordillo Melero, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Adolfo Sagrera Vivancos Francisco José Espinosa, Lucía González, Nicolás Rodríguez Ruiz, Irene Ortega, Carmen Blanco, Manuel Fco Moreno, César Fornis Catalán, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Definir la función maxTres tal que (maxTres x y z) es&lt;br /&gt;
-- el máximo de x, y y z. Por ejemplo,&lt;br /&gt;
--    maxTres 6 2 4  ==  6&lt;br /&gt;
--    maxTres 6 7 4  ==  7&lt;br /&gt;
--    maxTres 6 7 9  ==  9&lt;br /&gt;
-- Indicación: Usar la función max.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adriana Gordillo, Irene Ortega, Nicolás Rodríguez Ruiz, Manuel Fco Moreno, Rafael Gómez, Jaime Chaves Navarro&lt;br /&gt;
maxTres x y z = max(max x y)(z)&lt;br /&gt;
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos, Iván García Rodríguez&lt;br /&gt;
maxTres x y z = max x t&lt;br /&gt;
                where t = max y z&lt;br /&gt;
&lt;br /&gt;
-- Antonio López García, Lucía González, Carmen Blanco&lt;br /&gt;
maxTres x y z = maximum [x,y,z]&lt;br /&gt;
--César Fornis Catalán, José Manuel García, Elsa Domínguez&lt;br /&gt;
maxTres x y z = max (max x y) z&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir la función rota1 tal que (rota1 xs) es la lista&lt;br /&gt;
-- obtenida poniendo el primer elemento de xs al final de la lista. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    rota1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adriana Gordillo, Ana Sosa Caballero , Irene Ortega, Lucía González, Nicolás Rodríguez Ruiz, Carmen Blanco, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Manuel Fco Moreno, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
rota1 xs = tail xs ++ [head xs]&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
rota1 xs = drop 1 xs ++ take 1 xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Adriana Gordillo, Ana Sosa Caballero, Antonio López García, Irene Ortega, Lucía González, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Manuel Fco Moreno, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
rota n xs = drop n xs ++ take n xs&lt;br /&gt;
&lt;br /&gt;
-- Fernando Ruiz (mejora para conseguir rotar el vector un número mayor de veces que de elementos en el vector)&lt;br /&gt;
rota n xs = drop (mod n (length xs)) xs ++ take (mod n (length xs)) xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Definir la función rango tal que (rango xs) es la&lt;br /&gt;
-- lista formada por el menor y mayor elemento de xs.&lt;br /&gt;
--    rango [3,2,7,5]  ==  [2,7]&lt;br /&gt;
-- Indicación: Se pueden usar minimum y maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Irene Ortega, Lucía González, Manuel Fco Moreno, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Jaime Chaves Navarro, Sara Cerro Torres, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
rango xs = [minimum xs] ++ [maximum xs]&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García, Iván García Rodríguez&lt;br /&gt;
rango xs = [minimum xs, maximum xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir la función palindromo tal que (palindromo xs) se&lt;br /&gt;
-- verifica si xs es un palíndromo; es decir, es lo mismo leer xs de&lt;br /&gt;
-- izquierda a derecha que de derecha a izquierda. Por ejemplo,&lt;br /&gt;
--    palindromo [3,2,5,2,3]    ==  True&lt;br /&gt;
--    palindromo [3,2,5,6,2,3]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Álvaro Cano, José Manuel Sánchez Parra, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía Hernández, Manuel Alcaide, Lucía González , Irene Ortega, José Manuel García ,Rafael Gómez, Manuel Fco Moreno, Adolfo Sagrera Vivancos, Jaime Chaves Navarro, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
palindromo xs = xs == reverse xs&lt;br /&gt;
--Iván García Rodríguez&lt;br /&gt;
palindromo xs = if xs==reverse xs&lt;br /&gt;
  then &amp;quot;True&amp;quot;&lt;br /&gt;
  else &amp;quot;False&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Definir la función interior tal que (interior xs) es la&lt;br /&gt;
-- lista obtenida eliminando los extremos de la lista xs. Por ejemplo,&lt;br /&gt;
--    interior [2,5,3,7,3]  ==  [5,3,7]&lt;br /&gt;
--    interior [2..7]       ==  [3,4,5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández, Ana Sosa Caballero, Lucía González, Manuel Fco Moreno, Adolfo Sagrera Vivancos, Adriana Gordillo&lt;br /&gt;
interior xs = tail (init xs)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
interior xs = drop 1 (init xs)&lt;br /&gt;
--Fernando Ruiz, Antonio López García, Irene Ortega, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
interior xs = init (tail xs)&lt;br /&gt;
--Manuel Alcaide García&lt;br /&gt;
interior xs = init (drop 1 xs)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
interior xs = reverse (take ((length js)-1) js)&lt;br /&gt;
         where js = reverse (take ((length xs)-1) xs)&lt;br /&gt;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
interior xs = reverse(tail(reverse(tail xs)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función finales tal que (finales n xs) es la&lt;br /&gt;
-- lista formada por los n finales elementos de xs. Por ejemplo,&lt;br /&gt;
--    finales 3 [2,5,4,7,9,6]  ==  [7,9,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Álvaro Cano&lt;br /&gt;
finales n xs = drop n xs&lt;br /&gt;
-- Lucía Hernández, Adolfo Sagrera Vivancos, Nicolás Rodríguez Ruiz&lt;br /&gt;
finales n xs = reverse (take n (reverse xs))&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero&lt;br /&gt;
finales n xs = drop m xs&lt;br /&gt;
               where m = length xs - n&lt;br /&gt;
-- Antonio López García, Fernando Ruiz Mazo, Pelayo Infante, Manuel Fco Moreno, Manuel Alcaide García, Irene Ortega, Adriana Gordillo, Iván García Rodríguez, Elsa Domínguez, Lucía González&lt;br /&gt;
finales n xs = drop (length xs - n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. Definir la función segmento tal que (segmento m n xs) es&lt;br /&gt;
-- la lista de los elementos de xs comprendidos entre las posiciones m y&lt;br /&gt;
-- n. Por ejemplo,&lt;br /&gt;
--    segmento 3 4 [3,4,1,2,7,9,0]  ==  [1,2]&lt;br /&gt;
--    segmento 3 5 [3,4,1,2,7,9,0]  ==  [1,2,7]&lt;br /&gt;
--    segmento 5 3 [3,4,1,2,7,9,0]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
segmento m n xs = drop (m-1) (reverse (drop a ys))&lt;br /&gt;
                  where a  = length xs - n&lt;br /&gt;
                        ys = reverse xs&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García, Lucía González, Manuel Fco Moreno, Iván García Rodríguez, Adolfo Sagrera Vivancos&lt;br /&gt;
segmento m n xs = drop (m-1) (take n xs)&lt;br /&gt;
-- Fernando Ruiz &lt;br /&gt;
segmento m n xs = reverse (drop ((length xs)-n+m-2)(reverse (drop (m-1) xs)))&lt;br /&gt;
--Lucía Hernández, José Manuel García&lt;br /&gt;
segmento m n xs = take (n-m+1)(drop(m-1) xs)&lt;br /&gt;
--Manuel Alcaide García, Irene Ortega, Nicolás Rodríguez Ruiz&lt;br /&gt;
segmento m n xs = take (n-(m-1)) (drop (m-1) xs)&lt;br /&gt;
--Pelayo Infante,]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango&lt;br /&gt;
extremos n xs = take n xs ++ finales n XS&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Fernando Ruiz, Adriana Gordillo, Manuel Fco Moreno,Adolfo Sagrera Vivancos, Nicolás Rodríguez Ruiz, Lucía González&lt;br /&gt;
extremos n xs = take n xs ++ reverse (take n (reverse xs))&lt;br /&gt;
-- Irene Ortega, Pelayo Infante, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
extremos n xs = take n xs  ++  drop (length xs-n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15. Definir la función mediano tal que (mediano x y z) es el&lt;br /&gt;
-- número mediano de los tres números x, y y z. Por ejemplo,&lt;br /&gt;
--    mediano 3 2 5  ==  3&lt;br /&gt;
--    mediano 2 4 5  ==  4&lt;br /&gt;
--    mediano 2 6 5  ==  5&lt;br /&gt;
--    mediano 2 6 6  ==  6&lt;br /&gt;
-- Indicación: Usar maximum y minimum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango, José Manuel García&lt;br /&gt;
 mediano x y z = max x (min y z) (Contraejemplo : mediano 8 10 3)&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
mediano x y z = minimum [maximum [x,y], z] (Contraejemplo : mediano 8 10 3)&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
mediano x y z = maximum [minimum [x,y], minimum[x,z], minimum[y,z]]&lt;br /&gt;
-- Fernando Ruiz Mazo, Irene Ortega&lt;br /&gt;
mediano x y z = minimum ([maximum [x,y]] ++ [maximum [y,z]] ++ [maximum [x,z]])&lt;br /&gt;
-- Adriana Gordillo, Elsa Domínguez, Adolfo Sagrera Vivancos, Manuel Fco Moreno&lt;br /&gt;
mediano x y z = (x+y+z)-maximum[x,y,z]-minimum[x,y,z]&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
mediano x y z = maximum [minimum [x,y], minimum [maximum[x,y],z]]&lt;br /&gt;
-- Iván García Rodríguez&lt;br /&gt;
mediano x y z = max x a where a=min y z&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16. Definir la función tresIguales tal que &lt;br /&gt;
-- (tresIguales x y z) se verifica si los elementos x, y y z son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    tresIguales 4 4 4  ==  True&lt;br /&gt;
--    tresIguales 4 3 4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Lucía Hernández, Irene Ortega, Adriana Gordillo, Manuel Fco Moreno, Elsa Domínguez, Nicolás Rodríguez Ruiz&lt;br /&gt;
tresIguales x y z = x==y &amp;amp;&amp;amp; x==z&lt;br /&gt;
--Pelayo Infante&lt;br /&gt;
tresIguales x y z = x^3==x*y*z&lt;br /&gt;
--Iván García Rodríguez&lt;br /&gt;
tresIguales x y z = if x==y &amp;amp;&amp;amp; y==z&lt;br /&gt;
  then &amp;quot;True&amp;quot;&lt;br /&gt;
  else &amp;quot;False&amp;quot;&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González&lt;br /&gt;
tresIguales x y z = x==y &amp;amp;&amp;amp; y==z&lt;br /&gt;
--José Manuel García&lt;br /&gt;
tresIguales x y z = if x == y &amp;amp;&amp;amp; x == z then True else False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 17. Definir la función tresDiferentes tal que &lt;br /&gt;
-- (tresDiferentes x y z) se verifica si los elementos x, y y z son&lt;br /&gt;
-- distintos. Por ejemplo, &lt;br /&gt;
--    tresDiferentes 3 5 2  ==  True&lt;br /&gt;
--    tresDiferentes 3 5 3  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Lucía Hernández, Adriana Gordillo&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; x/=z&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
tresDiferentes x y z = and [x/=y, y/=z, x/=z]&lt;br /&gt;
--Irene Ortega&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; x/=z &amp;amp;&amp;amp; y/=x&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González, Manuel Fco Moreno&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; y/=z &amp;amp;&amp;amp; x/=z&lt;br /&gt;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
tresDiferentes x y z = not(x==y || x==z || z==y)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
tresDiferentes x y z = if x /= y &amp;amp;&amp;amp; x /= z &amp;amp;&amp;amp; y /= z then True else False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 18. Definir la función cuatroIguales tal que &lt;br /&gt;
-- (cuatroIguales x y z u) se verifica si los elementos x, y, z y u son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    cuatroIguales 5 5 5 5   ==  True&lt;br /&gt;
--    cuatroIguales 5 5 4 5   ==  False&lt;br /&gt;
-- Indicación: Usar la función tresIguales.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Elsa Domínguez, Lucía González&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z == True &amp;amp;&amp;amp; x==u&lt;br /&gt;
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Adolfo Sagrera Vivancos, Manuel Fco Moreno, Adriana Gordillo, Irene Ortega&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z &amp;amp;&amp;amp; x==u&lt;br /&gt;
-- José Manuel García&lt;br /&gt;
cuatroIguales x y z u = x==y &amp;amp;&amp;amp; y==z &amp;amp;&amp;amp; z==u&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicios para trabajar con Data.List. Ver:&lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/Funciones_basicas.html&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19. Definir la función unicos, tal que (unicos xs)&lt;br /&gt;
-- devuelva la cantidad de elementos únicos que hay en la lista xs.&lt;br /&gt;
-- Por ejemplo, &lt;br /&gt;
--    unicos [1,4,8,2,1,4,6,1]  == 5 &lt;br /&gt;
--    unicos [10,9,8,10,5,10]  == 4&lt;br /&gt;
--    unicos [10,9,8]  == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Lucía Hernández, Adriana Gordillo, Elsa Domínguez, Lucía González, Manuel Fco Moreno, Adolfo Sagrera Vivancos, José Manuel García, Irene Ortega&lt;br /&gt;
unicos xs = length (nub xs)&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
unicos xs = length(group(sort xs))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20. Definir la función segundoMinimo, tal que (segundoMinimo xs)&lt;br /&gt;
-- devuelve el segundo elemento más pequeńo de la lista xs, obviando &lt;br /&gt;
-- repeticiones. Por ejemplo, &lt;br /&gt;
--    segundoMinimo [6,9,2,4]  ==  4&lt;br /&gt;
--    segundoMinimo [0.5,1.2,0.5,4.4,0.5]  ==  1.2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango&lt;br /&gt;
segundoMinimo xs = sort (nub xs) !! 1&lt;br /&gt;
--Lucía Hernández, Irene Ortega&lt;br /&gt;
segundoMinimo xs = minimum (delete(minimum (xs))(nub xs))&lt;br /&gt;
-- Adriana Gordillo&lt;br /&gt;
segundoMinimo xs = minimum (filter (&amp;gt;minimum xs) xs)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
segundoMinimo xs = head (tail(nub (sort xs)))&lt;br /&gt;
-- Manuel Fco Moreno&lt;br /&gt;
segundoMinimo xs = last (take 2 (sort(nub xs)))&lt;br /&gt;
--Pelayo Infante, Lucía González&lt;br /&gt;
segundoMinimo xs = head ( drop 1 (sort (nub xs)))&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
segundoMinimo xs = minimum (drop 1(sort(nub xs))) &lt;br /&gt;
--José Manuel García&lt;br /&gt;
segundoMinimo xs = minimum (delete (minimum js) js)&lt;br /&gt;
                   where js = nub xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 21. Definir la función kMaximo, tal que (kMaximo n xs) &lt;br /&gt;
-- devuelve el k-máximo elemento de xs (es decir, el que está en la&lt;br /&gt;
-- posición k de valores más altos), obviando repeticiones. Por ejemplo, &lt;br /&gt;
--    kMaximo 2 [6,9,2,4]  == 6&lt;br /&gt;
--    kMaximo 3 [10,9,8,10,5]  == 8&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Elsa Domínguez, Lucía González, Manuel Fco Moreno&lt;br /&gt;
kMaximo k xs = reverse (sort (nub xs)) !! (k-1)&lt;br /&gt;
--José Manuel Sánchez Parra&lt;br /&gt;
kMaximo k xs = maximum(take k xs)&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
kMaximo k xs = head(drop(k-1) (reverse(sort (nub xs))))&lt;br /&gt;
--Antonio Medinilla Garófano&lt;br /&gt;
quitarMaximo xs = delete (maximum xs) xs&lt;br /&gt;
kMaximo k xs = maximum ((iterate quitarMaximo (nub xs)) !! (k-1))&lt;br /&gt;
--Fernando Ruiz Mazo&lt;br /&gt;
kMaximoRecursivo k xs = if k==1 then maximum(nub(xs)) else kMaximoRecursivo (k-1) (init(sort(nub xs)))&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
kMaximo k xs = maximum(drop (k-1)(reverse(sort(nub xs))))&lt;br /&gt;
--César Fornis Catalán&lt;br /&gt;
kMaximo k xs = head(drop (k-1) (reverse(sort(nub xs))))&lt;br /&gt;
--José Manuel García&lt;br /&gt;
kMaximo k xs = head (js \\ (take (k-1) js))&lt;br /&gt;
              where js = reverse (sort (nub xs))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22. Definir la función numPermut, tal que (numPermut xs) &lt;br /&gt;
-- devuelve el número de permutaciones sin repetición posibles con los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo, &lt;br /&gt;
--    numPermut [6,2,4]  == 6&lt;br /&gt;
--    numPermut [10,8,10,5]  == 24&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Manuel Fco Moreno, Lucía Hernández, José Manuel Sánchez Parra, Elsa Domínguez, Lucía González, Adolfo Sagrera Vivancos, Irene Ortega&lt;br /&gt;
numPermut xs = length (permutations xs)&lt;br /&gt;
--Nicolás Rodríguez Ruiz, José Manuel García&lt;br /&gt;
numPermut xs = product [1..(length xs)]&lt;br /&gt;
--César Fornis Catalán&lt;br /&gt;
numPermut xs = length (permutations(nub xs))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 23 Definir la función numPares, tal que (numPares xs)&lt;br /&gt;
-- devuelva cuantos números pares en total (sin repeticiones) aparecen&lt;br /&gt;
-- en la lista xs. Por ejemplo, &lt;br /&gt;
--    numPares [1,4,8,2,1,4,6,1]  == 4&lt;br /&gt;
--    numPares [10,9,8,10,5,10]  == 2&lt;br /&gt;
--    numPares [10,9,8]  == 2&lt;br /&gt;
-- Indicación: puede ser útil la función partitions&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, José Manuel Sánchez Parra, Elsa Domínguez&lt;br /&gt;
numPares xs = length (nub (filter even xs))&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
numPares xs = length(group (sort (filter even xs)))&lt;br /&gt;
--Lucía Hernández, Adolfo Sagrera Vivancos&lt;br /&gt;
numPares xs = length(fst(partition even (nub xs)))&lt;br /&gt;
--Lucía González, Manuel Fco Moreno&lt;br /&gt;
numPares xs =  length (filter even (nub xs))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=194</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=194"/>
		<updated>2021-10-08T07:27:17Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_1.hs (24 de septiembre de 2021)&lt;br /&gt;
-- Definiciones por composición sobre números, listas y booleanos. &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;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- En esta relación se plantean ejercicios con definiciones de funciones &lt;br /&gt;
-- por composición sobre números, listas y booleanos.&lt;br /&gt;
-- &lt;br /&gt;
-- Para solucionar los ejercicios puede ser útil el manual de&lt;br /&gt;
-- funciones de Haskell que se encuentra en http://bit.ly/1uJZiqi y su&lt;br /&gt;
-- resumen en http://bit.ly/ZwSMHO&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Manuel Alcaide García, Lucía Hernández, Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Irene Ortega Moncayo, Laura Arango, Ana Sosa Caballero, Adolfo Sagrera Vivancos, Pelayo INfante Pérez, Sara Cerro Torres, Manuel Fco Moreno, Virginia Sánchez, Carmen Blanco, José Manuel Garcia, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
-- Antonio López García, César Fornis Catalán&lt;br /&gt;
media3 x y z = (sum [x,y,z])/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función sumaMonedas tal que &lt;br /&gt;
-- (sumaMonedas a b c d e) es la suma de los euros correspondientes a &lt;br /&gt;
-- a monedas de 1 euro, b de 2 euros, c de 5 euros, d 10 euros y&lt;br /&gt;
-- e de 20 euros. Por ejemplo,&lt;br /&gt;
--    sumaMonedas 0 0 0 0 1  ==  20&lt;br /&gt;
--    sumaMonedas 0 0 8 0 3  == 100&lt;br /&gt;
--    sumaMonedas 1 1 1 1 1  ==  38&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Lucía Hernández, Manuel Fco Moreno, Laura Arango, Ana Sosa Caballero, Sara Cerro Torres, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez&lt;br /&gt;
sumamonedas a b c d e = a+b*2+c*5+d*10+e*20&lt;br /&gt;
-- Antonio López García, Irene Ortega, César Fornis Catalán, Virginia Sánchez, Elsa Domínguez&lt;br /&gt;
sumaMonedas a b c d e = sum [a, b*2, c*5, d*10, e*20]&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González, Pelayo Infante, Francisco José Espinosa, Carmen Blanco, José Manuel García&lt;br /&gt;
sumaMonedas a b c d e = a*1+b*2+c*5+d*10+e*20&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función volumenEsfera tal que &lt;br /&gt;
-- (volumenEsfera r) es el volumen de la esfera de radio r. Por ejemplo,&lt;br /&gt;
--    volumenEsfera 10  ==  4188.790204786391&lt;br /&gt;
-- Indicación: Usar la constante pi.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Adriana Gordillo Melero, Lucía Hernández, Nicolás Rodríguez Ruiz, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Pelayo Infante, Sara Cerro Torres, José Manuel García, Manuel Fco Moreno, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
 volumenEsfera r = (4/3)*pi*r^3&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Carmen Blanco&lt;br /&gt;
volumenEsfera r =(4/3)*(pi*r^3)&lt;br /&gt;
-- Irene Ortega&lt;br /&gt;
volumenEsfera r = pi*(r^3)*4/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
-- César Fornis Catalán, Virginia Sánchez&lt;br /&gt;
volumenEsfera r = (4*pi*r^3)/3&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir la función areaDeCoronaCircular tal que &lt;br /&gt;
-- (areaDeCoronaCircular r1 r2) es el área de una corona circular de&lt;br /&gt;
-- radio interior r1 y radio exterior r2. Por ejemplo,&lt;br /&gt;
--    areaDeCoronaCircular 1 2 == 9.42477796076938&lt;br /&gt;
--    areaDeCoronaCircular 2 5 == 65.97344572538566&lt;br /&gt;
--    areaDeCoronaCircular 3 5 == 50.26548245743669&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Adriana Gordillo Melero, Antonio López García, Lucía González, Nicolás Rodríguez Ruiz, Sara Cerro Torres, Elsa Domínguez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*r2^2 - pi*r1^2&lt;br /&gt;
--Álvaro Cano, Ana Sosa Caballero, Irene Ortega, César Fornis Catalán,Manuel Fco Moreno, José Manuel García, Rafael Gómez, Iván García Rodríguez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*(r2^2-r1^2)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
areaDeCoronaCircular r1 r2 = areaCirculo r2 - areaCirculo r1&lt;br /&gt;
                             where areaCirculo r = pi*r^2&lt;br /&gt;
--Adolfo Sagrera Vivancos, Pelayo Infante , Francisco José Espinosa, Jaime Chaves Navarro&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*r2^2)-(pi*r1^2)&lt;br /&gt;
-- Carmen Blanco&lt;br /&gt;
-- Virginia Sánchez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*(r2)^2) - (pi*(r1)^2)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- Indicación: Usar la función rem&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Adriana Gordillo Melero, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Adolfo Sagrera Vivancos Francisco José Espinosa, Lucía González, Nicolás Rodríguez Ruiz, Irene Ortega, Carmen Blanco, Manuel Fco Moreno, César Fornis Catalán, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Definir la función maxTres tal que (maxTres x y z) es&lt;br /&gt;
-- el máximo de x, y y z. Por ejemplo,&lt;br /&gt;
--    maxTres 6 2 4  ==  6&lt;br /&gt;
--    maxTres 6 7 4  ==  7&lt;br /&gt;
--    maxTres 6 7 9  ==  9&lt;br /&gt;
-- Indicación: Usar la función max.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adriana Gordillo, Irene Ortega, Nicolás Rodríguez Ruiz, Manuel Fco Moreno, Rafael Gómez, Jaime Chaves Navarro&lt;br /&gt;
maxTres x y z = max(max x y)(z)&lt;br /&gt;
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos, Iván García Rodríguez&lt;br /&gt;
maxTres x y z = max x t&lt;br /&gt;
                where t = max y z&lt;br /&gt;
&lt;br /&gt;
-- Antonio López García, Lucía González, Carmen Blanco&lt;br /&gt;
maxTres x y z = maximum [x,y,z]&lt;br /&gt;
--César Fornis Catalán, José Manuel García, Elsa Domínguez&lt;br /&gt;
maxTres x y z = max (max x y) z&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir la función rota1 tal que (rota1 xs) es la lista&lt;br /&gt;
-- obtenida poniendo el primer elemento de xs al final de la lista. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    rota1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adriana Gordillo, Ana Sosa Caballero , Irene Ortega, Lucía González, Nicolás Rodríguez Ruiz, Carmen Blanco, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Manuel Fco Moreno, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
rota1 xs = tail xs ++ [head xs]&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
rota1 xs = drop 1 xs ++ take 1 xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Adriana Gordillo, Ana Sosa Caballero, Antonio López García, Irene Ortega, Lucía González, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Manuel Fco Moreno, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
rota n xs = drop n xs ++ take n xs&lt;br /&gt;
&lt;br /&gt;
-- Fernando Ruiz (mejora para conseguir rotar el vector un número mayor de veces que de elementos en el vector)&lt;br /&gt;
rota n xs = drop (mod n (length xs)) xs ++ take (mod n (length xs)) xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Definir la función rango tal que (rango xs) es la&lt;br /&gt;
-- lista formada por el menor y mayor elemento de xs.&lt;br /&gt;
--    rango [3,2,7,5]  ==  [2,7]&lt;br /&gt;
-- Indicación: Se pueden usar minimum y maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Irene Ortega, Lucía González, Manuel Fco Moreno, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Jaime Chaves Navarro, Sara Cerro Torres, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
rango xs = [minimum xs] ++ [maximum xs]&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García, Iván García Rodríguez&lt;br /&gt;
rango xs = [minimum xs, maximum xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir la función palindromo tal que (palindromo xs) se&lt;br /&gt;
-- verifica si xs es un palíndromo; es decir, es lo mismo leer xs de&lt;br /&gt;
-- izquierda a derecha que de derecha a izquierda. Por ejemplo,&lt;br /&gt;
--    palindromo [3,2,5,2,3]    ==  True&lt;br /&gt;
--    palindromo [3,2,5,6,2,3]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Álvaro Cano, José Manuel Sánchez Parra, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía Hernández, Manuel Alcaide, Lucía González , Irene Ortega, José Manuel García ,Rafael Gómez, Manuel Fco Moreno, Adolfo Sagrera Vivancos, Jaime Chaves Navarro, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
palindromo xs = xs == reverse xs&lt;br /&gt;
--Iván García Rodríguez&lt;br /&gt;
palindromo xs = if xs==reverse xs&lt;br /&gt;
  then &amp;quot;True&amp;quot;&lt;br /&gt;
  else &amp;quot;False&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Definir la función interior tal que (interior xs) es la&lt;br /&gt;
-- lista obtenida eliminando los extremos de la lista xs. Por ejemplo,&lt;br /&gt;
--    interior [2,5,3,7,3]  ==  [5,3,7]&lt;br /&gt;
--    interior [2..7]       ==  [3,4,5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández, Ana Sosa Caballero, Lucía González, Manuel Fco Moreno, Adolfo Sagrera Vivancos, Adriana Gordillo&lt;br /&gt;
interior xs = tail (init xs)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
interior xs = drop 1 (init xs)&lt;br /&gt;
--Fernando Ruiz, Antonio López García, Irene Ortega, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
interior xs = init (tail xs)&lt;br /&gt;
--Manuel Alcaide García&lt;br /&gt;
interior xs = init (drop 1 xs)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
interior xs = reverse (take ((length js)-1) js)&lt;br /&gt;
         where js = reverse (take ((length xs)-1) xs)&lt;br /&gt;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
interior xs = reverse(tail(reverse(tail xs)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función finales tal que (finales n xs) es la&lt;br /&gt;
-- lista formada por los n finales elementos de xs. Por ejemplo,&lt;br /&gt;
--    finales 3 [2,5,4,7,9,6]  ==  [7,9,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Álvaro Cano&lt;br /&gt;
finales n xs = drop n xs&lt;br /&gt;
-- Lucía Hernández, Adolfo Sagrera Vivancos, Nicolás Rodríguez Ruiz&lt;br /&gt;
finales n xs = reverse (take n (reverse xs))&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero&lt;br /&gt;
finales n xs = drop m xs&lt;br /&gt;
               where m = length xs - n&lt;br /&gt;
-- Antonio López García, Fernando Ruiz Mazo, Pelayo Infante, Manuel Fco Moreno, Manuel Alcaide García, Irene Ortega, Adriana Gordillo, Iván García Rodríguez, Elsa Domínguez, Lucía González&lt;br /&gt;
finales n xs = drop (length xs - n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. Definir la función segmento tal que (segmento m n xs) es&lt;br /&gt;
-- la lista de los elementos de xs comprendidos entre las posiciones m y&lt;br /&gt;
-- n. Por ejemplo,&lt;br /&gt;
--    segmento 3 4 [3,4,1,2,7,9,0]  ==  [1,2]&lt;br /&gt;
--    segmento 3 5 [3,4,1,2,7,9,0]  ==  [1,2,7]&lt;br /&gt;
--    segmento 5 3 [3,4,1,2,7,9,0]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
segmento m n xs = drop (m-1) (reverse (drop a ys))&lt;br /&gt;
                  where a  = length xs - n&lt;br /&gt;
                        ys = reverse xs&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García, Lucía González, Manuel Fco Moreno, Iván García Rodríguez, Adolfo Sagrera Vivancos&lt;br /&gt;
segmento m n xs = drop (m-1) (take n xs)&lt;br /&gt;
-- Fernando Ruiz &lt;br /&gt;
segmento m n xs = reverse (drop ((length xs)-n+m-2)(reverse (drop (m-1) xs)))&lt;br /&gt;
--Lucía Hernández, José Manuel García&lt;br /&gt;
segmento m n xs = take (n-m+1)(drop(m-1) xs)&lt;br /&gt;
--Manuel Alcaide García, Irene Ortega, Nicolás Rodríguez Ruiz&lt;br /&gt;
segmento m n xs = take (n-(m-1)) (drop (m-1) xs)&lt;br /&gt;
--Pelayo Infante,]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango&lt;br /&gt;
extremos n xs = take n xs ++ finales n XS&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Fernando Ruiz, Adriana Gordillo, Manuel Fco Moreno,Adolfo Sagrera Vivancos, Nicolás Rodríguez Ruiz, Lucía González&lt;br /&gt;
extremos n xs = take n xs ++ reverse (take n (reverse xs))&lt;br /&gt;
-- Irene Ortega, Pelayo Infante, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
extremos n xs = take n xs  ++  drop (length xs-n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15. Definir la función mediano tal que (mediano x y z) es el&lt;br /&gt;
-- número mediano de los tres números x, y y z. Por ejemplo,&lt;br /&gt;
--    mediano 3 2 5  ==  3&lt;br /&gt;
--    mediano 2 4 5  ==  4&lt;br /&gt;
--    mediano 2 6 5  ==  5&lt;br /&gt;
--    mediano 2 6 6  ==  6&lt;br /&gt;
-- Indicación: Usar maximum y minimum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango, José Manuel García&lt;br /&gt;
 mediano x y z = max x (min y z) (Contraejemplo : mediano 8 10 3)&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
mediano x y z = minimum [maximum [x,y], z] (Contraejemplo : mediano 8 10 3)&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
mediano x y z = maximum [minimum [x,y], minimum[x,z], minimum[y,z]]&lt;br /&gt;
-- Fernando Ruiz Mazo, Irene Ortega&lt;br /&gt;
mediano x y z = minimum ([maximum [x,y]] ++ [maximum [y,z]] ++ [maximum [x,z]])&lt;br /&gt;
-- Adriana Gordillo, Elsa Domínguez, Adolfo Sagrera Vivancos, Manuel Fco Moreno&lt;br /&gt;
mediano x y z = (x+y+z)-maximum[x,y,z]-minimum[x,y,z]&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
mediano x y z = maximum [minimum [x,y], minimum [maximum[x,y],z]]&lt;br /&gt;
-- Iván García Rodríguez&lt;br /&gt;
mediano x y z = max x a where a=min y z&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16. Definir la función tresIguales tal que &lt;br /&gt;
-- (tresIguales x y z) se verifica si los elementos x, y y z son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    tresIguales 4 4 4  ==  True&lt;br /&gt;
--    tresIguales 4 3 4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Lucía Hernández, Irene Ortega, Adriana Gordillo, Manuel Fco Moreno, Elsa Domínguez, Nicolás Rodríguez Ruiz&lt;br /&gt;
tresIguales x y z = x==y &amp;amp;&amp;amp; x==z&lt;br /&gt;
--Pelayo Infante&lt;br /&gt;
tresIguales x y z = x^3==x*y*z&lt;br /&gt;
--Iván García Rodríguez&lt;br /&gt;
tresIguales x y z = if x==y &amp;amp;&amp;amp; y==z&lt;br /&gt;
  then &amp;quot;True&amp;quot;&lt;br /&gt;
  else &amp;quot;False&amp;quot;&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González&lt;br /&gt;
tresIguales x y z = x==y &amp;amp;&amp;amp; y==z&lt;br /&gt;
--José Manuel García&lt;br /&gt;
tresIguales x y z = if x == y &amp;amp;&amp;amp; x == z then True else False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 17. Definir la función tresDiferentes tal que &lt;br /&gt;
-- (tresDiferentes x y z) se verifica si los elementos x, y y z son&lt;br /&gt;
-- distintos. Por ejemplo, &lt;br /&gt;
--    tresDiferentes 3 5 2  ==  True&lt;br /&gt;
--    tresDiferentes 3 5 3  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Lucía Hernández, Adriana Gordillo&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; x/=z&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
tresDiferentes x y z = and [x/=y, y/=z, x/=z]&lt;br /&gt;
--Irene Ortega&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; x/=z &amp;amp;&amp;amp; y/=x&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González, Manuel Fco Moreno&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; y/=z &amp;amp;&amp;amp; x/=z&lt;br /&gt;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
tresDiferentes x y z = not(x==y || x==z || z==y)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
tresDiferentes x y z = if x /= y &amp;amp;&amp;amp; x /= z &amp;amp;&amp;amp; y /= z then True else False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 18. Definir la función cuatroIguales tal que &lt;br /&gt;
-- (cuatroIguales x y z u) se verifica si los elementos x, y, z y u son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    cuatroIguales 5 5 5 5   ==  True&lt;br /&gt;
--    cuatroIguales 5 5 4 5   ==  False&lt;br /&gt;
-- Indicación: Usar la función tresIguales.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Elsa Domínguez, Lucía González&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z == True &amp;amp;&amp;amp; x==u&lt;br /&gt;
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Adolfo Sagrera Vivancos, Manuel Fco Moreno, Adriana Gordillo, Irene Ortega&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z &amp;amp;&amp;amp; x==u&lt;br /&gt;
-- José Manuel García&lt;br /&gt;
cuatroIguales x y z u = x==y &amp;amp;&amp;amp; y==z &amp;amp;&amp;amp; z==u&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicios para trabajar con Data.List. Ver:&lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/Funciones_basicas.html&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19. Definir la función unicos, tal que (unicos xs)&lt;br /&gt;
-- devuelva la cantidad de elementos únicos que hay en la lista xs.&lt;br /&gt;
-- Por ejemplo, &lt;br /&gt;
--    unicos [1,4,8,2,1,4,6,1]  == 5 &lt;br /&gt;
--    unicos [10,9,8,10,5,10]  == 4&lt;br /&gt;
--    unicos [10,9,8]  == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Lucía Hernández, Adriana Gordillo, Elsa Domínguez, Lucía González, Manuel Fco Moreno, Adolfo Sagrera Vivancos, José Manuel García, Irene Ortega&lt;br /&gt;
unicos xs = length (nub xs)&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
unicos xs = length(group(sort xs))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20. Definir la función segundoMinimo, tal que (segundoMinimo xs)&lt;br /&gt;
-- devuelve el segundo elemento más pequeńo de la lista xs, obviando &lt;br /&gt;
-- repeticiones. Por ejemplo, &lt;br /&gt;
--    segundoMinimo [6,9,2,4]  ==  4&lt;br /&gt;
--    segundoMinimo [0.5,1.2,0.5,4.4,0.5]  ==  1.2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango&lt;br /&gt;
segundoMinimo xs = sort (nub xs) !! 1&lt;br /&gt;
--Lucía Hernández, Irene Ortega&lt;br /&gt;
segundoMinimo xs = minimum (delete(minimum (xs))(nub xs))&lt;br /&gt;
-- Adriana Gordillo&lt;br /&gt;
segundoMinimo xs = minimum (filter (&amp;gt;minimum xs) xs)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
segundoMinimo xs = head (tail(nub (sort xs)))&lt;br /&gt;
-- Manuel Fco Moreno&lt;br /&gt;
segundoMinimo xs = last (take 2 (sort(nub xs)))&lt;br /&gt;
--Pelayo Infante, Lucía González&lt;br /&gt;
segundoMinimo xs = head ( drop 1 (sort (nub xs)))&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
segundoMinimo xs = minimum (drop 1(sort(nub xs))) &lt;br /&gt;
--José Manuel García&lt;br /&gt;
segundoMinimo xs = minimum (delete (minimum js) js)&lt;br /&gt;
                   where js = nub xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 21. Definir la función kMaximo, tal que (kMaximo n xs) &lt;br /&gt;
-- devuelve el k-máximo elemento de xs (es decir, el que está en la&lt;br /&gt;
-- posición k de valores más altos), obviando repeticiones. Por ejemplo, &lt;br /&gt;
--    kMaximo 2 [6,9,2,4]  == 6&lt;br /&gt;
--    kMaximo 3 [10,9,8,10,5]  == 8&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Elsa Domínguez, Lucía González, Manuel Fco Moreno&lt;br /&gt;
kMaximo k xs = reverse (sort (nub xs)) !! (k-1)&lt;br /&gt;
--José Manuel Sánchez Parra&lt;br /&gt;
kMaximo k xs = maximum(take k xs)&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
kMaximo k xs = head(drop(k-1) (reverse(sort (nub xs))))&lt;br /&gt;
--Antonio Medinilla Garófano&lt;br /&gt;
quitarMaximo xs = delete (maximum xs) xs&lt;br /&gt;
kMaximo k xs = maximum ((iterate quitarMaximo (nub xs)) !! (k-1))&lt;br /&gt;
--Fernando Ruiz Mazo&lt;br /&gt;
kMaximoRecursivo k xs = if k==1 then maximum(nub(xs)) else kMaximoRecursivo (k-1) (init(sort(nub xs)))&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
kMaximo k xs = maximum(drop (k-1)(reverse(sort(nub xs))))&lt;br /&gt;
--César Fornis Catalán&lt;br /&gt;
kMaximo k xs = head(drop (k-1) (reverse(sort(nub xs))))&lt;br /&gt;
--José Manuel García&lt;br /&gt;
kMaximo k xs = head (js \\ (take (k-1) js))&lt;br /&gt;
              where js = reverse (sort (nub xs))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22. Definir la función numPermut, tal que (numPermut xs) &lt;br /&gt;
-- devuelve el número de permutaciones sin repetición posibles con los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo, &lt;br /&gt;
--    numPermut [6,2,4]  == 6&lt;br /&gt;
--    numPermut [10,8,10,5]  == 24&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Manuel Fco Moreno, Lucía Hernández, José Manuel Sánchez Parra, Elsa Domínguez, Lucía González, Adolfo Sagrera Vivancos, Irene Ortega&lt;br /&gt;
numPermut xs = length (permutations xs)&lt;br /&gt;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
numPermut xs = product [1..(length xs)]&lt;br /&gt;
--César Fornis Catalán&lt;br /&gt;
numPermut xs = length (permutations(nub xs))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 23 Definir la función numPares, tal que (numPares xs)&lt;br /&gt;
-- devuelva cuantos números pares en total (sin repeticiones) aparecen&lt;br /&gt;
-- en la lista xs. Por ejemplo, &lt;br /&gt;
--    numPares [1,4,8,2,1,4,6,1]  == 4&lt;br /&gt;
--    numPares [10,9,8,10,5,10]  == 2&lt;br /&gt;
--    numPares [10,9,8]  == 2&lt;br /&gt;
-- Indicación: puede ser útil la función partitions&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, José Manuel Sánchez Parra, Elsa Domínguez&lt;br /&gt;
numPares xs = length (nub (filter even xs))&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
numPares xs = length(group (sort (filter even xs)))&lt;br /&gt;
--Lucía Hernández, Adolfo Sagrera Vivancos&lt;br /&gt;
numPares xs = length(fst(partition even (nub xs)))&lt;br /&gt;
--Lucía González, Manuel Fco Moreno&lt;br /&gt;
numPares xs =  length (filter even (nub xs))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=185</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=185"/>
		<updated>2021-10-08T06:41:55Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_1.hs (24 de septiembre de 2021)&lt;br /&gt;
-- Definiciones por composición sobre números, listas y booleanos. &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;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- En esta relación se plantean ejercicios con definiciones de funciones &lt;br /&gt;
-- por composición sobre números, listas y booleanos.&lt;br /&gt;
-- &lt;br /&gt;
-- Para solucionar los ejercicios puede ser útil el manual de&lt;br /&gt;
-- funciones de Haskell que se encuentra en http://bit.ly/1uJZiqi y su&lt;br /&gt;
-- resumen en http://bit.ly/ZwSMHO&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Manuel Alcaide García, Lucía Hernández, Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Irene Ortega Moncayo, Laura Arango, Ana Sosa Caballero, Adolfo Sagrera Vivancos, Pelayo INfante Pérez, Sara Cerro Torres, Manuel Fco Moreno, Virginia Sánchez, Carmen Blanco, José Manuel Garcia, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
-- Antonio López García, César Fornis Catalán&lt;br /&gt;
media3 x y z = (sum [x,y,z])/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función sumaMonedas tal que &lt;br /&gt;
-- (sumaMonedas a b c d e) es la suma de los euros correspondientes a &lt;br /&gt;
-- a monedas de 1 euro, b de 2 euros, c de 5 euros, d 10 euros y&lt;br /&gt;
-- e de 20 euros. Por ejemplo,&lt;br /&gt;
--    sumaMonedas 0 0 0 0 1  ==  20&lt;br /&gt;
--    sumaMonedas 0 0 8 0 3  == 100&lt;br /&gt;
--    sumaMonedas 1 1 1 1 1  ==  38&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Lucía Hernández, Manuel Fco Moreno, Laura Arango, Ana Sosa Caballero, Sara Cerro Torres, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez&lt;br /&gt;
sumamonedas a b c d e = a+b*2+c*5+d*10+e*20&lt;br /&gt;
-- Antonio López García, Irene Ortega, César Fornis Catalán, Virginia Sánchez, Elsa Domínguez&lt;br /&gt;
sumaMonedas a b c d e = sum [a, b*2, c*5, d*10, e*20]&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González, Pelayo Infante, Francisco José Espinosa, Carmen Blanco, José Manuel García&lt;br /&gt;
sumaMonedas a b c d e = a*1+b*2+c*5+d*10+e*20&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función volumenEsfera tal que &lt;br /&gt;
-- (volumenEsfera r) es el volumen de la esfera de radio r. Por ejemplo,&lt;br /&gt;
--    volumenEsfera 10  ==  4188.790204786391&lt;br /&gt;
-- Indicación: Usar la constante pi.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Adriana Gordillo Melero, Lucía Hernández, Nicolás Rodríguez Ruiz, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Pelayo Infante, Sara Cerro Torres, José Manuel García, Manuel Fco Moreno, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
 volumenEsfera r = (4/3)*pi*r^3&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Carmen Blanco&lt;br /&gt;
volumenEsfera r =(4/3)*(pi*r^3)&lt;br /&gt;
-- Irene Ortega&lt;br /&gt;
volumenEsfera r = pi*(r^3)*4/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
-- César Fornis Catalán, Virginia Sánchez&lt;br /&gt;
volumenEsfera r = (4*pi*r^3)/3&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir la función areaDeCoronaCircular tal que &lt;br /&gt;
-- (areaDeCoronaCircular r1 r2) es el área de una corona circular de&lt;br /&gt;
-- radio interior r1 y radio exterior r2. Por ejemplo,&lt;br /&gt;
--    areaDeCoronaCircular 1 2 == 9.42477796076938&lt;br /&gt;
--    areaDeCoronaCircular 2 5 == 65.97344572538566&lt;br /&gt;
--    areaDeCoronaCircular 3 5 == 50.26548245743669&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Adriana Gordillo Melero, Antonio López García, Lucía González, Nicolás Rodríguez Ruiz, Sara Cerro Torres, Elsa Domínguez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*r2^2 - pi*r1^2&lt;br /&gt;
--Álvaro Cano, Ana Sosa Caballero, Irene Ortega, César Fornis Catalán,Manuel Fco Moreno, José Manuel García, Rafael Gómez, Iván García Rodríguez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*(r2^2-r1^2)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
areaDeCoronaCircular r1 r2 = areaCirculo r2 - areaCirculo r1&lt;br /&gt;
                             where areaCirculo r = pi*r^2&lt;br /&gt;
--Adolfo Sagrera Vivancos, Pelayo Infante , Francisco José Espinosa, Jaime Chaves Navarro&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*r2^2)-(pi*r1^2)&lt;br /&gt;
-- Carmen Blanco&lt;br /&gt;
-- Virginia Sánchez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*(r2)^2) - (pi*(r1)^2)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- Indicación: Usar la función rem&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Adriana Gordillo Melero, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Adolfo Sagrera Vivancos Francisco José Espinosa, Lucía González, Nicolás Rodríguez Ruiz, Irene Ortega, Carmen Blanco, Manuel Fco Moreno, César Fornis Catalán, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Definir la función maxTres tal que (maxTres x y z) es&lt;br /&gt;
-- el máximo de x, y y z. Por ejemplo,&lt;br /&gt;
--    maxTres 6 2 4  ==  6&lt;br /&gt;
--    maxTres 6 7 4  ==  7&lt;br /&gt;
--    maxTres 6 7 9  ==  9&lt;br /&gt;
-- Indicación: Usar la función max.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adriana Gordillo, Irene Ortega, Nicolás Rodríguez Ruiz, Manuel Fco Moreno, Rafael Gómez, Jaime Chaves Navarro&lt;br /&gt;
maxTres x y z = max(max x y)(z)&lt;br /&gt;
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos, Iván García Rodríguez&lt;br /&gt;
maxTres x y z = max x t&lt;br /&gt;
                where t = max y z&lt;br /&gt;
&lt;br /&gt;
-- Antonio López García, Lucía González, Carmen Blanco&lt;br /&gt;
maxTres x y z = maximum [x,y,z]&lt;br /&gt;
--César Fornis Catalán, José Manuel García, Elsa Domínguez&lt;br /&gt;
maxTres x y z = max (max x y) z&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir la función rota1 tal que (rota1 xs) es la lista&lt;br /&gt;
-- obtenida poniendo el primer elemento de xs al final de la lista. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    rota1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adriana Gordillo, Ana Sosa Caballero , Irene Ortega, Lucía González, Nicolás Rodríguez Ruiz, Carmen Blanco, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Manuel Fco Moreno, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
rota1 xs = tail xs ++ [head xs]&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
rota1 xs = drop 1 xs ++ take 1 xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Adriana Gordillo, Ana Sosa Caballero, Antonio López García, Irene Ortega, Lucía González, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Manuel Fco Moreno, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
rota n xs = drop n xs ++ take n xs&lt;br /&gt;
&lt;br /&gt;
-- Fernando Ruiz (mejora para conseguir rotar el vector un número mayor de veces que de elementos en el vector)&lt;br /&gt;
rota n xs = drop (mod n (length xs)) xs ++ take (mod n (length xs)) xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Definir la función rango tal que (rango xs) es la&lt;br /&gt;
-- lista formada por el menor y mayor elemento de xs.&lt;br /&gt;
--    rango [3,2,7,5]  ==  [2,7]&lt;br /&gt;
-- Indicación: Se pueden usar minimum y maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Irene Ortega, Lucía González, Manuel Fco Moreno, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Jaime Chaves Navarro, Sara Cerro Torres, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
rango xs = [minimum xs] ++ [maximum xs]&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García, Iván García Rodríguez&lt;br /&gt;
rango xs = [minimum xs, maximum xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir la función palindromo tal que (palindromo xs) se&lt;br /&gt;
-- verifica si xs es un palíndromo; es decir, es lo mismo leer xs de&lt;br /&gt;
-- izquierda a derecha que de derecha a izquierda. Por ejemplo,&lt;br /&gt;
--    palindromo [3,2,5,2,3]    ==  True&lt;br /&gt;
--    palindromo [3,2,5,6,2,3]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Álvaro Cano, José Manuel Sánchez Parra, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía Hernández, Manuel Alcaide, Lucía González , Irene Ortega, José Manuel García ,Rafael Gómez, Manuel Fco Moreno, Adolfo Sagrera Vivancos, Jaime Chaves Navarro, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
palindromo xs = xs == reverse xs&lt;br /&gt;
--Iván García Rodríguez&lt;br /&gt;
palindromo xs = if xs==reverse xs&lt;br /&gt;
  then &amp;quot;True&amp;quot;&lt;br /&gt;
  else &amp;quot;False&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Definir la función interior tal que (interior xs) es la&lt;br /&gt;
-- lista obtenida eliminando los extremos de la lista xs. Por ejemplo,&lt;br /&gt;
--    interior [2,5,3,7,3]  ==  [5,3,7]&lt;br /&gt;
--    interior [2..7]       ==  [3,4,5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández, Ana Sosa Caballero, Lucía González, Manuel Fco Moreno, Adolfo Sagrera Vivancos, Adriana Gordillo&lt;br /&gt;
interior xs = tail (init xs)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
interior xs = drop 1 (init xs)&lt;br /&gt;
--Fernando Ruiz, Antonio López García, Irene Ortega, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
interior xs = init (tail xs)&lt;br /&gt;
--Manuel Alcaide García&lt;br /&gt;
interior xs = init (drop 1 xs)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
interior xs = reverse (take ((length js)-1) js)&lt;br /&gt;
         where js = reverse (take ((length xs)-1) xs)&lt;br /&gt;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
interior xs = reverse(tail(reverse(tail xs)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función finales tal que (finales n xs) es la&lt;br /&gt;
-- lista formada por los n finales elementos de xs. Por ejemplo,&lt;br /&gt;
--    finales 3 [2,5,4,7,9,6]  ==  [7,9,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Álvaro Cano&lt;br /&gt;
finales n xs = drop n xs&lt;br /&gt;
-- Lucía Hernández, Adolfo Sagrera Vivancos, Nicolás Rodríguez Ruiz&lt;br /&gt;
finales n xs = reverse (take n (reverse xs))&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero&lt;br /&gt;
finales n xs = drop m xs&lt;br /&gt;
               where m = length xs - n&lt;br /&gt;
-- Antonio López García, Fernando Ruiz Mazo, Pelayo Infante, Manuel Fco Moreno, Manuel Alcaide García, Irene Ortega, Adriana Gordillo, Iván García Rodríguez, Elsa Domínguez, Lucía González&lt;br /&gt;
finales n xs = drop (length xs - n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. Definir la función segmento tal que (segmento m n xs) es&lt;br /&gt;
-- la lista de los elementos de xs comprendidos entre las posiciones m y&lt;br /&gt;
-- n. Por ejemplo,&lt;br /&gt;
--    segmento 3 4 [3,4,1,2,7,9,0]  ==  [1,2]&lt;br /&gt;
--    segmento 3 5 [3,4,1,2,7,9,0]  ==  [1,2,7]&lt;br /&gt;
--    segmento 5 3 [3,4,1,2,7,9,0]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
segmento m n xs = drop (m-1) (reverse (drop a ys))&lt;br /&gt;
                  where a  = length xs - n&lt;br /&gt;
                        ys = reverse xs&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García, Lucía González, Manuel Fco Moreno, Iván García Rodríguez, Adolfo Sagrera Vivancos&lt;br /&gt;
segmento m n xs = drop (m-1) (take n xs)&lt;br /&gt;
-- Fernando Ruiz &lt;br /&gt;
segmento m n xs = reverse (drop ((length xs)-n+m-2)(reverse (drop (m-1) xs)))&lt;br /&gt;
--Lucía Hernández, José Manuel García&lt;br /&gt;
segmento m n xs = take (n-m+1)(drop(m-1) xs)&lt;br /&gt;
--Manuel Alcaide García, Irene Ortega, Nicolás Rodríguez Ruiz&lt;br /&gt;
segmento m n xs = take (n-(m-1)) (drop (m-1) xs)&lt;br /&gt;
--Pelayo Infante,]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango&lt;br /&gt;
extremos n xs = take n xs ++ finales n XS&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Fernando Ruiz, Adriana Gordillo, Manuel Fco Moreno,Adolfo Sagrera Vivancos, Nicolás Rodríguez Ruiz, Lucía González&lt;br /&gt;
extremos n xs = take n xs ++ reverse (take n (reverse xs))&lt;br /&gt;
-- Irene Ortega, Pelayo Infante, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
extremos n xs = take n xs  ++  drop (length xs-n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15. Definir la función mediano tal que (mediano x y z) es el&lt;br /&gt;
-- número mediano de los tres números x, y y z. Por ejemplo,&lt;br /&gt;
--    mediano 3 2 5  ==  3&lt;br /&gt;
--    mediano 2 4 5  ==  4&lt;br /&gt;
--    mediano 2 6 5  ==  5&lt;br /&gt;
--    mediano 2 6 6  ==  6&lt;br /&gt;
-- Indicación: Usar maximum y minimum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango, José Manuel García&lt;br /&gt;
 mediano x y z = max x (min y z) (Contraejemplo : mediano 8 10 3)&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
mediano x y z = minimum [maximum [x,y], z] (Contraejemplo : mediano 8 10 3)&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
mediano x y z = maximum [minimum [x,y], minimum[x,z], minimum[y,z]]&lt;br /&gt;
-- Fernando Ruiz Mazo, Irene Ortega&lt;br /&gt;
mediano x y z = minimum ([maximum [x,y]] ++ [maximum [y,z]] ++ [maximum [x,z]])&lt;br /&gt;
-- Adriana Gordillo, Elsa Domínguez, Adolfo Sagrera Vivancos, Manuel Fco Moreno&lt;br /&gt;
mediano x y z = (x+y+z)-maximum[x,y,z]-minimum[x,y,z]&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
mediano x y z = maximum [minimum [x,y], minimum [maximum[x,y],z]]&lt;br /&gt;
-- Iván García Rodríguez&lt;br /&gt;
mediano x y z = max x a where a=min y z&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16. Definir la función tresIguales tal que &lt;br /&gt;
-- (tresIguales x y z) se verifica si los elementos x, y y z son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    tresIguales 4 4 4  ==  True&lt;br /&gt;
--    tresIguales 4 3 4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Lucía Hernández, Irene Ortega, Adriana Gordillo, Manuel Fco Moreno, Elsa Domínguez, Nicolás Rodríguez Ruiz&lt;br /&gt;
tresIguales x y z = x==y &amp;amp;&amp;amp; x==z&lt;br /&gt;
--Pelayo Infante&lt;br /&gt;
tresIguales x y z = x^3==x*y*z&lt;br /&gt;
--Iván García Rodríguez&lt;br /&gt;
tresIguales x y z = if x==y &amp;amp;&amp;amp; y==z&lt;br /&gt;
  then &amp;quot;True&amp;quot;&lt;br /&gt;
  else &amp;quot;False&amp;quot;&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González&lt;br /&gt;
tresIguales x y z = x==y &amp;amp;&amp;amp; y==z&lt;br /&gt;
--José Manuel García&lt;br /&gt;
tresIguales x y z = if x == y &amp;amp;&amp;amp; x == z then True else False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 17. Definir la función tresDiferentes tal que &lt;br /&gt;
-- (tresDiferentes x y z) se verifica si los elementos x, y y z son&lt;br /&gt;
-- distintos. Por ejemplo, &lt;br /&gt;
--    tresDiferentes 3 5 2  ==  True&lt;br /&gt;
--    tresDiferentes 3 5 3  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Lucía Hernández, Adriana Gordillo&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; x/=z&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
tresDiferentes x y z = and [x/=y, y/=z, x/=z]&lt;br /&gt;
--Irene Ortega&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; x/=z &amp;amp;&amp;amp; y/=x&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González, Manuel Fco Moreno&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; y/=z &amp;amp;&amp;amp; x/=z&lt;br /&gt;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
tresDiferentes x y z = not(x==y || x==z || z==y)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
tresDiferentes x y z = if x /= y &amp;amp;&amp;amp; x /= z &amp;amp;&amp;amp; y /= z then True else False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 18. Definir la función cuatroIguales tal que &lt;br /&gt;
-- (cuatroIguales x y z u) se verifica si los elementos x, y, z y u son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    cuatroIguales 5 5 5 5   ==  True&lt;br /&gt;
--    cuatroIguales 5 5 4 5   ==  False&lt;br /&gt;
-- Indicación: Usar la función tresIguales.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Irene Ortega, Elsa Domínguez, Lucía González&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z == True &amp;amp;&amp;amp; x==u&lt;br /&gt;
-- Lucía Hernández, Nicolás Rodríguez Ruiz, Adolfo Sagrera Vivancos, Manuel Fco Moreno&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z &amp;amp;&amp;amp; x==u&lt;br /&gt;
-- Adriana Gordillo, José Manuel García&lt;br /&gt;
cuatroIguales x y z u = x==y &amp;amp;&amp;amp; y==z &amp;amp;&amp;amp; z==u&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicios para trabajar con Data.List. Ver:&lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/Funciones_basicas.html&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19. Definir la función unicos, tal que (unicos xs)&lt;br /&gt;
-- devuelva la cantidad de elementos únicos que hay en la lista xs.&lt;br /&gt;
-- Por ejemplo, &lt;br /&gt;
--    unicos [1,4,8,2,1,4,6,1]  == 5 &lt;br /&gt;
--    unicos [10,9,8,10,5,10]  == 4&lt;br /&gt;
--    unicos [10,9,8]  == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Lucía Hernández, Adriana Gordillo, Elsa Domínguez, Lucía González, Manuel Fco Moreno, Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
unicos xs = length (nub xs)&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
unicos xs = length(group(sort xs))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20. Definir la función segundoMinimo, tal que (segundoMinimo xs)&lt;br /&gt;
-- devuelve el segundo elemento más pequeńo de la lista xs, obviando &lt;br /&gt;
-- repeticiones. Por ejemplo, &lt;br /&gt;
--    segundoMinimo [6,9,2,4]  ==  4&lt;br /&gt;
--    segundoMinimo [0.5,1.2,0.5,4.4,0.5]  ==  1.2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango&lt;br /&gt;
segundoMinimo xs = sort (nub xs) !! 1&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
segundoMinimo xs = minimum (delete(minimum (xs))(nub xs))&lt;br /&gt;
-- Adriana Gordillo&lt;br /&gt;
segundoMinimo xs = minimum (filter (&amp;gt;minimum xs) xs)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
segundoMinimo xs = head (tail(nub (sort xs)))&lt;br /&gt;
-- Manuel Fco Moreno&lt;br /&gt;
segundoMinimo xs = last (take 2 (sort(nub xs)))&lt;br /&gt;
--Pelayo Infante, Lucía González&lt;br /&gt;
segundoMinimo xs = head ( drop 1 (sort (nub xs)))&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
segundoMinimo xs = minimum (drop 1(sort(nub xs))) &lt;br /&gt;
--José Manuel García&lt;br /&gt;
segundoMinimo xs = minimum (delete (minimum js) js)&lt;br /&gt;
                   where js = nub xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 21. Definir la función kMaximo, tal que (kMaximo n xs) &lt;br /&gt;
-- devuelve el k-máximo elemento de xs (es decir, el que está en la&lt;br /&gt;
-- posición k de valores más altos), obviando repeticiones. Por ejemplo, &lt;br /&gt;
--    kMaximo 2 [6,9,2,4]  == 6&lt;br /&gt;
--    kMaximo 3 [10,9,8,10,5]  == 8&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Elsa Domínguez, Lucía González, Manuel Fco Moreno&lt;br /&gt;
kMaximo k xs = reverse (sort (nub xs)) !! (k-1)&lt;br /&gt;
--José Manuel Sánchez Parra&lt;br /&gt;
kMaximo k xs = maximum(take k xs)&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
kMaximo k xs = head(drop(k-1) (reverse(sort (nub xs))))&lt;br /&gt;
--Antonio Medinilla Garófano&lt;br /&gt;
quitarMaximo xs = delete (maximum xs) xs&lt;br /&gt;
kMaximo k xs = maximum ((iterate quitarMaximo (nub xs)) !! (k-1))&lt;br /&gt;
--Fernando Ruiz Mazo&lt;br /&gt;
kMaximoRecursivo k xs = if k==1 then maximum(nub(xs)) else kMaximoRecursivo (k-1) (init(sort(nub xs)))&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
kMaximo k xs = maximum(drop (k-1)(reverse(sort(nub xs))))&lt;br /&gt;
--César Fornis Catalán&lt;br /&gt;
kMaximo k xs = head(drop (k-1) (reverse(sort(nub xs))))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22. Definir la función numPermut, tal que (numPermut xs) &lt;br /&gt;
-- devuelve el número de permutaciones sin repetición posibles con los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo, &lt;br /&gt;
--    numPermut [6,2,4]  == 6&lt;br /&gt;
--    numPermut [10,8,10,5]  == 24&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Manuel Fco Moreno, Lucía Hernández, José Manuel Sánchez Parra, Elsa Domínguez, Lucía González, Adolfo Sagrera Vivancos&lt;br /&gt;
numPermut xs = length (permutations xs)&lt;br /&gt;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
numPermut xs = product [1..(length xs)]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 23 Definir la función numPares, tal que (numPares xs)&lt;br /&gt;
-- devuelva cuantos números pares en total (sin repeticiones) aparecen&lt;br /&gt;
-- en la lista xs. Por ejemplo, &lt;br /&gt;
--    numPares [1,4,8,2,1,4,6,1]  == 4&lt;br /&gt;
--    numPares [10,9,8,10,5,10]  == 2&lt;br /&gt;
--    numPares [10,9,8]  == 2&lt;br /&gt;
-- Indicación: puede ser útil la función partitions&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, José Manuel Sánchez Parra, Elsa Domínguez&lt;br /&gt;
numPares xs = length (nub (filter even xs))&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
numPares xs = length(group (sort (filter even xs)))&lt;br /&gt;
--Lucía Hernández, Adolfo Sagrera Vivancos&lt;br /&gt;
numPares xs = length(fst(partition even (nub xs)))&lt;br /&gt;
--Lucía González, Manuel Fco Moreno&lt;br /&gt;
numPares xs =  length (filter even (nub xs))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=136</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=136"/>
		<updated>2021-10-06T07:08:31Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_1.hs (24 de septiembre de 2021)&lt;br /&gt;
-- Definiciones por composición sobre números, listas y booleanos. &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;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- En esta relación se plantean ejercicios con definiciones de funciones &lt;br /&gt;
-- por composición sobre números, listas y booleanos.&lt;br /&gt;
-- &lt;br /&gt;
-- Para solucionar los ejercicios puede ser útil el manual de&lt;br /&gt;
-- funciones de Haskell que se encuentra en http://bit.ly/1uJZiqi y su&lt;br /&gt;
-- resumen en http://bit.ly/ZwSMHO&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Manuel Alcaide García, Lucía Hernández, Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Irene Ortega Moncayo, Laura Arango, Ana Sosa Caballero, Adolfo Sagrera Vivancos, Pelayo INfante Pérez, Sara Cerro Torres, Manuel Fco Moreno, Virginia Sánchez, Carmen Blanco, José Manuel Garcia, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
-- Antonio López García, César Fornis Catalán&lt;br /&gt;
media3 x y z = (sum [x,y,z])/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función sumaMonedas tal que &lt;br /&gt;
-- (sumaMonedas a b c d e) es la suma de los euros correspondientes a &lt;br /&gt;
-- a monedas de 1 euro, b de 2 euros, c de 5 euros, d 10 euros y&lt;br /&gt;
-- e de 20 euros. Por ejemplo,&lt;br /&gt;
--    sumaMonedas 0 0 0 0 1  ==  20&lt;br /&gt;
--    sumaMonedas 0 0 8 0 3  == 100&lt;br /&gt;
--    sumaMonedas 1 1 1 1 1  ==  38&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Lucía Hernández, Manuel Fco Moreno, Laura Arango, Ana Sosa Caballero, Sara Cerro Torres, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez&lt;br /&gt;
sumamonedas a b c d e = a+b*2+c*5+d*10+e*20&lt;br /&gt;
-- Antonio López García, Irene Ortega, César Fornis Catalán, Virginia Sánchez, Elsa Domínguez&lt;br /&gt;
sumaMonedas a b c d e = sum [a, b*2, c*5, d*10, e*20]&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González, Pelayo Infante, Francisco José Espinosa, Carmen Blanco, José Manuel García&lt;br /&gt;
sumaMonedas a b c d e = a*1+b*2+c*5+d*10+e*20&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función volumenEsfera tal que &lt;br /&gt;
-- (volumenEsfera r) es el volumen de la esfera de radio r. Por ejemplo,&lt;br /&gt;
--    volumenEsfera 10  ==  4188.790204786391&lt;br /&gt;
-- Indicación: Usar la constante pi.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Adriana Gordillo Melero, Lucía Hernández, Nicolás Rodríguez Ruiz, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Pelayo Infante, Sara Cerro Torres, José Manuel García, Manuel Fco Moreno, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
 volumenEsfera r = (4/3)*pi*r^3&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Carmen Blanco&lt;br /&gt;
volumenEsfera r =(4/3)*(pi*r^3)&lt;br /&gt;
-- Irene Ortega&lt;br /&gt;
volumenEsfera r = pi*(r^3)*4/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
-- César Fornis Catalán, Virginia Sánchez&lt;br /&gt;
volumenEsfera r = (4*pi*r^3)/3&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir la función areaDeCoronaCircular tal que &lt;br /&gt;
-- (areaDeCoronaCircular r1 r2) es el área de una corona circular de&lt;br /&gt;
-- radio interior r1 y radio exterior r2. Por ejemplo,&lt;br /&gt;
--    areaDeCoronaCircular 1 2 == 9.42477796076938&lt;br /&gt;
--    areaDeCoronaCircular 2 5 == 65.97344572538566&lt;br /&gt;
--    areaDeCoronaCircular 3 5 == 50.26548245743669&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Adriana Gordillo Melero, Antonio López García, Lucía González, Nicolás Rodríguez Ruiz, Sara Cerro Torres, Elsa Domínguez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*r2^2 - pi*r1^2&lt;br /&gt;
--Álvaro Cano, Ana Sosa Caballero, Irene Ortega, César Fornis Catalán,Manuel Fco Moreno, José Manuel García, Rafael Gómez, Iván García Rodríguez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*(r2^2-r1^2)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
areaDeCoronaCircular r1 r2 = areaCirculo r2 - areaCirculo r1&lt;br /&gt;
                             where areaCirculo r = pi*r^2&lt;br /&gt;
--Adolfo Sagrera Vivancos, Pelayo Infante , Francisco José Espinosa, Jaime Chaves Navarro&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*r2^2)-(pi*r1^2)&lt;br /&gt;
-- Carmen Blanco&lt;br /&gt;
-- Virginia Sánchez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*(r2)^2) - (pi*(r1)^2)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- Indicación: Usar la función rem&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Adriana Gordillo Melero, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Adolfo Sagrera Vivancos Francisco José Espinosa, Lucía González, Nicolás Rodríguez Ruiz, Irene Ortega, Carmen Blanco, Manuel Fco Moreno, César Fornis Catalán, Rafael Gómez, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Definir la función maxTres tal que (maxTres x y z) es&lt;br /&gt;
-- el máximo de x, y y z. Por ejemplo,&lt;br /&gt;
--    maxTres 6 2 4  ==  6&lt;br /&gt;
--    maxTres 6 7 4  ==  7&lt;br /&gt;
--    maxTres 6 7 9  ==  9&lt;br /&gt;
-- Indicación: Usar la función max.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adriana Gordillo, Irene Ortega, Nicolás Rodríguez Ruiz, Manuel Fco Moreno, Rafael Gómez, Jaime Chaves Navarro&lt;br /&gt;
maxTres x y z = max(max x y)(z)&lt;br /&gt;
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos, Iván García Rodríguez&lt;br /&gt;
maxTres x y z = max x t&lt;br /&gt;
                where t = max y z&lt;br /&gt;
&lt;br /&gt;
-- Antonio López García, Lucía González, Carmen Blanco&lt;br /&gt;
maxTres x y z = maximum [x,y,z]&lt;br /&gt;
--César Fornis Catalán, José Manuel García, Elsa Domínguez&lt;br /&gt;
maxTres x y z = max (max x y) z&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir la función rota1 tal que (rota1 xs) es la lista&lt;br /&gt;
-- obtenida poniendo el primer elemento de xs al final de la lista. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    rota1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adriana Gordillo, Ana Sosa Caballero , Irene Ortega, Lucía González, Nicolás Rodríguez Ruiz, Carmen Blanco, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Manuel Fco Moreno, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
rota1 xs = tail xs ++ [head xs]&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
rota1 xs = drop 1 xs ++ take 1 xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Adriana Gordillo, Ana Sosa Caballero, Antonio López García, Irene Ortega, Lucía González, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Manuel Fco Moreno, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
rota n xs = drop n xs ++ take n xs&lt;br /&gt;
&lt;br /&gt;
-- Fernando Ruiz (mejora para conseguir rotar el vector un número mayor de veces que de elementos en el vector)&lt;br /&gt;
rota n xs = drop (mod n (length xs)) xs ++ take (mod n (length xs)) xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Definir la función rango tal que (rango xs) es la&lt;br /&gt;
-- lista formada por el menor y mayor elemento de xs.&lt;br /&gt;
--    rango [3,2,7,5]  ==  [2,7]&lt;br /&gt;
-- Indicación: Se pueden usar minimum y maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Irene Ortega, Lucía González, Manuel Fco Moreno, Adolfo Sagrera Vivancos, José Manuel García, Rafael Gómez, Jaime Chaves Navarro, Sara Cerro Torres, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
rango xs = [minimum xs] ++ [maximum xs]&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García, Iván García Rodríguez&lt;br /&gt;
rango xs = [minimum xs, maximum xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir la función palindromo tal que (palindromo xs) se&lt;br /&gt;
-- verifica si xs es un palíndromo; es decir, es lo mismo leer xs de&lt;br /&gt;
-- izquierda a derecha que de derecha a izquierda. Por ejemplo,&lt;br /&gt;
--    palindromo [3,2,5,2,3]    ==  True&lt;br /&gt;
--    palindromo [3,2,5,6,2,3]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Álvaro Cano, José Manuel Sánchez Parra, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía Hernández, Manuel Alcaide, Lucía González , Irene Ortega, José Manuel García ,Rafael Gómez, Manuel Fco Moreno, Adolfo Sagrera Vivancos, Jaime Chaves Navarro, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
palindromo xs = xs == reverse xs&lt;br /&gt;
--Iván García Rodríguez&lt;br /&gt;
palindromo xs = if xs==reverse xs&lt;br /&gt;
  then &amp;quot;True&amp;quot;&lt;br /&gt;
  else &amp;quot;False&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Definir la función interior tal que (interior xs) es la&lt;br /&gt;
-- lista obtenida eliminando los extremos de la lista xs. Por ejemplo,&lt;br /&gt;
--    interior [2,5,3,7,3]  ==  [5,3,7]&lt;br /&gt;
--    interior [2..7]       ==  [3,4,5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández, Ana Sosa Caballero, Lucía González, Manuel Fco Moreno, Adolfo Sagrera Vivancos, Adriana Gordillo&lt;br /&gt;
interior xs = tail (init xs)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
interior xs = drop 1 (init xs)&lt;br /&gt;
--Fernando Ruiz, Antonio López García, Irene Ortega, Jaime Chaves Navarro, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
interior xs = init (tail xs)&lt;br /&gt;
--Manuel Alcaide García&lt;br /&gt;
interior xs = init (drop 1 xs)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
interior xs = reverse (take ((length js)-1) js)&lt;br /&gt;
         where js = reverse (take ((length xs)-1) xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función finales tal que (finales n xs) es la&lt;br /&gt;
-- lista formada por los n finales elementos de xs. Por ejemplo,&lt;br /&gt;
--    finales 3 [2,5,4,7,9,6]  ==  [7,9,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Álvaro Cano, Lucía González&lt;br /&gt;
finales n xs = drop n xs&lt;br /&gt;
-- Lucía Hernández, Adolfo Sagrera Vivancos&lt;br /&gt;
finales n xs = reverse (take n (reverse xs))&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero&lt;br /&gt;
finales n xs = drop m xs&lt;br /&gt;
               where m = length xs - n&lt;br /&gt;
-- Antonio López García, Fernando Ruiz Mazo, Pelayo Infante, Manuel Fco Moreno, Manuel Alcaide García, Irene Ortega, Adriana Gordillo, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
finales n xs = drop (length xs - n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. Definir la función segmento tal que (segmento m n xs) es&lt;br /&gt;
-- la lista de los elementos de xs comprendidos entre las posiciones m y&lt;br /&gt;
-- n. Por ejemplo,&lt;br /&gt;
--    segmento 3 4 [3,4,1,2,7,9,0]  ==  [1,2]&lt;br /&gt;
--    segmento 3 5 [3,4,1,2,7,9,0]  ==  [1,2,7]&lt;br /&gt;
--    segmento 5 3 [3,4,1,2,7,9,0]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
segmento m n xs = drop (m-1) (reverse (drop a ys))&lt;br /&gt;
                  where a  = length xs - n&lt;br /&gt;
                        ys = reverse xs&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García, Lucía González, Iván García Rodríguez, Adolfo Sagrera Vivancos&lt;br /&gt;
segmento m n xs = drop (m-1) (take n xs)&lt;br /&gt;
-- Fernando Ruiz &lt;br /&gt;
segmento m n xs = reverse (drop ((length xs)-n+m-2)(reverse (drop (m-1) xs)))&lt;br /&gt;
--Lucía Hernández, José Manuel García&lt;br /&gt;
segmento m n xs = take (n-m+1)(drop(m-1) xs)&lt;br /&gt;
--Manuel Alcaide García, Irene Ortega&lt;br /&gt;
segmento m n xs = take (n-(m-1)) (drop (m-1) xs)&lt;br /&gt;
--Pelayo Infante&lt;br /&gt;
segmento m n xs = drop(m-1) (reverse a)&lt;br /&gt;
 where a=  drop(length xs-n)(reverse xs)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. Definir la función extremos tal que (extremos n xs) es&lt;br /&gt;
-- la lista formada por los n primeros elementos de xs y los n finales&lt;br /&gt;
-- elementos de xs. Por ejemplo, &lt;br /&gt;
--    extremos 3 [2,6,7,1,2,4,5,8,9,2,3]  ==  [2,6,7,9,2,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango&lt;br /&gt;
extremos n xs = take n xs ++ finales n XS&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Fernando Ruiz, Adriana Gordillo, Adolfo Sagrera Vivancos&lt;br /&gt;
extremos n xs = take n xs ++ reverse (take n (reverse xs))&lt;br /&gt;
-- Irene Ortega, Pelayo Infante, Iván García Rodríguez, Elsa Domínguez&lt;br /&gt;
extremos n xs = take n xs  ++  drop (length xs-n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15. Definir la función mediano tal que (mediano x y z) es el&lt;br /&gt;
-- número mediano de los tres números x, y y z. Por ejemplo,&lt;br /&gt;
--    mediano 3 2 5  ==  3&lt;br /&gt;
--    mediano 2 4 5  ==  4&lt;br /&gt;
--    mediano 2 6 5  ==  5&lt;br /&gt;
--    mediano 2 6 6  ==  6&lt;br /&gt;
-- Indicación: Usar maximum y minimum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango&lt;br /&gt;
 mediano x y z = max x (min y z) (Contraejemplo : mediano 8 10 3)&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
mediano x y z = minimum [maximum [x,y], z] (Contraejemplo : mediano 8 10 3)&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
mediano x y z = maximum [minimum [x,y], minimum[x,z], minimum[y,z]]&lt;br /&gt;
-- Fernando Ruiz Mazo, Irene Ortega&lt;br /&gt;
mediano x y z = minimum ([maximum [x,y]] ++ [maximum [y,z]] ++ [maximum [x,z]])&lt;br /&gt;
-- Adriana Gordillo, Elsa Domínguez, Adolfo Sagrera Vivancos&lt;br /&gt;
mediano x y z = (x+y+z)-maximum[x,y,z]-minimum[x,y,z]&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
mediano x y z = maximum [minimum [x,y], minimum [maximum[x,y],z]]&lt;br /&gt;
-- Iván García Rodríguez&lt;br /&gt;
mediano x y z = max x a where a=min y z&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16. Definir la función tresIguales tal que &lt;br /&gt;
-- (tresIguales x y z) se verifica si los elementos x, y y z son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    tresIguales 4 4 4  ==  True&lt;br /&gt;
--    tresIguales 4 3 4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Lucía Hernández, Irene Ortega, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
tresIguales x y z = x==y &amp;amp;&amp;amp; x==z&lt;br /&gt;
--Pelayo Infante&lt;br /&gt;
tresIguales x y z = x^3==x*y*z&lt;br /&gt;
--Iván García Rodríguez&lt;br /&gt;
tresIguales x y z = if x==y &amp;amp;&amp;amp; y==z&lt;br /&gt;
  then &amp;quot;True&amp;quot;&lt;br /&gt;
  else &amp;quot;False&amp;quot;&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
tresIguales x y z = x==y &amp;amp;&amp;amp; y==z&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 17. Definir la función tresDiferentes tal que &lt;br /&gt;
-- (tresDiferentes x y z) se verifica si los elementos x, y y z son&lt;br /&gt;
-- distintos. Por ejemplo, &lt;br /&gt;
--    tresDiferentes 3 5 2  ==  True&lt;br /&gt;
--    tresDiferentes 3 5 3  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Lucía Hernández, Adriana Gordillo&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; x/=z&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
tresDiferentes x y z = and [x/=y, y/=z, x/=z]&lt;br /&gt;
--Irene Ortega&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; x/=z &amp;amp;&amp;amp; y/=x&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; y/=z &amp;amp;&amp;amp; x/=z&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 18. Definir la función cuatroIguales tal que &lt;br /&gt;
-- (cuatroIguales x y z u) se verifica si los elementos x, y, z y u son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    cuatroIguales 5 5 5 5   ==  True&lt;br /&gt;
--    cuatroIguales 5 5 4 5   ==  False&lt;br /&gt;
-- Indicación: Usar la función tresIguales.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Irene Ortega, Elsa Domínguez&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z == True &amp;amp;&amp;amp; x==u&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z &amp;amp;&amp;amp; x==u&lt;br /&gt;
-- Adriana Gordillo&lt;br /&gt;
cuatroIguales x y z u = x==y &amp;amp;&amp;amp; y==z &amp;amp;&amp;amp; z==u&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicios para trabajar con Data.List. Ver:&lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/Funciones_basicas.html&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19. Definir la función unicos, tal que (unicos xs)&lt;br /&gt;
-- devuelva la cantidad de elementos únicos que hay en la lista xs.&lt;br /&gt;
-- Por ejemplo, &lt;br /&gt;
--    unicos [1,4,8,2,1,4,6,1]  == 5 &lt;br /&gt;
--    unicos [10,9,8,10,5,10]  == 4&lt;br /&gt;
--    unicos [10,9,8]  == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Lucía Hernández, Adriana Gordillo, Elsa Domínguez&lt;br /&gt;
unicos xs = length (nub xs)&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
unicos xs = length(group(sort xs))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20. Definir la función segundoMinimo, tal que (segundoMinimo xs)&lt;br /&gt;
-- devuelve el segundo elemento más pequeńo de la lista xs, obviando &lt;br /&gt;
-- repeticiones. Por ejemplo, &lt;br /&gt;
--    segundoMinimo [6,9,2,4]  ==  4&lt;br /&gt;
--    segundoMinimo [0.5,1.2,0.5,4.4,0.5]  ==  1.2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango&lt;br /&gt;
segundoMinimo xs = sort (nub xs) !! 1&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
segundoMinimo xs = minimum (delete(minimum (xs))(nub xs))&lt;br /&gt;
-- Adriana Gordillo&lt;br /&gt;
segundoMinimo xs = minimum (filter (&amp;gt;minimum xs) xs)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
segundoMinimo xs = head (tail(nub (sort xs))) &lt;br /&gt;
--Pelayo Infante &lt;br /&gt;
segundoMinimo xs = head ( drop 1 (sort (nub xs)))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 21. Definir la función kMaximo, tal que (kMaximo n xs) &lt;br /&gt;
-- devuelve el k-máximo elemento de xs (es decir, el que está en la&lt;br /&gt;
-- posición k de valores más altos), obviando repeticiones. Por ejemplo, &lt;br /&gt;
--    kMaximo 2 [6,9,2,4]  == 6&lt;br /&gt;
--    kMaximo 3 [10,9,8,10,5]  == 8&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Elsa Domínguez&lt;br /&gt;
kMaximo k xs = reverse (sort (nub xs)) !! (k-1)&lt;br /&gt;
--José Manuel Sánchez Parra&lt;br /&gt;
kMaximo k xs = maximum(take k xs)&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
kMaximo k xs = head(drop(k-1) (reverse(sort (nub xs))))&lt;br /&gt;
--Antonio Medinilla Garófano&lt;br /&gt;
quitarMaximo xs = delete (maximum xs) xs&lt;br /&gt;
kMaximo k xs = maximum ((iterate quitarMaximo (nub xs)) !! (k-1))&lt;br /&gt;
--Fernando Ruiz Mazo&lt;br /&gt;
kMaximoRecursivo k xs = if k==1 then maximum(nub(xs)) else kMaximoRecursivo (k-1) (init(sort(nub xs)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22. Definir la función numPermut, tal que (numPermut xs) &lt;br /&gt;
-- devuelve el número de permutaciones sin repetición posibles con los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo, &lt;br /&gt;
--    numPermut [6,2,4]  == 6&lt;br /&gt;
--    numPermut [10,8,10,5]  == 24&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Lucía Hernández, José Manuel Sánchez Parra, Elsa Domínguez&lt;br /&gt;
numPermut xs = length (permutations xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 23 Definir la función numPares, tal que (numPares xs)&lt;br /&gt;
-- devuelva cuantos números pares en total (sin repeticiones) aparecen&lt;br /&gt;
-- en la lista xs. Por ejemplo, &lt;br /&gt;
--    numPares [1,4,8,2,1,4,6,1]  == 4&lt;br /&gt;
--    numPares [10,9,8,10,5,10]  == 2&lt;br /&gt;
--    numPares [10,9,8]  == 2&lt;br /&gt;
-- Indicación: puede ser útil la función partitions&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, José Manuel Sánchez Parra, Elsa Domínguez&lt;br /&gt;
numPares xs = length (nub (filter even xs))&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
numPares xs = length(group (sort (filter even xs)))&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
numPares xs = length(fst(partition even (nub xs)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=112</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=112"/>
		<updated>2021-09-29T17:33:49Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_1.hs (24 de septiembre de 2021)&lt;br /&gt;
-- Definiciones por composición sobre números, listas y booleanos. &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;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- En esta relación se plantean ejercicios con definiciones de funciones &lt;br /&gt;
-- por composición sobre números, listas y booleanos.&lt;br /&gt;
-- &lt;br /&gt;
-- Para solucionar los ejercicios puede ser útil el manual de&lt;br /&gt;
-- funciones de Haskell que se encuentra en http://bit.ly/1uJZiqi y su&lt;br /&gt;
-- resumen en http://bit.ly/ZwSMHO&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = undefined&lt;br /&gt;
-- Miguel Ángel Martínez&lt;br /&gt;
media3 x y z = .sdfsdfadf&lt;br /&gt;
-- Manuel Alcaide García, Lucía Hernández, Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Irene Ortega Moncayo, Laura Arango, Ana Sosa Caballero, Adolfo Sagrera Vivancos, Pelayo INfante Pérez, Sara Cerro Torres, Virginia Sánchez, Carmen Blanco, José Manuel Garcia&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
-- Antonio López García, César Fornis Catalán&lt;br /&gt;
media3 x y z = (sum [x,y,z])/3&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función sumaMonedas tal que &lt;br /&gt;
-- (sumaMonedas a b c d e) es la suma de los euros correspondientes a &lt;br /&gt;
-- a monedas de 1 euro, b de 2 euros, c de 5 euros, d 10 euros y&lt;br /&gt;
-- e de 20 euros. Por ejemplo,&lt;br /&gt;
--    sumaMonedas 0 0 0 0 1  ==  20&lt;br /&gt;
--    sumaMonedas 0 0 8 0 3  == 100&lt;br /&gt;
--    sumaMonedas 1 1 1 1 1  ==  38&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaMonedas a b c d e = undefined&lt;br /&gt;
-- Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Lucía Hernández, Laura Arango, Ana Sosa Caballero, Sara Cerro Torres&lt;br /&gt;
sumamonedas a b c d e = a+b*2+c*5+d*10+e*20&lt;br /&gt;
-- Antonio López García, Irene Ortega, César Fornis Catalán, Virginia Sánchez&lt;br /&gt;
sumaMonedas a b c d e = sum [a, b*2, c*5, d*10, e*20]&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González, Pelayo Infante, Francisco José Espinosa, Carmen Blanco, José Manuel García&lt;br /&gt;
sumaMonedas a b c d e = a*1+b*2+c*5+d*10+e*20&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función volumenEsfera tal que &lt;br /&gt;
-- (volumenEsfera r) es el volumen de la esfera de radio r. Por ejemplo,&lt;br /&gt;
--    volumenEsfera 10  ==  4188.790204786391&lt;br /&gt;
-- Indicación: Usar la constante pi.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
volumenEsfera r = undefined &lt;br /&gt;
-- Adriana Gordillo Melero, Lucía Hernández, Nicolás Rodríguez Ruiz, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Pelayo Infante, Sara Cerro Torres, José Manuel García&lt;br /&gt;
 volumenEsfera r = (4/3)*pi*r^3&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Carmen Blanco&lt;br /&gt;
volumenEsfera r =(4/3)*(pi*r^3)&lt;br /&gt;
-- Irene Ortega&lt;br /&gt;
volumenEsfera r = pi*(r^3)*4/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
-- César Fornis Catalán, Virginia Sánchez&lt;br /&gt;
volumenEsfera r = (4*pi*r^3)/3&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir la función areaDeCoronaCircular tal que &lt;br /&gt;
-- (areaDeCoronaCircular r1 r2) es el área de una corona circular de&lt;br /&gt;
-- radio interior r1 y radio exterior r2. Por ejemplo,&lt;br /&gt;
--    areaDeCoronaCircular 1 2 == 9.42477796076938&lt;br /&gt;
--    areaDeCoronaCircular 2 5 == 65.97344572538566&lt;br /&gt;
--    areaDeCoronaCircular 3 5 == 50.26548245743669&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Adriana Gordillo Melero, Antonio López García, Lucía González, Nicolás Rodríguez Ruiz, Sara Cerro Torres&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*r2^2 - pi*r1^2&lt;br /&gt;
--Álvaro Cano, Ana Sosa Caballero, Irene Ortega, César Fornis Catalán, José Manuel García&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*(r2^2-r1^2)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
areaDeCoronaCircular r1 r2 = areaCirculo r2 - areaCirculo r1&lt;br /&gt;
                             where areaCirculo r = pi*r^2&lt;br /&gt;
--Adolfo Sagrera Vivancos, Pelayo INfante , Francisco José Espinosa&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*r2^2)-(pi*r1^2)&lt;br /&gt;
-- Carmen Blanco&lt;br /&gt;
-- Virginia Sánchez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*(r2)^2) - (pi*(r1)^2)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- Indicación: Usar la función rem&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Adriana Gordillo Melero, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Adolfo Sagrera Vivancos Francisco José Espinosa, Lucía González, Nicolás Rodríguez Ruiz, Irene Ortega, Carmen Blanco, César Fornis Catalán&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Definir la función maxTres tal que (maxTres x y z) es&lt;br /&gt;
-- el máximo de x, y y z. Por ejemplo,&lt;br /&gt;
--    maxTres 6 2 4  ==  6&lt;br /&gt;
--    maxTres 6 7 4  ==  7&lt;br /&gt;
--    maxTres 6 7 9  ==  9&lt;br /&gt;
-- Indicación: Usar la función max.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adriana Gordillo, Irene Ortega, Nicolás Rodríguez Ruiz&lt;br /&gt;
maxTres x y z = max(max x y)(z)&lt;br /&gt;
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
maxTres x y z = max x t&lt;br /&gt;
                where t = max y z&lt;br /&gt;
&lt;br /&gt;
-- Antonio López García, Lucía González, Carmen Blanco&lt;br /&gt;
maxTres x y z = maximum [x,y,z]&lt;br /&gt;
--César Fornis Catalán, José Manuel García&lt;br /&gt;
maxTres x y z = max(max x y) z&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir la función rota1 tal que (rota1 xs) es la lista&lt;br /&gt;
-- obtenida poniendo el primer elemento de xs al final de la lista. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    rota1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adriana Gordillo, Ana Sosa Caballero , Irene Ortega, Lucía González, Nicolás Rodríguez Ruiz, Carmen Blanco, Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
rota1 xs = tail xs ++ [head xs]&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
rota1 xs = drop 1 xs ++ take 1 xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Adriana Gordillo, Ana Sosa Caballero, Antonio López García, Irene Ortega, Lucía González, Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
rota n xs = drop n xs ++ take n xs&lt;br /&gt;
&lt;br /&gt;
-- Fernando Ruiz (mejora para conseguir rotar el vector un número mayor de veces que de elementos en el vector)&lt;br /&gt;
rota n xs = drop (mod n (length xs)) xs ++ take (mod n (length xs)) xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Definir la función rango tal que (rango xs) es la&lt;br /&gt;
-- lista formada por el menor y mayor elemento de xs.&lt;br /&gt;
--    rango [3,2,7,5]  ==  [2,7]&lt;br /&gt;
-- Indicación: Se pueden usar minimum y maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Irene Ortega, Lucía González, Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
rango xs = [minimum xs] ++ [maximum xs]&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García&lt;br /&gt;
rango xs = [minimum xs, maximum xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir la función palindromo tal que (palindromo xs) se&lt;br /&gt;
-- verifica si xs es un palíndromo; es decir, es lo mismo leer xs de&lt;br /&gt;
-- izquierda a derecha que de derecha a izquierda. Por ejemplo,&lt;br /&gt;
--    palindromo [3,2,5,2,3]    ==  True&lt;br /&gt;
--    palindromo [3,2,5,6,2,3]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Álvaro Cano, José Manuel Sánchez Parra, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía Hernández, Manuel Alcaide, Lucía González , Irene Ortega, José Manuel García&lt;br /&gt;
palindromo xs = xs == reverse xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Definir la función interior tal que (interior xs) es la&lt;br /&gt;
-- lista obtenida eliminando los extremos de la lista xs. Por ejemplo,&lt;br /&gt;
--    interior [2,5,3,7,3]  ==  [5,3,7]&lt;br /&gt;
--    interior [2..7]       ==  [3,4,5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández, Ana Sosa Caballero, Lucía González&lt;br /&gt;
interior xs = tail (init xs)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
interior xs = drop 1 (init xs)&lt;br /&gt;
--Fernando Ruiz, Antonio López García, Irene Ortega&lt;br /&gt;
interior xs = init (tail xs)&lt;br /&gt;
--Manuel Alcaide García&lt;br /&gt;
interior xs = init (drop 1 xs)&lt;br /&gt;
--José Manuel García&lt;br /&gt;
interior xs = reverse (take ((length js)-1) js)&lt;br /&gt;
         where js = reverse (take ((length xs)-1) xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función finales tal que (finales n xs) es la&lt;br /&gt;
-- lista formada por los n finales elementos de xs. Por ejemplo,&lt;br /&gt;
--    finales 3 [2,5,4,7,9,6]  ==  [7,9,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Álvaro Cano, Lucía González&lt;br /&gt;
finales n xs = drop n xs&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
finales n xs = reverse (take n (reverse xs))&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero&lt;br /&gt;
finales n xs = drop m xs&lt;br /&gt;
               where m = length xs - n&lt;br /&gt;
-- Antonio López García, Fernando Ruiz Mazo, Pelayo Infante, Manuel Alcaide García, Irene Ortega&lt;br /&gt;
finales n xs = drop (length xs - n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. Definir la función segmento tal que (segmento m n xs) es&lt;br /&gt;
-- la lista de los elementos de xs comprendidos entre las posiciones m y&lt;br /&gt;
-- n. Por ejemplo,&lt;br /&gt;
--    segmento 3 4 [3,4,1,2,7,9,0]  ==  [1,2]&lt;br /&gt;
--    segmento 3 5 [3,4,1,2,7,9,0]  ==  [1,2,7]&lt;br /&gt;
--    segmento 5 3 [3,4,1,2,7,9,0]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango&lt;br /&gt;
segmento m n xs = drop (m-1) (reverse (drop a ys))&lt;br /&gt;
                  where a  = length xs - n&lt;br /&gt;
                        ys = reverse XS&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García, Lucía González&lt;br /&gt;
segmento m n xs = drop (m-1) (take n xs)&lt;br /&gt;
-- Fernando Ruiz &lt;br /&gt;
segmento m n xs = reverse (drop ((length xs)-n+m-2)(reverse (drop (m-1) xs)))&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
segmento m n xs = take (n-m+1)(drop(m-1) xs)&lt;br /&gt;
--Manuel Alcaide García, Irene Ortega&lt;br /&gt;
segmento m n xs = take (n-(m-1)) (drop (m-1) xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. Definir la función extremos tal que (extremos n xs) es&lt;br /&gt;
-- la lista formada por los n primeros elementos de xs y los n finales&lt;br /&gt;
-- elementos de xs. Por ejemplo, &lt;br /&gt;
--    extremos 3 [2,6,7,1,2,4,5,8,9,2,3]  ==  [2,6,7,9,2,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango&lt;br /&gt;
extremos n xs = take n xs ++ finales n XS&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Fernando Ruiz&lt;br /&gt;
extremos n xs = take n xs ++ reverse (take n (reverse xs))&lt;br /&gt;
-- Irene Ortega&lt;br /&gt;
extremos n xs = take n xs  ++  drop (length xs-n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15. Definir la función mediano tal que (mediano x y z) es el&lt;br /&gt;
-- número mediano de los tres números x, y y z. Por ejemplo,&lt;br /&gt;
--    mediano 3 2 5  ==  3&lt;br /&gt;
--    mediano 2 4 5  ==  4&lt;br /&gt;
--    mediano 2 6 5  ==  5&lt;br /&gt;
--    mediano 2 6 6  ==  6&lt;br /&gt;
-- Indicación: Usar maximum y minimum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango&lt;br /&gt;
 mediano x y z = max x (min y z) (Contraejemplo : mediano 8 10 3)&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
mediano x y z = minimum [maximum [x,y], z] (Contraejemplo : mediano 8 10 3)&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
mediano x y z = maximum [minimum [x,y], minimum[x,z], minimum[y,z]]&lt;br /&gt;
-- Fernando Ruiz Mazo, Irene Ortega&lt;br /&gt;
mediano x y z = minimum ([maximum [x,y]] ++ [maximum [y,z]] ++ [maximum [x,z]])&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16. Definir la función tresIguales tal que &lt;br /&gt;
-- (tresIguales x y z) se verifica si los elementos x, y y z son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    tresIguales 4 4 4  ==  True&lt;br /&gt;
--    tresIguales 4 3 4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Lucía Hernández, Irene Ortega&lt;br /&gt;
tresIguales x y z = x==y &amp;amp;&amp;amp; x==z&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 17. Definir la función tresDiferentes tal que &lt;br /&gt;
-- (tresDiferentes x y z) se verifica si los elementos x, y y z son&lt;br /&gt;
-- distintos. Por ejemplo, &lt;br /&gt;
--    tresDiferentes 3 5 2  ==  True&lt;br /&gt;
--    tresDiferentes 3 5 3  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Lucía Hernández&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; x/=z&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
tresDiferentes x y z = and [x/=y, y/=z, x/=z]&lt;br /&gt;
--Irene Ortega&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; x/=z &amp;amp;&amp;amp; y/=x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 18. Definir la función cuatroIguales tal que &lt;br /&gt;
-- (cuatroIguales x y z u) se verifica si los elementos x, y, z y u son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    cuatroIguales 5 5 5 5   ==  True&lt;br /&gt;
--    cuatroIguales 5 5 4 5   ==  False&lt;br /&gt;
-- Indicación: Usar la función tresIguales.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Irene Ortega&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z == True &amp;amp;&amp;amp; x==u&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z &amp;amp;&amp;amp; x==u&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicios para trabajar con Data.List. Ver:&lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/Funciones_basicas.html&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19. Definir la función unicos, tal que (unicos xs)&lt;br /&gt;
-- devuelva la cantidad de elementos únicos que hay en la lista xs.&lt;br /&gt;
-- Por ejemplo, &lt;br /&gt;
--    unicos [1,4,8,2,1,4,6,1]  == 5 &lt;br /&gt;
--    unicos [10,9,8,10,5,10]  == 4&lt;br /&gt;
--    unicos [10,9,8]  == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Lucía Hernández&lt;br /&gt;
unicos xs = length (nub xs)&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
unicos xs = length(group(sort xs))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20. Definir la función segundoMinimo, tal que (segundoMinimo xs)&lt;br /&gt;
-- devuelve el segundo elemento más pequeńo de la lista xs, obviando &lt;br /&gt;
-- repeticiones. Por ejemplo, &lt;br /&gt;
--    segundoMinimo [6,9,2,4]  ==  4&lt;br /&gt;
--    segundoMinimo [0.5,1.2,0.5,4.4,0.5]  ==  1.2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango&lt;br /&gt;
segundoMinimo xs = sort (nub xs) !! 1&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
segundoMinimo xs = minimum (delete(minimum (xs))(nub xs))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 21. Definir la función kMaximo, tal que (kMaximo n xs) &lt;br /&gt;
-- devuelve el k-máximo elemento de xs (es decir, el que está en la&lt;br /&gt;
-- posición k de valores más altos), obviando repeticiones. Por ejemplo, &lt;br /&gt;
--    kMaximo 2 [6,9,2,4]  == 6&lt;br /&gt;
--    kMaximo 3 [10,9,8,10,5]  == 8&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero&lt;br /&gt;
kMaximo k xs = reverse (sort (nub xs)) !! (k-1)&lt;br /&gt;
--José Manuel Sánchez Parra&lt;br /&gt;
kMaximo k xs = maximum(take k xs)&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
kMaximo k xs = head(drop(k-1) (reverse(sort (nub xs))))&lt;br /&gt;
--Antonio Medinilla Garófano&lt;br /&gt;
quitarMaximo xs = delete (maximum xs) xs&lt;br /&gt;
kMaximo k xs = maximum ((iterate quitarMaximo (nub xs)) !! (k-1))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22. Definir la función numPermut, tal que (numPermut xs) &lt;br /&gt;
-- devuelve el número de permutaciones sin repetición posibles con los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo, &lt;br /&gt;
--    numPermut [6,2,4]  == 6&lt;br /&gt;
--    numPermut [10,8,10,5]  == 24&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Lucía Hernández, José Manuel Sánchez Parra&lt;br /&gt;
numPermut xs = length (permutations xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 23 Definir la función numPares, tal que (numPares xs)&lt;br /&gt;
-- devuelva cuantos números pares en total (sin repeticiones) aparecen&lt;br /&gt;
-- en la lista xs. Por ejemplo, &lt;br /&gt;
--    numPares [1,4,8,2,1,4,6,1]  == 4&lt;br /&gt;
--    numPares [10,9,8,10,5,10]  == 2&lt;br /&gt;
--    numPares [10,9,8]  == 2&lt;br /&gt;
-- Indicación: puede ser útil la función partitions&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, José Manuel Sánchez Parra&lt;br /&gt;
numPares xs = length (nub (filter even xs))&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
numPares xs = length(group (sort (filter even xs)))&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
numPares xs = length(fst(partition even (nub xs)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=111</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=111"/>
		<updated>2021-09-29T17:32:28Z</updated>

		<summary type="html">&lt;p&gt;Josgarver4: &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_1.hs (24 de septiembre de 2021)&lt;br /&gt;
-- Definiciones por composición sobre números, listas y booleanos. &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;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- En esta relación se plantean ejercicios con definiciones de funciones &lt;br /&gt;
-- por composición sobre números, listas y booleanos.&lt;br /&gt;
-- &lt;br /&gt;
-- Para solucionar los ejercicios puede ser útil el manual de&lt;br /&gt;
-- funciones de Haskell que se encuentra en http://bit.ly/1uJZiqi y su&lt;br /&gt;
-- resumen en http://bit.ly/ZwSMHO&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función media3 tal que (media3 x y z) es&lt;br /&gt;
-- la media aritmética de los números x, y y z. Por ejemplo, &lt;br /&gt;
--    media3 1 3 8     ==  4.0&lt;br /&gt;
--    media3 (-1) 0 7  ==  2.0&lt;br /&gt;
--    media3 (-3) 0 3  ==  0.0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
media3 x y z = undefined&lt;br /&gt;
-- Miguel Ángel Martínez&lt;br /&gt;
media3 x y z = .sdfsdfadf&lt;br /&gt;
-- Manuel Alcaide García, Lucía Hernández, Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Irene Ortega Moncayo, Laura Arango, Ana Sosa Caballero, Adolfo Sagrera Vivancos, Pelayo INfante Pérez, Sara Cerro Torres, Virginia Sánchez, Carmen Blanco, José Manuel Garcia&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
-- Antonio López García, César Fornis Catalán&lt;br /&gt;
media3 x y z = (sum [x,y,z])/3&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función sumaMonedas tal que &lt;br /&gt;
-- (sumaMonedas a b c d e) es la suma de los euros correspondientes a &lt;br /&gt;
-- a monedas de 1 euro, b de 2 euros, c de 5 euros, d 10 euros y&lt;br /&gt;
-- e de 20 euros. Por ejemplo,&lt;br /&gt;
--    sumaMonedas 0 0 0 0 1  ==  20&lt;br /&gt;
--    sumaMonedas 0 0 8 0 3  == 100&lt;br /&gt;
--    sumaMonedas 1 1 1 1 1  ==  38&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaMonedas a b c d e = undefined&lt;br /&gt;
-- Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Lucía Hernández, Laura Arango, Ana Sosa Caballero, Sara Cerro Torres&lt;br /&gt;
sumamonedas a b c d e = a+b*2+c*5+d*10+e*20&lt;br /&gt;
-- Antonio López García, Irene Ortega, César Fornis Catalán, Virginia Sánchez&lt;br /&gt;
sumaMonedas a b c d e = sum [a, b*2, c*5, d*10, e*20]&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Lucía González, Pelayo Infante, Francisco José Espinosa, Carmen Blanco, José Manuel García&lt;br /&gt;
sumaMonedas a b c d e = a*1+b*2+c*5+d*10+e*20&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función volumenEsfera tal que &lt;br /&gt;
-- (volumenEsfera r) es el volumen de la esfera de radio r. Por ejemplo,&lt;br /&gt;
--    volumenEsfera 10  ==  4188.790204786391&lt;br /&gt;
-- Indicación: Usar la constante pi.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
volumenEsfera r = undefined &lt;br /&gt;
-- Adriana Gordillo Melero, Lucía Hernández, Nicolás Rodríguez Ruiz, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Pelayo Infante, Sara Cerro Torres, José Manuel García&lt;br /&gt;
 volumenEsfera r = (4/3)*pi*r^3&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Carmen Blanco&lt;br /&gt;
volumenEsfera r =(4/3)*(pi*r^3)&lt;br /&gt;
-- Irene Ortega&lt;br /&gt;
volumenEsfera r = pi*(r^3)*4/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
-- César Fornis Catalán, Virginia Sánchez&lt;br /&gt;
volumenEsfera r = (4*pi*r^3)/3&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir la función areaDeCoronaCircular tal que &lt;br /&gt;
-- (areaDeCoronaCircular r1 r2) es el área de una corona circular de&lt;br /&gt;
-- radio interior r1 y radio exterior r2. Por ejemplo,&lt;br /&gt;
--    areaDeCoronaCircular 1 2 == 9.42477796076938&lt;br /&gt;
--    areaDeCoronaCircular 2 5 == 65.97344572538566&lt;br /&gt;
--    areaDeCoronaCircular 3 5 == 50.26548245743669&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Adriana Gordillo Melero, Antonio López García, Lucía González, Nicolás Rodríguez Ruiz, Sara Cerro Torres&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*r2^2 - pi*r1^2&lt;br /&gt;
--Álvaro Cano, Ana Sosa Caballero, Irene Ortega, César Fornis Catalán, José Manuel García&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*(r2^2-r1^2)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
areaDeCoronaCircular r1 r2 = areaCirculo r2 - areaCirculo r1&lt;br /&gt;
                             where areaCirculo r = pi*r^2&lt;br /&gt;
--Adolfo Sagrera Vivancos, Pelayo INfante , Francisco José Espinosa&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*r2^2)-(pi*r1^2)&lt;br /&gt;
-- Carmen Blanco&lt;br /&gt;
-- Virginia Sánchez&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*(r2)^2) - (pi*(r1)^2)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir la función ultimaCifra tal que (ultimaCifra x)&lt;br /&gt;
-- es la última cifra del nímero x. Por ejemplo,&lt;br /&gt;
--    ultimaCifra 325  ==  5&lt;br /&gt;
-- Indicación: Usar la función rem&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Adriana Gordillo Melero, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Adolfo Sagrera Vivancos Francisco José Espinosa, Lucía González, Nicolás Rodríguez Ruiz, Irene Ortega, Carmen Blanco, César Fornis Catalán&lt;br /&gt;
ultimaCifra x = rem x 10&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6. Definir la función maxTres tal que (maxTres x y z) es&lt;br /&gt;
-- el máximo de x, y y z. Por ejemplo,&lt;br /&gt;
--    maxTres 6 2 4  ==  6&lt;br /&gt;
--    maxTres 6 7 4  ==  7&lt;br /&gt;
--    maxTres 6 7 9  ==  9&lt;br /&gt;
-- Indicación: Usar la función max.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adriana Gordillo, Irene Ortega, Nicolás Rodríguez Ruiz&lt;br /&gt;
maxTres x y z = max(max x y)(z)&lt;br /&gt;
-- Ana Sosa Caballero, Adolfo Sagrera Vivancos&lt;br /&gt;
maxTres x y z = max x t&lt;br /&gt;
                where t = max y z&lt;br /&gt;
&lt;br /&gt;
-- Antonio López García, Lucía González, Carmen Blanco&lt;br /&gt;
maxTres x y z = maximum [x,y,z]&lt;br /&gt;
--César Fornis Catalán, José Manuel García&lt;br /&gt;
maxTres x y z = max(max x y) z&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7. Definir la función rota1 tal que (rota1 xs) es la lista&lt;br /&gt;
-- obtenida poniendo el primer elemento de xs al final de la lista. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    rota1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Lucía Hernández, Laura Arango, Adriana Gordillo, Ana Sosa Caballero , Irene Ortega, Lucía González, Nicolás Rodríguez Ruiz, Carmen Blanco, Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
rota1 xs = tail xs ++ [head xs]&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
rota1 xs = drop 1 xs ++ take 1 xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir la función rota tal que (rota n xs) es la lista&lt;br /&gt;
-- obtenida poniendo los n primeros elementos de xs al final de la&lt;br /&gt;
-- lista. Por ejemplo, &lt;br /&gt;
--    rota 1 [3,2,5,7]  ==  [2,5,7,3]&lt;br /&gt;
--    rota 2 [3,2,5,7]  ==  [5,7,3,2]&lt;br /&gt;
--    rota 3 [3,2,5,7]  ==  [7,3,2,5]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Adriana Gordillo, Ana Sosa Caballero, Antonio López García, Irene Ortega, Lucía González, Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
rota n xs = drop n xs ++ take n xs&lt;br /&gt;
&lt;br /&gt;
-- Fernando Ruiz (mejora para conseguir rotar el vector un número mayor de veces que de elementos en el vector)&lt;br /&gt;
rota n xs = drop (mod n (length xs)) xs ++ take (mod n (length xs)) xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Definir la función rango tal que (rango xs) es la&lt;br /&gt;
-- lista formada por el menor y mayor elemento de xs.&lt;br /&gt;
--    rango [3,2,7,5]  ==  [2,7]&lt;br /&gt;
-- Indicación: Se pueden usar minimum y maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Laura Arango, Irene Ortega, Lucía González, Adolfo Sagrera Vivancos, José Manuel García&lt;br /&gt;
rango xs = [minimum xs] ++ [maximum xs]&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García&lt;br /&gt;
rango xs = [minimum xs, maximum xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10. Definir la función palindromo tal que (palindromo xs) se&lt;br /&gt;
-- verifica si xs es un palíndromo; es decir, es lo mismo leer xs de&lt;br /&gt;
-- izquierda a derecha que de derecha a izquierda. Por ejemplo,&lt;br /&gt;
--    palindromo [3,2,5,2,3]    ==  True&lt;br /&gt;
--    palindromo [3,2,5,6,2,3]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Álvaro Cano, José Manuel Sánchez Parra, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía Hernández, Manuel Alcaide, Lucía González , Irene Ortega, José Manuel García&lt;br /&gt;
palindromo xs = xs == reverse xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Definir la función interior tal que (interior xs) es la&lt;br /&gt;
-- lista obtenida eliminando los extremos de la lista xs. Por ejemplo,&lt;br /&gt;
--    interior [2,5,3,7,3]  ==  [5,3,7]&lt;br /&gt;
--    interior [2..7]       ==  [3,4,5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández, Ana Sosa Caballero, Lucía González&lt;br /&gt;
interior xs = tail (init xs)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
interior xs = drop 1 (init xs)&lt;br /&gt;
--Fernando Ruiz, Antonio López García, Irene Ortega&lt;br /&gt;
interior xs = init (tail xs)&lt;br /&gt;
--Manuel Alcaide García&lt;br /&gt;
interior xs = init (drop 1 xs)&lt;br /&gt;
-José Manuel García&lt;br /&gt;
interior xs = reverse (take ((length js)-1) js)&lt;br /&gt;
         where js = reverse (take ((length xs)-1) xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función finales tal que (finales n xs) es la&lt;br /&gt;
-- lista formada por los n finales elementos de xs. Por ejemplo,&lt;br /&gt;
--    finales 3 [2,5,4,7,9,6]  ==  [7,9,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Álvaro Cano, Lucía González&lt;br /&gt;
finales n xs = drop n xs&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
finales n xs = reverse (take n (reverse xs))&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero&lt;br /&gt;
finales n xs = drop m xs&lt;br /&gt;
               where m = length xs - n&lt;br /&gt;
-- Antonio López García, Fernando Ruiz Mazo, Pelayo Infante, Manuel Alcaide García, Irene Ortega&lt;br /&gt;
finales n xs = drop (length xs - n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. Definir la función segmento tal que (segmento m n xs) es&lt;br /&gt;
-- la lista de los elementos de xs comprendidos entre las posiciones m y&lt;br /&gt;
-- n. Por ejemplo,&lt;br /&gt;
--    segmento 3 4 [3,4,1,2,7,9,0]  ==  [1,2]&lt;br /&gt;
--    segmento 3 5 [3,4,1,2,7,9,0]  ==  [1,2,7]&lt;br /&gt;
--    segmento 5 3 [3,4,1,2,7,9,0]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango&lt;br /&gt;
segmento m n xs = drop (m-1) (reverse (drop a ys))&lt;br /&gt;
                  where a  = length xs - n&lt;br /&gt;
                        ys = reverse XS&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García, Lucía González&lt;br /&gt;
segmento m n xs = drop (m-1) (take n xs)&lt;br /&gt;
-- Fernando Ruiz &lt;br /&gt;
segmento m n xs = reverse (drop ((length xs)-n+m-2)(reverse (drop (m-1) xs)))&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
segmento m n xs = take (n-m+1)(drop(m-1) xs)&lt;br /&gt;
--Manuel Alcaide García, Irene Ortega&lt;br /&gt;
segmento m n xs = take (n-(m-1)) (drop (m-1) xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14. Definir la función extremos tal que (extremos n xs) es&lt;br /&gt;
-- la lista formada por los n primeros elementos de xs y los n finales&lt;br /&gt;
-- elementos de xs. Por ejemplo, &lt;br /&gt;
--    extremos 3 [2,6,7,1,2,4,5,8,9,2,3]  ==  [2,6,7,9,2,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango&lt;br /&gt;
extremos n xs = take n xs ++ finales n XS&lt;br /&gt;
-- Ana Sosa Caballero, Lucía Hernández, Fernando Ruiz&lt;br /&gt;
extremos n xs = take n xs ++ reverse (take n (reverse xs))&lt;br /&gt;
-- Irene Ortega&lt;br /&gt;
extremos n xs = take n xs  ++  drop (length xs-n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15. Definir la función mediano tal que (mediano x y z) es el&lt;br /&gt;
-- número mediano de los tres números x, y y z. Por ejemplo,&lt;br /&gt;
--    mediano 3 2 5  ==  3&lt;br /&gt;
--    mediano 2 4 5  ==  4&lt;br /&gt;
--    mediano 2 6 5  ==  5&lt;br /&gt;
--    mediano 2 6 6  ==  6&lt;br /&gt;
-- Indicación: Usar maximum y minimum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango&lt;br /&gt;
 mediano x y z = max x (min y z) (Contraejemplo : mediano 8 10 3)&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
mediano x y z = minimum [maximum [x,y], z] (Contraejemplo : mediano 8 10 3)&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
mediano x y z = maximum [minimum [x,y], minimum[x,z], minimum[y,z]]&lt;br /&gt;
-- Fernando Ruiz Mazo, Irene Ortega&lt;br /&gt;
mediano x y z = minimum ([maximum [x,y]] ++ [maximum [y,z]] ++ [maximum [x,z]])&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 16. Definir la función tresIguales tal que &lt;br /&gt;
-- (tresIguales x y z) se verifica si los elementos x, y y z son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    tresIguales 4 4 4  ==  True&lt;br /&gt;
--    tresIguales 4 3 4  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Lucía Hernández, Irene Ortega&lt;br /&gt;
tresIguales x y z = x==y &amp;amp;&amp;amp; x==z&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 17. Definir la función tresDiferentes tal que &lt;br /&gt;
-- (tresDiferentes x y z) se verifica si los elementos x, y y z son&lt;br /&gt;
-- distintos. Por ejemplo, &lt;br /&gt;
--    tresDiferentes 3 5 2  ==  True&lt;br /&gt;
--    tresDiferentes 3 5 3  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Lucía Hernández&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; x/=z&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
tresDiferentes x y z = and [x/=y, y/=z, x/=z]&lt;br /&gt;
--Irene Ortega&lt;br /&gt;
tresDiferentes x y z = x/=y &amp;amp;&amp;amp; x/=z &amp;amp;&amp;amp; y/=x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 18. Definir la función cuatroIguales tal que &lt;br /&gt;
-- (cuatroIguales x y z u) se verifica si los elementos x, y, z y u son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    cuatroIguales 5 5 5 5   ==  True&lt;br /&gt;
--    cuatroIguales 5 5 4 5   ==  False&lt;br /&gt;
-- Indicación: Usar la función tresIguales.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Irene Ortega&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z == True &amp;amp;&amp;amp; x==u&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z &amp;amp;&amp;amp; x==u&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicios para trabajar con Data.List. Ver:&lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m-19/doc/Funciones_basicas.html&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19. Definir la función unicos, tal que (unicos xs)&lt;br /&gt;
-- devuelva la cantidad de elementos únicos que hay en la lista xs.&lt;br /&gt;
-- Por ejemplo, &lt;br /&gt;
--    unicos [1,4,8,2,1,4,6,1]  == 5 &lt;br /&gt;
--    unicos [10,9,8,10,5,10]  == 4&lt;br /&gt;
--    unicos [10,9,8]  == 3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Lucía Hernández&lt;br /&gt;
unicos xs = length (nub xs)&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
unicos xs = length(group(sort xs))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 20. Definir la función segundoMinimo, tal que (segundoMinimo xs)&lt;br /&gt;
-- devuelve el segundo elemento más pequeńo de la lista xs, obviando &lt;br /&gt;
-- repeticiones. Por ejemplo, &lt;br /&gt;
--    segundoMinimo [6,9,2,4]  ==  4&lt;br /&gt;
--    segundoMinimo [0.5,1.2,0.5,4.4,0.5]  ==  1.2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango&lt;br /&gt;
segundoMinimo xs = sort (nub xs) !! 1&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
segundoMinimo xs = minimum (delete(minimum (xs))(nub xs))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 21. Definir la función kMaximo, tal que (kMaximo n xs) &lt;br /&gt;
-- devuelve el k-máximo elemento de xs (es decir, el que está en la&lt;br /&gt;
-- posición k de valores más altos), obviando repeticiones. Por ejemplo, &lt;br /&gt;
--    kMaximo 2 [6,9,2,4]  == 6&lt;br /&gt;
--    kMaximo 3 [10,9,8,10,5]  == 8&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero&lt;br /&gt;
kMaximo k xs = reverse (sort (nub xs)) !! (k-1)&lt;br /&gt;
--José Manuel Sánchez Parra&lt;br /&gt;
kMaximo k xs = maximum(take k xs)&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
kMaximo k xs = head(drop(k-1) (reverse(sort (nub xs))))&lt;br /&gt;
--Antonio Medinilla Garófano&lt;br /&gt;
quitarMaximo xs = delete (maximum xs) xs&lt;br /&gt;
kMaximo k xs = maximum ((iterate quitarMaximo (nub xs)) !! (k-1))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22. Definir la función numPermut, tal que (numPermut xs) &lt;br /&gt;
-- devuelve el número de permutaciones sin repetición posibles con los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo, &lt;br /&gt;
--    numPermut [6,2,4]  == 6&lt;br /&gt;
--    numPermut [10,8,10,5]  == 24&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero, Lucía Hernández, José Manuel Sánchez Parra&lt;br /&gt;
numPermut xs = length (permutations xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 23 Definir la función numPares, tal que (numPares xs)&lt;br /&gt;
-- devuelva cuantos números pares en total (sin repeticiones) aparecen&lt;br /&gt;
-- en la lista xs. Por ejemplo, &lt;br /&gt;
--    numPares [1,4,8,2,1,4,6,1]  == 4&lt;br /&gt;
--    numPares [10,9,8,10,5,10]  == 2&lt;br /&gt;
--    numPares [10,9,8]  == 2&lt;br /&gt;
-- Indicación: puede ser útil la función partitions&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, José Manuel Sánchez Parra&lt;br /&gt;
numPares xs = length (nub (filter even xs))&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
numPares xs = length(group (sort (filter even xs)))&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
numPares xs = length(fst(partition even (nub xs)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Josgarver4</name></author>
	</entry>
</feed>