Enumeración de los números enteros
Definir la sucesión
1 |
enteros :: [Int] |
tal que sus elementos son los números enteros comenzando en el 0 e intercalando los positivos y los negativos. Por ejemplo,
1 2 |
ghci> 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-(2*n+1)*(-1)^n)/4
.
Nota. En la comprobación usar
1 |
quickCheckWith (stdArgs {maxSize=7}) prop_enteros |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import Test.QuickCheck import Control.Applicative ((<**>)) -- 1ª definición enteros :: [Int] enteros = 0 : concat [[n,-n] | n <- [1..]] -- 2ª definición enteros2 :: [Int] enteros2 = 0 : [y | x <- [1..], y <- [x, -x]] -- 3ª definición enteros3 :: [Int] enteros3 = iterate siguiente 0 where siguiente i | i > 0 = -i | otherwise = 1 - i -- 4ª definición enteros4 :: [Int] enteros4 = iterate (\i -> if i > 0 then -i else 1-i) 0 -- 5ª definición enteros5 :: [Int] enteros5 = 0 : [f x | x <- [1..], f <- [id, negate]] -- 6ª definición enteros6 :: [Int] enteros6 = 0 : ([1..] <**> [id, negate]) -- 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 -- ghci> quickCheckWith (stdArgs {maxSize=7}) prop_enteros -- +++ OK, passed 100 tests. |
8 Comentarios