Suma de todos los anteriores
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