[Practico 1] [Ej 9] Definir el conjunto de los numeros enteros

[Practico 1] [Ej 9] Definir el conjunto de los numeros enteros

de Luis Ignacio Perdomo Berton -
Número de respuestas: 2
Pense como posible solucion calcular todos los pares (y,z) tales que cumplen las condiciones del problema ( - 5 < y \leq 5  y  x = y + 10z ), colocarlos en una lista que se generara por comprension, y quedarme con el primer y unico elemento de esta lista. Seria algo asi:
descomposicion :: Int -> (Int, Int)
descomposicion x = [(y,z) | y <-[-4..5], z <- ENTEROS,x == y + 10*z] !! 0

El problema es cómo definir la lista de enteros que le voy a pasar a z.
Buscando en internet llegue a una idea de la forma:

[0..] ++ [-a | a <- [1..]]

donde lo que (en teoria) hago es concatenar la lista de todos los enteros desde 0 al infinito, y la lista de los enteros positivos desde uno, filtrada para quedarme con los negativos de ésta. De esta lista es que entro en la dudas, estoy en lo correcto al asegurar que asi puedo definir todos los enteros? Estoy encarando de la mejor manera el problema?

En respuesta a Luis Ignacio Perdomo Berton

Re: [Practico 1] [Ej 9] Definir el conjunto de los numeros enteros

de Alberto Pardo -

Hola,

Tus duda toca varios aspectos interesantes.

El usar una lista por comprensión para generar las posibles soluciones es un camino posible y correcto. Tu solución está fuertemente orientada al uso de evaluación perezosa, en el sentido de generar todas las potenciales soluciones y luego quedarse con una de ellas. Gracias al mecanismos de evaluación perezosa (que veremos mas adelante en el curso), en caso que existieran varias soluciones sólo la primera será generada; si no se tuviera un mecanismo así el programa quedaría infinitamente intentando generar soluciones (dado que tu idea es que se intente para cada entero). 

 En lo que respecta a tu solución, parece razonable intentar con todos los posibles "restos" (los valores "y" entre -4 y 5), pero no así con todos los posibles "z". Analizando matemáticamente el problema uno puede ver que la descomposición que se pide está bastante emparentada con lo que se obtiene haciendo división entera (div) y resto (mod), por lo que no parece razonable intentar con todos los posibles enteros para el caso de "z". 

El otro problema es que significa generar la lista (infinita) de enteros. Nos hace meter con algo que vamos a ver mas adelante en el curso. No hay problema con la lista (infinita) de números naturales: nats = [0..]; la podemos ir generando (y recorriendo) a demanda. Podemos escribir como se representaría la lista de enteros negativos: negs = map negate [1..]. Lo que no sería computacionalmente adecuado es pensar que al escribir la lista enteros = nats ++ negs vamos a poder generar todos los enteros. La expersión nats ++ negs tiene el tipo correcto y es aceptada por el compilador. El problema es que la primera lista (nats) es infinita, por lo que habría que esperar hasta la eternidad para poder pasar a la segunda lista (negs).  Si uno quisiera (potencialmente) probar soluciones para todos los enteros debería entonces buscar algún mecanismo para generar alternadamente elementos de una lista (nats) y de la otra (negs) de forma de ir avanzando en una y otra de forma pareja. Igualmente, como decía arriba, en este caso particular del ejercicio parece innecesario hacer una solución que intente probar con todos los enteros.