Logique de base en Coq (deuxième partie)

Négation ~

La négation en Coq est un peu particulière par rapport à la négation d'un cours de mathématique usuel. En effet, on ne définit pas la négation d'une proposition par sa table de vérité mais en ajoutant une nouvelle proposition appelée False.

La proposition False

La proposition False désigne le faux, l'absurde, souvent notée en mathématiques ⊥ (symbole bottom ). Elle est définie par la règle appelée ex falso quod libet (du faux, on peut déduire n'importe quoi), aussi appelée principe d'explosion .

Si False est dans les hypothèses, alors la tactique destruct appliquée à celle-ci permet simplement de terminer la preuve.

Exercice : prouver le théorème suivant :

Indice : réfléchissez avant de tout introduire...

La tactique exfalso remplace le but courant par False. En effet, si l'on prouve False on prouve tout de toute façon.

Exercice : Prouver le théorème suivant en utilisant exfalso.

Réfuter une proposition

La négation d'une proposition P, notée en Coq ~P, ou encore not P, est en fait simplement une notation pour P -> False.

On peut déplier une notation, c'est-à-dire la remplacer par ce qu'elle représente avec la tactique unfold (littéralement « déplier »).

Le prochain théorème dit la chose suivante :

  • si de C on peut déduire le faux
  • et que A -> C
  • alors de A on peut aussi déduire le faux.

Exercice : Prouver le théorème suivant. Pensez à exfalso.

Exercice : Prouver le théorème suivant.

Équivalence <->

L'équivalence logique est notée en Coq <->. Comme vous le voyez ci-dessus, pour toutes propositions P et Q, P <-> Q est la même chose que (P -> Q) /\ (Q -> P). Pour prouver P <-> Q, il faut donc prouver les deux implications P -> Q et Q -> P. Ceci se fait avec la tactique split. Pour utiliser une équivalence, la tactique destruct fournira les deux implications, comme pour n'importe quelle conjonction.

Exercice : Prouver le théorème suivant.

Exercice : Prouver le théorème suivant.

Appliquer un théorème

On peut fournir des arguments à un théorème pour produire des formules déjà prouvées.

Pour les besoins de cette section, on rappelle les lemmes suivants vus dans Logique1 et Logique1Maison

Le théorème and_comm1 a deux variables universellement quantifiées.

On peut appliquer le théorème and_comm1 à deux propositions.

Ou bien à une seule, l'autre restant universellement quantifiée.

On peut même donner en argument des propositions plus compliquées.

On peut alors utiliser dans des preuves des théorèmes déjà prouvés.

Au passage, remarquer le parenthésage un peu particulier de Coq. La plupart des mathématiciens auraient écrit quelque chose comme and_comm1(P, Q), ici, on écrit simplement la fonction (ou le théorème) et ses arguments séparés par des blancs et si besoin on les entoure de parenthèses.

Exercice :

Prouver le théorème suivant en utilisant premisses_non_ordonnées1

Exercice :

Prouver le théorème suivant en utilisant and_assoc1 et and_assoc2

Unification : Coq travaille pour vous

En mathématiques, il est fréquent d'omettre les arguments que l'on donne à un théorème, d'autant plus lorsqu'il n'y a aucune ambigüité. En Coq, il faut souvent être beaucoup plus explicite. Mais il y a des mécanismes qui permettent d'éviter de tout préciser. L'un deux est l'unification : Coq essaie de deviner quels arguments donner à une formule un ou théorème. Lorsqu'à la place d'un terme on écrit _, on dit à Coq qu'il doit essayer de deviner ce qu'il y a à la place.

Parfois, Coq ne peut pas tout deviner, il a besoin de certains arguments.

Exercice : Prouver le théorème suivant en utilisant or_comm1 et en laissant au maximum Coq unifier.

Exercice : Prouver le théorème suivant en utilisant imp_refl et en laissant au maximum Coq unifier.

Votre preuve doit utiliser seulement un intros et un exact.

Bilan

Vient la partie la plus importante, il faut que tout ce que vous avez appris cette semaine soit acquis pour les suivantes. Nous avons rencontré (dans cet ordre), les notions suivantes :
  • proposition False, négation
  • élimination de False avec destruct
  • remplacement du but par False avec exfalso dans le cas d'un contexte contradictoire
  • équivalence : prouver avec split, utiliser avec destruct
  • une équivalence n'est rien d'autre que la conjonction de deux implications
  • utiliser un théorème déjà prouvé, comme n'importe quel autre terme du contexte
  • l'unification faite par Coq (implicitement ou non) Assurez-vous d'avoir bien compris ces notions, fondamentales pour la suite du modules (et en général).