4.3 Raffinement
4.3.3 Préservation du typage par le raffinement
Nous sommes prêts maintenant pour énoncer le théorème de préservation du typage par le raffinement.
Théorème 4.3.1. Soit un jugement de typage · „e:··Ádérivable. Alors il existe un effet ÁÕ tel que le jugement
( )· ( )„e: (·)·ÁÕ
est dérivable et quel que soit un type · œdom , si Á Û ·, alors ÁÕ Û (·).
Démonstration. Par récurrence sur la dérivation du typage. Remarquons au préalable que si l’effet Á = ‹, poser ÁÕ = ‹ vérifie trivialement l’implication de l’énoncé. Par conséquent, les cas ou e est une expression atomique (variable, constante, adresse mémoire) ainsi que le cas oùe est de forme a.f (accès au champs f) se vérifient direc- tement en appliquant la définition du raffinement. Le cas oùeest une conditionnelle se montre en appliquant directement l’hypothèse de récurrence. Traitons donc les quatre cas restants.
Cas de la règle T-Let. La dérivation du typage dee se termine par
· „e1 :·1·Á1 [x‘æ·1]· „e2 :·2 ·Á2
’flœ (Fv(e2)\ {x})fi (F¸(e2)).Á1Û fl
· „letx = e1 in e2 :·2·Á1ÛÁ2
En appliquant l’hypothèse de récurrence, nous avons
( )· ( ) „e1 : (·1)·ÁÕ1 et ( )[x‘æ (·1)]· ( )„e2 : (·2)·ÁÕ2 avec des effetsÁÕ1 etÁÕ2 tels que
’· œdom .(Á1Û · =∆ ÁÕ1Û (·)) · (Á2Û · =∆ ÁÕ2Û (·)) D’après le lemme3.2.4, on a donc
’· œdom .Á1ÛÁ2Û · =∆ ÁÕ1 ÛÁÕ2Û (·).
De plus, si une région flÕ est dans ( (Fv(e2)\ {x})fi (F¸(e2))), elle s’écrit alors (fl) pour une certaine région fl dans (Fv(e2)\ {x})fi (F¸(e2)). Or, puisque par hypothèse Á1 Û fl, on a, d’après ce qui précède, ÁÕ1 Û flÕ. Ainsi, on peut conclure en dérivant le jugement
( )· ( ) „e1 : (·1)·ÁÕ1 ( )[x‘æ (·1)]· ( )„e2 : (·2)·ÁÕ2
’flÕ œ ( (Fv(e2)\ {x})fi (F¸(e2))).ÁÕ1Û flÕ ( )· ( ) „letx =e1 in e2 : (·2)·ÁÕ1ÛÁÕ2
Cas de la règle T-Alloc. La dérivation du typage dee se termine par
· „ai :·i·‹ fl={fi :·iiœ[1, ..., n]}r fi deux à deux distincts
· „{fi =aiiœ[1, ..., n]}:fl·(?· {fl})
Par définition, (fl) ={fi : (·i)iœ[1, ..., n]}r. Par hypothèse de récurrence, nous avons pour i œ [1, . . . , n], que le ( )· ( ) „ ai : (·i)·‹ est dérivable. On peut donc dériver
( )· ( )„ai : (·i)·‹ (fl) ={fi : (·i)iœ[1, ..., n]}r fi deux à deux distincts ( )· ( )„{fi =aiiœ[1, ..., n]}: (fl)·(?· { (fl)})
Montrons maintenant la partie de l’énoncé concernant ÁÕ qui est égal dans ce cas à (?· { (fl)}). Considérons un type · œdom tel que(?· {fl})Û ·. Puisque l’ensemble des régions écrites est vide, on a(?· {fl})Û · si est seulement si ou bien· est une sous- région stricte de fl, ou bienR(fl)flR(·) =?. Dans le premier cas, (·)est clairement une sous-région stricte de (fl). Dans le deuxième cas,R( (fl))flR( (·)) = ?d’après le lemme de séparation. On a donc(?· { (fl)})Û (·) ce qui permet de conclure.
Cas de la règle T-Assign. La dérivation du typage de e se termine par
· „ai :fli·‹ · „aÕi,j :·i,jÕ ·‹ fli.fi,j ƒ·i,jÕ fli deux à deux distincts ’i. fi,j deux à deux distincts
Ï = (fli.{fi,j Ω·i,jÕ jœ[1, ..., ki]}iœ[1, ..., n])
· „ai.{fi,j ΩaÕi,j jœ[1, ..., ki]}iœ[1, ..., n] :Unit·({fl1, . . . , fln} ·Ï)
En appliquant l’hypothèse de récurrence, on a pouriœ[1, . . . , n]etj œ[1, . . . , ki]la dérivabilité des jugements
( )· ( ) „ai : (fli)·‹ et ( )· ( )„aÕi,j : (·i,jÕ )·‹.
De plus, le raffinement préserve l’égalité structurelle, donc on a (fli).fi,j ƒ (·i,jÕ )en vertu des relations fli.fi,j ƒ·i,jÕ .
Posons ÏÕ = ( (fli).{fi,j Ω (·i,jÕ ) jœ[1, ..., ki]}iœ[1, ..., n]) et désignons par AÕ l’argu- ment de l’opération . Rappelons que AÕ correspond à la projection de l’affectation parallèle au niveau des types. Tout d’abord, montrons que l’opération est bien définie surAÕ. Pour cela, introduisons les notations suivantes. Comme au chapitre précédent2, notons AÕ( (fli), fi,j) , (·ijÕ ) et AÕ(fl, g) , fl.g lorsque la région fl n’est pas dans { (fl1), . . . , (fln)}. Notons aussi que pour fl œ R({ (fl1), . . . , (fln)}), on définit AÕ(fl,fi)comme dans le chapitre précédent, à savoir par les équations :
AÕ(fl,fi),
Y_ _] __ [
fl si fi=‘
AÕ(fl, f) si fi=f‘ etAÕ(fl, f) =‹ AÕ(flÕ,fiÕ) si fi=ffiÕ et AÕ(fl, f) = flÕ
Posons maintenant la relation binaire ‡AÕ , {ÈAÕ( (fli),fi), (fli).fiÍ |i œ[1, . . . , n]} et montrons que ‡AÕ est bijective.
2. Voir le paragraphe 2 de la page94
Tout d’abord, pour tout chemin fi tel que (fli).fi est défini, notons fi ,fi¶fi•, où fi¶ est le plus long préfixe defi tel que fli.fi¶ soit défini. Remarquons alors que
AÕ( (fli),fi¶fi•) = (A(fli,fi¶)).fi•
ce que l’on peut encore représenter graphiquement à l’aide de la figure 4.3 laquelle montre comment chaque paire dans ‡AÕ est structurée :
⇢i
⇢i.⇡ A(⇢i,⇡ )
(ri)
(⇢i).⇡ A0( (⇢i),⇡ )
(⇢i).⇡ A0( (⇢i),⇡) (⇢i.⇡ ).⇡• (A(⇢i,⇡ )).⇡•
⇡ ⇡
⇡ ⇡
⇡• ⇡•
= =
Figure4.3 – La structure de ‡AÕ .
En effet, le raffinement préserve la structure d’aliasing, donc A(fli,fi¶) étant bien dé- fini, on a AÕ( (fli),fi¶) = (A(fli,fi¶)). De plus, si le suffixe fi• n’est pas vide, alors nécessairement fli.fi¶ est un type privé. Par conséquent, il ne fait pas partie des types { (fl1), . . . , (fln)}et donc a bien
AÕ( (fli),fi¶fi•) =AÕ( (A(fli,fi¶),fi•)) = (A(fli,fi¶)).fi•. Considérons maintenant dans ‡AÕ deux paires
ÈAÕ( (fli),fii), (fli).fiiÍ et ÈAÕ( (flj),fij), (flj).fijÍ
pour lesquelles posons respectivementfii ,fii¶fi•i etfij ,fij¶fij•. Il suffit alors de montrer l’équivalence4.1 ci-dessous :
(fli).fii¶fii• = (flj).fij¶fij• ≈∆ AÕ( (fli),fi¶ifii•) = AÕ( (flj),fi¶jfij•). (4.1) Pour cela, remarquons que pour tout Èfl,flÕÍ œ‡AÕ, on a clairementfl ƒflÕ. Par consé- quent, lorsque l’un des quatre types (fli).fii, (flj).fij, AÕ( (fli),fii), AÕ( (flj),fij) est un type scalaire, l’équivalence 4.1 est trivialement vérifiée.
Sinon, les quatre types dénotent nécessairement des régions avec le même statut public/privé. Or, dans ce cas-là, le chemin fii• est vide si et seulement si le chemin fij•
l’est. En effet, si l’un des deux chemins est vide, alors que l’autre ne l’est pas, cela contredit l’hypothèse de fraîcheur des indices introduits par le raffinement.
Lorsque fi•i =‘=fi•j, l’équivalence4.1 est vérifiée, car d’une part le raffinement est injectif et d’autre part la relation‡A est bijective par hypothèse du typage de e.
Supposons enfin que ni fi•i, ni fi•j ne sont vides. Or, dans ce cas-là, les quatre types considérés étant des régions, on a, en vertu de l’hypothèse de séparation, les deux équivalences ci-dessous :
(fli).fii = (flj).fij ≈∆fli.fii¶ =flj.fij¶
AÕ( (fli),fii) =AÕ( (flj),fij) ≈∆A(fli,fii¶) =A(flj,fij¶)
lesquelles, mises ensemble, impliquent l’équivalence 4.1 et donc la bijectivité de ‡AÕ. En résumé, on a montré que surAÕ est bien défini, ce qui permet de poser
ÏÕ ,{fl | il existe flÕ ”=fl telle que Èfl,flÕÍ œ‡AÕ ouÈflÕ,flÍ œ‡AÕ} et dériver le jugement de typage
( )· ( )„aÕi,j : (·i,jÕ )·‹ ( )· ( )„ai : (fli)·‹ (fli) deux à deux distincts ’i. fi,j deux à deux distincts (fli).fi,j ƒ (tÕi,j) ÏÕ = ( (fli).{fi,j Ω (·i,jÕ ) jœ[1, ..., ki]}iœ[1, ..., n]) ( )· ( )„ai.{fi,j ΩaÕi,j jœ[1, ..., ki]}iœ[1, ..., n]:Unit·({ (fl1), . . . , (fln)} ·ÏÕ) On a donc poséÁÕ = ({ (fl1), . . . , (fln)}·ÏÕ)et il reste à montrer que pour· œdom on a l’implication Á Û · =∆ ÁÕ Û (·). Montrons ce résultat par récurrence sur la dérivation du jugement ÁÕÛ ·. Le résultat est immédiat lorsque · est un type scalaire ou bien quand· est l’une des régions parmi fl1, . . . ,fln. Traitons le cas inductif où· est une régionfl telle queflœ/ {fl1, . . . ,fln},flœ/ Ïet telle que pour toutf, sifl.f est défini, alors ({fl1, . . . ,fln} ·Ï)Û fl.f. Il est clair que (fl) œ/ { (fl1), . . . , (fln)}. Supposons par absurde que (fl) œ ÏÕ. Puisque fl œ/ Ï, on a (fl) œ/ (Ï). Donc, si (fl) œ ÏÕ, c’est que (fl)est nécessairement une région fraîche introduite par le raffinement. Or, cela contredit l’hypothèse que flœdom . Donc, (fl)œ/ ÏÕ.
Il reste donc à montrer que pour tout champ f tel que (fl).f est défini, on a ÁÕÛ (fl).f. Par hypothèse de récurrence, on a, pour tout f tel que fl.f est défini, ÁÕÛ (fl).f. Bien entendu, cela ne suffit pas pour conclure, car il faut considérer également les champs f tel que (fl).f soit une région fraîche introduite par le raffinement.
Supposons par absurde qu’il existe un champf tel que la région (fl).f, introduite par le raffinement, est dansÏÕ. Cela signifie qu’il existe une régionfliet un cheminfi ,fi¶fi• tels que È (A(fli.fi¶),fi•), (fli.fi¶).fi•Í œ ‡AÕ avec (A(fli.fi¶),fi•) ”= (fli.fi¶).fi• et tels que (fl).f est égal ou bien à (fli.fi¶).fi•, ou bien à (A(fli.fi¶).fi•. En prenant la contraposée de l’hypothèse de séparation, on a alors, selon le cas, ou bien fl =fli.fi¶, ou bienfl =A(fli,fi¶).
D’autre part, par hypothèse fl n’est pas dans Ï, donc nécessairement A(fli,fi¶) = fli.fi¶. Par conséquent, (A(fli,fi¶)) = (fli.fi¶), ce qui contredit le fait que (A(fli.fi¶),fi•)”=
(fli.fi¶).fi•. Ainsi, on a bien ÁÕÛ (fl).f pour tout f tel que (fl).f est défini, ce qui permet de conclure.
Cas de la règle T-Call. La dérivation du typage dee se termine par p:·1◊. . .◊·næ·0·(Ê·Ï) · „ai :◊(·i)·‹
· „p(a1, . . . , an):◊(·0)·(◊(Ê)·◊(Ï)) Le raffinement de la signature dep est égale à
(·1)◊ · · ·◊ (·n)æ (·0)·(ÊÕ ·ÏÕ)
où pour toute région fldans R(·1, . . . , ·n), (Ê·Ï)Û fl implique(ÊÕ·ÏÕ)Û (fl). Appli- quons le lemme4.3.2aux types·0, . . . , ·net à la substitution◊, ce qui donne l’existence d’une substitution ◊Õ telle que pour tout iœ[0, . . . , n] on a
◊Õ( (·i)) = (◊(·i)).
La substitution de régions ◊Õ et le raffinement étant injectifs, leur composition l’est également. Par conséquent, pour tout · œ {·0, . . . ,·n} et tout chemin fi tel que ·.fi est défini, on a ◊Õ( (·.fi)) =◊Õ( (·)).fi. En particulier, les régions dans l’effet(ÊÕ·ÏÕ) étant incluses dans R( (·0), . . . , (·n)), l’effet (◊Õ(ÊÕ)·◊Õ(ÏÕ)) est bien défini.
Appliquons maintenant l’hypothèse de récurrence au typage des atomes a1, . . . , an, ce qui donne ( )· ( ) „ai : (◊(·i))·‹ pour tout iœ[1, . . . , n]. Par conséquent, on peut dériver le jugement
p: (·1)◊ · · ·◊ (·n)æ (·0)·(ÊÕ·ÏÕ) ( )· ( )„ai :◊Õ( (·i))·‹ ( )· ( ) „p(a1, . . . , an):◊Õ( (·0))·(◊Õ(ÊÕ)·◊Õ(ÏÕ))
Il reste à monter que quel que soit un type · œ dom , lorsqu’on a (◊(Ê)·◊(Ï))Û ·, alors on a(◊Õ(ÊÕ)·◊Õ(ÏÕ))Û (·). Montrons le résultat par récurrence sur la dérivation du jugement(◊(Ê)·◊(Ï))Û · en raisonnant par cas, selon que · est dans l’image de ◊ ou pas. Lorsque· est un type scalaire, le résultat est trivial. Supposons donc que · est une certaine région fl. Lorsque flœIm◊, il existe doncflı œdom◊ telle que fl=◊(flı).
Dans ce cas-là, on a(◊(Ê)·◊(Ï))Û ◊(flı)et donc(Ê·Ï)Û flı, puisque ◊est injective. Par ailleurs, comme flı œdom◊, on a flı œR(·0,·1, . . . ,·n), Montrons que nécessairement flı œ R(·1, . . . ,·n). En effet, si flı œ R(·0)\ R(·1, . . . ,·n), alors flı œ Ï, ce qui est impossible, puisque (Ê ·Ï)Û flı. Donc, flı œ R(·1, . . . ,·n). D’après la définition du raffinement, on a alors (ÊÕ·ÏÕ)Û (flı), ce qui permet d’écrire
(◊Õ(ÊÕ)·◊Õ(ÏÕ))Û ◊Õ( (flı))
et puisque flı œ R(·1, . . . ,·n), on a d’après ce qui précède, ◊Õ( (flı)) = (◊(flı)) = (fl), ce qui permet de conclure dans le cas où flœIm◊.
Sinon, considérons le cas où flœ/ Im◊. On en déduit que flœ/ ◊(Ê) etflœ/ ◊(Ï). Par conséquent, comme(◊(Ê)·◊(Ï))Û fl, on déduit que, pour tout champf tel quefl.f est défini, on a (◊(Ê)·◊(Ï))Û fl.f. Par hypothèse de récurrence, on a alors pour toutf tel que fl.f soit défini (◊Õ(ÊÕ)·◊Õ(ÏÕ))Û (fl).f. Montrons également que pour tout fÕ tel que le type (fl).fÕ soit défini avec fÕ frais, on a (◊Õ(ÊÕ)·◊Õ(ÏÕ))Û (fl).fÕ. Supposons par l’absurde que ce n’est pas le cas pour un certain fÕ. Alors, il existe un chemin fi tel que la région (fl).fÕfi œ ◊Õ(ÏÕ) et tel que pour tout fiÕ ª fi, (fl).fÕfiÕ œ/ ◊Õ(ÊÕ).
Or, puisque (fl).fÕfi œ ◊Õ(ÏÕ), on peut écrire (fl).fÕfi = ◊Õ( (·j).fij¶fij•) pour un certain type ·j parmi les types ·0, . . . ,·n et un certain chemin fi¶jfij•. On en déduit l’égalité (fl).fÕfi = (◊(·j.fij¶)).fij• où fij• est nécessairement un chemin non-vide, car sinon, on aurait l’égalité entre deux régions où l’une d’entre elles aurait un indice frais alors que l’autre non, donc l’égalité entre deux régions ayant des indices distincts, ce qui est absurde. Mais alors, cela signifie que fl et ◊(·j.fi¶j) sont deux régions privées telles que l’intersection de (fl) avec (◊(·j.fij¶)) n’est pas vide. D’après l’hypothèse de séparation, cela implique que fl = ◊(·j.fij¶) et contredit ainsi l’hypothèse que fl n’appartient pas à l’image de◊. Ainsi, pour tout champfÕtel que (fl).fÕ est défini, on a(◊Õ(ÊÕ)·◊Õ(ÏÕ))Û (fl).fÕ. Il suffit donc de vérifier que (fl)œ/ ◊Õ(ÊÕ)et que (fl)œ/ ◊Õ(ÏÕ), ce qui se démontre par l’absurde de la manière identique au raisonnement que nous venons de faire. Par conséquent, on peut dériver(◊Õ(ÊÕ)·◊Õ(ÏÕ))Û ◊Õ( (fl0))par la règle
vpind, ce qui permet de conclure dans le cas de l’appel de fonction.