• Aucun résultat trouvé

Une s´emantique relationnelle

La raison principale qui nous pousse `a utiliser une s´emantique relationnelle est que celle-ci permet d’avoir une notion d’´equivalence observationnelle entre deux configurations. Ainsi, on peut montrer que deux fragments de programme qui ne sont pas rigoureusement identiques se comportent de la mˆeme mani`ere – au sens o`u ils divergent en mˆeme temps (´equidivergent). Cette finesse de description n’est pas pr´esente avec un s´emantique pr´e- dicative. Le lecteur trouvera plus de d´etail sur ces id´ees dans le travail de Nick Benton [Ben06].

Pour d´ecrire la s´emantique d’un fragment de code assembleur, il est imp´eratif de pouvoir d´ecrire l’´etat de la m´emoire de mani`ere pr´ecise et structur´ee. C’est l`a qu’intervient notre volont´e de d´ecrire le langage bas niveau de la mˆeme mani`ere que le langage haut niveau. Id´ealement, nous aimerions que la structure d´ecrivant le fonctionnement du code assembleur soit munie d’une n´egation tensorielle. Nous n’avons pas atteint une description si uniforme. N´eanmoins, les ingr´edients de notre mod`ele s´emantique reprennent ceux d´ej`a pr´esents dans cette th`ese :

– une cat´egorie d’ordre stateRel dont les objets sont relations sur les ´etats de la m´emoire, la relation d’ordre ´etant induite par l’implication logique. Par exemple, le fait que s et s0 soient dans la relation

(0 7→ {25, 34}) s s0 indique s(0) = 25 et que s0(0) = 34;

– une structure mono¨ıdale sym´etrique induite par un connecteur s´eparant venant de la logique de s´eparation ;

– une adjonction avec une cat´egorie « duale » natRel des relations sur les points de programme, l’adjonction correspondant `a une notion d’orthogonalit´e provenant des id´ees introduites en r´ealisabilit´e ;

6.2. Une s´emantique relationnelle 185 – un produit cart´esien dans stateRel (mais n’induisant pas de modalit´e de res-

sources).

Tous ces ingr´edients permettent de d´ecrire avec pr´ecision la m´emoire requise par un pro- gramme (`a un point du programme donn´e) pour que celui-ci s’ex´ecute sans heurt. Pour que cette description soit assez riche, il faut ajouter la possibilit´e d’utiliser le programme dans la description de la relation. Ainsi, on peut non seulement exprimer qu’une certaine adresse contient une certaine valeur, mais aussi qu’une adresse contient un point de pro- gramme qui v´erifie certaines propri´et´es. Enfin, comme nous voulons interpr´eter les points fixes, nous introduisons un notion d’indice « de sˆuret´e » pour chaque relation sur les ´etats [Ahm04], qui permet de r´ealiser la loi de L¨ob [AMRV07]. Intuitivement, cet indice k in- dique que le programme est sˆur pour cette relation mais uniquement pour k ´etapes de r´eduction.

6.2.1 La cat´egorie stateRel

D´efinition 6.7 (relation sur les ´etats de la m´emoire)

Une relation dans stateRel est une relation qui porte sur deux ´etats partiels de la m´emoire, deux programmes et un indice v´erifiant une condition de monotonie.

Record stateRel : Type := mkStateRel {

R :> (Nat ,→ Nat) → (Nat ,→ Nat) → program → pro-

gram → Nat → Prop;

stateRel_cond : ∀ s1 s2 s01 s20 p1 p2 k1 k2,

(R s1 s2 p1 p2 k1 ∧ s1 ⊂ s01 ∧ s2⊂ s02 ∧ k2 ≤ k1) →

R s01 s02 p1 p2 k2 }.

o`u A ,→ B d´enote l’ensemble des fonctions partielles de A vers B et s ⊂ s0 l’inclusion de

fonctions partielles.

Une relation R est plus petite qu’une relation R0, ce que nous notons R  R0, lorsque

Definition stateRelLeq (R R0 : stateRel) :=

∀ s s0 p p0 k, R s s0 p p0 k → R0 s s0 p p0 k.

La condition de monotonie indique que si on augmente l’information sur l’´etat de la m´emoire ou si on diminue l’indice de sˆuret´e ; on reste dans la relation. Remarquons que les ´etats pr´esents dans la d´efinition de la relation sont partiels. Cela nous permet- tant d’avoir une structure de tenseur s´eparant provenant directement de la logique de s´eparation [Rey02]. Nous adoptons maintenant une description bas´ee sur le langage ma- th´ematique plutˆot que sur le langage de Coq afin de faciliter la lecture.

D´efinition 6.8 (tenseur s´eparant)

Le tenseur s´eparant R ⊗ R0 de deux relations de stateRel est la relation d´efinie par

(R ⊗ R0) s s0p p0k⇐⇒ ∃sdef 1 s2 s01 s 0 2, s = s1#s2∧ s0 = s01#s 0 2∧ R s1s01p p 0 k ∧ R0s2s02p p 0 k

o`u s = s1#s2 indique que les supports de s1 et s2 sont disjoints et que l’union de s1 et

186 Certification d’un compilateur en Coq

Le tenseur s´eparant permet de combiner des blocs de base que nous d´ecrivons ci-dessous de mani`ere non exhaustive.

 {n1, n2} 7→ R>  s s0p p0k ⇐⇒ ∃l, ldef 0 s(n1) = l ∧ s0(n2) = l0∧ R l l0p p0k ({n1, n2} 7→ {m1, m2}) s s0p p0k ⇐⇒ s(ndef 1) = m1∧ s0(n2) = m2 n 7→ {m1, m2} def= {n1, n2} 7→ {m1, m2} {n1, n2} 7→ − def = {n1, n2} 7→ True> Block m n def= N 0≤i≤n−1(m + i 7→ −) (Topfrom m m0) s s0p p0k ⇐⇒ ∀n ndef 0, n ≥ m ⇒ n0 ≥ m0 ⇒ ({n, n0} 7→ −)

Le tenseur s´eparant est crucial lorsque l’on veut faire une mise `a jour de la m´emoire tout en garantissant que cette mise `a jour n’invalide pas d’autres parties de la relation. Pourtant, lorsqu’on veut d´ecrire les propri´et´es v´erifi´ees par une clˆoture de fonction, on ne peut plus garantir la s´eparabilit´e des diff´erentes relations qui la composent. Il nous faut donc aussi un produit tensoriel non s´eparant qui s’av`ere ˆetre cart´esien.

D´efinition 6.9 (produit cart´esien)

Le produit cart´esien R × R0 de deux relations de stateRel est la relation d´efinie par

(R × R0) s s0p p0k ⇐⇒def R s s0p p0k ∧ R0s s0p p0k.

Nous avons prouv´e en Coq la proposition suivante.

Proposition 6.10 La cat´egorie stateRel est une cat´egorie d’ordres mono¨ıdale sym´e- trique pour le tenseur s´eparant ⊗. Elle est munie d’un produit cart´esien × qui v´erifie la loi de distributivit´e

(R × S) ⊗ T  (R ⊗ T ) × (S ⊗ T ).

6.2.2 Une adjonction avec la cat´egorie natRel

Afin de pouvoir exprimer qu’un programme v´erifie une certaine propri´et´e `a un point de programme donn´e, il faut aussi avoir une notion de relation sur les points de programme et non plus sur les ´etats.

D´efinition 6.11

Une relation dans natRel est une relation qui porte sur deux points de programme, deux programmes et un indice v´erifiant une condition de monotonie.

Record natRel : Type := mkNatRel {

R :> Nat → Nat → program → program → Nat → Prop;

natRel_cond : ∀ l l0 p p0 k1 k2,

(R l l0 p p0 k1 ∧ k2≤ k1) → R l l0 p p0 k2 }.

Comme pour stateRel, une relation R est plus petite qu’une relation R0 lorsque

Definition stateRelLeq (R R0 : natRel) :=

6.2. Une s´emantique relationnelle 187 Pour relier les relations sur les ´etats de la m´emoire et les relations sur les points de programme du code assembleur, nous allons ´etablir une adjonction entre stateRel et natRel.

efinition 6.12 (adjonction Perp a Perpnat)

Les deux foncteurs Perp et Perpnat d´efinis par

Definition Perp (S:stateRel) := fun p p’ l l’ k ⇒ ∀ s s’ j, (j ≤ k ∧ S s s’ p p’ j) →

((kstepterm j p s l → terminates p’ s’ l’) ∧ (kstepterm j p’ s’ l’ → terminates p s l)).

Definition Perp_nat (L:natRel) := fun s s’ p p’ k ⇒ ∀ l l’ j, (j ≤ k ∧ L p p’ l l’ j) →

((kstepterm j p s l → terminates p’ s’ l’) ∧ (kstepterm j p’ s’ l’ → terminates p s l)).

forment une adjonction (plus simplement une correspondance de Galois)

Perp stateRel %% Perpnatop natRel ff

Quand nous utiliserons des notations math´ematiques, nous noterons R>l’image de la

relation R par Perp. Ce foncteur, qui peut ˆetre vu comme une notion d’orthogonalit´e, nous permet de d´efinir la validit´e d’une relation d’´etats `a deux points de programme de deux programmes donn´es. C’est une d´efinition de type « passage par continuation » (CPS), au sens o`u l’on garantit que la continuation du programme au point l se d´eroulera sans encombre.

D´efinition 6.13 (jugement)

On dit que deux programmes p et p0 ´equidivergent selon la relation R ∈ stateRel aux

points l et l0 s’ils sont li´es par la relation R> pour tout indice k. On note alors

|= p, p0 l, l0: R> def= ∀k, R>l l0p p0k.

Exemple 6.14

Deux programmes p et p0 contenant le fragment de code suivant

"

i_op plus (d_imm 5) (s_imm 5) (s_cst 1) i_move (d_ind 5) (s_imm 0)

#

aux points de programme respectifs l, l + 1 et l0, l0+ 1valident la propri´et´e suivante

∀R, |= p, p0 l + 2, l0+ 2 : (0 7→ {28, 15}) ⊗ (5 7→ 12) ⊗ (13 7→ −) ⊗ R> =⇒ |= p, p0

188 Certification d’un compilateur en Coq

Cette proposition d´ecrit le fait que ce fragment de code incr´emente le registre 5 de 1 puis place `a l’adresse point´e par le registre 5 – en l’occurrence ici 13 – la valeur stock´ee dans le registre 0. Pour le programme p (resp. p0), on a pour hypoth`ese que le registre 0 contient

la valeur 28 (resp. 15).

6.2.3 Les quantificateurs internalis´es

Afin de sp´ecifier de mani`ere minimale l’´etat de la m´emoire dont nous avons besoin pour que le code compil´e s’ex´ecute convenablement, nous introduisons les quantificateurs existentiel et universel dans les constructeurs de relations.

D´efinition 6.15 (quantificateurs)

Pour d´efinir les quantificateurs sur les relations, nous allons directement nous servir des quantificateurs d´ej`a pr´esents dans Coq. Soit X un type et h : X → stateRel, on d´efinit

(∃h) s s0p p0k ⇐⇒ ∃x, hx s sdef 0p p0k

(∀h) s s0p p0k ⇐⇒ ∀x, hx s sdef 0p p0k

6.2.4 R´ealiser la loi de L¨ob

Comme nous l’avons dit plus haut, nous avons introduit un indice dans la d´efinition des relations sur les ´etats afin d’appr´ehender les points fixes et plus particuli`erement de r´ealiser la loi de L¨ob (parfois aussi appel´ee axiome GL pour G¨odel-Lob). Cette loi d´ecrite par la r`egle d’inf´erence

3α ` α

` α

se lit “si α est valide d`es que α est valide dans le futur, alors α est toujours valide”. Cette loi fournit un sch´ema d’induction clair permettant de d´emontrer la correction de la compilation des points fixes. Pourtant, l’importance de cet indice n’est pas encore tr`es claire `a ce stade de la lecture. Cet indice est en fait pr´esent pour pouvoir d´efinir la modalit´e 3 qui signifie « sera valable dans le futur » (la notation vient de l’op´erateur « un jour » de la logique temporelle). Il nous permettra d’utiliser une variante de la loi de L¨ob lorsqu’on prouvera le fragment de code compil´e pour le constructeur Fix.

D´efinition 6.16 (modalit´e 3)

La modalit´e 3 (prononc´ee « plus tard ») est d´efinie sur les relations d’´etats par 3R s s0p p0k ⇐⇒def ∃j < k, R s s0p p0j

Cette modalit´e nous permet de d´eriver un sch´ema de r´eduction. Il stipule que si une continuation satisfait Post pour k ´etapes aux points de programme l1 et l01; et si elle est satisfaite d`es que ptr pointe vers un point de programme qui satisfait Post, alors la continuation satisfait ptr 7→ {l1, l01} pour (k + 1) ´etapes.