<?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=Elsdomgon</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=Elsdomgon"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php/Especial:Contribuciones/Elsdomgon"/>
	<updated>2026-07-18T04:52:39Z</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_12&amp;diff=570</id>
		<title>Relación 12</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_12&amp;diff=570"/>
		<updated>2021-12-26T16:47:20Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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 12 (7 de enero de 2022)&lt;br /&gt;
-- Tipos de datos algebraicos: Árboles binarios.&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 árboles binarios&lt;br /&gt;
-- definidos como tipos de datos algebraicos.&lt;br /&gt;
-- &lt;br /&gt;
-- Los ejercicios corresponden al tema 9 que se encuentra en &lt;br /&gt;
--    http://www.cs.us.es/cursos/i1m/temas/tema-9.html&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;
import Control.Monad&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Nota. En los siguientes ejercicios se trabajará con los árboles&lt;br /&gt;
-- binarios definidos como sigue &lt;br /&gt;
--    data Arbol a = H a&lt;br /&gt;
--                 | N a (Arbol a) (Arbol 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;
--      3     7&lt;br /&gt;
--     / \  &lt;br /&gt;
--    2   4 &lt;br /&gt;
-- se representa por&lt;br /&gt;
--    N 9 (N 3 (H 2) (H 4)) (H 7) &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
data Arbol a = H a&lt;br /&gt;
             | N a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Definir la función&lt;br /&gt;
--    nHojas :: Arbol 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;
--    nHojas (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
nHojas :: Arbol a -&amp;gt; Int&lt;br /&gt;
nHojas (H _) = 1&lt;br /&gt;
nHojas (N _ i d) = nHojas i + nHojas d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la función&lt;br /&gt;
--    nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
-- tal que (nNodos x) es el número de nodos del árbol x. Por ejemplo,&lt;br /&gt;
--    nNodos (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos (H _) = 0&lt;br /&gt;
nNodos (N _ i d) = 1 + nNodos i + nNodos d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Comprobar con QuickCheck que en todo árbol binario el&lt;br /&gt;
-- número de sus hojas es igual al número de sus nodos más uno.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nHojas :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nHojas x = nNodos x + 1 == nHojas x&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_nHojas&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir la función&lt;br /&gt;
--    profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
-- tal que (profundidad x) es la profundidad del árbol x. Por ejemplo,&lt;br /&gt;
--    profundidad (N 9 (N 3 (H 2) (H 4)) (H 7))              ==  2&lt;br /&gt;
--    profundidad (N 9 (N 3 (H 2) (N 1 (H 4) (H 5))) (H 7))  ==  3&lt;br /&gt;
--    profundidad (N 4 (N 5 (H 4) (H 2)) (N 3 (H 7) (H 4)))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad (H _)     = 0&lt;br /&gt;
profundidad (N _ i d) = 1 + max (profundidad i) (profundidad d)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Comprobar con QuickCheck que para todo árbol biario&lt;br /&gt;
-- x, se tiene que&lt;br /&gt;
--    nNodos x &amp;lt;= 2^(profundidad x) - 1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodosProfundidad :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodosProfundidad x = nNodos x &amp;lt;= 2^(profundidad x) - 1&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_nNodosProfundidad&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (preorden x) es la lista correspondiente al recorrido&lt;br /&gt;
-- preorden del árbol x; es decir, primero visita la raíz del árbol, a&lt;br /&gt;
-- continuación recorre el subárbol izquierdo y, finalmente, recorre el&lt;br /&gt;
-- subárbol derecho. Por ejemplo,&lt;br /&gt;
--    preorden (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden (H a) = [a]&lt;br /&gt;
preorden (N a i d) = [a] ++ preorden i ++ preorden d&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickCheck que la longitud de la lista&lt;br /&gt;
-- obtenida recorriendo un árbol en sentido preorden es igual al número&lt;br /&gt;
-- de nodos del árbol más el número de hojas.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_length_preorden :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_length_preorden x = nHojas x + nNodos x == length (preorden x)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_length_preorden&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Definir la función&lt;br /&gt;
--    postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (postorden x) es la lista correspondiente al recorrido&lt;br /&gt;
-- postorden del árbol x; es decir, primero recorre el subárbol&lt;br /&gt;
-- izquierdo, a continuación el subárbol derecho y, finalmente, la raíz&lt;br /&gt;
-- del árbol. Por ejemplo,&lt;br /&gt;
--    postorden (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden (H a) = [a]&lt;br /&gt;
postorden (N a i d) = postorden i ++ postorden d ++ [a]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.4. Definir, usando un acumulador, la función&lt;br /&gt;
--    preordenIt :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (preordenIt x) es la lista correspondiente al recorrido&lt;br /&gt;
-- preorden del árbol x; es decir, primero visita la raíz del árbol, a&lt;br /&gt;
-- continuación recorre el subárbol izquierdo y, finalmente, recorre el&lt;br /&gt;
-- subárbol derecho. Por ejemplo,&lt;br /&gt;
--    preordenIt (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [9,3,2,4,7]&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: No usar (++) en la definición&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
preordenIt :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preordenIt x = aux x []&lt;br /&gt;
             where aux (H a) xs = a : xs&lt;br /&gt;
                   aux (N a i d) xs = a : aux i (aux d xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.5. Comprobar con QuickCheck que preordenIt es equivalente&lt;br /&gt;
-- a preorden. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_preordenIt :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_preordenIt x = preordenIt x == preorden x&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_preordenIt &lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. Definir la función&lt;br /&gt;
--    espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (espejo x) es la imagen especular del árbol x. Por ejemplo,&lt;br /&gt;
--    espejo (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (H 7) (N 3 (H 4) (H 2))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo (H a) = H a&lt;br /&gt;
espejo (N a i d) = N a (espejo d) (espejo i) &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Comprobar con QuickCheck que para todo árbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo x = espejo (espejo x) == x&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Comprobar con QuickCheck que para todo árbol binario&lt;br /&gt;
-- x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = postorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_reverse_preorden_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_reverse_preorden_espejo x = reverse (preorden (espejo x)) == postorden x&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Comprobar con QuickCheck que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_recorrido :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_recorrido x = postorden (espejo x) == reverse (preorden x)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_recorrido&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. La función take está definida por&lt;br /&gt;
--    take :: Int -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
--    take 0            = []&lt;br /&gt;
--    take (n+1) []     = []&lt;br /&gt;
--    take (n+1) (x:xs) = x : take n xs&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    takeArbol ::  Int -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (takeArbol n t) es el subárbol de t de profundidad n. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    takeArbol 0 (N 9 (N 3 (H 2) (H 4)) (H 7)) == H 9&lt;br /&gt;
--    takeArbol 1 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (H 3) (H 7)&lt;br /&gt;
--    takeArbol 2 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (N 3 (H 2) (H 4)) (H 7)&lt;br /&gt;
--    takeArbol 3 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (N 3 (H 2) (H 4)) (H 7)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
takeArbol :: Int -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
takeArbol _ (H a) = H a&lt;br /&gt;
takeArbol 0 (N a i d) = H a&lt;br /&gt;
takeArbol n (N a i d) = N a (takeArbol (n-1) i) (takeArbol (n-1) d)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Comprobar con QuickCheck que la profundidad de &lt;br /&gt;
-- (takeArbol n x) es menor o igual que n, para todo número natural n y&lt;br /&gt;
-- todo árbol x. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_takeArbol:: Int -&amp;gt; Arbol Int -&amp;gt; Property&lt;br /&gt;
prop_takeArbol n x = n &amp;gt;= 0 ==&amp;gt; profundidad (takeArbol n x) &amp;lt;= n &lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_takeArbol&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. La función&lt;br /&gt;
--    repeat :: a -&amp;gt; [a]&lt;br /&gt;
-- está definida de forma que (repeat x) es la lista formada por&lt;br /&gt;
-- infinitos elementos x. Por ejemplo,&lt;br /&gt;
--    repeat 3  ==  [3,3,3,3,3,3,3,3,3,3,3,3,3,...&lt;br /&gt;
-- La definición de repeat es&lt;br /&gt;
--    repeat x = xs where xs = x:xs&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    repeatArbol :: a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (repeatArbol x) es es árbol con infinitos nodos x. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    takeArbol 0 (repeatArbol 3) == H 3&lt;br /&gt;
--    takeArbol 1 (repeatArbol 3) == N 3 (H 3) (H 3)&lt;br /&gt;
--    takeArbol 2 (repeatArbol 3) == N 3 (N 3 (H 3) (H 3)) (N 3 (H 3) (H 3))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
repeatArbol :: a -&amp;gt; Arbol a&lt;br /&gt;
repeatArbol x = N x id id&lt;br /&gt;
              where id = repeatArbol x&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función &lt;br /&gt;
--    replicate :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- está definida por &lt;br /&gt;
--    replicate n = take n . repeat&lt;br /&gt;
-- es tal que (replicate n x) es la lista de longitud n cuyos elementos&lt;br /&gt;
-- son x. Por ejemplo,&lt;br /&gt;
--    replicate 3 5  ==  [5,5,5]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    replicateArbol :: Int -&amp;gt; a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (replicate n x) es el árbol de profundidad n cuyos nodos son&lt;br /&gt;
-- x. Por ejemplo,&lt;br /&gt;
--    replicateArbol 0 5  ==  H 5&lt;br /&gt;
--    replicateArbol 1 5  ==  N 5 (H 5) (H 5)&lt;br /&gt;
--    replicateArbol 2 5  ==  N 5 (N 5 (H 5) (H 5)) (N 5 (H 5) (H 5))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
replicateArbol :: Int -&amp;gt; a -&amp;gt; Arbol a&lt;br /&gt;
replicateArbol 0 x = H x&lt;br /&gt;
replicateArbol n x = N x id id&lt;br /&gt;
                   where id = replicateArbol (n-1) x &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que el número de hojas de &lt;br /&gt;
-- (replicateArbol n x) es 2^n, para todo número natural n&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_replicateArbol&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_replicateArbol :: Int -&amp;gt; Int -&amp;gt; Property&lt;br /&gt;
prop_replicateArbol n x = n &amp;gt;= 0 ==&amp;gt; nHojas (replicateArbol n x) == 2^n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheckWith (stdArgs {maxSize=7}) prop_replicateArbol&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir la función&lt;br /&gt;
--    mapArbol :: (a -&amp;gt; a) -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (mapArbol f x) es el árbol obtenido aplicándole a cada nodo de&lt;br /&gt;
-- x la función f. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; mapArbol (*2) (N 9 (N 3 (H 2) (H 4)) (H 7)) &lt;br /&gt;
--    N 18 (N 6 (H 4) (H 8)) (H 14)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
mapArbol :: (a -&amp;gt; a) -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
mapArbol f (H a) = H (f a)&lt;br /&gt;
mapArbol f (N a i d) = N (f a) (mapArbol f i) (mapArbol f d)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que &lt;br /&gt;
--    (mapArbol (1+)) . espejo = espejo . (mapArbol (1+))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_mapArbol_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_mapArbol_espejo x = (mapArbol (1+) . espejo) x == (espejo . mapArbol (1+)) x&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_mapArbol_espejo&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que&lt;br /&gt;
--    (map (1+)) . preorden = preorden . (mapArbol (1+)) &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_map_preorden :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_map_preorden x = (map (1+) . preorden) x == (preorden . mapArbol (1+)) x&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_map_preorden&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Nota. Para comprobar propiedades de árboles con QuickCheck se&lt;br /&gt;
-- utilizará el siguiente generador.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
instance Arbitrary a =&amp;gt; Arbitrary (Arbol a) where&lt;br /&gt;
  arbitrary = sized arbol&lt;br /&gt;
    where&lt;br /&gt;
      arbol 0       = liftM H arbitrary &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [liftM H arbitrary,&lt;br /&gt;
                             liftM3 N arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
      arbol _       = error &amp;quot;Imposible&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_11&amp;diff=550</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=550"/>
		<updated>2021-12-16T19:34:38Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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&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&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&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&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;
-- ---------------------------------------------------------------------&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_11&amp;diff=549</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=549"/>
		<updated>2021-12-16T19:27:36Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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;
ecoR :: String -&amp;gt; String&lt;br /&gt;
ecoR xs = undefined&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&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&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&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&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;
-- ---------------------------------------------------------------------&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_11&amp;diff=548</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=548"/>
		<updated>2021-12-16T19:14:57Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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;
ecoR :: String -&amp;gt; String&lt;br /&gt;
ecoR xs = undefined&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&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&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&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&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;
-- ---------------------------------------------------------------------&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;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = undefined&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;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_11&amp;diff=547</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=547"/>
		<updated>2021-12-16T19:11:37Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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;
ecoR :: String -&amp;gt; String&lt;br /&gt;
ecoR xs = undefined&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&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&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&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&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;
-- ---------------------------------------------------------------------&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;
factoriales1 :: [Integer]&lt;br /&gt;
factoriales1 = undefined&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;
factoriales2 :: [Integer]&lt;br /&gt;
factoriales2 = undefined&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;
factoriales3 :: [Integer]&lt;br /&gt;
factoriales3 = undefined&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;
factoriales4 :: [Integer]&lt;br /&gt;
factoriales4 = undefined&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;
factoriales5 :: [Integer]&lt;br /&gt;
factoriales5 = undefined&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;
fib :: Integer -&amp;gt; Integer&lt;br /&gt;
fib = undefined&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;
fibs1 :: [Integer]&lt;br /&gt;
fibs1 = undefined&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;
fibs3 :: [Integer]&lt;br /&gt;
fibs3 = undefined&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;
fibs4 :: [Integer]&lt;br /&gt;
fibs4 = undefined&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=485</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=485"/>
		<updated>2021-11-30T18:05:07Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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;
-- ----------------------------------------------------------------------------&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;
&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=482</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=482"/>
		<updated>2021-11-29T19:56:57Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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 = 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;
&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;
&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=481</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=481"/>
		<updated>2021-11-29T18:55:00Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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 = 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;
&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=479</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=479"/>
		<updated>2021-11-29T18:34:10Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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 = 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;
-- ----------------------------------------------------------------------------&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=473</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=473"/>
		<updated>2021-11-27T12:46:07Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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;
-- ----------------------------------------------------------------------------&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_9&amp;diff=472</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=472"/>
		<updated>2021-11-27T12:28:46Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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;
&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8&amp;diff=471</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=471"/>
		<updated>2021-11-27T12:26:33Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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;
-- Elsa Domínguez&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&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;
-- 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&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&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&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&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;
-- ---------------------------------------------------------------------&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_8&amp;diff=462</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=462"/>
		<updated>2021-11-22T12:19:46Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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;
&lt;br /&gt;
segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos = undefined&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&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;
&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&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;
&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;
agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
agrupa = undefined&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&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&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&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_7&amp;diff=428</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=428"/>
		<updated>2021-11-17T18:13:03Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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, Elsa Domínguez&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;
-- 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;
-- Elsa Domínguez&lt;br /&gt;
subconjuntoR&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
subconjuntoR&amp;#039; [] _ = True&lt;br /&gt;
subconjuntoR&amp;#039; (x:xs) ys = x `elem` ys &amp;amp;&amp;amp; (subconjuntoR xs ys)&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, Elsa Domínguez&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, Elsa Domínguez&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;
-- Elsa Domínguez&lt;br /&gt;
union&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
union&amp;#039; xs ys = [x | x &amp;lt;- xs, x `notElem` ys] ++ ys &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir, por recursió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;
-- Elsa Domínguez&lt;br /&gt;
unionR1 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
unionR1 xs ys = nub (unionR&amp;#039; xs ys)&lt;br /&gt;
unionR&amp;#039; [] ys = ys&lt;br /&gt;
unionR&amp;#039; (x:xs) (ys) = unionR xs (x: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;
-- Elsa Domínguez&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 = iguales (union&amp;#039; xs ys) (unionR xs ys)&lt;br /&gt;
-- La comprobación es quickCheck prop_union&lt;br /&gt;
-- +++ OK, passed 100 tests.&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;
-- Elsa Domínguez&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 = iguales (union&amp;#039; xs ys) (union&amp;#039; ys xs)&lt;br /&gt;
-- La comprobación es quickCheck prop_union_conmutativa&lt;br /&gt;
-- +++ OK, passed 100 tests.&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, Elsa Domínguez&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;
-- Elsa Domínguez&lt;br /&gt;
interseccionR&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccionR&amp;#039; [] _ = []&lt;br /&gt;
interseccionR&amp;#039; (x:xs) ys | x `elem` 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, Elsa Domínguez&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 quickCheck prop_interseccion&lt;br /&gt;
-- +++ OK, passed 100 tests.&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;
-- Elsa Domínguez&lt;br /&gt;
prop_union_interseccion :: [Int] -&amp;gt; [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_union_interseccion a b c = union&amp;#039; a (interseccion b c) == interseccion (union&amp;#039; a b) c&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_union_interseccion&lt;br /&gt;
-- *** Failed! Falsifiable (after 3 tests and 3 shrinks):&lt;br /&gt;
-- [0]&lt;br /&gt;
-- []&lt;br /&gt;
-- []&lt;br /&gt;
-- λ&amp;gt; union&amp;#039; [0] (interseccion [] [])&lt;br /&gt;
-- [0]&lt;br /&gt;
-- λ&amp;gt; interseccion (union&amp;#039; [0] []) []&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, Elsa Domínguez&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, Elsa Domínguez&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, Elsa Domínguez&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 quickCheck prop_diferencia&lt;br /&gt;
-- +++ OK, passed 100 tests.&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, Elsa Domínguez&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;
-- Ejercicio 9. Comprobar con QuickCheck si se cumple la siguiente&lt;br /&gt;
-- propiedad: A \ B ⊂ A&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Elsa Domínguez&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 a b = subconjunto (diferencia a b) a&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_diferencia_subconjunto&lt;br /&gt;
-- +++ OK, passed 100 tests.&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;
-- Elsa Domínguez&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 a b = interseccion (diferencia a b) b == []&lt;br /&gt;
                &lt;br /&gt;
-- La comprobación es quickCheck prop_diferencia_interseccion&lt;br /&gt;
-- +++ OK, passed 100 tests.&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;
-- Elsa Domínguez&lt;br /&gt;
producto&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [(a,a)]&lt;br /&gt;
producto&amp;#039; xs ys= [(x,y) | x &amp;lt;- xs, y &amp;lt;- 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;
--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;
--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;
-- Elsa Domínguez &lt;br /&gt;
productoR2 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [(a,a)]&lt;br /&gt;
productoR2 xs ys = nub (productoR2&amp;#039; xs ys)&lt;br /&gt;
productoR2&amp;#039; _ [] = []&lt;br /&gt;
productoR2&amp;#039; [] _ = []&lt;br /&gt;
productoR2&amp;#039; (x:xs) (y:ys) = (x,y):producto (x:xs) ys ++ (producto xs (y:ys))&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;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_producto :: [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_producto xs ys = iguales (producto xs ys) (productoR xs ys)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_producto&lt;br /&gt;
-- +++ OK, passed 100 tests.&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;
-- Elsa Domínguez&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 xs ys = length (producto xs ys) == length xs * length ys&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_elementos_producto&lt;br /&gt;
-- +++ OK, passed 100 tests.&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;
--Fernando Ruiz Mazo, Elsa Domínguez&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;
-- Elsa Domínguez&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_subconjuntos :: [Int] -&amp;gt; Bool&lt;br /&gt;
prop_subconjuntos xs = length (subconjuntos xs) == 2^(length xs)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheckWith (stdArgs {maxSize=7}) prop_subconjuntos&lt;br /&gt;
-- +++ OK, passed 100 tests.&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;
--Sara Cerro&lt;br /&gt;
numeroBloquesR :: Integer -&amp;gt; Integer    &lt;br /&gt;
numeroBloquesR 1 = 2&lt;br /&gt;
numeroBloquesR n = 2*n + numeroBloquesR (n-1) &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;
--Sara Cerro&lt;br /&gt;
numeroBloquesC :: Integer -&amp;gt; Integer&lt;br /&gt;
numeroBloquesC n = sum [ 2*x | x &amp;lt;- xs]&lt;br /&gt;
          where xs = [1..n]&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_7&amp;diff=426</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=426"/>
		<updated>2021-11-17T17:57:00Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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, Elsa Domínguez&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;
-- 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;
-- Elsa Domínguez&lt;br /&gt;
subconjuntoR&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
subconjuntoR&amp;#039; [] _ = True&lt;br /&gt;
subconjuntoR&amp;#039; (x:xs) ys = x `elem` ys &amp;amp;&amp;amp; (subconjuntoR xs ys)&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, Elsa Domínguez&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, Elsa Domínguez&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;
-- Elsa Domínguez&lt;br /&gt;
union&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
union&amp;#039; xs ys = [x | x &amp;lt;- xs, x `notElem` ys] ++ ys &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Definir, por recursió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;
-- Elsa Domínguez&lt;br /&gt;
unionR1 :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
unionR1 xs ys = nub (unionR&amp;#039; xs ys)&lt;br /&gt;
unionR&amp;#039; [] ys = ys&lt;br /&gt;
unionR&amp;#039; (x:xs) (ys) = unionR xs (x: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;
-- Elsa Domínguez&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 = iguales (union&amp;#039; xs ys) (unionR xs ys)&lt;br /&gt;
-- La comprobación es quickCheck prop_union&lt;br /&gt;
-- +++ OK, passed 100 tests.&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;
-- Elsa Domínguez&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 = iguales (union&amp;#039; xs ys) (union&amp;#039; ys xs)&lt;br /&gt;
-- La comprobación es quickCheck prop_union_conmutativa&lt;br /&gt;
-- +++ OK, passed 100 tests.&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, Elsa Domínguez&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;
-- Elsa Domínguez&lt;br /&gt;
interseccionR&amp;#039; :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccionR&amp;#039; [] _ = []&lt;br /&gt;
interseccionR&amp;#039; (x:xs) ys | x `elem` 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, Elsa Domínguez&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 quickCheck prop_interseccion&lt;br /&gt;
-- +++ OK, passed 100 tests.&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;
-- Elsa Domínguez&lt;br /&gt;
prop_union_interseccion :: [Int] -&amp;gt; [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_union_interseccion a b c = union&amp;#039; a (interseccion b c) == interseccion (union&amp;#039; a b) c&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_union_interseccion&lt;br /&gt;
-- *** Failed! Falsifiable (after 3 tests and 3 shrinks):&lt;br /&gt;
-- [0]&lt;br /&gt;
-- []&lt;br /&gt;
-- []&lt;br /&gt;
-- λ&amp;gt; union&amp;#039; [0] (interseccion [] [])&lt;br /&gt;
-- [0]&lt;br /&gt;
-- λ&amp;gt; interseccion (union&amp;#039; [0] []) []&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, Elsa Domínguez&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, Elsa Domínguez&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, Elsa Domínguez&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 quickCheck prop_diferencia&lt;br /&gt;
-- +++ OK, passed 100 tests.&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, Elsa Domínguez&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;
-- 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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_6&amp;diff=391</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=391"/>
		<updated>2021-11-06T14:54:55Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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 &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&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&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;
&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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 &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;
-- ---------------------------------------------------------------------&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&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;
&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&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;
&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 &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&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_6&amp;diff=390</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=390"/>
		<updated>2021-11-06T13:56:20Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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 &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&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&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;
&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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;
&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&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;
-- ---------------------------------------------------------------------&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&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 &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;
-- ---------------------------------------------------------------------&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&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;
&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&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;
&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&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&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_6&amp;diff=389</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=389"/>
		<updated>2021-11-06T13:41:57Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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 &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&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&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;
&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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;
&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&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;
-- ---------------------------------------------------------------------&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&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 &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;
-- ---------------------------------------------------------------------&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&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;
&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&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;
&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&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&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;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_6&amp;diff=388</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=388"/>
		<updated>2021-11-06T12:29:42Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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 &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&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&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;
&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&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&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&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&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&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&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&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&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&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&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;
-- ---------------------------------------------------------------------&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&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&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&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&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;
&lt;br /&gt;
-- Lucía Hernández&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&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&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;
&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;
&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&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;
&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;
-- ---------------------------------------------------------------------&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&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;
&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&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;
&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&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;
&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&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&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;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_4&amp;diff=359</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=359"/>
		<updated>2021-10-30T12:46:22Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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, Elsa Domínguez&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;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
divisores&amp;#039; n = [x | x &amp;lt;- [1..n], rem n x == 0]&lt;br /&gt;
divisoresPrimos&amp;#039; :: Int -&amp;gt; [Int]&lt;br /&gt;
divisoresPrimos&amp;#039; y = [ m | m &amp;lt;- [2..y], divisores&amp;#039; m == [1,m], rem y m == 0]  -- Prof: debería usar divisores&amp;#039;?&lt;br /&gt;
-- Nicolás Rodríguez Ruiz&lt;br /&gt;
divisoresPrimos x = [a | a &amp;lt;- (primos x), x `mod`a == 0]&lt;br /&gt;
                where primos n = [a | a &amp;lt;- [1..n], divisores a == [1,a]]&lt;br /&gt;
                      divisores n = [ a | a &amp;lt;- [1..n], n `mod` a == 0]&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, Elsa Domínguez&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;
-- Nicolás Rodríguez Ruiz&lt;br /&gt;
libreDeCuadrados n =  [ a | a &amp;lt;- divisores n, (sq a) == (ndsq a) ] == [] -- Si el conjunto esta vacio =&amp;gt; n no es producto de cuadrados&lt;br /&gt;
		           where divisores n = [ a | a &amp;lt;- [2..n-1], n `mod` a == 0]&lt;br /&gt;
		                 sq a = sqrt (fromIntegral a) -- Raiz con decimales&lt;br /&gt;
		                 ndsq a = fromIntegral(truncate (sq a)) -- Raiz sin decimales&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, Elsa Domínguez&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;
amigos1 :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
amigos1 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;
-- Prof: En clase hemos visto&lt;br /&gt;
divisoresP :: Int -&amp;gt; [Int]&lt;br /&gt;
divisoresP n = [x | x&amp;lt;-[1..n-1], rem n x == 0]&lt;br /&gt;
&lt;br /&gt;
amigos2 :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
amigos2 a b = sumaDivisores a == b &amp;amp;&amp;amp; sumaDivisores b == a &amp;amp;&amp;amp; a/=b&lt;br /&gt;
         where sumaDivisores n  = sum(divisoresP n)&lt;br /&gt;
&lt;br /&gt;
-- Prof: he movido aquí esta solución que estaba en el primer ejercicio&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;
amigos3 :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
amigos3 a b = if a == b then False else sumad a == sumad b&lt;br /&gt;
&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, Adolfo Sagrera Vivancos, Elsa Domínguez&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;
-- Prof: Otra solución sin usar floor ni sqrt (aunque más lenta)&lt;br /&gt;
especial2 :: Int -&amp;gt; Bool&lt;br /&gt;
especial2 n = elem s [  x^2 | x &amp;lt;-[1 .. s]]&lt;br /&gt;
  where s = sumaDivisoresCuadrados n&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
especial3 = [ x | x&amp;lt;-[100..999], especial x]&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;
-- Lucía Hernández&lt;br /&gt;
multiplicidad :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
multiplicidad 1 _ = 1&lt;br /&gt;
multiplicidad x y = last  [ s | s&amp;lt;-[0..y], elem (x^s) (potencias x), elem (x^s)(divisores y)]&lt;br /&gt;
       where potencias n = [n^s | s&amp;lt;-[0..y]]&lt;br /&gt;
-- Prof: en esta solución se puede simplificar lo siguiente:&lt;br /&gt;
-- -  elem (x^s) (potencias x) no hace falta, ya que siempre se va a cumplir&lt;br /&gt;
-- -  elem (x^s)(divisores y) se puede simplificar a simplemente comprobar si x^s divide a y&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
multiplicidad1 :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
multiplicidad1 x y = if x == 1 then 1 else sum [1 | n &amp;lt;- [1..y], rem y (x^n) == 0]&lt;br /&gt;
&lt;br /&gt;
-- Nicolás Rodríguez Ruiz&lt;br /&gt;
multiplicidad a b = sum [1 | x &amp;lt;- [1..length(divisores b)], a^x `elem` (divisores b)]&lt;br /&gt;
  where divisores n = [ a | a &amp;lt;- [1..n], n `mod` a == 0]&lt;br /&gt;
-- Prof: en esta solución se puede simplificar lo siguiente:&lt;br /&gt;
-- -   a^x `elem` (divisores b) se puede simplificar a simplemente comprobar si a^x divide a b&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;
--Nicolás Rodríguez Ruiz, Lucía Hernández, Elsa Domínguez&lt;br /&gt;
calificaciones :: [(String,[(String,Int)])] -&amp;gt; String -&amp;gt; [(String,Int)]&lt;br /&gt;
calificaciones t p = head[  ns | (nom, ns) &amp;lt;- t, nom == p ]&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;
-- Nicolás Rodríguez Ruiz, Lucía Hernández, Elsa Domínguez&lt;br /&gt;
todasAprobadas :: [(String,[(String,Int)])] -&amp;gt; String -&amp;gt; Bool&lt;br /&gt;
todasAprobadas t p = and[n&amp;gt;=5 | (_, n) &amp;lt;- (calificaciones t p)]&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;
-- Nicolás Rodríguez Ruiz, Lucía Hernández, Elsa Domínguez&lt;br /&gt;
aprobados :: [(String,[(String,Int)])] -&amp;gt; [String]&lt;br /&gt;
aprobados t = [nom | (nom, _) &amp;lt;- t, todasAprobadas t nom]&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;
-- Elsa Domínguez&lt;br /&gt;
angelini :: Integer -&amp;gt; Bool&lt;br /&gt;
angelini n = not (null (cifrasIguales n))&lt;br /&gt;
           where cifrasIguales n = [a | (a,b) &amp;lt;- ns, a == b]   -- Prof: se puede simplificar con la función elem&lt;br /&gt;
                 ns = [(a,b) | a &amp;lt;- cifras n, b &amp;lt;- cifras (2*n)]&lt;br /&gt;
&lt;br /&gt;
cifras :: Integer -&amp;gt; [Int]&lt;br /&gt;
cifras n = [read [x] | x &amp;lt;- show n]&lt;br /&gt;
&lt;br /&gt;
-- Nicolás Rodríguez Ruiz&lt;br /&gt;
angelini1 :: Integer -&amp;gt; Bool&lt;br /&gt;
angelini1 n = or[c `elem` (show (2*n)) | c &amp;lt;- (show n)]&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;
-- Lucía Hernández, Elsa Domínguez&lt;br /&gt;
repetir x n  = sum [x*10^i | i&amp;lt;-[0..n-1]] &lt;br /&gt;
&lt;br /&gt;
unitarios :: Int -&amp;gt; [Int]&lt;br /&gt;
unitarios x = [ (repetir x n) | n&amp;lt;- [1..]]&lt;br /&gt;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
unitarios x = [ sum[  x*(10^a) | a &amp;lt;- [0..n] ] | n &amp;lt;- [1..]]&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;
-- Lucía Hernández, Elsa Domínguez&lt;br /&gt;
multiplosUnitarios :: Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; [Int]&lt;br /&gt;
multiplosUnitarios x y n = take n ([a  | a&amp;lt;- unitarios y, mod a x == 0])&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;
--Nicolás Rodríguez Ruiz y Elsa Domínguez&lt;br /&gt;
masOcurrentes :: Eq a =&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
masOcurrentes xs = [ b | (a,b) &amp;lt;- (paresOrd xs), a ==( maximum (numVeces xs))]&lt;br /&gt;
  where paresOrd xs = zip (numVeces xs) xs&lt;br /&gt;
        numVeces xs = [veces x xs | x &amp;lt;- xs]&lt;br /&gt;
        veces n xs = sum[ 1 | x &amp;lt;- xs, x ==n]&lt;br /&gt;
&lt;br /&gt;
-- Fernando Ruiz &lt;br /&gt;
masOcurrentes&amp;#039; xs = [ a | a &amp;lt;- xs , ocurrencia a xs == maximum (ocurrencias xs) ]&lt;br /&gt;
&lt;br /&gt;
ocurrencias xs = [ ocurrencia a xs | a &amp;lt;- xs]&lt;br /&gt;
ocurrencia a xs = sum [ 1 | b &amp;lt;- xs, b == a]&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;
-- Elsa Domínguez&lt;br /&gt;
aproximaPi n = sqrt (6*sum [1/x^2 | x &amp;lt;- [1..n]])&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;
-- Lucía Hernández, Elsa Domínguez&lt;br /&gt;
deBaseABase10 :: Int -&amp;gt; [Int] -&amp;gt; Int&lt;br /&gt;
deBaseABase10 b xs = sum [i*( b^n)  | (i,n)&amp;lt;- zip  xs [0..length xs -1] ]&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;
-- Elsa Domínguez&lt;br /&gt;
conPos1 :: [a] -&amp;gt; [(a,Int)]&lt;br /&gt;
conPos1 xs = zip xs [0..length xs-1]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12.2. Definir la función&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;
-- Elsa Domínguez&lt;br /&gt;
pares :: [a] -&amp;gt; [a]&lt;br /&gt;
pares cs = [a | (a,b) &amp;lt;- conPos cs, even b]&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;
--Nicolás Rodríguez Ruiz y Elsa Domínguez&lt;br /&gt;
perpendiculares :: (Num a, Eq a) =&amp;gt; [a] -&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
perpendiculares xs yss = [ ys | ys &amp;lt;- yss, xs `productoEscalar` ys==0]&lt;br /&gt;
  where productoEscalar xs ys = sum [a*x | (a,x) &amp;lt;- zip xs ys]&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;
-- Elsa Domínguez&lt;br /&gt;
mayorSalto :: [Integer] -&amp;gt; Integer&lt;br /&gt;
mayorSalto xs = maximum [abs (a-b) | (a,b) &amp;lt;- zip xs (tail xs)]&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;
--Elsa Domínguez y Nicolás Rodríguez Ruiz&lt;br /&gt;
longCamino :: [(Float,Float)] -&amp;gt; Float&lt;br /&gt;
longCamino xs = sum [distancia a b | (a,b) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
  where distancia (a,b) (x,y) = sqrt((x-a)^2 + (y-b)^2)&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;
&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;
-- Elsa Domínguez&lt;br /&gt;
sumaEquidistantes :: Num a =&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
sumaEquidistantes xs = reverse (drop (div (length xs) 2) [a+b | (a,b) &amp;lt;- zip xs (reverse xs)])&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;
-- Lucía Hernández&lt;br /&gt;
distancia x y = abs(x-y)&lt;br /&gt;
cercanos :: [Int] -&amp;gt; [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
cercanos xs ys = [(x,y) | x&amp;lt;- xs, y&amp;lt;-ys, distancia x y == minimum [distancia x&amp;#039; y&amp;#039; | x&amp;#039;&amp;lt;- xs, y&amp;#039;&amp;lt;-ys]]&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
cercanos1 :: [Int] -&amp;gt; [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
cercanos1 xs ys = [(a,b) | a &amp;lt;- xs, b &amp;lt;- ys, abs (a-b) == minimum (distanciaPares xs ys)]&lt;br /&gt;
&lt;br /&gt;
distanciaPares xs ys = [abs (a-b) | a &amp;lt;- xs, b &amp;lt;- ys]&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;
-- Elsa Domínguez&lt;br /&gt;
esCuadratica :: [Int] -&amp;gt; Bool&lt;br /&gt;
esCuadratica xs = [abs (a-b) | (a,b) &amp;lt;- ys] == [x^2 | x &amp;lt;- [1..length (ys)]]&lt;br /&gt;
                where ys  = zip (tail xs) xs&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;
--Nicolás Rodríguez Ruiz y Elsa Domínguez&lt;br /&gt;
ultima, primera :: Int -&amp;gt; Int  &lt;br /&gt;
ultima n  = rem n 10&lt;br /&gt;
primera n =  fromEnum (head(show n)) - 48&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;
-- Elsa Domínguez y Nicolás Rodríguez Ruiz&lt;br /&gt;
encadenadoC :: [Int] -&amp;gt; Bool&lt;br /&gt;
encadenadoC xs = and [ ultima a == primera b | (a,b) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_4&amp;diff=339</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=339"/>
		<updated>2021-10-28T18:57:01Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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, Elsa Domínguez&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;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
divisores&amp;#039; n = [x | x &amp;lt;- [1..n], rem n x == 0]&lt;br /&gt;
divisoresPrimos&amp;#039; :: Int -&amp;gt; [Int]&lt;br /&gt;
divisoresPrimos&amp;#039; y = [ m | m &amp;lt;- [2..y], divisores m == [1,m], rem y m == 0]  -- Prof: debería usar divisores&amp;#039;?&lt;br /&gt;
-- Nicolás Rodríguez Ruiz&lt;br /&gt;
divisoresPrimos x = [a | a &amp;lt;- (primos x), x `mod`a == 0]&lt;br /&gt;
                where primos n = [a | a &amp;lt;- [1..n], divisores a == [1,a]]&lt;br /&gt;
                      divisores n = [ a | a &amp;lt;- [1..n], n `mod` a == 0]&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, Elsa Domínguez&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;
-- Nicolás Rodríguez Ruiz&lt;br /&gt;
libreDeCuadrados n =  [ a | a &amp;lt;- divisores n, (sq a) == (ndsq a) ] == [] -- Si el conjunto esta vacio =&amp;gt; n no es producto de cuadrados&lt;br /&gt;
		           where divisores n = [ a | a &amp;lt;- [2..n-1], n `mod` a == 0]&lt;br /&gt;
		                 sq a = sqrt (fromIntegral a) -- Raiz con decimales&lt;br /&gt;
		                 ndsq a = fromIntegral(truncate (sq a)) -- Raiz sin decimales&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, Elsa Domínguez&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;
amigos1 :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
amigos1 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;
-- Prof: En clase hemos visto&lt;br /&gt;
divisoresP :: Int -&amp;gt; [Int]&lt;br /&gt;
divisoresP n = [x | x&amp;lt;-[1..n-1], rem n x == 0]&lt;br /&gt;
&lt;br /&gt;
amigos2 :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
amigos2 a b = sumaDivisores a == b &amp;amp;&amp;amp; sumaDivisores b == a &amp;amp;&amp;amp; a/=b&lt;br /&gt;
         where sumaDivisores n  = sum(divisoresP n)&lt;br /&gt;
&lt;br /&gt;
-- Prof: he movido aquí esta solución que estaba en el primer ejercicio&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;
amigos3 :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
amigos3 a b = if a == b then False else sumad a == sumad b&lt;br /&gt;
&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, Adolfo Sagrera Vivancos, Elsa Domínguez&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;
-- Prof: Otra solución sin usar floor ni sqrt (aunque más lenta)&lt;br /&gt;
especial2 :: Int -&amp;gt; Bool&lt;br /&gt;
especial2 n = elem s [  x^2 | x &amp;lt;-[1 .. s]]&lt;br /&gt;
  where s = sumaDivisoresCuadrados n&lt;br /&gt;
&lt;br /&gt;
-- Prof: Falta ver cómo calcular los números especiales de tres cifras!!&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
especial3 = [ x | x&amp;lt;-[100..999], especial x]&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;
-- Lucía Hernández&lt;br /&gt;
multiplicidad :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
multiplicidad 1 _ = 1&lt;br /&gt;
multiplicidad x y = last  [ s | s&amp;lt;-[0..y], elem (x^s) (potencias x), elem (x^s)(divisores y)]&lt;br /&gt;
       where potencias n = [n^s | s&amp;lt;-[0..y]]&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
multiplicidad1 :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
multiplicidad1 x y = if x == 1 then 1 else sum [1 | n &amp;lt;- [1..y], rem y (x^n) == 0]&lt;br /&gt;
&lt;br /&gt;
-- Nicolás Rodríguez Ruiz&lt;br /&gt;
multiplicidad2 a b = sum [1 | x &amp;lt;- [1..length(divisores b)], a^x `elem` (divisores b)]&lt;br /&gt;
                   where divisores n = [ a | a &amp;lt;- [2..n], n `mod` a == 0]&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;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
calificaciones :: [(String,[(String,Int)])] -&amp;gt; String -&amp;gt; [(String,Int)]&lt;br /&gt;
calificaciones t p = head[  ns | (nom, ns) &amp;lt;- t, nom == p ]&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;
-- Nicolás Rodríguez Ruiz&lt;br /&gt;
todasAprobadas :: [(String,[(String,Int)])] -&amp;gt; String -&amp;gt; Bool&lt;br /&gt;
todasAprobadas t p = and[n&amp;gt;=5 | (_, n) &amp;lt;- (calificaciones t p)]&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;
-- Nicolás Rodríguez Ruiz&lt;br /&gt;
aprobados :: [(String,[(String,Int)])] -&amp;gt; [String]&lt;br /&gt;
aprobados t = [nom | (nom, _) &amp;lt;- t, todasAprobadas t nom]&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;
-- Elsa Domínguez&lt;br /&gt;
angelini :: Integer -&amp;gt; Bool&lt;br /&gt;
angelini n = not (null (cifrasIguales n))&lt;br /&gt;
           where cifrasIguales n = [a | (a,b) &amp;lt;- ns, a == b] &lt;br /&gt;
                 ns = [(a,b) | a &amp;lt;- cifras n, b &amp;lt;- cifras (2*n)]&lt;br /&gt;
&lt;br /&gt;
cifras :: Integer -&amp;gt; [Int]&lt;br /&gt;
cifras n = [read [x] | x &amp;lt;- show n]&lt;br /&gt;
&lt;br /&gt;
-- Nicolás Rodríguez Ruiz&lt;br /&gt;
angelini1 :: Integer -&amp;gt; Bool&lt;br /&gt;
angelini1 n = or[c `elem` (show (2*n)) | c &amp;lt;- (show n)]&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;
-- Lucía Hernández, Elsa Domínguez&lt;br /&gt;
repetir x n  = sum [x*10^i | i&amp;lt;-[0..n-1]]&lt;br /&gt;
&lt;br /&gt;
unitarios :: Int -&amp;gt; [Int]&lt;br /&gt;
unitarios x = [ (repetir x n) | n&amp;lt;- [1..]]&lt;br /&gt;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
unitarios x = [ sum[  x*(10^a) | a &amp;lt;- [0..n] ] | n &amp;lt;- [1..]]&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;
-- Lucía Hernández, Elsa Domínguez&lt;br /&gt;
multiplosUnitarios :: Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; [Int]&lt;br /&gt;
multiplosUnitarios x y n = take n ([a  | a&amp;lt;- unitarios y, mod a x == 0])&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;
-- Elsa Domínguez&lt;br /&gt;
aproximaPi n = sqrt (6*sum [1/x^2 | x &amp;lt;- [1..n]])&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;
-- Lucía Hernández, Elsa Domínguez&lt;br /&gt;
deBaseABase10 :: Int -&amp;gt; [Int] -&amp;gt; Int&lt;br /&gt;
deBaseABase10 b xs = sum [i*( b^n)  | (i,n)&amp;lt;- zip  xs [0..length xs -1] ]&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;
-- Elsa Domínguez&lt;br /&gt;
conPos1 :: [a] -&amp;gt; [(a,Int)]&lt;br /&gt;
conPos1 xs = zip xs [0..length xs-1]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12.2. Definir la función&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;
-- Elsa Domínguez&lt;br /&gt;
mayorSalto :: [Integer] -&amp;gt; Integer&lt;br /&gt;
mayorSalto xs = maximum [abs (a-b) | (a,b) &amp;lt;- zip xs (tail xs)]&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;
&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;
-- Elsa Domínguez&lt;br /&gt;
sumaEquidistantes :: Num a =&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
sumaEquidistantes xs = reverse (drop (div (length xs) 2) [a+b | (a,b) &amp;lt;- zip xs (reverse xs)])&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;
-- Lucía Hernández&lt;br /&gt;
distancia x y = abs(x-y)&lt;br /&gt;
cercanos :: [Int] -&amp;gt; [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
cercanos xs ys = [(x,y) | x&amp;lt;- xs, y&amp;lt;-ys, distancia x y == minimum [distancia x&amp;#039; y&amp;#039; | x&amp;#039;&amp;lt;- xs, y&amp;#039;&amp;lt;-ys]]&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
cercanos1 :: [Int] -&amp;gt; [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
cercanos1 xs ys = [(a,b) | a &amp;lt;- xs, b &amp;lt;- ys, abs (a-b) == minimum (distanciaPares xs ys)]&lt;br /&gt;
&lt;br /&gt;
distanciaPares xs ys = [abs (a-b) | a &amp;lt;- xs, b &amp;lt;- ys]&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;
-- Elsa Domínguez&lt;br /&gt;
esCuadratica :: [Int] -&amp;gt; Bool&lt;br /&gt;
esCuadratica xs = [abs (a-b) | (a,b) &amp;lt;- ys] == [x^2 | x &amp;lt;- [1..length (ys)]]&lt;br /&gt;
                where ys  = zip (tail xs) xs&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_4&amp;diff=338</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=338"/>
		<updated>2021-10-28T18:51:17Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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, Elsa Domínguez&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;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
divisores&amp;#039; n = [x | x &amp;lt;- [1..n], rem n x == 0]&lt;br /&gt;
divisoresPrimos&amp;#039; :: Int -&amp;gt; [Int]&lt;br /&gt;
divisoresPrimos&amp;#039; y = [ m | m &amp;lt;- [2..y], divisores m == [1,m], rem y m == 0]  -- Prof: debería usar divisores&amp;#039;?&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, Elsa Domínguez&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, Elsa Domínguez&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;
amigos1 :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
amigos1 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;
-- Prof: En clase hemos visto&lt;br /&gt;
divisoresP :: Int -&amp;gt; [Int]&lt;br /&gt;
divisoresP n = [x | x&amp;lt;-[1..n-1], rem n x == 0]&lt;br /&gt;
&lt;br /&gt;
amigos2 :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
amigos2 a b = sumaDivisores a == b &amp;amp;&amp;amp; sumaDivisores b == a &amp;amp;&amp;amp; a/=b&lt;br /&gt;
         where sumaDivisores n  = sum(divisoresP n)&lt;br /&gt;
&lt;br /&gt;
-- Prof: he movido aquí esta solución que estaba en el primer ejercicio&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;
amigos3 :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
amigos3 a b = if a == b then False else sumad a == sumad b&lt;br /&gt;
&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, Adolfo Sagrera Vivancos, Elsa Domínguez&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;
-- Prof: Otra solución sin usar floor ni sqrt (aunque más lenta)&lt;br /&gt;
especial2 :: Int -&amp;gt; Bool&lt;br /&gt;
especial2 n = elem s [  x^2 | x &amp;lt;-[1 .. s]]&lt;br /&gt;
  where s = sumaDivisoresCuadrados n&lt;br /&gt;
&lt;br /&gt;
-- Prof: Falta ver cómo calcular los números especiales de tres cifras!!&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
especial3 = [ x | x&amp;lt;-[100..999], especial x]&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;
-- Lucía Hernández&lt;br /&gt;
multiplicidad :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
multiplicidad 1 _ = 1&lt;br /&gt;
multiplicidad x y = last  [ s | s&amp;lt;-[0..y], elem (x^s) (potencias x), elem (x^s)(divisores y)]&lt;br /&gt;
       where potencias n = [n^s | s&amp;lt;-[0..y]]&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
multiplicidad1 :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
multiplicidad1 x y = if x == 1 then 1 else sum [1 | n &amp;lt;- [1..y], rem y (x^n) == 0]&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;
-- Elsa Domínguez&lt;br /&gt;
angelini :: Integer -&amp;gt; Bool&lt;br /&gt;
angelini n = not (null (cifrasIguales n))&lt;br /&gt;
           where cifrasIguales n = [a | (a,b) &amp;lt;- ns, a == b] &lt;br /&gt;
                 ns = [(a,b) | a &amp;lt;- cifras n, b &amp;lt;- cifras (2*n)]&lt;br /&gt;
&lt;br /&gt;
cifras :: Integer -&amp;gt; [Int]&lt;br /&gt;
cifras n = [read [x] | x &amp;lt;- show n]&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;
-- Lucía Hernández, Elsa Domínguez&lt;br /&gt;
repetir x n  = sum [x*10^i | i&amp;lt;-[0..n-1]]&lt;br /&gt;
&lt;br /&gt;
unitarios :: Int -&amp;gt; [Int]&lt;br /&gt;
unitarios x = [ (repetir x n) | n&amp;lt;- [1..]]&lt;br /&gt;
--Nicolás Rodríguez Ruiz&lt;br /&gt;
unitarios x = [ sum[  x*(10^a) | a &amp;lt;- [0..n] ] | n &amp;lt;- [1..]]&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;
-- Lucía Hernández, Elsa Domínguez&lt;br /&gt;
multiplosUnitarios :: Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; [Int]&lt;br /&gt;
multiplosUnitarios x y n = take n ([a  | a&amp;lt;- unitarios y, mod a x == 0])&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;
-- Elsa Domínguez&lt;br /&gt;
aproximaPi n = sqrt (6*sum [1/x^2 | x &amp;lt;- [1..n]])&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;
-- Lucía Hernández, Elsa Domínguez&lt;br /&gt;
deBaseABase10 :: Int -&amp;gt; [Int] -&amp;gt; Int&lt;br /&gt;
deBaseABase10 b xs = sum [i*( b^n)  | (i,n)&amp;lt;- zip  xs [0..length xs -1] ]&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;
-- Elsa Domínguez&lt;br /&gt;
conPos1 :: [a] -&amp;gt; [(a,Int)]&lt;br /&gt;
conPos1 xs = zip xs [0..length xs-1]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12.2. Definir la función&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;
-- Elsa Domínguez&lt;br /&gt;
mayorSalto :: [Integer] -&amp;gt; Integer&lt;br /&gt;
mayorSalto xs = maximum [abs (a-b) | (a,b) &amp;lt;- zip xs (tail xs)]&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;
&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;
-- Elsa Domínguez&lt;br /&gt;
sumaEquidistantes :: Num a =&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
sumaEquidistantes xs = reverse (drop (div (length xs) 2) [a+b | (a,b) &amp;lt;- zip xs (reverse xs)])&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;
-- Lucía Hernández&lt;br /&gt;
distancia x y = abs(x-y)&lt;br /&gt;
cercanos :: [Int] -&amp;gt; [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
cercanos xs ys = [(x,y) | x&amp;lt;- xs, y&amp;lt;-ys, distancia x y == minimum [distancia x&amp;#039; y&amp;#039; | x&amp;#039;&amp;lt;- xs, y&amp;#039;&amp;lt;-ys]]&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez &lt;br /&gt;
cercanos1 :: [Int] -&amp;gt; [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
cercanos1 xs ys = [(a,b) | a &amp;lt;- xs, b &amp;lt;- ys, abs (a-b) == minimum (distanciaPares xs ys)]&lt;br /&gt;
&lt;br /&gt;
distanciaPares xs ys = [abs (a-b) | a &amp;lt;- xs, b &amp;lt;- ys]&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;
-- Elsa Domínguez&lt;br /&gt;
esCuadratica :: [Int] -&amp;gt; Bool&lt;br /&gt;
esCuadratica xs = [abs (a-b) | (a,b) &amp;lt;- ys] == [x^2 | x &amp;lt;- [1..length (ys)]]&lt;br /&gt;
                where ys  = zip (tail xs) xs&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_3&amp;diff=301</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=301"/>
		<updated>2021-10-23T11:21:26Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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, Elsa Domínguez, Lucía González, Carmen Blanco, Adolfo Sagrera Vivancos, Ana Sosa Caballero&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;
-- 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, Lucía Hernández, Elsa Domínguez, Lucía González, Carmen Blanco, Adolfo Sagrera Vivancos, Ana Sosa Caballero&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;
-- 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, Lucía Hernández, Elsa Domínguez, Lucía González, Carmen Blanco, Adolfo Sagrera Vivancos, Ana Sosa Caballero&lt;br /&gt;
suma :: Integer -&amp;gt; Integer&lt;br /&gt;
suma n = sum [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;
-- Lucía Hernández. Lucía González&lt;br /&gt;
linea :: Integer -&amp;gt; [Integer]&lt;br /&gt;
linea n = [x | x&amp;lt;-[suma(n-1) +1..suma n]]&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Ana Sosa Caballero, Elsa Domínguez&lt;br /&gt;
linea1 :: Integer -&amp;gt; [Integer]&lt;br /&gt;
linea1 n = [suma (n-1)+1..suma n]&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, Lucía Hernández, Adolfo Sagrera Vivancos, Elsa Domínguez&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;
-- 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;
--Lucía Hernández&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n-1], mod n x == 0]&lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x&amp;lt;- [1..n], x == sum (factores x)]&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
factores1 :: Int -&amp;gt; [Int]&lt;br /&gt;
factores1 n = [x | x &amp;lt;- [1..n], n `mod` x == 0]               &lt;br /&gt;
perfectos1 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos1 n = [x | x &amp;lt;- [1..n], sum (factores x) == 2*x]&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
factores2 n = [x | x &amp;lt;- [1..n], rem n x ==0]&lt;br /&gt;
perfectos2 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos2 n = [i | i &amp;lt;- [1..n], perfecto i]&lt;br /&gt;
perfecto2 x = x == sum (factores x)-x&lt;br /&gt;
&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
perfectos3 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos3 n = [x | x &amp;lt;- [1..n], sum(init (factores x)) == x]&lt;br /&gt;
&lt;br /&gt;
factores3 n = [x | x &amp;lt;- [1..n], rem n x == 0]&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;
--Álvaro Cano, Adolfo Sagrera Vivancos&lt;br /&gt;
numeroAbundante :: Int -&amp;gt; Bool&lt;br /&gt;
numeroAbundante n = n &amp;lt; (sum (factores n) - n)&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
numeroAbundante :: Int -&amp;gt; Bool&lt;br /&gt;
numeroAbundante n =  n &amp;lt; sum(factores n)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
numeroAbundante2 :: Int -&amp;gt; Bool&lt;br /&gt;
numeroAbundante2 n = sum (factores n) &amp;gt; 2*n&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
numeroAbundante3 :: Int -&amp;gt; Bool&lt;br /&gt;
numeroAbundante3 n = sum(init (factores n)) &amp;gt; n&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;
--Álvaro Cano, Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sosa Caballero&lt;br /&gt;
numerosAbundantesMenores :: Int -&amp;gt; [Int]&lt;br /&gt;
numerosAbundantesMenores n = [x | x &amp;lt;- [1..n], numeroAbundante x]&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;
--Álvaro Cano&lt;br /&gt;
todosPares :: Int -&amp;gt; Bool&lt;br /&gt;
todosPares n = and [x `rem` 2 == 0 | x &amp;lt;- numerosAbundantesMenores n]&lt;br /&gt;
--Lucía Hernández &lt;br /&gt;
todosPares :: Int -&amp;gt; Bool&lt;br /&gt;
todosPares n = [ x| x&amp;lt;-numerosAbundantesMenores n, even x ] == numerosAbundantesMenores n&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
todosPares :: Int -&amp;gt; Bool&lt;br /&gt;
todosPares n = length (filter odd (numerosAbundantesMenores n)) == 0&lt;br /&gt;
-- Adolfo Sagrera Vivancos, Ana Sosa Caballero&lt;br /&gt;
todosPares1 :: Int -&amp;gt; Bool&lt;br /&gt;
todosPares1 n = and [even x | x &amp;lt;- numerosAbundantesMenores n]&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;
--Álvaro Cano, Lucía Hernández, Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
primerAbundanteImpar :: Int&lt;br /&gt;
primerAbundanteImpar = head [x | x &amp;lt;- [1,3..], numeroAbundante x]&lt;br /&gt;
-- Su cálculo es&lt;br /&gt;
--    ghci&amp;gt; primerAbundanteImpar&lt;br /&gt;
--    945&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
primerAbundanteImpar1 :: Int&lt;br /&gt;
primerAbundanteImpar1 = head [n | n &amp;lt;- [1..], odd n, numeroAbundante n]&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;
--Álvaro Cano&lt;br /&gt;
euler1 :: Int -&amp;gt; Int&lt;br /&gt;
euler1 n = sum [3*x | x &amp;lt;- [1..n] , 3*x &amp;lt; n] + sum [5*x | x &amp;lt;- [1..n], 5*x &amp;lt; n]&lt;br /&gt;
-- Cálculo:&lt;br /&gt;
--    ghci&amp;gt; euler1 1000&lt;br /&gt;
--    266333&lt;br /&gt;
-- Lucía Hernández, Adolfo Sagrera Vivancos&lt;br /&gt;
euler1 :: Int -&amp;gt; Int&lt;br /&gt;
euler1 n = sum [x |x&amp;lt;-[1..n-1], mod x 5 == 0 || mod x 3 == 0]&lt;br /&gt;
-- Cálculo:λ&amp;gt; euler1 1000&lt;br /&gt;
-- 233168&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
euler1&amp;#039; :: Int -&amp;gt; Int&lt;br /&gt;
euler1&amp;#039; n = sum [x | x &amp;lt;- [1..n-1], multiplo x 3 || multiplo x 5]&lt;br /&gt;
          where multiplo x y = rem x y == 0&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
euler1 :: Int -&amp;gt; Int&lt;br /&gt;
euler1 n = sum [x | x &amp;lt;- [1..n-1], (rem x 3 == 0) || (rem x 5 == 0)]               &lt;br /&gt;
-- Cálculo:&lt;br /&gt;
-- λ&amp;gt; euler1&amp;#039; 1000&lt;br /&gt;
-- 233168&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;
--Álvaro Cano, Elsa Domínguez, Lucía Hernández&lt;br /&gt;
circulo :: Int -&amp;gt; Int&lt;br /&gt;
circulo n = length [(x,y) | x &amp;lt;- [0..n], y &amp;lt;- [0..n], x^2 + y^2 &amp;lt; n^2]&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;
--Álvaro Cano, Lucía Hernández, Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
aproxE :: Double -&amp;gt; [Double]&lt;br /&gt;
aproxE n = [(1+1/m)**m | m &amp;lt;- [1..n]]&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;
-- Elsa Domínguez&lt;br /&gt;
-- El límite es el número e.&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;
--Álvaro Cano&lt;br /&gt;
errorAproxE :: Double -&amp;gt; Double&lt;br /&gt;
errorAproxE x = head [m | m &amp;lt;- [1..], (exp 1 - (1+1/m)**m) &amp;lt; x]&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández&lt;br /&gt;
errorAproxE&amp;#039; :: Double -&amp;gt; Double&lt;br /&gt;
errorAproxE&amp;#039; x = head [m | m &amp;lt;- [1..], abs (exp 1 - (1+1/m)**m) &amp;lt; x]&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;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
aproxLimSeno :: Double -&amp;gt; [Double]&lt;br /&gt;
aproxLimSeno n = [sin (1/m) / (1/m) | m &amp;lt;- [1..n]]&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;
-- Elsa Domínguez&lt;br /&gt;
-- El límite es 1. &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;
-- Elsa Domínguez, Lucía Hernández&lt;br /&gt;
errorLimSeno :: Double -&amp;gt; Double&lt;br /&gt;
errorLimSeno x = head [m | m &amp;lt;- [1..], abs (1 - sin (1/m) / (1/m)) &amp;lt; x] &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;
-- Elsa Domínguez, Lucía Hernández&lt;br /&gt;
calculaPi :: Double -&amp;gt; Double&lt;br /&gt;
calculaPi n = 4*(sum [(-1)**x / (2*x + 1) | x &amp;lt;- [0..n]])&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;
-- Elsa Domínguez, Lucía Hernández&lt;br /&gt;
errorPi :: Double -&amp;gt; Double&lt;br /&gt;
errorPi x = head [n | n &amp;lt;- [1..], abs (pi - calculaPi n) &amp;lt; x]&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;
-- Lucía Hernández, Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int,Int,Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;-[1..n], y &amp;lt;-[1..n], z &amp;lt;-[1..n], x^2+y^2 == z^2]&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;
-- Lucía Hernández&lt;br /&gt;
numeroDePares :: (Int,Int,Int) -&amp;gt; Int&lt;br /&gt;
numeroDePares (x,y,z) = length [i | i&amp;lt;-[x,y,z], even i]&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
numeroDePares1 :: (Int,Int,Int) -&amp;gt; Int&lt;br /&gt;
numeroDePares1 (x,y,z) = sum [1 | a &amp;lt;- [x,y,z], even a]&lt;br /&gt;
&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
numeroDePares2 :: (Int,Int,Int) -&amp;gt; Int&lt;br /&gt;
numeroDePares2 (x,y,z) = sum [1 | _ &amp;lt;- filter even [x,y,z]]&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;
-- Elsa Domínguez, Lucía Hernández&lt;br /&gt;
conjetura :: Int -&amp;gt; Bool&lt;br /&gt;
conjetura n = and [odd (numeroDePares (x,y,z)) | (x,y,z) &amp;lt;- pitagoricas n]&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;
-- Elsa Domínguez&lt;br /&gt;
ternasPitagoricas :: Integer -&amp;gt; [(Integer,Integer,Integer)]&lt;br /&gt;
ternasPitagoricas x = [(a,b,c) | a &amp;lt;- [1..x], b &amp;lt;- [a+1..x], c &amp;lt;- [b+1..x], a^2 + b^2 == c^2, a+b+c == x]&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
ternasPitagoricas :: Integer -&amp;gt; [(Integer,Integer,Integer)]&lt;br /&gt;
ternasPitagoricas x = [(a,b,c) | a&amp;lt;-[1..x],b&amp;lt;-[1..x],c&amp;lt;-[1..x],  a&amp;lt;b &amp;amp;&amp;amp; b&amp;lt;c,a^2+b^2 == c^2,a+b+c == x ]&lt;br /&gt;
&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
ternasPitagoricas :: Integer -&amp;gt; [(Integer,Integer,Integer)]&lt;br /&gt;
ternasPitagoricas t =  [ (x,y,z) | x &amp;lt;- [1..], y &amp;lt;- [1..], z &amp;lt;- [1..], x&amp;lt;y &amp;amp;&amp;amp; y&amp;lt;z, x^2+y^2 == z^2, sum [x,y,z] == t]&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;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
productoEscalar :: [Int] -&amp;gt; [Int] -&amp;gt; Int&lt;br /&gt;
productoEscalar xs ys = sum [a*b | (a,b) &amp;lt;- zip xs ys]&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
productoEscalar :: [Int] -&amp;gt; [Int] -&amp;gt; Int&lt;br /&gt;
productoEscalar xs ys = sum [ fst p * snd p  |p&amp;lt;- zip xs ys]&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;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [a+b | (a,b) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
--Lucía Hernández&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [fst p + snd p  | p&amp;lt;-zip xs (tail xs) ]&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;
-- Elsa Domínguez&lt;br /&gt;
densa :: [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
densa xs = [(a,b) | (a,b) &amp;lt;- zip (reverse [0..(length xs-1)]) xs, b /= 0]&lt;br /&gt;
&lt;br /&gt;
-- Ana Sosa Caballero (Mal)&lt;br /&gt;
densa :: [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
densa xs = [(y,x) | x &amp;lt;- xs , y &amp;lt;-  [ys, ys-1 .. 0] ]&lt;br /&gt;
      where ys = length xs -1&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;
-- Elsa Domínguez&lt;br /&gt;
nombres :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
nombres bd = [(a) | (a,_,_,_) &amp;lt;- bd]&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;
-- Elsa Domínguez&lt;br /&gt;
musicos :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
musicos bd = [(a) | (a,b,_,_) &amp;lt;- bd, b == &amp;quot;Musica&amp;quot;]&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;
-- Elsa Domínguez&lt;br /&gt;
seleccion :: [(String,String,Int,Int)] -&amp;gt; String -&amp;gt; [String]&lt;br /&gt;
seleccion bd m = [(a) | (a,b,_,_) &amp;lt;- bd, b == m]&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;
-- Elsa Domínguez&lt;br /&gt;
musicos&amp;#039; :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
musicos&amp;#039; bd = seleccion bd &amp;quot;Musica&amp;quot;&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;
-- Elsa Domínguez&lt;br /&gt;
vivas :: [(String,String,Int,Int)] -&amp;gt; Int -&amp;gt; [String]&lt;br /&gt;
vivas ps a = [(p) | (p,_,c,d) &amp;lt;- ps, c &amp;lt;= a &amp;amp;&amp;amp; a &amp;lt;= d]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_3&amp;diff=273</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=273"/>
		<updated>2021-10-21T18:36:25Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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, Elsa Domínguez&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;
-- 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, Lucía Hernández, Elsa Domínguez&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;
-- 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, Lucía Hernández, Elsa Domínguez&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;
-- Lucía Hernández&lt;br /&gt;
linea :: Integer -&amp;gt; [Integer]&lt;br /&gt;
linea n = [x | x&amp;lt;-[suma(n-1) +1..suma n]]&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, Lucía Hernández&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;
-- 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;
--Lucía Hernández&lt;br /&gt;
factores :: Int -&amp;gt; [Int]&lt;br /&gt;
factores n = [x | x &amp;lt;- [1..n-1], mod n x == 0]&lt;br /&gt;
perfectos :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos n = [x | x&amp;lt;- [1..n], x == sum (factores x)]&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
factores1 :: Int -&amp;gt; [Int]&lt;br /&gt;
factores1 n = [x | x &amp;lt;- [1..n], n `mod` x == 0]               &lt;br /&gt;
perfectos1 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos1 n = [x | x &amp;lt;- [1..n], sum (factores x) == 2*x]&lt;br /&gt;
&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;
--Álvaro Cano&lt;br /&gt;
numeroAbundante :: Int -&amp;gt; Bool&lt;br /&gt;
numeroAbundante n = n &amp;lt; (sum (factores n) - n)&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
numeroAbundante :: Int -&amp;gt; Bool&lt;br /&gt;
numeroAbundante n =  n &amp;lt; sum(factores n)&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
numeroAbundante2 :: Int -&amp;gt; Bool&lt;br /&gt;
numeroAbundante2 n = sum (factores n) &amp;gt; 2*n&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;
--Álvaro Cano, Lucía Hernández, Elsa Domínguez&lt;br /&gt;
numerosAbundantesMenores :: Int -&amp;gt; [Int]&lt;br /&gt;
numerosAbundantesMenores n = [x | x &amp;lt;- [1..n], numeroAbundante x]&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;
--Álvaro Cano&lt;br /&gt;
todosPares :: Int -&amp;gt; Bool&lt;br /&gt;
todosPares n = and [x `rem` 2 == 0 | x &amp;lt;- numerosAbundantesMenores n]&lt;br /&gt;
--Lucía Hernández &lt;br /&gt;
todosPares :: Int -&amp;gt; Bool&lt;br /&gt;
todosPares n = [ x| x&amp;lt;-numerosAbundantesMenores n, even x ] == numerosAbundantesMenores n&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
todosPares :: Int -&amp;gt; Bool&lt;br /&gt;
todosPares n = length (filter odd (numerosAbundantesMenores n)) == 0&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;
--Álvaro Cano, Lucía Hernández, Elsa Domínguez&lt;br /&gt;
primerAbundanteImpar :: Int&lt;br /&gt;
primerAbundanteImpar = head [x | x &amp;lt;- [1,3..], numeroAbundante x]&lt;br /&gt;
-- Su cálculo es&lt;br /&gt;
--    ghci&amp;gt; primerAbundanteImpar&lt;br /&gt;
--    945&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;
--Álvaro Cano&lt;br /&gt;
euler1 :: Int -&amp;gt; Int&lt;br /&gt;
euler1 n = sum [3*x | x &amp;lt;- [1..n] , 3*x &amp;lt; n] + sum [5*x | x &amp;lt;- [1..n], 5*x &amp;lt; n]&lt;br /&gt;
-- Cálculo:&lt;br /&gt;
--    ghci&amp;gt; euler1 1000&lt;br /&gt;
--    266333&lt;br /&gt;
-- Lucía Hernández&lt;br /&gt;
euler1 :: Int -&amp;gt; Int&lt;br /&gt;
euler1 n = sum [x |x&amp;lt;-[1..n-1], mod x 5 == 0 || mod x 3 == 0]&lt;br /&gt;
-- Cálculo:λ&amp;gt; euler1 1000&lt;br /&gt;
-- 233168&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
euler1&amp;#039; :: Int -&amp;gt; Int&lt;br /&gt;
euler1&amp;#039; n = sum [x | x &amp;lt;- [1..n-1], multiplo x 3 || multiplo x 5]&lt;br /&gt;
          where multiplo x y = rem x y == 0               &lt;br /&gt;
-- Cálculo:&lt;br /&gt;
-- λ&amp;gt; euler1&amp;#039; 1000&lt;br /&gt;
-- 233168&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;
--Álvaro Cano, Elsa Domínguez&lt;br /&gt;
circulo :: Int -&amp;gt; Int&lt;br /&gt;
circulo n = length [(x,y) | x &amp;lt;- [0..n], y &amp;lt;- [0..n], x^2 + y^2 &amp;lt; n^2]&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;
--Álvaro Cano, Lucía Hernández, Elsa Domínguez&lt;br /&gt;
aproxE :: Double -&amp;gt; [Double]&lt;br /&gt;
aproxE n = [(1+1/m)**m | m &amp;lt;- [1..n]]&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;
-- Elsa Domínguez&lt;br /&gt;
-- El límite es el número e.&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;
--Álvaro Cano&lt;br /&gt;
errorAproxE :: Double -&amp;gt; Double&lt;br /&gt;
errorAproxE x = head [m | m &amp;lt;- [1..], (exp 1 - (1+1/m)**m) &amp;lt; x]&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
errorAproxE&amp;#039; :: Double -&amp;gt; Double&lt;br /&gt;
errorAproxE&amp;#039; x = head [m | m &amp;lt;- [1..], abs (exp 1 - (1+1/m)**m) &amp;lt; x]&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;
-- Elsa Domínguez&lt;br /&gt;
aproxLimSeno :: Double -&amp;gt; [Double]&lt;br /&gt;
aproxLimSeno n = [sin (1/m) / (1/m) | m &amp;lt;- [1..n]]&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;
-- Elsa Domínguez&lt;br /&gt;
-- El límite es 1. &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;
-- Elsa Domínguez&lt;br /&gt;
errorLimSeno :: Double -&amp;gt; Double&lt;br /&gt;
errorLimSeno x = head [m | m &amp;lt;- [1..], abs (1 - sin (1/m) / (1/m)) &amp;lt; x] &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;
-- Elsa Domínguez&lt;br /&gt;
calculaPi :: Double -&amp;gt; Double&lt;br /&gt;
calculaPi n = 4*(sum [(-1)**x / (2*x + 1) | x &amp;lt;- [0..n]])&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;
-- Elsa Domínguez&lt;br /&gt;
errorPi :: Double -&amp;gt; Double&lt;br /&gt;
errorPi x = head [n | n &amp;lt;- [1..], abs (pi - calculaPi n) &amp;lt; x]&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;
-- Lucía Hernández, Elsa Domínguez&lt;br /&gt;
pitagoricas :: Int -&amp;gt; [(Int,Int,Int)]&lt;br /&gt;
pitagoricas n = [(x,y,z) | x &amp;lt;-[1..n], y &amp;lt;-[1..n], z &amp;lt;-[1..n], x^2+y^2 == z^2]&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;
--Lucía Hernández&lt;br /&gt;
numeroDePares :: (Int,Int,Int) -&amp;gt; Int&lt;br /&gt;
numeroDePares (x,y,z) | even x &amp;amp;&amp;amp; even y &amp;amp;&amp;amp; even z = 3&lt;br /&gt;
                      | (even x &amp;amp;&amp;amp; even y &amp;amp;&amp;amp; odd z)|| (even x &amp;amp;&amp;amp; odd y &amp;amp;&amp;amp; even z) || (odd x &amp;amp;&amp;amp; even y &amp;amp;&amp;amp; even z) = 2&lt;br /&gt;
                      | odd x &amp;amp;&amp;amp; odd y &amp;amp;&amp;amp; odd z = 0&lt;br /&gt;
                      | otherwise = 1&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
numeroDePares1 :: (Int,Int,Int) -&amp;gt; Int&lt;br /&gt;
numeroDePares1 (x,y,z) = sum [1 | a &amp;lt;- [x,y,z], even a]&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;
-- Elsa Domínguez&lt;br /&gt;
conjetura :: Int -&amp;gt; Bool&lt;br /&gt;
conjetura n = and [odd (numeroDePares (x,y,z)) | (x,y,z) &amp;lt;- pitagoricas n]&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;
-- Elsa Domínguez&lt;br /&gt;
ternasPitagoricas :: Integer -&amp;gt; [(Integer,Integer,Integer)]&lt;br /&gt;
ternasPitagoricas x = [(a,b,c) | a &amp;lt;- [1..x], b &amp;lt;- [a+1..x], c &amp;lt;- [b+1..x], a^2 + b^2 == c^2, a+b+c == x]&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;
-- Elsa Domínguez&lt;br /&gt;
productoEscalar :: [Int] -&amp;gt; [Int] -&amp;gt; Int&lt;br /&gt;
productoEscalar xs ys = sum [a*b | (a,b) &amp;lt;- zip xs ys]&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;
-- Elsa Domínguez&lt;br /&gt;
sumaConsecutivos :: [Int] -&amp;gt; [Int]&lt;br /&gt;
sumaConsecutivos xs = [a+b | (a,b) &amp;lt;- zip xs (tail xs)]&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;
-- Elsa Domínguez&lt;br /&gt;
densa :: [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
densa xs = [(a,b) | (a,b) &amp;lt;- zip (reverse [0..(length xs-1)]) xs, b /= 0]&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;
-- Elsa Domínguez&lt;br /&gt;
nombres :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
nombres bd = [(a) | (a,_,_,_) &amp;lt;- bd]&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;
-- Elsa Domínguez&lt;br /&gt;
musicos :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
musicos bd = [(a) | (a,b,_,_) &amp;lt;- bd, b == &amp;quot;Musica&amp;quot;]&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;
-- Elsa Domínguez&lt;br /&gt;
seleccion :: [(String,String,Int,Int)] -&amp;gt; String -&amp;gt; [String]&lt;br /&gt;
seleccion bd m = [(a) | (a,b,_,_) &amp;lt;- bd, b == m]&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;
-- Elsa Domínguez&lt;br /&gt;
musicos&amp;#039; :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
musicos&amp;#039; bd = seleccion bd &amp;quot;Musica&amp;quot;&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;
-- Elsa Domínguez&lt;br /&gt;
vivas :: [(String,String,Int,Int)] -&amp;gt; Int -&amp;gt; [String]&lt;br /&gt;
vivas ps a = [(p) | (p,_,c,d) &amp;lt;- ps, c &amp;lt;= a &amp;amp;&amp;amp; a &amp;lt;= d]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=239</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=239"/>
		<updated>2021-10-16T12:11:01Z</updated>

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

		<summary type="html">&lt;p&gt;Elsdomgon: &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;
(~=) :: (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&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=159</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=159"/>
		<updated>2021-10-06T18:33:09Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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&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;
&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, Elsa Domínguez&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&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, Elsa Domínguez&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&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;
-- ---------------------------------------------------------------------&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&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&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;
&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&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&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;
-- ---------------------------------------------------------------------&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&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&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;
-- --------------------------------------------------------------------- &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&lt;br /&gt;
area :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; Double &lt;br /&gt;
area a b c = sqrt(s*(s-a)*(s-b)*(s-c))&lt;br /&gt;
     where s = (a+b+c)/2&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Los intervalos cerrados se pueden representar mediante&lt;br /&gt;
-- una lista de dos números (el primero es el extremo inferior del&lt;br /&gt;
-- intervalo y el segundo el superior). &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    interseccion :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (interseccion i1 i2) es la intersección de los intervalos i1 e&lt;br /&gt;
-- i2. Por ejemplo,&lt;br /&gt;
--    interseccion [] [3,5]     ==  []&lt;br /&gt;
--    interseccion [3,5] []     ==  []&lt;br /&gt;
--    interseccion [2,4] [6,9]  ==  []&lt;br /&gt;
--    interseccion [2,6] [6,9]  ==  [6,6]&lt;br /&gt;
--    interseccion [2,6] [0,9]  ==  [2,6]&lt;br /&gt;
--    interseccion [2,6] [0,4]  ==  [2,4]&lt;br /&gt;
--    interseccion [4,6] [0,4]  ==  [4,4]&lt;br /&gt;
--    interseccion [5,6] [0,4]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
interseccion :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccion = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Comprobar con QuickCheck que la intersección de&lt;br /&gt;
-- intervalos es conmutativa.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_interseccion :: Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_interseccion a1 b1 a2 b2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&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&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;
sumaRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
sumaRacional (a,b) (c,d) = undefined&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;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. Definir la función&lt;br /&gt;
--    cocienteRacional ::  (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que &amp;#039;(cocienteRacional x y)&amp;#039; es el cociente de los números racionales&lt;br /&gt;
-- &amp;#039;x&amp;#039; e &amp;#039;y&amp;#039;. Por ejemplo,&lt;br /&gt;
--    cocienteRacional (2,3) (5,6)  ==  (4,5)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cocienteRacional ::  (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
cocienteRacional (x1,x2) (y1,y2) = undefined&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&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;
&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&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&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&lt;br /&gt;
cocienteComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
cocienteComplejos (x1,x2) (y1,y2) = (((x1*y1 + x2*y2)/ t), ((x2*y1 - x1*y2)/t))&lt;br /&gt;
                  where t = (y1^2 + y2^2)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14.4. Definir la función&lt;br /&gt;
--    conjugado :: Complejo -&amp;gt; Complejo&lt;br /&gt;
-- tal que &amp;#039;(conjugado x)&amp;#039; es el conjugado del número complejo &amp;#039;x&amp;#039;. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    conjugado (2,3)  ==  (2.0,-3.0)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&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;
&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;
-- ----------------------------------------------------------------------------&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&lt;br /&gt;
simetricoH :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoH (x1,x2) = (x1,-x2)&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&lt;br /&gt;
simetricoV :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoV (x1,x2) = (-x1,x2)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19. Definir la función&lt;br /&gt;
--    distancia :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; Float&lt;br /&gt;
-- tal que &amp;#039;(distancia p1 p2)&amp;#039; es la distancia entre los puntos &amp;#039;p1&amp;#039; y &amp;#039;p2&amp;#039;.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    distancia (1,2) (4,6)  ==  5.0&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&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&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;
&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&lt;br /&gt;
puntoMedio :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; (Float,Float)&lt;br /&gt;
puntoMedio (x1,x2) (y1,y2) = ((x1+y1)/2, (x2+y2)/2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Repaso de operaciones lógicas                                      --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa. Su tabla de verdad&lt;br /&gt;
-- es&lt;br /&gt;
--    x     | y     | xor x y&lt;br /&gt;
--    ------+-------+---------&lt;br /&gt;
--    True  | True  | False &lt;br /&gt;
--    True  | False | True&lt;br /&gt;
--    False | True  | True&lt;br /&gt;
--    False | False | False&lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    xor1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor1 x y) es la disyunción excluyente de x e y, calculada a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor1 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.2. Definir la función &lt;br /&gt;
--    xor2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor2 x y) es la disyunción excluyente de x e y, calculada a&lt;br /&gt;
-- partir de la tabla de verdad y patrones. Usar 2 ecuaciones, una por&lt;br /&gt;
-- cada valor del primer argumento. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.3. Definir la función &lt;br /&gt;
--    xor3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor3 x y) es la disyunción excluyente de x e y, calculada &lt;br /&gt;
-- a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación (not). &lt;br /&gt;
-- Usar 1 ecuación. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor3 x y = undefined&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;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.5. Comprobar con QuickCheck que las cuatro definiciones&lt;br /&gt;
-- de xor son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_xor_equivalentes :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
prop_xor_equivalentes x y = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&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&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&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&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&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&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 else False&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;
-- ---------------------------------------------------------------------&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;
&lt;br /&gt;
xnor :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xnor = undefined&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;
&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;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=150</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=150"/>
		<updated>2021-10-06T16:53:15Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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&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;
&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, Elsa Domínguez&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&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, Elsa Domínguez&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&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;
&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&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&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;
&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;
&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&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]&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;
&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&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;
&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&lt;br /&gt;
area :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; Double &lt;br /&gt;
area a b c = sqrt(s*(s-a)*(s-b)*(s-c))&lt;br /&gt;
     where s = (a+b+c)/2&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Los intervalos cerrados se pueden representar mediante&lt;br /&gt;
-- una lista de dos números (el primero es el extremo inferior del&lt;br /&gt;
-- intervalo y el segundo el superior). &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    interseccion :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (interseccion i1 i2) es la intersección de los intervalos i1 e&lt;br /&gt;
-- i2. Por ejemplo,&lt;br /&gt;
--    interseccion [] [3,5]     ==  []&lt;br /&gt;
--    interseccion [3,5] []     ==  []&lt;br /&gt;
--    interseccion [2,4] [6,9]  ==  []&lt;br /&gt;
--    interseccion [2,6] [6,9]  ==  [6,6]&lt;br /&gt;
--    interseccion [2,6] [0,9]  ==  [2,6]&lt;br /&gt;
--    interseccion [2,6] [0,4]  ==  [2,4]&lt;br /&gt;
--    interseccion [4,6] [0,4]  ==  [4,4]&lt;br /&gt;
--    interseccion [5,6] [0,4]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
interseccion :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccion = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Comprobar con QuickCheck que la intersección de&lt;br /&gt;
-- intervalos es conmutativa.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_interseccion :: Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_interseccion a1 b1 a2 b2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&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&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;
sumaRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
sumaRacional (a,b) (c,d) = undefined&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;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. Definir la función&lt;br /&gt;
--    cocienteRacional ::  (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que &amp;#039;(cocienteRacional x y)&amp;#039; es el cociente de los números racionales&lt;br /&gt;
-- &amp;#039;x&amp;#039; e &amp;#039;y&amp;#039;. Por ejemplo,&lt;br /&gt;
--    cocienteRacional (2,3) (5,6)  ==  (4,5)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cocienteRacional ::  (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
cocienteRacional (x1,x2) (y1,y2) = undefined&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&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;
&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&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&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&lt;br /&gt;
cocienteComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
cocienteComplejos (x1,x2) (y1,y2) = (((x1*y1 + x2*y2)/ t), ((x2*y1 - x1*y2)/t))&lt;br /&gt;
                  where t = (y1^2 + y2^2)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14.4. Definir la función&lt;br /&gt;
--    conjugado :: Complejo -&amp;gt; Complejo&lt;br /&gt;
-- tal que &amp;#039;(conjugado x)&amp;#039; es el conjugado del número complejo &amp;#039;x&amp;#039;. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    conjugado (2,3)  ==  (2.0,-3.0)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&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;
&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;
-- ----------------------------------------------------------------------------&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&lt;br /&gt;
simetricoH :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoH (x1,x2) = (x1,-x2)&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&lt;br /&gt;
simetricoV :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoV (x1,x2) = (-x1,x2)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19. Definir la función&lt;br /&gt;
--    distancia :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; Float&lt;br /&gt;
-- tal que &amp;#039;(distancia p1 p2)&amp;#039; es la distancia entre los puntos &amp;#039;p1&amp;#039; y &amp;#039;p2&amp;#039;.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    distancia (1,2) (4,6)  ==  5.0&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&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&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;
&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&lt;br /&gt;
puntoMedio :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; (Float,Float)&lt;br /&gt;
puntoMedio (x1,x2) (y1,y2) = ((x1+y1)/2, (x2+y2)/2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Repaso de operaciones lógicas                                      --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa. Su tabla de verdad&lt;br /&gt;
-- es&lt;br /&gt;
--    x     | y     | xor x y&lt;br /&gt;
--    ------+-------+---------&lt;br /&gt;
--    True  | True  | False &lt;br /&gt;
--    True  | False | True&lt;br /&gt;
--    False | True  | True&lt;br /&gt;
--    False | False | False&lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    xor1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor1 x y) es la disyunción excluyente de x e y, calculada a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor1 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.2. Definir la función &lt;br /&gt;
--    xor2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor2 x y) es la disyunción excluyente de x e y, calculada a&lt;br /&gt;
-- partir de la tabla de verdad y patrones. Usar 2 ecuaciones, una por&lt;br /&gt;
-- cada valor del primer argumento. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.3. Definir la función &lt;br /&gt;
--    xor3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor3 x y) es la disyunción excluyente de x e y, calculada &lt;br /&gt;
-- a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación (not). &lt;br /&gt;
-- Usar 1 ecuación. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor3 x y = undefined&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;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.5. Comprobar con QuickCheck que las cuatro definiciones&lt;br /&gt;
-- de xor son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_xor_equivalentes :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
prop_xor_equivalentes x y = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&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&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&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&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&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&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 else False&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;
-- ---------------------------------------------------------------------&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;
&lt;br /&gt;
xnor :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xnor = undefined&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;
&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;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=149</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=149"/>
		<updated>2021-10-06T16:51:54Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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&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;
&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, Elsa Domínguez&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&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, Elsa Domínguez&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&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;
&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&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&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;
&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;
&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&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]&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;
&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&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;
&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&lt;br /&gt;
area :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; Double &lt;br /&gt;
area a b c = sqrt(s*(s-a)*(s-b)*(s-c))&lt;br /&gt;
     where s = (a+b+c)/2&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Los intervalos cerrados se pueden representar mediante&lt;br /&gt;
-- una lista de dos números (el primero es el extremo inferior del&lt;br /&gt;
-- intervalo y el segundo el superior). &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    interseccion :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (interseccion i1 i2) es la intersección de los intervalos i1 e&lt;br /&gt;
-- i2. Por ejemplo,&lt;br /&gt;
--    interseccion [] [3,5]     ==  []&lt;br /&gt;
--    interseccion [3,5] []     ==  []&lt;br /&gt;
--    interseccion [2,4] [6,9]  ==  []&lt;br /&gt;
--    interseccion [2,6] [6,9]  ==  [6,6]&lt;br /&gt;
--    interseccion [2,6] [0,9]  ==  [2,6]&lt;br /&gt;
--    interseccion [2,6] [0,4]  ==  [2,4]&lt;br /&gt;
--    interseccion [4,6] [0,4]  ==  [4,4]&lt;br /&gt;
--    interseccion [5,6] [0,4]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
interseccion :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccion = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Comprobar con QuickCheck que la intersección de&lt;br /&gt;
-- intervalos es conmutativa.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_interseccion :: Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_interseccion a1 b1 a2 b2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&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&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;
sumaRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
sumaRacional (a,b) (c,d) = undefined&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;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. Definir la función&lt;br /&gt;
--    cocienteRacional ::  (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que &amp;#039;(cocienteRacional x y)&amp;#039; es el cociente de los números racionales&lt;br /&gt;
-- &amp;#039;x&amp;#039; e &amp;#039;y&amp;#039;. Por ejemplo,&lt;br /&gt;
--    cocienteRacional (2,3) (5,6)  ==  (4,5)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cocienteRacional ::  (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
cocienteRacional (x1,x2) (y1,y2) = undefined&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&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;
&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&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&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&lt;br /&gt;
cocienteComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
cocienteComplejos (x1,x2) (y1,y2) = (((x1*y1 + x2*y2)/ t), ((x2*y1 - x1*y2)/t))&lt;br /&gt;
                  where t = (y1^2 + y2^2)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14.4. Definir la función&lt;br /&gt;
--    conjugado :: Complejo -&amp;gt; Complejo&lt;br /&gt;
-- tal que &amp;#039;(conjugado x)&amp;#039; es el conjugado del número complejo &amp;#039;x&amp;#039;. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    conjugado (2,3)  ==  (2.0,-3.0)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&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;
&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;
-- ----------------------------------------------------------------------------&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&lt;br /&gt;
simetricoH :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoH (x1,x2) = (x1,-x2)&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&lt;br /&gt;
simetricoV :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoV (x1,x2) = (-x1,x2)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19. Definir la función&lt;br /&gt;
--    distancia :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; Float&lt;br /&gt;
-- tal que &amp;#039;(distancia p1 p2)&amp;#039; es la distancia entre los puntos &amp;#039;p1&amp;#039; y &amp;#039;p2&amp;#039;.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    distancia (1,2) (4,6)  ==  5.0&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&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&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;
&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&lt;br /&gt;
puntoMedio :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; (Float,Float)&lt;br /&gt;
puntoMedio (x1,x2) (y1,y2) = ((x1+y1)/2, (x2+y2)/2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Repaso de operaciones lógicas                                      --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa. Su tabla de verdad&lt;br /&gt;
-- es&lt;br /&gt;
--    x     | y     | xor x y&lt;br /&gt;
--    ------+-------+---------&lt;br /&gt;
--    True  | True  | False &lt;br /&gt;
--    True  | False | True&lt;br /&gt;
--    False | True  | True&lt;br /&gt;
--    False | False | False&lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    xor1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor1 x y) es la disyunción excluyente de x e y, calculada a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor1 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.2. Definir la función &lt;br /&gt;
--    xor2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor2 x y) es la disyunción excluyente de x e y, calculada a&lt;br /&gt;
-- partir de la tabla de verdad y patrones. Usar 2 ecuaciones, una por&lt;br /&gt;
-- cada valor del primer argumento. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.3. Definir la función &lt;br /&gt;
--    xor3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor3 x y) es la disyunción excluyente de x e y, calculada &lt;br /&gt;
-- a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación (not). &lt;br /&gt;
-- Usar 1 ecuación. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor3 x y = undefined&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;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.5. Comprobar con QuickCheck que las cuatro definiciones&lt;br /&gt;
-- de xor son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_xor_equivalentes :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
prop_xor_equivalentes x y = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&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&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&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&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&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&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 else False&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;
-- ---------------------------------------------------------------------&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;
&lt;br /&gt;
xnor :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xnor = undefined&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;
&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;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=148</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=148"/>
		<updated>2021-10-06T16:48:41Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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&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;
&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, Elsa Domínguez&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&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, Elsa Domínguez&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&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;
ciclo :: [a] -&amp;gt; [a]&lt;br /&gt;
ciclo = undefined &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&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&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&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;
&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;
numeroDeRaices :: (Num t, Ord t) =&amp;gt; t -&amp;gt; t -&amp;gt; t -&amp;gt; Int&lt;br /&gt;
numeroDeRaices 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;
&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&lt;br /&gt;
raices :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; [Double]&lt;br /&gt;
raices a b c | b^2-4*a*c == 0  = [-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;
&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&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;
&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&lt;br /&gt;
area :: Double -&amp;gt; Double -&amp;gt; Double -&amp;gt; Double &lt;br /&gt;
area a b c = sqrt(s*(s-a)*(s-b)*(s-c))&lt;br /&gt;
     where s = (a+b+c)/2&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Los intervalos cerrados se pueden representar mediante&lt;br /&gt;
-- una lista de dos números (el primero es el extremo inferior del&lt;br /&gt;
-- intervalo y el segundo el superior). &lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    interseccion :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (interseccion i1 i2) es la intersección de los intervalos i1 e&lt;br /&gt;
-- i2. Por ejemplo,&lt;br /&gt;
--    interseccion [] [3,5]     ==  []&lt;br /&gt;
--    interseccion [3,5] []     ==  []&lt;br /&gt;
--    interseccion [2,4] [6,9]  ==  []&lt;br /&gt;
--    interseccion [2,6] [6,9]  ==  [6,6]&lt;br /&gt;
--    interseccion [2,6] [0,9]  ==  [2,6]&lt;br /&gt;
--    interseccion [2,6] [0,4]  ==  [2,4]&lt;br /&gt;
--    interseccion [4,6] [0,4]  ==  [4,4]&lt;br /&gt;
--    interseccion [5,6] [0,4]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
interseccion :: Ord a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
interseccion = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Comprobar con QuickCheck que la intersección de&lt;br /&gt;
-- intervalos es conmutativa.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_interseccion :: Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
prop_interseccion a1 b1 a2 b2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&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&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;
sumaRacional :: (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
sumaRacional (a,b) (c,d) = undefined&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;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.4. Definir la función&lt;br /&gt;
--    cocienteRacional ::  (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
-- tal que &amp;#039;(cocienteRacional x y)&amp;#039; es el cociente de los números racionales&lt;br /&gt;
-- &amp;#039;x&amp;#039; e &amp;#039;y&amp;#039;. Por ejemplo,&lt;br /&gt;
--    cocienteRacional (2,3) (5,6)  ==  (4,5)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cocienteRacional ::  (Int,Int) -&amp;gt; (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
cocienteRacional (x1,x2) (y1,y2) = undefined&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&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;
&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&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&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&lt;br /&gt;
cocienteComplejos :: Complejo -&amp;gt; Complejo -&amp;gt; Complejo&lt;br /&gt;
cocienteComplejos (x1,x2) (y1,y2) = (((x1*y1 + x2*y2)/ t), ((x2*y1 - x1*y2)/t))&lt;br /&gt;
                  where t = (y1^2 + y2^2)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14.4. Definir la función&lt;br /&gt;
--    conjugado :: Complejo -&amp;gt; Complejo&lt;br /&gt;
-- tal que &amp;#039;(conjugado x)&amp;#039; es el conjugado del número complejo &amp;#039;x&amp;#039;. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    conjugado (2,3)  ==  (2.0,-3.0)&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&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;
&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;
-- ----------------------------------------------------------------------------&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&lt;br /&gt;
simetricoH :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoH (x1,x2) = (x1,-x2)&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&lt;br /&gt;
simetricoV :: (Int,Int) -&amp;gt; (Int,Int)&lt;br /&gt;
simetricoV (x1,x2) = (-x1,x2)&lt;br /&gt;
&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 19. Definir la función&lt;br /&gt;
--    distancia :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; Float&lt;br /&gt;
-- tal que &amp;#039;(distancia p1 p2)&amp;#039; es la distancia entre los puntos &amp;#039;p1&amp;#039; y &amp;#039;p2&amp;#039;.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    distancia (1,2) (4,6)  ==  5.0&lt;br /&gt;
-- ----------------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&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&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;
&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&lt;br /&gt;
puntoMedio :: (Float,Float) -&amp;gt; (Float,Float) -&amp;gt; (Float,Float)&lt;br /&gt;
puntoMedio (x1,x2) (y1,y2) = ((x1+y1)/2, (x2+y2)/2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Repaso de operaciones lógicas                                      --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.1. La disyunción excluyente xor de dos fórmulas se&lt;br /&gt;
-- verifica si una es verdadera y la otra es falsa. Su tabla de verdad&lt;br /&gt;
-- es&lt;br /&gt;
--    x     | y     | xor x y&lt;br /&gt;
--    ------+-------+---------&lt;br /&gt;
--    True  | True  | False &lt;br /&gt;
--    True  | False | True&lt;br /&gt;
--    False | True  | True&lt;br /&gt;
--    False | False | False&lt;br /&gt;
--    &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    xor1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor1 x y) es la disyunción excluyente de x e y, calculada a&lt;br /&gt;
-- partir de la tabla de verdad. Usar 4 ecuaciones, una por cada línea&lt;br /&gt;
-- de la tabla. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor1 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor1 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.2. Definir la función &lt;br /&gt;
--    xor2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor2 x y) es la disyunción excluyente de x e y, calculada a&lt;br /&gt;
-- partir de la tabla de verdad y patrones. Usar 2 ecuaciones, una por&lt;br /&gt;
-- cada valor del primer argumento. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor2 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.3. Definir la función &lt;br /&gt;
--    xor3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
-- tal que (xor3 x y) es la disyunción excluyente de x e y, calculada &lt;br /&gt;
-- a partir de la disyunción (||), conjunción (&amp;amp;&amp;amp;) y negación (not). &lt;br /&gt;
-- Usar 1 ecuación. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
xor3 :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xor3 x y = undefined&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;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 22.5. Comprobar con QuickCheck que las cuatro definiciones&lt;br /&gt;
-- de xor son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_xor_equivalentes :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
prop_xor_equivalentes x y = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&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&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&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&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&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&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 else False&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;
-- ---------------------------------------------------------------------&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;
&lt;br /&gt;
xnor :: Bool -&amp;gt; Bool -&amp;gt; Bool&lt;br /&gt;
xnor = undefined&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;
&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;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=128</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=128"/>
		<updated>2021-10-02T12:04:03Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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&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;
--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&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&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;
-- ---------------------------------------------------------------------&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;
&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;
&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;
-- ---------------------------------------------------------------------&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>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=37</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=37"/>
		<updated>2021-09-25T11:21:02Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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, Irene Ortega Moncayo, Laura Arango&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
media3 x y z = (sum [x,y,z])/3&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&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 &lt;br /&gt;
sumaMonedas a b c d e = sum [a, 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;
volumenEsfera r = undefined &lt;br /&gt;
-- Adriana Gordillo Melero, Lucía Hernández, Nicolás Rodríguez Ruiz, Laura Arango&lt;br /&gt;
 volumenEsfera r = (4/3)*pi*r^3&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&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*r2^2 - pi*r1^2&lt;br /&gt;
--Álvaro Cano&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;
-- ---------------------------------------------------------------------&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&lt;br /&gt;
ultimaCifra x = rem x 10&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&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&lt;br /&gt;
rota1 xs = tail xs ++ [head xs]&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&lt;br /&gt;
rota n xs = drop n xs ++ take n xs&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&lt;br /&gt;
rango xs = [minimum xs] ++ [maximum xs]&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&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&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;
&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&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&lt;br /&gt;
finales n xs = drop m xs&lt;br /&gt;
               where m = length xs - n&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;
-- ---------------------------------------------------------------------&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;
&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)&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&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&lt;br /&gt;
tresDiferentes x y z = x/=y &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&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z == True &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&lt;br /&gt;
unicos xs = length (nub 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;
&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&lt;br /&gt;
kMaximo k xs = reverse (sort (nub xs)) !! (k-1)&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&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&lt;br /&gt;
numPares xs = length (nub (filter even xs))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elsdomgon</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=36</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=36"/>
		<updated>2021-09-25T11:20:29Z</updated>

		<summary type="html">&lt;p&gt;Elsdomgon: &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, Irene Ortega Moncayo, Laura Arango&lt;br /&gt;
media3 x y z = (x+y+z)/3&lt;br /&gt;
-- Antonio López García&lt;br /&gt;
media3 x y z = (sum [x,y,z])/3&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&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 &lt;br /&gt;
sumaMonedas a b c d e = sum [a, 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;
volumenEsfera r = undefined &lt;br /&gt;
-- Adriana Gordillo Melero, Lucía Hernández, Nicolás Rodríguez Ruiz, Laura Arango&lt;br /&gt;
 volumenEsfera r = (4/3)*pi*r^3&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&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*r2^2 - pi*r1^2&lt;br /&gt;
--Álvaro Cano&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;
-- ---------------------------------------------------------------------&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&lt;br /&gt;
ultimaCifra x = rem x 10&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&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&lt;br /&gt;
rota1 xs = tail xs ++ [head xs]&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&lt;br /&gt;
rota n xs = drop n xs ++ take n xs&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&lt;br /&gt;
rango xs = [minimum xs] ++ [maximum xs]&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&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&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;
--elsdomgon &lt;br /&gt;
interior xs = init (tail 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&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&lt;br /&gt;
finales n xs = drop m xs&lt;br /&gt;
               where m = length xs - n&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;
-- ---------------------------------------------------------------------&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;
&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)&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&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&lt;br /&gt;
tresDiferentes x y z = x/=y &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&lt;br /&gt;
cuatroIguales x y z u = tresIguales x y z == True &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&lt;br /&gt;
unicos xs = length (nub 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;
&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&lt;br /&gt;
kMaximo k xs = reverse (sort (nub xs)) !! (k-1)&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&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&lt;br /&gt;
numPares xs = length (nub (filter even xs))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elsdomgon</name></author>
	</entry>
</feed>