• Aucun résultat trouvé

Approches basées sur les chemins

Dans le document Preuve de propriétés dynamiques en B (Page 111-114)

6.3 Implémentation de la vérification de la propriété d’atteignabilité

6.3.1 Approches basées sur les chemins

Cette section présente l’implémentation des deux approches de vérification de propriété d’atteignabilité basées sur des algorithmes de génération d’obligations de preuve. Rappe- lons que ces deux méthodes utilisent la même technique, mais se distinguent sur la forme finale des assertions générées. La deuxième version (imbriquée) a été définie dans le but de simplifier les assertions générées par la première en les imbriquant les unes dans les autres. Dans la section suivante, nous décrivons la grammaire BNF du fichier de spécification, celle-ci étant commune aux deux approches.

6.3.1.1 Grammaire du fichier de spécification

Nous définissons cette grammaire en réutilisant les termes "Predicate" et "Expression" déjà définis dans l’analyseur syntaxique que nous étendons. Ces termes permettent de prendre en compte tous les prédicats et expressions définis dans le langage B. Le fichier de spécification que doit fournir l’utilisateur est décrit selon la grammaire BNF suivante :

F ICHIER_SP EC ::=SPECIFICATION FILE FROM Predicate

TO Predicate PATHS

(P AT H END )+

P AT H ::= P redicate ∼> (ACT ION )+”;”

ACT ION ::= Operation(param1, .., paramn) |

|id∈ ExpressionOperation(id, ...) |

LOOP (P redicate, |id∈ Expression Operation(id, ...), Expression) |

IF P redicate THEN ACT ION

La première ligne indique qu’il s’agit d’un fichier de spécification. Ensuite, nous avons deux clausesFROM et TO qui expriment respectivement les deux prédicats ψ et φ d’une

propriété d’atteignabilité AG(ψ ⇒ EFφ). Enfin une liste de chemins possibles pour une telle propriétés est précisée dans la clausePATHS. Comme le montre la grammaire BNF ci-dessus, chaque chemin peut être gardé par un prédicat et consiste en une séquence d’actions. Le fichier de spécification suivant correspond à la propriété d’atteignabilité (voir section 3.2.2) du chapitre 3.

SPECIFICATION FILE

FROM ca ∈ Cassettes ∧ cl ∈ Clients ∧ ca 7→ cl /∈ Emprunt TO ca 7→ cl ∈ Emprunt

PATHS

Reservation(ca) = [] ❀

IF ca ∈ dom(Emprunt) THEN Rendre(ca); IF card(Emprunt−1[{cl}]) = M axN bLoan THEN

| ca1∈ Emprunt−1[{cl}] Rendre(ca1);

Emprunter(cl, ca)

END Reservation(ca) 6= [] ❀

IF cl /∈ ran(Reservation(ca)) THEN Reserver(cl, ca); LOOP (reservation(ca) 6= [cl],

| oo ∈ ran(Reservation(ca)) − {cl} Annuler_Reservation(oo, ca), size(ran(Reservation(ca))));

IF ca ∈ dom(Emprunt) THEN Rendre(ca); IF card(Emprunt−1[{cl}]) = 2 THEN | ca

1∈ Emprunt−1[{cl}] Rendre(ca1);

Empunter(cl, ca) END

6.3.1.2 Implémentation

Une fois l’analyse syntaxique et l’extraction des informations effectuées sur le fichier de spécification et la machine B, nous pouvons maintenant appliquer nos approches pour la génération des obligations de preuve. Comme les deux algorithmes proposés ne se distinguent que sur la forme des assertions générées, nous avons défini une classe abs- traite Verif_Property_Reachability_Algo qui hérite de la classe Verif_Property et qui re- groupe l’ensemble des attributs et méthodes communs à ces deux algorithmes. Les classes Verif_Property_Reachability_AlgoSimple et Verif_Property_Reachability_AlgoImbrique qui implémentent respectivement la version simple et la version imbriquée de l’algorithme héritent ainsi de la classe Verif_Property_Reachability_Algo. Elles implémentent égale-

ment la méthode run() définie dans la classe Verif_Property. Ces classes sont décrites dans les paragraphes suivants.

Classe Verif_Property_Reachability_Algo Nous avons défini dans cette classe deux méthodes getOP _SUBS() et getOP _P RE() qui permettent de renvoyer la substitution et la précondition de l’opération associées à une action donnée. Aussi, ces opérations sub- stituent les paramètres formels de l’opération par les paramètres effectifs en utilisant la méthode get_param_appel() qui permet de récupérer les paramètres formels d’une opé- ration. Dans cette classe est aussi définie la méthode P re() qui retourne la précondition d’une action. Les principales opérations utilisées pour l’implémentation de ces algorithmes sont localisées dans les classes Operations et Substitutions.

1. Classe Operations : les deux fonctions Update et Cons_Po utilisées dans l’algo- rithme de génération d’obligations de preuve pour mettre à jour respectivement les hypothèses et l’ensemble des formules à prouver sont implémentées par les méthodes U pdate() et Cons_P o() de la classe Operations. Cette classe inclut GammaAct qui permet d’effectuer la substitution γj(act) = [|| xi := xj−1i ]act en prenant en compte

les différents types d’action. Elle définit aussi la méthode P ost() qui permet de cal- culer la postcondition d’une action.

2. Classe Substitutions : dans cette classe sont définies toutes les opérations permet- tant d’effectuer des substitutions. Comme exemple, nous citons la méthode substitute() qui remplace, dans une substitution, les paramètres formels d’une opération par les paramètres effectifs en utilisant les méthodes subsExpression() et subsP redicate(). Les méthodes subsExpression() et subsP redicate() permettent de substituer, dans une expression (resp. un prédicat), les paramètres formels d’une opération par les paramètres effectifs. Ces deux méthodes ont également été utilisées par l’opération GammaAct de la classe Operations afin d’effectuer la substitution des variables xi

par les variables xj−1 i .

Classe Verif_Property_Reachability_AlgoSimple La méthode run() de la classe Verif_Pro- perty_Reachability_AlgoSimple correspond à la traduction Java de la ver- sion simple ou sans imbrication de l’algorithme de génération d’obligations de preuve présenté dans le chapitre 3. Cette méthode utilise les opérations définies dans la classe

Verif_Property_Reachability_- Algo dont elle hérite, ainsi que celles des classes Opera- tions et Substitutions introduites précédemment.

Classe Verif_Property_Reachability_AlgoImbrique La version imbriquée de l’al- gorithme de génération d’obligations de preuve introduite dans le chapitre 3 est implémen- tée par la méthode run() de la classe Verif_Property_Reachability_AlgoImbrique. Cette méthode fait appel à l’opération Operations_vers_imbriquee.Update() qui, contrairement à Operations. Update(), permet d’imbriquer les assertions générées. Exceptée la méthode U pdate(), dont l’implémentation constitue la principale différence entre les deux versions de l’algorithme, la méthode V erif_P roperty_Reachability_AlgoImbrique.run() réuti- lise les mêmes opérations que V erif_P roperty_Reachability_AlgoSimple.run().

Dans le document Preuve de propriétés dynamiques en B (Page 111-114)

Documents relatifs