• Aucun résultat trouvé

An de formaliser la traduction du modèle Kmelia, nous avons introduit un mor- phismeJ KB pour dénir les règles de transformation d'un arbre de syntaxe abstraite

Kmelia en un arbre de syntaxe abstraite B, préservant la sémantique des construc- tions Kmelia.

Pour chaque composant Kmelia nommé C on extrait une machine C dont l'espace d'état est déduit directement de celui du composant. Les services srvi dans C sont

traduits par des opérations srv_i dans la même machine. Une autre machine C_obs, restreinte aux éléments observables de C, est générée en appliquant le même principe.

6.3.1 Traduction des types Kmelia en B

Les types Integer, Boolean, range, enum, struct de Kmelia sont directement traduits en B par le morphisme J KB. Le type générique setOf est traduit par l'en-

semble des parties noté P et le type array est traduit par une fonction totale selon les règles ci-dessous (cf. tableau 6.3.1).

Règles de traduction des types

JIntegerKB = INT

JBooleanKB = BOOL

Jrange min..maxKB = JminKB..JmaxKB

Jenum{e1, ..., en}KB = {e1, ..., en}

Jstruct{c1 :type1,...,cj :typej}KB = struct(c1 :Jtype1KB,...,cj :JtypejKB)

JsetOf typeKB = P(JtypeKB)

Jarray[min. . max] of typeKB = Jmin]..JmaxKB→ JtypeKB

Exemple : considérons la déclaration de la variable pstock suivante (il s'agit d'un morceau du listing 4.3 (cf. page 83).

VARIABLES

p s t o c k : a r r a y [ R e f e r e n c e ] o f I n t e g e r // p r o d u c t q u a n t i t y

Le type de la variable pstock se traduit en B en appliquant les règles ci-dessus de la façon suivante :

Jpstock : : array [1..MaxInt] of setOf IntegerKB=pstock ∈J1KB..JmaxIntKB→JsetOf IntegerKB

= pstock ∈ 1.. MaxInt → P(JIntegerKB) = pstock ∈ 1..MaxInt → P(INT)

6.3.2 Traduction des expressions Kmelia en B

Les expressions sont dénies sur des opérateurs et des fonctions. Pour les types prédénis de Kmelia, la traduction prend en compte la conversion des fonctions prédénies sur un type Kmelia en opérateur B ainsi que la traduction des arguments. Par exemple la fonction union(s1, s2) qui prend en paramètres deux ensembles s1 et s2 se traduit en B par : s1/s2. En revanche, un traitement spécique est associé à la fonction prédénie old(v) (qui dans une post-condition désigne la valeur d'une variable v avant l'appel du service) basée sur la substitution ANY (cf. section 6.3.3).

Règles de traduction des expressions JVar|Cst)KB = Var|Cst

JKmlUnaryOp (Op, KmlExp)KB = BExp (JOpKB,JKmlExp])

JKmlBinOp (Op, KmlExp, KmlExp)KB = BExp (JOpKB,JKmlExpKB,JKmlExp)KB

JKmlPred(Quantier,ListExp,KmlExp)KB = BPred(JQuantierKB,JListExpKB,JKmlExpKB)

JKmlFunCall (fname, ListExp)KB = BExp (fname,JListExpKB)

JKmlSetExp (OP, KmlExp)KB = JKmlUnaryOp (Op, KmlExp)KB

JKmlSetExp (OP, KmlExp, KmlExp)KB = JKmlBinOp (Op, KmlExp, KmlExp)KB]

Tableau 6.3.3  Règles de traduction des expressions Kmelia en B.

Exemple : prenons l'exemple du prédicat @resultValue1 suivant : INVARIANT

@ r e s u l t V a l u e : (R e s u l t <> n o R e f e r e n c e ) i m p l i e s (n o t I n( c a t a l o g ,R e s u l t) )

La traduction de ce prédicat en B est faite de la façon suivante :

1. Il s'agit d'une réécriture simpliée du prédicat@notreferenceddans l'invariant du listing 4.3 (cf. page 83)

J(Result <> noReference) implies (notIn(catalog ,Result))KB

=JKmlBinOp ('implies', KmlBinOp ('<>', Result, noReference), [KmlFunCall ('notIn', ListExp (catalog,Result))]KB

=BExp('⇒', JResult <> noReferenceKB, JnotIn(catalog ,Result)KB)

=(BExp('6=', JResultKB, JnoReferenceKB)) ⇒ (BExp('/∈', JResultKB, J catalog KB)) = (Result 6= noReference) ⇒ (Result /∈ catalog)

6.3.3 Traduction de l'espace d'état d'un composant

L'espace d'état W = hT, V, type, Inv, Initi d'un composant C (où V = Vc∪ Vv

constantes et variables) est traduit par JW KB comme suit :

JW = hT , V , type, I nviKB=                          MACHINE C SETS JT KB CONSTANTES JVcKB PROPERTIES JtypecKB VARIABLES JVvKB INVARIANT JtypevKB∧JI nvKB INITIALISATION JI nitKB OPERATIONS JD P KB où :  JT KB =JtKB | t ∈ T (cf. section précédente).

 JV KB =JVcKB∪JVvKB = Vc∪ Vv (déclaration des constantes et variables).

Par exemple, l'espace d'état du composant StockManager présenté dans le listing 4.3 (cf. page 83) est traduit en B comme suit :

CONSTANTS MaxRef, References , NoQuantity, NoReference VARIABLES vendorCodes, catalog , /∗ obs ∗/ plabels , pstock, Result_newreference  JtypeKB= V

JxiKB ∈JtiKB | (xi, ti) ∈ type (typage des constantes et variables)

= 

JtypecKB ∀(c, t) ∈ typec⇒ (c, t) ∈ type ∧ c ∈ Vc

JtypevKB ∀(v, t) ∈ typev ⇒ (v, t) ∈ type ∧ v ∈ Vv

Par exemple, le typage des constantes (resp. des variables) du composant StockManager (cf. page 83) est déclaré comme une conjonction de prédicats dans la clause PROPERTIES (resp. INVARIANT) dans la machine B comme suit : PROPERTIES MaxRef = 100 ∧ References = 1..MaxRef ∧ NoQuantity = −2 ∧ NoReference = −3

INVARIANT vendorCodes ⊆ Z ∧

catalog ∈ F(References) ∧/∗obs∗/

plabels ∈ References → String ∧ pstock ∈ References → Z ∧ Result_newreference ∈ INT ∧

 JI nvKB = ∀pred ∈ Inv •

V

JpredKB (prédicats de l'invariant)

Par exemple, l'invariant du composant StockManager (cf. page 83) complète le typage des variables dans la clause INVARIANT dans la machine B et se traduit de la façon suivante :

/∗@borned∗/ card(catalog) ≤ MaxRef /∗obs∗/

/∗@referenced∗/ref1 . ( ref1 ∈ References ∧ ref1 ∈ catalog ⇒

( plabels ( ref1 ) 6= EmptyString ∧ pstock(ref1) 6= NoQuantity))

/∗@notreferenced∗/ref2 . (( ref2 ∈ References ∧ ref2 /∈ catalog) ⇒

(( plabels ( ref2 ) = EmptyString ∧ pstock(ref2) = NoQuantity)))

 JI nitKB= {(JvKB,JexprKB) | (v, expr) ∈ Init} (état initial)

Par exemple, l'initialisation du composant StockManager (cf. page 83) se tra- duit par une substitution généralisée dans la clause INITIALISATION comme suit :

INITIALISATION vendorCodes := ∅ k catalog := ∅ k

plabels := (1..MaxRef) × {EmptyString} k pstock := (1..MaxRef) × {NoQuantity}k Result_newreference := 0

6.3.4 Traduction des services Kmelia en B

L'ensemble DP des services oerts d'un composant C est traduit par un ensemble

d'opérations . JD

P

KB= {JsrvKB | srv ∈ D

P}. Un service est décrit formellement par

un triplet hIS, lW, Bi. Dans le contexte de la vérication de pré/post-conditions des services par rapport à l'invariant du composant, seule l'interface IS = hσ, P re, P osti est concernée par la traduction1. Le schéma de traduction des services est le suivant :

1. L'espace d'état lW est exploité ultérieurement pour vérier les liens d'assemblages. Le com- portement B est utilisé pour la vérication fonctionnelle du service lui-même.

JsrvKB=Jhσ, P re, P ostiKB=                                                                  JσKB=        JnameKB JparamKB JptypeKB JT resKB

= result ← name(JparamKB)

JP reKB =    PRE JptypeKB∧ JP reKB JP ostKB =                                  ANY Jαl VP ostKB∪ {l result} WHERE Jαl P ostKB∧ αl type(VP ost)∧ l result ∈JT resKB THEN JVP ostKB:=Jαl VP ostKB|| result := l result || name res := l result où :

 result est la valeur de retour du service, name est le nom du service et JparamKB = param est l'ensemble des paramètres. Ces trois éléments consti-

tuent la signature de l'opération.

Par exemple, la signature du service newReference du composant StockManager présenté dans le listing 4.4 (cf. page 84) est traduite en B comme suit :

Result ←− newReference =

 la pré-condition de l'opération B assure le typage des paramètres en plus de la pré-condition du service :

 JptypeKB =

V

JpiKB ∈ JtiKB | (pi, ti) ∈ ptype ∧ JpreKB = ∀pred ∈ P re •

V

JpredKB.

Par exemple, la pré-condition du service newReference (cf. page 84) est traduite en B dans la clause PRE comme suit :

PRE

card(catalog) < MaxRef

 une post-condition Kmelia établit une relation entre les variables avant et après l'exécution. Elle est traduite par une substitution non déterministe1 sur des

variables locales (clause ANY) de même type que les variables modiées et qui satisfont la post-condition (clause WHERE). Ces variables locales sont aectées aux variables d'état de la machine (clause THEN).

 soit αl θ une α-conversion qui remplace les occurrences d'une variable v de

θ par l v.

 Jαl VP ostKB est un ensemble de variables locales qui représentent les valeurs

des variables de la machine après l'exécution de l'opération. Seules les va- riables modiées sont concernées.

1. Nous aurions pu utiliser le prédicat before-after de Event-B, mais dans la version actuelle de l'extraction, on génère du B classique.

Par exemple, les variables l_Result, l_catalog, l_pstock et l_plabels sont introduites dans la clause ANY pour modéliser les variables catalog, pstock et plabels du composant StockManager et la variable Result du service newReference après l'exécution de l'opération newReference.

BEGIN

ANY l_Result, l_catalog, l_pstock, l_plabels

 {l result} est une variable locale modélisant la valeur de retour.  Jαl typeKB = ∀(v, t) ∈ type •

V

Jl vKB ∈JtKB.

Par exemple, toutes les variables locales introduites dans la clause ANY ci-dessus, doivent être typées dans la clause WHERE de la façon suivante :

WHERE

l_Result ∈ Z ∧

l_catalog ∈ F(References) ∧ l_plabels ∈ References → String ∧ l_pstock ∈ References → Z

 Jαl P ostKB= ∀pred ∈ P ost •

V

Jαl predKB.

Par exemple, la post-condition du service newReference (cf. page 84) est traduite en B dans la clause WHERE de la façon suivante :

( (l_Result > 0 ∧ l_Result ≤ MaxRef) ∨ l_Result = NoReference )/∗obs∗/

∧(l_Result 6= NoReference ⇒ ( l_catalog = catalog ∪ {l_Result} ) ) /∗obs∗/

∧(l_Result = NoReference ⇒ l_catalog = catalog )/∗obs∗/

∧(l_Result 6= NoReference ⇒ (l_pstock(l_Result) = 0 ∧ l_plabels(l_Result)∈String−{EmptyString}

∧ ∀ ii . ( ii ∈ 1..MaxRef ∧ ii 6= l_Result ⇒(l_pstock(ii ) = pstock( ii )

l_plabels( ii ) = plabels( ii ) ))))

(l_Result = NoReference ⇒ ( ∀ ii . ( ii ∈ 1..MaxRef ⇒

(l_pstock( ii ) = pstock( ii ) ∧ l_plabels( ii ) = plabels( ii ) )) ))/∗obs∗/

Enn, les variables locales sont aectées aux variables d'état de la machine comme le montre l'exemple suivant :

THEN Result := l_Result k Result_newreference := l_Result k catalog := l_catalog k pstock := l_pstock k plabels := l_plabels END

 name res représente la variable modélisant la valeur de retour du service name dans le composant (Result_newreference dans l'exemple ci-dessus).