Sucesión de antecesores y sucesores
Definir la lista
antecesoresYsucesores :: [[Integer]]
cuyos elementos son
[[1],[0,2],[-1,1,1,3],[-2,2,0,0,2,0,2,2,4],...]
donde cada una de las listas se obtiene de la anterior sustituyendo cada elemento por su antecesor y su sucesor; es decir, el 1 por el 0 y el 2, el 0 por el -1 y el 1, el 2 por el 1 y el 3, etc. Por ejemplo,
λ> take 4 antecesoresYsucesores [[1],[0,2],[-1,1,1,3],[-2,0,0,2,0,2,2,4]]
Comprobar con Quickcheck que la suma de los elementos de la lista n-ésima de antecesoresYsucesores es 2^n.
Nota. Limitar la búsqueda a ejemplos pequeños usando
quickCheckWith (stdArgs {maxSize=7}) prop_suma
Soluciones
import Test.QuickCheck -- 1ª solución antecesoresYsucesores :: [[Integer]] antecesoresYsucesores = [1] : map (concatMap (\x -> [x-1,x+1])) antecesoresYsucesores -- 2ª solución antecesoresYsucesores2 :: [[Integer]] antecesoresYsucesores2 = iterate (concatMap (\x -> [x-1,x+1])) [1] -- La propiedad es prop_suma :: (Positive Int) -> Bool prop_suma (Positive n) = sum (antecesoresYsucesores2 !! n) == 2^n -- La comprobación es -- λ> quickCheckWith (stdArgs {maxSize=7}) prop_suma -- +++ OK, passed 100 tests.