Sucesión de antecesores y sucesores
Definir la lista
1 |
antecesoresYsucesores :: [[Integer]] |
cuyos elementos son
1 |
[[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,
1 2 |
λ> 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
1 |
quickCheckWith (stdArgs {maxSize=7}) prop_suma |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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. |