Instructions : Le sujet comporte 6 parties indépendantes :
introsexactapply et
apply ... insplitdestructexfalsoexistsreflexivityspecializerewrite,
rewrite <-,
rewrite ... in,
rewrite ... <- in et
toutes les variantes
rewrite ... at numérosimplinductionunfoldassert ... as ...replace ... with ...pose proof ... as ...
Dans cette partie, il n'y a besoin d'aucun lemme, juste la logique de base
et les tactiques liées à la logique (
intros,
exact,
apply, ...)
Dans cette partie, on travaille sur les entiers naturels de Peano, et on n'a
besoin de rien d'autre que de la définition usuelle de l'addition et de la
multiplication (qu'on rappelle ci-dessous).
On n'utilisera donc aucun lemme (à part peut-être ceux de cette partie),
mais on n'hésitera pas à utiliser les tactiques basées sur le calcul comme
simpl et
discriminate (bien sûr il peut y avoir des
inductions, des
rewrite, ...).
On définit maintenant une opération "ajouter 2 n fois" par récurrence :
Dans cette partie, il y a parfois besoin de l'axiome du tiers exclu. Rappel: celuis-ci dit
On l'utilise pour faire un raisonnement par cas sur la validité ou non
d'une proposition plus ou moins élaborée avec
destruct classic(...) as [H | H].
4. Nombres réels, égalités et inégalités
Dans cette partie, vous utiliserez seulement les propriétés de base sur l'addition et la multiplication dans R :
Dans toute cette partie, on considère 2 réels a et b fixés. Ils seront dans le contexte de tous les lemmes.
La définition de "fonction strictement croissante" est la suivante :
N'hésitez pas à
unfold increasing en cas de besoin.
On considère la fonction affine
aff suivante :
De la même manière, n'hésitez pas à
unfold aff
On commence par définir un type
pair_ou_impair à deux éléments qui sont
pair et
impair.
Rappel : pair
ou
impair est un type à deux constructeurs constants qui
sont
pair et
impair, donc avec un hypothèse du type
H : pair = impair,
il suffit de
discriminate H pour prouver
False (et donc n'importe quoi).
On calcule maintenant par récurrence la parité d'un entier naturel n :
Noter que notre fonction parité calcule :
Pour faire des raisonnements par cas, on pourra se servir du lemme suivant.
Indice, on peut utiliser
destruct (parité n) eqn:parn pour faire un raisonnement par cas sur
la valeur de (parité n).
Maintenant on définit la relation
<< (ici appelée
le_bizarre, où
le
est l'abbréviation de "less than or equal to") :
Intuitivement, on a
1 << 3 << 5 << ... << 0 << 2 << 4 << ...
On va prouver que
<< est un ordre total sur
nat. On aura besoin
des propriétés correspondantes sur
<=.
Indications : vous pourrez utiliser :
ou passer par l'opération
leb qui calcule avec
leb_le :
Voici quelques lemmes qui peuvent vous aider (pas la peine de tous les utiliser) en plus de ceux déjà proposés plus hauts.