~
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
.
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.
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.
exfalso
.
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 :
C
on peut déduire le faux
A -> C
A
on peut aussi déduire le faux.
exfalso
.
<->
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.
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.
Prouver le théorème suivant en utilisant
premisses_non_ordonnées1
Prouver le théorème suivant en utilisant
and_assoc1
et
and_assoc2
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.
or_comm1
et en laissant au maximum Coq unifier.
imp_refl
et en laissant au maximum Coq unifier.
intros
et un
exact
.
False
, négation
False
avec
destruct
False
avec
exfalso
dans le cas d'un contexte
contradictoire
split
, utiliser avec
destruct