• Aucun résultat trouvé

Traduction dans les deux sens entre Coq et Spike

Dans notre cas, la certification nécessite la réalisation d’une traduction dans les deux sens entre un terme de Coq et une clause de Spike. La traduction de Coq vers Spike permet d’utiliser des procédures à la Spike. La traduction inverse permet la reproduction du calcul à la Spike dans Coq.

Pour lancer la procédure de la stratégie Spike, il faut fournir une signature, des axiomes, des conjectures, des lemmes et des hypothèses de récurrence.

Comme nous l’avons déjà présenté dans le Chapitre 4, un environnement courant dans Coq peut contenir une grande quantité de définitions et de déclarations. Un passage de cet environnement entier à la stratégie Spike peut causer l’échec de construction de la preuve ou sa divergence. Pour cela, nous effectuons le filtrage nécessaire.

Dans la suite, nous expliquerons le passage entre un terme de Coq et une équation condition-nelle Spike.

6.2.1 De Coq vers Spike

A. D’un terme Coq vers une clause de Horn à la Spike

Parmi les termes définis par la structure syntaxique générique dans Coq, nous ne considérons qu’un terme qui permet de représenter une clause égalitaire. Pour cela, nos procédures de

tra-L’environnement Coq

Declare ML Module "strategie spike". Fixpoint: ...

Theorem nom theorem : ... strategiespike. No more subgoals. La procédure à la Spike Stratégie Spike : Application des règles d’inférence de Spike.

Einit, Σinit ⊢ Γinit

tacticielle Coq ... Ec, Σc ⊢ Γc tacticielle Coq L’environnement Coq Validation de la pré-preuve : – Détruire le terme de la pré-preuve ;

– Définition de l’algèbre des termes ;

– Définition de l’ensemble des clauses de la pré-preuve ;

– Validation de l’application de la récurrence noethérienne sur l’en-semble des clauses de la pré-preuve.

La pré-preuve est terminée.

Figure 6.1 – Le schéma général de la tactique StrategieSpike

duction seront partielles par rapport aux termes GALLINA seuls les termes ayant des variables quantifiées universellement et qui ont la forme d’une égalité ou d’une égalité conditionnelle seront traduits.

Définition 6.1 (Termes d’égalité et d’égalité conditionnelle) – La forme générale de terme d’égalité est la suivante :

∀x1: T1, . . . , xn : Tn, e = t

– La forme générale de terme d’égalité conditionnelle est la suivante : ∀x1: T1, . . . , xn : Tn, e1= t1 → . . . → em = tm → e = t.

Comme nous l’avons déjà évoqué dans le Chapitre 4, les variables universelles et les implica-tions logiques ont la même représentation logique correspondant au produit. Pour cette raison, nous pouvons avoir la représentation suivante illustrant des termes d’égalités conditionnelles :

∀x1 : T1, . . . , xn : Tn, H1 : e1 = t1, . . . , Hm : em = tm, e = t

Sachant que pour tout i ∈ [1..m] il n’y a aucun Hi qui apparaît dans l’un des termes suivants e1, t1, . . . , em, tm, e, t.

La traduction d’un terme t d’égalité ou d’égalité conditionnelle dans Coq en une égalité condi-tionnelle s’effectue par l’Algorithme 6.5. Coq possède une procédure appelée decompose prod qui permet de décomposer un produit que nous utilisons pour séparer la liste des assomptions (les variables et les conditions) de la conclusion. Cette séparation nous permet de vérifier si le terme t est sous la forme d’un terme d’égalité ou d’égalité conditionnelle. Les variables d’un terme peuvent être déterminées par la procédure decompose prod assum. Une nouvelle clause dans Spike se construit à partir d’un ensemble d’atomes qui correspondent aux conditions (éven-tuellement vide dans le cas d’égalité non conditionnelle), et d’un atome conclusion.

En effet, une conjecture, un axiome, un lemme ou une hypothèse sont tous des égalités ou des égalités conditionnelles. La conjecture correspond à un but dans Coq, cependant, le reste se trouve dans l’environnement ou le contexte courant. Dans ce qui suit, nous détaillerons chacun de ces cas.

Algorithm 6.5 Spécification d’une égalité 1: procedure specif egalite(terme)

2: (liste assum, terme conclusion) := decompose prod (terme) 3: variables := decompose prod assum(terme)

4: atome conclusion := specif atom(variables, terme conclusion) 5:

6: si non conditionel(liste assum) alors 7: atomes conditions := ∅

8:

9: sinon

10: atomes conditions := liste des atomes(variables, liste assum) 11:

12: fin si

13: retourner nouvelle clause(atomes conditions, atome conclusion) 14: fin procedure

B. D’un environnement Coq vers un environnement à la Spike

Un environnement de preuve dans une procédure à la Spike se construit à partir des éléments suivants :

– des dictionnaires, – une stratégie de preuve, – un ensemble d’axiomes, – un ensemble de lemmes,

– un ensemble de conjectures, et

– un ensemble d’hypothèses de récurrence.

Un seul parcours de l’environnement courant dans Coq suffit pour définir tous ces éléments, à l’exception des conjectures qui correspondent aux buts ouverts.

B.a. Les dictionnaires Les dictionnaires dans Spike sont des structures générales permet-tant de collecter tous les symboles d’un langage de premier ordre : dictionnaire de variables, dictionnaire de sortes et dictionnaire de fonctions. Afin d’optimiser le temps d’exécution de la procédure, les dictionnaires sont définis en parallèle avec le reste de l’environnement. Au cours de son exécution et de sa rencontre avec un nouveau symbole, la procédure specif atom permettant de spécifier un atome met à jour le dictionnaire.

B.b. Les axiomes Dans un environnement Coq, les axiomes de l’environnement E sont des définitions appelées constantes et appartenant à la catégorie assomption. Dans notre cas, nous considérons que la forme générale des axiomes s’écrit de la façon suivante :

a := B avec B est un terme d’égalité ou d’égalité conditionnelle et du type B : Prop. L’ Algorithme 6.6 : specif axioms, filtre l’environnement courant E dans Coq et récupérer uniquement les déclarations et les définitions nécessaires telles que les axiomes en mettant à jour les dictionnaires. Les procédures is constant, is assomption et constant body sont des pro-cédures de Coq permettant respectivement de vérifier si un élément de l’environnement est une constante ou non, s’il est une assomption ou non, et de fournir sa définition sous la forme d’un terme. La procédure is egalite vérifie si un terme est un terme d’égalité ou d’égalité condition-nelle.

L’ensemble des axiomes est déduit automatiquement à partir de la définition des symboles de fonctions. Cette définition facilite l’automatisation des preuves des axiomes.

B.c. Les lemmes Ils correspondent aux théorèmes déjà prouvés desquels nous récupérons les propositions en vérifiant que celles-ci sont des termes d’égalité ou d’égalité conditionnelle. B.d. Les conjectures Elles correspondent aux buts ouverts dans Coq. Du fait que nous traitons les buts un par un, nous ne considérons que le premier but. En effet, un but dans Coq est un contexte Γ et une conclusion telle que nous l’avons définie dans la Définition 4.12. Afin de mettre le but sous une forme standard ayant un contexte vide Γ := ∅ et une conclusion sous la forme d’un terme d’égalité ou d’égalité conditionnelle, nous effectuerons des prétrai-tements qui consistent à appliquer la tactique revert all correspondant à la tacticielle suivante :

intros; revert conditions ; revert variables.

Appliquée sur un but, revert all permet de mettre toutes les variables et les conditions dans le contexte en tant que produit dans la conclusion. Tout d’abord, elle commence par la construction du produit des conditions, et ensuite par la construction du produit des variables. Notons que revert conditions, respectivement revert variables, applique la tactique revert tant qu’il y a encore des conditions, respectivement des variables, dans le contexte courant. Enfin,

Algorithm 6.6 Spécification des axiomes 1: procedure specif axioms(E ) 2: axioms := list of axioms(E ) 3: fin procedure

1: procedure list of axioms (E ) 2: si E 6= ∅ alors

3: soit e ∈ E

4: si is constant(e) et is assomption(e) alors 5: body := constant body(e)

6: si is egalite(body) alors

7: eq axiom := specif egalite(body)

8: retourner ({eq axiom} ∪ (list of axioms(E \{e}))

9: sinon

10: retourner (list of axioms(E \{e})

11: fin si

12: sinon

13: retourner (list of axioms(E \{e})

14: fin si

15: sinon

16: retourner (∅)

17: fin si 18: fin procedure

nous pouvons appliquer la procédure specif egalite à la conclusion obtenue pour déterminer la clause Spike correspondante.

Exemple 6.2 Soit le but suivant : x : nat

H 1 : odd(x ) = true

============================ even(S (S (x ))) = false

L’application de revert all nous permet d’avoir le but suivant : ============================

forall x : nat, odd(x ) = true → even(S (S (x ))) = false

B.e. Les hypothèses de récurrence Dans la récurrence implicite telle qu’elle est implé-mentée dans Spike, les hypothèses de récurrence sont des clauses de la preuve déjà traitées. Dans notre cas, ces clauses correspondent à des buts déjà simplifiés dont nous enregistrons les identi-ficateurs, i.e. leurs uids des variables existentielles associées. Comme nous l’avons détaillé dans le Chapitre 4, les sous-buts dans Coq sont des variables existentielles dont les types sont leurs propositions logiques. Pour fournir à la procédure Spike la liste d’hypothèses de récurrence, il suffit de transformer tous les types de toutes les variables existentielles qui correspondent aux sous-buts de la pré-preuve par récurrence implicite. Bien évidemment, il est vérifié que leurs

types sont des types d’égalité ou d’égalité conditionnelle. Sur le plan pratique, afin d’éviter le recalcul des hypothèses de récurrence à chaque étape de la preuve, leurs clauses sont enregistrées et identifiées par leurs uids.

6.2.2 De Spike vers Coq

L’application de certaines règles d’inférence peut engendrer la traduction d’une ou de plusieurs égalités conditionnelles ou non conditionnelles qui peuvent jouer le rôle d’un nouveau sous but ou d’une hypothèse de récurrence. En effet, Coq possède des procédures qui sont habituellement utilisées par son analyseur syntaxique, et qui permettent d’interpréter des termes construits syntaxiquement. Nous effectuons une construction syntaxique des termes et nous appelons la procédure de Coq, check, pour effectuer la vérification de typage de ces termes. Spike représente une égalité conditionnelle ou non conditionnelle en tant que paire de deux listes des atomes :

egalite := (premises, conclusions)

L’ensemble de premises peut être vide et dans ce cas l’égalité est une égalité non-conditionnelle, et conclusions peut être vide et dans ce cas l’égalité correspond à l’égalité premises ⇒ False. Nous supposons que la liste conclusions contient au plus un atome. La procé-dure générale de traduction est présentée dans l’ Algorithme 6.7. La procéprocé-dure creer produit fournie par Coq permet la création du produit de l’implication logique et du produit des variables universellement quantifiées. En prenant une liste de définitions et un terme, creer produit re-tourne le terme produit correspondant.