<?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=188.78.90.137</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=188.78.90.137"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php/Especial:Contribuciones/188.78.90.137"/>
	<updated>2026-10-01T08:49:57Z</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_6&amp;diff=394</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=394"/>
		<updated>2021-11-09T10:36:34Z</updated>

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

		<summary type="html">&lt;p&gt;188.78.90.137: &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;
&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;
&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&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&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;
-- ---------------------------------------------------------------------&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&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&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&lt;br /&gt;
pares :: [a] -&amp;gt; [a]&lt;br /&gt;
pares cs = [a | (a,b) &amp;lt;- conPos cs, even b]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13. Dos listas xs, ys de la misma longitud son&lt;br /&gt;
-- perpendiculares si el producto escalar de ambas es 0, donde el&lt;br /&gt;
-- producto escalar de dos listas de enteros xs e ys viene&lt;br /&gt;
-- dado por la suma de los productos de los elementos correspondientes.&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    perpendiculares :: (Num a, Eq a) =&amp;gt; [a] -&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
-- tal que (perpendiculares xs yss) es la lista de los elementos de yss&lt;br /&gt;
-- que son perpendiculares a xs. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; perpendiculares [1,0,1] [[0,1,0], [2,3,1], [-1,7,1],[3,1,0]]&lt;br /&gt;
--    [[0,1,0],[-1,7,1]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--Nicolás Rodríguez Ruiz y Elsa Domínguez&lt;br /&gt;
perpendiculares :: (Num a, Eq a) =&amp;gt; [a] -&amp;gt; [[a]] -&amp;gt; [[a]]&lt;br /&gt;
perpendiculares xs yss = [ ys | ys &amp;lt;- yss, xs `productoEscalar` ys==0]&lt;br /&gt;
  where productoEscalar xs ys = sum [a*x | (a,x) &amp;lt;- zip xs ys]&lt;br /&gt;
&lt;br /&gt;
-- 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&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;
&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;
&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&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;
&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&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>188.78.90.137</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_3&amp;diff=372</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=372"/>
		<updated>2021-11-03T12:34:10Z</updated>

		<summary type="html">&lt;p&gt;188.78.90.137: &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, Cristina Torres, Ana Sánchez Martín, Irene Ortega Moncayo&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, Cristina Torres, Ana Sánchez Martín&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, Cristina Torres&lt;br /&gt;
suma :: Integer -&amp;gt; Integer&lt;br /&gt;
suma n = sum [1..n]&lt;br /&gt;
-- Ana Sánchez Martín &lt;br /&gt;
suma n = [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, Ana Sánchez Martín&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, Carmen Blanco, Ana Sosa Caballero, Elsa Domínguez, Cristina Torres&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, Lucía González, Elsa Domínguez, Cristina Torres, Carmen Blanco, Ana Sánchez Martín&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, Ana Sánchez Martín&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, Carmen Blanco,  Lucía González&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;
--Cristina Torres&lt;br /&gt;
factores4:: Int -&amp;gt; [Int]&lt;br /&gt;
factores4 n= [ x |x &amp;lt;- [1..n] , rem n x == 0]&lt;br /&gt;
&lt;br /&gt;
perfectos4 :: Int -&amp;gt; [Int]&lt;br /&gt;
perfectos4 n = [i | i &amp;lt;- [1..n], perfecto i]&lt;br /&gt;
      where perfecto x = x == sum (factores x)- x&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, Lucía González&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, Cristina Torres, Ana Sánchez Martín&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, Carmen Blanco&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, Cristina Torres, Carmen Blanco,  Lucía González, Ana Sánchez Martín&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,  Lucía González&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, Cristina Torres&lt;br /&gt;
todosPares1 :: Int -&amp;gt; Bool&lt;br /&gt;
todosPares1 n = and [even x | x &amp;lt;- numerosAbundantesMenores n]&lt;br /&gt;
-- Ana Sánchez Martín&lt;br /&gt;
todosPares :: Int -&amp;gt; Bool&lt;br /&gt;
todosPares n = all even (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, Cristina Torres&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,  Lucía González, Ana Sánchez Martín&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, Irene Ortega Moncayo&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,  Lucía González, Ana Sánchez Martín&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;
-- Cristina Torres&lt;br /&gt;
&lt;br /&gt;
euler1 :: Int -&amp;gt; Int&lt;br /&gt;
euler1 n = sum [ i | i&amp;lt;- [1..n-1], rem i 3==0 ||  rem i 5==0 ]&lt;br /&gt;
-- Cálculo: λ&amp;gt; euler1 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, Adolfo Sagrera Vivancos, Cristina Torres,  Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín&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, Adolfo Sagrera Vivancos, Cristina Torres,  Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín&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,  Lucía González, Ana Sánchez Martín&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, Ana Sánchez Martín&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, Adolfo Sagrera Vivancos, Cristina Torres,  Lucía González, Irene Ortega Moncayo&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, Adolfo Sagrera Vivancos, Cristina Torres,  Lucía González, Ana Sánchez Martín&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,  Lucía González, Ana Sánchez Martín&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, Adolfo Sagrera Vivancos, Cristina Torres,  Lucía González, Ana Sánchez Martín&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, Adolfo Sagrera Vivancos, Cristina Torres, Ana Sánchez Martín&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, Adolfo Sagrera Vivancos, Cristina Torres,  Lucía González, Ana Sánchez Martín&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, Adolfo Sagrera Vivancos, Cristina Torres,  Lucía González, Irene Ortega Moncayo, Ana Sánchez Martín&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, Cristina Torres,  Lucía González, Adolfo Sagrera Vivancos, Irene Ortega Moncayo, Ana Sánchez Martín&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, Cristina Torres,  Lucía González, Adolfo Sagrera Vivancos, Irene Ortega Moncayo, Ana Sánchez Martín&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, Cristina Torres,  Lucía González&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;
-- Adolfo Sagrera Vivancos, Irene Ortega Moncayo, Ana Sánchez Martín&lt;br /&gt;
ternasPitagoricas1 :: Integer -&amp;gt; [(Integer,Integer,Integer)]&lt;br /&gt;
ternasPitagoricas1 x = [(a,b,c) | a &amp;lt;- [1..x], b &amp;lt;- [a+1..x], c &amp;lt;- [x-a-b],&lt;br /&gt;
                        a^2+b^2 == c^2]&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;
--Lucía González, Ana Sánchez Martín&lt;br /&gt;
euler9 :: Integer&lt;br /&gt;
euler9 =  a*b*c&lt;br /&gt;
         where (a,b,c)= head (ternasPitagoricas 1000)&lt;br /&gt;
-- Adolfo Sagrera Vivancos&lt;br /&gt;
euler9&amp;#039; :: Integer&lt;br /&gt;
euler9&amp;#039; = head[ a*b*c | (a,b,c) &amp;lt;- (ternasPitagoricas 1000)]&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, Lucía González, Adolfo Sagrera Vivancos, Ana Sánchez Martín&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, Lucía González, Adolfo Sagrera Vivancos, Irene Ortega Moncayo, Ana Sánchez Martín&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, Adolfo Sagrera Vivancos, Ana Sánchez Martín&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;
-- Lucía Hernández&lt;br /&gt;
densa :: [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
densa xs = [(x,y) | (x,y)&amp;lt;- zip (reverse ys) xs, y/=0]&lt;br /&gt;
       where ys = [0.. length xs-1]&lt;br /&gt;
&lt;br /&gt;
--Lucía González&lt;br /&gt;
densa2 :: [Int] -&amp;gt; [(Int,Int)]&lt;br /&gt;
densa2 xs = [(x,y)| (x,y) &amp;lt;- zip [n-1,n-2..0] xs, y/=0]&lt;br /&gt;
              where n= length xs&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, Lucía González, Adolfo Sagrera Vivancos, Irene Ortega Moncayo&lt;br /&gt;
nombres :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
nombres bd = [(a) | (a,_,_,_) &amp;lt;- bd]&lt;br /&gt;
-- Ana Sánchez Martín&lt;br /&gt;
nombres :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
nombres bd = [nombre | (nombre, actividad, nacimiento, fallecimiento) &amp;lt;- bd]&lt;br /&gt;
&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, Lucía González, Adolfo Sagrera Vivancos, Irene Ortega Moncayo&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;
-- Ana Sánchez Martín&lt;br /&gt;
musicos :: [(String,String,Int,Int)] -&amp;gt; [String]&lt;br /&gt;
musicos bd = [nombre | (nombre, actividad, nacimiento, fallecimiento) &amp;lt;- bd,&lt;br /&gt;
              actividad == &amp;quot;Música&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, Lucía González, Adolfo Sagrera Vivancos, Irene Ortega Moncayo&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;
-- Ana Sánchez Martín&lt;br /&gt;
seleccion :: [(String,String,Int,Int)] -&amp;gt; String -&amp;gt; [String]&lt;br /&gt;
seleccion bd m = [nombre |(nombre, actividad, nacimiento, fallecimiento) &amp;lt;- bd,&lt;br /&gt;
                  actividad == 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, Lucía González, Adolfo Sagrera Vivancos, Irene Ortega Moncayo, Ana Sánchez Martín &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, Lucía González, Adolfo Sagrera Vivancos, Irene Ortega Moncayo&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;
-- Ana Sánchez Martín &lt;br /&gt;
vivas :: [(String,String,Int,Int)] -&amp;gt; Int -&amp;gt; [String]&lt;br /&gt;
vivas ps a = [nombre | (nombre, actividad, nacimiento, fallecimiento) &amp;lt;- bd,&lt;br /&gt;
              nacimiento &amp;lt;= a, fallecimiento &amp;gt;= a]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>188.78.90.137</name></author>
	</entry>
</feed>