<?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=Anasoscab</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=Anasoscab"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php/Especial:Contribuciones/Anasoscab"/>
	<updated>2026-07-21T01:26:41Z</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_8&amp;diff=483</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=483"/>
		<updated>2021-11-30T14:24:50Z</updated>

		<summary type="html">&lt;p&gt;Anasoscab: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Rel_8.hs (24 de noviembre de 2021)&lt;br /&gt;
-- Funciones de orden superior y definiciones por plegados.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Esta relación tiene contiene ejercicios con funciones de orden&lt;br /&gt;
-- superior y definiciones por plegado correspondientes al tema 7 &lt;br /&gt;
-- http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-7.html&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función&lt;br /&gt;
--    segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos&lt;br /&gt;
-- elementos verifican la propiedad p. Por ejemplo,&lt;br /&gt;
--    segmentos even [1,2,0,4,9,6,4,5,7,2]  ==  [[2,0,4],[6,4],[2]]&lt;br /&gt;
--    segmentos odd  [1,2,0,4,9,6,4,5,7,2]  ==  [[1],[9],[5,7]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
segmentos1 :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos1 p [] = []&lt;br /&gt;
segmentos1 p (x:xs) | p x = [a] ++ segmentos1 p (dropWhile p (x:xs)) &lt;br /&gt;
                    | otherwise = segmentos1 p xs&lt;br /&gt;
                    where a = takeWhile p (x:xs) &lt;br /&gt;
segmentos :: (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentos p [] = []&lt;br /&gt;
segmentos p (x:xs) &lt;br /&gt;
    | p x =  (takeWhile p (x:xs)) : segmentos p (dropWhile p (x:xs)) &lt;br /&gt;
    | otherwise = segmentos p (dropWhile (not.p) xs)&lt;br /&gt;
                 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir, por comprensión, la función&lt;br /&gt;
--    relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (relacionadosC r xs) se verifica si para todo par (x,y) de&lt;br /&gt;
-- elementos consecutivos de xs se cumple la relación r. Por ejemplo,&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,7,9]                ==  True&lt;br /&gt;
--    relacionadosC (&amp;lt;) [2,3,1,9]                ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
relacionadosC :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC r xs = and [r a b | (a,b) &amp;lt;- zip xs (tail xs)]&lt;br /&gt;
--José Manuel García&lt;br /&gt;
relacionadosC1 :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosC1 r xs = (length [1 | (a,b) &amp;lt;- (zip xs (tail xs)), a `r` b]) ==&lt;br /&gt;
                     (length (zip xs (tail xs)))&lt;br /&gt;
-- ---------------------------------------------------------------------&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;
-- Ana Sosa Caballero&lt;br /&gt;
relacionadosR :: (a -&amp;gt; a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
relacionadosR _ [] = False&lt;br /&gt;
relacionadosR r [x,y] = r x y&lt;br /&gt;
relacionadosR r (x:y:xs) | r x y =  relacionadosR r (y:xs)&lt;br /&gt;
                         | otherwise = False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (agrupa xss) es la lista de las listas obtenidas agrupando&lt;br /&gt;
-- los primeros elementos, los segundos, ... Por ejemplo, &lt;br /&gt;
--    agrupa [[1..6],[7..9],[10..20]]  ==  [[1,7,10],[2,8,11],[3,9,12]]&lt;br /&gt;
--    agrupa []                        ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
agrupa :: Eq a =&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
agrupa [] = []&lt;br /&gt;
agrupa xss | any null xss =  []&lt;br /&gt;
           | otherwise =[map head xss] ++ agrupa (map tail xss) &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickChek que la longitud de todos los&lt;br /&gt;
-- elementos de (agrupa xs) es igual a la longitud de xs.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_agrupa :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_agrupa xss = and [length xs == length xss | xs &amp;lt;- agrupa xss]&lt;br /&gt;
          &lt;br /&gt;
-- La comprobación es quickCheck prop_agrupa&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir, por recursión, la función &lt;br /&gt;
--    concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatR xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatR [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
concatR :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatR [] = []&lt;br /&gt;
concatR (x:xs) = x ++ concatR xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir, por comprensión, la función&lt;br /&gt;
--    filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaC f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaC (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaC :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaC f p xs = [f x | x &amp;lt;- xs, p x]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Definir, usando map y filter, la función&lt;br /&gt;
--    filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaMF f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaMF (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Lucía Hernández, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaMF :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaMF f p xs = map f (filter p xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.3. Definir, por recursión, la función&lt;br /&gt;
--    filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaR f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaR (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaR :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaR f p [] = []&lt;br /&gt;
filtraAplicaR f p (x:xs) | p x        = [f x] ++ filtraAplicaR f p xs&lt;br /&gt;
                         | (not.p) x  = filtraAplicaR f p xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Definir, mediante recursión, la función&lt;br /&gt;
--    maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumR [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumR [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumR [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumR es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR [x] = x&lt;br /&gt;
maximumR (x:xs) = max x (maximumR XS)&lt;br /&gt;
&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
maximumR :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumR [x] = x&lt;br /&gt;
maximumR (x:xs) | x &amp;gt; (head xs) = maximumR (x:(tail xs))&lt;br /&gt;
                | otherwise = maximumR (xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función de plegado foldr1 está definida por &lt;br /&gt;
--    foldr1 :: (a -&amp;gt; a -&amp;gt; a) -&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
--    foldr1 _ [x]    =  x&lt;br /&gt;
--    foldr1 f (x:xs) =  f x (foldr1 f xs)&lt;br /&gt;
-- &lt;br /&gt;
-- Definir, mediante plegado con foldr1, la función&lt;br /&gt;
--    maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
-- tal que (maximumR xs) es el máximo de la lista xs. Por ejemplo,&lt;br /&gt;
--    maximumP [3,7,2,5]                  ==  7&lt;br /&gt;
--    maximumP [&amp;quot;todo&amp;quot;,&amp;quot;es&amp;quot;,&amp;quot;falso&amp;quot;]      ==  &amp;quot;todo&amp;quot;&lt;br /&gt;
--    maximumP [&amp;quot;menos&amp;quot;,&amp;quot;alguna&amp;quot;,&amp;quot;cosa&amp;quot;]  ==  &amp;quot;menos&amp;quot;&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: La función maximumP es equivalente a la predefinida maximum.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez&lt;br /&gt;
maximumP :: Ord a =&amp;gt; [a] -&amp;gt; a&lt;br /&gt;
maximumP xs = foldr1 max xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir, usando foldr, la función &lt;br /&gt;
--    concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatP xss) es la concatenación de las listas de xss. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    concatP [[1,3],[2,4,6],[1,9]]  ==  [1,3,2,4,6,1,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
concatP :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatP xs = foldr (++) [] xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que la funciones concatR,&lt;br /&gt;
-- concatP y concat son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_concat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_concat xss = concatR xss == concat xss &amp;amp;&amp;amp; concatP xss == concat xss&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_concat&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que la longitud de &lt;br /&gt;
-- (concatP xss) es la suma de las longitudes de los elementos de xss.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_longConcat :: [[Int]] -&amp;gt; Bool&lt;br /&gt;
prop_longConcat xss = length (concatP xss) == sum [length xs | xs &amp;lt;- xss]&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es quickCheck prop_longConcat&lt;br /&gt;
-- +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir, por plegado, la función&lt;br /&gt;
--    filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
-- tal que (filtraAplicaP f p xs) es la lista obtenida aplicándole a los&lt;br /&gt;
-- elementos de xs que cumplen el predicado p la función f. Por ejemplo,&lt;br /&gt;
--    filtraAplicaP (4+) (&amp;lt;3) [1..7]  =&amp;gt;  [5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Elsa Domínguez, Ana Sosa Caballero&lt;br /&gt;
filtraAplicaP :: (a -&amp;gt; b) -&amp;gt; (a -&amp;gt; Bool) -&amp;gt; [a] -&amp;gt; [b]&lt;br /&gt;
filtraAplicaP f p xs = foldr g [] xs&lt;br /&gt;
                     where g x recu | p x        = [f x] ++ recu&lt;br /&gt;
                                    | (not.p) x  = recu&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&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>Anasoscab</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_7&amp;diff=480</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=480"/>
		<updated>2021-11-29T18:42:00Z</updated>

		<summary type="html">&lt;p&gt;Anasoscab: &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, Ana Sosa Caballero&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;
-- Ana Sosa Caballero&lt;br /&gt;
subconjuntoR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
subconjuntoR _ [] = False&lt;br /&gt;
subconjuntoR [] _ = True&lt;br /&gt;
subconjuntoR (x:xs) ys = and [elem x 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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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;
-- Ana Sosa Caballero&lt;br /&gt;
unionR :: Eq a =&amp;gt; [a] -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
unionR xs [] = xs&lt;br /&gt;
unionR [] ys = ys&lt;br /&gt;
unionR xs (y:ys) = nub( xs ++ [y] ++ unionR [] ys)&lt;br /&gt;
&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero &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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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 :: Integer -&amp;gt; Bool&lt;br /&gt;
prop_numeroBloquesR n =(abs n) + n^2 == numeroBloquesC (abs n)&lt;br /&gt;
&lt;br /&gt;
prop_numeroBloquesR :: Integer -&amp;gt; Property&lt;br /&gt;
prop_numeroBloquesR n =&lt;br /&gt;
 n&amp;gt;=0 ==&amp;gt; n + n^2 == numeroBloquesC n&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, Ana Sosa Caballero&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;
-- Sara Cerro &lt;br /&gt;
esDigito :: Integer -&amp;gt; Integer -&amp;gt; Bool&lt;br /&gt;
esDigito x n = elem x (convertirLista n)&lt;br /&gt;
convertirLista 0 = []&lt;br /&gt;
convertirLista n = [rem n 10] ++ convertirLista (div n 10) &lt;br /&gt;
&lt;br /&gt;
esDigito1 :: Integer -&amp;gt; Integer -&amp;gt; Bool&lt;br /&gt;
esDigito1 x n = elem  head(show x)  (show 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, Ana Sosa Caballero&lt;br /&gt;
numeroDeDigitos :: Integer -&amp;gt; Int&lt;br /&gt;
numeroDeDigitos x = length(digitos x)&lt;br /&gt;
-- NOTA: PRUEBA CON SHOW&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
numeroDeDigitos1 :: Integer -&amp;gt; Int&lt;br /&gt;
numeroDeDigitos1 x = sum [  1  | x &amp;lt;- cifras x]&lt;br /&gt;
cifras x = [read [c] :: Int | c &amp;lt;- show 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, Ana Sosa Caballero&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, Ana Sosa Caballero&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;
-- AYUDA: HAZ RECURSIÓN EN EL SEGUNDO NÚMERO &lt;br /&gt;
pegaNumerosR :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
pegaNumerosR x y = undefined&lt;br /&gt;
-- T: DOS OPCIONES&lt;br /&gt;
pegaNumerosR1 :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
pegaNumerosR1 x y = x * 10^length(digitosR y) + y&lt;br /&gt;
-- Sin usar dígitos recursiva, me da igual trabajar con caracteres ya que --- no voy a operar como números&lt;br /&gt;
pegaNumerosR2 :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
pegaNumerosR2 x y = x * 10^(length (show y)) + y&lt;br /&gt;
-- Definición de pN recursiva:&lt;br /&gt;
pN x y | y&amp;lt;10 = x*10 + y&lt;br /&gt;
       | otherwise = (pN x (div y 10) ) * 10 + rem y 10&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;
-- T:&lt;br /&gt;
-- ESA USA RECURSIÓN YA QUE DIGITOS ES RECURSIVA&lt;br /&gt;
-- PRUEBA A USAR SHOW READ o bien listanumeroR:&lt;br /&gt;
pegaNumerosNR1 :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
pegaNumerosNR1 x y = read (show x ++ show y)&lt;br /&gt;
&lt;br /&gt;
pegaNumerosNR :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
pegaNumerosNR x y = listaNumeroR (digitosR x ++ digitosR y)&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, Ana Sosa Caballero&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, Ana Sosa Caballero &lt;br /&gt;
primerDigitoNR :: Integer -&amp;gt; Integer&lt;br /&gt;
primerDigitoNR n = head (digitos n) -- digitos era recursiva&lt;br /&gt;
pDNR n = read [(head (show n))] -- esta es sin recursión&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, Ana Sosa Caballero &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, Ana Sosa Caballero &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 = read (reverse (show n))&lt;br /&gt;
-- Mejor:&lt;br /&gt;
inverso&amp;#039; = read.reverse.show&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 los dígitos de 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, Ana Sosa Caballero &lt;br /&gt;
capicua :: Integer -&amp;gt; Bool&lt;br /&gt;
capicua n = reverse(digitos n) == digitos n&lt;br /&gt;
cap n = inverso&amp;#039; n == n&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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 equivalentes 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 = media1 x == media1 y&lt;br /&gt;
media1 x = sum(digitos x)  / fromIntegral( length (show x))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 27. Un número x es especial si el número de ocurrencias 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 = and [ocur d (x^2) == 2*(ocur d x)| d &amp;lt;-digitos x]&lt;br /&gt;
ocur x n = sum[1 | y &amp;lt;-digitos n, x==y]&lt;br /&gt;
-- El cálculo es&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anasoscab</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_6&amp;diff=419</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=419"/>
		<updated>2021-11-17T08:39:07Z</updated>

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

		<summary type="html">&lt;p&gt;Anasoscab: &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_5.hs (29 de octubre de 2021)&lt;br /&gt;
-- Definiciones por comprensión con cadenas: El cifrado César.&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 el tema 5, cuyas transparencias se encuentran en &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-5.pdf&lt;br /&gt;
-- se estudió, como aplicación de las definiciones por comprensión, el&lt;br /&gt;
-- cifrado César. El objetivo de esta relación es modificar el programa&lt;br /&gt;
-- de cifrado César para que pueda utilizar también letras&lt;br /&gt;
-- mayúsculas. Por ejemplo,  &lt;br /&gt;
--    ghci&amp;gt; descifra &amp;quot;Ytit Ufwf Sfif&amp;quot;&lt;br /&gt;
--    &amp;quot;Todo Para Nada&amp;quot;&lt;br /&gt;
-- Para ello, se propone la modificación de las funciones correspondientes&lt;br /&gt;
-- del tema 5.&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 Data.Char&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1. Definir la función&lt;br /&gt;
--    minuscula2int :: Char -&amp;gt; Int&lt;br /&gt;
-- tal que (minuscula2int c) es el entero correspondiente a la letra&lt;br /&gt;
-- minúscula c. Por ejemplo, &lt;br /&gt;
--    minuscula2int &amp;#039;a&amp;#039;  ==  0&lt;br /&gt;
--    minuscula2int &amp;#039;d&amp;#039;  ==  3&lt;br /&gt;
--    minuscula2int &amp;#039;z&amp;#039;  ==  25&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
minuscula2int :: Char -&amp;gt; Int&lt;br /&gt;
minuscula2int c = ord c - ord &amp;#039;a&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función&lt;br /&gt;
--    mayuscula2int :: Char -&amp;gt; Int&lt;br /&gt;
-- tal que (mayuscula2int c) es el entero correspondiente a la letra&lt;br /&gt;
-- mayúscula c. Por ejemplo, &lt;br /&gt;
--    mayuscula2int &amp;#039;A&amp;#039;  ==  0&lt;br /&gt;
--    mayuscula2int &amp;#039;D&amp;#039;  ==  3&lt;br /&gt;
--    mayuscula2int &amp;#039;Z&amp;#039;  ==  25&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
mayuscula2int :: Char -&amp;gt; Int&lt;br /&gt;
mayuscula2int = undefined&lt;br /&gt;
&lt;br /&gt;
-- Ana Sosa Caballero &lt;br /&gt;
mayuscula2int :: Char -&amp;gt; Int&lt;br /&gt;
mayuscula2int x  = ord x - ord &amp;#039;A&amp;#039;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Definir la función&lt;br /&gt;
--    int2minuscula :: Int -&amp;gt; Char&lt;br /&gt;
-- tal que (int2minuscula n) es la letra minúscula correspondiente al&lt;br /&gt;
-- entero n. Por ejemplo, &lt;br /&gt;
--    int2minuscula 0   ==  &amp;#039;a&amp;#039;&lt;br /&gt;
--    int2minuscula 3   ==  &amp;#039;d&amp;#039;&lt;br /&gt;
--    int2minuscula 25  ==  &amp;#039;z&amp;#039;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
int2minuscula :: Int -&amp;gt; Char&lt;br /&gt;
int2minuscula n = chr (ord &amp;#039;a&amp;#039; + n)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Definir la función&lt;br /&gt;
--    int2mayuscula :: Int -&amp;gt; Char&lt;br /&gt;
-- tal que (int2mayuscula n) es la letra minúscula correspondiente al&lt;br /&gt;
-- entero n. Por ejemplo, &lt;br /&gt;
--    int2mayuscula 0   ==  &amp;#039;A&amp;#039;&lt;br /&gt;
--    int2mayuscula 3   ==  &amp;#039;D&amp;#039;&lt;br /&gt;
--    int2mayuscula 25  ==  &amp;#039;Z&amp;#039;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
int2mayuscula :: Int -&amp;gt; Char&lt;br /&gt;
int2mayuscula x = chr (x + ord &amp;#039;A&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Definir la función&lt;br /&gt;
--    desplaza :: Int -&amp;gt; Char -&amp;gt; Char&lt;br /&gt;
-- tal que (desplaza n c) es el carácter obtenido desplazando n&lt;br /&gt;
-- caracteres el carácter c. Por ejemplo, &lt;br /&gt;
--    desplaza   3  &amp;#039;a&amp;#039;  ==  &amp;#039;d&amp;#039;&lt;br /&gt;
--    desplaza   3  &amp;#039;y&amp;#039;  ==  &amp;#039;b&amp;#039;&lt;br /&gt;
--    desplaza (-3) &amp;#039;d&amp;#039;  ==  &amp;#039;a&amp;#039;&lt;br /&gt;
--    desplaza (-3) &amp;#039;b&amp;#039;  ==  &amp;#039;y&amp;#039;&lt;br /&gt;
--    desplaza   3  &amp;#039;A&amp;#039;  ==  &amp;#039;D&amp;#039;&lt;br /&gt;
--    desplaza   3  &amp;#039;Y&amp;#039;  ==  &amp;#039;B&amp;#039;&lt;br /&gt;
--    desplaza (-3) &amp;#039;D&amp;#039;  ==  &amp;#039;A&amp;#039;&lt;br /&gt;
--    desplaza (-3) &amp;#039;B&amp;#039;  ==  &amp;#039;Y&amp;#039;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Extender a mayúsculas&lt;br /&gt;
desplaza :: Int -&amp;gt; Char -&amp;gt; Char&lt;br /&gt;
desplaza n c &lt;br /&gt;
    | elem c [&amp;#039;a&amp;#039;..&amp;#039;z&amp;#039;] = int2minuscula ((minuscula2int c+n) `mod` 26)&lt;br /&gt;
    | otherwise         = c&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Definir la función&lt;br /&gt;
--    codifica :: Int -&amp;gt; String -&amp;gt; String&lt;br /&gt;
-- tal que (codifica n xs) es el resultado de codificar el texto xs con&lt;br /&gt;
-- un desplazamiento n. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; codifica   3  &amp;quot;En Todo La Medida&amp;quot; &lt;br /&gt;
--    &amp;quot;Hq Wrgr Od Phglgd&amp;quot;&lt;br /&gt;
--    ghci&amp;gt; codifica (-3) &amp;quot;Hq Wrgr Od Phglgd&amp;quot;&lt;br /&gt;
--    &amp;quot;En Todo La Medida&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
codifica :: Int -&amp;gt; String -&amp;gt; String&lt;br /&gt;
codifica n xs = [desplaza n x | x &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Comprobar con QuickCheck que para cualquier entero n y&lt;br /&gt;
-- cualquier cadena cs se tiene que (codifica (-n) (codifica n cs)) es&lt;br /&gt;
-- igual a cs.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_codifica :: Int -&amp;gt; String -&amp;gt; Bool&lt;br /&gt;
prop_codifica = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7 (resuelto). Definir la función&lt;br /&gt;
--    tabla :: [Float]&lt;br /&gt;
-- tal que tabla es la lista de la frecuencias de las letras en&lt;br /&gt;
-- castellano, Por ejemplo, la frecuencia de la &amp;#039;a&amp;#039; es del 12.53%, la de&lt;br /&gt;
-- la &amp;#039;b&amp;#039; es 1.42%. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
tabla :: [Float]&lt;br /&gt;
tabla = [12.53, 1.42, 4.68, 5.86, 13.68, 0.69, 1.01, &lt;br /&gt;
          0.70, 6.25, 0.44, 0.01,  4.97, 3.15, 6.71, &lt;br /&gt;
          8.68, 2.51, 0.88, 6.87,  7.98, 4.63, 3.93, &lt;br /&gt;
          0.90, 0.02, 0.22, 0.90,  0.52]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8. Definir la función&lt;br /&gt;
--    porcentaje :: Int -&amp;gt; Int -&amp;gt; Float&lt;br /&gt;
-- tal que (porcentaje n m) es el porcentaje de n sobre m. Por ejemplo,&lt;br /&gt;
--    porcentaje 2 5  ==  40.0  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
porcentaje :: Int -&amp;gt; Int -&amp;gt; Float&lt;br /&gt;
porcentaje n m = (fromIntegral n / fromIntegral m) * 100&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Definir la función&lt;br /&gt;
--    letras :: String -&amp;gt; String&lt;br /&gt;
-- tal que (letras xs) es la cadena formada por las letras de la cadena&lt;br /&gt;
-- xs. Por ejemplo,  &lt;br /&gt;
--    letras &amp;quot;Esto Es Una Prueba&amp;quot;  ==  &amp;quot;EstoEsUnaPrueba&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Extender a mayúsculas&lt;br /&gt;
letras :: String -&amp;gt; String&lt;br /&gt;
letras xs = [x | x &amp;lt;- xs, elem x [&amp;#039;a&amp;#039;..&amp;#039;z&amp;#039;]]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.1. Definir la función&lt;br /&gt;
--    ocurrencias :: Eq a =&amp;gt; a -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
-- tal que (ocurrencias x xs) es el número de veces que ocurre el&lt;br /&gt;
-- elemento x en la lista xs. Por ejemplo, &lt;br /&gt;
--    ocurrencias &amp;#039;a&amp;#039; &amp;quot;Salamanca&amp;quot;  ==  4  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ocurrencias :: Eq a =&amp;gt; a -&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
ocurrencias x xs = length [x&amp;#039; | x&amp;#039; &amp;lt;- xs, x == x&amp;#039;]  &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.2. Comprobar con QuickCheck si el número de ocurrencias&lt;br /&gt;
-- de un elemento x en una lista xs es igual que en su inversa.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es &lt;br /&gt;
prop_ocurrencia_inv :: Int -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_ocurrencia_inv = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.3. Comprobar con QuickCheck si el número de ocurrencias&lt;br /&gt;
-- de un elemento x en la concatenación de las listas xs e ys es igual a&lt;br /&gt;
-- la suma del número de ocurrencias de x en xs y en ys.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_ocurrencia_conc :: Int -&amp;gt; [Int] -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_ocurrencia_conc = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12. Definir la función&lt;br /&gt;
--    frecuencias :: String -&amp;gt; [Float]&lt;br /&gt;
-- tal que (frecuencias xs) es la frecuencia de cada una de las letras&lt;br /&gt;
-- de la cadena xs. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; frecuencias &amp;quot;En Todo La Medida&amp;quot;&lt;br /&gt;
--    [14.3,0,0,21.4,14.3,0,0,0,7.1,0,0,7.1,&lt;br /&gt;
--     7.1,7.1,14.3,0,0,0,0,7.1,0,0,0,0,0,0]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
frecuencias :: String -&amp;gt; [Float]&lt;br /&gt;
frecuencias xs = &lt;br /&gt;
    [porcentaje (ocurrencias x xs&amp;#039;) n | x &amp;lt;- [&amp;#039;a&amp;#039;..&amp;#039;z&amp;#039;]]&lt;br /&gt;
    where xs&amp;#039; = [toLower x | x &amp;lt;- xs]&lt;br /&gt;
          n   = length (letras xs)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.1. Definir la función&lt;br /&gt;
--    chiCuad :: [Float] -&amp;gt; [Float] -&amp;gt; Float&lt;br /&gt;
-- tal que (chiCuad os es) es la medida chi cuadrado de las&lt;br /&gt;
-- distribuciones os y es. Por ejemplo, &lt;br /&gt;
--    chiCuad [3,5,6] [3,5,6]  ==  0.0&lt;br /&gt;
--    chiCuad [3,5,6] [5,6,3]  ==  3.9666667&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
chiCuad :: [Float] -&amp;gt; [Float] -&amp;gt; Float&lt;br /&gt;
chiCuad os es = sum [((o-e)^2)/e | (o,e) &amp;lt;- zip os es]&lt;br /&gt;
&lt;br /&gt;
-- Evita que si alguna lista tiene un cero, haskell divida entre 0 (= Infinity)&lt;br /&gt;
chiCuad&amp;#039; :: [Float] -&amp;gt; [Float] -&amp;gt; Float&lt;br /&gt;
chiCuad&amp;#039; os es = if elem 0 os then sum [((o - e)^2)/e | (o,e)&amp;lt;-zip os es]&lt;br /&gt;
  else if elem 0 es then sum [((e - o)^2)/o | (o,e)&amp;lt;-zip os es]&lt;br /&gt;
  else sum [((o - e)^2)/e | (o,e)&amp;lt;-zip os es]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.2, Comprobar con QuickCheck que para cualquier par de&lt;br /&gt;
-- listas xs e ys se verifica que (chiCuad xs ys) es 0 y xs e ys son&lt;br /&gt;
-- iguales. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_chiCuad_1 :: [Float] -&amp;gt; [Float] -&amp;gt; Bool&lt;br /&gt;
prop_chiCuad_1 = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. A la vista de los contraejemplos del apartado&lt;br /&gt;
-- anterior, qué condición hay que añadir para que se verifique la&lt;br /&gt;
-- propiedad.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_chiCuad_2 :: [Float] -&amp;gt; [Float] -&amp;gt; Property&lt;br /&gt;
prop_chiCuad_2 = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13.3. A la vista del apartado anterior, el número de tests&lt;br /&gt;
-- que ha pasado puede ser menor que 100. Reescribir la propiedad de&lt;br /&gt;
-- forma que se verifique en los 100 tests.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_chiCuad_3 :: [Float] -&amp;gt; [Float] -&amp;gt; Bool&lt;br /&gt;
prop_chiCuad_3 = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14.1. Definir la función&lt;br /&gt;
--    rota :: Int -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (rota n xs) es la lista obtenida rotando n posiciones los&lt;br /&gt;
-- elementos de la lista xs. Por ejemplo, &lt;br /&gt;
--    rota  2 &amp;quot;manolo&amp;quot;              ==  &amp;quot;noloma&amp;quot;  &lt;br /&gt;
--    rota 10 &amp;quot;manolo&amp;quot;              ==  &amp;quot;lomano&amp;quot;&lt;br /&gt;
--    [rota n &amp;quot;abc&amp;quot; | n &amp;lt;- [0..5]]  ==  [&amp;quot;abc&amp;quot;,&amp;quot;bca&amp;quot;,&amp;quot;cab&amp;quot;,&amp;quot;abc&amp;quot;,&amp;quot;bca&amp;quot;,&amp;quot;cab&amp;quot;]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
chiCuad :: [Float] -&amp;gt; [Float] -&amp;gt; Float&lt;br /&gt;
chiCuad os es = sum [((o-e)^2)/e | (o,e) &amp;lt;- zip os es]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14.2. Comprobar con QuickCkeck si para cualquier lista xs&lt;br /&gt;
-- si se rota n veces y el resultado se rota m veces se obtiene lo mismo&lt;br /&gt;
-- que rotando xs (n+m) veces, donde n y m son números no nulos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_rota :: Int -&amp;gt; Int -&amp;gt; [Int] -&amp;gt; Property&lt;br /&gt;
prop_rota = undefined&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 15.1. Definir la función&lt;br /&gt;
--    descifra :: String -&amp;gt; String&lt;br /&gt;
-- tal que (descifra xs) es la cadena obtenida descodificando la cadena&lt;br /&gt;
-- xs por el anti-desplazamiento que produce una distribución de letras&lt;br /&gt;
-- con la menor deviación chi cuadrado respecto de la tabla de&lt;br /&gt;
-- distribución de las letras en castellano. Por ejemplo, &lt;br /&gt;
--    ghci&amp;gt; codifica 5 &amp;quot;Todo Para Nada&amp;quot;&lt;br /&gt;
--    &amp;quot;Ytit Ufwf Sfif&amp;quot;&lt;br /&gt;
--    ghci&amp;gt; descifra &amp;quot;Ytit Ufwf Sfif&amp;quot;&lt;br /&gt;
--    &amp;quot;Todo Para Nada&amp;quot;&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
descifra :: String -&amp;gt; String&lt;br /&gt;
descifra xs =  codifica (-factor) xs&lt;br /&gt;
    where factor = head (posiciones (minimum tabChi) tabChi)&lt;br /&gt;
          tabChi = [chiCuad (rota n tabla&amp;#039;) tabla | n &amp;lt;- [0..25]]&lt;br /&gt;
          tabla&amp;#039; = frecuencias xs&lt;br /&gt;
&lt;br /&gt;
posiciones :: Eq a =&amp;gt; a -&amp;gt; [a] -&amp;gt; [Int]&lt;br /&gt;
posiciones x xs = &lt;br /&gt;
    [i | (x&amp;#039;,i) &amp;lt;- zip xs [0..], x == x&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anasoscab</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_4&amp;diff=415</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=415"/>
		<updated>2021-11-17T08:24:50Z</updated>

		<summary type="html">&lt;p&gt;Anasoscab: &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, Ana Sánchez Martín&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;
-- Ana Sosa Caballero&lt;br /&gt;
divisoresPrimos :: Int -&amp;gt; [Int]&lt;br /&gt;
divisoresPrimos x = [ n | n &amp;lt;- divisores x, primo n]&lt;br /&gt;
&lt;br /&gt;
divisores x = [ n | n &amp;lt;- [1..x] , mod x n == 0]&lt;br /&gt;
&lt;br /&gt;
primo x = divisores x == [1,x]&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, Adolfo Sagrera Vivancos&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;
-- Ana Sánchez Martín&lt;br /&gt;
libreDeCuadrados :: Int -&amp;gt; Bool&lt;br /&gt;
libreDeCuadrados n = n == product([x |x &amp;lt;- divisores n, primo x])&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, Adolfo Sagrera Vivancos&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;
-- Ana Sánchez Martín&lt;br /&gt;
amigos4 :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
amigos4 a b = a /= b &amp;amp;&amp;amp; sum (init(divisores a)) == b &amp;amp;&amp;amp; sum (init(divisores b)) == a&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
amigos :: Int -&amp;gt; Int -&amp;gt; Bool&lt;br /&gt;
amigos a b = and [ d(a) == b, d(b) == a, a/= b]&lt;br /&gt;
&lt;br /&gt;
divisores&amp;#039; x = [ n | n &amp;lt;- [1..x-1] , mod x n == 0]&lt;br /&gt;
&lt;br /&gt;
d(n) = sum (divisores&amp;#039; n)&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;
--  Ana Sánchez Martín&lt;br /&gt;
esCuadrado x = or [x == n^2 | n &amp;lt;- [1..x]]&lt;br /&gt;
especial :: Int -&amp;gt; Bool&lt;br /&gt;
especial x = esCuadrado (sum (map (^2) (divisores x)))&lt;br /&gt;
especiales3 = [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, Ana Sánchez Martín&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;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
multiplicidad2 :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
multiplicidad2 1 _ = 1&lt;br /&gt;
multiplicidad2 x y = last [s | s &amp;lt;- [0..y], rem y (x^s) == 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;
--Nicolás Rodríguez Ruiz, Lucía Hernández, Elsa Domínguez, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero&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, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero&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, Adolfo Sagrera Vivancos, Ana Sánchez Martín&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, Adolfo Sagrera Vivancos&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, Ana Sánchez Martín&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;
-- Ana Sosa Caballero&lt;br /&gt;
angelini :: Integer -&amp;gt; Bool&lt;br /&gt;
angelini n =  or [ x == y | x &amp;lt;- digitos n, y &amp;lt;- digitos (2*n)]&lt;br /&gt;
&lt;br /&gt;
digitos 0 = []&lt;br /&gt;
digitos n = digitos (div n 10 ) ++ [rem n 10]&lt;br /&gt;
&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, Adolfo Sagrera Vivancos, Ana Sánchez Martín&lt;br /&gt;
repetir x n  = sum [x*10^i | i&amp;lt;-[0..n-1]] &lt;br /&gt;
unitarios :: Int -&amp;gt; [Int]&lt;br /&gt;
unitarios x = [ (repetir x n) | n&amp;lt;- [1..]]&lt;br /&gt;
&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, Ana Sánchez Martín, Adolfo Sagrera Vivancos&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, Ana Sánchez Martín&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;
--Manuel ALcaide &lt;br /&gt;
agrup xs = group (sort xs)&lt;br /&gt;
&lt;br /&gt;
vecesqueaparecen xs = nub [(n,length v)|n&amp;lt;-xs,v&amp;lt;- agrup xs, elem n v]&lt;br /&gt;
&lt;br /&gt;
listapoyo xs = [(g,h)|g&amp;lt;-(xs),(l,h)&amp;lt;-(vecesqueaparecen xs),g==l]&lt;br /&gt;
&lt;br /&gt;
masOcurrentes&amp;#039;&amp;#039; :: Ord a =&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
masOcurrentes&amp;#039;&amp;#039; xs&lt;br /&gt;
   |length (nub [m|(_,m)&amp;lt;-(vecesqueaparecen xs)]) == 1 = xs&lt;br /&gt;
   |otherwise = [p|(p,q)&amp;lt;-(listapoyo xs) , q == maximum ([m|(_,m)&amp;lt;-(vecesqueaparecen xs)])]&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
masOcurrentes :: Ord a =&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
masOcurrentes xs = [x | x &amp;lt;- xs, longitud xs == veces x xs]&lt;br /&gt;
ordenados xs = group (sort xs)&lt;br /&gt;
longitud xs = maximum [length n | n &amp;lt;- ordenados xs]&lt;br /&gt;
veces n xs = sum[1 | a &amp;lt;- xs, n == 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, Adolfo Sagrera Vivancos, Ana Sánchez Martín, Ana Sosa Caballero&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, Ana Sánchez Martín&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;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
deBaseABase10&amp;#039; :: Int -&amp;gt; [Int] -&amp;gt; Int&lt;br /&gt;
deBaseABase10&amp;#039; b xs = sum[ n*(b^c) | (n,c) &amp;lt;- posicion xs]&lt;br /&gt;
posicion xs = zip xs [0..]&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, Ana Sánchez Martín&lt;br /&gt;
conPos1 :: [a] -&amp;gt; [(a,Int)]&lt;br /&gt;
conPos1 xs = zip xs [0..length xs-1]&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
conPos&amp;#039; :: [a] -&amp;gt; [(a,Int)]&lt;br /&gt;
conPos&amp;#039; xs = zip xs [0..]&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, Ana Sánchez Martín, Adolfo Sagrera Vivancos&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, Adolfo Sagrera Vivancos&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;
-- Ana Sánchez Martín&lt;br /&gt;
productoEscalar xs ys = sum [a*x | (a,x) &amp;lt;- zip xs ys]&lt;br /&gt;
-- Una vez tengamos la función productoEscalar hacemos perpendiculares&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, productoEscalar xs ys == 0]&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, Ana Sánchez Martín, Adolfo Sagrera Vivancos&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, Ana Sánchez Martín&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;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
longCamino1 :: [(Float,Float)] -&amp;gt; Float&lt;br /&gt;
longCamino1 xs = sum [ sqrt ((c-a)^2 + ((d-b)^2)) | ((a,b),(c,d)) &amp;lt;- agrupa xs]&lt;br /&gt;
agrupa xs = zip (init xs) (tail xs)&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;
-- Prof; posibles soluciones&lt;br /&gt;
-- 1ª solución (con índices)&lt;br /&gt;
numeroConsecutivosC :: (Num a, Eq a) =&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
numeroConsecutivosC xs&lt;br /&gt;
    | null ys   = length xs&lt;br /&gt;
    | otherwise = head ys&lt;br /&gt;
    where ys = [n | n &amp;lt;- [1..length xs -1], xs !! n /= 1 + xs !! (n-1)]&lt;br /&gt;
&lt;br /&gt;
-- 2ª solución (con zip3)&lt;br /&gt;
numeroConsecutivosC2 :: (Num a, Eq a) =&amp;gt; [a] -&amp;gt; Int&lt;br /&gt;
numeroConsecutivosC2 [] = 0&lt;br /&gt;
numeroConsecutivosC2 [x] = 1&lt;br /&gt;
numeroConsecutivosC2 [x,y] | x+1 == y  = 2&lt;br /&gt;
                           | otherwise = 1&lt;br /&gt;
numeroConsecutivosC2 xs =&lt;br /&gt;
    head [k | (x,y,k) &amp;lt;- zip3 xs (tail xs) [1..], y /= x+1]&lt;br /&gt;
--Adolfo Sagrera Vivancos&lt;br /&gt;
numeroConsecutivos xs = sum [ 1  | (a,b) &amp;lt;- posicion1 xs, a == b]&lt;br /&gt;
posicion1 xs = zip xs [1..]&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, Ana Sánchez Martín&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;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
sumaEquidistantes xs = nub [ a+b   | (a,b) &amp;lt;- agrupa1 xs]&lt;br /&gt;
agrupa1 xs = (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, Ana Sánchez Martín, Adolfo Sagrera Vivancos&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;
-- Prof: otra opción&lt;br /&gt;
esCuadratica :: [Int] -&amp;gt; Bool&lt;br /&gt;
esCuadratica xs = and [abs (a-b) == x^2 | (a,b,x) &amp;lt;- zip3 (tail xs) xs [1..]]&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, Ana Sánchez Martín&lt;br /&gt;
ultima, primera :: Int -&amp;gt; Int  &lt;br /&gt;
ultima n  = rem n 10&lt;br /&gt;
primera n =  read [head (show n)]  &lt;br /&gt;
-- prof: también con digitToInt de Data.Char&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
ultima1 n  = last(cifras n)&lt;br /&gt;
primera1 n = head (cifras n)&lt;br /&gt;
&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, Ana Sánchez Martín, Adolfo Sagrera Vivancos&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>Anasoscab</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_3&amp;diff=300</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=300"/>
		<updated>2021-10-23T11:03:38Z</updated>

		<summary type="html">&lt;p&gt;Anasoscab: &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 [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. 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&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&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>Anasoscab</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_2&amp;diff=143</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=143"/>
		<updated>2021-10-06T12:00:07Z</updated>

		<summary type="html">&lt;p&gt;Anasoscab: &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&lt;br /&gt;
divisionSegura :: Double -&amp;gt; Double -&amp;gt; Double&lt;br /&gt;
divisionSegura  x y = if y == 0 then 9999 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&lt;br /&gt;
intercambia :: (a,b) -&amp;gt; (b,a)&lt;br /&gt;
intercambia (a,b) = (b,a)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Comprobar con QuickCheck que la función intercambia es&lt;br /&gt;
-- idempotente; es decir, si se aplica dos veces es lo mismo que no&lt;br /&gt;
-- aplicarla ninguna.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ana Sosa Caballero&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;
&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&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&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;
&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;
&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>Anasoscab</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=55</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=55"/>
		<updated>2021-09-29T06:59:11Z</updated>

		<summary type="html">&lt;p&gt;Anasoscab: &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, Ana Sosa Caballero, Adolfo Sagrera Vivancos, Pelayo INfante Pérez&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;
media3 x y z = (x+y+z)/3&lt;br /&gt;
-- Francisco José Espinosa&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2. Definir la función sumaMonedas tal que &lt;br /&gt;
-- (sumaMonedas a b c d e) es la suma de los euros correspondientes a &lt;br /&gt;
-- a monedas de 1 euro, b de 2 euros, c de 5 euros, d 10 euros y&lt;br /&gt;
-- e de 20 euros. Por ejemplo,&lt;br /&gt;
--    sumaMonedas 0 0 0 0 1  ==  20&lt;br /&gt;
--    sumaMonedas 0 0 8 0 3  == 100&lt;br /&gt;
--    sumaMonedas 1 1 1 1 1  ==  38&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaMonedas a b c d e = undefined&lt;br /&gt;
-- Adriana Gordillo Melero, Nicolás Rodríguez Ruiz, Lucía Hernández, Laura Arango, Ana Sosa Caballero&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;
-- Adolfo Sagrera Vivancos, Lucía González, Pelayo Infante, Francisco José Espinosa&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;
volumenEsfera r = undefined &lt;br /&gt;
-- Adriana Gordillo Melero, Lucía Hernández, Nicolás Rodríguez Ruiz, Laura Arango, Ana Sosa Caballero, Antonio López García, Lucía González, Pelayo Infante &lt;br /&gt;
 volumenEsfera r = (4/3)*pi*r^3&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
volumenEsfera r =(4/3)*(pi*r^3) &lt;br /&gt;
volumenEsfera r = pi*(r^3)*4/3&lt;br /&gt;
-- Francisco José Espinosa&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&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*r2^2 - pi*r1^2&lt;br /&gt;
--Álvaro Cano, Ana Sosa Caballero&lt;br /&gt;
areaDeCoronaCircular r1 r2 = pi*(r2^2-r1^2)&lt;br /&gt;
--Laura Arango&lt;br /&gt;
areaDeCoronaCircular r1 r2 = areaCirculo r2 - areaCirculo r1&lt;br /&gt;
                             where areaCirculo r = pi*r^2&lt;br /&gt;
--Adolfo Sagrera Vivancos, Pelayo INfante , Francisco José Espinosa&lt;br /&gt;
areaDeCoronaCircular r1 r2 = (pi*r2^2)-(pi*r1^2)&lt;br /&gt;
-- ---------------------------------------------------------------------&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&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, Adriana Gordillo&lt;br /&gt;
maxTres x y z = max(max x y)(z)&lt;br /&gt;
-- Ana Sosa Caballero&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&lt;br /&gt;
maxTres x y z = maximum [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 &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&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&lt;br /&gt;
rango xs = [minimum xs] ++ [maximum XS]&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García&lt;br /&gt;
rango xs = [minimum xs, maximum xs]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- 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&lt;br /&gt;
palindromo xs = xs == reverse xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Definir la función interior tal que (interior xs) es la&lt;br /&gt;
-- lista obtenida eliminando los extremos de la lista xs. Por ejemplo,&lt;br /&gt;
--    interior [2,5,3,7,3]  ==  [5,3,7]&lt;br /&gt;
--    interior [2..7]       ==  [3,4,5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández, Ana Sosa Caballero&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&lt;br /&gt;
interior xs = init (tail 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, 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&lt;br /&gt;
finales n xs = drop (length xs - n) xs&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. Definir la función segmento tal que (segmento m n xs) es&lt;br /&gt;
-- la lista de los elementos de xs comprendidos entre las posiciones m y&lt;br /&gt;
-- n. Por ejemplo,&lt;br /&gt;
--    segmento 3 4 [3,4,1,2,7,9,0]  ==  [1,2]&lt;br /&gt;
--    segmento 3 5 [3,4,1,2,7,9,0]  ==  [1,2,7]&lt;br /&gt;
--    segmento 5 3 [3,4,1,2,7,9,0]  ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
--Laura Arango&lt;br /&gt;
segmento m n xs = drop (m-1) (reverse (drop a ys))&lt;br /&gt;
                  where a  = length xs - n&lt;br /&gt;
                        ys = reverse XS&lt;br /&gt;
-- Ana Sosa Caballero, Antonio López García &lt;br /&gt;
segmento m n xs = drop (m-1) (take n 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;
-- Ana Sosa Caballero, Lucía Hernández&lt;br /&gt;
extremos n xs = take n xs ++ reverse (take n (reverse xs))&lt;br /&gt;
&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, Ana Sosa Caballero&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;
-- Ana Sosa Caballero&lt;br /&gt;
tresDiferentes x y z = and [x/=y, y/=z, x/=z]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 18. Definir la función cuatroIguales tal que &lt;br /&gt;
-- (cuatroIguales x y z u) se verifica si los elementos x, y, z y u son&lt;br /&gt;
-- iguales. Por ejemplo, &lt;br /&gt;
--    cuatroIguales 5 5 5 5   ==  True&lt;br /&gt;
--    cuatroIguales 5 5 4 5   ==  False&lt;br /&gt;
-- Indicación: Usar la función tresIguales.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero&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;
-- ---------------------------------------------------------------------&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;
-- 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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 21. Definir la función kMaximo, tal que (kMaximo n xs) &lt;br /&gt;
-- devuelve el k-máximo elemento de xs (es decir, el que está en la&lt;br /&gt;
-- posición k de valores más altos), obviando repeticiones. Por ejemplo, &lt;br /&gt;
--    kMaximo 2 [6,9,2,4]  == 6&lt;br /&gt;
--    kMaximo 3 [10,9,8,10,5]  == 8&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero&lt;br /&gt;
kMaximo k xs = reverse (sort (nub xs)) !! (k-1)&lt;br /&gt;
&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&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;
-- Ana Sosa Caballero&lt;br /&gt;
numPares xs = length(group (sort (filter even xs)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anasoscab</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_1&amp;diff=41</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=41"/>
		<updated>2021-09-26T08:08:24Z</updated>

		<summary type="html">&lt;p&gt;Anasoscab: &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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Ana Sosa Caballero&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, Adriana Gordillo&lt;br /&gt;
maxTres x y z = max(max x y)(z)&lt;br /&gt;
-- Ana Sosa Caballero&lt;br /&gt;
maxTres x y z = max x t&lt;br /&gt;
                where t = max 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 &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, Adriana Gordillo, Ana Sosa Caballero&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&lt;br /&gt;
rango xs = [minimum xs] ++ [maximum XS]&lt;br /&gt;
-- Ana Sosa Caballero&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, Ana Sosa Caballero&lt;br /&gt;
palindromo xs = xs == reverse xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11. Definir la función interior tal que (interior xs) es la&lt;br /&gt;
-- lista obtenida eliminando los extremos de la lista xs. Por ejemplo,&lt;br /&gt;
--    interior [2,5,3,7,3]  ==  [5,3,7]&lt;br /&gt;
--    interior [2..7]       ==  [3,4,5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
--Lucía Hernández, Ana Sosa Caballero&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&lt;br /&gt;
interior xs = init (tail 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, Ana Sosa Caballero&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;
-- Ana Sosa Caballero&lt;br /&gt;
segmento m n xs = drop (m-1) (take n 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;
-- Ana Sosa Caballero&lt;br /&gt;
extremos n xs = take n xs ++ reverse (take n (reverse xs))&lt;br /&gt;
&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, Ana Sosa Caballero&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;
-- Ana Sosa Caballero&lt;br /&gt;
tresDiferentes x y z = and [x/=y, y/=z, 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;
-- 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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 21. Definir la función kMaximo, tal que (kMaximo n xs) &lt;br /&gt;
-- devuelve el k-máximo elemento de xs (es decir, el que está en la&lt;br /&gt;
-- posición k de valores más altos), obviando repeticiones. Por ejemplo, &lt;br /&gt;
--    kMaximo 2 [6,9,2,4]  == 6&lt;br /&gt;
--    kMaximo 3 [10,9,8,10,5]  == 8&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Laura Arango, Ana Sosa Caballero&lt;br /&gt;
kMaximo k xs = reverse (sort (nub xs)) !! (k-1)&lt;br /&gt;
&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&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;
-- Ana Sosa Caballero&lt;br /&gt;
numPares xs = length(group (sort (filter even xs)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anasoscab</name></author>
	</entry>
</feed>