• Aucun résultat trouvé

5.3 Cadre formel & représentation

5.3.3 Treillis et famille de treillis abstraits

La signature d’un ordre comporte le paramètre Data, il est donc possible de créer autant de treillis que de valeurs de Data. C’est pour cette raison que nous parlons de famille de treillis dans le cas général. Ainsi, un treillis est une famille de treillis paramétrée par d de type Data (D) instancié par le type unit. Le type Coq unit correspond au type unité qui contient un singleton (tt en Coq). Nous construisons une famille de treillis{θd}d∈Dà partir du domaine abs-

trait ∆ muni de la relation d’ordre partiel . Il s’agit d’une famille de treillis complets car les analyses effectuées ont un domaine∆ fini.

Éléments d’une famille de treillis : Les opérateurs de cette famille de treillis sont utilisés pour manipuler les informations calculées pour les différentes composantes du circuit d’entrée, c’est-à-dire les blocs, les ports, etc. La fi- gure5.8présente la signature d’une famille de treillis en Coq.

Cette dernière, spécifiée par LatticeType, comporte le module PreOrder qui définit l’ordre partiel. Le paramètre d est de type Data.type (cf. Fi- gure5.2). L’opérateurt(respectivementu) est défini par join (respectivement meet) tel qu’il est décrit dans la signature de la figure5.8. Ces opérateurs cal- culent respectivement pour un couple d’éléments, la borne supérieure et la

Module Type L a t t i c e T y p e .

Declare Module PreOrder : PreOrderType .

D e f i n i t i o n l t d x y : = ( PreOrder . l e d x y ) /\ ~ ( PreOrder . l e d y x ) .

D e f i n i t i o n g t d x y : = l t d y x .

D e f i n i t i o n eq d x y : = ( PreOrder . l e d x y ) /\ ( PreOrder . l e d y x ) .

Parameter gt_well_founded : f o r a l l d , well_founded ( g t d ) .

Parameter bot top : PreOrder . type .

Parameter b o t _ l e a s t : f o r a l l d x , PreOrder . l e d bot x .

Parameter t o p _ g r e a t e s t : f o r a l l d x , PreOrder . l e d x top .

Parameter meet j o i n : PreOrder . Data . type −> PreOrder . type −> PreOrder . type −> PreOrder . type .

D e f i n i t i o n upper d a b x : = ( PreOrder . l e d a x ) /\ ( PreOrder . l e d b x ) .

Parameter j o i n _ u p p e r : f o r a l l d x y , upper d x y ( j o i n d x y ) .

Parameter join_supremum :

f o r a l l d x y m, upper d x y m −> PreOrder . l e d ( j o i n d x y ) m.

D e f i n i t i o n lower d a b x : = ( PreOrder . l e d x a ) /\ ( PreOrder . l e d x b ) .

Parameter meet_lower : f o r a l l d x y , lower d x y ( meet d x y ) .

Parameter meet_infimum :

f o r a l l d x y m, lower d x y m −> ( PreOrder . l e d m ( meet d x y ) ) .

End L a t t i c e T y p e .

Fig. 5.8 – Signature d’une famille de treillis en Coq

borne inférieure. Les bornes inférieure ⊥ et supérieure > de la famille de treillis sont représentées respectivement par les variables bot et top dans la signature. upper (respectivement lower) définit le majorant (respectivement le minorant) d’un couple d’éléments.

Par ailleurs, nous avons choisi de fixer une définition générique pour les relations lt, gt et eq en exploitant le. Cela permet de ne pas changer leurs spécifications dans les foncteurs.

Nous avons indiqué précédemment que le théorème de Kleene est appliqué sur un treillis complet pour la relation d’ordredéfinie sur∆. Or, pour calculer le plus petit point fixe d’une fonction monotone par itération, il faudra disposer d’hypothèses supplémentaires pour assurer la terminaison des calculs. Une condition nécessaire est que la relationsoit bien fondée.

La condition la plus simple est d’interdire l’existence de chaînes croissantes infinies. Ce critère ne dépend que de la famille de treillis manipulée. Ainsi, la preuve de terminaison du calcul ne dépend pas de l’analyse effectuée mais de l’environnement du calcul effectué.

Les informations que nous calculons croissent car la fonction de propaga- tion doit être monotone. Il est donc nécessaire de vérifier que la relation inverse dene décroît pas à l’infini. Il s’agit donc de vérifier que la relationest bien fondée (voir définition5.2.14).

Dans la signature d’une famille de treillis, la spécification gt () est la relation inverse de la relation lt (≺). La propriété gt_well_founded assure que la relation gt est bien fondée.

La signature proposée d’un treillis (ou famille de treillis) n’est pas tout à fait similaire à la signature usuelle d’un treillis, car nous n’avons besoin que d’une relation de préordre partiel. En effet, deux blocs différents peuvent avoir la même information calculée, donc l’antisymétrie n’est pas utile dans notre cas.

La structure que nous manipulons est finie (car les circuits sont de taille finie) avec les propriétés :

– ⊥ est la borne inférieure de la famille de treillis. Cette dernière corres- pond à la propriété bot_least ;

– > est la borne supérieure de la famille de treillis. Cette propriété est spécifiée par top_greatest ;

À ces propriétés s’ajoutent join_upper (respectivement meet_lower) qui indique que l’union (respectivement l’intersection) de deux éléments est leur majorant (respectivement minorant), join_supremum (respective- ment meet_infimum) qui indique que le majorant (respectivement le mino- rant) de deux éléments est plus grand (respectivement plus petit) que leur union (respectivement leur intersection). Les propriétés join_supremum et meet_infimumdécoulent des définitions5.2.3et5.2.5.

Lors de l’instanciation des foncteurs, les propriétés sont des lemmes à dé- montrer.

5.3.3.1 Produit cartésien de familles de treillis

Certaines analyses des outils élémentaires manipulent le produit cartésien de familles de treillis. Tel est le cas lorsque l’analyse calcule plusieurs informations pour chaque composante. Un cas d’utilisation sera présenté dans le chapitre 7. Pour le moment, nous nous contentons de définir la signature du produit cartésien de familles de treillis complets.

Définition 5.3.5. Produit cartésien de familles de treillis

Soient θ, hX,θ,⊥θ,>θ,tθ,uθiet θ0 , hY,θ0,⊥θ0,>θ0,tθ0,uθ0ideux familles

de treillis ayant le même paramètre d.

Le produit cartésien θ×θ0 , hX × Y,θ×θ0,⊥θ×θ0,>θ×θ0,tθ×θ0,uθ×θ0iest égale-

ment une famille de treillis définie par : 1. hX × Y,θ×θ0i , hX,θi × hY,θ0i

2. Soient⊥θ et⊥θ0 les bornes inférieures de θ et θ0. La borne inférieure de θ×θ0,

notée⊥θ×θ0est le couple(⊥θ,⊥θ0)

3. Soient>θ et>θ0les bornes supérieures de θ et θ0. La borne supérieure de θ×θ0,

notée>est le couple(>θ,>θ0)

4. ∀(a, b), (c, d) ∈ X × Y,(a, b) t (c, d) , (atθc , btθ0d)

5. ∀(a, b), (c, d) ∈ X × Y,(a, b) u (c, d) , (auθc , buθ0d)

Le foncteur implantant le produit cartésien de familles de treillis est présenté dans la figure 5.9. Le produit cartésien de familles de treillis est une famille de treillis, par conséquent, il préserve la signature du module LatticeType.

5.3.3.2 Famille de treillis inverse

Dans certaines analyses, il est utile de considérer l’inverse d’une famille de treillis, comme dans l’étude du typage (voir Chapitre7).

Nous définissons dans un premier temps la signature d’une famille de treillis ayant une relation d’ordre strict≺(spécifiée par lt) bien fondée. Cette propriété (de bon fondement) sera utilisée pour démontrer que la relation duale

(spécifiée par gt) dans une famille de treillis inverse est également bien fon- dée.

Module L a t t i c e C a r t e s i a n P r o d u c t ( L1 : L a t t i c e T y p e )

( L2 : L a t t i c e T y p e with Module PreOrder . Data : = L1 . PreOrder . Data ) < : L a t t i c e T y p e .

Module PreOrder : = P r e O r d e r C a r t e s i a n P r o d u c t ( L1 . PreOrder ) ( L2 . PreOrder )

D e f i n i t i o n l t d e1 e2 : = ( PreOrder . l e d e1 e2 ) /\ ~ ( PreOrder . l e d e2 e1 ) .

D e f i n i t i o n g t d e1 e2 : = l t d e2 e1 .

D e f i n i t i o n eq d e1 e2 : = ( PreOrder . l e d e1 e2 ) /\ ( PreOrder . l e d e2 e1 ) .

D e f i n i t i o n bot : = ( L1 . bot , L2 . bot ) .

D e f i n i t i o n top : = ( L1 . top , L2 . top ) .

D e f i n i t i o n upper d a b x : = ( PreOrder . l e d a x ) /\ ( PreOrder . l e d b x ) .

D e f i n i t i o n j o i n : PreOrder . Data . type −> O. type −> O. type −> O. type : =

fun d x y =>

match x , y with

| ( x1 , x2 ) , ( y1 , y2 ) => ( L1 . j o i n d x1 y1 , L2 . j o i n d x2 y2 )

end.

D e f i n i t i o n lower d a b x : = ( PreOrder . l e d x a ) /\ ( PreOrder . l e d x b ) .

D e f i n i t i o n meet : PreOrder . Data . type −> PreOrder . type −> PreOrder . type −> PreOrder . type : = fun d x y => match x , y with | ( x1 , x2 ) , ( y1 , y2 ) => ( L1 . meet d x1 y1 , L2 . meet d x2 y2 ) end. . . . End L a t t i c e C a r t e s i a n P r o d u c t .

Fig. 5.9 – Définition du produit cartésien de familles de treillis en Coq

Module Type LatticeLtWfType . I n c l u d e Type L a t t i c e T y p e .

Parameter l t _ w e l l _ f o u n d e d : f o r a l l d , well_founded ( l t d ) .

End LatticeLtWfType .

La signature de LatticeLtWfType importe celle d’une famille de treillis précédemment définie, par Include Type LatticeType, et est complétée par la propriété de bon fondement de≺.

Ainsi, nous définissons le foncteur LatticeInv qui implante la famille de treillis inverse d’une famille de treillis donnée. LatticeInv est défini dans la figure5.10.