Académique Documents
Professionnel Documents
Culture Documents
Objectifs
1. apprendre aux étudiants (et à nous-même), qu’avant de s’attaquer à l’écriture du code des
fonctions ou des programmes (en algorithmique, JAVA, ou autre), de réfléchir à la
spécification des opérations correspondantes, en termes de leur profil, préconditions et
propriétés (axiomes) (TAD).
2. Ainsi, même si la question posée concerne l’écriture d’une fonction, il faut tjs commencer par
l’opération associée ; donc : profil, préconditions et axiomes ensuite la fonction demandée.
3. Rappeler à chaque fois que :
a. l’entête d’une fonction demandée est obtenue à partir du profil de l’opération que la
fonction est censée implémenter ;
b. Et quesoncorpsest déterminé soit, à partir des propriétés (axiomes) de l’opération si
possible (meilleure solution favorisant la réutilisation de la fonction), soit un code basé
sur la représentation interne (type) choisi.
4. A l’écriture des propriétés des opérations, commencez par les axiomes avec les constructeurs
en partie gauche, puis chercher tjs des axiomes (réutilisables directement à
l’implémentation : c.a.d ds les fonctions). Ces axiomes ne comportent pas de constructeurs en
partie gauche, mais des variables des sortes définies (exemple pr une liste :
L au lieu de insérer (L,e,i), pr une pile : P au lieu de empiler(P,e)…).
5. Pensez surtout aux solutions génériques donc réutilisables et n’oubliez pas l’efficacité
(complexité réduite) de vos solutions. Le choix des structures de données à un effet sur
l’efficacité ; vous aurez à choisir la structure la plus adaptée.
Exercice 01
Profil
surface: cercle réel
_ _ appartient à _: réel, réel booléen
Axiomes
surface(d) rayon(d) * rayon(d) * 3.14
TAD ENSEMBLE
Utilise ELEMENT BOOLEEN
Sorte ensemble
Opérations
: ensemble
ajouter : élément, ensemble ensemble
supprimer : élément ensemble ensemble
appartient : élément ensemble booléen
choisir : ensemble élément
Préconditions
pré(choisir (E)) est définie ssi E
pré(supprimer (e, E)) est définie ssi appartient(e,E )
Variables
E : ensemble e’,e : éléments
Axiomes
supprimer(e, Ajouter(e’,E)) ≡ si e=e’ alors E sinon Ajouter(e’, supprimer(e,E))
appartient(e, ) ≡ faux
appartient(e, ajouter(e’,E)) ≡ si e=e’ alors vrai sinon appartient(e,E)
2/
3/
b. Pour connaitre de sens de cette axiome « Appartient(x, ajouter(b, ajouter(a, ))) » on va utiliser les
axiomes de l’opération Appartient :
appartient(e, ) ≡ faux ……….(1)
appartient(e, ajouter(e’,E)) ≡ si e=e’ alors vrai sinon appartient(e,E) ……….(2)
appartient(x, )=Faux
c. Pour connaitre de sens de cette axiome « supprimer(2, ajouter(4, ajouter(5, ajouter(2, ajouter(4,
))))) » on va utiliser l’axiome de l’opération supprimer.
Etape 1 : e=2, e’=4 et E=ajouter(5, ajouter(2, ajouter(4, ))) en appliquant le sinon de (3):
ajouter(4, ajouter(5, supprimer(2, ajouter(2, ajouter(4, )))= ajouter(4, ajouter(5, ajouter(4, )))
4/
Profil:
cardinalité: ensemble entier
Axiomes:
cardinalité() 0
cardinalité(ajouter(e,E)) si appartient(e,E) alors cardinalité(E )
sinon 1+cardinalité(E )
Variables e: élément, E: ensemble
Exercice 03
1. Par réutilisation du type abstrait de données LISTE étudié en cours, le rôle de
l’opération : Chercher-Liste (selon son profile et ses axiomes) est de chercher un
élément e dans une liste avec un résultat booléen (vrai: l’élément existe, faux sinon),
car nous avons la sémantique suivante :
chercher-liste(e, liste-vide) faux
Profil:
chercher-liste: élément, liste entier
préconditions :
aucune
Axiomes:
Rq : Axiome avec les constructeurs en arguments, puis nous cherchons d’autres
axiomes sans les constructeurs en arguments (axiomes réutilisables à
l’implémentation, c.a.d le passage aux fonctions, ici en pseudocode)
chercher-liste(e, liste-vide) -1
chercher-liste(e, insérer(L,e', longueur (L)) si e==e' alors longueur (L)
sinon chercher-liste(e, L)
Avec des axiomes réutilisables (sans les constructeurs en arguments), et comme nous avons
besoin de la position de l’élément e à chercher, nous allons avoir deux versions de l’axiome (c’est
un seul axiome en sens, mais avec la position, nous aurons 2 positions à considérer selon que la
liste sera implémentée de façon chainée ou contiguë. Ici : L une adresse de début ( un pointeur)
ou longueur (L), en entier)
chercher-liste(e, liste-vide) -1
chercher-liste(e, L) si e= Acces(L,L) alors L
sinon chercher-liste(e, supprimer(L,L))
chercher-liste(e, liste-vide) -1
chercher-liste(e, L) si e= Acces(L,Longueur(L)) alors Longueur(L)
sinon chercher-liste(e, supprimer(L, Longueur(L)))
Début
Si (L= Liste-vide ( )) alors retourner -1
Sinon
Si e=Accès (L, Longueur(L)) alors retourner Longueur(L)
Sinon retourner (chercher-liste(e, supprimer(L, Longueur(L)))
Finsi
Finsi
Fin
Exercice 04
Précondition
2.b. Avec L'implémentation Chainée de la liste, développez des fonctions implémentant les
opérations: Ajouter-fin (L, e) et Queue ( L). Alors il faut passer par les Axiomes pour plus de
généricité des fonctions à développer.
Axiomes
Ajouter-fin (L, e) insérer(L, Null, e)
Queue (L)Si supprimer(L,L)= = liste-vide alors accès(L,L)
Sinon Queue(supprimer(L,L)
Ou bien par utilisation de l’opération Suivant (L), nous aurons :
Queue (L)si Suivant (L) == liste-vide alors accès (L,L)
Sinon queue(Suivant (L))
Fonction Liste-vide():liste
Début/* voir le 1.2.2. chap3-partie 2 : Implémentation chainée
Retourner NULL
fin
Remarque : Nous allons écrire l’algo complet en instanciant Elément dans le TAD
LISTE par Entier
Fonction Liste-vide():liste
Début /* voir le 1.2.2. chap3-partie 2 : Implémentation chainée
Retourner NULL
fin
2.Fonction récursive
Début
Si est-vide(L1) et est-vide(L2 )
Alors retourner liste-vide( )
Sinon retourner(insérer(Produit-liste (supprimer(L1,1),
supprimer(L2,1)), 1, accès(L1,1)*accès(L2,1)))
finsi
Fin
Exercice 06
Profil :
Axiomes :
Différence (liste-vide,L2) ≡liste-vide
Différence (L1, liste-vide) ≡L1
Différence (L1, L2) ≡ si chercher-list (L2, accès(L1, 1))
alors Différence(supprimer(L1, 1),L2)
sinon insérer (Différence(supprimer(L1,1),L2), 1, accès(L1,1))
Debut
si chercher-list (L2, accès(L1, 1))
alors retourner (Différence(supprimer(L1, 1),L2) )
sinon retourner ( insérer (Différence(supprimer(L1,1),L2), 1, accès(L1,1)) )
finsi
Fin
NB : Cette fonction reste inchangée avec les 2 implémentations, le rang 1 d’une liste
restera 1 en contiguë et L en chainée avec l’ajout des corps des fonctions de base
utilisées selon l’implémentation choisie.
Conclusion : La réutilisation, obtenue grâce à la « généricité » des solutions, est l’un des
objectifs du recours au TAD.
Exercice 07
1. Profil :
Maximum : liste réel
Précondition
Maximum non définie si la liste est vide
Axiome
Maximum(L)= Si est-vide (supprimer(L, 1)) alors accés(L, 1)
sinon Si accés(L, 1) > maximum(supprimer(L, 1))
alors accés(L, 1) sinon maximum(supprimer(L, 1)))
Ou bien de façon plus concise
Maximum(L)= Si est-vide (supprimer(L, 1)) ou si accés(L, 1) > maximum(supprimer(L, 1))
alors accés(L, 1) sinon maximum(supprimer(L, 1)))
Début
Si est-vide (supprimer(L, L)) ou accés(L,L) > maximum(supprimer(L,L))
Alors Retourner(accés(L,L))
Sinon retourner(maximum(supprimer(L,L)))
Fsi
Fin