• Aucun résultat trouvé

5.3 Cadre formel & représentation

5.3.2 Relation d’ordre abstraite

Nous définissons, dans cette partie, les ordres que nous manipulons ainsi que leurs signatures Coq.

5.3.2.1 Relation d’ordre partiel

Cette relation guide l’analyse spécifique à l’outil en question et assure sa termi- naison. Nous définissons dans la figure5.1la signature d’un préordre partiel. L’ensemble type représente le domaine ∆. La relation  (notée le dans le script Coq) est une relation de préordre partiel (réflexive et transitive, proprié- tés notées respectivement dans la signature Coq par refl et trans) complétée par la relation d’équivalence (eq dans la signature) dérivée de l’antisymétrie. C’est pourquoi nous parlons d’une relation ordre partiel au lieu de préordre partiel. Il aurait été possible de définir directement la propriété d’antisymé- trie. Mais, la relation d’égalité qu’elle induit n’est pas exploitée dans certaines analyses. Par exemple, deux blocs peuvent avoir la même information calculée sans qu’il s’agisse du même bloc.

Module Type PreOrderType .

Declare Module Data : DataType .

Parameter type : Type.

Parameter l e : Data . type −> type −> type −> Prop .

D e f i n i t i o n eq : Data . type −> type −> type −> Prop : =

fun d x y => l e d x y /\ l e d y x . Parameter r e f l : f o r a l l d x , l e d x x . Parameter t r a n s : f o r a l l d x y z , ( l e d x y ) −> ( l e d y z ) −> ( l e d x z ) . Parameter dec : f o r a l l d x y , { l e d x y } + {~ l e d x y } . Parameter eq_dec : f o r a l l d x y , { eq d x y } + {~ eq d x y } . End PreOrderType .

Fig. 5.1 – Signature d’un préordre partiel en Coq

La relation d’équivalence eq est définie par complétion. Elle est donc plus forte que la définition usuelle d’égalité x= y, ce qui signifie qu’il existe plus

de paires (x, y) telles que eq d x y que de paires telles que x = y. De plus, le symbole=est, au sens Coq, une égalité structurelle (égalité de Leibniz). Pour des raisons d’efficacité algorithmique, les librairies Coq n’assurent en général pas cette égalité structurelle. Par exemple, soient x et y deux entiers, il n’est pas possible de spécifier que 2×x2×y = xy, car la formalisation du type quotient est problématique en théorie des types. Il est donc plus simple de raisonner avec la relation d’équivalence eq qu’avec l’égalité de Coq.

La définition de la relation eq est fixée dans la signature de l’ordre partiel PreOrderType.

Les propriétés dec et eq_dec spécifient respectivement la décidabilité de leet de eq. Cela signifie pour la propriété dec, par exemple, qu’il est toujours possible de démontrer soit le d x y soit sa négation, pour tout x et tout y dans type.

Par ailleurs, les calculs effectués par les outils élémentaires sont manipulés par des types dépendants que nous appelons familles de treillis. Cela nous a conduit à introduire le module Data utilisé pour définir le paramètre d’un type dépendant ou le paramètre d’une famille de treillis. Notons le type du paramètre, qui sera présenté dans la section5.3.4, par D. Pour l’instant, nous nous limitons à sa signature.

La signature DataType, présentée dans la figure5.2, comporte un ensemble type, et la décidabilité de la relation d’équivalence sur les éléments de cet ensemble. Seule l’équivalence est utile pour manipuler les éléments du type dépendant.

Module Type DataType .

Parameter type : Type.

Parameter eq : type −> type −> Prop .

Parameter r e f l : f o r a l l x , eq x x .

Parameter sym : f o r a l l x y , ( eq x y ) −> ( eq y x ) .

Parameter t r a n s : f o r a l l x y z , ( eq x y ) −> ( eq y z ) −> ( eq x z ) .

Parameter dec : f o r a l l x y , { eq x y } + {~ eq x y } .

End DataType .

Fig. 5.2 – Signature du module DataType

5.3.2.2 Relation d’ordre partiel inverse

Nous définissons, dans cette section, la relation d’ordre qui construit l’ordre inverse, notée −1, d’une relation d’ordre donnée, notée . Par exemple, si xy alors y−1x. Un fragment de la définition de la relation d’ordre partiel inverse−1est donné dans la figure5.3.

Module ReversePreOrder ( preOrder : PreOrderType ) < : PreOrderType

with Module Data : = preOrder . Data

with D e f i n i t i o n type := preOrder . type .

Module Data : = preOrder . Data .

D e f i n i t i o n type := preOrder . type .

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

Fig. 5.3 – Définition de l’ordre inverse d’un ordre partiel

5.3.2.3 Relation d’ordre total

Certains outils élémentaires requièrent que les résultats obtenus par l’analyse effectuée soient triés pour les transmettre au reste des outils élémentaires de GeneAuto. Il est alors nécessaire de définir un ordre total.

La signature d’un préordre total est décrite par la figure5.4. Il s’agit de la même signature que l’ordre partiel avec en supplément la preuve qu’il est total.

Module Type TotalPreOrderType .

Declare Module Data : DataType .

Parameter type : Type.

Parameter l e : Data . type −> type −> type −> Prop .

D e f i n i t i o n eq : Data . type −> type −> type −> Prop : =

fun d x y => l e d x y /\ l e d y x . Parameter r e f l : f o r a l l d x , l e d x x . Parameter t r a n s : f o r a l l d x y z , l e d x y −> l e d y z −> l e d x z . Parameter dec : f o r a l l d x y , { l e d x y } + { ~ ( l e d x y ) } . Parameter t o t a l : f o r a l l d x y , { l e d x y } + { l e d y x } . Parameter eq_dec : f o r a l l d x y , { eq d x y } + { ~ ( eq d x y ) } . End TotalPreOrderType .

Fig. 5.4 – Signature d’un préordre total en Coq

5.3.2.4 Produit cartésien d’ordres partiels

Nous notons à partir de maintenant×pour représenter un produit cartésien.

Définition 5.3.1. Produit cartésien d’ordres partiels

Soient θ, hX,θiet θ0 , hY,θ0ideux ordres partiels. La relation d’ordre partiel

θ×θ0est définie sur le produit cartésienX × Y par :

∀(a, b), (c, d) ∈ (X × Y ),(a, b) θ×θ0 (c, d) ,aθ c∧bθ0 d

Nous utilisons le concept de foncteur pour définir le produit cartésien de relations d’ordre partiel. Le foncteur PreOrderCartesianProduct de la fi- gure5.5implante le produit cartésien de deux relations d’ordre partiels respec- tivement définies par les modules O1 et O2.

La notation <: signifie que le module PreOrderCartesianProduct est de type PreOrderType et que toutes les spécifications sont visibles à l’exté- rieur du module.

Module P r e O r d e r C a r t e s i a n P r o d u c t ( O1 : PreOrderType )

( O2 : PreOrderType with Module Data : = O1 . Data ) < : PreOrderType with Module Data : = O1 . Data

with D e f i n i t i o n type := ( O1 . type ∗ O2 . type )%type .

Module Data : = O1 . Data .

D e f i n i t i o n type := ( O1 . type ∗ O2 . type )%type .

D e f i n i t i o n l e : Data . type −> type −> type −> Prop : =

fun d x y =>

match x , y with

| ( x1 , x2 ) , ( y1 , y2 ) => ( O1 . l e d x1 y1 ) /\ ( O2 . l e d x2 y2 )

end.

D e f i n i t i o n eq : Data . type −> type −> type −> Prop : =

fun d x y => l e d x y /\ l e d y x .

D e f i n i t i o n eq_opt : Data . type −> type −> type −> Prop :=

fun d x y => match x , y with | ( x1 , x2 ) , ( y1 , y2 ) => ( O1 . eq d x1 y1 ) /\ ( O2 . eq d x2 y2 ) end. Lemma e q _ o p t _ i s _ e q : f o r a l l d x y , eq_opt d x y −> eq d x y . . . . Lemma e q _ i s _ e q _ o p t : f o r a l l d x y , eq d x y −> eq_opt d x y . . . .

Lemma eq_opt_dec : f o r a l l d x y , { ( eq_opt d x y ) } + { ~ ( eq_opt d x y ) } . . . .

End P r e O r d e r C a r t e s i a n P r o d u c t .

Fig. 5.5 – Produit cartésien d’ordres partiels

foncteur déclarant O2 de type PreOrderType ayant le même paramètre Data que celui du module O1.

La notation % type est utilisée pour interpréter (O1.type*O2.type) dans la sorte Type. Cette notation est utilisée en Coq pour traiter (O1.type*O2.type) comme un type et le symbole * comme un produit de types et non la multiplication.

La relation d’ordre θ×θ0 est spécifiée par le à partir des relations θ et

θ0représentées respectivement par O1.le et O2.le.

Le module Data, qui permet de représenter les paramètres dans un type dépendant, est le même pour tous les ordres partiels manipulés. La défini- tion eq_opt est une autre version optimisée de l’équivalence dans type. Les lemmes eq_opt_is_eq et eq_is_eq_opt démontrent conjointement l’équiva- lence des deux définitions eq et eq_opt.

Les preuves de réflexivité, de transitivité et de décidabilité réutilisent les preuves correspondantes des deux ordres O1 et O2. Elles sont consultables dans le fichierDomain.v

5.3.2.5 Produit lexicographique d’ordres partiels

Nous avons également besoin dans certains calculs, notamment dans l’outil élémentaire d’ordonnancement, de manipuler un ordre lexicographique. Un cas d’utilisation est présenté dans la section 6.3.1.3. Notons ×lex pour repré- senter un produit lexicographique. Nous présentons dans un premier temps la définition usuelle de l’ordre lexicographique.

Définition 5.3.2. Ordre lexicographique (tel qu’il est défini en littérature)

Soient hX,θiet hY,θ0i deux ordres partiels. La relation d’ordre partielθ×

sur le produit lexicographique deX etY est définie par :

∀(a, b), (c, d) ∈ (X ×lexY ), (a, b) θ×lexθ0(c, d) ,a≺θ c∨ (a=θc∧bθ0d)

avec=θ la relation d’égalité structurelle surX.

Cette définition ne peut pas être exploitée en l’état car, d’une part, la re- lation d’égalité structurelle (=θ) est difficilement manipulable et, d’autre part, nous ne disposons pas d’un ordre strict≺associé à la relation. Ainsi, nous définissons notre relation d’ordre lexicographique comme suit.

Définition 5.3.3. Ordre lexicographique

Soient hX,θi ethY,θ0i deux ordres partiels, la relation d’ordre partiel θ×

lexθ0

sur le produit lexicographique deX etY est définie par :

∀(a, b), (c, d) ∈ (X ×lexY ), (a, b) θ×lexθ0 (c, d) , aθ c∧ (cθ a⇒bθ0d)

Les deux définitions sont équivalentes.

Preuve. Nous disposons de aθ c∧ (cθ a⇒bθ0 d). Cela est équivalent à

((aθ c) ∧ ¬(c θ a)) ∨ ((aθ c) ∧ (bθ0 d)), en dépliant l’implication et en

distribuant la conjonction.

Ce qui se simplifié en((a≺θc) ∨ ((aθc) ∧ (bθ0 d)), quand la relation stricte

θ est définie. Quand la relation =θ est facilement manipulable, a θ c est équivalente à(a=θc∨a≺θc). Ainsi, nous obtenons a≺θc∨ (a=θc∧bθ0 d).

La définition du produit lexicographique d’ordres partiels est décrite dans le foncteur PreOrderLexicographicProduct dont un extrait de code Coq est présenté dans la figure5.6. La relation d’ordre partiel lex est décrite par

le.

Module PreOrderLexicographicProduct ( ord1 : PreOrderType ) ( ord2 : PreOrderType with Module Data : = ord1 . Data )

< : PreOrderType

with Module Data : = ord1 . Data

with D e f i n i t i o n type := ( ord1 . type ∗ ord2 . type )%type .

Module Data : = ord1 . Data .

D e f i n i t i o n type := ( ord1 . type ∗ ord2 . type )%type .

D e f i n i t i o n l e : Data . type −> type −> type −> Prop : =

fun d x y =>

match x , y with

| ( x1 , x2 ) , ( y1 , y2 ) => ( ord1 . l e d x1 y1 ) /\

( ( ord1 . l e d y1 x1 ) −> ( ord2 . l e d x2 y2 ) )

end.

D e f i n i t i o n eq : Data . type −> type −> type −> Prop : =

fun d x y => l e d x y /\ l e d y x .

D e f i n i t i o n eq_opt : Data . type −> type −> type −> Prop :=

fun d x y => match x , y with | ( x1 , y1 ) , ( x2 , y2 ) => ( ord1 . eq d x1 x2 ) /\ ( ord2 . eq d y1 y2 ) end. Lemma e q _ o p t _ i s _ e q : f o r a l l d x y , eq_opt d x y −> eq d x y . . . . End PreOrderLexicographicProduct .

Fig. 5.6 – Produit lexicographique d’ordres partiels en Coq

5.3.2.5.1 Ordre lexicographique sur des séquences

Nous définissons ici l’ordre lexicographique sur des séquences préalablement triées.

Définition 5.3.4. Tri lexicographique des séquencesS

Soient −→s1 et −→s2 deux séquences dont les éléments sont triés par la relation . Les

séquences représentent respectivementhb1, . . . , bniethb01, . . . , b0mi.

hb1, . . . , bni S hb10, . . . , b0mi ,

n=0 ∨ (b1b01 ∧ (b10 b1⇒ hb2, . . . bni Shb02, . . . b0mi)

La figure 5.7 définit un fragment de l’ordre lexicographique de deux sé- quences.

Module PreOrderLexicographicSequence ( ord : PreOrderType )

< : PreOrderType

with Module Data : = ord . Data

with D e f i n i t i o n type := l i s t ord . type .

Module Data : = ord . Data .

D e f i n i t i o n type := l i s t ord . type .

F i x p o i n t l e ( d : Data . type ) ( e1 e2 : type ) { s t r u c t e1 } : Prop : =

match e1 with | n i l => True | cons t 1 q1 => match e2 with | n i l => F a l s e | cons t 2 q2 => ( ord . l e d t 1 t 2 ) /\ ( ( ord . l e d t 2 t 1 ) −> ( l e d q1 q2 ) ) end end. . . .

Fig. 5.7 – Définition d’un ordre lexicographique sur des séquences