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. |
Definimos el término n-ésimo de la sucesión en coq:
También definimos la suma de listas de enteros y un lema auxiliar:
Y con todo ello probamos la propiedad de la sucesión: