• Aucun résultat trouvé

5.5 Domaine de fragmentation des diagrammes de tranches

5.5.6 Unification

L’unification de diagrammes a pour but de transformer deux diagrammes de sorte qu’ils soient finalement identiques. Ainsi, les fragmentations décrites doivent être en tout point pareilles et en particulier désigner les mêmes variables de synthèse. Une fois cette unification réalisée, il est possible pour les domaines abstraits d’utiliser leurs opérateurs binaires : l’union, l’élargissement et la comparaison. On ne cherchera pas à calculer une unification pouvant être utilisée avant le calcul d’une intersection.

N’importe quel diagramme unifié peut faire l’affaire pour peu que la transformation vers ce diagramme unifié soit correcte. On cherchera tout de même à conserver un maximum d’informa-tion durant la transformad’informa-tion et donc ne pas choisir un diagramme d’unificad’informa-tion complètement arbitraire.

Unification de la relation d’ordre

Pour que les transformations des diagrammes soient correctes, nous n’avons d’autres choix que d’unifier vers un diagramme plus général. En effet, on peut toujours affaiblir la relation d’ordre entre les bornes, en prendre une sur-approximation, mais on ne peut pas la renforcer : les opérations sur les diagrammes sont correctes pourvu que l’abstraction de la relation d’ordre soit elle aussi correcte.

On prendra donc comme relation d’ordre pour le diagramme unifié, la plus forte relation d’ordre qui soit plus faible que les deux relations d’ordre 1 et2 des diagrammes à unifier.

C’est à dire, on prendra la relation d’ordre : =12

et pour touti,j∈ B

i j ⇔ i1 j∧i2 j

Pour les opérateurs de comparaison et d’élargissement, affaiblir la relation d’ordre assurera seulement la correction des transformations. Pour l’union de deux valeurs abstraites en revanche, affaiblir la relation d’ordre est essentiel puisque le diagramme résultant de l’unification sera celui de la valeur abstraite union et doit donc être compatible avec la relation d’ordre de l’union.

Ce dernier point soulève un problème. On a besoin d’unifier les diagrammes pour pouvoir calculer l’union et il faut donc calculer l’unification avant de calculer l’union. On ne peut donc pas interroger la valeur abstraite union pour construire. Il est important d’être capable de le calculer à partir des deux relations d’ordres.

L’affaiblissement de la relation d’ordre affaiblit du même coup la relation d’équivalence entre les bornes, ce qui a pour effet de diviser les classes d’équivalence des bornes utilisées dans le diagramme.

≡=≡1∩ ≡2

Sommets du diagramme d’unification

Une fois fixées les relations d’ordre et d’équivalence, la donnée d’un ensemble de sommets suffit à définir un unique diagramme. Il s’agira donc de notre diagramme unifié. Il ne reste en réalité qu’à choisir l’ensemble de sommets du diagramme.

Il y a en particulier deux unifications remarquables : le diagramme dont les sommets sont ceux présents dans les deux diagrammes à la fois, et le diagramme dont les sommets sont ceux présents dans l’un ou l’autre des diagrammes. Le premier peut être utilisé pour conserver des diagrammes simples : chaque fois qu’on doit unifier des diagrammes venant de deux branches différentes du programme, on ne garde que les bornes qui ont été introduites dans les deux branches à la fois. Cela permet en particulier de ne pas avoir de diagramme dont la complexité s’agrandit en présence de boucles. La seconde unification est en revanche plus précise. C’est un raffinement du premier qui permet de conserver un maximum d’information.

Ici, nous comptons sur un critère de fragmentation pour éviter la croissance infinie des dia-grammes. Aussi, nous choisirons un diagramme d’unification composé de l’ensemble des som-mets du premier et du second diagramme, quitte à simplifier ce résultat si le critère de fragmen-tation le juge nécessaire. On peut faire varier aisément le résultat de l’unification en changeant librement l’ensemble de sommets à intégrer dans le diagramme unifié.

Il reste un point de détail sur cet ensemble de sommet. Comme nous l’avons noté dans la section précédente, la relation d’équivalence du diagramme unifié va être affaiblie et les classes d’équivalence de bornes sont divisées. En conséquence, si plusieurs bornes étaient équivalentes avant l’union et leur classe d’équivalence attachée à un sommet, ce n’est plus nécessairement le cas après unification. On peut donc choisir une ou plusieurs expressions pour remplacer la borne originale. Sii≡1 j, queiest attachée à un sommet dans le premier diagramme mais quei. jon peut choisir d’avoiriou jdans le diagramme unifié, ou même d’avoir les deux bornes à la fois.

Entrées:D1=(B1,T1) un diagramme sur (B,1) etD2=(B2,T2) un diagramme sur (B,2) =12

B=S

b1∈B1fission1,2(b1) ∪ S

b2∈B2fission2,1(b2)/ ≡

Pourtout b∈Bfaire

Ajouter si nécessairebdansD1

Ajouter si nécessairebdansD2

Généraliser le diagrammeD1pour Généraliser le diagrammeD2pour

Pourtout(b1,b2)dans D1et D2faire

SiT1(b1,b2)est>ou⊥alors

Choisir une nouvelle variable de synthèse s T1(b1,b2) ← >

SiT2(b1,b2)est>ou⊥alors

Choisir une nouvelle variable de synthèse s T2(b1,b2) ← >

Unifier les variables de synthèseT1(b1,b2),T2(b1,b2)

Figure5.15 :Algorithme d’unification de deux diagrammes.

Nous remettons ce choix au domaine de borne, en appliquant ses fonctions fission

1,2 et

fission2,1 respectivement aux sommets des deux diagrammes. Finalement, on calcule

l’en-semble des sommets Bdu diagramme à partir des ensembles de sommets B1 et B2 des deux diagrammes à unifier : B= [ b1∈B1 fission 1,2(b1) ∪ [ b2∈B2 fission 2,1(b2)/ ≡

Il faut quotienter l’ensembleBpar la relation d’équivalence≡=≡1∩ ≡2, car si les ensembles de sommets de chacun des cotés de l’union sont tous différents pour≡, il peut y avoir une borne à gauche de l’union qui soit équivalente mais non égale à une borne à droite de l’union.

L’algorithme d’unification

L’algorithme d’unification commence par calculer la relation d’ordre unifiée et l’ensemble des sommets. L’algorithme de transformation ne faisant que changer l’ensemble d’arcs, il faut impérativement ajouter les sommets manquants à l’un et l’autre des diagrammes. On peut ensuite appliquer l’algorithme de transformation défini en section 5.5.5. Enfin, il faut unifier les variables associées aux sommets. L’algorithme est donné figure 5.15

5.5.7 Conclusion

Si on oublie l’interprétation des instructions d’instrumentation, les algorithmes que nous avons définis suffisent à implémenter le domaine de fragmentation des diagrammes de tranches. Nous rappelons les cinq opérations qu’un domaine de fragmentation doit implémenter.

• Les effets des instructions et des gardes sont évalués sur chacun des sommets, modifiant éventuellement la borne associée à ce sommet. Lorsque une borne de remplacement ne peut être trouvée pour un sommet après une affectation non-inversible, on supprime le sommet en appliquant l’algorithme de retrait de sommet.

• Les effets des instructions d’instrumentation seront abordés dans de la section suivante. Ils n’impliquent que des ajouts ou des retraits de sommets.

• L’unification des fragmentations est réalisée grâce à l’algorithme d’unification des dia-grammes.

• La généralisation et la spécialisation des diagrammes ont leurs algorithmes propres. • La réduction (partielle) de la valeur abstraite s’obtient par la clôture et la réduction

succes-sives des diagrammes.