Vous êtes sur la page 1sur 2

SERIE N°1 : LA METHODE B

Exercice 1
Soit la machine abstraite suivante :

MACHINE INITIALISATION
Students studentset := {}
SETS
STUDENT OPERATIONS
CONSTANTS enter(st) = PRE ... THEN
max_students studentset := studentset ∪ {st}
PROPERTIES END;
max_students ∈ NAT1  max_students < 100
VARIABLES remove(st) = PRE ... THEN
studentset studentset := studentset ─ {st}
INVARIANT END ;
studentset ⊆ STUDENT
 card(studentset) <= max_students END

1) Commentez cette machine abstraite. Retrouvez la spécification informelle.


2) Complétez les pré-conditions des opérations,
3) Ecrivez les obligations de preuve de la machine.
Exercice 2
Ecrire une machine abstraite qui modélise les traitements suivants puis trouvez les obligations de preuve
pour chaque machine:
1) Spécifiez et donner la machine abstraite d’une fonction Add qui calcule l'addition de deux entiers entre
zéro et cent et qui retourne un entier entre zéro et cent.
2) donnez la machine abstraite qu’il s’agit de trouver le quotient entier q et le reste r de la division de a par
b, sachant que a ≥ 0 et b > 0. Les relations mathématiques qui lient ces quatre valeurs sont :
a = b × q + r ∧ r < b.
3) gestion d’un carnet de contacts : ajout et suppression d’une personne (nom, sexe, Tél).
Exercice 3
Trouvez toutes les obligations de preuves de la machine abstraite suivante et de son raffinement :

MACHINE reservation
CONSTANTS nb_max, SIEGES
PROPERTIES nb_max ∈ NAT1 ∧ SIEGES = 1..nb_max
VARIABLES occupes, nb_libre
INVARIANT
occupes ⊆ SIEGES ∧ nb_libre ∈ 0..nb_max ∧ nb_libre = nb_max − card(occupes)
INITIALISATION occupes, nb_libre := ∅, nb_max
OPERATIONS
nb ← place_libre = BEGIN
nb := nb_libre
END ;
place ← reserver = PRE nb_libre  0 THEN
ANY pp WHERE pp ∈ SIEGES − occupes THEN
place := pp || occupes := occupes ∪ {pp} || nb_libre := nb_libre − 1
END ;
rr ← liberer(place) = PRE place ∈ SIEGES THEN
IF place ∈ occupes THEN
rr, occupes, nb_libre := TRUE, occupes − {place}, nb_libre + 1
ELSE rr := FALSE
END
END
END

REFINEMENT reservation1
REFINES reservation
VARIABLES etat, nb_libre
INVARIANT etat ∈ SIEGES → BOOL ∧ occupes = etat−1[{TRUE}]
INITIALISATION nb_libre := nb_max || etat := SIEGES * FALSE
OPERATIONS
nb ← place_libre = BEGIN
nb := nb_libre
END ;
place ← reserver = ANY pp1 WHERE pp1 ∈ etat−1[{FALSE}] THEN
place := pp1 || etat(pp1) := TRUE || nb_libre := nb_libre − 1
END ;
rr ← liberer (place) = BEGIN
IF etat(place) = TRUE THEN
rr, nb_libre := TRUE, nb_libre + 1
ELSE rr := FALSE
END
|| etat(place) := FALSE
END
END

Vous aimerez peut-être aussi