Enumeración de los números enteros
Definir la sucesión
enteros :: [Int]
tal que sus elementos son los números enteros comenzando en el 0 e intercalando los positivos y los negativos. Por ejemplo,
λ> take 23 enteros [0,1,-1,2,-2,3,-3,4,-4,5,-5,6,-6,7,-7,8,-8,9,-9,10,-10,11,-11]
Comprobar con QuickCheck que el n-ésimo término de la sucesión es (1-(2n+1)(-1)^n)/4.
Nota. En la comprobación usar
quickCheckWith (stdArgs {maxSize=7}) prop_naturales0
Soluciones
import Test.QuickCheck enteros :: [Int] enteros = 0 : concat [[n,-n] | n <- [1..]] -- La propiedad es prop_enteros :: Int -> Property prop_enteros n = n >= 0 ==> enteros !! n == (1-(2*n+1)*(-1)^n) `div` 4 -- La comprobación es -- λ> quickCheckWith (stdArgs {maxSize=7}) prop_enteros -- +++ OK, passed 100 tests.