import Test.QuickCheck
numerosConCuadradosConDigitosPares :: [Integer]
numerosConCuadradosConDigitosPares =
filter tieneCuadradoConDigitosPares [0..]
-- (tieneCuadradoConDigitosPares n) se verifica si todos los dígitos de
-- n^2 son pares. Por ejemplo,
-- tieneCuadradoConDigitosPares 78 == True
-- tieneCuadradoConDigitosPares 76 == False
tieneCuadradoConDigitosPares :: Integer -> Bool
tieneCuadradoConDigitosPares n =
tieneDigitosPares (n^2)
-- (tieneDigitosPares n) se verifica si todos los dígitos de n son
-- pares. Por ejemplo,
-- tieneDigitosPares 426 == True
-- tieneDigitosPares 436 == False
tieneDigitosPares :: Integer -> Bool
tieneDigitosPares n =
all even (digitos n)
-- (digitos n) es la lista de los dígitos de n. Por ejemplo,
-- digitos 325 == [3,2,5]
digitos :: Integer -> [Int]
digitos n =
[read [c] | c <- show n]
-- La propiedad es
prop_infinito :: Integer -> Bool
prop_infinito n =
not (null (dropWhile (<= n) numerosConCuadradosConDigitosPares))
-- La comprobación es
-- λ> quickCheck prop_infinito
-- +++ OK, passed 100 tests.