-- I1M 2009-10: Relación 25 (19 de mayo de 2010)
-- Departamento de Ciencias de la Computación e I.A.
-- Universidad de Sevilla
-- =====================================================================

-- ---------------------------------------------------------------------
-- Importación de librerías auxiliares                                --
-- ---------------------------------------------------------------------

import Test.QuickCheck

-- ---------------------------------------------------------------------
-- Ejercicio 1.1. Definir, por recursión, la función
--    numeroCifrasR :: Integer -> Integer
-- tal que (numeroCifrasR n) es el número de cifras de n. Por ejemplo,
--    numeroCifrasR 42704 == 5
-- ---------------------------------------------------------------------

numeroCifrasR :: Integer -> Integer
numeroCifrasR n = undefined

-- ---------------------------------------------------------------------
-- Ejercicio 1.2. Definir, por recursión iterativa, la función
--    numeroCifrasI :: Integer -> Integer
-- tal que (numeroCifrasI n) es el número de cifras de n. Por ejemplo,
--    numeroCifrasI 42704 == 5
-- ---------------------------------------------------------------------

numeroCifrasI :: Integer -> Integer
numeroCifrasI n = undefined

-- ---------------------------------------------------------------------
-- Ejercicio 1.3. Comprobar con QuickCheck que las funciones
-- numeroCifrasR y numeroCifrasI son equivalentes.
-- ---------------------------------------------------------------------

-- La propiedad es
prop_numeroCifras :: Integer -> Bool
prop_numeroCifras n = undefined

-- La comprobación es

-- ---------------------------------------------------------------------
-- Ejercicio 1.4. Comprobar con QuickCheck que para todo número positivo
-- n, si el número de cifras de n es k, entonces n está entre 10^(k-1) y
-- 10^k  
-- ---------------------------------------------------------------------

-- La propiedad es
prop_numeroCifrasEntre :: Integer -> Property
prop_numeroCifrasEntre n = undefined

-- La comprobación es

-- ---------------------------------------------------------------------
-- Ejercicio 2.1. Definir, por recursión, la función
--    imagenR :: Integer -> Integer
-- tal que (imagenR n) es el número obtenido escribiendo las cifras de n
-- de derecha a izquierda. Por ejemplo,
--    imagenR 37052 = 25073
-- ---------------------------------------------------------------------

imagenR :: Integer -> Integer
imagenR n = undefined

-- ---------------------------------------------------------------------
-- Ejercicio 2.2. Definir, por recursión iterativa, la función
--    imagenI :: Integer -> Integer
-- tal que (imagenI n) es el número obtenido escribiendo las cifras de n
-- de derecha a izquierda. Por ejemplo,
--    imagenI 37052 = 25073
-- ---------------------------------------------------------------------

imagenI :: Integer -> Integer
imagenI n = undefined

-- ---------------------------------------------------------------------
-- Ejercicio 2.3. Comprobar con QuickCheck que las funciones
-- imagenR e imagenI son equivalentes.
-- ---------------------------------------------------------------------

-- La propiedad es
prop_imagen :: Integer -> Bool
prop_imagen n = undefined

-- La comprobación es

-- ---------------------------------------------------------------------
-- Ejercicio 2.4. Comprobar con QuickCheck si la función imagenR es
-- involutiva; es decir, para todo número natural n,
--    imagenR (imagenR n) == n
-- En caso de que no se cumpla, añadir la menor condición sobre n para
-- que se cumpla. 
-- ---------------------------------------------------------------------

-- La propiedad es
prop_imagenInvolutiva :: Integer -> Property
prop_imagenInvolutiva n = undefined

-- La comprobación es

-- La propiedad corregida es
prop_imagenInvolutiva' :: Integer -> Property
prop_imagenInvolutiva' n = undefined

-- La comprobación es

-- ---------------------------------------------------------------------
-- Ejercicio 3. (Problema 6 del proyecto Euler) 
-- Definir la función 
--    euler6 :: Integer -> Integer
-- tal que (euler6 n) es la diferencia entre el cuadrado de la suma
-- de los n primeros números y la suma de los cuadrados de los n
-- primeros números. Por ejemplo, 
--    euler6 10 = (1 + 2 + ... + 10)^2 - (1^2 + 2^2 + ... + 10^2)
--              = 2640
-- 
-- Usando euler6, calcular la diferencia entre el cuadrado de la
-- suma de los 100 primeros números y la suma de los cuadrados de los
-- 100 primeros números. 
-- ---------------------------------------------------------------------

-- La definición es
euler6 :: Integer -> Integer
euler6 n = undefined

-- El cálculo es

-- ---------------------------------------------------------------------
-- Ejercicio 4. (Problema 9 del proyecto Euler)
-- Una terna pitagórica es una terna de números naturales (a,b,c) tal
-- que a<b<c y a^2+b^2=c^2. Por ejemplo (3,4,5) es una terna
-- pitagórica. 
-- 
-- Definir la función  
--    ternaPitagoricaSuma :: Integer -> [Integer]
-- tal que (ternaPitagoricaSuma x) es una terna pitagórica cuya suma es
-- x. Por ejemplo, 
--     ternaPitagoricaSuma 12  =  [3,4,5]
-- 
-- Existe exactamente una terna pitagórica tal que a+b+c=1000. Calcular
-- el producto abc.
-- ---------------------------------------------------------------------

-- La definición es
ternaPitagoricaSuma :: Integer -> [Integer]
ternaPitagoricaSuma x = undefined

-- El cálculo es 


