• Aucun résultat trouvé

Chapitre 2. Test et développement formel

3.3.4 Dépliage de modèles B

3.3.4.1 Mécanismes d’enrichissement

A partir d’un ensemble de composants B, liés par des liens REFINES, IMPORTS, INCLUDES, SEES et USES, l’algorithme de dépliage est chargé de générer le texte

formel déplié correspondant. Nous avons défini des mécanismes d’enrichissement propres à chacun de ces liens. Pour définir ces mécanismes, nous nous sommes basés sur la description donnée dans le B-Book pour chaque lien.

Enrichissement des liens IMPORTS et INCLUDES

Le lien IMPORTS permet à un composant de type IMPLEMENTATION de se servir des

données et des opérations des instances de MACHINEs importées pour implémenter ses

propres données et opérations. Dans la Figure 3.7, nous montrons le mécanisme d’enrichissement du lien IMPORTS à l’aide des composants symboliques MAn et MB. Ce mécanisme n’est pas explicitement décrit dans le B-Book, nous l’avons défini en nous basant sur la description informelle du lien IMPORTS.

Si l’IMPLEMENTATION MAn importe la MACHINE MB, le composant déplié est un

IMPLEMENTATION MAn REFINES MAn-1 IMPORTS MB (Inst) SETS SetsAn CONSTANTS CteAn PROPERTIES PropAn VALUES ValAn INVARIANT InvAn INITIALISATION InitAn OPERATIONS opA1 Í SubstA1 ; … opAn Í SubstAn END

+

MACHINE MB (ParamB) CONSTRAINTS ConstrB SETS SetsB CONSTANTS CteB PROPERTIES PropB VARIABLES VarB INVARIANT InvB INITIALISATION InitB OPERATIONS opB1 Í SubstB1 ; … opBm Í SubstBm END REFINEMENT MAn REFINES MAn-1 SETS SetsB ; SetsAn CONSTANTS CteB, CteAn PROPERTIES

PropB ∧ PropAn ∧ ValAn VARIABLES

VarB

INVARIANT

InvBinst ∧ InvA INITIALISATION

InitBinst ; InitA OPERATIONS

opA1 Í SubstA1_dépliée ;

opAn Í SubstAn_dépliée END

Figure 3.7. Mécanisme de base d’enrichissement du lien IMPORTS

Le nom du composant est celui de MAn, la clause REFINES de MAn est recopiée dans le composant déplié.

• Dans les clauses INVARIANT, INITIALISATION et OPERATIONS de MB, les paramètres

de MB sont remplacés par leur instanciation. Ceci revient à calculer, pour chaque clause, une substitution affectant aux paramètres formels leur valeur d’appel. Par exemple, pour la clause INVARIANT, il faut calculer la substitution :

[ParamB := Inst] InvB

• Le contenu des clauses SETS, CONSTANTS, PROPERTIES, INVARIANT et INITIALISATION de MB est concaténé avec celui de MAn. Le contenu de la clause

VALUES de l’IMPLEMENTATION MAn est concaténé avec les propriétés PropB et

PropAn dans le composant déplié. L’ordre dans lequel les deux composants sont initialisés est important. En effet, MB doit être initialisé avant MAn, car les opérations de MB peuvent être appelées dans l’initialisation de MAn. L’invariant de

MB doit alors déjà avoir été établi.

• La clause VARIABLES de MB est recopiée dans le composant déplié.

Les opérations du composant déplié sont celles de MAn. Dans les opérations et l’initialisation du composant déplié, les appels aux opérations de MB sont

remplacés par leurs corps, les paramètres d’entrée et de sortie étant instanciés par les paramètres d’appel. Le corps instancié de l’opération y ← op (x) Í S, qui est appelée par les paramètres d’appel a et b (b ← op (a)) est obtenu par le calcul de la substitution [y, x := b, a] [ParamB := Inst] S.

Le lien INCLUDES permet de regrouper, dans une MACHINE ou un REFINEMENT, les

données d’instances des MACHINEs incluses, ainsi que leurs propriétés, afin de créer

un composant enrichi. Le mécanisme d’enrichissement de ce lien est globalement similaire à celui du lien IMPORTS. Si MA est une MACHINE qui inclut MB, le

composant déplié est une MACHINE dont le nom, les paramètres formels et leur

propriétés, décrites dans la clause constraints, sont ceux de MA. Les autres clauses du composant déplié sont construites à partir des clauses de MA et de MB de manière similaire au lien imports. Un tel mécanisme est également décrit dans le manuel de référence du langage B [Steria 1998]. Si MA est un composant de type REFINEMENT

qui inclut la machine MB, le composant déplié dans ce cas sera un REFINEMENT et il

portera le nom de MA. La clause REFINES de MA sera également recopiée dans le

composant déplié. Il faut noter qu’à la différence du lien IMPORTS, le lien INCLUDES

est un mécanisme d’enrichissement local. Ainsi, pour le dépliage de ce lien, on ne peut pas utiliser les raffinements des composants inclus à la place de leur abstraction.

Dans ces mécanismes, nous supposons qu’il n’y a pas de conflit de nom entre les identificateurs des composants qui sont dépliés. Cette règle est imposée par la méthode B pour éviter que, dans une clause d’un composant, il soit possible d’accéder à plusieurs constituants portant le même nom mais désignant des constituants différents, sans savoir lequel est effectivement utilisé. En effet, si un composant MA accède à une instance de machine MB, alors une donnée de MB accessible par MA ne doit pas porter le même nom qu’une donnée de MA.

Enrichissement du lien REFINES

Un composant de type REFINEMENT ne constitue pas une machine abstraite à part

entière. Il contient le supplément qui doit être ajouté à un composant MACHINE afin de

construire la machine abstraite correspondante. Cette dernière peut être construite de manière systématique en combinant les textes formels du composant MACHINE et de

son REFINEMENT, comme nous l’avons vu dans le paragraphe 1.4.3.

Le mécanisme d’enrichissement du liens refines se base sur cette combinaison systématique. Nous le rappelons dans la Figure 3.8 pour deux composants symboliques MA et MA1.

Le composant déplié est alors une MACHINE qui est construite de la manière

suivante :

• Les paramètres formels du composant ainsi que leurs propriétés, décrites dans la clause CONSTRAINTS, sont ceux de MA.

MACHINE MA (ParamA) CONSTRAINTS ConstrA SETS SetsA CONSTANTS CteA PROPERTIES PropA VARIABLES VarA INVARIANT InvA INITIALISATION InitA OPERATIONS opA Í PRE Pre THEN SubstA END ; … END

+

REFINEMENT MA1 REFINES MA SETS SetsA1 CONSTANTS CteA1 PROPERTIES PropA1 VARIABLES VarA1 INVARIANT InvA1 INITIALISATION InitA1 OPERATIONS opA Í PRE Pre' THEN SubstA' END ; … END MACHINE MA (ParamA) CONSTRAINTS ConstrA SETS SetsA1 ; SetsA CONSTANTS CteA1, CteA PROPERTIES PropA1 ∧ PropA VARIABLES VarA1_0 INVARIANT

∃VarA ⋅ (InvA ∧ InvA1_O) INITIALISATION InitA1 OPERATIONS opA Í PRE Pre'∃VarA ⋅ (InvA ∧ InvA1_0 ∧ Pre) THEN SubstA' END ; … END

Figure 3.8. Mécanisme de base d’enrichissement du lien REFINES

Dans le composant MA1, si une variable, par exemple la variable y, a le même nom qu’une variable de MA, la variable y du composant MA1 est renommée, par exemple à y_0, et un invariant de liaison y = y_0 est ajouté à la clause INVARIANT

de MA1. Nous obtenons ainsi une nouvelle liste de variables VarA1_0et un nouvel invariant InvA1_0 pour MA1.

• Le contenu des clauses SETS, CONSTANTS et PROPERTIES de MA1 est concaténé avec celui de MA. Les clauses VARIABLES et INITIALISATION de MA1 sont recopiées dans le composant déplié.

• L’invariant et les opérations du composant déplié sont construits comme il est montré dans la Figure 3.8. Les opérations de MA qui ne sont pas raffinées dans

MA1 sont recopiées telles quelles dans le composant déplié.

Nous supposons que les composants MA et MA1 ne contiennent plus de clause

INCLUDES ou IMPORTS. Nous verrons que dans notre algorithme, les clauses INCLUDES

Dans le cas d’une chaîne de liens REFINES (MA, MA1 , MA2), on déplie d’abord le lien entre MA et MA1, puis le lien entre MA2 et le composant déplié ainsi obtenu.

Liens de partage USES et SEES

Dans le B-Book, il n’existe pas de mécanisme explicite pour l’enrichissement des composants introduisant des liens USES et SEES. Ces liens se traduisent dans les

obligations de preuves par un enrichissement du contexte. Nous ne proposons pas non plus de mécanisme d’enrichissement propre à ces liens. Ainsi, comme nous allons l’expliquer, les liens USES et SEES doivent être pris en compte respectivement au cours

du dépliage des liens INCLUDES et IMPORTS.

Le lien USES permet uniquement une utilisation statique : il permet de partager un

texte formel déclaratif entre plusieurs MACHINEs ; aucune opération de la MACHINE

utilisée ne peut être appelée par les opérations des MACHINEs utilisatrices. Le lien USES ne permet pas d’instancier la MACHINE utilisée. Si une MACHINE MA utilise – par

le lien USES – la MACHINE MB, elle doit être obligatoirement incluse en même temps

que MB dans un autre composant M. L’instance de MB qui est réellement utilisée par

MA est celle créée quand les deux MACHINEs sont incluses dans M. La résolution des

références partagées doit alors être réalisée au moment de l’inclusion des deux

MACHINEs dans le composant M, par le mécanisme d’enrichissement INCLUDES.

Le lien SEES permet d’établir des courts-circuits entre des branches indépendantes

du développement. Un composant de type MACHINE, REFINEMENT ou IMPLEMENTATION peut voir par lien SEES un composant de type MACHINE afin de

consulter les constituants de celui-ci sans les modifier. Une MACHINE vue doit

obligatoirement être importée une fois dans le développement : quand un composant

MA voit la MACHINE MB, l’instance qui est réellement vue est celle qui est créée au

moment de l’importation de MB par un ancêtre commun de MA et MB dans le graphe de développement. Les références créées par le lien SEES doivent alors être résolues

au moment de l’importation des deux composants dans leur ancêtre commun, par le mécanisme d’enrichissement IMPORTS.

Contrairement au lien USES, la résolution des références créées par le lien SEES

peut ne pas être directe. L’ancêtre commun des deux composants liés par le lien SEES

peut remonter plusieurs niveaux d’importation. Les liens SEES non-résolus doivent

alors être propagés par les mécanismes d’enrichissement des liens IMPORTS, INCLUDES

et REFINES. Ainsi, supposons qu’une IMPLEMENTATION I importe M1 et M2, le composant M2 ayant un lien SEES M3. Si I contient une instance de M3, on procède à la résolution du lien SEES. Sinon, une clause SEES M3 est ajoutée à I.