• Aucun résultat trouvé

Opérations B en tant que prédicats avant-après

Chapitre 2. Test et développement formel

4.2.1 Opérations B en tant que prédicats avant-après

Dans le paragraphe 2.4, nous avons présenté des travaux relatifs à l’analyse structurelle des spécifications orientées modèle. Les approches proposées par ces travaux sont basées sur la structure des prédicats avant-après : une analyse de partition des prédicats avant-après décompose le domaine d’entrée de chaque opération en sous-domaines ; les critères de test exigent alors qu’au moins une entrée de test soit générée pour chaque sous-domaine. Bien que ces approches soient proposées pour la couverture des spécifications écrites en VDM [Dick et Faivre 1993] et en Z [Hörcher et Peleska 1995; Hierons 1997], elles peuvent être appliquées à d’autres spécifications orientées modèle parmi lesquelles les spécifications B. Un exemple de ce type de traitement dans le cadre des spécifications B est présenté dans [Van Aertryck et al. 1997b], que nous avons mentionné dans le chapitre 2.

Il existe une transformation systématique des substitutions généralisées en prédicats avant-après, définie par le prédicat prd (voir le paragraphe 1.3.3). En utilisant cette transformation, nous pouvons appliquer l’analyse de partition sur les prédicats avant-après ainsi obtenus.

Sans perdre en généralité, nous pouvons supposer que l’opération analysée a la forme suivante :

PRE P THEN S END

Similairement à l’approche de [Dick et Faivre 1993], nous supposons que les entrées de test générées pour chaque opération devront satisfaire l’invariant et la pré-condition de l’opération. De plus, pour que le prédicat avant-après ait un sens, nous devons également considérer les informations concernant le contexte de la machine abstraite. Le contexte de la machine abstraite, utilisé également dans la définition des obligations de preuve (voir le paragraphe 1.6), contient la définition et les propriétés des ensembles et des constantes de la machine.

Les prédicats avant-après portent à la fois sur l’état avant, l’état après, les paramètres d’entrée et les paramètres de sortie de l’opération. Comme nous l’avons vu pour [Dick et Faivre 1993; Hörcher et Peleska 1995; Hierons 1997], une quantification existentielle sur l’état après et les paramètres de sortie doit être utilisée afin d’obtenir une partition du domaine d’entrée uniquement. Pour les substitutions généralisées, cette quantification existentielle du prédicat avant-après équivaut au prédicat fis, désignant la faisabilité de la substitution (voir le paragraphe 1.3.3) :

x' ⋅ prdx (S) ⇔ fis (S)

Le prédicat exprimant le domaine d’entrée de l’opération est alors décrit par : <contexte> ∧ invariant ∧ P ∧ fis (S)

C’est ce prédicat qui doit faire l’objet de l’analyse de partition. Dans le cadre de nos travaux, nous avons mis l’accent sur la partie spécifique à chaque opération, c’est-à-dire sa partie d’action, spécifiée par la substitution S. L’analyse de partition que nous proposons se concentre donc sur fis (S) afin de générer les cas de test.

En appliquant l’approche d’analyse de partition définie dans [Dick et Faivre 1993] à des exemples simples de modèles B, nous avons mis en évidence un problème : lors de la réduction sous forme normale disjonctive, on doit faire attention à ne pas générer de termes mal définis. D’une manière informelle, un terme est mal défini quand il contient des fonctions partielles appelées en dehors de leur domaine de définition. Prenons l’exemple du prédicat suivant dans lequel f est une fonction partielle:

x ∉ dom(f) ∨ y ≠ f(x)

En utilisant la décomposition en cas disjoints, ce prédicat est décomposé en trois cas suivants :

1. x ∉ dom(f) ∧ y ≠ f(x) 2. x ∉ dom(f) ∧ y = f(x) 3. x ∈ dom(f) ∧ y ≠ f(x)

Les deux premiers cas sont mal définis car l’expression f(x) est dépourvue de sens lorsque la fonction f est appelée en dehors de son domaine. Le problème de la bonne définition des prédicats dans le cadre de la méthode B a été étudié dans [Behm et al. 1998; Burdy 2000]. Ces travaux sont, à notre connaissance, les seuls à avoir abordé B sous cet aspect, et à offrir une solution interfaçable avec l’Atelier B. Le but était d’éliminer les obligations de preuve mal définies. La solution proposée est premièrement, de générer des obligations de preuve supplémentaires pour garantir la bonne définition des modèles, et deuxièmement, de définir un système de déduction approprié. Les auteurs définissent deux opérateurs ∆p et ∆s respectivement pour la bonne définition des prédicats et des substitutions. Nous nous basons sur la définition de ces opérateurs. En supposant que les substitutions originales sont bien définies, notre souci est de ne pas générer de termes mal définis pendant la décomposition en cas disjoints. Dans la Figure 4.1, nous donnons un sous-ensemble des règles définissant les opérateurs ∆p et ∆s auquel nous nous référerons ultérieurement. Nous rappelons également un théorème qui énonce que l’application d’une substitution bien définie à un prédicat bien défini, est également bien définie.

∆p¬P ≡ ∆pP ∆s(P | S) ≡ ∆pP ∧ (P ⇒ ∆sS) ∆p(P ∧ Q) ≡ ∆pP ∧ (P ⇒ ∆pQ) ∆s(S || T) ≡ ∆sS ∧ ∆sT ∆p(P ∨ Q) ≡ ∆pP ∧ (¬P ⇒ ∆p Q) ∆s(P⇒ S) ≡ ∆pP ∧ (P ⇒ ∆sS) ∆p(P ⇒ Q) ≡ ∆pP ∧ (P ⇒ ∆pQ) ∆s(S ? T) ≡ ∆sS ∧ ∆sT ∆s(@x ⋅ S) ≡ ∀x ⋅ ∆sS Théorème : ∆pI ∧ ∆sS ⇒ ∆p([S]I)

Figure 4.1. Quelques exemples de définition des opérateurs ∆p et ∆s dans [Burdy 2000] Notons que les règles de définition de ∆p correspondent à une interprétation des opérateurs logiques de disjonction (∨) et de conjonction (∧) comme des opérateurs or

ces définitions, la séparation sûre que nous proposons pour l’opérateur de disjonction ne génère, pour l’exemple précédent, que deux cas disjoints :

1. x ∉ dom (f)

2. x ∈ dom (f) ∧ f(x) ≠ y

En restreignant la manipulation des prédicats à des manipulations sûres, les analyses de partition définies pour les spécifications Z et VDM peuvent être appliquées aux modèles B obtenus à différentes étapes de développement, car la transformation en prédicat avant-après est définie quel que soit le niveau d’abstraction. L’application de ce type d’approche aux raffinements a été également proposée dans [Dick et Faivre 1993] pour des notations à large spectre comme VDM-SL. Cependant, comme nous l’avons mentionné dans le paragraphe 2.4.1, les approches d’analyse de partition posent des problèmes d’explosion combinatoire. Ces problèmes sont d’autant plus importants que le modèle devient plus détaillé.