• Aucun résultat trouvé

Traduction du principe de la récurrence implicite

5.4 Traduction de la preuve Spike en script Coq

5.4.4 Traduction du principe de la récurrence implicite

De même que [Stratulat2010], le principe de récurrence noethérienne se représente dans Coq comme un théorème dans une section appelée wf subset et qui possède les paramètres suivants : quatre variables et deux hypothèses. Cette section permet de définir le schéma de récurrence sur un ensemble d’éléments ordonnés suivant une relation bien fondée.

Section wf subset. Variable T : Type.

Variable R : T → T → Prop. Hypothesiswf R : well foundedR. Variable S : T → Prop. Variable P : T → Prop. HypothesisS acc : ∀ x, S x → (∀ y, S y → R y x → P y) → P x. Theorem wf subset : ∀ x, S x → P x. Proof. intro z ; elim (wf R z ).

introsx H1x H2x H3x. apply S acc ; trivial.

introsy H1y H2y ; apply H2x ; trivial. Qed.

End wf subset.

La variable T est le type générique de toutes les formules de la preuve. La variable R définit l’opérateur de comparaison entre deux poids de formules. La relation représentée par P, respecti-vement S, donne la formule, respectirespecti-vement le poids d’une formule, à partir d’une fonctionnelle. Le sens du théorème est le suivant : toute formule de φ qui peut être récupérée par P est valide si pour toute instance ψ plus petites que φ, par rapport à R, on a ψ est valide. L’hypothèse wf R permet de donner l’argument justifiant que l’ordre de la récurrence utilisé est bien fondé. S acc est l’argument de correction de l’application du principe de la récurrence noethérienne.

B. Théorème de l’application du principe de la récurrence implicite et sa preuve L’application du principe de récurrence dans chaque preuve de récurrence implicite se tra-duit par un théorème principal appelé main num. Ce théorème énonce que toutes les formules employées dans la preuve sont correctes en supposant que pour toute formule on peut utiliser des formules plus petites.

Exemple 5.17 Soit le théorème qui correspond à notre exemple even xx :

Lemma main 50 : ∀ F, In F LF 50 → ∀ u1, (∀ F’, In F’ LF 50 → ∀ e1, less (snd (F’ e1)) (snd (F u1)) → fst (F’ e1)) → fst (F u1).

La preuve de main 50 est principalement une analyse par cas sur toutes les formules de LF 50. Chaque formule est validée suivant les mêmes étapes de résolution correspondantes de Spike. Pour chaque application d’une règle d’inférence dans la preuve de récurrence implicite, la bibliothèque de traduction dans Spike génère un script Coq équivalent permettant d’effectuer le même raisonnement dans Coq.

C. Traduction de l’application des règles d’inférence en script Coq

Nous effectuons la traduction des règles d’inférence une à une. Nous essayons toujours de rester conforme avec la preuve de Spike. En effet, chaque traduction d’une règle d’inférence doit générer dans Coq les mêmes clauses générées par la même règle dans Spike. Cette condition garantit la cohérence entre la preuve de Spike et sa traduction. Ainsi, elle diminue les échecs de la tactique causés par des échecs de la traduction de la preuve. Nous ne pouvons pas prétendre que la méthode de traduction proposée est optimale, i.e. qu’elle garantit la cohérence entre toutes les preuves de Spike et leurs traductions. Néanmoins, nous avons apporté des différentes amélioration aux travaux proposés dans [Stratulat et Demange2011].

Dans nos travaux, nous avons remplacé la définition des fonctions suivant le style fixpoint par la définition axiomatique. Ceci nous a permis d’améliorer la traduction des applications des règles de Spike, en particulier les règles traitant des clauses égalitaires.

Dans les travaux précédents [Stratulat et Demange2011], la méthode d’identification des axiomes non-conditionnels utilisés par Rewriting de Spike consiste au déploiement "unfolding” de la définition de fixpoint de symbole de la fonction correspondante après avoir choisi la branche de la définition qui valide la condition de l’axiome dans le contexte courant de la preuve.

L’opération unfolding ne suit pas exactement le raisonnement Spike, i.e. il se peut qu’elle génère pas les mêmes clauses que dans la preuve de Spike. Une telle situation engendre certainement l’échec de la validation de la preuve et par suite l’échec de la tactique.

Exemple 5.18 Soient la définition fonctionnelle de add, la conjecture ∀ y, add 0 (S y) = S (add y 0) et une opération de réécriture non conditionnelle en utilisant l’axiome add1. Si l’opération de réécriture est effectuée avec unfold alors nous obtenons :

Fixpointadd (u1 u2 : nat) := match u1 with

| 0 ⇒ u2

| S x ⇒ S ( add x u2) end.

Axiom add1 : ∀ x : nat, add 0 x = x.

Axiom add2 : ∀ x y : nat, add (S x) y = S (add x y).

Goal ∀ y, add 0 (S y) = S (add y 0). intros. unfoldadd. y : nat ======================== S y = S

((fix add (u1 u2 : nat) {struct u1} : nat :=

match u1 with | 0 ⇒ u2

| S x ⇒ S (add x u2) end) y 0)

L’opération de réécriture de l’Exemple 5.18 peut être effectuer de la façon suivante : Goal∀ y, add 0 (S y) = S (add y 0).

intros. rewrite add1.

y : nat

======================== S y = S (add y 0)

Cette traduction est plus conforme à une preuve Spike que celle de l’Exemple 5.18.

Grâce à la représentation axiomatique, la traduction des opérations de réécriture est amélio-rée. La traduction s’effectue de la façon suivante :

i) La réécriture non-conditionnelle du but courant : tout axiome non-conditionnel peut être ajouté à la base de réécriture. Par exemple : le script suivant ajoute les axiomes non conditionnels de notre exemple précédent à la base de réécriture rewrite axioms

Exemple 5.19 Hint Rewrite add1 add2 even1 even2 odd1 : rewrite axioms. Ltac rewrite ax := autorewrite with rewrite axioms.

Dans la traduction, l’application d’une règle de réécriture non-conditionnelle est remplacée par rewrite ax.

ii) La réécriture conditionnelle du but courant : la traduction de l’application de la règle de réécriture à une conjecture avec un axiome non-conditionnel est traduite en rewrite name of conditional axiom.

iii) La réécriture non-conditionnelle d’une hypothèse H du but courant : elle est traduite dans normalize with rewrite axioms in H, où normalize est une tactique qui permet de réécrire H avec la base rewrite axioms.