Projet Coq
Vous pouvez lire ce document dans sa version HTML mais l'idéal est de le compiler
au fur et à mesure pour lire les messages renvoyés par Coq.
Lien vers la page du projet:
http://www.lsv.ens-cachan.fr/~hirschi/enseignements/projet_coq/projet_coq.php
Ce projet est constitué de deux parties pratiquement indépendantes. La première
section est assez facile mais demande d'écrire pas mal de preuves.
La seconde section demande plus de réflexion. Essayez de l'aborder en TP pour que
je puisse vous aider.
Et, s'il vous plait, ne copiez pas les uns sur les autres: ça se verra (trop) facilement (il y a beaucoup
de façon d'aborder une preuve).
L'axiomatisation de base de Coq ne permet que de prouver des preuves en logique
intuitioniste (et non classique). La conséquence (voulue) est que toutes les preuves
sont constructives (i.e., à chaque preuve correspond un terme calculant une fonction
totale du type de la proposition prouvée).
Si l'on veut travailler dans une logique classique, on doit alors déclarer un
"axiome classique" dans Coq. On peut ajouter le raisonnement par l'absurde, ou ajouter
la loi de Peirce par exemple. L'objectif de la première partie du projet est de montrer
que les logiques induites par cinq axiomes différents ont la même expressivité.
Definition peirce := forall P Q:Prop, ((P->Q)->P)->P.
Definition classic := forall P:Prop, ~~ P -> P.
Definition excluded_middle := forall P:Prop, P \/ ~P.
Definition de_morgan_not_and_not := forall P Q:Prop, ~(~P/\~Q)->P\/Q.
Definition implies_to_or := forall P Q:Prop, (P->Q)->(~P\/Q).
Prouvez que les logiques induites par ces propriétés ont la même
expressivité. Le plus simple est de choisir un ordre (par exemple
classic => peirce => implies_to_or => ... => classic) et prouvez une série de lemmes de la forme:
Lemma peirce_classic : forall P, (classic -> P) -> (peirce -> P).
Prouvez la dualité classique entre exists et forall.
Theorem forallExists : forall A, forall P : A -> Prop,
peirce -> (~ (forall x : A, P x) <-> (exists x : A, ~ P x)).
peirce -> (~ (forall x : A, P x) <-> (exists x : A, ~ P x)).
Et le symétrique? As-t-on besoin de la logique classique?
Theorem existsForall : forall A, forall P : A -> Prop,
(~ (exists x : A, P x) <-> (forall x : A, ~ P x)).
(~ (exists x : A, P x) <-> (forall x : A, ~ P x)).
Dans cette section, on va formaliser le prédicat "relation bien fondée" et on va prouver,
entre autre, l'implication et la réciproque entre:
- (i) une relation est bien fondée (selon notre formalisation),
- (ii) une relation n'admet pas de suite infinie décroissante.
Le sens direct est prouvable en logique intuitionniste. On introduira donc
pas d'axiome supplémentaire. On prouvera par contre la réciproque en logique classique (avec l'un
des axiomes de la section II) + un axiome magique.
Il faut commencer par formaliser cette propriété (i) en Coq. Commençons par les relations.
On se limitera dans ce projet aux relations entre un même ensemble. Le type des relations sur un
ensemble A s'écrit donc R : A -> A -> Prop. Regardez par exemple la relation "<" sur les
entiers:
Check (lt: nat -> nat -> Prop).
Pour formaliser qu'une relation est bien fondée (i) on va définir un prédicat Acce sur les
éléments x d'un ensemble A tel que:
- les éléments minimaux pour R vérifient le prédicat,
- si tous les éléments y plus petits que x vérifient le prédicat alors x le vérifie aussi.
Inductive Acce (A:Set) (R:A->A->Prop) : A->Prop :=
Accessible : forall x:A, (forall y:A, R y x -> Acce A R y) -> Acce A R x.
Accessible : forall x:A, (forall y:A, R y x -> Acce A R y) -> Acce A R x.
Intuitivement, Acce A R x est prouvable si vous avez une preuve (et donc un objet fini
mais qui peut contenir des inductions)
qui explore tous les éléments plus petits que x. Ce prédicat est donc prouvable uniquement
pour les éléments qui n'appartiennent à aucune chaîne infinie décroissante.
On peut donc formaliser le prédicat "bien fondée":
Definition bienFonde (A:Set) (R:A->A->Prop) : Prop := forall a:A, Acce A R a.
Cette présentation est plus effective que (ii), si vous prouvez qu'une relation
est bienFondé alors vous construisez une fonction qui pour tout élément de A
explore toutes les chaînes descendantes à partir de cet élément. C'est un outil
essentiel pour pouvoir définir des fonctions récursives bien fondées mais non
structurellement décroissantes.
Ecrivez le prédicat sur les relations "la relation n'admet
pas de suite infinie décroissante". Ecrivez l'énoncé du sens direct).
Pour vous échauffer, prouver les deux lemmes suivants qui pourront
vous servir dans la suite.
Lemma nonAcce_uneEtape : forall (A:Set) (R : A -> A -> Prop) (a b:A),
R a b -> ~ Acce A R a -> ~ Acce A R b.
Qed.
Lemma acce_uneEtape : forall (A:Set) (R : A -> A -> Prop) (a b:A),
R a b -> Acce A R b -> Acce A R a.
Qed.
R a b -> ~ Acce A R a -> ~ Acce A R b.
Qed.
Lemma acce_uneEtape : forall (A:Set) (R : A -> A -> Prop) (a b:A),
R a b -> Acce A R b -> Acce A R a.
Qed.
Prouvez maintenant le lemme suivant permettant de réaliser des inductions
en exploitant une relation bien fondée (notez que c'est le but premier des relations bien
fondées: permettre d'aller au delà des fonctions récursives structurellement décroissantes).
Lui aussi pourra vous être utile. Pensez bien au lemme d'induction généré par la définition
inductive du prédicat Acce.
Lemma bienFonde_ind : forall (A : Set) (R : A -> A -> Prop),
bienFonde A R ->
forall P : A -> Prop,
(forall x : A, (forall y : A, R y x -> P y) -> P x) ->
forall a : A, P a.
Qed.
bienFonde A R ->
forall P : A -> Prop,
(forall x : A, (forall y : A, R y x -> P y) -> P x) ->
forall a : A, P a.
Qed.
On montre que la relation < : nat -> nat -> Prop est bien fondée
(conseil: vous aurez besoin d'un lemme d'induction forte).
Lemma lt_bienFonde : bienFonde nat lt.
Qed.
Ecrivez le prédicat lex qui prend deux relations et qui formalise
la relation lexicographique sur ces deux relations. Prouvez maintenant que si deux relations
sont bien fondées alors la relation lexicographique de ces deux relations l'est aussi.
Et maintenant, prouvez le sens direct de l'implication.
On s'attaque maintenant à la réciproque!
La réciproque n'est pas prouvable en logique intuitionniste (des intuitions? écrivez-les).
On introduit donc un axiome classique que l'on pourra utiliser dans la suite. La syntaxe est
"Axiom [nom_axiome] : P.".
Tentez de prouver la réciproque sur papier en logique classique.
De quoi avez-vous besoin ?
Est-ce que c'est prouvable dans Coq (avec l'axiome classique) ?
Vous avez le droit d'ajouter un axiome tant qu'il appartient à la
théorie des ensembles de Zermelo-Fraenkel
(cf.Wikipedia).
Et maintenant, muni de ces deux axiomes, prouvez la réciproque.
This page has been generated by coqdoc