Jusqu'à présent, nous avons toujours prouvé nos théorèmes en travaillant sur le but . C'est ce qu'on appelle un raisonnement "vers l'arrière" ( backward reasoning ). Ce style de raisonnement est favorisé en Coq : par défaut, la plupart des tactiques transforment le but avec des raisonnements du type "d'après telle hypothèse, si je sais prouver truc (nouveau but), alors j'aurai bidule (ancien but)", autrement dit, "d'après telle hypothèse, pour prouver bidule (ancien but) il suffit de prouver truc (nouveau but)".
En mathématiques, on a plutôt l'habitude du raisonnement "vers l'avant" : construire pas à pas le but en énonçant de nouveaux faits. Ceci est aussi possible en Coq.
Remarque importante : il ne faut pas se mélanger les pinceaux entre
apply et
apply in. Dans les deux cas, on cherche à appliquer
une implication
.
in, on cherche à l'appliquer au but. Si l'on applique
H : A -> B au but
B avec
apply H, la
conclusion
de l'implication
doit être la même que le but (ou peut être unifiée au but).
in, on cherche à appliquer l'implication
H : A -> B à une
hypothèse
H' : A. Cette fois avec
apply H in H', c'est ce qui est
avant la flèche
(l'impliquant) qui doit être identique (ou unifiable)
au type de
H'.
modus_ponens et
imp_trans.
Conclusion :
Coq (et en général les assistants de preuve) favorise la démonstration
vers
l'arrière
. On raisonne sur
le but
par conditions
suffisantes
. En
général, c'est une bonne façon de faire (les preuves sont souvent plus
courtes).
Les mathématiciens raisonnent plus souvent avec un raisonnement
vers
l'avant
(avec un peu de raisonnement vers l'arrière aussi). Il peut être
plus clair, même avec Coq, d'utiliser le raisonnement vers l'avant, au moins
pour certaines étapes. L'ingrédient principal pour le faire est
apply in.
Nous verrons par la suite deux autres tactiques pour un raisonnement vers
l'avant :
assert et
replace.