• Aucun résultat trouvé

3.3 Langage de spécification

3.3.1 Formules

Le langage logique que nous voulons utiliser est un calcul des prédicats du second ordre (cf. section 2.4), multisorté, dont les termes sont ceux du langage miML défini précédemment. Quelques différences rendent cependant notre système ad hoc pour la preuve de programme.

On ne définit pas dans le langage de prédicat (t : τ ) exprimant que t est bien typé de type τ . Cela n’est pas nécessaire car on dis- tingue le système de preuve du système de typage.

En revanche à chaque type ML, on associe un prédicat de ty- page fort (t ! τ ) exprimant le typage et la terminaison. Ces prédicats peuvent être vus comme une intégration dans le langage de la no- tion de terme réductible (cf. Tait [61]), dans le sens où si τ est un type de base, cela signifie que le terme s’évalue en une valeur de ce type, et si τ est un type fonctionnel (τ1 → τ2), cela signifie que

quelque soit son argument x tel que (x ! τ1), on aura ((t x) ! τ2).

Contrairement au typage à la ML décrit en 3.2.3, on ne donne pas un jeu de règles de typage pour ces prédicats car on prouvera (ie par les méthodes habituelles, récurrence, etc.) qu’un terme ter- mine effectivement en retournant une valeur du type adéquat. Du point de vue de l’utilisateur, cela n’est pas redondant avec le typage à la ML, car celui-ci peut être vérifier par un algorithme. Pour plus d’informations sur ces prédicats, on peut se référer à [4].

On différencie plusieurs quantifications, d’abord les quantifi- cations (distinguées) au premier ∀, ∃ et second ordre ∀∀. Puis une quantification universelle explicite sur les variables de type ML ∀_ : type. Le type de ∀_ : type n’est pas lui-même un type mais une notation pour distinguer la quantification sur les variables de types.

3.3. LANGAGE DE SPÉCIFICATION 85

Les quantificateurs sur les variables de termes sont bornés par un type. Ils ne quantifient que sur les termes terminant dans ce type, c’est-à-dire vérifiant (t ! τ ). Pour comprendre la raison de ce choix, donnons l’exemple de la fonction map prenant en argument une fonction et une liste et appliquant la fonction sur chaque élé- ment de la liste. Le type de map est (α → β) → α list → β list. Nous voulons pouvoir prouver la totalité de map, mais cette fonction ne termine que si la fonction fournie en argument termine sur chacun des éléments de la liste. Nous devons donc n’autoriser la quanti- fication que sur des termes dont l’évaluation termine ou sur des fonctions dont l’évaluation termine quelque soit ses arguments.

On distingue dans notre langage les booléens qui se trouvent au niveau des termes, des valeurs de vérité, au niveau formule. On ajoute au langage un prédicat I(t), prenant un terme de type bool (les booléens) et l’interprétant dans Prop (les valeurs de vérités).

Une autre particularité de notre système est le traitement de l’égalité. Nous donnons des règles de réduction sur les termes et deux règles de preuve permettant de remplacer un terme par son réduit ou son expansé dans une preuve (cf. p. 93). C’est cela qui joue ici le rôle d’une théorie équationnelle (par exemple Leibniz) que l’on trouve dans d’autres systèmes (par exemple AF2). Nous avons vu dans la partie miML que nous avons une fonction d’égalité ren- voyant une valeur de type bool , pour laquelle nous avons donné des règles de calcul. Nous pouvons utiliser le prédicat I pour manipu- ler la fonction d’égalité au niveau des formules. Typiquement, on écrira la commutativité de l’addition :

∀x ! nat.∀y ! nat.I((add x y) = (add y x)). * * *

Soit XXi une famille d’ensembles dénombrables de variables de

prédicats d’arité i. Soit IPi une famille d’ensembles dénombrables

des constantes de prédicats d’arité i. L’ensemble des constantes de types Cτ

0 contient une constante

Prop représentant le type des formules. On restreint l’ensemble T0

aux types tels que si Prop apparaît dans τ , alors soit τ = Prop, soit τ = τ0 → Prop où Prop n’apparaît pas dans τ0. De plus, on ne peut instancier une variable de type par Prop et on ne peut utiliser Prop pour typer un terme de miML.

86 CHAPITRE 3. FORMALISATION

On distinguera donc trois niveaux : le niveau des termes et va- riables de termes (dont le type ne contient pas Prop), les formules et prédicats (dont le type est de la forme τ1∗ · · · ∗ τn → Prop) et les

types et variables de types.

DÉFINITION 14 (FORMULES)

On définit l’ensemble Φ des formules comme le plus petit ensemble tel que :

– si t1, . . . , tn∈ T et X ∈ XXn, alors, X(t1, . . . , tn)∈ Φ ;

– si t1, . . . , tn∈ T et P ∈ IPn, alors, P (t1, . . . , tn)∈ Φ ;

– si t∈ T , I(t) ∈ Φ (l’interprétation d’un terme booléen) ; – si ϕ1, ϕ2 ∈ Φ, alors ¬ϕ1, ϕ1∧ ϕ2, ϕ1∨ ϕ2, ϕ1 → ϕ2 sont dans Φ.

– si x∈ X, τ ∈ T , ϕ ∈ Φ, alors (∀x ! τ.ϕ) ∈ Φ et (∃x ! τ.ϕ) ∈ Φ ; – si α ∈ Xτ, ϕ∈ Φ, alors (∀α : type.ϕ) ∈ Φ ;

– si X ∈ XX, ϕ ∈ Φ, τ ∈ T , alors (∀∀X : τ.ϕ) ∈ Φ (quantification au second ordre) ;

– si t ∈ T et τ ∈ T , alors (t ! τ ) ∈ Φ (prédicat de typage et termi- naison sur les termes).

Les lieurs sont ici les quantificateurs ∀, ∃, ∀∀ et ∀_ : type. On dé- finit la notion de variable libre et de renommage dans les formules de façon usuelle. A partir de ces lieurs, on peut définir la substitu- tion d’un terme dans une formule à toutes les occurrences libres d’une variable du premier ordre, ainsi que la substitution d’un type dans une formule à toutes les occurrences libres d’une variable de type.

On définit également les fonctions propositionnelles qui nous serviront pour instancier les variables du second ordre dont le type indique un prédicat ayant des arguments :

DÉFINITION 15 (FONCTIONS PROPOSITIONNELLES)

On définit l’ensemble des fonctions propositionnelles tel que : – si S ∈ Φ, alors S est une fonction propositionnelle (d’arité 0) ; – si ϕ est une formule, τ1, . . . , τn∈ T où aucun des τi ne contient

d’occurrence de Prop, alors λx1 : τ1, . . . , xn : τn.ϕ est une fonc-

tion propositionnelle d’arité n.

On peut maintenant définir la substitution (usuelle) d’une for- mule dans une formule. Comme pour les termes, on se place au renommage près.

3.3. LANGAGE DE SPÉCIFICATION 87

DÉFINITION 16 (SUBSTITUTION DANS LES FORMULES)

On définit la substitution dans les formules, que l’on note ϕ[S/X] (substitue S à chaque occurrence libre de X dans ϕ), avec S une fonction propositionnelle d’arité n, X ∈ XXn et ϕ ∈ Φ récursivement

sur la structure de ϕ :

– X(t1, . . . , tn)[S/X]≡ S[−→t /−→x ]où S est de la forme

λx1 : τ1, . . . , xn: τn.ϕ; – Y (t1, . . . , tq)[S/X]≡ Y (t1, . . . , tq)où Y ∈ XXq et X 6≡ Y ; – P (t1, . . . , tq)[S/X] ≡ P (t1, . . . , tq) où P ∈ IPq; – (ϕ c ϕ0)[S/X]≡ (ϕ[S/X] c ϕ0[S/X])où ϕ, ϕ0 ∈ Φ et c un connecteur binaire ; – (¬ϕ)[S/X] ≡ ¬(ϕ[S/X]) où ϕ ∈ Φ ; – I(t)[S/X]≡ I(t) ; – (∀α : type.ϕ)[S/X] ≡ (∀α : type.ϕ[S/X]) ;

– (∀x ! τ.ϕ)[S/X] ≡ (∀x ! τ.ϕ[S/X]) si S ne contient pas d’occur- rence libre de x ;

– (∃x ! τ.ϕ)[S/X] ≡ (∃x!τ.ϕ[S/X]) si S ne contient pas d’occurrence libre de x ;

– (∀∀X : τ.ϕ)[S/X] ≡ (∀∀X : τ.ϕ) ;

– (∀∀Y : τ.ϕ)[S/X] ≡ (∀∀Y : τ.ϕ[S/X]) si S ne contient pas d’occur- rence libre de X ;

– (t ! τ )[S/X]≡ (t ! τ ).

Documents relatifs