[Prueba 2018][Ejercicio 5]

[Prueba 2018][Ejercicio 5]

de Hugo Sebastian Rodriguez Reyes -
Número de respuestas: 10
La letra dice:


Dadas las siguientes definiciones:

data A = A [A] | V Int | U A

copia :: A → (A,Int)

copia (U a) = let (a', n) = copia a in (U a', n)

copia (V i) = (V i, 1)

copia (A as) = let ps = map copia as

                           (a, n) = head ps

                           ts = tail ps

                           in (A (a : map fst ts), sum (map snd ps))

La respuesta correcta es:

Dado t de tipo A, snd (copia t) siempre retorna un entero no negativo.

Pero no entiendo, porque si t = (U a) entonces snd (copia (U a)) = n, donde n es calculado como copia a.

Pero a puede volver a ser de la forma (U a), cayendo en una recursión que nunca termina.

Alguien me puede dar una mano?

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: [Prueba 2018][Ejercicio 5]

de Marcos Viera - InCo -
En este ejercicio falta especificar que t es un término finito.


En respuesta a Marcos Viera - InCo

Re: [Prueba 2018][Ejercicio 5]

de Hugo Sebastian Rodriguez Reyes -

Entiendo que si se aclara que t es un término finito, el caso que planteo terminaría en algún momento.

Lo que no termino de entender es, si al hacer esa aclaración, la única posibilidad es que t sea de la forma V Int?

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: [Prueba 2018][Ejercicio 5]

de Marcos Viera - InCo -

No, puede ser también por ejemplo (U (U (V 9)))

En respuesta a Marcos Viera - InCo

Re: [Prueba 2018][Ejercicio 5]

de Hugo Sebastian Rodriguez Reyes -

Entiendo que en el caso que planteas n sería 9, no?

Entonces sea cual sea el tipo de t, en algún momento me voy a encontrar con algo del estilo V Int y es por eso que puedo asegurar que snd (copia t) siempre va a devolver un entero no negativo?

O sea, que t puede ser (pongo un ejemplo de cada pattern matching):

1) t = (U (U (U (V Int))))

2) t = V Int

3) t = A [(A [(U (U (V Int)))]), (V Int), (U (V int)), (U (U (U (V Int))))]

Estoy en lo correcto?

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: [Prueba 2018][Ejercicio 5]

de Marcos Viera - InCo -

En ese caso n sería 1.

Siempre es positivo porque el resultado es 1 en el caso de (V i), lo que da para a en el caso (U a) y la suma de lo que da para cada elemento de la lista  as en el caso de (A as).



En respuesta a Marcos Viera - InCo

Re: [Prueba 2018][Ejercicio 5]

de Hugo Sebastian Rodriguez Reyes -

Bien, creo que entendí.

Muchas gracias!

Saludos.

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: [Prueba 2018][Ejercicio 5]

de Florencia Rieppi Espasandin -

Buenas, 

no logro darme cuenta porque la opción "Dado t de tipo A, fst (copia t) siempre retorna t" no es correcta. 

Gracias

En respuesta a Florencia Rieppi Espasandin

Re: [Prueba 2018][Ejercicio 5]

de Martin Pacheco -

Florencia, me pasaba lo mismo que a vos y me terminé sacando la duda ejecutando el código con diferentes valores.
Resulta que snd (copia t) nunca falla, mientras que si haces fst (copia ( A [] )) te falla al hacer head o tail en una lista vacia.