<?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_6_Sol</id>
	<title>Relación 6 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_6_Sol"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_6_Sol&amp;action=history"/>
	<updated>2026-07-18T13:27:16Z</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_6_Sol&amp;diff=368&amp;oldid=prev</id>
		<title>Mdelamor: Protegió «Relación 6 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_6_Sol&amp;diff=368&amp;oldid=prev"/>
		<updated>2021-11-02T22:44:42Z</updated>

		<summary type="html">&lt;p&gt;Protegió «&lt;a href=&quot;/WIKIS/I1M2021G2/index.php/Relaci%C3%B3n_6_Sol&quot; title=&quot;Relación 6 Sol&quot;&gt;Relación 6 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 22:44 2 nov 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_6_Sol&amp;diff=367&amp;oldid=prev</id>
		<title>Mdelamor: Página creada con «&lt;source lang=&#039;haskell&#039;&gt;  -- I1M 2021-22: Rel_6_sol.hs  -- Definiciones por recursión  -- Departamento de Ciencias de la Computación e I.A. -- Universidad de Sevilla -- ==…»</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_6_Sol&amp;diff=367&amp;oldid=prev"/>
		<updated>2021-11-02T22:44:34Z</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: Rel_6_sol.hs  -- Definiciones por recursión  -- Departamento de Ciencias de la Computación e I.A. -- Universidad de Sevilla -- ==…»&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: Rel_6_sol.hs &lt;br /&gt;
-- Definiciones por recursión &lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presentan ejercicios con definiciones por&lt;br /&gt;
-- recursión correspondientes al tema 6 cuyas transparencias se &lt;br /&gt;
-- encuentran en  &lt;br /&gt;
--    http://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-6.html&lt;br /&gt;
 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Importación de librerías auxiliares                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
import Data.Char&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Definir por recursión la función&lt;br /&gt;
--    potencia :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (potencia x n) es x elevado al número natural n. Por ejemplo,  &lt;br /&gt;
--    potencia 2 3  ==  8&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
potencia :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
potencia _ 0 = 1&lt;br /&gt;
potencia m n = m * potencia m (n-1)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Comprobar con QuickCheck que la función potencia es&lt;br /&gt;
-- equivalente a la predefinida (^).&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_potencia :: Integer -&amp;gt; Integer -&amp;gt; Property&lt;br /&gt;
prop_potencia x n = &lt;br /&gt;
  n &amp;gt;= 0 ==&amp;gt; potencia x n == x^n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_potencia&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. Dados dos números naturales, a y b, es posible&lt;br /&gt;
-- calcular su máximo común divisor mediante el Algoritmo de&lt;br /&gt;
-- Euclides. Este algoritmo se puede resumir en la siguiente fórmula:&lt;br /&gt;
--    mcd(a,b) = a,                   si b = 0&lt;br /&gt;
--             = mcd (b, a módulo b), si b &amp;gt; 0&lt;br /&gt;
-- &lt;br /&gt;
-- Definir la función &lt;br /&gt;
--    mcd :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (mcd a b) es el máximo común divisor de a y b calculado&lt;br /&gt;
-- mediante el algoritmo de Euclides. Por ejemplo,&lt;br /&gt;
--    mcd 30 45  ==  15&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
mcd :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
mcd a 0 = a&lt;br /&gt;
mcd a b = mcd b (a `mod` b)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir y comprobar la propiedad prop_mcd según la&lt;br /&gt;
-- cual el máximo común divisor de dos números a y b (ambos mayores que&lt;br /&gt;
-- 0) es siempre mayor o igual que 1 y además es menor o igual que el&lt;br /&gt;
-- menor de los números a  y b. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_mcd :: Integer -&amp;gt; Integer -&amp;gt; Property&lt;br /&gt;
prop_mcd a b =&lt;br /&gt;
  a &amp;gt; 0 &amp;amp;&amp;amp; b &amp;gt; 0 ==&amp;gt; m &amp;gt;= 1 &amp;amp;&amp;amp; m &amp;lt;= min a b &lt;br /&gt;
  where m = mcd a b&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_mcd&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.3. Teniendo en cuenta que buscamos el máximo común&lt;br /&gt;
-- divisor de a y b, sería razonable pensar que el máximo común divisor&lt;br /&gt;
-- siempre sería igual o menor que la mitad del máximo de a y b. Definir&lt;br /&gt;
-- esta propiedad y comprobarla.  &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_mcd_div :: Integer -&amp;gt; Integer -&amp;gt; Property&lt;br /&gt;
prop_mcd_div a b =&lt;br /&gt;
  a &amp;gt; 0 &amp;amp;&amp;amp; b &amp;gt; 0 ==&amp;gt; mcd a b &amp;lt;= max a b `div` 2&lt;br /&gt;
&lt;br /&gt;
-- Al verificarla, se obtiene&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_mcd_div&lt;br /&gt;
--    Falsifiable, after 0 tests:&lt;br /&gt;
--    3&lt;br /&gt;
--    3&lt;br /&gt;
-- que la refuta. Pero si la modificamos ańadiendo la hipótesis que los números&lt;br /&gt;
-- son distintos,&lt;br /&gt;
prop_mcd_div&amp;#039; :: Integer -&amp;gt; Integer -&amp;gt; Property&lt;br /&gt;
prop_mcd_div&amp;#039; a b =&lt;br /&gt;
  a &amp;gt; 0 &amp;amp;&amp;amp; b &amp;gt; 0 &amp;amp;&amp;amp; a /= b ==&amp;gt; mcd a b &amp;lt;= max a b `div` 2&lt;br /&gt;
&lt;br /&gt;
-- entonces al comprobarla&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_mcd_div&amp;#039;&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
-- obtenemos que se verifica.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.1, Definir por recursión la función&lt;br /&gt;
--    pertenece :: Eq a =&amp;gt; a -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
-- tal que (pertenece x xs) se verifica si x pertenece a la lista xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    pertenece 3 [2,3,5]  ==  True&lt;br /&gt;
--    pertenece 4 [2,3,5]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
pertenece :: Eq a =&amp;gt; a -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
pertenece _ []     = False&lt;br /&gt;
pertenece x (y:ys) = x == y || pertenece x ys&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3.2. Comprobar con quickCheck que pertenece es equivalente&lt;br /&gt;
-- a elem. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_pertenece :: Eq a =&amp;gt; a -&amp;gt; [a] -&amp;gt; Bool&lt;br /&gt;
prop_pertenece x xs = pertenece x xs == elem x xs&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_pertenece&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.1. Definir por recursión la función&lt;br /&gt;
--    concatenaListas :: [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (concatenaListas xss) es la lista obtenida concatenando las listas de&lt;br /&gt;
-- xss. Por ejemplo,&lt;br /&gt;
--    concatenaListas [[1..3],[5..7],[8..10]]  ==  [1,2,3,5,6,7,8,9,10]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
concatenaListas :: [[a]] -&amp;gt; [a]&lt;br /&gt;
concatenaListas []       = []&lt;br /&gt;
concatenaListas (xs:xss) = xs ++ concatenaListas xss&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4.2. Comprobar con QuickCheck que concatenaListas es&lt;br /&gt;
-- equivalente a concat. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_concat :: Eq a =&amp;gt; [[a]] -&amp;gt; Bool&lt;br /&gt;
prop_concat xss = concatenaListas xss == concat xss&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_concat&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.1. Definir por recursión la función&lt;br /&gt;
--    coge :: Int -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
-- tal que (coge n xs) es la lista de los n primeros elementos de&lt;br /&gt;
-- xs. Por ejemplo, &lt;br /&gt;
--    coge 3 [4..12]  =&amp;gt;  [4,5,6]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
coge :: Int -&amp;gt; [a] -&amp;gt; [a]&lt;br /&gt;
coge n _  | n &amp;lt;= 0 = []&lt;br /&gt;
coge _ []          = []&lt;br /&gt;
coge n (x:xs)      = x : coge (n-1) xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5.2. Comprobar con QuickCheck que coge es equivalente a&lt;br /&gt;
-- take. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_coge :: Int -&amp;gt; [Int] -&amp;gt; Bool&lt;br /&gt;
prop_coge n xs =&lt;br /&gt;
  coge n xs == take n xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Definir, por recursión, la función &lt;br /&gt;
--    sumaCuadradosR :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaCuadradosR n) es la suma de los cuadrados de los números&lt;br /&gt;
-- de 1 a n. Por ejemplo, &lt;br /&gt;
--    sumaCuadradosR 4  ==  30 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaCuadradosR :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaCuadradosR 0 = 0&lt;br /&gt;
sumaCuadradosR n = n^2 + sumaCuadradosR (n-1) &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Comprobar con QuickCheck si sumaCuadradosR n es igual a&lt;br /&gt;
-- n(n+1)(2n+1)/6. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_SumaCuadrados :: Integer -&amp;gt; Property&lt;br /&gt;
prop_SumaCuadrados n =&lt;br /&gt;
  n &amp;gt;= 0 ==&amp;gt;&lt;br /&gt;
    sumaCuadradosR n == n * (n+1) * (2*n+1) `div` 6  &lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_SumaCuadrados&lt;br /&gt;
--    OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Definir, por comprensión, la función &lt;br /&gt;
--    sumaCuadradosC :: Integer --&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaCuadradosC n) es la suma de los cuadrados de los números&lt;br /&gt;
-- de 1 a n. Por ejemplo, &lt;br /&gt;
--    sumaCuadradosC 4  ==  30 &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaCuadradosC :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaCuadradosC n = sum [x^2 | x &amp;lt;- [1..n]]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.4. Comprobar con QuickCheck que las funciones&lt;br /&gt;
-- sumaCuadradosR y sumaCuadradosC son equivalentes sobre los números&lt;br /&gt;
-- naturales. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_sumaCuadradosR :: Integer -&amp;gt; Property&lt;br /&gt;
prop_sumaCuadradosR n =&lt;br /&gt;
    n &amp;gt;= 0 ==&amp;gt; sumaCuadradosR n == sumaCuadradosC n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_sumaCuadrados&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Definir, por recursión, la función&lt;br /&gt;
--    digitosR :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (digitosR n) es la lista de los dígitos del número n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    digitosR 320274  ==  [3,2,0,2,7,4]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
digitosR :: Integer -&amp;gt; [Integer]&lt;br /&gt;
digitosR n = reverse (digitosR&amp;#039; n)&lt;br /&gt;
&lt;br /&gt;
digitosR&amp;#039; :: Integer -&amp;gt; [Integer]&lt;br /&gt;
digitosR&amp;#039; n&lt;br /&gt;
    | n &amp;lt; 10    = [n]&lt;br /&gt;
    | otherwise = (n `rem` 10) : digitosR&amp;#039; (n `div` 10)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Definir, por comprensión, la función&lt;br /&gt;
--    digitosC :: Integer -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (digitosC n) es la lista de los dígitos del número n. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    digitosC 320274  ==  [3,2,0,2,7,4]&lt;br /&gt;
-- Indicación: Usar las funciones show y read.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
digitosC :: Integer -&amp;gt; [Integer]&lt;br /&gt;
digitosC n = [read [x] | x &amp;lt;- show n]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Comprobar con QuickCheck que las funciones digitosR y&lt;br /&gt;
-- digitosC son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_digitos :: Integer -&amp;gt; Property&lt;br /&gt;
prop_digitos n =&lt;br /&gt;
    n &amp;gt;= 0 ==&amp;gt; &lt;br /&gt;
    digitosR n == digitosC n&lt;br /&gt;
  &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_digitos&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. Definir, por recursión, la función &lt;br /&gt;
--    sumaDigitosR :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDigitosR n) es la suma de los dígitos de n. Por ejemplo,&lt;br /&gt;
--    sumaDigitosR 3     ==  3&lt;br /&gt;
--    sumaDigitosR 2454  == 15&lt;br /&gt;
--    sumaDigitosR 20045 == 11&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDigitosR :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDigitosR n&lt;br /&gt;
    | n &amp;lt; 10    = n&lt;br /&gt;
    | otherwise = n `rem` 10 + sumaDigitosR (n `div` 10)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2. Definir, sin usar recursión, la función &lt;br /&gt;
--    sumaDigitosNR :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDigitosNR n) es la suma de los dígitos de n. Por ejemplo,&lt;br /&gt;
--    sumaDigitosNR 3     ==  3&lt;br /&gt;
--    sumaDigitosNR 2454  == 15&lt;br /&gt;
--    sumaDigitosNR 20045 == 11&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDigitosNR :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDigitosNR n = sum (digitosC n)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.3. Comprobar con QuickCheck que las funciones sumaDigitosR&lt;br /&gt;
-- y sumaDigitosNR son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad es&lt;br /&gt;
prop_sumaDigitos :: Integer -&amp;gt; Property&lt;br /&gt;
prop_sumaDigitos n =&lt;br /&gt;
    n &amp;gt;= 0 ==&amp;gt;&lt;br /&gt;
    sumaDigitosR n == sumaDigitosNR n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_sumaDigitos&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.1. Definir, por recursión, la función &lt;br /&gt;
--    listaNumeroR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (listaNumeroR xs) es el número formado por los dígitos xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    listaNumeroR [5]        == 5&lt;br /&gt;
--    listaNumeroR [1,3,4,7]  == 1347&lt;br /&gt;
--    listaNumeroR [0,0,1]    == 1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1Ş solución&lt;br /&gt;
listaNumeroR :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroR xs = listaNumeroR&amp;#039; (reverse xs)&lt;br /&gt;
&lt;br /&gt;
listaNumeroR&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroR&amp;#039; [x]     = x&lt;br /&gt;
listaNumeroR&amp;#039; (x:xs) = x + 10 * listaNumeroR&amp;#039; xs&lt;br /&gt;
listaNumeroR&amp;#039; [] = error &amp;quot;un numero sin digitos?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- 2Ş solución&lt;br /&gt;
listaNumeroR&amp;#039;&amp;#039; :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroR&amp;#039;&amp;#039; [] = error &amp;quot;un numero sin digitos?&amp;quot;&lt;br /&gt;
listaNumeroR&amp;#039;&amp;#039; [x]     = x&lt;br /&gt;
listaNumeroR&amp;#039;&amp;#039; (x:xs) = x*10^n + listaNumeroR&amp;#039;&amp;#039; xs&lt;br /&gt;
  where n = length xs&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.2. Definir, por comprensión, la función &lt;br /&gt;
--    listaNumeroC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
-- tal que (listaNumeroC xs) es el número formado por los dígitos xs. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    listaNumeroC [5]        == 5&lt;br /&gt;
--    listaNumeroC [1,3,4,7]  == 1347&lt;br /&gt;
--    listaNumeroC [0,0,1]    == 1&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1Ş definición:&lt;br /&gt;
listaNumeroC1 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroC1 xs = sum [y*10^n | (y,n) &amp;lt;- zip (reverse xs) [0..]]&lt;br /&gt;
&lt;br /&gt;
-- 2Ş definición:&lt;br /&gt;
listaNumeroC2 :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroC2 xs = sum [y*10^n | (y,n) &amp;lt;- zip xs [n,n-1..0]]&lt;br /&gt;
  where n = length xs -1&lt;br /&gt;
&lt;br /&gt;
-- 3Ş definición:&lt;br /&gt;
listaNumeroC :: [Integer] -&amp;gt; Integer&lt;br /&gt;
listaNumeroC xs = read [x | x &amp;lt;- show xs, isDigit x]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9.3. Comprobar con QuickCheck que las funciones&lt;br /&gt;
-- listaNumeroR y listaNumeroC son equivalentes.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- La propiedad siguiente fallaría (żqué sucede con la lista vacía?)&lt;br /&gt;
prop_listaNumero&amp;#039; :: [Integer] -&amp;gt; Bool&lt;br /&gt;
prop_listaNumero&amp;#039; xs =&lt;br /&gt;
    listaNumeroR xs == listaNumeroC xs&lt;br /&gt;
&lt;br /&gt;
-- La propiedad siguiente también fallaría, pero no con lista vacía&lt;br /&gt;
-- (żqué sucede si quickcheck intenta comprobar la lista [-1,10]?)&lt;br /&gt;
prop_listaNumero&amp;#039;&amp;#039; :: [Integer] -&amp;gt; Property&lt;br /&gt;
prop_listaNumero&amp;#039;&amp;#039; xs = xs /= [] ==&amp;gt;&lt;br /&gt;
    listaNumeroR xs == listaNumeroC xs&lt;br /&gt;
&lt;br /&gt;
-- La propiedad siguiente sí funcionaría, pero imponte tantas&lt;br /&gt;
-- restricciones que al final se descartan la mayoría de los intentos&lt;br /&gt;
-- que hace quickcheck&lt;br /&gt;
prop_listaNumero&amp;#039;&amp;#039;&amp;#039; :: [Integer] -&amp;gt; Property&lt;br /&gt;
prop_listaNumero&amp;#039;&amp;#039;&amp;#039; xs = xs /= [] &amp;amp;&amp;amp; sonTodosDigitos ==&amp;gt;&lt;br /&gt;
    listaNumeroR xs == listaNumeroC xs&lt;br /&gt;
    where sonTodosDigitos = and [ x &amp;gt;=0 &amp;amp;&amp;amp; x &amp;lt;= 9 | x &amp;lt;- xs]&lt;br /&gt;
          &lt;br /&gt;
-- La propiedad siguiente funcionaría, porque aprovechamos el intento&lt;br /&gt;
-- en la mayoría de los casos (lo convertimos a lista de dígitos)&lt;br /&gt;
prop_listaNumero :: [Integer] -&amp;gt; Property&lt;br /&gt;
prop_listaNumero xs = xs /= [] ==&amp;gt;&lt;br /&gt;
    listaNumeroR ys == listaNumeroC ys&lt;br /&gt;
    where ys =  [ rem (abs x) 10 | x &amp;lt;- xs]&lt;br /&gt;
          &lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    ghci&amp;gt; quickCheck prop_listaNumero&lt;br /&gt;
--    +++ OK, passed 100 tests; 15 discarded.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.1. Definir, por recursión, la función &lt;br /&gt;
--    mayorExponenteR :: Integer -&amp;gt; Integer -&amp;gt; Integer &lt;br /&gt;
-- tal que (mayorExponenteR a b) es el exponente de la mayor potencia de&lt;br /&gt;
-- a que divide b. Por ejemplo,&lt;br /&gt;
--    mayorExponenteR 2 8    ==  3&lt;br /&gt;
--    mayorExponenteR 2 9    ==  0&lt;br /&gt;
--    mayorExponenteR 5 100  ==  2&lt;br /&gt;
--    mayorExponenteR 2 60   ==  2&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
mayorExponenteR :: Integer -&amp;gt; Integer -&amp;gt; Integer &lt;br /&gt;
mayorExponenteR a b&lt;br /&gt;
    | rem b a /= 0 = 0&lt;br /&gt;
    | otherwise    = 1 + mayorExponenteR a (b `div` a)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10.2. Definir, por comprensión, la función &lt;br /&gt;
--    mayorExponenteC :: Integer -&amp;gt; Integer -&amp;gt; Integer &lt;br /&gt;
-- tal que (mayorExponenteC a b) es el exponente de la mayor potencia de&lt;br /&gt;
-- a que divide a b. Por ejemplo,&lt;br /&gt;
--    mayorExponenteC 2 8    ==  3&lt;br /&gt;
--    mayorExponenteC 5 100  ==  2&lt;br /&gt;
--    mayorExponenteC 5 101  ==  0&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
mayorExponenteC :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
mayorExponenteC a b = head [x-1 | x &amp;lt;- [0..], mod b (a^x) /= 0]&lt;br /&gt;
&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>