• Aucun résultat trouvé

Utilisation du raffinement pour simplifier la preuve

2.3 Raffinement

2.3.2 Utilisation du raffinement pour simplifier la preuve

La vérification de la cohérence de la méthode présentée dans la section 2.2 permet de montrer que les événements spécifiant les changements apportés aux données sont appelés dans des conditions où leur garde est vraie. Cependant, la vérification de la cohérence (c’est-à-dire la preuve de la spécification B) génère un très grand nombre d’obligations de preuve (des chiffres illustrant le nombre des obligations de preuves sont donnés dans le chapitre 5).

L’idée de la preuve de la cohérence est de montrer que dans l’état où est déclenchée une transition, la garde de l’événement associé est vraie. Or, au cours du raffinement, nous constatons dans un grand nombre de cas que la garde d’un événement abstrait et la garde de l’événement concret qui le raffine sont équivalentes. Parfois, l’ajout de variables concrètes renforce la garde, mais la condition imposée par la garde aux variables communes est dans ce cas généralement équivalente. De plus, le raffinement des astd préserve les traces. Il semble donc intuitif de dire que si une transition concrète est permise, la transition abstraite correspondante doit être permise. Or la preuve de la cohérence au niveau abstrait montre que si la transition abstraite est permise, la garde de l’événement associé doit être vraie. Si la garde d’un événement abstrait est en partie équivalente à la garde concrète, il pourrait être intéressant d’utiliser ces preuves pour alléger la preuve de cohérence du niveau concret.

Event get inside temp act =b

when

gu1 : IN /dom(temp)

then

act1 : temp:|(...)

end

(a) Événementget inside temp act

Event mean inside act =b

when

gu1 : IN /dom(temp)

gu2 : IN SEN SORS

dom(in temp)

then

act1 :temp:= (...)

act2 :in temp:=

end

(b) Événementmean inside act

figure 2.10 – Comparaison de l’évément get inside temp act et de l’événement

mean inside act qui le raffine

Retour à l’exemple

La remarque du paragraphe précédent concerne les événements concrets qui raf-finent un événement abstrait. Dans notre exemple, l’événement mean inside raffine l’événement get inside temp. Les évéments concrets et abstrait associés à ces deux transitions sont données à la figure 2.10. La variable temp est commne entre la spé-cification abstraite et la spéspé-cification concrète. On remarque dans les événements de la figure 2.10 que la garde à propos de la variable temp est identique dans les deux événements. Il serait donc souhaitable d’utiliser cette propriété pour ne pas devoir reprouver la cohérence pour ces gardes.

Formalisation

Soient deux spécifications astd A etC et soient MAact et MCact. La machine MAact contient un ensemble de variables vA et la machineMCact contient un ensemble de va-riablesvC satisfiant l’invariantIC(vA, vC). Soient un événementeAact et un événement eCact tels queeAact =f(eCact) (donceCact raffineeAact). L’événementeCact est gardé par une gardeGC(vC) et l’événementeAact est gardée par une garde GA(vA). On suppose alors qu’il existeGCC(vC) et GCA(vC) telles queGCC(vC)∧GCA(vC)⇒GC(vC). L’ob-jectif est de montrer que si on aIC(vC, vA)∧GA(vA)⇒GCA(vC) et qu’on remplace la

gardeGC(vC) de l’événement eCact par la gardeGCC(vC) dans la preuve de cohérence de la méthode, alors la méthode reste cohérente.

Dans la partie précédente, nous avons constaté que les gardes étaient souvent iden-tiques pour les variables communes aux spécifications abstraite et concrète. Par va-riables communes, nous entendons les vava-riables identiques mais également les vava-riables concrètes liées aux variables abstraites par l’invariant. Dans ce cas, la garde GCA est la garde qui contient les conditions sur les variables liées aux variables abstraites et GCC les conditions sur les variables introduites dans la machine abstraite. Notons cependant qu’il est possible d’avoir une spécification de donnée concrète qui ne vérifie pas ce critère et qui pourtant raffine la spécification abstraite. Dans ce cas, la diffi-culté est de trouver la gardeGCA vérifiant le critère IC(vC, vA)∧GA(vA)⇒GCA(vC). Notons également qu’il est toujours possible de prendre la garde toujours vraie pour la garde GCA, ce qui nous ramène au raffinement précédent.

Dans l’exemple de la figure 2.10, on cherche à séparer la gardeIN /∈dom(temp)∧

IN SEN SORS ⊆ dom(in temp) en deux gardes, la première concernant les va-riable abstraites et la seconde les vava-riables concrètes. On prend ici GCA(vC) =IN /

dom(temp) et GCC(vC) = IN SEN SORS ⊆ dom(in temp). On montre ensuite trivialement que :

IC(vC, vA)∧GA(vA)⇒GCA(vC) GCC(vC)∧GCA(vC)⇒GC(vC)

avec GA(vA) = IN /∈dom(temp) et IC(vC, vA) =True. On appel Mact

cc la machine correspondant à la machine Mact

C dans laquelle les gardes des événements ont été remplacées par la garde GCC définie ci-dessus. On cherche alors à montrer la propriété suivante :

Propriété 4. Raffinement combiné pour simplifier la preuve

Si la machine Mact

cc et l’astd C vérifient la méthode définie à la section 2.2 Si pour tout événement EvC ∈dom(f) et tout événement EvA =f(EvC)

IC(vC, vA)∧GA(vA)⇒GcA(vC)

Alors g1(traces(C))⊆traces(Mact

C )

Démonstration. Cette propriété est prouvée par induction sur la structure de la sé-quence d’événements.

Cas de base : tC = []

La trace vide est une trace acceptée par toute machine Event-B prouvée

Cas inductif :

Soit tC;σCtraces(C)

tC;σCtraces(C) ⇒ (Définition 1)

∃(sC0, sC)·(sC0 tC;σC

−−−→seq sC) ⇒ (Règle d’inférence cons)

∃(sC0, s0C, sC)·(sC0 tC

−→seq s0Cs0C σC

−→sC) ⇒ (Définition 1)

tctraces(C) ⇒ (Hypothèse d’induction)

g1(tC)∈traces(MCact) ⇒ (Définition 2)

∃(vC0, v0C)·(BAgC

1(tC)(vC0, v0C))

Si g1(σc)∈/ dom(f)

Soit P reg2(σC)(wC) la précondition de l’opération B g2(σC) qui est la traduction en B de σC On a alors : sc0 tC −→seq s0C ⇒ (Lemme 1) ∃(wC0, wC0 )·(BAgC 2(tc)(wC0, w0C)∧EC(sC0, wC0)∧EC(s0C, wC0 )) s0C tC −→seq sCEC(s0C, w0C) ⇒ (Théorème 1) ∃wC ·(PregC 2(eC)(w0C)∧BAgC 2(eC)(wC0 , wC)∧EC(sC, wC))

Puisque g1(σC) est dans la machineMact

cc , et que la machine Mact

cc est liée àC par la méthode, on a montré que P reg1(σC)(w0C)⇒GgA(σC)(v0C). De plus, trivialement on a IC(vA0 , vC0 ) (par définition de l’invariant).

Ic(vA0 , vC0 )∧GgC 1(σC)(v0C) ⇒ (Faisabilité de l’événement) ∃vC ·(BAgC 1(σC)(v0C, vC)) Donc ∃(vC0, vC)·(BAgC1(tC;σc)(vC0, vC)) ⇒ (Définition 2) g1(tC;σC)∈traces(MCact) Si g1(σC)∈dom(f)

Soient Gg1(σC)C(vC0 ) et Gg1(eC)A(v0C) telles que

Gg1(eC)C(vC0 )∧Gg1(eC)A(vC0 )⇒Gg1(eC)(v0C)

On montre en utilisant le même raisonnement que précédemment queGg1(eC)C(v0C) (La garde Gg1(eC)C(v0C) est la garde de l’événement g1(σC) dans la machine Mcactc . Or cette machine est couplée à l’astd C suivant la méthode. Donc s’il est possible de faire σC, la garde de l’événement associé est vraie)

Il reste à montrer que Gg1(eC)A(vC0 )

tC;σCtraces(C) ⇒ (Définition 3 (du raffinement))

f0(tC;σC)∈traces(A) ⇒ (Définition 1)

∃(sA0, sA)·(s0A f

0(tC;σC)

−−−−−→seq sA) ⇒ (Règle d’inférence cons)

s0A·(s0A f

0(tC)

−−−→seq s0As0A f

0(σC)

Or, d’après le lemme d’extension de la complétude de la traduction aux traces, on a : sA0 f 0(tC) −−−→seq s0A ⇒ (Lemme 1 ) ∃(wA0, wA0 )·(BAgA 2(tC)(wA0, w0A)∧EA(sA0, wA0)∧EA(s0A, wA0 )) Et d’après le théorème de la correction de la traduction, on a

s0A f 0(σC) −−−→sAEA(s0A, w0A) ⇒ (Théorème 2) ∃wA·(PregA 1(f0(σC))(wA0 )∧BAgA 2(f0(σC))(w0A, wA)∧EA(sA, wA)) Puisque la machine Mact

A a été associée àA en suivant la méthode, on sait que

Preg1(f0(σC))(w0A)∧JA(wA0 , vA0 )⇒Gg1(f0(σc))(vA0 )

Or, on sait que d’après la définition de la méthode de raffinement que :

Gg1(f0(σc))(vA0 )∧IC(vA0 , v0C)⇒Gg1(σC)A(v0C) On a donc

Gg1(σC)C(vC0 )∧Gg1(σC)A(vC0 ) ⇒ (Définition de GCO et GCN) Gg1(σC)(v0C) ⇒ (Faisabilité d’un événement)

vC·(BAg1(σC)(vC0 , vC))

Donc

∃(vC0, vC)·(BAgC

1(tC;σC)(vC0, vC)) ⇒ (Définition 2) gC1(tc;σc)∈traces(MCact)

Raffinement classique Raffinement étendu Nombre d’obligation 93 62 tableau 2.1 – Intéret du raffinement étendu

Pour illustrer l’intérêt de cette méthode de raffinement, nous avons modélisé l’exemple en utilisant le raffinement classique présenté dans la section 2.3.1 et le raffinement permettant de réduire le nombre d’obligations de preuve présenté dans cette section. Les obligations de preuves générées sont indiquées dans la tableau 2.1. On remarque que l’utilisation du raffinement étendu permet de supprimer environ un tiers des obligations de preuve dans le cas de notre exemple.

Cependant, ce chiffre doit être nuancé. Dans le cas d’étude détaillé dans la sec-tion 5.1 par exemple, au cours de certains raffinement, des variables issues de variables abstraites sont utilisées dans des nouveaux événements, et dans ce cas, le gain en nombre d’obligations de preuve n’est pas significatif. En fait, le raffinement étendu défini dans cette section est véritablement efficace si les variables communes aux spé-cifications abstraite et concrète ne sont utilisées que dans des événements communs aux spécifications abstraite et concrète. Par variables communes, nous entendons des variables liées par l’invariant de collage, et par événements communs, nous entendons événements liés par la fonction qui associe à chaque événement l’événement qu’il raffine (s’il existe).