• Aucun résultat trouvé

4.5 Synth`ese des types

Nous reprenons l’approche de HM(X) (Pottier & R´emy, 2005) pour traiter la synth`ese des types de MLGX. Il s’agit de r´eduire ce probl`eme `a celui de la r´esolution de contraintes de type. La figure4.6

d´ecrit la g´en´eration des contraintes de typage pour un terme de MLGX. On d´efinit L E ` t : τ M qui est la contrainte n´ecessaire et suffisante pour que le terme t ait le type τ sous le syst`eme d’´equations E.

La plupart de ces r`egles se trouvent d´ej`a dans l’inf´erence de types standard de ML (Pottier & R´emy,

2005). Nous allons d´ecrire les r`egles sp´ecifiques `a MLGX, c’est-`a-dire celles associ´ees aux coercions, aux pattern matchings et aux branches.

La r`egle G-Coerce v´erifie d’abord que E implique la validit´e de la coercion ∃γ.(τ1 . τ2). Cette

v´erification est simple `a mettre en œuvre : ´etant donn´e que γ # ftv (E), il est ´equivalent de calculer l’unificateur le plus g´en´eral de E et de v´erifier que c’est aussi un unificateur pour τ1 = τ2. Si cette

v´erification ´echoue, il n’y a aucune chance que le programme soit bien typ´e et on peut arrˆeter la synth`ese des types d`es maintenant. Si cette v´erification r´eussit alors la contrainte de typage associ´ee `a la coercion exprime le fait que, dor´enavant, le terme t doit avoir le type τ1 mais le type visible de

l’ext´erieur est τ2. La contrainte obtenue est alors identique `a celle engendr´ee pour l’application d’une

fonction de type ∀γ.τ1→ τ2 au terme t.

La r`egle G-Case est simple. L’annotation de type θ est v´ehicul´ee dans chaque branche et dans le type attendu τ pour la valeur analys´ee. C’est la variable flexible γ qui d´enote le type de cette derni`ere. La r`egle G-Clause paraphrase X-Clause. Elle s’appuie sur le sch´ema de type de K. La contrainte commence par introduire existentiellement le vecteur α qui correspond aux param`etres ordinaires du constructeur de type alg´ebrique. Ensuite, on trouve une conjonction.

Le premier terme ∃γ0

2.(τ0 = ε α γ02) d´etermine des valeurs appropri´ees pour les variables de type α

en les ´egalisant avec les param`etres ordinaires de τ0, le type de la valeur analys´ee. Les variables de

type γ0

2 n’apparaissent pas : elles servent uniquement `a oublier les param`etres g´en´eralis´es. Dans le

second terme, le syst`eme d’´equations E est augment´ee avec l’´equation τ0

2= τ , obtenue en confrontant

l’annotation de type avec le sch´ema de type de K. On retrouve ici le mˆeme processus de formation des ´equations que lors de la v´erification des types. Les variables de type qui apparaissent au sein de ces ´equations sont un sous-ensemble de βγ. Ces variables de type sont universellement quantifi´ees en tˆete de la contrainte ce qui permet de maintenir l’invariant que les types intervenant dans le syst`eme d’´equations sont rigides. Cet invariant est n´ecessaire pour s’assurer la d´ecidabilit´e efficace de l’implication entre les ´egalit´es de type.L’environnement de type Γ est ´etendu avec les liaisons des variables libres du motif et, enfin, on engendre la contrainte correspondant au bon typage du corps de la branche t en lui demandant d’avoir le type τ .

Il est int´eressant d’observer comment les r`egles de g´en´eration de contraintes se simplifient si on les sp´ecialise aux types alg´ebriques ordinaires ou aux types alg´ebriques purement g´en´eralis´es.

Si on suppose que ε est un type alg´ebrique ordinaire, on a L E ` (K β x1. . . xn: ⊥).t : τ0→ τ M =

∃α.((τ0= ε α ) ∧ ∀β.def x

1: τ1; . . . ; xn: τnin L E ` t : τ M)

si K :: ∀αβ.τ1× . . . × τn→ ε α

ce qui correspond `a la r`egle de g´en´eration de contraintes de types pour les types alg´ebriques iso- existentiels.

Si on suppose que ε est un type alg´ebrique purement g´en´eralis´e, on a L E ` (K β x1. . . xn : ∃γ.ε τ02).t : τ0→ τ M =

∀βγ.def x1: τ1; . . . ; xn : τnin L E ∧ τ02= τ ` t : τ M

48 4. MLGX

ce qui correspond `a une formulation proche de celle de l’article de Fran¸cois Pottier et Vincent Simo- net (Pottier & Simonet,2003) car elle fait apparaˆıtre une implication de la forme E ` . . .  qui a la particularit´e d’avoir un membre gauche en forme r´esolue.

La preuve de correction et compl´etude de la g´en´eration des contraintes de type pour ML (Pottier & R´emy,2005) a d´ej`a ´et´e faite. L’inf´erence de types pour MLGX ne pose pas de difficult´es suppl´emen- taires. En effet, la v´erification des coercions et la d´etermination du syst`eme d’´equations E n’influent ni sur la g´en´eration ni sur la r´esolution des contraintes de types. La conception de MLGX a ´et´e guid´ee par cette s´eparation entre la v´erification des GADT d’une part et l’inf´erence de types pour la partie ML d’un autre part. D’un point de vue formel, il manque dans la preuve existante (Pottier & R´emy,

2005), la prise en compte des annotations de type mais cette fonctionnalit´e est admise par tous comme ne posant pas de probl`eme.

4.5 Synth`ese des types 49 G-Var L E ` x : τ M = x ¹ τ G-Lam L E ` λ(x : θ).t : τ M = ∃γ1γ2.(θ ¹ γ1∧ γ1→ γ2= τ ∧ def x : γ1in L E ` t : γ2M) G-App L E ` t1t2: τ M = ∃γ.(L E ` t1: γ → τ M ∧ L E ` t2: γ M) G-Fix L E ` µ(x : ∃γ.∀α.τ0).t : τ M = ∃γ.(def (x : ∀α.τ0) in L E ` t : τ M ∧ ∃α.(τ0 = τ )) G-Let L E ` let x = t1in t2: τ M = def x : ∀α[L E ` t1: α M].α in L E ` t2: τ M G-Forall L E ` ∀α.t : τ M = ∀α.∃γ.L E ` t : γ M ∧ ∃α.L E ` t : γ M G-Annot L E ` (t : ∃γ.τ0) : τ M = ∃γ.τ0 = τ ∧ L E ` t : τ M G-Coerce L E ` (t : ∃γ.(τ1 . τ2)) : τ M = ∃γ.(L E ` t : τ1M ∧ τ2= τ ) si E |= ∀γ.τ1= τ2 G-Case L E ` match (t : θ) with p1.t1. . . pn.tn: τ M = ∃γ.(L E ` (t : θ) : γ M ∧ ViL E ` (pi: θ).ti : γ → τ M) G-Clause L E ` (K β x1. . . xn : ∃γ.ε ? τ02).t : τ0→ τ M = ∃α.(∃γ0 2.(τ0= ε α γ02) ∧ ∀βγ.def x1: τ1; . . . ; xn : τnin L E ∧ τ02= τ ` t : τ M) si K :: ∀αβ.τ1× . . . × τn→ ε α τ

CHAPITRE CINQ

MLGI

Dans ce chapitre, on s’int´eresse `a MLGI, un langage contenant ML et des types alg´ebriques g´en´era- lis´es. Contrairement `a MLGX, MLGI permet une utilisation des GADT dans un style implicite ce qui en fait un bon candidat comme langage de surface. La section5.1pr´esente rapidement la syntaxe qui diff`ere peu et la s´emantique qui ne diff`ere pas du tout de celles de MLGX. Le syst`eme de type occupe la section5.2. On le compare au syst`eme d´efini par Hongwei Xi (Xi et al, 2003) dans la section5.4. Les probl`emes li´es `a la synth`ese des types sont abord´es de mani`ere informelle dans la section5.5.