• Aucun résultat trouvé

4.3 Raffinement

4.3.1 Raffinement des types

L’idée clé est que lors du raffinement, ou bien une région privée reste privée auquel cas elle peut comporter éventuellement de nouvelles composantes scalaires ; ou bien elle devient une région publique, au quel cas les nouvelles composantes peuvent contenir aussi bien des types scalaires que des sous-régions. C’est dans ce dernier cas que l’on doit faire attention à la manière dont ces nouvelles régions sont introduites, d’où la définition suivante :

Définition 4.3.1 (Raffinement des types). Le raffinement des types est une fonction

totale définie sur l’ensemble des types qui à chaque type· dans son domaine renvoie un type (·) défini selon la forme de · :

{f1 : ·1, . . ., fn: ·n}r [f1 : ‹1, . . ., fn: ‹n]r [f1 : ‹1, . . ., fn: ‹n]r ‘≠æ ‘≠æ ‘≠æ ‘≠æ {f1 : (·1), . . . , fn: (·n)}r {f1 : ‹1, . . . , fn: ‹n, f1Õ : ·Õ 1, . . . , fmÕ : ·Õ m mØ 0}r [f1 : ‹1, . . . , fn: ‹n, f1Õ : ‹Õ 1, . . . , fmÕ : ‹Õ m mØ 0]r et qui vérifie les trois hypothèses suivantes :

(Fraîcheur) Tous les champs et les indices créés par le raffinement sont frais. (Séparation) Quelles que soient les régions privées fl1 et fl2 distinctes,

les ensembles de régions R( (fl1)) et R( (fl2)) sont disjoints. (Homogénéité) Quelles que soient les régions privées fl1 et fl2

telles que fl1 © fl2, alors (fl1) © (fl2).

Tout d’abord remarquons que dans la définition ci-dessus le raffinement d’une ré-gion (privée ou publique) préserve son indice. Plus généralement, le raffinement est injectif et préserve les indices de toutes ses sous-régions. En particulier, lorsque deux types ont une région en commun, le raffinement préserve cet alias. Par ailleurs, les hypothèses de fraîcheur et de séparation ont pour conséquence le résultat suivant :

Lemma 4.3.1 (Lemme de séparation). Lorsque deux types n’ont aucune région en

commun, c’est-à-dire lorsqueR(·1) fl R(·2)est vide, leurs raffinements ne comportent aucun alias non plus, c’est-à-dire que l’intersection R( (·1)) fl R( (·2))reste vide. Démonstration. Par récurrence structurelle double sur ·1 et ·2. Il y a quatre cas de base. Le cas où soit ·1 soit ·2 est un type scalaire, est trivial. Le cas où ·1 et ·2

correspondent à deux régions privées, est vrai par définition, d’après l’hypothèse de séparation. Le cas où l’un des deux types est une région privée, et l’autre est une région publique dont toutes les composantes sont scalaires est vrai également par définition en vertu de l’hypothèse de fraîcheur. Enfin, le cas où les deux types sont des régions publiques dont toutes les composantes sont scalaires est trivial. Tous les autres cas se font en appliquant directement l’hypothèse de récurrence.

Quelles sont alors les conséquences de l’hypothèse d’homogénéité ? Tout d’abord, remarquons que, grâce à l’hypothèse de l’homogénéité, le raffinement préserve l’égalité structurelle entre les types, ce qui se montre encore par récurrence structurelle double. D’une manière plus importante, l’homogénéité garantit que le raffinement préserve la relation d’équivalence modulo aliasing entre deux types. Pour montrer cette dernière affirmation, il suffit de montrer que pour tout type · et toute substitution définie sur·, il existe une substitutionÕ définie sur (·) telle que le diagramme donné dans la figure 4.2 commute. Pour montrer ce lemme, on pourrait songer à faire la preuve

✓(⌧ )

(⌧ )

⌧0

0

par récurrence sur la structure du type ·. Néanmoins, dans le cas où· est une région {f1 : ·1, . . . , fn: ·n}r, en appliquant l’hypothèse de récurrence aux sous-types·1, . . . ·n, on obtiendrait n substitutions distinctes Õ

1, . . . , ◊Õ

n qu’il faudrait ensuite utiliser pour montrer l’existence de la substitution Õ. Nous allons donc procéder différemment, en généralisant l’énoncé de la façon suivante :

Lemma 4.3.2 (Extension de substitution de régions par raffinement). Soit un

en-semble fini de typess et soit une substitution de régionsdéfinie sur s. Alors, il existe une substitution de régions Õ définie sur (s) telle pour tout · œ s, on a

Õ( (·)) = (◊(·)).

Démonstration. Pour montrer le lemme, nous allons utiliser la récurrence sur une mesure bien choisie. Commençons par définir h(·), la hauteur d’un type · :

h(·) , Y _ ] _ [ 0 si · = ‹ 1 + max ·.fdéfinih(·.f) sinon

Par exemple, si · est une région privée, alors h(·) = 1. Maintenant, définissonsH(s), la hauteur maximale d’un ensemble de types s comme l’entier égal à

H(s) , max ·œs h(·).

Soit alors s et satisfaisant les hypothèses de l’énoncé. Montrons le résultat par ré-currence sur H(s).

Le cas de base H(s) = 0 est trivial. Traitons le cas H(s) = 1. Cela signifie que l’ensemble s ne contient aucune région imbriquée. En particulier, si · œ s est une région (privée ou publique), alors tous ses champs sont d’un type scalaire. Alors, si

· est une région publique ou un scalaire, on a (·) = ·. Il suffit donc de poser simplementÕ = ◊. Sinon,· est une région privée. Remarquons d’abord que les régions

· et ◊(·) sont équivalentes. Or, par hypothèse d’homogénéité, puisque · © ◊(·), on a également (·) © (◊(·)). Par conséquent, il existe une substitution ·Õ telle que

Õ

·( (·)) = (◊(·)). Or, l’hypothèse de séparation garantit que pour toute paire de régions privées (fl1, fl2) œ s, on a R( (fl1)) fl R( (fl2)) = ?. Par conséquent, on peut construire une substitution de régions sÕ à partir de l’ensemble {◊Õ

·| · œ s}, telle que pour tout · œ s, on a Õ

s( (·)) = ◊Õ

·( (·)), ce qui permet de conclure le cas de base. Sinon, supposons que H(s) > 1. Introduisons deux ensembles s1 ets2 tels que

s, s1‡ s2, H(s1) < H(s2) et ’·1, ·2 œ s2.h(·1) = h(·2)

Cela signifie donc que les ensembles s1 et s2 partitionnent s en deux et que les types des2 sont tous les éléments maximaux des au sens de la hauteur. En particulier, l’en-semble s2 ne contient que des régions. Maintenant, introduisons également l’ensemble

s0 défini par

Enfin, posons s3 = s0fi s1. Puisque H(s3) < H(s), on peut appliquer l’hypothèse de récurrence, ce qui donne l’existence d’une substitutionÕ telle que pour tout · œ s3 on a

Õ( (·)) = (◊(·)).

Considérons maintenant une région quelconque dans l’ensemble s2. Posons

Õ( (fl)) = (◊(fl)).

Remarquons d’abord que Õ ainsi étendue reste injective. En effet, d’une part, le raf-finement est injectif, donc préserve l’indice de la région ; d’autre part, n’apparaît jamais dansR(s3)puisqueh(fl) > H(s3). Il reste donc à montrer que pour tout chemin

, ou bienÕ( (fl).fi) = ◊Õ( (fl)).fi ou bien aucune des deux expressions n’est définie. Considérons alors un chemin tel que le type Õ( (fl).fi) est défini. Introduisons la notation suivante pour le chemin :

fi= fi

est le plus long préfixe de tel que fl.fi soit défini. Avec cette notation, on a

Õ( (fl).fi) = ◊Õ( (fl.fi).fi) et puisque le type fl.fi œ s3, on a par hypothèse de récurrence

Õ( (fl.fi).fi) = ◊Õ( (fl.fi)).fi = (◊(fl.fi)).fi.

Enfin, étant une substitution de régions, on continue la chaîne des égalités avec (◊(fl.fi)).fi = (◊(fl)).fi = (◊(fl)).fi = ◊Õ( (fl)).fi

ce qui permet de conclure.