<?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=Sarcertor</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=Sarcertor"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php/Especial:Contribuciones/Sarcertor"/>
	<updated>2026-07-21T01:26:41Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_7&amp;diff=429</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_7&amp;diff=429"/>
		<updated>2021-11-17T18:50:15Z</updated>

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

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

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

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

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

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

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