Demostraciones#
¿Para qué sirve Coq en Ciencias de la Computación?#
Coq es un asistente de pruebas que permite escribir demostraciones matemáticas formales y verificar su validez de manera automática. En ciencias de la computación, se utiliza para:
Probar la corrección de algoritmos.
Verificar propiedades de programas (por ejemplo, que no fallen o que devuelvan lo correcto).
Formalizar y razonar sobre sistemas lógicos, lenguajes de programación y estructuras computacionales.
Uno de los primeros temas que se aprenden al usar Coq es la lógica proposicional, donde se prueban fórmulas usando reglas lógicas formales. Para ello, Coq ofrece tácticas que ayudan a construir demostraciones paso a paso.
Tácticas por la derecha (para construir el objetivo)#
Estas tácticas se usan cuando el objetivo principal tiene una estructura lógica particular:
intro.
Sirve para introducir una hipótesis cuando el objetivo es una implicación:
Si el objetivo esP -> Q, entoncesintro H.convierteP -> Qen una hipótesisH: Py nuevo objetivoQ.split.
Se usa cuando el objetivo es una conjunciónP /\ Q. Divide el objetivo en dos subobjetivos: demostrarPy luegoQ.left.yright.
Se usan cuando el objetivo es una disyunciónP \/ Q.left.intenta probarP.right.intenta probarQ.
exists x.
Se usa cuando el objetivo es de la forma∃x, P(x). Introduce el testigoxy luego intenta probarP(x).
Tácticas por la izquierda (para usar las hipótesis)#
Estas tácticas permiten descomponer hipótesis con estructuras lógicas:
apply H.
Usa una hipótesisH: P -> Qcuando el objetivo esQy ya tienesP.destruct H.
Se usa para dividir en casos según el contenido de una hipótesisH.
Por ejemplo, siH: P \/ Q, genera dos subpruebas: una asumiendoP, otra asumiendoQ.
También sirve para hipótesisP /\ Q,exists x, P(x), etc.trivial.
Resuelve el objetivo si ya es una consecuencia directa de las hipótesis.assert (A : P).
Introduce un nuevo subobjetivoPpara poder usarlo más adelante comoA.
Negaciones#
En Coq, la negación ¬P se representa como P -> False. Aquí algunas tácticas útiles:
absurd P.
Si puedes derivar tantoPcomo¬P, esta táctica resuelve la prueba.contradict H.
Cambia el objetivo a¬Psi tienesH: Py se espera una contradicción.exact H.
Finaliza la prueba siHes exactamente el objetivo (por ejemplo, siH: Falsey el objetivo esFalse).
Nota: exact no es una táctica específica para negaciones, sino una táctica general que se utiliza cuando ya tienes una hipótesis o término que coincide exactamente con el objetivo actual.
Ejemplo completo en lógica proposicional#
Supongamos que queremos demostrar:
(P /\ Q) -> (Q /\ P)
Lemma conmutatividad_conjuncion : forall P Q: Prop, (P /\ Q) -> (Q /\ P).
Proof.
intros P Q H. (* Introducir hipótesis *)
destruct H as [HP HQ]. (* Usar la conjunción en H *)
split. (* Queremos probar una conjunción *)
exact HQ.
exact HP.
Qed.