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 entre los pares con la misma suma elegir antes al que tiene mayos su primera componente.
Definir la función
1 |
pares :: [(Int,Int)] |
tal que pares es la lista de los pares de números naturales con el orden anterior. por ejemplo,
1 2 |
ghci> 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
1 |
posicion :: (Int,Int) -> Int |
tal que (posicion p) es la posición del par p en la lista pares. Por ejemplo,
1 2 |
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
1 |
quickCheckWith (stdArgs {maxSize=7}) prop_posicion |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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 -- ghci> quickCheckWith (stdArgs {maxSize=7}) prop_posicion -- +++ OK, passed 100 tests. |
4 Comentarios