<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?action=history&amp;feed=atom&amp;title=Relaci%C3%B3n_12_Sol</id>
	<title>Relación 12 Sol - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?action=history&amp;feed=atom&amp;title=Relaci%C3%B3n_12_Sol"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_12_Sol&amp;action=history"/>
	<updated>2026-09-18T01:01:59Z</updated>
	<subtitle>Historial de revisiones de esta página en el wiki</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_12_Sol&amp;diff=566&amp;oldid=prev</id>
		<title>Mdelamor: Protegió «Relación 12 Sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_12_Sol&amp;diff=566&amp;oldid=prev"/>
		<updated>2021-12-19T18:17:31Z</updated>

		<summary type="html">&lt;p&gt;Protegió «&lt;a href=&quot;/WIKIS/I1M2021G2/index.php/Relaci%C3%B3n_12_Sol&quot; title=&quot;Relación 12 Sol&quot;&gt;Relación 12 Sol&lt;/a&gt;» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;es&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revisión del 18:17 19 dic 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;es&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Sin diferencias)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_12_Sol&amp;diff=565&amp;oldid=prev</id>
		<title>Mdelamor: Página creada con «&lt;source lang=&#039;haskell&#039;&gt;  -- I1M 2021-22: Relación 12 Solución -- Tipos de datos algebraicos: Árboles binarios. -- Departamento de Ciencias de la Computación e I.A. -- U…»</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_12_Sol&amp;diff=565&amp;oldid=prev"/>
		<updated>2021-12-19T18:17:23Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;  -- I1M 2021-22: Relación 12 Solución -- Tipos de datos algebraicos: Árboles binarios. -- Departamento de Ciencias de la Computación e I.A. -- U…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-- I1M 2021-22: Relación 12 Solución&lt;br /&gt;
-- Tipos de datos algebraicos: Árboles binarios.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presenta ejercicios sobre árboles binarios&lt;br /&gt;
-- definidos como tipos de datos algebraicos.&lt;br /&gt;
-- &lt;br /&gt;
-- Los ejercicios corresponden al tema 9 que se encuentra en &lt;br /&gt;
--    http://www.cs.us.es/cursos/i1m/temas/tema-9.html&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
import Control.Monad&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Nota. En los siguientes ejercicios se trabajará con los árboles&lt;br /&gt;
-- binarios definidos como sigue &lt;br /&gt;
--    data Arbol a = H &lt;br /&gt;
--                 | N a (Arbol a) (Arbol a)&lt;br /&gt;
--                 deriving (Show, Eq)&lt;br /&gt;
-- Por ejemplo, el árbol&lt;br /&gt;
--         9 &lt;br /&gt;
--        / \&lt;br /&gt;
--       /   \&lt;br /&gt;
--      3     7&lt;br /&gt;
--     / \  &lt;br /&gt;
--    2   4 &lt;br /&gt;
-- se representa por&lt;br /&gt;
--    N 9 (N 3 (H 2) (H 4)) (H 7) &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
data Arbol a = H a&lt;br /&gt;
             | N a (Arbol a) (Arbol a)&lt;br /&gt;
             deriving (Show, Eq)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Definir la función&lt;br /&gt;
--    nHojas :: Arbol a -&amp;gt; Int&lt;br /&gt;
-- tal que (nHojas x) es el número de hojas del árbol x. Por ejemplo,&lt;br /&gt;
--    nHojas (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nHojas :: Arbol a -&amp;gt; Int&lt;br /&gt;
nHojas (H _)     = 1&lt;br /&gt;
nHojas (N _ i d) = nHojas i + nHojas d&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la función&lt;br /&gt;
--    nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
-- tal que (nNodos x) es el número de nodos del árbol x. Por ejemplo,&lt;br /&gt;
--    nNodos (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
nNodos :: Arbol a -&amp;gt; Int&lt;br /&gt;
nNodos (H _)     = 0&lt;br /&gt;
nNodos (N _ i d) = 1 + nNodos i + nNodos d&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Comprobar con QuickCheck que en todo árbol binario el&lt;br /&gt;
-- número de sus hojas es igual al número de sus nodos más uno.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nHojas :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nHojas x =&lt;br /&gt;
  nHojas x == nNodos x + 1&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_nHojas&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Definir la función&lt;br /&gt;
--    profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
-- tal que (profundidad x) es la profundidad del árbol x. Por ejemplo,&lt;br /&gt;
--    profundidad (N 9 (N 3 (H 2) (H 4)) (H 7))              ==  2&lt;br /&gt;
--    profundidad (N 9 (N 3 (H 2) (N 1 (H 4) (H 5))) (H 7))  ==  3&lt;br /&gt;
--    profundidad (N 4 (N 5 (H 4) (H 2)) (N 3 (H 7) (H 4)))  ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
profundidad :: Arbol a -&amp;gt; Int&lt;br /&gt;
profundidad (H _)     = 0&lt;br /&gt;
profundidad (N _ i d) = 1 + max (profundidad i) (profundidad d)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Comprobar con QuickCheck que para todo árbol biario&lt;br /&gt;
-- x, se tiene que&lt;br /&gt;
--    nNodos x &amp;lt;= 2^(profundidad x) - 1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_nNodosProfundidad :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_nNodosProfundidad x =&lt;br /&gt;
   nNodos x &amp;lt;= 2 ^ profundidad x - 1&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_nNodosProfundidad&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1. Definir la función&lt;br /&gt;
--    preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (preorden x) es la lista correspondiente al recorrido&lt;br /&gt;
-- preorden del árbol x; es decir, primero visita la raíz del árbol, a&lt;br /&gt;
-- continuación recorre el subárbol izquierdo y, finalmente, recorre el&lt;br /&gt;
-- subárbol derecho. Por ejemplo,&lt;br /&gt;
--    preorden (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [9,3,2,4,7]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preorden (H x)     = [x]&lt;br /&gt;
preorden (N x i d) = x : (preorden i ++ preorden d)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con QuickCheck que la longitud de la lista&lt;br /&gt;
-- obtenida recorriendo un árbol en sentido preorden es igual al número&lt;br /&gt;
-- de nodos del árbol más el número de hojas.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_length_preorden :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_length_preorden x =&lt;br /&gt;
   length (preorden x) == nNodos x + nHojas x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_length_preorden&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.3. Definir la función&lt;br /&gt;
--    postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (postorden x) es la lista correspondiente al recorrido&lt;br /&gt;
-- postorden del árbol x; es decir, primero recorre el subárbol&lt;br /&gt;
-- izquierdo, a continuación el subárbol derecho y, finalmente, la raíz&lt;br /&gt;
-- del árbol. Por ejemplo,&lt;br /&gt;
--    postorden (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [2,4,3,7,9]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
postorden :: Arbol a -&amp;gt; [a]&lt;br /&gt;
postorden (H x)     = [x]&lt;br /&gt;
postorden (N x i d) = postorden i ++ postorden d ++ [x]&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.4. Definir, usando un acumulador, la función&lt;br /&gt;
--    preordenIt :: Arbol a -&amp;gt; [a]&lt;br /&gt;
-- tal que (preordenIt x) es la lista correspondiente al recorrido&lt;br /&gt;
-- preorden del árbol x; es decir, primero visita la raíz del árbol, a&lt;br /&gt;
-- continuación recorre el subárbol izquierdo y, finalmente, recorre el&lt;br /&gt;
-- subárbol derecho. Por ejemplo,&lt;br /&gt;
--    preordenIt (N 9 (N 3 (H 2) (H 4)) (H 7))  ==  [9,3,2,4,7]&lt;br /&gt;
-- &lt;br /&gt;
-- Nota: No usar (++) en la definición&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
preordenIt :: Arbol a -&amp;gt; [a]&lt;br /&gt;
preordenIt x&amp;#039; = preordenItAux x&amp;#039; []&lt;br /&gt;
    where preordenItAux (H x) xs     = x:xs&lt;br /&gt;
          preordenItAux (N x i d) xs = &lt;br /&gt;
              x : preordenItAux i (preordenItAux d xs)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.5. Comprobar con QuickCheck que preordenIt es equivalente&lt;br /&gt;
-- a preorden. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_preordenIt :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_preordenIt x =&lt;br /&gt;
    preordenIt x == preorden x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_preordenIt&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. Definir la función&lt;br /&gt;
--    espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (espejo x) es la imagen especular del árbol x. Por ejemplo,&lt;br /&gt;
--    espejo (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (H 7) (N 3 (H 4) (H 2))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
espejo :: Arbol a -&amp;gt; Arbol a&lt;br /&gt;
espejo (H x)     = H x&lt;br /&gt;
espejo (N x i d) = N x (espejo d) (espejo i)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Comprobar con QuickCheck que para todo árbol x,&lt;br /&gt;
--    espejo (espejo x) = x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_espejo x = &lt;br /&gt;
  espejo (espejo x) == x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_espejo&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.3. Comprobar con QuickCheck que para todo árbol binario&lt;br /&gt;
-- x, se tiene que&lt;br /&gt;
--    reverse (preorden (espejo x)) = postorden x&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_reverse_preorden_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_reverse_preorden_espejo x =&lt;br /&gt;
  reverse (preorden (espejo x)) == postorden x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_reverse_preorden_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.4. Comprobar con QuickCheck que para todo árbol x,&lt;br /&gt;
--    postorden (espejo x) = reverse (preorden x)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_recorrido :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_recorrido x =&lt;br /&gt;
  postorden (espejo x) == reverse (preorden x)&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_recorrido&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. La función take está definida por&lt;br /&gt;
--    take :: Int -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
--    take 0            = []&lt;br /&gt;
--    take (n+1) []     = []&lt;br /&gt;
--    take (n+1) (x:xs) = x : take n xs&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    takeArbol ::  Int -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (takeArbol n t) es el subárbol de t de profundidad n. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    takeArbol 0 (N 9 (N 3 (H 2) (H 4)) (H 7)) == H 9&lt;br /&gt;
--    takeArbol 1 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (H 3) (H 7)&lt;br /&gt;
--    takeArbol 2 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (N 3 (H 2) (H 4)) (H 7)&lt;br /&gt;
--    takeArbol 3 (N 9 (N 3 (H 2) (H 4)) (H 7)) == N 9 (N 3 (H 2) (H 4)) (H 7)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
takeArbol :: Int -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
takeArbol _ (H x)     = H x&lt;br /&gt;
takeArbol 0 (N x _ _) = H x&lt;br /&gt;
takeArbol n (N x i d) = &lt;br /&gt;
    N x (takeArbol (n-1) i) (takeArbol (n-1) d)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Comprobar con QuickCheck que la profundidad de &lt;br /&gt;
-- (takeArbol n x) es menor o igual que n, para todo número natural n y&lt;br /&gt;
-- todo árbol x. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_takeArbol :: Int -&amp;gt; Arbol Int -&amp;gt; Property&lt;br /&gt;
prop_takeArbol n x =&lt;br /&gt;
  n &amp;gt;= 0 ==&amp;gt; profundidad (takeArbol n x) &amp;lt;= n&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_takeArbol&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. La función&lt;br /&gt;
--    repeat :: a -&amp;gt; [a]&lt;br /&gt;
-- está definida de forma que (repeat x) es la lista formada por&lt;br /&gt;
-- infinitos elementos x. Por ejemplo,&lt;br /&gt;
--    repeat 3  ==  [3,3,3,3,3,3,3,3,3,3,3,3,3,...&lt;br /&gt;
-- La definición de repeat es&lt;br /&gt;
--    repeat x = xs where xs = x:xs&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    repeatArbol :: a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (repeatArbol x) es es árbol con infinitos nodos x. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    takeArbol 0 (repeatArbol 3) == H 3&lt;br /&gt;
--    takeArbol 1 (repeatArbol 3) == N 3 (H 3) (H 3)&lt;br /&gt;
--    takeArbol 2 (repeatArbol 3) == N 3 (N 3 (H 3) (H 3)) (N 3 (H 3) (H 3))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
repeatArbol :: a -&amp;gt; Arbol a&lt;br /&gt;
repeatArbol x = N x t t&lt;br /&gt;
  where t = repeatArbol x&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. La función &lt;br /&gt;
--    replicate :: Int -&amp;gt; a -&amp;gt; [a]&lt;br /&gt;
-- está definida por &lt;br /&gt;
--    replicate n = take n . repeat&lt;br /&gt;
-- es tal que (replicate n x) es la lista de longitud n cuyos elementos&lt;br /&gt;
-- son x. Por ejemplo,&lt;br /&gt;
--    replicate 3 5  ==  [5,5,5]&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    replicateArbol :: Int -&amp;gt; a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (replicate n x) es el árbol de profundidad n cuyos nodos son&lt;br /&gt;
-- x. Por ejemplo,&lt;br /&gt;
--    replicateArbol 0 5  ==  H 5&lt;br /&gt;
--    replicateArbol 1 5  ==  N 5 (H 5) (H 5)&lt;br /&gt;
--    replicateArbol 2 5  ==  N 5 (N 5 (H 5) (H 5)) (N 5 (H 5) (H 5))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
replicateArbol :: Int -&amp;gt; a -&amp;gt; Arbol a&lt;br /&gt;
replicateArbol n = takeArbol n . repeatArbol&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que el número de hojas de &lt;br /&gt;
-- (replicateArbol n x) es 2^n, para todo número natural n&lt;br /&gt;
--&lt;br /&gt;
-- Nota. Al hacer la comprobación limitar el tamańo de las pruebas como&lt;br /&gt;
-- se indica a continuación&lt;br /&gt;
--    quickCheckWith (stdArgs {maxSize=7}) prop_replicateArbol&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_replicateArbol :: Int -&amp;gt; Int -&amp;gt; Property&lt;br /&gt;
prop_replicateArbol n x =&lt;br /&gt;
  n &amp;gt;= 0 ==&amp;gt; nHojas (replicateArbol n x) == 2^n&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheckWith (stdArgs {maxSize=7}) prop_replicateArbol&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir la función&lt;br /&gt;
--    mapArbol :: (a -&amp;gt; a) -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
-- tal que (mapArbol f x) es el árbol obtenido aplicándole a cada nodo de&lt;br /&gt;
-- x la función f. Por ejemplo,&lt;br /&gt;
--    ghci&amp;gt; mapArbol (*2) (N 9 (N 3 (H 2) (H 4)) (H 7)) &lt;br /&gt;
--    N 18 (N 6 (H 4) (H 8)) (H 14)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
mapArbol :: (a -&amp;gt; a) -&amp;gt; Arbol a -&amp;gt; Arbol a&lt;br /&gt;
mapArbol f (H x)     = H (f x)&lt;br /&gt;
mapArbol f (N x i d) = N (f x) (mapArbol f i) (mapArbol f d)&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que &lt;br /&gt;
--    (mapArbol (1+)) . espejo = espejo . (mapArbol (1+))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_mapArbol_espejo :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_mapArbol_espejo x =&lt;br /&gt;
    (mapArbol (1+) . espejo) x == (espejo . mapArbol (1+)) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_mapArbol_espejo&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que&lt;br /&gt;
--    (map (1+)) . preorden = preorden . (mapArbol (1+)) &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_map_preorden :: Arbol Int -&amp;gt; Bool&lt;br /&gt;
prop_map_preorden x =&lt;br /&gt;
    (map (1+) . preorden) x == (preorden . mapArbol (1+)) x&lt;br /&gt;
 &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_map_preorden&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Nota. Para comprobar propiedades de árboles con QuickCheck se&lt;br /&gt;
-- utilizará el siguiente generador.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
instance Arbitrary a =&amp;gt; Arbitrary (Arbol a) where&lt;br /&gt;
  arbitrary = sized arbol&lt;br /&gt;
    where&lt;br /&gt;
      arbol 0       = fmap H arbitrary &lt;br /&gt;
      arbol n | n&amp;gt;0 = oneof [fmap H arbitrary,&lt;br /&gt;
                             liftM3 N arbitrary subarbol subarbol]&lt;br /&gt;
                      where subarbol = arbol (div n 2)&lt;br /&gt;
      arbol _       = error &amp;quot;Imposible&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
</feed>