Enunciado
-- Definir la función
-- sumaAnteriores :: [Integer] -> Bool
-- tal que (sumaAnteriores xs) se verifica si cada elemento de la lista
-- xs (excepto el primero) es la suma de sus anteriores elementos en la
-- lista. Por ejemplo,
-- sumaAnteriores [3,3,6,12] == True
-- sumaAnteriores [3,3,7,10] == False
-- sumaAnteriores [3] == True
-- sumaAnteriores [] == True |
-- Definir la función
-- sumaAnteriores :: [Integer] -> Bool
-- tal que (sumaAnteriores xs) se verifica si cada elemento de la lista
-- xs (excepto el primero) es la suma de sus anteriores elementos en la
-- lista. Por ejemplo,
-- sumaAnteriores [3,3,6,12] == True
-- sumaAnteriores [3,3,7,10] == False
-- sumaAnteriores [3] == True
-- sumaAnteriores [] == True
Soluciones
import Test.QuickCheck
-- 1ª definición (por recursión):
sumaAnteriores :: [Integer] -> Bool
sumaAnteriores xs = aux (reverse xs)
where aux [] = True
aux [_] = True
aux (x:xs) = x == sum xs && aux xs
-- 2ª definición (por comprensión):
sumaAnteriores2 :: [Integer] -> Bool
sumaAnteriores2 (x:y:zs) =
x == y && and [b == 2*a | (a,b) <- adyacentes (y:zs)]
where adyacentes xs = zip xs (tail xs)
sumaAnteriores2 _ = True
-- La propiedad de equivalencia es
prop_equiv_sumaAnteriores :: [Integer] -> Bool
prop_equiv_sumaAnteriores xs =
sumaAnteriores xs == sumaAnteriores2 xs |
import Test.QuickCheck
-- 1ª definición (por recursión):
sumaAnteriores :: [Integer] -> Bool
sumaAnteriores xs = aux (reverse xs)
where aux [] = True
aux [_] = True
aux (x:xs) = x == sum xs && aux xs
-- 2ª definición (por comprensión):
sumaAnteriores2 :: [Integer] -> Bool
sumaAnteriores2 (x:y:zs) =
x == y && and [b == 2*a | (a,b) <- adyacentes (y:zs)]
where adyacentes xs = zip xs (tail xs)
sumaAnteriores2 _ = True
-- La propiedad de equivalencia es
prop_equiv_sumaAnteriores :: [Integer] -> Bool
prop_equiv_sumaAnteriores xs =
sumaAnteriores xs == sumaAnteriores2 xs
Se puede imprimir o compartir con
*He quitado los paréntesis innecesarios de xs
En la segunda ecuación, en mejor sustituir [x] por [_], con una variable anónima
La definición se puede mejorar, pues en sumaAnteriores [x] = True podemos sustituir la x por la variable anónima: sumaAnteriores [_] = True