Táctica inversion

Táctica inversion

de Juan Manuel Rivara De Leon -
Número de respuestas: 5

Buenas tardes.

Quería consultar si estaba permitido el uso de la táctica inversion. Me sería útil para hacer pruebas sobre tipos inductivos donde otras tácticas (por ejemplo, elim) no conservan relaciones entre las variables que introducen y las ya existentes, lo que imposibilita avanzar en la prueba.

Saludos.

En respuesta a Juan Manuel Rivara De Leon

Re: Táctica inversion

de Carlos Luna -

Hola.

La pueden usar, aunque estrictamente no se precisa en este práctico. Usas induction?

Saludos Carlos 

En respuesta a Carlos Luna

Re: Táctica inversion

de Juan Manuel Rivara De Leon -
Hola Carlos.
Sí, uso induction (en realidad por costumbre más que nada elim, pero entiendo que es lo mismo sin el intro posterior). Pero para el ejercicio 4.17 (relación inductiva posfijo), quiero probar un lema para facilitar una prueba. Aclaro que definí "posfijo" como una relación inductiva proposicional, no como una función recursiva booleana. Este lema usando inversion sobre una hipótesis que tiene la forma (l1 << l2), sale en unas pocas lineas, pero aplicar induction sobre esa misma hipótesis me deja estancado.
Resulta que inversion introduce nuevas variables x e y, pero a su vez me introduce hipótesis de "ligadura" (x = l1 e y = l2), e incluso alguna hipótesis adicional, lo que me permite avanzar sin problemas haciendo sustitución (en realidad lo hace la propia táctica automáticamente incluso). Por otra parte, induction me introduce las variables x e y pero las deja libres, entonces no puedo utilizar las hipótesis que tengo. Comento igualmente que sí puedo probar el lema con la ayuda de una función auxiliar en el objetivo a demostrar, que puedo probar en otro lema como equivalente, pero que no es "reducida" por la táctica elim/induction permitiéndome finalizarla, ya que en este caso los objetivos e hipótesis variarían. Sin embargo este enfoque me pareció innecesariamente complejo.
Aclaro, en esta oportunidad estoy trabajando sobre la propia hipótesis y no sobre los operandos. Sería el segundo caso que muestra la diapositiva 26 del teórico de inducción y recursión (elim Even n).
En respuesta a Juan Manuel Rivara De Leon

Re: Táctica inversion

de Carlos Luna -

Hola Juan Manuel.

Sin tener información precisa sobre tus definiciones y pruebas, aporto algunos comentarios generales.

Es correcto definir posfijo como una relación inductiva y no como una función booleana. De esta manera, se puede luego hacer inducción en la relación y no solo en los argumentos inductivos (listas) de la relación. La ventaja es que los casos que se plantean son los que corresponden a la definición inductiva y no todos los posibles si hicieras por ejemplo inducción en ambas variables argumentos (de tipo Lista) de la relación.

Se puede usar inversion o inversion_clear, aunque esto lo veremos en el módulo siguiente (práctico 5) y como dije no es imprescindible para el práctico 4 (pero se puede usar, no está prohibido en el práctico 4).

Es importante al aplicar cualquier táctica que las variables que se instancien en el goal y aparecen en las hipótesis, queden isntanciadasa también en las hipótesis, o al menos queden las igualdades para aplicar reescrituras.

Finalmente, hay varias formas de probar ciertas propiedades que involucran elementos inductivos; sean variables de tipo dato, como nat, list, por ejemplo, o relaciones definidas inductivamente. Dependiendo de las definiciones dadas y las propiedades a demostrar, algunas veces conviene más hacer inducción sobre una cosa u otra. Recomiendo pensar primero una estrategia de prueba antes de usar Coq sin mucho criterio, ya que sino las pruebas pueden no salir o ser muy rebuscadas e incomprensibles (como pasa cuando se programa; es similar). Con esto no quiero decir que tengan que buscar la prueba perfecta o minimalista, pero que si siga una estrategia. Por ejemplo, si una función binaria se define por recursión en el primer argumento, conviene hacer inducción en ese argumento y no en el otro, para que se pueda aplicar la definción de la función en la prueba.

Saludos, Carlos  

En respuesta a Carlos Luna

Re: Táctica inversion

de Juan Manuel Rivara De Leon -
Te puedo dar un poco más de contexto:

Básicamente lo que quiero probar es un lema que tiene esta forma: l1 << (cons a l2) -> ... l2 ...
Con inversion sobre (l1 << (cons a l2)) sale fácilmente, por lo menos para mis definiciones de cons y posfijo.

La otra alternativa que tengo es definir una función F inversa a cons, o sea F(cons a l) = l. Luego puedo replantear el objetivo anterior como: l1 << l2 -> ... F(l2) ...
De esta forma puedo utilizar induction sobre (l1 << l2) y ahora sí puedo demostrar sin mayores dificultades.

Pero intentar aplicar induction directamente sobre (l1 << (cons a l2)) en la primera versión es lo que me deja estancado.

Tengo clara la estrategia que quiero utilizar, pero para utilizarla dependo de poder demostrar algunas afirmaciones básicas (estos lemas). En principio había utilizado el segundo caso, con la función auxiliar. Pero me pareció que debía haber una forma de hacerlo que no necesite una función auxiliar externa. Si querés puedo hacerte llegar ambas versiones del lema (son pruebas bastante cortas, 10 lineas o menos) para que me des una opinión sobre si hay una mejor de hacerlo que estoy omitiendo.

Saludos.
En respuesta a Juan Manuel Rivara De Leon

Re: Táctica inversion

de Carlos Luna -

Hola

Para probar este lema auxiliar (que te surge a vos) lo que proponés primero está muy bien y podés usar inversion. 

La pregunta sería (aunque no es necesario que cambies nada) si este lema auxliar que proponés es necesario.

Saludos, Carlos