Beruflich Dokumente
Kultur Dokumente
2 3
Dierentes classes de spécications formelles Spécication formelle d'interfaces
Algébriques : le système est spécié en termes d'ensembles, Les grands systèmes sont décomposés en sous-systèmes qui se
d'opérations et de leur relation. composent à travers d'interfaces bien dénies.
Ex. séquentiel : Act One, Larch, OBJ. La spécication des interfaces des sous-systèmes permet leur
Ex. concurrent : Lotos. développement indépendant.
Les interfaces peuvent être dénies comme des types de données
abstraits ou des interfaces de classes.
Basés sur les modèles : le système est spécié en termes de L'approche algébrique pour la spécication formelle des
modèle à états et utilisent des opérations qui changent l'état du interfaces permet pour les opérations de l'interface :
sytème. de les dénir formellement,
Ex. séquentiel : Z, VDM, B. d'analyser formellement (preuve) leur comportement,
Ex. concurrent : CSP, réseaux de Pétri, automates hiérarchiques de dériver l'implémentation d'un objet ou d'un type en
(statecharts ). partant de sa dénition formelle.
4 5
6 7
Exemple : exemplaire
Exemple : argent
Domaine :
Domaine :
exemplaire
argent
Opérations de construction :
Opérations de construction :
cons_livre : livre → exemplaire
francs : entier → argent
cons_dvd : dvd → exemplaire
euros : entier → argent
Opérations de test :
Opérations de test :
est_livre, est_dvd : exemplaire → bool
est_francs, est_euros : argent → bool
Opérations d'accès :
Opérations d'accès :
ex_livre : {x : exemplaire | est_livre(x)} → livre
val_argent : argent → entier
ex_dvd : {x : exemplaire | est_dvd(x)} → dvd
8 9
Domaine : Domaine :
couleur figure
Constantes : Constantes :
pique, coeur, carreau, trèfle : couleur as, roi, dame, cavalier, valet, dix, neuf, huit, sept : figure
Opérations de test : Opérations de test :
est_pique : couleur → bool est_as, est_roi, est_dame : figure → bool
est_coeur : couleur → bool est_cavalier, est_valet : figure → bool
est_carreau : couleur → bool est_dix, est_neuf, est_huit, est_sept : figure → bool
est_trèfle : couleur → bool
10 11
Domaine :
main
Domaine :
Opérations de construction :
carte
cons_main : {⃗n ∈ carte5 | Diff(⃗n)} → main
Opérations de construction :
Opérations de construction étendue :
cons_carte : couleur × figure → carte
cartes_to_main : carte5 → main
Opérations d'accès :
Opérations d'accès :
figure_carte : carte → figure
carte1 : main → carte
couleur_carte : carte → couleur ..
.
carte5 : main → carte
12 13
Domaine :
carte_tarot
Constantes :
excuse : carte_tarot Opérations d'accès : (Première possibilité)
Opérations de construction : carte_carte_tarot : {x : carte_tarot | est_carte_simple(x)}
cons_tarot_simple : carte → carte_tarot → carte
cons_atout : {n : entier | 1 ≤ n ≤ 21} → carte_tarot atout_de_tarot : {x : carte_tarot | est_atout(x)} →
Opérations de construction étendue : {n : entier | 1 ≤ n ≤ 21}
entier_to_carte_tarot : entier → carte_tarot
Opérations de test :
est_excuse, est_carte_simple, est_atout : carte_tarot → bool
14 15
Opérations d'accès : (Deuxième possibilité)
couleur_de_tarot : {x : carte_tarot | est_carte_simple(x)} Relation entre les deux solutions
→ couleur
couleur_de_tarot(c) peut s'obtenir comme
figure_de_tarot : {x : carte_tarot | est_carte_simple(x)} couleur_carte(carte_carte_tarot(c))
→ figure figure_de_tarot(c) peut s'obtenir comme
atout_de_tarot : {x : carte_tarot | est_atout(x)} → figure_carte(carte_carte_tarot(c))
{n : entier | 1 ≤ n ≤ 21}
16 17
18 19
Opérations d'accès : Notation
acces1 : {x : dom | est_op1 (x)} → {x : d1 | P1 (x)}
..
. {x : dom | true} → dom′ est équivalent à
accesm : {x : dom | est_opm (x)} → {x : dm | Pm (x)} {x : dom} → dom′ est équivalent à
Autres opérations : dom → dom′
..
.
20 21
Quelques variantes
On peut omettre ou rajouter quelques items selon les cas :
Si la propriété Pi (x) est toujours true, alors on l'écrit pas.
Si le domaine est construit à partir d'une seule constante ou
d'une seule opération de construction, alors inutile d'écrire accesi1 : {x : dom | est_opi (x)} →
l'opération de test car elle est équivalente à est(x) = true. {y : a1 | y = proj1 (x) et x : di et Pi (x)}
Si le domaine est construit à partir de m opérations de ..
.
construction, alors m − 1 opérations de test susent.
accesik : {x : dom | est_opi (x)} →
Si un domaine di est un produit cartésien a1 × . . . × ak , alors on
{y : ak | y = projk (x) et x : di et Pi (x)}
peut remplacer l'opération d'accès
22 23
Le Tarot en OCAML (* operations de test du type couleur *)
24 25
26 27
match f with Huit -> true | _ -> false;;
#let est_cavalier (f) =
match f with Cav -> true | _ -> false;;
#let est_sept (f) =
match f with Sept -> true | _ -> false;;
#let est_valet (f) =
match f with Valet -> true | _ -> false;;
(* type carte *)
28 29
30 31
| _ -> failwith "Pas une carte simple";;
#let est_carte_simple (c) =
match c with S(_) -> true | _ -> false;;
32 33
34 35
cons_carte: figure * couleur -> carte = <fun>
figure_carte: carte -> figure = <fun>
couleur_carte: carte -> couleur = <fun>
excuse: -> carte_tarot
Codage d'autres opérations d'un TDA
cons_tarot_simple: carte -> carte_tarot = <fun>
cons_atout: int -> carte_tarot = <fun> Abstrait : on utilise uniquement les opérations abstraites dénies
int_to_carte_tarot:int -> carte_tarot = <fun> dans le TDA.
est_carte_simple: carte_tarot -> bool = <fun> Concret : on utilise les primitives du langage de programmation
est_atout: carte_tarot -> bool = <fun> associées au domaines concrets utilisés dans le TDA.
figure_de_tarot: carte_tarot -> figure = <fun>
couleur_de_tarot: carte_tarot -> couleur = <fun>
atout_de_tarot: carte_tarot -> int = <fun>
36 37
Codage abstrait
#let points (c) =
then 1.5
if est_excuse(c)
else 0.5
then 4.5
else let n = atout_de_tarot(c) in
else if est_carte_simple (c)
if n=1 or n=21
then let f = figure_de_tarot(c) in
then 4.5
if est_roi(f)
else 0.5;;
then 4.5
else if est_dame(f)
val points : carte_tarot -> float = <fun>
then 3.5
else if est_cavalier(f)
then 2.5
else if est_valet(f)
38 39
Codage concret
40 41
Domaine :
Exemple : une première implémentation
pile #type pile = intlist;;
Constantes :
pile_vide : pile #let pile_vide = [];;
Opération de construction :
#let cons_pile(a,p) = a::p;;
cons_pile : entier × pile → pile
Opération de test : #let est_pile_nv(p) =
est_pile_nv : pile → bool match p with a::l -> true | _ -> false;;
Opérations d'accès
#let premier_pile(p) = match p with
premier_pile : {x : pile | est_pile_nv(x)} → entier
a::l -> a
reste_pile : {x : pile | est_pile_nv(x)} → pile | _ -> failwith"Pile Vide";;
42 43
Les prols de symboles de la signature
44 45
46 47
Exemple : encore une autre implémentation
#type pile_nv = {tete:int; reste:ma_pile} and
Les prols de symboles de la signature ma_pile = Pile_Vide | P of pile_nv;;
48 49
50 51