Enumeración de los pares de números naturales
Los pares de los números naturales se pueden ordenar por la suma de sus componentes y entres los pares con la misma suma elegir antes al que tiene mayos su primera componente.
Definir la función
pares :: [(Int,Int)]
tal que pares es la lista de los pares de números naturales con el orden anterior. por ejemplo,
λ> take 10 pares [(0,0),(1,0),(0,1),(2,0),(1,1),(0,2),(3,0),(2,1),(1,2),(0,3)]
Usando la definición de pares, definir la función
posicion :: (Int,Int) -> Int
tal que (posicion p) es la posición del par p en la lista pares. Por ejemplo,
posicion (0,0) == 0 posicion (2,0) == 3
Finalmente, comprobar con QuickCheck que para cualquier par (x,y) de números naturales, la (posicion (x,y)) es igual a (y + (x+y+1)*(x+y) div
2).
Nota. En la comprobación usar
quickCheckWith (stdArgs {maxSize=7}) prop_posicion
Soluciones
import Test.QuickCheck pares :: [(Int,Int)] pares = [(n-y,y) | n <- [0..], y <- [0..n]] posicion :: (Int,Int) -> Int posicion p = length (takeWhile (/=p) pares) -- La propiedad es prop_posicion :: (Int,Int) -> Property prop_posicion (x,y) = x >= 0 && y >= 0 ==> posicion (x,y) == y + (x+y+1)*(x+y) `div` 2 -- La comprobación es -- λ> quickCheckWith (stdArgs {maxSize=7}) prop_posicion -- +++ OK, passed 100 tests.