1. La notion de TAD (type abstrait de données)
2. Types abstraits de données et Unités
en pascal
Le mécanisme de l'abstraction
est l’un des plus important avec celui de la méthode structurée
fonctionnelle en vue de la réalisation des programmes.
Notion d’abstraction en informatique :
L’abstraction consiste à penser à un objet en termes d’actions que l’on peut effectuer sur lui, et non pas en termes de représentation et d’implantation de cet objet. |
C’est cette attitude qui a conduit notre société aux grandes réalisations modernes. C’est un art de l’ingénieur et l’informatique est une science de l’ingénieur.
Dès le début
de la programmation nous avons vu apparaître dans les langages de programmation
les notions de subroutine puis de procédure et de fonction
qui sont une abstraction d’encapsulation pour les familles d’instructions
structurées:
Selon ce point de vue une structure de donnée devient:
Une collection d’informations structurées et reliées entre elles selon un graphe relationnel établi grâce aux opérations effectuées sur ces données. |
Nous spécifions d’une façon simple ces structures de données selon deux niveaux d’abstraction, du plus abstrait au plus concret.
Une spécification abstraite :
Description des propriétés générales et des opérations qui décrivent la structure de données. |
Une spécification opérationnelle :
Description d’une forme d’implantation informatique choisie pour représenter et décrire la structure de donnée. Nous la divisons en deux étapes : la spécification opérationnelle concrète (choix d’une structure informatique classique) et la spécification opérationnelle d’implantation (choix de la description dans le langage de programmation). |
Remarque :
Pour une spécification abstraite fixée nous pouvons définir plusieurs spécifications opérationnelles différentes. |
Bien que nous situant au niveau débutant il nous est possible d’utiliser sans effort théorique et mental compliqué, une méthode de spécification semi-formalisée des données. Le " type abstrait de donnée " basé sur le type abstrait algébrique est une telle méthode.
Le lecteur ne souhaitant pas
aborder le formalisme mathématique peut sans encombre pour la suite,
sauter le paragraphe qui suit et ne retenir que
le point de vue pratique de la syntaxe d’un TAA.
Notion d’algèbre
formelle informatique
(notations de F.H.Raymond cf.Biblio)
Soit (Fn) n ÎN , une famille d’ensembles tels que :
($i0 ÎN (1 £i0 £ n) / Fi0 ¹ Æ) Ù("i,"j, i¹ j Þ Fi Ç Fj = Æ) |
posons : I=
{ n ÎN / Fn ¹ Æ }
Vocabulaire :
Les symboles ou éléments
de F0 sont appelés symboles de constantes ou symboles fonctionnels
0-aire, les symboles de Fn (où n ³ 1 et n ÎI) sont appelés symboles fonctionnels n-aires. |
Notation :
F = ÈFn = ÈFn nÎN nÎI |
soit F* l’ensemble des expressions sur F, le couple (F*,F) est appelé une algèbre abstraite.
On définit pour tout symbole fonctionnel n-aire , une application de F*n dans F* notée " " de la façon suivante :
" e, ( Î Fn ¾® )
et { : F*n ¾® F*telle que (a1,...,an)¾® (a1,...,an)= (a1,...,an) }
On dénote :
Fn ={
/
Î Fn }et
=ÈFn
n ÎI |
le couple (F*,
) est appelé une algèbre formelle informatique (AFI).
Les expressions deF*construites à partir des
fonctions
sur des symboles fonctionnels n-airess’appellent
des schémas fonctionnels.
Par définition, les schémas
fonctionnels de F0 sont appelés les
constantes.
Exemple :
Soit le schéma fonctionnel
: fghafakbcchkgab
(chemin aborescent abstrait non parenthésé)
Ce schéma peut aussi s’écrire
avec un parenthésage :
f[g(h(a),f(a,k(b),c)),c,h(k(g(a,b)))]
ou encore avec une représentation
arborescente:
Interprétation
d’une algèbre formelle informatique
(notations de F.H.Raymond cf.Biblio)
Soit une algèbre formelle informatique (AFI) : (F*, )
Une AFI est alors un modèle abstrait pour toute une famille d'éléments fonctionnels, il suffit de changer le modèle d'interprétation pour implanter une struture de données spécifique.
Exemple :
F0 = {x,y} une AFI
F2 = {f,g}
F = F0 È F2
l’Univers : X = R (les nombres réels)
les opérateurs W = {+,*} (addition et multiplication)
l’interprétation y : (F*,
)¾® (R , W )
définie comme suit :
y(f) : R² ¾® R
y(f) : (a,b)¾® y( f
) [a,b] = a+b
y(g) : R² ¾® R
y(g) : (a,b) ¾® y( g ) [a,b] = a*b
y(x) = a0 (avec a0 ÎR fixé interprétant
la constante x)
y(y) = a1 (avec a1ÎR fixé interprétant la constante y)
Soit le schéma fonctionnel
fxgyx, son interprétation dans ce cas est la suivante :
y(fxgyx) = y(f(x,g(y,x))) = y(f)(y(x),y(g)[y(y),y(x)])
= y(x) + y(g)[y(y),y(x)]Ü propriété de y(f)
= y(x) + y(y)*y(x) Ü propriété dey(g)
Ce
qui donne comme résultat : y(fxgyx) = a0 + a1 * a0
A partir de la même AFI,
il est possible de définir une autre fonction d’interprétation
y’et un autre Univers
X’.
par exemple :
N (les entiers naturels)
et
W = { reste ,³}
(le reste de la division
euclidienne et la relation d’ordre)
La fonction y’est définie comme suit :
y’(g) :
N²¾® N
y’(g) :
(a,b)¾® y’(g)[a,b] = reste(a,b)
y’(f) :
N²¾® N
y’(f) : (a,b)¾® y’(f)[a,b] = a ³ b y’(x) = n0 (avec n0 ÎN fixé)
y’(y) = n1 (avec n1 Î N fixé)
On interprète alors le même schéma fonctionnel dans ce nouveau cas fxgyx :
y’(fxgyx)
= n0 ³ reste(n1, n0)
Ceci n’est qu’une interprétation.
cette interprétation reste encore une abstraction de plus bas niveau,
le sens (sémantique d’exécution), s’il y en a un, sera donné
lors de l’implantation de ces éléments. Nous allons définir
un outil informatique se servant de ces notions d'AFI et d'interprétation,
il s'agit du type abstrait algébrique.
Un TAA (type abstrait algébrique) est alors la donnée du triplet :
la syntaxe du TAA est définie par l’AFI et l’ensemble X
la sémantique du TAA est définie par y et l’ensemble WNotre objectif étant de rester pratique, nous arrêterons ici la description théorique des TAA (compléments cités dans la bibliographie pour le lecteur intéressé).
1.2 Disposition pratique d'un TAA
on écrira (exemple fictif):
Sorte : A, B, C ..... les noms de types définis par le TAA, ce sont les types au sens des langages de programmation.
Opérations :
f : A x B ¾® B
g : A ¾® C
x : ¾® B (notation pour les symboles de constantes de F0)
y : ¾® B (notation pour les symboles de constantes de F0)Cette partie qui décrit la syntaxe du TAA s’appelle aussi la signature du TAA .
La sémantique est donnée par (y , W )sous la forme d’axiomes et de préconditions.
Le domaine d’une opération définie partiellement est défini par une précondition.
Un TAA réutilise des TAA déjà définis, sous forme de hiérarchie. Dans ce cas, la signature totale est la réunion des signatures de tous les TAA.
Si des opérateurs utilisent le même symbole, le problème de surcharge peut être résolu sans difficulté, parce que les opérateurs sont définis par leur ensembles de définitions.
SYNTAXE DE L’ECRITURE D’UN TYPE ABSTRAIT ALGEBRIQUE :
sorte : ............... utilise : ...........
opérations :
préconditions :
........ def_ssi .......
axiomes :
FinTAA
Exemple d’écriture d’un TAA (les booléens) :
sorte : Booléens opérations :
V : ¾® Booléensaxiomes :
F : ¾® Booléens
¬ : Booléens ¾® Booléens
Ù : Booléens x Booléens ¾® Booléens
Ú : Booléens x Booléens ¾® Booléens¬(V) = F ; ¬(F) = VFinBooléens
a Ù V = a ; a Ù F = F
a Ú V = V ; a Ú F = a
Dans la suite du document les TAA ne seront pas utilisés entièrement, la partie axiomes étant occultée. Seules les parties opérations et préconditions sont étudiées en vue de leur implantation.
C’est cette restriction d’un TAA que nous appellerons un type abstrait de données (TAD). Nous allons fournir dans les paragraphes suivants quelques Types Abstrait de Données différents.
Nous écrirons ainsi par la suite un TAD selon la syntaxe suivante :
TAD Truc
Champs : ...........
opérations : ...........
préconditions : ...........
FinTAD Truc
Le TAD Booléens s’écrit à
partir du TAA Booléens :
opérations
: F : ¾® Booléens ¬ : Booléens ¾® Booléens Ù : Booléens x Booléens ¾® Booléens Ú : Booléens x Booléens ¾® Booléens |
Nous remarquons que cet outil permet de spécifier des structures de données d’une manière générale sans avoir la nécessité d’en connaître l’implantation, ce qui est une caractéristique de la notion d’abstraction.
1.4 Classification hiérarchique
Nous situons, dans notre approche pédagogique de la notion d’abstraction, les TAD au sommet de la hiérarchie informationnelle :
Exemples de types abstraits de données |
1.5 Le TAD liste linéaire (spécifications abstraite et concrète)
Spécification abstraite
Répertorions les fonctionnalités d’une liste en
soulignant les verbes d'actions et les noms, à partir d’une description
semi-formalisée:
De cette description nous extrayons
une spécification sous forme de TAD.
Ecriture syntaxique du TAD liste linéaire
TAD Liste
utilise : N, T0, Place
Champs : (a1,.....,an) suite finie dans T0
opérations :
préconditions
:
Fin-Liste
signification des
opérations :
(spécification
abstraite)
Il faut donc, afin de conserver la cohérence, ajouter deux préconditions au TAD Liste :
long(L) def_ssi
long(L) £ Longmax
inserer(L,k,e) def_ssi
(1 £ k
£ long(L)+1)
Ù (long(L) £ Longmax)
D’autre part la structure
de tableau choisie permet un traitement itératif de l’opération
kème ( une autre spécification récursive de cet opérateur
est possible dans une autre spécification opérationnelle de
type dynamique).
kème(L,k) =
contenu(acces(L,k) )
Spécification abstraite
Répertorions les fonctionnalités d’une pile LIFO (Last In First Out) en soulignant les verbes d'actions et les noms, à partir d’une description semi-formalisée:
- C’est une structure de donnée séquentielle dans laquelle les données peuvent être traitées les unes à la suite des autres à partir du sommet.
Ecriture syntaxique du TAD Pile LIFO
TAD PILIFO
utilise : T0, Booléens
Champs : (a1,.....,an) suite finie dans T0
opérations :
FinTAD-PILIFO
spécification opérationnelle concrète
1.7 Le TAD file FIFO (spécification abstraite seule)
Spécification abstraite
Répertorions les fonctionnalités d’une file FIFO (First
In First Out) en soulignant les verbes d'actions et les noms, à partir
d’une description semi-formalisée:
Ecriture syntaxique du TAD file FIFO
TAD FIFO
utilise : T0, Booléens
Champs : (a1,.....,an) suite finie dans T0
opérations :
FinTAD-FIFO
Spécification opérationnelle concrète
On peut ajouter après la dernière cellule pointée par l'élément fin comme le montre la figure ci-dessous :
dans ce cas retirer un élément en tête impliquera un décalage des données vers la gauche.
On peut aussi choisir d'ajouter à partir de la première cellule comme le montre la figure ci-dessous :
dans ce cas ajouter un élément en fin impliquera un décalage des données vers la droite.
2. Types abstraits de données et Unités en
pascal-Delphi
Nous allons proposer une écriture des TAD avec des unités pascal (version avec Unit) puis plus tard avec des objets Delphi.
La notion d’unité (Unit) se situe au niveau 4 de la hiérarchie informationnelle citée plus haut : elle nous a déjà servi à implanter la notion de module. Une unité est donc une approximation relativement bonne pour le débutant de la notion de TAD. Les classes se situant au niveau 2 de cette hiérarchie constitueront une meilleure approche de cette notion.
En fait un TAD sera bien décrit
par la partie interface d’une unit et se traduit presque immédiatement
; le travail de traduction des préconditions est à la charge
du programmeur et se trouvera dans la partie privée de la unit
(implementation)
syntaxe du TAD | squelette de la unit associée |
TAD Truc | Unit Truc ; |
utilise
TAD1 , TAD2,...,TADn |
interface
uses TAD1,...,TADn ;
|
champs
........ |
const ....
type .... var ....
|
opérations
Op1 : E x F à G Op2 : E x F x G à H x S ............ |
procedure
Op1(x :E ;y :F ;var z :G) ;
procedure Op2(x :E ;y :F ; z :G ; var t :H ;var u :S) ; ............ |
FinTAD-Truc | end. |
Unit Truc ;
interface
............
implementation
procedure Op1(x
:E ;y :F ;var z :G) ;
begin
............
end ;
procedure Op2(x
:E ;y :F ; z :G ;
var t :H ;var u :S) ;
begin
............
end ;
etc...
end.
2.2 Exemples de Traduction TAD ® Unit pascal
Le TAD Booléens implanté sous deux spécifications concrètes en pascal avec deux type scalaires différents.
TAD : Booléens
Champs :
Opérations :
FINTAD-Booléens
Spécification opérationnelle concrète n°1
Les constantes du type
Vrai, Faux sont représentées par deux constantes pascal dans
un type intervalle sur les entiers.
Const
vrai=1 ; faux=0
type
Booleens=faux..vrai
;
Voici l’interface de la unit traduite de ce TAD :
Unit Bool ;
interface
Const
vrai=1 ; faux=0
type
Booleens=faux..vrai
;
function Et
(x,y :Booleens) :Booleens ;
function Ou (x,y
:Booleens) :Booleens ;
function Non(x :Booleens)
:Booleens ;
Spécification opérationnelle concrète n°2
Les constantes du type Vrai, Faux sont représentées par deux identificateurs pascal dans un type énuméré.
type
Booleens=(faux,vrai)
;
Voici l’interface de la unit traduite de ce TAD :
Unit Bool ;
interface
type
Booleens=(faux,vrai)
;
function Et
(x,y :Booleens) :Booleens ;
function Ou (x,y
:Booleens) :Booleens ;
function Non(x :Booleens)
:Booleens ;
2.3 Variations sur les spécifications d’implantation
Cet exercice ayant été
proposé à un groupe d’étudiants, nous avons eu plusieurs
genres d’implantation des opérations : et,ou,non. Nous exposons au
lecteur ceux qui nous ont parus être les plus significatifs :
Implantation d’après spécification concrète n°1
implementation
function Et
(x,y :Booleens) :Booleens ;
begin
Et := x * y
end ;
function Ou
(x,y :Booleens) :Booleens ;
begin
Ou :=x+y - x*y
end ;
function Non(x
:Booleens) :Booleens ;
begin
Non := 1-x
end ;
L’analyse des étudiants
a été dirigée ici par le choix de la spécification
concrète sur les entiers sur un modèle semblable aux fonctions
indicatrices des ensembles. Ils ont alors cherché des combinaisons
simples d’opérateurs sur les entiers fournissant les valeurs adéquates.
Autre implantation d’après la même spécification concrète
implementation
function Et
(x,y :Booleens) :Booleens ;
begin
if x=Faux
then Et :=Faux
else Et :=
Vrai
end ;
function Ou
(x,y :Booleens) :Booleens ;
begin
if x=Vrai
then Ou := Vrai
else Ou :=
Faux
end ;
function Non(x
:Booleens) :Booleens ;
begin
if x=Vrai
then Non := Faux
else Non
:= Vrai
end ;
L’analyse des étudiants
a été dirigée dans ce cas par des considérations
axiomatiques sur une algèbre de Boole. Ils se sont servis des propriétés
d’absorbtion des éléments neutres de la loi " ou " et
de la loi " et ". Il s’agit là d’une structure algébrique
abstraite.
Influence de l’abstraction sur la réutilisation
A cette étape du travail nous avons demandé aux étudiants quel était, s’il y en avait un, le meilleur choix d’implantation quant à sa réutilisation pour l’implantation d’après la spécification concrète n°2.
Les étudiants
ont compris que la version dirigée par les axiomes l’emportait sur
la précédente, car sa qualité d’abstraction due à
l’utilisation de l’axiomatique a permis de la réutiliser sans aucun
changement dans la partie implementation de la unit associée à
spécification concrète n°2 (en fait toute utilisation des
axiomes d’algèbre de Boole produit la même efficacité).
Conclusion :
l’abstraction a permis ici une réutilisation totale et donc un gain de temps de programmation dans le cas où l’on souhaite changer quelle qu’en soit la raison, la spécification concrète. |
Dans les exemples qui
suivent, la notation @ indique
la traduction en un squelette en langage pascal.
2.4 Exemples d’implantation de la liste linéaire
spécification proposée en pseudo-Pascal :
Liste @ | type Liste=record
long : 0.. Longmax |
liste_vide @ | var L : Liste (avec L.long :=0) |
acces @ | var k : integer;
L : liste (adresse(L.t[k])) |
contenu @ | var k : integer;
L : liste (val(adresse(L.t[k]))) |
kème @ | var k : integer;
L : liste (kème(L,k) @ L.t[k] ) |
long @ | var L : liste ( long @ L.long ) |
succ @ | adresse(L.t[k])+1 c-à-dire ( L.t[k+1] ) |
supprimer @ | procedure supprimer(var
L : Liste ; k : 1.. Longmax); begin .......... end; {supprimer} |
inserer @ | procedure inserer(var
L : Liste ; k : 1.. Longmax; x : T0); begin .......... end; {inserer} |
Le reste du programme est laissé au soin du lecteur qui pourra ainsi se construire sur sa machine ,une base de types en Pascal.
Nous pouvons " enrichir " le TAD Liste en lui adjoignant deux opérateurs test et rechercher (rechercher un élément dans une liste). Ces adjonctions ne posent aucun problème. Il suffit pour cela de rajouter au TAD les lignes correspondantes :
opérations
Test : Liste x T0 ¾® Booléen
rechercher : Liste x T0 ¾® Place
précondition
function Test(L : liste;
e : T0):Boolean;
begin
{il s’agit
de tester la présence ou non de e dans la liste L}
end;
procedure rechercher(L
: liste ; x : T0; var rang : integer);
begin
if Test(L,x) then
Nous allons utiliser un tableau
avec une case supplémentaire permettant d’indiquer que le fond de pile
est atteint (la case 0 par exemple, qui ne contiendra jamais d’élément).
Pilifo @ | type Pilifo=record
sommet: 0.. Longmax |
depiler @ | procedure depiler(var Elt : T0 ;var P : Pilifo) ; |
empiler @ | procedure empiler( Elt : T0 ;var P : Pilifo) ; |
premier @ | procedure premier(var
Elt : T0 ; P : Pilifo) ; (on pourra utiliser une function renvoyant un T0, si le type T0 s’y prête !) |
Est_vide @ | function Est_vide(P : Pilifo) : boolean ; |
Le contenu des procédures et des fonctions est laissé au lecteur à titre d’exercice.
Remarque :
Il est aussi possible de construire une spécification opérationnelle à l’aide du TAD Liste en remplaçant dans l’étude précédente le mot " tableau " par le mot " liste ". Il est vivement conseillé au lecteur d’écrire cet exercice en pascal pour bien se convaincre de la différence entre les niveaux d’abstractions. Nous le traiterons plus loin en Delphi. |
Nous allons utiliser ici aussi
un tableau avec une case supplémentaire permettant d’indiquer
que la file est vide (la case 0 par exemple, qui ne contiendra jamais d’élément).
Fifo @ | type Fifo=record
sommet: 0.. Longmax |
retirer @ | procedure retirer(var Elt : T0 ;var F : Fifo) ; |
ajouter @ | procedure ajouter( Elt : T0 ;var F : Fifo) ; |
premier @ | procedure premier(var
Elt : T0 ; P : Fifo) ; (on pourra utiliser une function renvoyant un T0, si le type T0 s’y prête !) |
Est_vide @ | function Est_vide(P : Fifo) : boolean ; |
Le contenu des procédures
et des fonctions est laissé au lecteur à titre d’exercice.
Remarque :
Comme pour le TAD Pilifo, il est aussi possible de construire une spécification opérationnelle du TAD FIFO à l’aide du TAD Liste en remplaçant dans l’étude précédente le mot " tableau " par le mot " liste ". |