<?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=10.100.45.66</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=10.100.45.66"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php/Especial:Contribuciones/10.100.45.66"/>
	<updated>2026-09-23T13:51:20Z</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=413</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=413"/>
		<updated>2021-11-17T08:15:48Z</updated>

		<summary type="html">&lt;p&gt;10.100.45.66: &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;
&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>10.100.45.66</name></author>
	</entry>
</feed>