• Aucun résultat trouvé

toute valuation ˆρj, on a par définition ˆρj ` σj 6] τ0 (55). On peut maintenant appliquer la règle

syntaxique (CASV) à(46),(47),(53)et(55)pour déduire ˆ1; 0 ` πj ⇒ εj: τ → τ0(56). Par ailleurs,

le test de couverture(43)étant valable pour toute les valuations ˆρ ∈ J ˆ1K, on a donc par définition ˆ

1` τ → τ0 FG π

1; . . . ; πk (57). En appliquant la règle (METHV) à(57)et à tous les jugements(56),

on conclut ˆ1; 0 ` ε: σ . ¥

6.8

Traitement des masquages

Dans le lemme de complétude 6.5, on a supposé que l’expression ε est ˆV-normale, ce qui per- met de traiter commodémment l’introduction de variables de type. Nous allons maintenant montrer comment toute expression peut être normalisée sans que cela change son typage dans le système semi- algébrique. L’idée de la preuve consiste simplement à parcourir l’expression en renommant toutes les variables introduites de façon à ce qu’un même nom de variable ne soit jamais utilisé pour référencer deux variables différentes. Un compilateur effectuerait naturellement cette opération dans une pre- mière passe d’analyse syntaxique, quand il remplace les identificateurs dans la syntaxe concrète par des références vers des structures internes différentes pour chaque variable dans la syntaxe abstraite. Il convient simplement de vérifier que cette opération ne change rien au typage, ce qui est fastidieux, mais sans aucune difficulté.

Dans cette section, on appeleraÉLÉMENT SYNTAXIQUE DE TYPAGE, qu’on notera θ , un mono- type syntaxique, une contrainte, un schéma de types ou une expression annotée. Il est commode de définir l’interprétation d’une expression annotée ε relativement à une certaine valuation ˆρ comme l’ensemble des couples (G, T ) tels que ε ait le type σ dans l’environnement G et la valuation ˆρ:

ˆ ρJεK =

©

(G, T ) | ˆρ; G ` ε : Tª (6.18)

On appelleRENOMMAGE DE VARIABLES DE TYPES une fonction partielle injective à domaine finie deVarsTypevers VarsType. Si V1 est le domaine d’un renommage R et V2 son codomaine,

alors R−1est un renommage de domaine V2et de codomaine V1. Si V1 et V2sont deux ensembles

finis de variables de types, alors il existe un renommage de domaine V1 et de codomaine disjoint de

V2, carVarsTypeest supposé infini. On peut de plus imposer que ce renommage laisse inchangées les variables qui sont dans V1\ V2. Un de ces renommage est choisi arbitrairement et noté R(V1, V2).

On a donc :

dom(R(V1, V2))= V1

codom(R(V1, V2))= Vk 2

R(V1, V2)(α)= α si α ∈ V1et α 6∈ V2

Un renommage s’applique à tout élément de typage. Pour simplifier, on supposera quand on ap- plique le renommage R à l’élément θ qu’on a toujours ftv(θ ) ⊆ dom(R). L’application du renommage

R à l’élément θ est notée [R]θ et est définie par les équations suivantes : [ ˆR]α , R(α)ˆ [ ˆR](τ → τ0) , [ ˆR]τ → [ ˆR]τ0 [ ˆR](chτ1, . . . , τni) , ch[ ˆR]τ1, . . . ,[ ˆR]τni [ ˆR]vrai , vrai [ ˆR](τ 6 τ0) , [ ˆR]τ 6 [ ˆR]τ0 [ ˆR]( phτ1, . . . , τni) , ph[ ˆR]τ1, . . . ,[ ˆR]τni [ ˆR](κ ∧ κ0) , [ ˆR]κ ∧ [ ˆR]κ0 [ ˆR](∃V : κ) , ∃R(V) : [ ˆR ⊕ R]κ où R = R(V, codom( ˆR)) [ ˆR](∀V : κ . τ ) , ∀R(V) : [ ˆR ⊕ R]κ . [ ˆR ⊕ R]τ où R = R(V, codom( ˆR)) [ ˆR]x , x [ ˆR](ε1ε2) , [R]ε1[ ˆR]ε2 [ ˆR](fun x : τ ⇒ ε) , funx : [ ˆR]τ ⇒ [ ˆR]ε [ ˆR](letx = ε1inε2) , letx = [ ˆR]ε1in[ ˆR]ε2 [ ˆR](fix x : σ ⇒ ε) , fixx : [ ˆR]σ ⇒ [ ˆR]ε [ ˆR](C {`i = εi}) , C n `i = [ ˆR]εi o [ ˆR]C ·` , C ·` [ ˆR]a , a [ ˆR] f , f [ ˆR](meth: τ → τ0©πj ⇒ εj ª ) , meth: [ ˆR]τ → [ ˆR]τ0nπj ⇒ [ ˆR]εj o [ ˆR](∀V : κ . ε) , ∀R(V) : [ ˆR ⊕ R]κ . [ ˆR ⊕ R]ε où R = R(V, codom( ˆR))

Les lemme suivant expriment la propriété d’invariance attendue de l’application d’un renommage : LEMME6.7.Pour tout élément de typage θ , tout renommage R tel que ftv(θ ) ⊆ dom(R), et toute valuation ρ telle que codom(R) ⊆ dom(ρ), alorsρ◦RJθK etρJ[R]θK sont tous les deux bien définis et

égaux.

Démonstration. Si θ est un monotype, la preuve se fait par induction sur sa structure. Dans le cas où

c’est une variable α, on vérifie simplement que, d’après les hypothèses, ρ(R(α)) est bien défini et est égal aux deux interprétations qu’on veut comparer. Les autres cas sont triviaux.

Si θ est une contrainte, on procède de même par induction sur sa structure. Le seul cas non-trivial est celui où la contrainte vaut ∃V : κ. Notons alors ˆR = R(V, codom(R)). Prenons une valuation

quelconque ˆρ de domaine ˆV = ˆR(V). On vérifie facilement que ftv(κ) ⊆ dom(R ⊕ ˆR) et que codom(R ⊕ ˆR) ⊆ dom(ρ ⊕ ˆρ). Par l’hypothèse d’induction, ρ⊕ ˆρJ[R ⊕ ˆR]κK est donc équivalent

6.8. TRAITEMENT DES MASQUAGES 107

ρ2 = (ρ ◦ R) ⊕ ( ˆρ◦ ˆR) sur toutes les variables α ∈ ftv(κ). En effet, si α ∈ V, alors α est dans le do-

maine de ˆR, ˆR(α) dans celui de ˆρet ρ1et ρ2envoient toutes deux α sur ˆρ( ˆR(α)). Si en revanche α 6 V,

alors α n’est pas dans le domaine de ˆR, mais α ∈ ftv(∃V : κ). Par hypothèse, on a donc α ∈ dom(R) et R(α) ∈ dom(ρ). ρ2(α)vaut donc ρ( ˆR(α)). Par ailleurs R(α) ne peut être dans dom( ˆρ)car ce dernier

ensemble est aussi le codomaine de ˆR et celui-ci est supposé disjoint de codom(R). Donc ρ1(α)vaut

également ρ( ˆR(α)). Les valuations ρ1et ρ2coïncidant sur les variables libres de κ, on sait queρ1JκK est équivalent àρ2JκK. On a donc montré que pour toute valuation ˆρde domaine ˆV, la valeur de vérité deρ⊕ ˆρJ[R ⊕ ˆR]κK(1)est équivalente à celle de(ρ◦R)⊕( ˆρ◦ ˆR)JκK(2). Maintenant, siρJ[R](∃V : κ)K est

vrai, alors il existe ˆρqui vérifie(1), donc qui vérifie aussi(2). Alors, ˆρ◦ ˆR est une solution qui montre

queρ◦RJ∃V : κK est vrai. Réciproquement, si ρ◦RJ∃V : κK est vrai, il existe ρ0 de domaine V tel que (ρ◦R)⊕ρ0JκK est vrai. En posant ˆρ = ρ0◦ ˆR−1, on obtient(2), donc(1)et doncρJ[R](∃V : κ)K est vrai.

Si θ est un schéma de types, on utilise le même argument que pour les contraintes de la forme ∃V : κ.

Si θ est une expression annotée, il s’agit de montrer que pour tout G et T , le jugement ρ; G ` [R]ε : T est équivalent au jugement ρ ◦ R; G ` ε : T . Montrons d’abord qu’on peut se contenter de vérifier l’équivalence pour les dérivations simples de ces jugements. En effet, si on considère une dérivation quelconque du premier jugement, alors il existe une dérivation simple de la forme ρ; G ` [R]ε : T0avec T0 6] T . En supposant que cela nous permette de déduire ρ ◦ R; G ` ε : T0, il s’en

suit alors le jugement ρ ◦ R; G ` ε : T . La réciproque est clairement vraie également. On procède ensuite par induction sur la structure de l’expression ε et on montre l’équivalence des deux jugements pour pour toute valuation ρ et tout (G, T ). Quand ε ne contient pas d’annotation de type, la récursion est triviale. Quand ε contient une annotation de type, on peut utiliser les résultats prouvés plus haut pour conclure. Le seul cas non-évident qui reste est donc quand l’expression est de la forme ∀V : κ . ε. Posons alors ˆR = R(V, codom(R)) et ˆV = ˆR(V). Par un argument identique à celui utilisé pour le

traitement de la contrainte ∃V : κ, les deux jugements suivants sont toujours équivalents si ˆρ est une valuation de domaine ˆV :

ρ⊕ ˆρ; G ` [R ⊕ ˆR]ε : Tρˆ ⇐⇒ (ρ ◦ R) ⊕ ( ˆρ◦ ˆR); G ` ε : Tρˆ

(3)

De même, pour toute telle valuation ˆρ, on a aussi : ˆ

ρ∈ρJ{ ˆV : [R ⊕ ˆR]κ}K ⇐⇒ ˆρ◦ ˆR ∈ρ◦RJ{V : κ}K

(4)

Supposons maintenant que le jugement ρ; G ` [R](∀V : κ . ε) : T soit vrai et qu’il admette une dérivation simple. Cette dérivation termine forcément par la règle (INTROA) et on a :

ρJ{ ˆV : [R ⊕ ˆR]κ}K 6= ∅ (5) ∀ ˆρ∈ρJ{ ˆV : [R ⊕ ˆR]κ}K, ρ ⊕ ˆρ; G ` [R ⊕ ˆR]ε : Tρˆ (6) T =[Tρˆ (7)

Par(4), on sait que l’ensemble ρ◦RJ{V : κ}K n’est pas vide car il contient ˆρ ◦ ˆR. Par ailleurs, tout

élément ρ00∈ρ◦RJ{V : κ}K peut s’écrire sous la forme ˆρ◦ ˆR en posant ˆρ= ρ00◦ ˆR−1. Donc, pour toute

telle ρ00, on a, d’après(6)et(3), (ρ ◦ R) ⊕ ρ00; G ` ε : Tρ00◦ ˆR−1. En appliquant la règle (INTROA), il

vient que ρ◦; G ` ∀V : κ . ε : T . La réciproque se traite de la même façon. ¥ Comme son nom l’indique, un renommage a pour effet de renommer les variables libres d’un élément syntaxique, mais, appliqué à une expression annotée, il peut également servir à normaliser l’expression :

LEMME 6.8.Si ˆR est un renommage de domaine ˆV et ftv(ε) ⊆ ˆV, alors [R]ε est une expression codom( ˆR)-normale.

Démonstration. Découle de la définition de l’application de ˆR à une expression de la forme ∀V : κ . ε.

Celle-ci est transformée en ∀R(V) : [ ˆR ⊕ R]κ . [ ˆR ⊕ R]ε et le codomaine R(V) est supposé disjoint

de codom( ˆR). Pour une preuve complète, il suffit de procéder par induction sur la structure de ε. ¥