Modélisation des opérations Spécifier les transformations détat que lon attend des services de la machine Létat dune machine entièrement déterminée par la valeur de ses variables Langage pour exprimer les propriétés des nouvelles valeurs des variables en fonction de leurs anciennes valeurs et déventuels paramètres (le quoi pas le comment) Le langage proposé = Substitutions généralisés Dispose de constructions proches de laffectation et des conditionnelles Absences de séquences et boucles Constructions adaptées à la spécification : pré-condition, substitution multiple, substitutions indéterministes
Spécifier les changements détats Utiliser des prédicats Pre-Post Convention une variable prime indique la valeur dune variable après lopération Exemple x = x +1 Dans le nouvel état la variable x a sa valeur incrémentée de 1 par rapport à sa valeur dans lancien état x > x Dans le nouvel état la valeur de la variable x nest pas connue mais elle sera supérieure à la valeur précédente
Exemple : Système de réservation à capacité infinie MACHINE Reservation VARIABLES nbPlaceLibre INVARIANT nbPlaceLibre NATURAL OPERATIONS reserver = … /* réserve une place */ ; annuler = … /* annule la réservation dune place */ END nbPlaceLibre = nbPlaceLibre + 1
Obligation de preuve Une opération doit respecter les lois statiques du système Si : la valeur des variables avant lopération respecte linvariant Alors : quelque soit les nouvelles valeurs prises par les variables parmi les valeurs caractérisées par le prédicat Pre-Post Forcément : ces nouvelles valeurs des variables respectent linvariant. Inv(v) => v.(PrePost(v,v) => Inv(v)) Exemple de annuler : nbPlaceLibre NATURAL => nbPlaceLibre. ( nbPlaceLibre=nbPlaceLibre+1 => nbPlaceLibre NATURAL )
Introduction des substitutions Objectif : simplifier lexpression des opérations et la démonstration des preuves Rappel : une substitution est une application des variables dans des expressions {x|->x+1, y|->y+1, z|->w, v|->x+y} En B on considère des substitutions simples portant sur une unique variable {x|->e} que lon note x:=e Lapplication dune substitution (simple) à une formule F consiste à remplacer dans la formule F toutes les occurrences dune variable libre x par une expression. On note [x:=e]F Exemple : [x:=x+1](x N) donne x+1 N
Remplacement des Pre-Post par des substitutions Théorème déquivalence entre substitution et prédicat Pre-Post fonctionnel x. (x=e => F) [x:=e]F si x na pas doccurrence libre dans e Application à lexemple précédent nbPlaceLibre NATURAL => nbPlaceLibre. ( nbPlaceLibre=nbPlaceLibre+1 => nbPlaceLibre NATURAL ) nbPlaceLibre NATURAL => [nbPlaceLibre := nbPlaceLibre + 1] (nbPlaceLibre NATURAL)
Simplification Suppression des variables prime Inv(v) [v:=v]Inv(v) Sur lexemple : nbPlaceLibre NATURAL => [nbPlaceLibre:=nbPlaceLibre+1] [nbPlaceLibre:=nbPlaceLibre](nbPlaceLibre NATURAL) Donc par composition : nbPlaceLibre NATURAL => [nbPlaceLibre:=nbPlaceLibre+1](nbPlaceLibre NATURAL)
Spécification des transformation fonctionnelle Toute transformation fonctionnelle dune variable peut donc être modélisée par une substitution simple [S] de type [x:=e] et engendrera lobligation de preuve : I => [S]I Avantage : simplification des preuves Pas de nouvelles variables Pas de quantificateur Lopération annuler sera donc modélisée : annuler = BEGIN nbPlaceLibre := nbPlaceLibre + 1 END
Le langage des substitutions généralisées Objectif : étendre la modélisation des transformations par des substitutions pour : Permettre lexpression de pré-condition Permettre les substitutions multiples Permettre lexpression de conditionnelles Permettre les substitutions indéterministes
La substitution précondition Objectif : spécifier des opérations « pas toujours utilisable » Exemple : reserver = BEGIN nbPlaceLibre := nbPlaceLibre - 1 END Obligation associée nbPlaceLibre NATURAL => [nbPlaceLibre:=nbPlaceLibre-1] nbPlaceLibre NATURAL qui donne nbPlaceLibre NATURAL => nbPlaceLibre-1 NATURAL non valide (cas où nbPlaceLibre=0). Lopération réserver nest utilisable que si il y a encore des places libres à réserver
La substitution précondition Exprimer la précondition [P|S], ou PRE P THEN S END Exemple reserver = PRE nbPlaceLibre 0 THEN nbPlaceLibre := nbPlaceLibre - 1 END Intuitivement cela signifie que La transformation S nest opérationnelle que si la condition P est remplie Sinon la machine peut se retrouver dans un état quelconque (ne respectant pas linvariant). Ce nest pas un si P alors S finsi !
La substitution pré-condition Interprétation de la précondition [P|S]F P [S]F Lobligation de preuve des opérations pré- conditionnées doit tenir compte du fait que lon ne veut prouver la préservation dinvariant que sous-condition de la précondition P I P => P [S]I I P => [S]I Sur lexemple : nbPlaceLibre NATURAL nbPlaceLibre 0 => nbPlaceLibre-1 NATURAL.
Les initialisations LINITIALISATION fixe létat (éventuellement indéterministe) initial Elle est modélisée par une substitution Qui ne dépend pas de valeurs préexistantes des variables Uniquement les SETS, CONSTANTS, paramètres de la machine Ne peut pas faire lobjet de pré-condition (ni de conditionnelles) Uniquement les substitution simples, multiples, indéterministes Lobligation de preuve associée est simplement : [S]I
Opérations avec paramètres Paramètres dentrée nécessitent lutilisation dune substitution pré-condition Au minimum typer ces paramètres. Paramètres de sortie imposent de définir à laide dune substitution simple la valeur (éventuellement indéterministe) du paramètre en sortie dopération Cette valeur ne donne pas lieu à vérification lors des obligations de preuve liées à la cohérence interne de la machine Mais utile pour les contrôles des appels de service
Opérations avec paramètres MACHINE AMACHINE BMACHINE C … … … s<--opX = opY(e) = opZ = BEGIN PRE BEGIN … P … s := Exp THEN v <-- A.opX ; … … B.opY(v) ; END END … END I A => [s :=Exp] [v :=s] [e :=v] P
Spécification défensive statut <-- reserver(nbPlace) = PRE nbPlace NATURAL THEN IF nbPlace nbPlaceLibre THEN statut, nbPlaceLibre :=TRUE, nbPlaceLibre – nbPlace ELSE statut := FALSE END substitution multiple et conditionnelle (choix borné et garde)
La substitution multiple Objectif : modifier simultanément plusieurs variables x,y:=Ex,Ey Sémantique : [x,y:=Ex,Ey] F [z:=Ey][x:=Ex][y:=z] F où z est une nouvelle variable napparaissant ni dans F, ni dans Ex Notation équivalente : x:=Ex || y:=Ey x,y:=Ex,Ey
Exemples res,val:=TRUE,f(x) homme,sexe:=, courant,ancien:=suiv(actuel),courant x,y:=y,x x:=y || y:=x+1
Le choix borné Objectif : Spécifier que limplémentation pourra au choix réaliser S ou T ou … Substitution indéterminisme S [] T CHOICE S OR …OR T END (en ASCII) Sémantique [S[]T]F [S]F [T]F
Exemple : inscription dans registre état civil res<--declarer(p,s)= PRE p PERSONNE-personne s SEXE THEN CHOICE personne := personne {p} || sexe(p) := s || res := ok OR res := impossible END Tient compte dimpossibilités non encore connues, mais qui pourront exister dans limplantation
La garde Objectif : Introduire une notion de faisabilité dune substitution Cas où une substitution S ne peut être réalisée que sous une certaine hypothèse P qui « garde » la substitution P==>S SELECT P THEN S END Sémantique [P==>S]F P => [S]F
Garde vs. Pré-condition Pré-condition P|S On ne se pose le problème détablir la propriété dun état POST que si on a auparavant prouvé que létat PRE respectait P (lors de lappel à lopération) Sil ne le respecte pas, la substitution échoue elle ne permet pas datteindre un état POST (si on force lexécution dune telle substitution, on sort du fonctionnement normal du service) Garde P==>S On fait lhypothèse de P pour établir la propriété de létat POST Si P nest pas vérifié, la substitution permet détablir nimporte quelle propriété pour létat POST On dira quelle est « infaisable ». Une telle substitution nest pas implantable !!!
Garde et Choix Borné = IF Une garde traduit bien lidée de la partie ALORS dune alternative qui nest réalisée que sous la condition du SI En combinant 2 gardes avec un choix borné, on peut donc spécifier le fonctionnement dun SiAlorsSinon IF P THEN S ELSE T END On dispose aussi dune forme particulière de IF introduite par lopérateur bool x:=bool(P) P==>S [] P==>T IF P THEN x :=TRUE ELSE x :=FALSE END
Retour sur reserver statut <-- reserver(nbPlace) = PRE nbPlace NATURAL THEN IF nbPlace nbPlaceLibre THEN nbPlaceLibre :=nbPlaceLibre – nbPlace || statut:=TRUE ELSE statut := FALSE END