[Práctico 3] Generalizaciones, indexado (3.12), exact (3.14 y 3.15)

[Práctico 3] Generalizaciones, indexado (3.12), exact (3.14 y 3.15)

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

Buenas,

Tenía algunas consultas sobre unos ejercicios particulares, así como una más general precisamente sobre generalización.


La pregunta sobre generalización es más bien sobre una funcionalidad de Coq. Supóngase que se tiene la función que dado un operador de dos argumentos naturales devuelve el operador con los argumentos intercambiados:

Definition fswap (f: nat -> nat -> nat) := fun (m n: nat) => f n m.

Puedo demostrar, por ejemplo:

Lemma fswap_id: forall (f: nat -> nat -> nat) (m n: nat), (fswap (fswap f)) m n = f m n.
Proof. cbv delta beta; reflexivity. Qed.


Se quiere generalizar esta definición, y se puede hacer por ejemplo:

Definition fswap' (X: Set) (f: X -> X -> X) := fun (m n: X) => f n m.

En este caso puedo demostrar:

Lemma fswap_id': forall (X: Set) (f: X -> X -> X) (m n: X), (fswap' X (fswap' X f)) m n = f m n.
Proof. cbv delta beta; reflexivity. Qed.


La versión anterior tiene la particularidad de que hay que pasar el parámetro de la generalización como argumento. Según he visto, usando otra sintaxis, el parámetro de la generalización puede ser inferido por los demás argumentos, evitando tener que agregar un argumento redundante. Por ejemplo:

Definition fswap'' {X: Set} (f: X -> X -> X) := fun (m n: X) => f n m.

También puede demostrarse para este caso:

Lemma fswap_id'' {X: Set}: forall (f: X -> X -> X) (m n: X), (fswap'' (fswap'' f)) m n = f m n.
Proof. cbv delta beta; reflexivity. Qed.


La consulta es en definitiva si esta versión de la generalización está permitida, y si es efectivamente equivalente a la otra versión salvando el detalle sintáctico.


--


Además tengo un par de preguntas sobre los ejercicios de exact y el de AVL. Primero sobre exact:

Supóngase que tengo una prueba que quiero reducir a una linea:

Proof. intros. exact(...). Qed.

¿Hay forma de incorporar la introducción de términos en la táctica exact? De lo contrario la única forma de reducir la prueba anterior a una linea sería:

Proof. intros; exact(...). Qed.

¿Sería esto lo que se espera en los ejercicios 3.14 y 3.15 cuando se pide completar en una linea una demostración a la que no se le han introducido los términos (ejemplo, 3.14.3 ó 3.15.4)?


--


Finalmente, tengo una duda sobre el ejercicio 3.12, de definición de AVL. Se pide definir addAVLi (i=1..k), pero no estoy seguro de cuál se supone que sería la semántica de i (que supongo sería un índice), así como tampoco estoy seguro de cuál sería la cota superior k (podría ser cantidad de nodos, hojas, etcétera dependiendo de la semántica del constructor), o si debería explicitar la cota definiendo otro conjunto para indexar en i que no sean los naturales.

Agrego que la forma en que definiría un AVL (altura n+1) dadas las definiciones anteriores sería en base a un árbol completo (altura n) al que se le agrega un nivel que puede estar o no completo. Pero en este caso faltaría definir el uso del índice, que podría ser una codificación (en bits, por ejemplo) sobre las posiciones a completar, un valor placeholder a ignorar en un vector constructor para el último nivel o cualquier otra cosa (si uno fuera a implementar el constructor). En fin, quería pedir alguna orientación respecto a los requerimientos del ejercicio.


Saludos.


En respuesta a Juan Manuel Rivara De Leon

Re: [Práctico 3] Generalizaciones, indexado (3.12), exact (3.14 y 3.15)

de Carlos Luna -

Hola Juan Manuel.

Pregunta: "La consulta es en definitiva si esta versión de la generalización está permitida, y si es efectivamente equivalente a la otra versión salvando el detalle sintáctico."

Respuesta: Si, está permitida; tiene que ver con el uso de argumentos implícitos. Ver: https://coq.inria.fr/distrib/current/refman/language/gallina-extensions.html#declaration-of-implicit-arguments.

Sobre los ejercicios que ejercicios donde se pide hacer la prueba usando solamente exact con el término correspondiente, no está permitido incluir la táctica intro previamente (salvo que ya esté en la letra del ejercicio). Tenés que ver entonces que término permite construir (parcialmente) la táctica intro. Al aplicar tácticas se van generando (parcialmente) términos de prueba; cuando se termina la prueba, hay un término que corresponde a toda la prueba, realizada habitualmente con tácticas.Si se ponés exact con ese término se tiene la prueba. Por ejemplo:

Lemma L : forall (A:Set), A -> A.

Proof.

 exact (fun A x => x).

Qed.

Finalmente, sobre el ejercicio 3.1 (AVL): el i es porque hay varios addAVL; diría tres. Por ejemplo uno de estos constructores sería:

Parameter addAVL1 : forall n, AVLNat n -> nat -> AVLNat n -> AVLNat (n + 1). 

Notar que no es la única posibilidad de generar un AVL no vacío, ya que los subárboles podrían diferir respecto a sus alturas hasta en una unidad. 

Saludos, Carlos