[Práctico 4] Fixpoint

[Práctico 4] Fixpoint

de Julian Tricanico Gadea -
Número de respuestas: 6

Buenas,

Salen los ejercicios y las definiciones con Fixpoint pero hay algo que no estoy entendiendo bien. Me resulta redundante que tengas que escribir `{struct x}` y también `match y with` con x = y.

Hay algún ejemplo que uses x /= y ? Ni siquiera entiendo mucho qué querría decir eso, jaja.

Saludos!

En respuesta a Julian Tricanico Gadea

Re: [Práctico 4] Fixpoint

de Carlos Luna -

Hola Julián.

No tengo la computadora ahora.

No estoy seguro de entender tu duda. 

El match es para hacer análisis de casos en una definición, usando los constructores del tipo de dato (si es nat: 0 y S ; si es una lista: nil y cons, por ejemplo). 

El struct es para fijar el parámetro a ser chequeado en una recursion, para ver que estructuralmente es mas pequeño (constructivamente).

Podrías tener funciones recursivas como la igualdad (que retorna un bool) entre listas o naturales, donde es necesario hacer análisis de casos en los dos parámetros pero donde alcanzaría con chequear (uso de struct) la terminación en uno de ellos.

Por otro lado, podes hacer strcuct x, y luego match x en la definición. No entiendo lo de la y...

Si esto no resuelve tu consulta, volvé a escribir.

Saludos Carlos 


En respuesta a Carlos Luna

Re: [Práctico 4] Fixpoint

de Julian Tricanico Gadea -
> No entiendo lo de la y...

Ah, perdón. Más verbosamente se leería:
Me resulta redundante que tengas que escribir `{struct x}` y también `match x with`.
Hay algún ejemplo que uses `{struct x} pero `match y with` con x /= y ? Ni siquiera entiendo mucho qué querría decir eso, jaja.

Entiendo que por ejemplo podés no usar el `{struct x}` y usar Definition en lugar de Fixpoint si no vas a hacer recursión y sólo precisás separar en casos. Pero por ejemplo qué pasa al revés?

Con un ejemplo simple Coq me dice
Recursive call to [...] has principal argument equal to 
"[...]" instead of a subterm of "[...]".
así que supongo que no se puede. En este ejemplo usé n-1 en un natural sin pattern matching en lugar del "subtérmino" dado por el pattern matching.

Tal vez lo que me resulta raro es que tengas que ser tan explícito. Ningún otro lenguaje que conozca funciona así y no entiendo bien la razón.

Me imagino que tiene que ver con tratar de mantener la consistencia (terminación), y en ese sentido entiendo que el pattern matching te lo asegura. Entonces no me queda claro por qué ser explícito con el struct.

La pregunta venía de que al principio no entendía nada la notación. Ahora la sé usar aunque sea, jaja. Pero si queda demasiado detallista la pregunta no te hagas drama, jeje.
En respuesta a Julian Tricanico Gadea

Re: [Práctico 4] Fixpoint

de Carlos Luna -

Hola.

Para definir funciones por recursion estructural usamos Fixpoint, no Defintion.

Fixpoint permite asegurar la terminación pero para ello es necesario establecer un argumento en el cual Coq chequee que es estrictamente mas pequeño en base a exclusivamente los constructores del tipo de dato. No funciona si por ejemplo llamas recursivamente con el resultado de cierta función, como - (n-1), ya que en general habría que demostrar que el resultado de la función es estructuralmente mas pequeño; esto con Fixpoint no es posible.

En el último módulo del curso veremos como definir funciones recursivas generales, pero para esto se requerirá demostrar terminación sobre órdenes bien fundados (con Fixpoint la terminación se asegura, pero con las restricciones vistas).

Saludos


En respuesta a Julian Tricanico Gadea

Re: [Práctico 4] Fixpoint

de Agustin Di Vincezo Fernandez -
Buenas, esta pregunta tiene unos dias ya, pero coincido en que no comprendo el uso del {struct x} en un fixpoint.
En el teórico entendí que era para decir que la recursividad es sobre el parámetro x, pero para eso no bastaría con hacer match x with e ir "reduciendo" el parametro x en ?
Además, es posible hacer recursión sobre las dos variables, con dos match anidados y cambiando la variable ("reduciendolas a valores mas pequeños").
A lo mejor es incorrecto lo que digo, pero no me queda muy claro.

Por ejemplo en la siguiente definicion del ej3
Fixpoint leBool (n m : nat): bool:=
match n with
0 => true
|S k => match m with
0 => false
|S j => leBool k j
end
end.

Gracias
Saludos
En respuesta a Agustin Di Vincezo Fernandez

Re: [Práctico 4] Fixpoint

de Carlos Luna -

El struct es para eso, si. Si no se pone,  Coq toma uno por defecto.

El match, como puse en una respuesta anterior, es para hacer análisis de casos en los constructores. Dado que Fixpoint chequea recursión estructural, llamar con un término estructuralmente mas pequeño permite asegurar terminación sobre el parámetro elegido con struct (explícita o implicitamente).

Podes hacer match en más de un parámetro (como puse en un mensaje anterior), como en el ejemplo de leBool. Notar que en el llamado recursivo (leBool k j) ambos parámetros son estructuralmente mas pequeños (tienen un sucesor menos).

Saludos