Asistente de pruebas Coq
Matem´
aticas Discretas II
Prueba de teoremas
I
Una prueba es un argumento irrefutable sobre la veracidad de
una aserci´
on matem´
atica.
I
C´
omo podemos probar teoremas con un ordenador?
I Probadores autom´aticos de teoremas: Encuentran las pruebas por s´ı mismos.
I ´Exito en dominios limitados (prueba de hardware).
I Enorme complejidad computacional.
I Comprobadores de pruebas: verifican una prueba dada.
I Asistentes de pruebas:
I La “parte dif´ıcil” de las pruebas viene dada por la interacci´on con los usuarios.
I La “parte sencilla” de las pruebas se realiza autom´aticamente.
Qu´
e es Coq?
I
Sistema de ayuda para la demostraci´
on de teoremas.
I
Trabaja con aserciones matem´
aticas.
I
Permite extraer programas certificados (correctos) a trav´
es de
la prueba constructiva de sus especificaciones.
I
No es un sistema autom´
atico, pero proporciona t´
acticas para
la prueba de teoremas.
I Las t´acticas son comandos utilizados en la prueba de teoremas para indicarle a Coq como debe actuar para probar la
Formas de ejecuci´
on
1.
Ejecuci´
on interactiva:
1.1 El top-level:I Entrar en el top-level: coqtop
I Salir del top-level: Quit.
Declaraciones
I
Asocian un nombre a una especificaci´
on.
I
Tipos de especificaciones:
1. Proposiciones l´ogicas: Prop. 2. Colecciones matem´aticas: Set. 3. Tipos Abstractos: Type.I
Todas las expresiones tienen un tipo asociado (Check).
Coq < Check 3. 3 : nat
Coq < Check nat. nat : Set
Declaraciones
I
Secciones: Estructurar la modelizaci´
on. Limitar el ´
ambito de
par´
ametros, hip´
otesis, etc.
Coq < Section Declaration.
I
Variables:
Coq < Variable n : nat.
n is assumed
I
Hip´
otesis:
Definiciones
I
Coq contiene varias definiciones aritm´
eticas: O, S, plus.
I
Las definiciones asignan un identificador a un valor.
Coq < Definition one := (S O). one is defined
Coq < Definition two : nat := S one. two is defined
Coq < Definition double (m:nat) := plus m m. double is defined
I
Podemos mezclar variables libres y acotadas:
Coq < Definition addN (m:nat) := plus m n. addN is defined
I
Limpiar el entorno. Borrar contenidos de la secci´
on:
Convenciones sint´
acticas
I
a → b → c equivale a a → (b → c).
I
f a b equivale a (f a) b.
Introducci´
on al motor de pruebas
I
A → B se lee como “A implica B”. Sobrecarga operador.
Introducci´
on al motor de pruebas
I
T´
actica intros: Transforma premisas o cuantificadores del
objetivo al contexto de la prueba.
Coq < intros H’ HA. 1 subgoal A B C: Prop H : A -> B -> C H’ : A -> B HA : A ======================= C Coq < apply H. 2 subgoals A B C: Prop H : A -> B -> C H’ : A -> B HA : A ======================= A subgoal 2 is: B
Coq < exact HA. 1 subgoal A : Prop B : Prop C : Prop H : A -> B -> C H’ : A -> B HA : A ======================= B
Introducci´
on al motor de pruebas
I
T´
actica exact: se aplica cuando dos expresiones son
convertibles.
Coq < apply H’. 1 subgoal A : Prop B : Prop C : Prop H : A -> B -> C H’ : A -> B HA : A ============================ ACoq < exact HA. Proof completed. Coq < Save trivialLemma.
I
Abort desecha el lema.
Introducci´
on al motor de pruebas
I
Lemma o Theorem se definen igual que Goal.
IPosibilidad de concatenar varias t´
acticas:
I T1;T2: aplica T1 a objetivo actual y T2 a todos los sub-objetivos generados por T1.
I T;[T1|T2|...|Tn]: aplica T al objetivo actual, T1 al primer sub-objetivo generado, T2 al segundo, etc.
I
T´
actica auto: intenta probar el problema combinando una
serie de t´
acticas a las hip´
otesis y a ciertos lemas de forma
autom´
atica.
I Podemos enriquecer auto con teoremas ya probados: Hint
Resolve TheoremName.
I
Restart: recomenzar la prueba del teorema.
Algunas pruebas sencillas
I
Prueba de la conmutatividad de la intersecci´
on:
Algunas pruebas sencillas
I
T´
actica split: divide la conjunci´
on en dos sub-objetivos.
Coq < split. 2 subgoals A B C: Prop H : A /\ B ============================ B subgoal 2 is: A
Coq < apply H. apply H.
Algunas pruebas sencillas
I
Prueba alternativa de la conmutatividad de la intersecci´
on:
I
T´
actica elim: divide un t´
ermino en sus componentes.
Coq < elim H. 1 subgoal A B C: Prop H : A /\ B ============================ A -> B -> B / A Coq < split.
Prueba de teoremas sencillos
I
T´
actica clear: borra hip´
otesis innecesarias.
I
T´
actica trivial: equivalente a auto pero opera en un ´
unico
paso.
I
T´
actica tauto: intenta aplicar una tautolog´ıa.
Coq < Lemma orCommutative : A \/ B -> B \/ A. 1 subgoal A B C: Prop ============================ A \/ B -> B \/ A Coq < tauto. Proof completed. Coq < Qed. tauto. orCommutative is defined
Prueba de teoremas sencillos
I
La t´
actica generalize permite recuperar una de las hip´
otesis
locales e introducirlas en el objetivo.
... H : termH ... ============================ termGoal Coq < generalize H. ... H : termH ... ============================ termH -> termGoal
I
Expresi´
on del tipo x = y. x e y mismo tipo. Como
reemplazar x con y?
Prueba de teoremas sencillos
Coq < Variable f : nat -> nat. Coq < Hypothesis foo : f 0 = 0.
Coq < Lemma L1 : forall k:nat, k = 0 -> f k = k. 1 subgoal f: nat -> nat. foo: f 0 = 0. ============================ forall k : nat, k = 0 -> f k = k Coq < intros k E. 1 subgoal
Prueba de teoremas sencillos
Coq < Hypothesis f10 : f 1 = f 0. Coq < Lemma L2 : f (f 1) = 0. 1 subgoal f : nat -> nat foo : f 0 = 0 f10 : f 1 = f 0 ============================ f (f 1) = 0 Coq < rewrite f10. f : nat -> nat foo : f 0 = 0 f10 : f 1 = f 0 ============================ f (f 0) = 0Prueba de teoremas sencillos
I
T´
actica unfold: sustituye una definici´
on por la f´
ormula que
la define.
I Coq < Definition one := (S O).
I unfold term in H: en la hip´otesis en lugar del objetivo.
I
T´
actica symmetry: sustituye el t´
ermino t = u por u = t.
I
T´
actica reflexivity: se aplica a un objetivo de la forma t
= u, comprueba si t y u son convertibles.
Tipos de datos inductivos
I
Se definen indicando nombre, tipo y constructores.
Coq < Inductive bool : Set := true
| false.
I
Definici´
on autom´
atica de redes de eliminaci´
on. bool ind
permite el razonamiento por casos.
I
Demostrar que un booleano es true o false.
Coq < Lemma duality : forall b:bool, b = true \/ b = false. 1 subgoal
============================
forall b : bool, b = true \/ b = false
Tipos de datos inductivos
Coq < intro b. 1 subgoal b : bool ============================ b = true \/ b = false Coq < elim b. 2 subgoals b : bool ============================ true = true \/ true = false subgoal 2 is:false = true \/ false = false
Coq < left; trivial. | Coq < left; trivial.
I
La prueba entera podr´ıa haberse reducido a la siguiente
instrucci´
on:
Tipos de datos inductivos
I
N´
umeros naturales:
Coq < Inductive nat : Set := | O : nat
| S : nat -> nat.
I
Una vez definido el tipo podemos realizar operaciones:
Coq < Fixpoint plus (n m:nat) struct n : nat := match n with
| O => m
| S p => S (plus p m) end.
Tipos de datos inductivos
I
T´
actica destruct: divide o “destruye” un tipo inductivo en
sus posibles casos
Tipos de datos inductivos
I
Tambi´
en podemos probar teoremas por inducci´
on:
Coq < Lemma plus n O : forall n:nat, n = n + 0. 1 subgoal
============================ forall n : nat, n = n + 0 Coq < intro n; elim n. 2 subgoals n : nat ============================ 0 = 0 + 0 subgoal 2 is: forall n0 : nat, n0 = n0 + 0 -> S n0 = S n0 + 0 Coq < simpl; auto.
Coq < simpl; auto.
I
auto utiliza como hint:
Coq < Check eq S.
eq S : forall x y : nat, x = y -> S x = S y
Tipos de datos inductivos
I
Declarar plus n 0 para poder ser utilizado como hint por
auto:
Coq < Hint Resolve plus n O.
I
Vamos a probar ahora la conmutatividad de la suma:
Coq < Lemma plus com : forall n m:nat, n + m = m + n. 1 subgoal
============================ forall n m : nat, n + m = m + n Coq < simple induction m; simpl; auto. 1 subgoal
n m: nat
============================
forall n0 : nat, n + n0 = n0 + n -> n + S n0 = S (n0 + n) Coq < intros m’ E; rewrite <- E; auto.
Coq < Qed.
Tipos de datos inductivos
I
T´
actica induction: divide el objetivo en dos sub-objetivos, el
caso base y el de inducci´
on.
I
Al probar el paso base, la hip´
otesis de inducci´
on aparece en el
contexto de la prueba.
Theorem plus0 r : forall n:nat, plus n 0 = n. Proof.
intros n. induction n as [| n ]. reflexivity.
Tipos de datos inductivos
I
Funci´
on que devuelve true si el n´
umero es 0 y false en
cualquier otro caso.
Coq < Definition Is S (n:nat) := match n with | O => False
| S p => True end.
I
Prueba de teoremas:
Coq < Lemma S is S : forall n:nat, IsS (S n). 1 subgoal
============================ forall n : nat, Is S (S n) Coq < simpl; trivial.
Tipos de datos inductivos
I
Nuevos teoremas:
Coq < Lemma no confusion : forall n:nat, 0 <> S n. 1 subgoal
============================ forall n : nat, 0 <> S n. Coq < intro n; discriminate. Coq < Qed.
M´
odulos
I
Por defecto, Coq carga varias librer´ıas (l´
ogica y aritm´
etica).
I
Abrir nuevos m´
odulos: Require Import Arith.
I
Creaci´
on de m´
odulos propios:
I Edici´on de fichero mi modulo.v. Module ModName. ... End ModName..
I Compilaci´on con coqc. Librer´ıa en fichero mi modulo.vo.
I Carga con Require Import ModName.