You are on page 1of 243

Conservatoire National des Arts & Mtiers

Centre associ de Nice


Le Raisonnement
Informatique
&
La Programmation
Informatique - Cycle A
Algorithmique & Programmation
Jean Demartini
1994 - 1995 - 1996 - 1997 - 1998 - 1999 - 2000
Table des Matires
- i -
1. Introduction..................................................................................................................................... 1
2. Les Fonctions................................................................................................................................... 8
2.1 Rappel sur les fonctions ........................................................................................................................ 9
2.2 Les Diffrentes formes de la dfinition dune fonction ........................................................................ 9
2.2.1 Construction dun domaine ou dun codomaine....................................................................... 10
2.2.2 Dfinition en intention .............................................................................................................. 11
2.2.3 Dfinition en extension............................................................................................................. 12
2.2.4 Techniques de dfinition........................................................................................................... 12
2.2.5 Egalit de deux fonctions.......................................................................................................... 16
2.3 Composition des fonctions.................................................................................................................. 18
2.4 Techniques de conception................................................................................................................... 19
2.4.1 Abstraction par composition & nommage ................................................................................ 19
2.4.2 Abstraction par gnralisation .................................................................................................. 20
2.4.3 Abstraction fonctionnelle & Curryfication ............................................................................... 22
2.4.4 Application d'une fonction ses arguments & valuation........................................................ 23
2.4.5 Dfinition dun environnement ................................................................................................. 24
2.4.6 Evaluation en ordre normal & valuation en ordre applicatif................................................... 24
2.5 Fonctions dordre suprieur ................................................................................................................ 26
2.6 Fonctions effets ............................................................................................................................ 28
2.7 Fonctions & quations......................................................................................................................... 29
2.7.1 Points fixes d'une fonction........................................................................................................ 31
2.7.2 Oprateur de point fixe ............................................................................................................. 32
2.7.3 Rsolution d'une quation quelconque...................................................................................... 33
2.7.4 Inversion d'une fonction monotone quelconque ....................................................................... 33
2.7.5 Gnralisons un peu (encore ?)................................................................................................. 34
2.8 Fonctions & processus ........................................................................................................................ 34
2.8.1 Rcursivit linaire & itration................................................................................................. 35
2.8.2 Rcursivit en arbre .................................................................................................................. 37
2.8.3 Ordre de croissance................................................................................................................... 38
2.9 Mathmatique et informatique - Digression........................................................................................ 39
2.9.1 Les nombres de tous les jours ................................................................................................... 40
2.9.2 Fonctions oprant sur les nombres de tous les jours................................................................. 40
2.10 Conclusions ......................................................................................................................................... 41
2.11 Exercices ............................................................................................................................................. 41
3. Les Donnes ................................................................................................................................... 49
3.1 Les Nombres boolens ........................................................................................................................ 50
3.1.1 Dfinition des Constantes boolennes ...................................................................................... 50
3.1.2 Oprations sur les Nombres boolens....................................................................................... 50
3.1.3 La Fonction si (note ) ...................................................................................................... 52
3.2 Les Nombres rationnels....................................................................................................................... 52
3.2.1 Dfinition du Nombre rationnel ................................................................................................ 53
3.2.2 Oprations sur les Nombres rationnels ..................................................................................... 54
3.2.3 Symbole & Citation .................................................................................................................. 55
- ii -
3.2.4 Reprsentations interne du Nombre rationnel........................................................................... 56
3.2.5 Comparaison de deux nombres rationnels ................................................................................ 57
3.3 Barrires d'abstraction......................................................................................................................... 60
3.4 Qu'est-ce qu'une donne ? ................................................................................................................... 61
3.5 Exercices ............................................................................................................................................. 62
4. Les Structures. .............................................................................................................................. 66
4.1 Structures de donnes.......................................................................................................................... 66
4.2 La Paire (2-uplet). ............................................................................................................................... 67
4.3 LEnregistrement (n-uplet).................................................................................................................. 68
4.4 Le Tableau (n-uplet)............................................................................................................................ 70
4.5 Le Filtrage et les Fonctions non curryfies ..................................................................................... 71
4.6 La Liste & le Chanage des Paires ...................................................................................................... 72
4.7 Les Nuds & les Arbres binaires........................................................................................................ 78
4.7.1 Les Nuds................................................................................................................................. 78
4.7.2 Les Arbres binaires. .................................................................................................................. 79
4.7.3 Recherche dans un Arbre binaire .............................................................................................. 80
4.7.4 Construction dun Arbre binaire ............................................................................................... 80
4.7.5 Les Parcours dun Arbre binaire. .............................................................................................. 81
4.8 Codage de Huffman & utilisation des arbres binaires......................................................................... 82
4.9 Equivalence oprationnelle. ................................................................................................................ 84
4.9.1 Egalit de deux Atomes. ........................................................................................................... 85
4.9.2 Egalit de deux Structures......................................................................................................... 86
4.10 Conclusion........................................................................................................................................... 86
4.11 Exercices. ............................................................................................................................................ 87
5. Elments de Programmation. ...................................................................................................... 96
5.1 Dfinir & Programmer. ....................................................................................................................... 97
5.1.1 Application fonctionnelle.......................................................................................................... 97
5.1.2 Abstraction fonctionnelle. ......................................................................................................... 97
5.1.3 Donnes primitives. .................................................................................................................. 97
5.1.4 Structures courantes. ................................................................................................................. 98
5.1.5 Formes particulires. ................................................................................................................. 98
5.1.6 Un Langage pour sexprimer, un Langage pour programmer. ................................................. 99
5.2 Le Langage Scheme............................................................................................................................. 99
5.3 Expressions Scheme. ......................................................................................................................... 100
5.4 Nommage & Environnement. ........................................................................................................... 102
5.5 Principaux Objets prdfinis Scheme. ............................................................................................... 103
5.5.1 Donnes Scheme. .................................................................................................................... 103
5.5.2 Paire Scheme. .......................................................................................................................... 103
5.5.3 Liste Scheme. .......................................................................................................................... 104
5.5.4 Vecteur Scheme....................................................................................................................... 106
5.6 lambda : le constructeur de fonctions................................................................................................ 107
5.7 Expressions conditionnelles & prdicats........................................................................................... 108
5.7.1 if et les expressions conditionnelles........................................................................................ 108
5.7.2 Prdicats. ................................................................................................................................. 109
5.7.3 Exemples dutilisation dexpressions conditionnelles. ........................................................... 109
5.8 quote et citations................................................................................................................................ 109
- iii -
5.9 Equivalence oprationnelle. .............................................................................................................. 110
5.10 Formes drives................................................................................................................................. 110
5.10.1 cond et les expressions gardes............................................................................................... 110
5.10.2 let et les extensions de l'environnement. ................................................................................. 112
5.10.3 let* et les extensions emboites. ............................................................................................. 113
5.10.4 letrec et les extensions rcursives. .......................................................................................... 114
5.11 Scheme et lapplication fonctionnelle. .............................................................................................. 115
5.12 Evaluation des expressions composes. ............................................................................................ 115
5.13 Formes spciales. .............................................................................................................................. 117
5.14 O lon reparle de define................................................................................................................... 119
5.15 Effets de bord. ................................................................................................................................... 120
5.16 Exercices. .......................................................................................................................................... 121
6. Les Structures mutables............................................................................................................. 126
6.1 Etat & Affectation. ............................................................................................................................ 127
6.2 Variables d'Etat & Affectation. ......................................................................................................... 128
6.3 Egalit & Identit. ............................................................................................................................. 130
6.4 Prix payer pour l'Affectation. ..................................................................................................... 131
6.5 Variables & Environnements - Modle graphique............................................................................ 133
6.6 Les Structures mutables prdfinies de Scheme................................................................................ 133
6.7 Quelques structures mutables trs utiles. .......................................................................................... 134
6.7.1 La Rfrence. .......................................................................................................................... 134
6.7.2 La Pile. .................................................................................................................................... 136
6.7.3 La File d'attente....................................................................................................................... 136
6.7.4 Le Dictionnaire. ...................................................................................................................... 137
6.8 Variables, Environnements & autres Considrations........................................................................ 139
6.8.1 Dfinitions des Fonctions et .................................................................................................. 140
6.8.2 Smantique dun Symbole. ..................................................................................................... 140
6.8.3 Smantique de set!. ................................................................................................................. 141
6.8.4 Smantique dune Forme lambda. .......................................................................................... 141
6.8.5 La Fonction . ........................................................................................................................... 141
6.8.6 Smantique dune Forme letrec. ............................................................................................. 141
6.9 Exercices. .......................................................................................................................................... 141
7. Reprsentation des Donnes abstraites. .................................................................................... 145
7.1 Le Mgateuf Gym Center.............................................................................................................. 146
7.1.1 Cahier des charges .................................................................................................................. 146
7.2 Spcifications gnrales .................................................................................................................... 146
7.2.1 Fichier-Clients......................................................................................................................... 146
7.2.2 Client ....................................................................................................................................... 147
7.2.3 Date ......................................................................................................................................... 147
7.2.4 Adresse.................................................................................................................................... 148
7.2.5 Simulons les Spcifications .................................................................................................... 148
7.3 Spcifications dtailles .................................................................................................................... 150
7.3.1 Fichier-Clients......................................................................................................................... 150
7.3.2 Client ....................................................................................................................................... 151
7.3.3 Date ......................................................................................................................................... 152
7.3.4 Adresse.................................................................................................................................... 153
7.4 Le Mgateuf Gym Center s'aggrandit ........................................................................................... 153
- iv -
7.4.1 Specifications gnrales.......................................................................................................... 154
7.5 Spcifications dtailles de la Supervision. ...................................................................................... 155
7.6 Aiguillage par le type. ....................................................................................................................... 156
7.7 Programmation par Transmission de Messages ................................................................................ 157
7.8 Programmation dirige par les Donnes. .......................................................................................... 158
7.8.1 Spcifications gnrales de lAiguillage................................................................................. 158
7.8.2 Utilisation de Table dans le Cadre de lApplication. .............................................................. 158
7.8.3 Spcifications dtailles de Table. .......................................................................................... 159
7.9 Le Cycle de Vie dun Logiciel...................................................................................................... 160
7.10 Exercices. .......................................................................................................................................... 161
7.11 Annexe : structure Ensemble......................................................................................................... 163
8. Objets & Programmation Oriente Objets .............................................................................. 166
8.1 Qu'est-ce qu'un Objet ?...................................................................................................................... 168
8.1.1 Attributs d'un Objet................................................................................................................. 168
8.1.2 Mthodes & Messages d'un Objet........................................................................................... 170
8.1.3 Espce d'un Objet & Hritage................................................................................................. 174
8.2 Objets-Classe & Objets-Instance ...................................................................................................... 178
8.3 Une Serrure Code ........................................................................................................................... 180
8.3.1 Spcifications gnrale du Systme de Serrure ...................................................................... 180
8.3.2 Spcifications dtailles.......................................................................................................... 184
8.4 Un petit Coup d'Oeil en Arrire ........................................................................................................ 186
8.5 Exercices ........................................................................................................................................... 188
8.6 Annexes............................................................................................................................................. 191
8.6.1 Constructeur d'Objets.............................................................................................................. 191
8.6.2 Dictionnaire des Attributs & des Mthodes............................................................................ 191
9. Spcifier puis Implmenter. ....................................................................................................... 194
9.1 Les Elments de construction d'une Application C........................................................................... 195
9.1.1 ............................................................................................................................. Expressions.195
9.1.2 Instructions.............................................................................................................................. 196
9.1.3 Dclarations. ........................................................................................................................... 197
9.1.4 ........................................................................................................................... Blocs de code197
9.1.5 ...........................................................................................................Fonctions & Procdures198
9.1.6 Structures de Donnes............................................................................................................. 199
9.2 Architecture d'une Application C...................................................................................................... 200
9.3 Processus de Dveloppement d'une Application............................................................................... 201
9.4 Constitution des Paquetages.............................................................................................................. 202
9.5 Typage explicite des Donnes........................................................................................................... 203
9.5.1 Types de Base. ........................................................................................................................ 204
9.5.2 Les Donnes simples............................................................................................................... 204
9.5.3 Les Pointeurs........................................................................................................................... 205
9.5.4 Types construits. ..................................................................................................................... 206
9.5.5 Nommage des Types. .............................................................................................................. 209
9.5.6 Type d'une Fonction................................................................................................................ 209
9.5.7 Forage du Type...................................................................................................................... 211
9.6 Les Environnements d'une Application C......................................................................................... 211
9.6.1 Rgles de Visibilit. ................................................................................................................ 212
9.6.2 Environnement permanent global d'une Application.............................................................. 213
- v -
9.6.3 Environnement statique local d'un Paquetage......................................................................... 214
9.6.4 Environnements privs d'un Bloc de Code. ............................................................................ 214
9.6.5 Environnement manuel dit le tas......................................................................................... 216
9.7 Paquetage de la Paire......................................................................................................................... 218
9.7.1 Spcifications dtailles de la Paire. ....................................................................................... 218
9.7.2 Interface de la Paire................................................................................................................. 218
9.7.3 Implmentation de la Paire. .................................................................................................... 219
9.8 Paquetage de la Liste......................................................................................................................... 220
9.8.1 Spcifications dtailles de la Liste. ....................................................................................... 221
9.8.2 Interface de la Liste................................................................................................................. 221
9.8.3 Implmentation de la Liste...................................................................................................... 221
9.9 Le Paquetage de la Pile. .................................................................................................................... 222
9.9.1 Spcifications dtailles de la Pile. ......................................................................................... 222
9.9.2 Interface de la Pile................................................................................................................... 223
9.9.3 Implmentation de la Pile ....................................................................................................... 223
9.10 Les Procdures C............................................................................................................................... 224
9.11 Transmission de Messages en langage C. ......................................................................................... 227
9.12 Rcursion terminale & Processus itratif. ......................................................................................... 229
9.12.1 Traduction de l'Invariant. ........................................................................................................ 229
9.12.2 Structures de Boucle. .............................................................................................................. 231
9.13 Le Pr-Processeur C. ......................................................................................................................... 232
9.13.1 Intgration de Fichiers. ........................................................................................................... 233
9.13.2 Dfinition de Constantes. ........................................................................................................ 233
9.13.3 Dfinition de Formes spciales. .............................................................................................. 233
9.13.4 Traitement conditionnel. ......................................................................................................... 234
9.14 Conclusion......................................................................................................................................... 236
9.15 Exercices. .......................................................................................................................................... 236
- 1 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
1. Introduction
Aux temps hroques, dans les annes 50 et 60, linformaticien tait celui qui savait utiliser
un ordinateur, essentiellement pour faire des calculs. Son but tait presque toujours de trou-
ver une mthode de calcul algorithme mettant en uvre les organes dun ordinateur : cir-
cuits de calcul, mmoire et organes dentre/sortie dcrite sous la forme dun
programme. Linformaticien tait un programmeur, ce qui lamusait beaucoup et linforma-
tique tait une forme dartisanat.
Aussi longtemps quil na pas t possible de rcuprer commodment les programmes
crits par dautres, linformaticien a t programmeur il passait son temps rcrire des
programmes et il a fallut quil apprenne crire, seul ou avec dautres des programmes
de plus en plus complexes et de plus en plus gros.
Pendant longtemps, on a pu croire (ou voulu faire croire) que linformatique tait une scien-
ce en soi, celle qui consiste programmer de faon plus ou moins rationnelle des ordina-
teurs ordinateurs
1
. Bien entendu, cette vision est aussi nave que celle qui consiste croire
que la mcanique est uniquement ce que font les garagistes, llectricit uniquement ce que
font les lectriciens ou la chimie uniquement ce que font les chimistes.
On sait bien que les choses ne sont pas si simples et que chacun de ces domaines techniques
ncessite la mise en uvre de tout un ensemble de connaissances thoriques et pratiques
bien diffrentes. Il en va de mme pour linformatique qui ne peut que prendre le mme che-
min.
Prenons un exemple trs simplifi pour illustrer ce propos, celui de la construction dun di-
fice (une maison, une glise, une cole, un pont...).
1
Dans son dition 1987, le Petit Larousse dfinit linformatique par : Science du traitement automatique
et rationnel de linformation considre comme le support des connaissances et des communications.
Nous ne lancerons pas le dbat pour essayer de savoir si linformatique qui nous intresse est une science
ou une technique.
Introduction
- 2 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Ne nous posons pas de questions sur la justification (une glise ou un pont de plus ?) et la
finalit (une cole ou une piscine ?) de ldifice que nous devons construire.
Cet difice doit rendre un certain service tout en satisfaisant des contraintes (techniques, so-
ciales, conomiques...) et sa structure, sa forme seront le rsultat dun compromis entre de
nombreux choix conceptuels possibles. Cest larchitecte que revient la dfinition de ce
compromis.
La construction de cet difice va mettre en uvre diffrents matriaux et composants (bois,
mtal, bton, pltre, vitrages, canalisations...) et diffrentes formes (poutres, lames, feuilles,
voiles, fils, tuyaux...) qui devront tre assembles de telles sorte que les lois physiques qui
les rgissent soient toutes respectes. Ldifice doit tenir debout et fonctionner (les lampes
sallument quand on actionne les interrupteurs et leau coule quand on ouvre les robinets...)
mme sil y a du vent ou de la neige. Un bureau dtude et des ingnieurs dfiniront les
diffrents choix techniques.
Jusqu prsent, notre difice nexiste que dans la tte de ceux qui en parlent, il reste encore
le construire. Cette construction va ncessiter la coordination de nombreux corps de m-
tiers (maons, charpentiers, carreleurs, pltriers, lectriciens...). Cest une entreprise de
construction qui assurera cette coordination. Son rle consiste planifier les travaux ef-
fectuer et vrifier quune tche est ralise correctement et au moment o elle doit ltre.
Son rle consiste galement faire en sorte que tout ce qui peut se faire en mme temps le
soit effectivement.
Finalement, les seuls qui font quelque chose de concret sont les corps de mtiers. Tous les
autres manipulent des abstractions. Cest tout cela qui constitue le Btiment.
Parler dInformatique, aujourdhui, cache autant de diversit que parler du Btiment,
cest une activit multiformes qui peut tre par exemple :
crire un programme scolaire en Basic,
construire et/ou assembler les lments qui constituent un ordinateur,
participer lcriture dun gros programme,
concevoir un systme dinformation (une base de donnes),
concevoir un rseau dentreprise,
faire sortir le prince de Prince of Persia du pige dans lequel il est tomb,
choisir des outils bureautiques,
administrer un rseau et de ses dutilisateurs,
dpanner un disque dur,
dmontrer linconsistance du -calcul non typ,
changer le fusible de limprimante,
mettre au point un algorithme de cryptage,
concevoir un langage de programmation,
...
et bien dautres choses.
Par contre nous nous refusons absolument appeler Informatique le jeu de hasard, immortalis par
le cinma et les sries tlvises, qui consiste taper des signes sur un clavier pour essayer de deviner
le mot de passe donnant accs aux fichiers dun personnage malfaisant.
Une classification acadmique (chez les anglo-amricains) des activits de linformatique
peut tre celle du Tableau 1, page 3. Mais cette classification ne concerne que lactivit qui
consiste construire des ordinateurs ou celle qui consiste crire des programmes, elle est
donc trs incomplte.
Introduction
- 3 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Mais alors, que faut-il enseigner un informaticien dbutant pour lui faciliter laccs une
profession appele vaguement Informaticien ?
Pendant trs longtemps (et encore malheureusement souvent), lenseignement de linfor-
matique consistait presquuniquement enseigner un langage de programmation. Si cette
approche tait tout fait pardonnable il y a 30 ans, elle relve de lescroquerie intellectuelle
aujourdhui.
Il est clair que nous naborderons pas tous les thmes suggrs par la liste prcdente, nous
liminerons tous ce qui peut sapprendre sur le tas pour peu quon soit un peu curieux :
utiliser navement un traitement de texte ou un tableur,
changer le fusible de limprimante,
...
ainsi que toute chose qui sapprendra aisment en lisant une notice, en pratiquant suffisam-
ment ou qui relve en fait dun autre mtier (lutilisation claire des traitements de texte
actuels ncessite incontestablement des connaissances en typographie et en composition de
document).
Nous liminerons galement tout ce qui (ne) peut (que) sapprendre par lexprience :
grer une quipe de programmeurs,
planifier et conduire lcriture dun gros programme,
...
En fait, si nous ne voulons pas simplement noncer un catalogue de recettes, nous ne pou-
vons considrerons que des domaines o il a t possible et utile dtablir des lois gnra-
les. En fait, linformatique, par son aspect conception, utilise grande chelle des
mcanismes dabstraction trs gnraux et ce sont ces mcanismes que nous introduirons et
dvelopperons.
La ralisation dun systme peut tre schmatiquement conduite en 3 tapes :
1. spcifier le problme rsoudre,
2. en concevoir une solution,
Tableau 1 : Une classification des activits informatiques.
Gnie
informatique
Sciences des ordinateurs
Computer science
Etude des lois physiques (semi-conduc-
teurs, phnomnes de propagation, etc.)
et des principes (architecture des machi-
nes, mthodes de communication, etc.)
utiles pour la conception des ordinateurs
Ingnierie des ordinateurs
Computer engineering
Etudes des mthodes utiles pour la fabri-
cation des machines (circuits intgrs,
circuits imprims, connecteurs, gestion
de production etc.)
Gnie
logiciel
Sciences du logiciel
Software science
Etudes des lois de raisonnement et
dabstraction (logiques diverses, proto-
coles de communication, mcanisme de
synchronisation, etc.) et des structures
utiles la conception des logiciels
Ingnierie du logiciel
Software engineering
Etudes des mthodes utiles pour la rali-
sation des logiciels.
Introduction
- 4 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
3. implmenter
2
cette solution.
Ltape dimplmentation est trs analogue ce que dans un processus de production on
appelle la fabrication et de mme que la fabrication des objets matriels est de plus en plus
confie des machines, il en ira probablement de mme pour limplmentation des pro-
grammes aussi allons-nous concentrer nos efforts sur les mcanismes de spcifications et
de conception.
Nous dirons alors que programmer cest spcifier et concevoir (et ventuellement impl-
menter) et nous qualifierons de programme le rsultat dun travail de spcification ou dun
travail de conception.
Ce cours est destin des dbutants. Il tente de donner une image la plus rationnelle pos-
sible de la programmation. Nos connaissances actuelles ne permettent pas de prsenter les
mcanismes dabstraction utiliss par linformatique aussi rigoureusement que peut ltre
une thorie mathmatique ou un domaine bien mature de la physique, nous serons donc, de
temps en temps, obligs davouer notre impuissance. Cependant, cette image prfigure pro-
bablement les concepts qui sous-tendront les outils de travail qui seront mis la disposition
des programmeurs dans les annes futures. Nous sommes bien conscients que tout nest pas
facile dans ce cours aussi avons-nous fait notre possible pour introduire les difficults de
manire progressive et avons-nous limin tout ce qui ntait pas strictement ncessaire
la comprhension de lensemble. Tous les mcanismes dabstractions que nous allons ren-
contrer se rencontrent (quelque fois inconsciemment) dans les activits de la vie courante
et nont rien, en fait, de nouveau. Ce qui est nouveau, cest la ncessit que nous aurons
de les analyser attentivement afin den dcouvrir toutes les proprits.
Si les quelques ides sous-jacente un peu originales que nous introduirons peuvent tre at-
tribues aux logiciens des annes 40 nous considrerons un peu arbitrairement que leur
chef de file est Alonzo Church sans toutefois minimiser linfluence des Schnfinkel, Curry,
Strachey, Scott, McCarthy, Milner... ce nest que dans les annes 60 que la pertinence
de ces ides dans le domaine de la programmation a t mise en vidence. Les articles de
P.J.Landin The Next 700 programming Languages
3
et The mechanical Evaluation of Ex-
pressions
4
marquent un tournant dans la formalisation de lactivit de programmation.
La prsentation qui est donne ici est assez inhabituelle. Elle ne droute pas des dbutants
dots de la culture scientifique dune classe de terminale de lyce, par contre, ceux qui ont
appris linformatique dune faon plus traditionnelle ou par quelques annes dexercice de
la profession sont souvent perturbs par une approche radicalement diffrente. Je leur de-
mande daccepter de faire leffort doublier, provisoirement bien sr, ce quil savent dj et
de jouer le jeu. Cet effort sera rcompens par lacquisition dune comprhension pro-
fonde des mcanismes de programmation au sein de laquelle leurs connaissances sintgre-
ront harmonieusement.
Tout au long de ce cours, vont alterner des rsultats tablis rigoureusement et des affirma-
tions qui refltent une opinion de lauteur. Dans la mesure o aucune faute de raisonnement
nest commise, un rsultat rigoureux est incontestable, par contre, toute opinion peut tre
discute. Cest pourquoi nous avons eu le soucis dnoncer le plus clairement possible les
arguments utiliss pour tayer telle ou telle opinion
5
.
2
mot franglais signifiant approximativement mettre en uvre, raliser, construire.
3
Communication of ACM 9, march 1966, pp 157-166
4
The Computer Journal 6(4), 1964, pp 157-166
5
Est-il ncessaire de rappeler quune opinion ne vaut que par les arguments sur laquelle elle sappuie et non
pas par la qualit de son auteur ?
Introduction
- 5 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Les diffrents chapitres sont suivis dexercices de difficults varies et choisis plus pour
lintrt de la rflexion que leur rsolution ncessite que pour lintrt pratique de la solu-
tion laquelle ils conduisent. La rsolution de certains nexige que quelques minutes un
lecteur attentif, dautres peuvent rclamer plusieurs jours dun travail difficile. Rien ne dis-
tingue un exercice facile dun exercice (trs) difficile afin dviter une esquive inconscien-
te. En fait, ces exercices sont conus pour que la recherche de la solution apporte plus que
la solution elle-mme.
La plupart de ces exercices nont pas une solution unique et pour viter que la solution de
lauteur soit considre comme la meilleure simplement parce que cest celle de lauteur,
aucune solution nest donne. Je ne voudrais pas, non plus, priver le lecteur de limmense
satisfaction de trouver par soi-mme. Que celui-ci se rassure, lexprience lui dmontrera
que lorsquil aura trouv une solution satisfaisante, il sera convaincu de sa validit.
Le chapitre 2 est un rappel simple de la notion de fonction telle que les mathmaticiens la
dfinissent aujourdhui. On mettra en vidence la diffrence fondamentale entre la vision
en extension des mathmatiques et la vision en intention de linformatique. Nous y intro-
duirons une notation bien adapte la description de lintention dune fonction, la -nota-
tion.
Les mathmaticiens ntudient pas des objets, mais des relations entre les objets ; il leur
est donc indiffrent de remplacer ces objets par dautres, pourvu que les relations ne chan-
gent pas. La matire ne leur importe pas, la forme seule les intresse.
6

A la recherche dun concept dabstraction unificateur, deux choix sont possibles, on peut
considrer que tout est objet (mme les relations entre objets), cest lapproche en extension
des mathmatiques actuelles ou que tout est relation (mme les objets), cest lapproche en
intention de linformatique thorique actuelle.
Nous verrons donc les diffrents mcanismes permettant de dfinir une fonction en inten-
tion. On introduira, en particulier, les deux modes de raisonnement que nous serons amen
utiliser le plus frquemment, linduction et la recherche dun invariant.Ainsi ce chapitre
introduit le mcanisme dabstraction fondamental, labstraction par les fonctions.
Le chapitre 3 introduit un deuxime mcanisme abstraction, celui qui permet de dfinir des
choses en soi quon appellera des donnes. On verra, en particulier, que tout ce qui est don-
nes est aisment construit en utilisant le mcanisme dabstraction prcdent. Ce chapitre
est trs droutant pour linformaticien traditionnel car il prend le contre-pied de lopinion
commune selon laquelle, puisquon spcifie ncessairement un problme en dfinissant les
donnes dune part et les traitement s de ces donnes dautre part, donnes et traitements
sont des notions distinctes et primitives. En fait, ce chapitre nest pas plus (mais pas moins)
droutant que la dcouverte des nombres irrationnels au mathmaticien dbutant.
Le chapitre 4 introduit un troisime mcanisme dabstraction, celui qui permet de dfinir
des choses pour organiser des choses quon appellera des structures. Ce mcanisme est
analogue linvention des contenant (les rcipients pour ranger des choses) aprs celle des
contenus (les choses ranger). les abstractions ainsi construites ont des proprits redouta-
bles qui vont les rendre difficiles manipuler. En particulier, on touchera du doigt limpos-
sibilit de dfinir lgalit de deux choses sur un plan gnral.
Le chapitre 5 introduit le langage (de programmation ?) Scheme permettant de dcrire des
fonctions, des donnes ou des structures dune manire plus formelle. Le fait que ce langage
soit dfini rigoureusement permet den spcifier un interprte. En attendant, nous nous con-
tenterons de considrer que cet interprte existe. Il est clair que, pour nous, Scheme nest
6
Henri Poincar dans La science et lhypothse page 49 - Flammarion - Champs
Introduction
- 6 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
quune forme commode de la -notation.
Le chapitre 6 introduit une catgorie de problmes qui prend en dfaut tous ce que nous ve-
nons de voir et nous oblige introduire un nouveau mcanisme, laffectation. Si ce mca-
nisme permet de rsoudre des problmes utiles, il introduit des difficults de raisonnement
qui nous amnerons en contrler strictement lusage. Les structures de donnes prcdem-
ment introduites ont alors un comportement diffrent et deviennent des structure mutables.
Le chapitre 7, dans le cadre dun petit problme de gestion presque raliste, illustre les pro-
blmes quon rencontre lorsquon transforme lexpression des besoins dun client en des
spcifications gnrales puis dtailles rigoureuses. En particulier, on verra apparatre la
ncessit dutiliser des stratgies de conception permettant de rendre robuste le programme
ainsi ralis.
Le chapitre 8 est trs diffrent. Tous les chapitres prcdents soccupaient essentiellement
de conception, ce chapitre va surtout parler dimplmentation et montrer comment on peut
passer des spcifications que les chapitres prcdents nous ont appris construire un pro-
gramme qui sexcute. Nous avons pris comme exemple un langage trs rpandu, le langa-
ge C. Le langage C na pas trs bonne presse, certains le considre comme confus,
dautres lui prfrent C
++
plus moderne ou ADA mieux conu. Nous voulons montrer,
dans ce chapitre, quun programme confus est mettre au passif du programmeur et de ses
mthodes de raisonnement et non pas du langage quil utilise.
Il est peu probable que vous puissiez lire ce qui va suivre dune seule traite et mme dans
lordre o les choses sont prsentes. Certaines notions un peu complexes gagnent tre
sautes en premire lecture.
Vous rencontrerez galement des paragraphes ayant la forme de celui que vous tes en train de lire.
Ces paragraphes introduisent toujours des notions, des remarques, des extensions qui peuvent tre sau-
tes en premire lecture.
Les lecteurs de cet ouvrage tant a priori de cultures diffrentes, nous avons introduit des
exemples les plus varis possibles. Ne vous inquitez donc pas si certains dentre eux vous
paraissent obscurs, sautez les, un autre viendra, emprunt (je lespre) votre culture.
Introduction
- 7 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
- 8 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
2. Les Fonctions
...Cependant, dans notre perspective actuelle, pour la prcision quil nous
faut pour commencer, nous navons pas besoin dtre trs attentifs dfinir
les choses prcisment. Peut-tre allez-vous dire cest quelque chose de
terrible, javais appris quen science, nous devions tout dfinir
prcisment. Nous ne pouvons pas dfinir nimporte quoi prcisment ! Si
nous essayons, nous devenons victime de cette paralysie de penser qui
affecte les philosophes
1
, assis lun en face de lautre, lun disant lautre
Vous ne connaissez pas ce dont vous parler !. Le second rpond
Quentendez-vous par connaissez ? que voulez-vous dire par parler ?
Que voulez-vous dire par vous ? etc. Afin dtre capables de parler
constructivement, nous devons simplement nous mettre daccord sur le fait
que nous parlons en gros de la mme chose...
R.P.Feynman
Le Cours de Physique de Feynman
La fonction va reprsenter notre premier et principal outil de raisonnement, il est donc im-
portant den avoir une vision claire et de savoir comment le manipuler de faon efficace et
cohrente, den apprhender la puissance et les limites.
Au sens usuel du terme, on dit quune chose
2
est fonction dune autre quand celle-ci dpend
de celle-l. Cette dfinition permet de donner un sens qualitatif ou quantitatif la notion
usuelle de relation de cause effet mais aussi de dcrire une relation entre plusieures cho-
ses. A lissu dun enseignement de mathmatiques, les fonctions sont toujours associes
un calcul et les plus simples dentre elles sont dfinies par des formules. Mais la fonction
dfinie en tant que formule sest vite rvle insuffisante car le mot formule est lui-mme
trs difficile dfinir (pensez, par exemple, aux fonctions trigonomtriques, exponentiel-
1
Feynman parle ici des mauvais philosophes, bien sr !
2
Le mot chose dnote ici tout ce que nous pouvons imaginer, cest dire toutes les notions abstraites que
nous utilisons pour dcrire le monde qui nous entoure.
Les Fonctions Rappel sur les fonctions
- 9 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
les...). Dautre part, certaines oprations lmentaires ne sont dfinies que par une table
(souvenons-nous des tables daddition et de multiplication de notre enfance).
Faute de pouvoir donner un sens prcis et gnral aux formules, les mathmaticiens ont t
amens considrer les fonctions comme des objets en soi. Les informaticiens utilisent une
formule image et disent que les fonctions sont dordre suprieur ou sont des citoyens de
premire classe.
La construction de la thorie des fonctions a conduit lintroduction des ensembles et le
langage des ensembles permet de donner une dfinition rigoureuse des fonctions dans le ca-
dre du concept plus gnral dapplication.
Au dbut de ce chapitre nous allons rappeler les quelques dfinitions qui vont nous permet-
tre de manipuler les fonctions (ou applications) dune manire suffisamment rigoureuse
pour nos besoins. En particulier, nous utiliserons le mot fonction au sens usuel (donc la
place du mot application) sans chercher lui attribuer des nuances supplmentaires subtiles.
Cest ce lger abus de langage
3
qui nous permettra de dire, le moment venu, quon applique
une fonction.
3
Lenseignement secondaire franais introduit une subtile diffrence entre la fonction et lapplication. Cette
nuance nest pratiquement reprise par personne et nous ne la retiendrons pas.
2.1 Rappel sur les fonctions
La fonction mathmatique permet de dcrire la mise en correspondance entre une donne
de dpart d'une certaine sorte et une donne darrive ventuellement d'une autre sorte.
Lorsquon sait associer un mcanisme de transformation (de calcul en gnral) la dfini-
tion dune fonction, on dit quelle est dfinie en comprhension ou en intention. Par contre
lorsque la fonction reprsente une simple correspondance, on dit quelle est dfinie en ex-
tension par lensemble de toutes les correspondances possibles.
2.2 Les Diffrentes formes de la dfinition dune fonction
L'ensemble des donnes de dpart s'appelle le domaine de la fonction et l'ensemble des don-
nes darrive s'appelle son codomaine. Ainsi la fonction note f fait correspondre cha-
que lment, not x, de son domaine un seul lment, not , de son codomaine
4
.
La dfinition dune fonction comporte toujours deux parties :
1. lindication de son domaine et de son codomaine dans la plupart des exemples
que nous prendrons au dbut, le domaine et le codomaine de la fonction quon dfi-
nira seront des ensembles de nombres.
2. lindication de la mthode qui permet de passer de chaque lment du domaine
ceux du codomaine.
Ainsi la dfinition dune fonction commence toujours par une phrase de la forme
Le domaine de la fonction foo est lensemble des snarks tandis que son codomaine est
4
Il convient donc de bien distinguer la fonction f de la valeur f(x) quelle peut prendre dans son codo-
maine.
f x ( )
Les Fonctions Les Diffrentes formes de la dfinition dune fonction
- 10 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
lensemble des jabberwocks...
Ce que les mathmaticiens notent
et, quelque fois, dessinent un diagramme sagittal (figure 1, page 10).
Et la dfinition de la fonction se termine par une phrase de la forme
... et pour associer un jabberwok chaque snark, on utilise la mthode suivante...
Les diffrentes formes de la dfinition dune fonction correspondent aux diffrentes tech-
niques permettant de dcrire la mthode dassociation.
2.2.1 Construction dun domaine ou dun codomaine
Dans un premier temps, cest dire dans ce chapitre, nous allons supposer quil existe des
donnes et des fonctions, que les donnes sont des entits passives tandis que les fonctions
agissent sur les donnes. Nous verrons plus tard que si cette vision est commode pour ap-
prendre dfinir et manipuler des fonctions, elle ne nous convient pas et nous prfrerons
considrer que les donnes ne seront que des fonctions dguises
5
. Mais cela est une autre
histoire.
Nous suposerons donc quil existe quelques domaines primitifs tels lensemble des nom-
bres entiers, lensemble des signes typographiques, lensemble des nombres rels etc. Cer-
tains sont finis et dautres ne le sont pas. Les mathmaticiens ont longuement pein pour
dfinir les ensembles infinis aussi les utiliserons-nous en ltat en prenant bien soin de ne
pas y introduire damliorations de notre cru. Ainsi, moyennant quelques prcautions, une
approche nave nous suffira et nous pourrons dfinir les domaines dont nous avons besoin
soit en restreignant un domaine existant laide dune proprit particulire soit en compo-
sant des domaines existant.
5
Nous venons de voir que les mathmaticiens ont pris loptique exactement inverse et pour eux tout est
donne. Cest ce qui distingue, entre autre, les informaticiens des mathmaticiens. Le paragraphe 2.9,
page 39 nous donnera une ide des consquences de ce choix.
Figure 1 : Graphe de la fonction foo de domaine S et de codomaine J. La fonction
foo est lensemble des flches quon peut ainsi tablir.
foo : S J
avec : S snark { } =
J jabberwock { } =
S
J
x
y = foo(x)
foo
Les Fonctions Les Diffrentes formes de la dfinition dune fonction
- 11 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Construction par restriction
Le domaine ncessaire est obtenu en filtrant un autre domaine laide dune proprit
exprime sous la forme dun prdicat. Un prdicat est une affirmation dont on peut dire s-
rement si elle est vrai ou fausse. On peut, par exemple, dfinir lensemble des nombres pairs
par
ce qui se lit lensemble des nombres pairs est lensemble des nombres n tels que n appar-
tient lensemble des nombres entiers et que 2 divise n. et plus simplement lensemble
des nombres pairs est lensembles des nombres entiers divisibles par 2.
On prendra garde de ne pas inclure le domaine que lon cherche dfinir dans la dfinition
elle-mme sous peine de risquer de redoutables paradoxes. Le plus clbre dentre eux est
probablement le paradoxe du barbier du au mathmaticien-logicien Bertrand Russell Le
barbier est celui qui rase ceux qui ne se rasent pas eux-mme. Mais qui rase le barbier ?
Construction par composition
On est trs frquemment amen dcrire une chose par un ensemble fini de caractristiques
considres comme pertinentes. Ce regroupement de caractristiques sappelle un n-uplet.
Ainsi, un rectangle peut tre caractris par le 2-uplet (doublet) de sa longueur et de sa lar-
geur
Lopration qui consiste associer deux domaines pour construire un domaine de n-uplets
sappelle le produit cartsien
6
not (dire croix ) et
6
Cette opration est aussi appele produit externe (cross-product).
2.2.2 Dfinition en intention
On dira quune fonction est dfinie en intention lorsque lassociation entre chaque lment
de son domaine et les lments correspondants de son codomaine est dcrite par une formu-
le finie calculable.
Considrons, par exemple, la fonction produit dont le domaine est
et dont le codomaine est
On peut la dfinir en intension par
7
Cette dfinition est oprationnelle en ce sens qu'elle nous donne un moyen d'valuer cette
7
Ici, le signe dnote la multiplication traditionnelle.
Nombres-pairs n n N ( ) 2 divise n ( ) | { } =
R
+
x x R ( ) x 0 ( ) | { } =
Rect L l ( , ) L R
+
( ) l R
+
( ) | { } =
Rect R
+
R
+
=
D 0 1 2 3 4 , , , , { } 0 1 2 3 4 , , , , { } =
C 0 1 2 3 4 6 8 9 12 16 , , , , , , , , , { } =
produit x y , ( ) x y x y , 0 1 2 3 4 , , , , { } | { } =
Les Fonctions Les Diffrentes formes de la dfinition dune fonction
- 12 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
fonction.
2.2.3 Dfinition en extension
On dira quune fonction est dfinie en extension lorsque lassociation entre chaque lment
de son domaine et les lments correspondants de son codomaine est dcrite par la liste ex-
haustive de tous les doublets qui la constitue.
Considrons la fonction annuaireTlcom telle que France Tlcom peut la dfinir. Son
domaine est lensemble des abonns dun dpartement et son codomaine celui des numros
de tlphone
On peut la dfinir en extension par
Cette dfinition de la fonction est dite non oprationnelle car aucune mthode de calcul ne
lui est associe. En d'autres termes, on a dfini ce qu'est la fonction mais on ne s'est donn
aucun moyen permettant de l'valuer au fur et mesure des besoins. Une telle dfinition
nest possible que lorsque le domaine et le codomaine de la fonction sont des ensembles
finis (et pas trop grands).
2.2.4 Techniques de dfinition
Cest ici que notre route se spare de celle des mathmaticiens. Alors que lessentiel de leur
activit est la dfinition de concepts nouveaux, ltude approfondie des proprits de fonc-
tions trs particulires, etc., la ntre va uniquement consister dfinir (et construire puis
vendre) les fonctions utiles nos clients.
Nous avons donc besoin de mettre au point quelques techniques permettant de construire le
plus systmatiquement possible des dfinitions de fonctions partir dune spcification ou
mme plus simplement de lexpression dun besoin.
Il arrive trs frquemment quon ne sache pas dfinir une fonction sur son domaine par une
formule unique. Par contre, si on dcoupe son domaine en un ensemble fini de sous-domai-
nes disjoints, la fonction peut tre dfinie par diffrentes formules associes aux diffrents
sous-domaines. Pensez, par exemple, au calcul des impts sur le revenu partir du quotient
familial et des tranches dimposition.
Une telle forme de dfinition est un compromis entre la dfinition en extension (les sous-
domaines) et la dfinition en comprhension (les formules). Cette forme de dfinition est
appele dfinition par morceaux par les mathmaticiens et dfinition par cas par les pro-
grammeurs. Cest une forme volue de la dfinition en intention.
Lanalyse par cas dun problme peut tre effectue en suivant une des 2 stratgies sui-
vantes :
1. Dcoupage du domaine en sous-domaines disjoints.
2. Transformation du problme initial en un problme plus simple, la rgle de transfor-
mation tant recherche soit directement, soit par induction soit sous la forme dun
x y ( , )
annuaireTlcom : Noms NumrosTlphone
avec : Noms Church Kleene Swartzenegger , , , { } =
NumrosTlphone 93-21-79-00 93-41-59-60 , , { } =
annuaireTlcom Kleene 93-41-59-60 ( , ) Schwartzenegger 93-21-79-00 ( , ) ; ; { } =
Les Fonctions Les Diffrentes formes de la dfinition dune fonction
- 13 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
invariant.
Dfinition directe par cas
Considrons la fonction bien connue qui reprsente la valeur absolue d'un nombre. Cette
fonction, note et que nous appellerons abs est telle que, par exemple
Son domaine est, par exemple, lensemble des nombres entiers relatifs et son codomaine
celui des entiers naturels.On peut partager ce domaine en trois sous-domaines disjoints, ce-
lui des nombres entiers positifs, celui de 0 et celui des nombres entiers ngatifs, la dfinition
peut alors tre mise sous la forme
Les termes de la forme qui dcrivent le dcoupage du domaine sappellent les
gardes des formules qui leur sont associes. Les termes de la forme qui servent
construire les gardes sont des prdicats. Une telle dfinition est dite constitue dun en-
semble de formules gardes.
Afin de donner une forme plus facile manipuler et crire, nous allons introduire une pre-
mire fonction, que nous considrerons, pour linstant, comme primitive (au mme ti-
tre que les oprations arithmtiques traditionnelles), nous permettant de dcrire le rle jou
par laccolade.
Nous lappellerons si note
8

et dont la dfinition smantique informelle est
Cette fonction permet de dfinir le dcoupage dun domaine en sous-domaines disjoints par
des dichotomies successives. Elle permet de mettre la dfinition de la fonction abs sous
les deux formes quivalentes suivantes
Nota: sinon dnote un prdicat toujours vrai.
Lanalyse par cas, telle que la permet la fonction si est un outil remarquablement puissant
8
Cette notation est due John MacCarthy, concepteur du langage Lisp.
x
abs 4 ( ) 4 =
abs 2 ( ) 2 =
abs 0 ( ) 0 =
abs x ( )
x si x 0 > ( )
0 si x 0 = ( )
x si x 0 < ( )

'

=
si x 0 > ( )
x 0 > ( )
si p a b , , ( ) p a b ,
Valeur-de p a b , ( )
Valeur-de a ( ) si Valeur-de p ( ) vrai =
Valeur-de b ( ) si Valeur-de p ( ) faux =

'

=
abs x ( ) x 0 > ( ) x , =
x 0 = ( ) 0 ,
sinon x
soit abs x ( ) x 0 < ( ) x x , =
Les Fonctions Les Diffrentes formes de la dfinition dune fonction
- 14 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
pour dfinir des fonctions. Nous allons montrer comment lutiliser pour introduire des d-
finitions curieuses mais trs riches.
Recherche dune rcurrence
Essayons de dfinir la fonction appele factorielle, dfinie sur les nombres entiers posi-
tifs, note n!, et que nous appellerons fact. Cette fonction est telle que
On distingue immdiatement le cas trivial qui nous permet dcrire lbauche de dfinition
suivante
On note que le signe = joue une double rle. Il lie la dfinition de la fonction fact son nom
et il compare n 1. Cette ambigut est en gnral leve par le contexte. Cette ambigut est
plus apparente que relle. En effet, il suffit, pour la lever, de considrer que le signe = qui ta-
blit un lien entre un nom et une valeur dnote lui aussi un prdicat et de considrer que la
solution dune quation de la forme peut tre interprte comme la valeur quil faut
attribuer x pour que le prdicat correspondant soit vrai.
La fonction fact tant une suite de multiplications, il est clair quvaluer est
un problme plus simple quvaluer , la rgle de transformation tant
On peut alors complter la dfinition de la fonction fact
Cette dfinition est inhabituelle en ce sens qu'elle fait rfrence elle-mme. On dit qu'elle
est rcursive. La rcursivit est le seul mcanisme de construction connu permettant de d-
finir des formes infinies a priori.
C'est ce mcanisme qui permet, par exemple, de dfinir l'ensemble des nombres entiers en
disant simplement 0 est un nombre entier et si n est un nombre entier alors est un
nombre entier.
Lapproche que nous avons utilise sappelle raisonner par induction. Elle est possible cha-
que fois quon dfinit, en fait, une suite indice (donc infinie dnombrable) de problmes
de la mme famille. Elle comporte toujours 2 tapes :
1. Etablir la rgle de transformation qui donne la solution du problme dindice n
partir de la solution du problme dindice n-1 suppose connue.
2. Rsoudre de faon triviale le problme dindice initial (1 ou 0 en gnral).
Analysons lutilisation de la dfinition de la fonction fact et valuons, titre dexemple,
lexpression . On peut dduire de cette dfinition lensemble des galits suivantes
fact 3 ( ) 3 2 1 =
fact 4 ( ) 4 3 2 1 =
fact 0 ( ) 1 =
fact n ( ) n 0 = ( ) 1 .....?....... , =
x 5 =
fact n 1 ( )
fact n ( )
fact n ( ) n fact n 1 ( ) =
fact n ( ) n 1 = ( ) 1 n fact n 1 ( ) , =
suivant n ( )
fact 4 ( )
fact 4 ( ) 4 fact 3 ( ) =
fact 3 ( ) 3 fact 2 ( ) =
fact 2 ( ) 2 fact 1 ( ) =
fact 1 ( ) 1 fact 0 ( ) =
fact 0 ( ) 1 =
Les Fonctions Les Diffrentes formes de la dfinition dune fonction
- 15 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
qui constituent un systme dquations qui peut tre rsolu par substitution et dont la solu-
tion est videmment
Recherche dun invariant
Dfinissons, prsent, un prdicat, not
9
divise?, qui nous permet de tester si un nombre
positif non nul en divise un autre. Ce prdicat est tel que, par exemple
On distingue immdiatement 2 cas triviaux qui nous permettent dcrire lbauche de dfi-
nition suivante
Cest larithmtique qui va nous apporter la partie de dfinition qui nous manque. En effet,
on dit que le nombre n divise le nombre m sil existe un nombre q suprieur ou gal
10
1 tel
que mais alors
En dautres termes, dans le cas non trivial o m est suprieur n, la divisibilit de m par n
est la mme que la divisibilit de m-n par n ce qui se traduit par lgalit
On dit alors que la divisibilit par n est un invariant relativement la soustraction de n. Plus
gnralement, si on peut trouver une rgle de la forme
On dira que prdicat? est un invariant relativement aux fonctions et que
ces fonctions prservent linvariant.
La forme finale de la dfinition du prdicat divise? est alors
9
Comme les prdicats correspondent une question laquelle on ne peut rpondre que par vrai ou faux,
nous conviendrons de terminer leur nom par ?. En rgle gnrale, nous serons trs attentif donner aux
choses qui nous intressent un nom significatif afin de faciliter la lecture de ce que nous crivons.
10
Le cas correspond au cas trivial et le cas au cas trivial .
fact 4 ( ) 4 3 2 1 1 =
divise? 2 4 , ( ) vrai =
divise? 3 22 , ( ) faux =
divise? 5 80 , ( ) vrai =
divise? n m , ( ) n m = ( ) vrai , =
n m > ( ) faux ,
sinon .....?.......
q 1 = n m = q 0 = n m >
m q n =
m q n =
m q n n n + =
m n q n n =
m n q 1 ( ) n =
divise? n m , ( ) divise? n m n , ( ) =
prdicat? n
1
n
2
n
3
, , , ( ) prdicat? f
1
n
1
( ) f
2
n
2
( ) f
3
n
3
( ) , , , ( ) =
f
1
f
2
f
3
, , ,
divise? n m , ( ) n m = ( ) vrai , =
n m > ( ) faux ,
sinon divise? n m n , ( )
Les Fonctions Les Diffrentes formes de la dfinition dune fonction
- 16 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Cette dfinition, dans le cas o et , engendre les galits suivantes
qui constituent un systme dquations dont la solution (par limination) est videmment
et dans le cas o et , elle engendre un systme dquations dont la solution
est
Chercher un invariant est une technique trs puissante
11
pour trouver une dfinition rcur-
sive. Comme elle est assez dlicate utiliser, nous en reparlerons souvent. Nous verrons
plus loin quune dfinition rcursive obtenue de cette manire a des proprits trs remar-
quables.
11
Cest la puissance de cette technique qui a conduit les physiciens inventer le concept dnergie en tant
quinvariant universel.
2.2.5 Egalit de deux fonctions
Un cahier des charges est (presque) toujours une dfinition non oprationnelle de la fonc-
tion f raliser. Ecrire un programme partir de ce cahier des charges, c'est dfinir une
fonction g de faon oprationnelle gale la fonction f spcifie. Il est donc ncessai-
re, dans le cadre dune relation Client-Fournisseur, de dfinir l'galit de ces deux fonc-
tions. En gnral, le contrat dfinit une procdure de Recette du produit livr permettant de
vrifier que la fonction g livre peut tre considre comme suffisamment conforme la
fonction f commande.
Notre dfinition de la fonction ne laisse pas beaucoup de possibilits pour dfinir cette ga-
lit dans le cas gnral, on ne peut la dfinir quen extension.
Egalit en extension : la plus gnrale, mais la moins utile.
On dira que les fonctions f et g sont gales en extension si :
1. elles sont dfinies sur le mme domaine et le mme codomaine,
2. pour tout lment de leur domaine, f et g mettent en correspondance le mme
lment de leur codomaine.
Ainsi, pour tester l'galit de deux fonctions, cette dfinition exigerait d'essayer de manire
exhaustive tous les lments de D. Cette procdure est impraticable si D est un ensemble
infini (nombres entiers ou rels par exemple), la question les fonctions f et g sont-el-
les gales ? tant dans ce cas, indcidable.
Nous verrons que cette dfinition de lgalit peut conduire des paradoxes redoutables. En
effet, elle suppose quon sache comparer entre eux les lments du codomaine cest dire
quon a su dfinir leur galit. Nous navons donc pas fini de parler dgalit.
Ce phnomne nest ni trange ni rare. Il correspond au fait quil est trs souvent (pour ne
pas dire pratiquement toujours) impossible de prouver quun systme fonctionne comme il le
devrait en faisant des essais successifs. Tant que les essais sont positifs, on ne peut que
n 3 = m 9 =
divise? 3 9 , ( ) divise? 3 6 , ( ) =
divise? 3 6 , ( ) divise? 3 3 , ( ) =
divise? 3 3 , ( ) vrai =
divise? 3 9 , ( ) vrai =
n 3 = m 8 =
divise? 3 8 , ( ) faux =
Les Fonctions Les Diffrentes formes de la dfinition dune fonction
- 17 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
conclure quon na probablement pas essay les conditions dans lesquelles ce systme ne
fonctionne pas. Seuls les essais ngatifs sont malheureusement probants !
Mme si l'ensemble D n'est pas infini il peut tre trop grand pour qu'on puisse tester l'galit
de deux fonctions par exhaustion des lments de D. Imaginer le temps qui peut tre nces-
saire la vrification de lgalit de deux encyclopdies. De telles tches, bien que possibles
sur un plan thorique mais dont lvaluation demanderait des temps gigantesques constituent
ce que les philosophes logiciens actuels appellent des super-tches considres comme pra-
tiquement impossibles raliser. Nous verrons dans un prochain chapitre comment vrifier
que la dfinition que nous avons associ une fonction ne correspond pas une super-
tche.
Comme ce problme est frquent, il a t ncessaire d'imaginer une dfinition plus pratique
: lgalit en intension.
Egalit en intention : la dfinition pratique des mathmaticiens.
On dira que les fonctions f et g sont gales en intention si :
1. elles sont dfinies sur le mme domaine et le mme codomaine,
2. on peut passer de la dfinition de f celle de g par une suite de transformations
qui conservent l'identit.
On dira que deux choses sont identiques sil sagit, en fait, de la mme chose. Cest dire
que toute action effectue sur lune peut tre perue sur les deux en mme temps. Nous
nous contenterons de cette dfinition informelle. Les mots identique et gal sont prati-
quement synonymes dans le langage courant. Cette ambigut rend difficile la description de
la situation suivante En regardant dehors par les deux fentres de ma salle manger, je
vois deux voitures que mes yeux ne savent pas distinguer. Sagit-il de deux exemplaires dif-
frents du mme type de voiture ou sagit-il dune voiture et de son reflet dans la vitrine den
face ?. Dans le premier cas on dira que les deux voitures sont gales tandis que dans le
deuxime quelles sont identiques.
Considrons, par exemple, les deux fonctions :

Elles sont gales en intention car :
Ce critre dgalit revient constater que les deux fonctions f et g ne sont que deux
reflets diffrents de la mme fonction.
On peut remarquer, sur cet exemple, quune grande partie de lalgbre est consacre la
dfinition de transformations (les calculs algbriques) qui prservent lidentit. Cette dfi-
nition est beaucoup trop svre pour nous car nous ne saurons pas, en gnral, transformer
les dfinitions des fonctions que nous serons amens considrer tout en prservant leur
identit. De telles manipulations sur les fonctions relve dune branche assez nouvelle de
linformatique : le calcul formel.
Equivalence oprationnelle : la dfinition pragmatique.
Nous constatons que le mot galit est particulirement ambigu. Ainsi, plutt que de parler
de lgalit en soi, on prfrera parler dquivalence oprationnelle. Cela revient consi-
f a b , ( ) a b + ( ) a b ( ) =
g a b , ( ) a
2
b
2
( ) =
f a b , ( ) a b + ( ) a b ( ) =
a
2
ba ab b
2
+ =
a
2
b
2
=
g a b , ( ) =
Les Fonctions Composition des fonctions
- 18 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
drer que deux choses sont oprationnellement quivalentes pour nous (gales) si on peut
en avoir le mme usage. On ne pourra donc parler dgalit (dquivalence oprationnelle)
que dans un certain contexte quil nous appartiendra de dfinir chaque fois. Pour parler de
faon un peu triviale, nous pouvons dire que nous avons russi botter en touche. Ntant
pas capables de dfinir lgalit en gnral, nous laisserons ce soin notre client qui lui,
sachant ce que les choses reprsentent, est le mieux placer pour en dfinir lquivalence et
nous fournir son prdicat dgalit, en gnral, sous la forme dune procdure de recette.
If it paddles like a duck, waddles like a duck and quacks like a duck why not
to say: it is a duck ?
Lewis Caroll
2.3 Composition des fonctions
Le seul mcanisme pour laborer des fonctions complexes est la composition des fonctions.
Nous lavons dj utilis de manire naturelle lorsque nous avons construit des formules en
associant des oprateurs. L'ide en est trs simple, considrons les deux fonctions f et g
Etant donn un lment a de A, on peut trouver un lment b de B tel que puis un
lment c de C tel que . Comme il existe une fonction de domaine A
et de codomaine C.
Cette dfinition de la fonction compose note (Cf. figure 2, page 18) peut tre ga-
lement mise sous la forme
Transparence par rfrence
La composition des fonctions utilise une proprit fondamentale des fonctions
Le rsultat de l'application d'une fonction ses arguments dpend uniquement de la
valeur de ses arguments. En particulier, si cette opration est effectue plusieurs
fois, elle donne chaque fois le mme rsultat.
Figure 2 : Composition des deux fonctions f et g.
f A B :
g B C :
b f a ( ) =
c g b ( ) = c g f a ( ) ( ) =
a
A
B
C
b = f(a)
c = g(b)
g

f
g f

g f

A C a A b B et c C , b f a ( ) = et c g b ( ) = | { } = ( ) :
Les Fonctions Techniques de conception
- 19 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Cette proprit s'appelle transparence par rfrence. Cest cette proprit qui nous permet
dintroduire des variables dans les formules. Tout calcul serait pratiquement impossible sil
nen tait pas ainsi. Cest donc une proprit que nous essaierons de prserver tout prix.
2.4 Techniques de conception
Voici en quoi consiste principalement ces actes de l'esprit :
1. A combiner plusieurs ides simples en une seule; c'est par ce moyen
que se font toutes les ides complexes.
2. A joindre deux ides ensemble, soit qu'elles soient simples ou
complexes, et les placer l'une prs de l'autre, en sorte qu'on les voit
toutes la fois sans les combiner en une seule ide : c'est par l que
l'esprit se forme toutes les ides des relations.
3. Le troisime de ces actes consiste sparer des ides d'avec toutes
les autres qui existent rellement avec elles : c'est ce qu'on nomme
abstraction, et c'est par cette voie que l'esprit se forme toutes les ides
gnrales.
John Locke
Essai philosophique sur
l'entendement humain (1690)
Ces 3 mcanismes sont donc connus depuis fort longtemps et nous les utilisons couramment
sans y prendre garde. Le premier correspond lopration de composition des fonctions, le
deuxime nous conduira la dfinition et la structuration des donnes et fera lobjet dun
chapitre ultrieur et le troisime est associer la notion de procdure.
Selon le sens commun, une procdure est la dfinition dune mthode de travail prsentant
un certain caractre de gnralit. Nous connaissons tous les procdures nommes recettes
de cuisine et la vie professionnelle ou prive est remplie de procdures (souvent administrati-
ves). Pendant longtemps, en mathmatiques, les procdures ont t dfinies par des algo-
rithmes dcrivant des successions dactions effectuer dans le bon ordre, puis la dfinition
algorithmique a t abandonne (au XIXme sicle) au profit de la notion plus riche de dfini-
tion fonctionnelle. En ce qui nous concerne, une procdure sera toujours dfinie par une
fonction. Dterminer le bon ordre des choses lors de la dfinition dun algorithme est un pro-
blme souvent complexe. Par contre, les dpendances fonctionnelles utilises lors de la dfi-
nition fonctionnelle dune procdure induit lordre naturel des choses.
Nous allons donc simplement essayer danalyser assez finement ces mcanismes pour en
percevoir tous les aspects qui nous intressent.
2.4.1 Abstraction par composition & nommage
12
12
Ce mot dnote laction de nommer.
Lorsqu'on a construit une nouvelle fonction par composition de fonctions plus simples, on
lui a donn un nom symbolique qui nous a permis de la manipuler comme un tout sans se
soucier de ses dtails de dfinition.
Ainsi, quand nous utilisons les fonctions +, -, abs,... nous ne soucions que de lusage quon
peut en faire et pas du tout de leurs dtails de dfinition.
En mathmatiques, le signe = tablit un lien entre un nom (une variable) et une valeur (le
rsultat dun calcul, par exemple) de telle sorte que ce nom et cette valeur puissent tre uti-
Les Fonctions Techniques de conception
- 20 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
liss indiffremment, lun la place de lautre, partout o lun ou lautre apparat.
Considrons, par exemple, lcriture classique suivante
On y a introduit la variable x en donnant un nom la valeur 24 et la variable y en donnant
un nom la valeur 3. Nous avons ensuite utilis ces variables pour construire une formule.
Le nom x a t li la valeur 24 et le nom y la valeur 3. Ces liens sont permanents et d-
finitifs dans tout le contexte dfini par soit: lequel donne un sens la formule qui lui a
t associe par dans:.
Considrons les deux expressions suivantes
Dans lexpression (a), tous les noms qui interviennent dans la formule apparaissent dans le
contexte. Dans ce cas, on dit que la formule est ferme et que ses variables sont lies. Par
contre, dans lexpression (b), la formule contient la variable z qui na pas t lie. La varia-
ble z est dite libre et la formule est dite ouverte.
Une formule ferme est valuable et on dira que la valeur quelle prend lors de son va-
luation en constitue le sens. Par contre, une formule ouverte nest pas valuable et on dira
quelle na pas de sens. Afin de symtriser le comportement des formules ouvertes et fer-
mes, on dira que la valeur dune formule ouverte est la non-valeur note (dire bottom).
Ainsi
Btir une application de cette faon consiste crer un environnement (un contexte) conte-
nant tous les liens (nomvaleur) qui ont t tablis pour donner un sens une expression.
La formule dont les variables sont dfinies par un environnement constitue ce quon appelle
la porte de ces variables (scope en anglo-amricain), la dure de vie (extent en anglo-
amricain) des liens qui y sont dfinis est a priori illimite.
2.4.2 Abstraction par gnralisation
Certaines formules ont un caractre de gnralit qu'il serait dommage de ne pas utiliser.
Nous savons que le volume dun paralllpipde rectangle de longueur 3, de largeur 4 et de
hauteur 5 est donn par la formule
soit : x 24 =
y 3 =
dans : x y
a ( )
soit : x 3 =
y 10 =
dans : x y
b ( )
soit : x 3 =
y 10 =
dans : x y z + +
3 4 12 =
3 4 x =
volume 3 4 5 =
Les Fonctions Techniques de conception
- 21 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
On peut tre amen, dans une mme application, calculer plusieurs volumes
Il est alors avantageux de gnraliser la notion de volume en utilisant une expression con-
tenant des paramtres
Ces paramtres L, l et h ne sont que des trous dans l'expression . Nous avons en-
suite donn un nom cette formule trous qui est ainsi devenue la fonction volume.
Lorsquon veut utiliser la dfinition du volume en gnral pour calculer un volume en par-
ticulier ont lie ses paramtres des arguments. Le volume en gnral correspond alors la
structure
Les noms introduits pour construire cette gnralisation constituent lenvironnement priv
de la fonction. Cet environnement est constitu de noms qui ne sont pas encore lis des
valeurs mais qui lient les variables contenues dans la formule de dfinition du volume. Une
fonction peut donc tre considre comme une formule ferme valuable plus tard.
Nous avons ainsi transform une formule en fonction. Cette opration s'appelle labstraire
fonctionnellement relativement au triplet des variables L, l et h. Afin de donner une forme
plus facile manipuler et crire, nous allons introduire notre deuxime fonction primi-
tive pour dcrire la construction dune fonction, nous la noterons
13
(dire lambda) et nous
reprsenterons son application ses argument en utilisant la syntaxe spciale introduite par
ses inventeurs.
La dfinition du volume scrira alors
Ce qui veut dire
la fonction lambda engendre, partir de lexpression ,une fonction
dpendant du 3-uplet (triplet) .
13
Le nom lambda utilis ici est celui qui a t donn l'opration d'abstraction dans le lambda-calcul, la
thorie des fonctions labore par Alonzo Church en 1941 puis abondamment dveloppe par Curry et
Schnfinkel. On peut regretter son peu de convivialit mais on le conserve en l'honneur de son inventeur.
La fonction engendre par la fonction lambda est anonyme, cest le signe = qui lui a donn le nom de
volume dans un environnement particulier.
soit : volumeClasse 8 8 2 5 , =
volumeCouloir 20 4 2 5 , =
volumeCantine 15 8 2 5 , =
volumeBureau 5 4 2 5 , =
dans :
volume L l h , , ( ) L l h =
L l h
volume
soit : L =
l =
h =
dans : L l h
=
volume R
+
R
+
R
+
R
+
:
volume L l h , , ( ) L l h ( ) =
L l h
L l h , ( , )
Les Fonctions Techniques de conception
- 22 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Le point spare les paramtres de la fonction de son expression de dfinition. Nous ver-
rons que cette expression peut prendre des formes trs varies. Il est clair que dans cette ex-
pression, les noms L, l et h nont pas dimportance et que volume peut aussi bien tre
dfini par
2.4.3 Abstraction fonctionnelle & Curryfication
Si on reprend lexpression , on peut ne labstraire que relativement une seule
de ses variables et dfinir la fonction
dans ce cas, labstraction nest que partielle et lexpression correspondante est ouverte.
Cette fonction peut tre abstraite son tour relativement sa variable libre y ce qui permet
de dfinir la variable
Si on abstrait, prsent, cette fonction relativement sa variable libre x, elle devient la fonc-
tion
qui est prsent ferme. Lorsque les variables libres dune expression ont t abstraites les
unes aprs les autres, la fonction ainsi obtenue est dite curryfi
14
. La curryfication permet
de transformer les fonctions dont le paramtre est un n-uplet en une composition de fonc-
tions un seul paramtre.
Nous verrons un peu plus tard quil peut tre intressant de ne pas abstraire toutes les va-
riables dune expression simultanment. La curryfication est une opration extrmement
puissante et les quelques exemples qui suivent vont le montrer.
Une fonction pour curryfier les fonctions non curryfies
Imaginons que nous disposions de fonctions dont le paramtre est un doublet (un 2-uplet)
et que nous en dsirions une version curryfie. On pourrait, bien sr, les curryfier la
main, ce qui deviendrait bien vite trs laborieux. Il est plus astucieux de dfinir la fonction
curry
14
Ladjectif curryfie a t cr en honneur de Haskell Curry, le logicien qui a introduit cette notation le
premier.
volume x y z , , ( ) x y z ( ) =
x y z ( )
z x y z ( )
y z x y z ( )
volume R
+
R
+
R
+
R
+
( ) ( ) :
volume x y z x y z ( ) =
curry X Y Z ( ) X Y Z ( ) ( ) :
curry f x y f x y , ( ) =
Les Fonctions Techniques de conception
- 23 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
A titre dexemple, curryfions la fonction daddition
On peut se demander lintrt dune fonction daddition curryfie. Cest son application
partielle qui va nous apporter la rponse
La fonction ainsi obtenue est une fonction dincrmentation.
Une fonction pour dcurryfier les fonctions curryfies
On peut, de la mme manire, dfinir une fonction pour dcurryfier des fonctions deux
paramtres curryfies.
On peut, bien sr, vrifier que la curryfication et la dcurryfication sont bien des oprations
inverses.
On vrifierait, de mme, que . On peut remarquer, en passant, quil
a t ncessaire de renommer les paramtres dune fonction afin dviter une collision de
noms.
2.4.4 Application d'une fonction ses arguments & valuation
Lorsqu'on veut utiliser le volume en gnral pour calculer un volume en particulier, on ap-
plique la fonction volume aux arguments qui vont tre lis ses paramtres. L'application
de cette fonction aux arguments 5, 7 et 2 s'crit
Cette expression correspond la structure suivante
add x y ( , ) x y + =
addc curry add ( ) =
x x y f x y , ( ) [ ] add ( ) =
x y add x y , ( ) =
addc 1 ( ) x y add x y , ( ) [ ] 1 ( ) =
y add 1 y , ( ) =
addc 1 ( )
dcurry X Y Z ( ) ( ) X Y Z ( ) :
dcurry f x y ( , ) f x ( ) y ( ) =
dcurry curry g ( ) ( ) f x y ( , ) f x ( ) y ( ) [ ] f x y f x y , ( ) [ ] g ( ) ( ) =
f x y ( , ) f x ( ) y ( ) [ ] x y g x y , ( ) ( ) =
f x y ( , ) f x ( ) y ( ) [ ] u v g u v , ( ) ( ) =
x y ( , ) u v g u v , ( ) [ ] x ( ) y ( ) =
x y ( , ) g x y , ( ) =
g =
curry dcurry h ( ) ( ) h =
volume 5 7 2 , , ( ) L l h , ( , ) L l h ( ) [ ] 5 7 2 , , ( ) 5 7 2 = =
volume 5 7 2 , , ( )
soit : L 5 =
l 7 =
h 2 =
dans : L l h
=
Les Fonctions Techniques de conception
- 24 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Appliquer une fonction ses arguments, revient lier les noms de son environnement priv
aux donnes fournies comme arguments. Ces liens donnent un sens l'expression qui a t
gnralise. On peut se reprsenter ce mcanisme en disant que les arguments ont t
substitus aux paramtres dans l'expression de dfinition de la fonction. Lvaluer con-
siste effectuer toutes les oprations alors possibles.
Ainsi
Nous allons revenir bientt sur le mcanisme de lapplication dune fonction ses argu-
ments car ce mcanisme prsente deux aspects importants.
Considrons, prsent, la version curryfie de la fonction volume et appliquons-la lar-
gument 5
On obtient alors une fonction deux paramtres. Lapplication complte aux arguments 5,
7 et 2 scrirait donc
2.4.5 Dfinition dun environnement
Considrons lexpression prcdente
On peut lcrire sous la forme suivante qui lui servira de dfinition
Nous constatons, alors, que la fonction lambda permet, non seulement de dfinir une
fonction, mais aussi de dfinir un environnement et quil nest pas ncessaire dintroduire
une nouvelle fonction primitive pour dcrire le rle jou par
Nous venons surtout de constater quun environnement nest jamais quune fonction. Nous
utiliserons ces deux critures quivalentes selon nos besoins.
2.4.6 Evaluation en ordre normal & valuation en ordre applicatif
Dire que les arguments ont t substitus aux paramtres laisse un problme subtil en
suspens : les arguments sont-ils valus avant dtre substitus ou aprs avoir t substi-
tus ?
volume-nc 5 7 2 , , ( ) L l h , ( , ) L l h ( ) [ ] 5 7 2 , , ( ) 5 7 2 70 = = =
volume-c 5 ( ) x y z x y z ( ) [ ] 5 ( ) y z 5 y z ( ) = =
volume 5 ( ) 7 ( ) 2 ( ) 5 7 2 =
soit : x 3 =
y 10 =
dans : x y
x y , ( ) x y ( ) [ ] 3 10 , ( ) 3 10 30 = =
soit :
dans :
Les Fonctions Techniques de conception
- 25 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Considrons les dfinitions suivantes
puis valuons .
A partir de l deux voies soffrent nous. On peut systmatiquement valuer les arguments
dabord, ce qui nous donne
Cette technique dvaluation est dite en ordre applicatif. On peut galement utiliser une
autre mthode d'valuation pour l'expression . Cette mthode consiste substituer
les arguments non valus, elle commence alors par une srie d'expansions
suivie de rductions par la gauche
15
15
Le fait que les rductions se font par la gauche est li au fait que dans la reprsentation de lapplication
dune fonction ses arguments ont note dabord la fonction ( gauche). La justification de cette rgle de
rduction est associe au thorme de Church-Rosser dont la dmonstration serait sans intrt ici.
carr x x x =
somme-carr x y ( , ) carr x ( ) carr y ( ) + =
foo x somme-carr x 1 + x 2 + , ( ) =
foo 3 ( )
foo 3 ( ) x somme-carr x 1 + x 2 + , ( ) [ ] 3 ( ) =
somme-carr 3 1 + 3 2 + , ( ) =
somme-carr 4 5 , ( ) =
x y ( , ) carr x ( ) carr y ( ) + [ ] 4 5 , ( ) =
carr 4 ( ) carr 5 ( ) + =
x x x [ ] 4 ( ) x x x [ ] 5 ( ) + =
4 4 5 5 + =
16 25 + =
41 =
foo 3 ( )
foo 3 ( ) x somme-carr x 1 + x 2 + , ( ) [ ] 3 ( ) =
somme-carr 3 1 + 3 2 + , ( ) =
x y ( , ) carr x ( ) carr y ( ) + [ ] 3 1 + 3 2 + , ( ) =
carr 3 1 + ( ) carr 3 2 + ( ) + =
x x x [ ] 3 1 + ( ) x x x [ ] 3 2 + ( ) + =
3 1 + ( ) 3 1 + ( ) 3 2 + ( ) 3 2 + ( ) + =
foo 3 ( ) 3 1 + ( ) 3 1 + ( ) 3 2 + ( ) 3 2 + ( ) + =
4 3 1 + ( ) 3 2 + ( ) 3 2 + ( ) + =
4 4 3 2 + ( ) 3 2 + ( ) + =
16 3 2 + ( ) 3 2 + ( ) + =
16 5 3 2 + ( ) + =
16 5 5 + =
16 25 + =
41 =
Les Fonctions Fonctions dordre suprieur
- 26 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Cette mthode qui consiste dvelopper compltement puis rduire par la gauche s'ap-
pelle l'valuation en ordre normal. Le thorme de Church-Rosser tablit que, dans la plu-
part des cas, le rsultat de lvaluation est le mme lexercice E-20 introduit un cas de
figure o le rsultat ne serait pas identique. On constate alors que la mcanisation de lva-
luation en ordre applicatif demande moins de travail la machine qui lexcute, cest donc
lordre applicatif qui sera mis en uvre en gnral. Cependant, on rencontrera quelque fois
(trs rarement heureusement) des fonctions qui ne peuvent tre values quen ordre nor-
mal
16
. Lorsque la distinction sera ncessaire, nous appellerons forme standard une expres-
sion qui peut tre value en ordre applicatif et forme spciale une expression qui ne peut
tre value quen ordre normal.
16
Nous en avons dj rencontr deux sans nous en rendre compte. Seriez-vous capable de les retrouver ?
2.5 Fonctions dordre suprieur
Ce paragraphe est assez difficile mais son importance est considrable et il justifie bien lef-
fort que sa comprhension va exiger.
Considrons lensemble des fonctions telles que
Il peut parfaitement constituer le domaine dune fonction baz telle que :
Une fonction telle que baz est dite dordre suprieur car elle manipule des fonctions.
Dans un mme ordre dide, rien ninterdit dimaginer une fonction qui produit une autre
fonction. En fait, on en connat dj une, la fonction lambda.
Imaginer des fonctions qui manipulent des fonctions na pas t simple. Cest Newton qui en
eut le premier lide lorsquil voulut donner des bases rigoureuses sa thorie mcanique.
Mais il fallut attendre Leibnitz pour en tablir une formulation rigoureuse lorsquil dveloppa le
calcul diffrentiel.
Considrons, par exemple, la drive de la fonction f pour la valeur x dfinie par
Le type de la fonction f est
tandis que le type de la fonction drive est
Sa dfinition peut tre mise sous la forme
Nous avons abstrait en une seule fois les paramtres f et x. Nous aurions pu les abstraire
foo
i
foo
i
D C :
baz D C ( ) C' :
drive f x , ( )
f x + ( ) f x ( )

--------------------------------
0
lim =
f R R :
drive R R ( ) R ( ) R :
drive f x , ( )
f x + ( ) f x ( )

--------------------------------
0
lim =
Les Fonctions Fonctions dordre suprieur
- 27 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
lun aprs lautre et crire
La fonction drivation est telle que
dont on peut, dailleurs, donner une version approche
Les fonctions drivation et drivationApproche sont des fonctions qui prennent une
fonction un argument en argument et qui rendent une fonction un argument comme r-
sultat, ce sont des oprateurs de drivation qui rendent la fonction drive dune fonction
donne.
Considrons, par exemple une fonction g et sa fonction drive g dfinie laide de
la fonction drivation
alors
qui est bien une fonction dont la dfinition est gale celle de la drive de g. La valeur
de la fonction g drive de la fonction g pour la valeur a du paramtre est donc gale
Ainsi introduite, on pourrait penser que les fonctions dordre suprieur sont des curiosits
mathmatiques. Il nen nest rien et on peut en trouver lusage dans de nombreuses situa-
tions de la vie courante.
Supposons que nous ayons besoin de contracter un emprunt la banque. Cet emprunt est
caractris par
Afin de prvoir le poids des remboursements annuels, nous dsirons dfinir une fonction
qui rend la valeur dune annuit
17
.Cest une fonction dont largument est le numro de lan-
ne et le rsultat est lannuit correspondante. Cette fonction dpend bien sr de la nature
17
Nous ne considrons pas ici un prt de type immobilier o on rembourse dabord les intrts puis ensuite le
capital emprunt.
drivation f x
f x + ( ) f x ( )

--------------------------------
0
lim =
drivation R R ( ) R R ( ) :
drivationApproche f ( , ) x
f x + ( ) f x ( )

-------------------------------- =
g' drivation g ( ) =
g' f x
f x + ( ) f x ( )

--------------------------------
0
lim g ( ) =
g' x
g x + ( ) g x ( )

----------------------------------
0
lim =
g' a ( ) x
g x + ( ) g x ( )

----------------------------------
0
lim a ( )
g a + ( ) g a ( )

-----------------------------------
0
lim drive g a , ( ) = = =
C capital emprunt en francs :
D dure de lemprunt en annes :
T taux des intrts en % :
Les Fonctions Fonctions effets
- 28 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
de lemprunt. Considrons la fonction emprunt suivante
et appliquons-l aux caractristiques dun emprunt particulier
soit
ce qui est justement la fonction dont nous avions besoin. On constate que la fonction que
nous avons appel mesAnnuits a captur lenvironnement de la fonction emprunt au
moment de son valuation.
Les fonctions dordre suprieur vont jouer un rle fondamental dans la dfinition dune ap-
plication (constitue dune fonction), nous ne pourrions pas aller beaucoup plus loin sans
elles. En particulier on peut commencer entrevoir quon saura dfinir des fonctions gn-
ratrice dapplications. Dans lexemple prcdent, notre application, la fonction mesAnnui-
ts, est engendre par utilisation du gnrateur dapplication, la fonction emprunt.
2.6 Fonctions effets
Il est clair que pour linstant, nous ne faisons que dfinir des moyens pour exprimer des
ides. Tant que ces moyens sont destins aux humains, ils peuvent rester un peu informels
et surtout, les rsultats et les donnes sexpriment implicitement. Mais ds que nous allons
essayer de mcaniser ces moyens, la ncessit pour certaines fonctions va apparaitre. En ef-
fet, si une fonction bien choisie permet de dfinir les proprits de la machine quil nous
faut concevoir, il nous faut, en plus, des fonctions qui permettent cette machine dinteragir
avec son environnement. On utilisera ainsi les deux fonctions primitives spciales
La premire prlve une donne de lextrieur et la rend, la seconde emet une donne
vers lextrieur.
La fonction lire est spciale en ce sens quelle viole le principe de transparence par rf-
rence. En effet, elle na aucun argument et chaque fois quon lappelle cest pour obtenir
une donne diffrente en gnral.
La fonction crire ne produit aucun rsultat susceptible dintervenir dans une valuation.
Elle nest utilise que pour leffet quelle produit sur lenvironnement. Lorsquon utili-
sera la fonction crire on la sparera des autres dfinitions par le signe ;.
emprunt C D T , ( , ) a
C
D
---- 1
T
100
--------- +
,
_
a
=
emprunt 1000 5 12 , , ( ) C D T , ( , ) a
C
D
----
1
T
100
--------- +
,
_
a
1000 5 12 , , ( ) =
emprunt 1000 5 12 , , ( ) a
1000
5
----------- - 1
12
100
--------- +
,
_
a
mesAnnuits = =
lire X :
crire X :
Les Fonctions Fonctions & quations
- 29 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Par exemple, on peut modifier la dfinition du prdicat divise?
2.7 Fonctions & quations
Pour l'instant, nous avons toujours pu crire une dfinition oprationnelle (par cas en g-
nral) des fonctions que nous avons introduites. Ce n'est malheureusement pas toujours pos-
sible. Il y a des choses qu'on peut dfinir sans pour autant savoir les construire. Ce problme
est apparu, il y a fort longtemps, aux mathmaticiens grecs qui dcouvrirent des nombres
non calculables
18
.
Considrons les nombres x et y dfinis respectivement par
La dfinition (a) permet de dterminer deux nombres satisfaisant la contrainte de dfinition
La dfinition (b) dfinit parfaitement le nombre y mais ne permet pas de le calculer, le nom-
bre y est irrationnel.
Jusqu' prsent, toutes les fonctions que nous avons rencontres pouvait tre dfinies par
une formule. L'apparition des nombres irrationnels, montre que ce ne sera pas toujours pos-
sible. Ce problme nest pas rare comme le montre la petite histoire suivante.
Mrinos a deux fils. Sentant sa fin proche, il dcide de rdiger son testament afin
de partager son champ carr de 100 mtres de cot entre ses deux fils. Sachant que
ses deux fils ne sentendent pas du tout, il leur tend un pige en imposant que le
champ ne puisse tre spar que le long dune diagonale
.
Afin de partager le prix de la clture en deux parties strictement gales (aucun des
deux frre ne veut payer plus que lautre), ils dcident de calculer la longueur de la
clture
La longueur de la clture nest pas calculable !
18
uniquement laide des 4 oprations arithmtiques.
divise? n m , ( ) n m = ( ) crire divise ( ) vrai ; , =
n m > ( ) crire ne divise pas ( ) faux ; ,
sinon divise? n m n , ( )
a ( ) x tel que x
2
5x 6 + 0 = :
b ( ) y tel que y
2
2 0 = :
x
1
2 = et x
2
3 =
100 m
L
L 100
2
100
2
+ 20000 100 2 = = =
Les Fonctions Fonctions & quations
- 30 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Revenons aux nombres irrationnels. C'est Dedekind qui en prcisa la nature. Bien sr, on
ne peut pas les calculer, mais on peut les approcher d'aussi prs que l'on veut grce une
suite convergente.
Considrons le nombre y dfini par lquation . Ce nombre n'est pas calculable,
mais considrons la suite dont le terme courant est
On peut montrer qu'elle est convergente, faisons confiance au mathmaticien sur ce point
et calculons ses quelques premiers termes
Dire que la suite converge revient dire que
avec
soit
Ainsi, si on ne peut pas donner une dfinition calculable d'un nombre irrationnel, on peut
toujours lui associer, sous la forme d'une suite convergente, la dfinition d'un nombre cal-
culable qui s'en rapproche d'aussi prs que l'on veut.
En dautre termes, on vient de sapercevoir quon est capable de dfinir des nombres sans
pour autant tre capable de les calculer, ces nombres tant dfinis comme solution dune
quation. Le calcul dune approximation de ces nombres revient rsoudre leur quation
de dfinition laide dune suite convergente. S'il fallait trouver cette suite la main chaque
fois qu'un problme non calculable se pose, nous ne serions gure avancs.
Nous allons montrer qu'il est possible de dfinir une fonction capable de rsoudre une
quation (presque) quelconque.
Ceci va reprsenter un progrs majeur qui va nous permettre de construire des abstractions
trs puissantes et trs utiles. Au pralable, il est ncessaire dtudier une forme particulire
dquations, les quations de point fixe.
termes dfinition valeur
arbitraire 1
1,5
1,4167
1,41412
.... .... ....
x
2
2 =
x
n
1
2
-- - x
n 1
2
x
n 1
----------- +
,
_
=
x
0
x
1
1
2
-- - 1
2
1
--- +
,
_
x
2
1
2
-- - 1 5 ,
2
1 5 ,
------- +
,
_
x
3
1
2
-- - 1 4167 ,
2
1 4167 ,
---------------- +
,
_
x
n
n
lim x
n 1
n
lim x

= =
x

1
2
-- - x

2
x

----- +
,
_
=
x

( )
2
2 =
Les Fonctions Fonctions & quations
- 31 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
2.7.1 Points fixes d'une fonction
Etant donne une fonction f, ses points fixes x* sont les solutions de l'quation
l'interprtation gomtrique du point fixe peut tre illustre par la figure 3, page 31 en con-
sidrant les coordonnes dun point dintersection entre la courbe et la
courbe .
Comme le nombre x* n'tant pas forcment calculable, on lui associe la suite
dont les termes se placent facilement en effectuant les constructions de la figure 4, page 31.
Pour que cette suite converge il suffit que pour n suffisamment grand
Figure 3 : Point fixe dune fonction.
Figure 4 : Convergence dune suite de point fixe.
x

f x

( ) =
x
y = f(x)
y = x
y
x*
f(x*)
x

et f x

( ) y x =
y f x ( ) =
x
n
f x
n 1
( ) =
x
0
x
1
x
2
x*
x
0
x
1
x
2
x*
y = x
y = x
y = f(x)
y = f(x)
x
n 1 +
x

x
n
x

<
f x
n
( ) f x

( ) x
n
x

<
Les Fonctions Fonctions & quations
- 32 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Le domaine de convergence peut donc tre reprsente sur la figure 5, page 32. Il est clair
que, lorsque cette suite converge, elle tend vers le point fixe de f(x).
Avant d'aller plus loin, voyons comment utiliser une quation de point fixe et considrons
l'quation . Trouver une de ses racines (relles), c'est trouver, par exemple, un des
points fixes de la fonction
le coefficient a tant dtermin pour que la condition de convergence de la srie de point
fixe de f soit satisfaite. La figure 4, page 31 nous permet de constater que le cas le plus
favorable se produit lorsque la fonction est horizontale, cest dire lorsque sa drive
est nulle. Dans ce cas
soit
Rsoudre lquation cest donc chercher le point fixe de
Cette technique de rsolution sappelle la mthode de Newton.
2.7.2 Oprateur de point fixe
La dfinition de la fonction pointFixe qui correspond la suite de point fixe associe
une fonction f est videmment
La dfinition de cette fonction traduit le fait que la suite de point fixe prend pour valeur :
la valeur courante x de l'estimation de la valeur du point fixe, si la convergence a,
Figure 5 : Domaine de convergence dune suite de point fixe.
y = f(x)
y = x
y = -x
x - x*
f(x) - f(x*)
Domaine
de
convergence
g x ( ) 0 =
f x ( ) ag x ( ) x + =
f x ( )
f' x ( )
f' x ( ) ag' x ( ) 1 + =
a
1
g' x ( )
----------
1
drive g x , ( )
------------------------------ = =
g x ( ) 0 =
f x ( ) x
g x ( )
drive g x , ( )
------------------------------ =
pointFixe x f , ( ) x f x ( ) ( ) x pointFixe f x ( ) f , ( ) , =
Les Fonctions Fonctions & quations
- 33 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
pratiquement, eu lieu,
la valeur amliore si la convergence n'a pas eu lieu.
2.7.3 Rsolution d'une quation quelconque
Pour rsoudre l'quation Il faut dabord dfinir la fonction
qui engendre la fonction dont le point fixe est la solution de lquation donne, puis den
chercher le point fixe par
On peut finalement dfinir la fonction-cosmtique rsoudre
2.7.4 Inversion d'une fonction monotone quelconque
Il existe des fonctions monotones c'est dire inversibles telles que la fonction inverse
peut tre calcule. Malheureusement, il existe des fonctions monotones pour lesquelles l'in-
verse n'est pas calculable ou est trs difficile dfinir analytiquement.
Prenons quelques exemples de la vie courante :
Inverser la fonction h, c'est trouver pour tout nombre y le nombre x tel que
Cette opration peut tre reprsente par la figure 6, page 33. Inverser h revient rsou-
f x ( )
g x ( ) 0 =
fe h x x
h x ( )
drive h x , ( )
------------------------------
,
_
=
pointFixe x
0
fe , g ( ) ( )
rsoudre g x ,
0
( ) pointFixe x
0
fe , g ( ) ( ) =
fonction fonction inverse
salaireNet = f(salaireBrut) difficile dfinir
impts = f(revenuImposable) difficile dfinir
.... ....
Figure 6 : Utilisation directe (1) et inverse (2) dune fonction.
f x ( ) f
1
x ( )
TTC HT 1 186 , = HT TTC 1 186 , =
y h x ( ) =
y
x
(1) (2)
Les Fonctions Fonctions & processus
- 34 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
dre l'quation
et trouver le point fixe relatif x, par exemple, de la fonction
On peut alors dfinir un gnrateur fi pour la fonction dont on cherche le point fixe
puis de chercher le point fixe par
On peut galement dfinir la fonction-cosmtique inverser
qui rend la fonction inverse dune fonction donne.
2.7.5 Gnralisons un peu (encore ?)
Lorsque nous avons voulu dfinir la fonction factorielle nous avons raisonn par induc-
tion et avons obtenu la dfinition rcursive suivante
soit
On peut abstraire la variable fact du membre de droite puis appliquer la fonction ainsi
obtenue fact et obtenir
Si on pose
on constate que
cest dire que la fonction fact est le point fixe de la fonction F quon appelle une
fonctionnelle.
De la mme faon quil a t possible de dfinir un oprateur de point fixe pour les nombres,
on peut dfinir un oprateur de point fixe pour les fonctions (Cf. exercice E-21 page 45).
2.8 Fonctions & processus
Jusqu' prsent, nous nous sommes consacrs dfinir les fonctions dont nous avions be-
soin et nous ne nous sommes jamais proccups du travail quallait impliquer leur utilisa-
tion. Cette attitude est justifie dans la plupart des cas de figure. Cependant, de temps
autre, il faudra essayer d'valuer les consquences de nos dfinitions afin, par exemple, den
g x ( ) y h x ( ) 0 = =
f x y , ( ) x
y h x ( ) ( )
drive h x , ( )
------------------------------ + =
fi g u ( , ) x x
u g x ( )
drive g x , ( )
------------------------------ +
,
_
=
pointFixe x
0
fi , h y , ( ) ( )
inverser h x
0
, ( ) y pointFixe x
0
fi , h y , ( ) ( ) =
fact n ( ) n 1 = ( ) 1 n fact n 1 ( ) , =
fact n n 1 = ( ) 1 n fact n 1 ( ) , =
fact f n n 1 = ( ) 1 n f n 1 ( ) , [ ] fact ( ) =
F f n n 1 = ( ) 1 n f n 1 ( ) , =
fact F fact ( ) =
Les Fonctions Fonctions & processus
- 35 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
choisir une parmi plusieurs possibles.
Lorsqu'on value une expression nous devons effectuer un ensemble doprations qu'on ap-
pelle un processus de calcul qui nous est totalement indiffrent tant qu'on ne cherche pas
apprcier le travail quil reprsente. Un processus de calcul se droule en deux phases :
1. Etablir toutes les quations que la dfinition de la fonction valuer permet dcrire
dans le cas qui nous intresse,
2. rsoudre le systme dquations obtenu.
Nous pouvons alors considrer que le travail que reprsente lvaluation dune fonction
peut tre dcrit partir des trois quantits suivantes :
1. le nombre des quations engendres par lutilisation de la dfinition,
2. le nombre des variables intermdiaires introduites,
3. le nombre des oprations lmentaires effectuer,
Nous utiliserons le modle de substitution des arguments aux paramtres pour dcrire l'va-
luation, suposse en ordre applicatif, des expressions que nous allons considrer. Si les d-
finitions non rcursives ne posent pas trop de problmes pour compter les oprations et les
variables, les dfinitions rcursives engendrent des processus de calcul dont les mcanis-
mes de consommation sont plus difficiles tudier. C'est donc d'eux dont nous parlerons.
2.8.1 Rcursivit linaire & itration
La premire dfinition rcursive que nous avons rencontre est celle de la fonction facto-
rielle
Cette dfinition est dite rcursive linaire car la dfinition de la fonction ne fait rfrence
qu'une seule fois la fonction elle-mme dans un mme sous-domaine.
En utilisant le modle de substitution, on peut analyser le processus de calcul engendr par
l'valuation de l'expression :
1. Dtermination des quations du problme
2. Rsolution des ces quations
Ce processus entrane la construction de 6 quations, la dfinition de 6 variables interm-
fact n ( ) n 1 = ( ) 1 n fact n 1 ( ) , =
fact 6 ( )
fact 6 ( ) 6 fact 5 ( ) =
fact 5 ( ) 5 fact 4 ( ) =
fact 4 ( ) 4 fact 3 ( ) =
fact 3 ( ) 3 fact 2 ( ) =
fact 2 ( ) 2 fact 1 ( ) =
fact 1 ( ) 1 =
fact 1 ( ) 1 =
fact 2 ( ) 2 1 2 = =
fact 3 ( ) 3 2 6 = =
fact 4 ( ) 4 6 24 = =
fact 5 ( ) 5 24 120 = =
fact 6 ( ) 6 120 720 = =
Les Fonctions Fonctions & processus
- 36 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
diaires et la ralisation de 5 multiplications.
Mais il est possible de dfinir la fonction fact partir de la recherche dun invariant. On
peut remarquer, en effet, que si on considre la fonction n!, son valuation va ncessiter n-
1 multiplications et effectuer 1 multiplication diminue de 1 le nombre des multiplications
qui restent effectuer.
L'expression suivante constitue donc un invariant de la factorielle
ce qui permet de donner une deuxime dfinition de la fonction factorielle
La forme que nous venons dutiliser ne peut pas tre celle que nous avions introduite au
paragraphe 2.4.5, page 24. En effet, si cela tait le cas, nous pourrions lcrire sous la forme
quivalente (?)
qui ne peut pas avoir de sens puisque le nom invarFact utilis ne peut pas tre dfini.
Nous introduirons alors la forme soit-rec : pour dnoter le fait que lenvironnement est
tendu de faon rcursive et nous mettrons la dfinition de la fonction fact sous la forme
Bien quil soit possible de donner une forme quivalente la forme soit-rec : en utilisant un
oprateur de point fixe (Cf. E-21 page 45), cette forme est tellement difficile introduire que
nous considrerons cette forme comme primitive. Cette forme quivalente exige que les
valeurs lies aux noms soient des fonctions.
Analysons le processus de calcul engendr par l'valuation de l'expression mettant
en jeu cette autre fonction fact
Ce processus entrane la construction de 7 quations, la ralisation de 5 multiplications
mais il na t ncessaire de dfinir quune seule variable intermdiaires car les multipli-
cations pouvaient tre effectues au fur et mesure.
Bien que ces deux processus de calculs produisent le mme rsultat, ils sont manifestement
diffrents. Le premier processus engendre une expansion suivi d'une contraction. Lors de
la phase de dveloppement, il construit une chane d'oprations diffres. Ces oprations
seront effectues successivement lors de la phase de contraction. Le volume de travail quil
invarFact f n , ( ) invarFact n f n 1 , ( ) =
fact n
soit : invarFact f m ( , ) m 1 = ( ) f invarFact m f m 1 , ( ) , =
dans : invarFact 1 n , ( )
=
fact n f f 1 n , ( ) [ ] f m ( , ) m 1 = ( ) f invarFact m f m 1 , ( ) , ( ) =
fact n
soit-rec : invarFact f m ( , ) m 1 = ( ) f invarFact m f m 1 , ( ) , =
dans : invarFact 1 n , ( )
=
fact 6 ( )
fact 6 ( ) invarFact 1 6 , ( ) =
invarFact 1 6 , ( ) invarFact 6 5 , ( ) =
invarFact 6 5 , ( ) invarFact 30 4 , ( ) =
invarFact 30 4 , ( ) invarFact 120 3 , ( ) =
invarFact 120 3 , ( ) invarFact 360 2 , ( ) =
invarFact 360 2 , ( ) invarFact 720 1 , ( ) =
invarFact 720 1 , ( ) 720 =
Les Fonctions Fonctions & processus
- 37 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
reprsente est :
1. le nombre des quations rsoudre: proportionnel n,
2. le nombre des variables intermdiaires introduire: proportionnel n,
3. le nombre des valuations effectues: proportionnel n.
Un tel processus est appel processus rcursif.
Le deuxime processus effectue les valuations ncessaires les unes aprs les autres imm-
diatement et sa consommation en ressources de la machine est :
1. le nombre des quations rsoudre: proportionnel n,
2. le nombre des oprations effectues: proportionnel n.
3. le nombre des variables intermdiaires introduites, indpendant de n.
Un tel processus est appel processus itratif.
Ainsi, une dfinition rcursive peut engendrer soit un processus rcursif, soit un pro-
cessus itratif.
On peut se demander pourquoi les deux dfinitions rcursives de la factorielle n'engendrent
pas le mme processus de calcul. A cette question, on peut apporter deux lments de r-
ponse :
1. La premire dfinition a plac l'opration cl (la multiplication) de telle sorte que
celle-ci porte sur la valeur rendue par la fonction appele. Elle ne peut donc tre
effectue qu'aprs que l'appel de la fonction ait rendu cette valeur. Il est alors nces-
saire dintroduire une variable intermdiaire puisqu'elle contient la donne sur
laquelle portera l'opration diffre.
2. La deuxime a plac l'opration dans les arguments de l'application rcursive. Elle
est donc effectue avant que l'application de la fonction n'ait lieu. Ainsi, lorsque la
fonction appele rend sa valeur, il n'y a plus aucune opration effectuer et il nest
pas ncessaire dintroduire une variable intermdiaire. Cette dfinition est dite
rcursive terminale.
Une dfinition rcursive terminale engendre un processus itratif.
La plupart des langages de programmation utiliss aujourd'hui (Pascal, ADA, C, etc.) ne sa-
vent pas identifier une dfinition rcursive terminale et engendrer, dans ce cas, un processus
itratif. Ils engendrent donc systmatiquement un processus rcursif moins efficace. C'est
pourquoi, ces langages :
1. sont contraints de fournir au programmeur des formes syntaxiques, nommes bou-
cles, pour engendrer un processus itratif,
2. ont contribu crer le mythe de l'inefficacit de la rcursivit.
2.8.2 Rcursivit en arbre
La dfinition d'une fonction est dite rcursive en arbre lorsque, dans un mme sous-domai-
ne, elle fait rfrence plusieurs fois la fonction elle-mme.
On peut prendre comme exemple la dfinition du nombre des combinaisons de m objets pris
Les Fonctions Fonctions & processus
- 38 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
n n
Pour retrouver cette dfinition, il suffit de procder de la manire suivante :
On retire un objet des m objets parmi lesquels on veut en prlever n. On peut ainsi construire
C(m-1,n) combinaisons. Si maintenant on considre les combinaisons de n-1 parmi ces m-1
objets, on construira des combinaisons de n objets en rajoutant systmatiquement celui
quon avait mis de cot.
L'valuation de l'expression entrane les valuations dcrites figure 7, page 38.
En gnral, le nombre des valuations effectues dans un processus rcursif en arbre est
proportionnel au nombre des noeuds de l'arbre tandis que le nombre des variables interm-
diaires introduire est proportionnel la profondeur de l'arbre.
Le vrai problme soulev par la rcursivit en arbre rside dans les valuations multiples
d'expressions a priori gales. Ces valuations superflues peuvent tre en nombre considra-
ble et les viter peut faire gagner normment de temps. Une technique curieuse peut alors
tre utilise. Elle consiste construire, au fur et mesure, une table des rsultats de la fonc-
tion valuer afin de ne pas refaire un calcul dj effectu auparavant. Chaque fois qu'il
faut valuer la fonction, on commence par rechercher dans la table si la valeur n'y figure
pas dj. On verra que cette stratgie nomme mmosation n'est pas trs difficile mettre
en oeuvre, mais elle n'est efficace que s'il est plus rapide de retrouver un rsultat dans la
table plutt que de le rvaluer.
2.8.3 Ordre de croissance
Les exemples prcdents montrent que les processus de calcul engendrs par l'valuation
d'une fonction peuvent tre trs diffrents et le volume de travail requis peut varier consi-
drablement. La notion d'ordre de croissance permet de dcrire ces diffrences de compor-
tement en donnant une mesure approximative des grandeurs mesurant lvolution de la
quantit de travail requise par le processus de calcul lorsqu'un paramtre de dimensionne-
ment du problme augmente.
Soit n un paramtre mesurant la taille du problme considr et la quantit de travail
requise par un problme de taille n. Dans les exemples prcdents, n peut tre l'argument
Figure 7 : Rcursion en arbre.
C
m
n
m n ( , ) m n < ( ) 0 , =
m n = ( ) 1 ,
n 1 = ( ) m ,
sinon C m 1 n 1 , ( ) C m 1 n , ( ) +
C
5
3
C
5
3

C
4
2
C
4
3

C
3
1
3 = C
3
2
C
3
2
C
3
3
1 =
C
2
1
2 = C
2
2
1 = C
2
1
2 = C
2
2
1 =
R n ( )
Les Fonctions Mathmatique et informatique - Digression
- 39 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
de la fonction valuer, tandis que peut tre le nombre des quations dfinir, le nom-
bres des variables intermdiaires introduire ou le nombre des oprations effectuer.
Nous dirons que a pour ordre de croissance , ce qui s'crit
s'il existe une constante K, indpendante de n, telle que
pour n suffisamment grand.
Par exemple, le processus rcursif engendr par l'valuation de la premire fonction fact
entrane la dfinition dun nombre dquations et lintroduction dun nombre de variables
intermdiaires qui croissent comme . Par contre, le processus itratif engendr par
l'autre fonction fact entrane la dfinition dun nombre dquations qui crot comme
tandis que le nombre des variables intermdiaires introduites ne crot que comme
, c'est dire est constant.
2.9 Mathmatique et informatique - Digression
Ce paragraphe, un peu philosophique, peut tre saut en premire lecture. Son seul objectif
est dclairer les raisons profondes certaines difficults que nous allons rencontrer.
Malgr les apparences, mathmatique et informatique sont deux activits aussi diffrentes
que peuvent ltre physique et mathmatique. Toutes les techniques accomplies utilisent les
mathmatiques comme outil dexpression et, bien que ce ne soit pas encore tout fait le cas,
linformatique na aucune chance de faire exception.
A lorigine notre connaissance effective de la nature ne sexprimait qu travers un ensem-
ble de tours de main et de savoir-faire artisanaux codifis sous la forme de mthode
pour...
19
. La philosophie traduisait une connaissance thorique fonde uniquement sur
la rflexion et sans aucune rfrence exprimentale.
Cest au XVIIme sicle que, sous limpulsion de Galile, le lien entre ltude des phno-
mnes naturels et les mathmatiques est fait. La physique contemporaine tait ne.
Jusquau XIXme les mathmatiques ont considr les fonctions comme des processus de
calcul. Une telle vision ne permettant pas den donner une dfinition rigoureuse, il fut n-
cessaire de considrer les fonctions comme des objets en soi quon pouvait dfinir... mais
pas forcment associer une formule. Cest ce moment l que la diffrence entre une d-
finition en extension (pas forcment formulable) et la dfinition en intention (formulable)
est apparue.
Depuis lors, pour un mathmaticien, tout objet acquiert une sorte dexistence ds lors quon
a su le dfinir. Cette faon de voir est incompatible avec linformatique dont lobjectif est
de vendre des fonctions. Ainsi, on pourrait dire que les mathmatiques dfinissent les
fonctions tandis que linformatique les construit (pour les vendre bien sr !).
Une consquence curieuse de ce qui prcde est quil existe des fonctions quon sait dfinir
19
Lencyclopdie de Diderot avait pour ambition dtre le recueil de tous les savoir-faire et de tous les tours
de main connus.
R n ( )
R n ( ) f n ( ) O( )
R n ( ) f n ( ) O( ) = prononcer : oh de f n ( )
R n ( ) Kf n ( )
n O( )
n O( )
1 O( )
Les Fonctions Mathmatique et informatique - Digression
- 40 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
(spcifier) mais quon ne sait pas construire (dfinir en intention). En fait on va voir quon
sait dfinir beaucoup plus de fonctions quon ne sait en fabriquer.
Pour simplifier les choses
20
, considrons les fonctions qui oprent sur des nombres et com-
menons par parler des nombres.
20
Au moins en apparence car en fait on ne perd rien en gnralit en faisant cette hypothse.
2.9.1 Les nombres de tous les jours
Les nombres de tous les jours ne sont que des nombres entiers, mme les nombres vir-
gule. La raison cela est quil faut les reprsenter (les crire, les payer...) et que pour cela
nous ne disposons que de moyens finis (un nombre fini de symboles reprsentant un nom-
bre fini dentits). Il est donc toujours possible dtablir une correspondance entre un nom-
bre de tous les jours et un nombre entier (pensez aux centimes, au millimtres et plus
gnralement toutes les sous-units qui ont t dfinies justement pour cela). On peut
donc dire quun nombre de tous les jours est un entier (ventuellement dguis).
En consquence, il y a autant de nombres de tous les jours que de nombres entiers, cest
dire une infinit dite dnombrables.
Les nombres rels sont beaucoup plus nombreux que les nombres entiers car on ne sait pas
associer un nombre entier chaque nombre rel (en bref, on ne sait pas numroter les nom-
bres rels). En fait on a montr que lensemble des nombres rels correspondait lment
pour lment lensemble des parties de lensemble des nombres entiers ; lensemble des
nombres rel est dit non-dnombrable.
Le plus curieux de lhistoire est quun ensemble de regroupements finis (doublets, de tri-
plets...) dentiers est encore dnombrable. En particulier, lensemble des nombres ration-
nels (doublet de deux entiers) est dnombrable et il ny a pas plus de nombres rationnels
que de nombres entiers (nous reviendrons sur ce point de faon trs pragmatique un peu
plus loin).
2.9.2 Fonctions oprant sur les nombres de tous les jours
Pour simplifier (toujours en apparence) les choses, considrons les fonctions dont le domai-
ne et le codomaine sont lensemble des nombres entiers. Lensemble des fonctions quil est
possible de dfinir en extension sur un tel couple domaine, codomaine est lensemble des
parties dun ensemble dnombrable. Cest donc un ensemble non dnombrable. En bref, on
peut dire quil y a autant de fonctions oprant sur un nombre entier pour donner un nombre
entier quil y a de nombre rels.
Les fonctions que linformatique va savoir dfinir sexpriment ncessairement laide de
moyens finis (un nombre fini de symboles reprsentant un nombre fini dentits). Ces fonc-
tions seront dites calculables et sont dnombrables.
Linformatique ne sait donc construire quun ensemble dnombrable de fonctions parmi
lensemble non dnombrable des fonctions que les mathmatiques sauraient dfinir.
Les Fonctions Conclusions
- 41 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
2.10 Conclusions
Ce chapitre avait pour but de montrer toute la richesse expressive de la notion de fonction.
Comme nous avons pu le constater, les fonctions permettent de dfinir des applications sor-
tant du cadre traditionnel des mathmatiques. On peut cependant se demander si cette ri-
chesse est suffisante pour fonder la programmation uniquement sur le concept de fonction.
Et bien, les thoriciens ont montr que tous les programmes, quels quils soient, crits dans
nimporte quel langage de programmation, pouvaient tre dfinis par une fonction. Cest ce
rsultat fondamental qui permet desprer que dans un avenir pas trop lointain on pourra
dvelopper des programmes comme on calcule un pont, des programmes qui marchent du
premier coup.
2.11 Exercices
E-1 1. Dfinir la fonction carr qui lve un nombre x au carr.
2. Dfinir la fonction cube qui lve un nombre x au cube.
3. Dfinir la fonction quatrime qui lve un nombre x la puissance quatrime.
4. Dfinir la fonction moyenne qui prend la moyenne de deux nombres x et y.
E-2 Dfinir une fonction distance qui calcule la distance euclidienne de deux points d'un plan
dfinis par leurs coordonnes cartsiennes.
E-3 Dfinir la fonction quotient qui rend le quotient de la division du nombre entier positif m
par le nombre entier positif n. Evaluer le travail ncessaire lvaluation du quotient de
deux nombres.
E-4 Dfinir la fonction reste qui rend le reste de la division du nombre entier positif m par le
nombre entier positif n. Evaluer le travail ncessaire lvaluation du reste de la division
dun nombre par un autre.
E-5 Dfinir un prdicat premiers? qui rend vrai si les deux nombres entiers positifs n et m
sont premiers entre eux (ne se divisent pas) et faux autrement. Evaluer le travail ncessaire
lvaluation du prdicat premiers?.
E-6 Supposons que l'addition et la soustraction nexistent pas. Dfinir les fonctions addition-
ner et soustraire qui rendent la somme et la diffrence de deux nombres entiers positifs
n et m partir de deux fonctions lmentaires dterminer. Evaluer le travail ncessaire
lvaluation de la somme et de la diffrence de deux nombres.
E-7 Supposons que la multiplication nexiste pas non plus. Dfinir la fonction multiplier qui
rend le produit de deux nombres entiers positifs n et m partir de laddition. Evaluer le tra-
vail ncessaire lvaluation du produit et du quotient de deux nombres.
E-8 Dfinir une fonction puissance qui lve un nombre m une puissance entire positive n.
1. Donner une dfinition rcursive simple de la fonction puissance. Dterminer le nom-
bre des quations engendres par une telle dfinition.
2. Montrer que si n est pair, la dfinition prcdente peut tre adapte de faon minimi-
ser le nombre des quations construites
3. Montrer que si n est impair, la dfinition prcdente peut tre adapte de faon mini-
Les Fonctions Exercices
- 42 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
miser le nombre des quations construites.
4. Combiner les deux dfinitions prcdentes en une seule pour obtenir une version opti-
mise de la fonction puissance.
5. Evaluer le travail ncessaire la dtermination de la puissance entire dun nombre
selon les diffrentes versions de la dfinition de la fonction puissance.
E-9 On se propose de dfinir le PGCD de deux nombres entiers positifs. Le PGCD (Plus Grand
Commun Diviseur) de deux nombres a et b est le plus grand nombre qui les divise la fois
tous les deux.
1. Montrer que, tant donn deux nombres a et b, tout diviseur de a et b divise aussi soit
a-b, soit b-a.
2. En dduire une dfinition rcursive pour la fonction pgcd.
3. En dduire une dfinition du PPCM (Plus Petit Commun Multiple) de deux nombres
entiers positifs.
4. Evaluer le travail ncessaire la dtermination du PGCD de deux nombres entiers.
E-10 Dfinir la fonction racine qui calcule la valeur par dfaut (valeur entire juste infrieure)
de la racine carr dun nombre entier positif. On utilisera le fait que la racine carr dun car-
r parfait est gale au nombre des nombres entiers impairs dont il est la somme.
Par exemple : .
E-11 Dfinir, laide dun invariant, une fonction qui rend une valeur approche de partir de
l'expression
On sarrtera lorsque le terme courant napporte pas une modification suprieure un seuil
fix. On sapercevra que, malheureusement, la prcision du rsultat nest pas directement
lie ce seuil. Cette formule a t dcouverte par le mathmaticien suisse Leonhard Euler.
E-12 Dfinir, laide dun invariant, une fonction qui rend une valeur approche de partir de
l'expression
On sarrtera lorsque le terme courant napporte pas une modification suprieure un seuil
fix. Cette formule a t dcouverte par le grammairien anglais John Wallis en 1655.
E-13 Dfinir une fonction qui rend une valeur approche de partir de l'expression
On sarrtera lorsque le terme courant napporte pas une modification suprieure un seuil
fix.
Nota: cet exercice est plus facile si on remarque quil est intressant dintroduire deux
invariants en rcurrence croise. Ces deux invariants peuvent, ensuite, tre runis sous
la forme dun seul.
Cette formule a t dcouverte par lastronome cossais James Grgory en 1671 (certains
auteurs attribuent cette formule Liebnitz)
25 1 3 5 7 9 + + + + =

2
6
----- 1
1
4
-- -
1
9
-- -
1
16
----- -
1
25
----- - + + + + + =

4
---
2
3
-- -
4
3
---
4
5
---
6
5
---
6
7
---
8
7
--- =

4
--- 1
1
3
---
1
5
-- -
1
7
---
1
9
-- -
1
11
------ + + + =
Les Fonctions Exercices
- 43 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
E-14 Dfinir la fonction monnaie qui dtermine la meilleure faon de construire une somme
donne s partir d'un stock, suppos illimit, de pices de 20 F, de 10 F, de 5 F, de 2 F et
de 1 F.
Nota: On supposera quil existe une fonction afficher(x). Pensez chercher un invariant
du problme.
E-15 Traiter lexercice prcdent en supposant maintenant que le stock de pices est limit
pices de 20 F, pices de 10 F, pices de 5 F, pices de 2 F et pi-
ces de 1 F.
E-16 Pour rsoudre l'quation f (x)= 0 dans l'intervalle [a,b], plutt que dutiliser une mthode de
point fixe, on opre par approximations successives en procdant de la faon suivante
Si f(a) et f(b) sont de mme signe, il n'y a pas de solution dans cet intervalle.
Si f(a) et f(b) ne sont pas de mme signe, on peut diviser l'intervalle [a,b] en deux
parties gales. Si f(a) et f((a+b)/2) sont de mme signe, l'intervalle de recherche
devient [(a+b)/2,b], sinon, il devient [a,(a+b)/2].
Lorsque la taille de l'intervalle de recherche est infrieure la prcision dsire, la recher-
che est stoppe et le milieu de l'intervalle de recherche constitue l'approximation de la raci-
ne de l'quation donne.
Dfinir la fonction rsoudre(f,a,b,) qui rend, si elle existe, la valeur approche, prs,
de la racine de l'quation f(x) = 0 dans l'intervalle [a,b].
E-17 De nombreux problmes de recherche oprationnelle se ramnent la dtermination du
maximum, dans un intervalle donn , d'une fonction unimodale (ayant un seul maxi-
mum) un paramtre.
1. Une mthode trs simple (et presque la plus efficace) est une recherche par dichotomie.
Celle-ci consiste rduire l'intervalle de recherche de moiti chaque essai. Dfinir
une fonction qui rend la valeur du maximum d'une fonction f
donne dans un intervalle donn la prcision . Evaluer le travail ncessaire la
localisation dun maximum une prcision gale 1/1000 de lintervalle de recherche
initial.
Nota: pensez localiser le maximum en cherchant une quantit value au milieu de
lintervalle de recherche.
2. On aurait pu aussi utiliser une mthode de point fixe en remarquant que le maximum
d'une fonction est caractris par le fait que sa drive y est nulle. Dterminer la fonc-
tion f dont il faut dterminer le point fixe pour trouver le maximum de la fonction
g donne.
E-18 Une vieille lgende Vietnamienne
21
raconte que les moines dun couvent se relaient depuis
fort longtemps pour rsoudre le problme suivant :
Une pile de 64 disques placs sur une tige A doit tre transfre sur une tige C en saidant
dune tige B intermdiaire. Ces disques, tant de plus en plus petits, forment une pile coni-
que. La lgende veut que les disques sont dplacs les uns aprs les autres de telle sorte
quon ne place jamais un disque sur un disque plus petit que lui.
21
jolie, mais fausse en fait. Cette charmante histoire a t imagine en 1833 par le mathmaticien franais
Edouard Lucas.
m
20
m
10
m
5
m
2
m
1
a b [ , ]
maximum f a b , , , ( )
a b [ , ]
Les Fonctions Exercices
- 44 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Au dpart, la situation est la suivante
1. Dfinir une fonction dplacer(x,y,z,n) qui dplace une pile constitue de n disques
place sur la tige x vers la tige z en saidant de la tige y. Cette fonction affiche tous les
mouvements quil est ncessaire deffectuer sous la forme A -> B lorsquon dplace
le disque situ au sommet de la pile en A pour le placer au sommet de la pile en B.
Nota: imaginez que cette fonction existe et dcrivez les mouvements effectuer pour
dplacer le disque infrieur de la pile dplacer. La fonction dplacer ne ncessite
pas plus de 5 6 lignes pour sa dfinition.
2. La vieille lgende prcise, de plus, que la fin du monde aura lieu ds que les moines
auront termin. En supposant que les moines se relaient jours et nuits, quils effectuent
un transfert toutes les secondes et quils ne se trompent jamais, dterminer la date de la
fin du monde.
E-19 Certains corps de mtier utilisent des logiciels de Conception Assiste par ordinateur
(CAO) dont les rsultats se prsentent sous la formes de grands diagrammes, plans ou sch-
mas. La cration des documents associs ncessite un priphrique informatique spcial:
une machine dessiner (plotter en anglo-amricain).
Cette machine est, en gnral, constitue dun grand plan de travail devant lequel se dplace
une plume dont les mouvements sont pilots par deux moteurs lui permettant de se dplacer
selon deux axes que nous appellerons arbitrairement axe Nord-Sud et axe Est-Ouest.
Ces deux moteurs sont des moteurs dits pas--pas car chaque fois quon leur envoie une
commande, ils neffectuent quun seul pas. Les dplacements de la plume qui permettent
deffectuer le trac dsir sont reprsents par la succession des dplacements lmentaires
nots: n pour Nord, s pour Sud, e pour Est et o pour Ouest (Cf. figure 8, page 44).
Par exemple, le trac de la figure 6 correspond la suite des dplacements e, n, e,
n, e, n, e. Bien sr, la plume dessine en fait de petits escaliers, mais ceux-ci sont
A B
C
Figure 8 : Trac en escalier.
N
S
E O
N
Les Fonctions Exercices
- 45 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
si petits (typiquement 0,1 mm) quon ne les voit pratiquement pas loeil nu.
1. Dfinir la fonction qui met la suite des dplacements qui per-
mettent damener la plume du point de coordonnes au point de coordonnes
(les coordonnes sont des nombres entiers).
Nota: utiliser la fonction crire pour envoyer la commande c la machine dessi-
ner.
Il est clair que ce sont les dplacements de la plume qui consomment le plus de temps. Il est
donc intressant de minimiser le nombre de ces dplacements mmes si, pour cela, on com-
plique la fonction de pilotage.
Comme les deux moteurs sont indpendants, on peut les piloter simultanment ce qui per-
met de dfinir 4 dplacements lmentaires supplmentaires: ne pour Nord-Est, se
pour Sud-Est, so pour Sud-Ouest et no pour Nord-Ouest.
2. Dfinir la fonction qui met la suite des dplacements
qui permettent damener la plume du point de coordonnes au point de coor-
donnes .
Dans ce cas, la suite des dplacements lmentaires correspondant la figure prcdente
serait : ne, ne, ne, e.
3. Dterminer le nombre des pas ncessaires pour amener la plume dun point au
point en utilisant la fonction tracer et en utilisant la fonction tracerRapide.
E-20 Dfinir la fonction dont la spcification fut donne sous la forme du pome suivant
Trouvez la solution comme le hasard vous conduit,
Par bonheur la vrit vous pouvez accder,
Dabord procdez la question,
Bien quaucune vrit ny soit contenue.
Une telle fausset est une si bonne base,
Que la vrit sera vite trouve.
De beaucoup, enlevez beaucoup,
De trop peu, prenez aussi trop peu.
A lexcdent, joignez encore le trop peu,
Et trop peu, ajoutez trop simplement.
En croix, multipliez les types contraires,
Pour que toute vrit, partir de la fausset, soit trouve.
auteur inconnu
Le Fondement de lArt (vers 1540)
E-21 Ce problme est (trs ?) difficile, il consiste dcouvrir un oprateur de point fixe pour
les fonctions.
1. Considrons la fonction . Quel est le rsultat de lvaluation en ordre normal
de lexpression ?
2. Supposons quil existe une fonction Y telle que . Quel est le rsultat
de lvaluation en ordre normal de lexpression ?
3. Que reprsente la quantit relativement E.
4. Modifier (lgrement) la dfinition de la fonction de telle sorte quelle per-
mette la dfinition dune fonction pouvant jouer le rle de Y. Donner votre dfinition
de Y.
5. Montrer que la solution de lquation (Cf. paragraphe 2.7.5, page 34)
est gale .
6. Evaluer en ordre normal lexpression .
tracer x
0
x
1
y
0
y
1
, , , ( )
x
0
y
0
( , )
x
1
y
1
( , )
tracerRapide x
0
x
1
y
0
y
1
, , , ( )
x
0
y
0
( , )
x
1
y
1
( , )
x
0
y
0
( , )
x
1
y
1
( , )
x x x ( )
x x x ( ) [ ] x x x ( ) ( )
Y E ( ) E Y E ( ) ( ) =
Y E ( )
Y E ( )
x x x ( )
fact F fact ( ) =
Y F ( )
Y F ( ) [ ] 4 ( )
Les Fonctions Exercices
- 46 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Les Fonctions Exercices
- 47 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Les Fonctions Exercices
- 48 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
- 49 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
3. Les Donnes
Nous en arrivons maintenant l'tape dcisive de l'abstraction math-
matique : oublions ce que les symboles signifient... [le mathmaticien] n'a
pas perdre son temps ; beaucoup d'oprations peuvent tre excutes
avec ces symboles sans que nous ayons toujours l'esprit les objets qu'ils
reprsentent.
Hermann Weyl
The Mathematical Way of Thinking
Jusqu' prsent, nous avons utilis des donnes primitives (les nombres) et des fonctions
primitives (les oprations) pour construire des fonctions. Nous avons ainsi conu des fonc-
tions qui manipulent des donnes, des fonctions qui manipulent des fonctions et d'autres qui
en produisent. Nous ne nous sommes pas pos la question de savoir do ces donnes et ces
fonctions primitives pouvaient bien venir, nous avons simplement fait comme si elles
taient l.
Nous avons acquis la certitude que nous pouvons tendre le nombre des fonctions pratique-
ment autant que nous le voulons. Par contre, nous n'avons pas encore russi tendre le
nombre des donnes primitives.
Vouloir crer un nouveau type de donnes pose trois problmes:
1. dfinir l'ensemble des constantes ou un constructeur pour les lments de ce type,
2. dfinir les oprations pouvant manipuler les lments de ce type,
3. en concevoir une reprsentation interne et une reprsentation externe.
Les deux premiers problmes concerne la dfinition externe du type de donnes appele sa
signature et le troisime concerne sa ralisation. Essayons de dcouvrir tout cela partir de
deux exemples.
Nous allons nous placer dans une situation un peu inhabituelle mais qui va nous permettre
de comprendre comment on peut partir de presque rien :
1. le mcanisme d'abstraction fonctionnelle, cest dire loprateur ,
Les Donnes Les Nombres boolens
- 50 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
2. l'application fonctionnelle uniquement, cest dire le mcanisme de substitution des
arguments dune fonction ses paramtres.
Il n'existe donc encore aucune donne primitive sur laquelle s'appuyer et aucun op-
rateur primitif utiliser.
Dans un premier exemple, celui des nombres boolens, nous allons mlontrer comment on
peut btir, de toutes pices, un nouveau type de donnes. Dans un deuxime exemple, celui
des nombres rationnels, nous verrons comment combiner des types de donnes existant
pour en construire un nouveau.
Dans un tel contexte, nous ne pourrons utiliser que des fonctions curryfies puisque nous
ne disposons daucun mcanisme dassociation permettant de construire des n-uplets. Ain-
si, lorsque nous serons amen utiliser des fonctions dfinie au cours du chapitre prcdent,
nous en prendrons la version curryfie.
3.1 Les Nombres boolens
3.1.1 Dfinition des Constantes boolennes
Pour dfinir les deux lments de l'ensemble des nombres boolens que nous appellerons
arbitrairement vrai et faux nous ne disposons que de fonctions curryfies qui ne peuvent
rien faire d'autre que de prendre des arguments et de rendre l'un d'entre eux ces argu-
ments ne peuvent tre que des fonctions puisqu'il n'existe pas encore de donnes et on ne
peut pas les modifier puisqu'il n'existe pas d'oprateurs. Nous devons donc trouver deux
fonctions pouvant prendre deux formes diffrentes.
Il n'y a que deux possibilits
et nous poserons arbitrairement que
Voici donc nos deux constantes
1
. Il nous reste dfinir les oprations qui peuvent agir sur
elles.
1
Nous cririons vrai et faux en italique car, bien que ce soit des fonctions, nous allons les utiliser comme
des donnes.
3.1.2 Oprations sur les Nombres boolens
Nous allons nous contenter de dfinir les oprations de complmentation, de conjonction et
de disjonction. Les autres oprations seraient dfinies sur le mme modle.
Complmentation (oprateur pas not )
L'opration de complmentation rend faux si x vaut vrai et vrai dans le cas contraire.
x y x
x y y
vrai x y x =
faux x y y =
pas x ( )
Les Donnes Les Nombres boolens
- 51 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Sa dfinition est donc
En effet
Lexemple inverse permettrait de vrifier exhaustivement lgalit de cette dfinition en
comprhension et de la dfinition en extension qui nous a servi de cahier des charges.
Conjonction (oprateur et not )
La table de dfinition en extension de la conjonction est la suivante
la dfinition de la fonction est donc
En effet, prenons un exemple
On pourrait ainsi, en traitant les 4 cas de figure, vrifier lgalit de cette dfinition et du
cahier des charges fourni.
Disjonction (oprateur ou not )
La table de dfinition en extension de la disjonction est la suivante
la dfinition de la fonction est donc
x y
faux faux faux
faux vrai faux
vrai faux faux
vrai vrai vrai
x y
faux faux faux
faux vrai vrai
vrai faux vrai
vrai vrai vrai
pas x x faux ( ) vrai ( ) =
pas vrai ( ) x x faux ( ) vrai ( ) [ ] vrai ( ) =
vrai faux ( ) vrai ( ) =
faux =
x y
x y
et x y x y ( ) faux ( ) =
vrai faux x y x y ( ) faux ( ) [ ] vrai ( ) faux ( ) =
vrai faux ( ) faux ( ) =
faux =
x y
x y
ou x y x vrai ( ) y ( ) =
Les Donnes Les Nombres rationnels
- 52 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
En effet, prenons un exemple
On pourrait ainsi, en traitant les 4 cas de figure, vrifier lgalit de cette dfinition et du
cahier des charges fourni.
3.1.3 La Fonction si (note )
Au chapitre prcdent, nous avons introduit une fonction 3 paramtres appele si que
nous noterons ici sous forme curryfie car nous ne disposons encore daucune opration
permettant de construire des n-uplets
Lorsque le prdicat p prend la valeur vrai, cette fonction prend pour valeur la valeur de a et
prend la valeur de b dans le cas contraire.
Avec les boolens que nous venons de construire, il est possible de donner la dfinition sui-
vante la fonction si
En effet
Ainsi, comme nous pouvons le constater, la fonction si nest pas primitive comme nous
lavions suppos au premier abord.
3.2 Les Nombres rationnels
De la mme manire que nous avons combin des oprateurs existant pour en construire
d'autres, nous pouvons construire de nouveaux types de donnes en combinant des types de
donnes existant.
Cette opration correspond la construction d'un ensemble par produit cartsien d'autres
ensembles. Considrons l'ensemble des nombres entiers relatifs non nuls , l'ensemble
des nombres rationnels est l'ensemble produit muni des oprations adquates et si
est l'ensemble des nombres rels, l'ensemble des nombres complexes est construit sur
l'ensemble produit .
Considrons, par exemple, un nombre rationnel. Ce nombre est caractris par son num-
rateur et son dnominateur qui sont des nombres entiers que nous considrerons comme
strictement positifs
2
a priori, il appartient donc l'ensemble .
2
simplement pour viter les problmes de signe.
vrai faux x y x vrai ( ) y ( ) [ ] vrai ( ) faux ( ) =
vrai vrai ( ) faux ( ) =
vrai =
si p ( ) a ( ) b ( ) p a b , =
si p a b p a ( ) b ( ) =
si vrai ( ) a ( ) b ( ) a =
si faux ( ) a ( ) b ( ) b =
Z
+
Z Z
+

R
R R
Q N
+
N
+
=
Les Donnes Les Nombres rationnels
- 53 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
On assimile souvent les nombres rationnels aux fractions et on note
Un tel nombre est associ, entre autres, aux oprations suivantes
3.2.1 Dfinition du Nombre rationnel
Construire un nombre rationnel appartenant l'ensemble Q c'est associer son numrateur et
son dnominateur et ce nombre rationnel existe ds qu'on est capable
1. d'associer ses deux composantes pour crer l'entit nombre rationnel dans
laquelle ces deux composantes sont manipules en bloc. Nous appellerons ration-
nel la fonction de cration d'un nombre rationnel.
2. de slectionner une des deux composantes pour pouvoir dfinir les oprations sur
les nombres rationnels puisque ces composantes sont dfinies en termes de numra-
teur et de dnominateur. Nous appellerons numrateur et dnominateur les
deux fonctions de slection.
q
numrateur
dnominateur
--------------------------------- =
somme : q
1
q
2
+
n
1
d
2
n
2
d
1
+
d
1
d
2

---------------------------------------- =
produit : q
1
q
2

n
1
n
2

d
1
d
2

----------------- =
inverse :
1
q
-- -
d
n
--- =
rationnel N
+
N
+
Q :
numrateur Q N
+
:
dnominateur Q N
+
:
Les Donnes Les Nombres rationnels
- 54 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Prenons nos dsirs pour des ralits
3
et imaginons qu'il existe une fonction de cration
et deux fonctions de slection
Ces trois fonctions dfinissent une barrire (Cf. figure 9, page 54) entre le monde des nom-
bres entiers et le monde des nombres rationnels. Nous verrons plus tard comment dfinir
ces fonctions, car pour le moment leur dfinition n'a pas dimportance.
3
Prendre ses dsirs pour des ralits est une mthode de conception extrmement puissante, nous lutilise-
rons souvent.
3.2.2 Oprations sur les Nombres rationnels
Somme
Lexpression de la somme de deux nombres rationnels se dduit immdiatement de sa d-
finition
Figure 9 : Le monde des nombres rationnels et le monde des nombres entiers.
rationnel n d ( ) =
numrateur q ( ) =
dnominateur q ( ) =
rationnel
numrateur
dnominateur
q
n
d
Monde des Entiers Monde des Rationnels
rationnel-somme q
1
q
2

soit : n
1
numrateur q
1
( ) =
d
1
dnominateur q
1
( ) =
n
2
numrateur q
2
( ) =
d
2
dnominateur q
2
( ) =
dans : rationnel
n
1
d
2
n
2
d
1
+
( )
d
1
d
2

( )
=
Les Donnes Les Nombres rationnels
- 55 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Produit
Lexpression du produit de deux nombres rationnels se dduit galement de sa dfinition
Inverse
Lexpression de linverse dun nombre rationnel se dduit encore de sa dfinition
Ainsi, nous constatons que
1. La dfinition des fonctions rationnel, numrateur et dnominateur suffit
pour construire l'ensemble des oprations associes aux nombres rationnels. La
frontire entre le monde des nombres rationnels et celui des nombres entiers est
donc tanche.
2. Nous n'avons pas dfini de reprsentation interne pour les nombres rationnels et cela
n'a eu manifestement aucune importance.
3. On pourra dfinir ultrieurement cette reprsentation interne et mme en changer
sans avoir modifier la dfinition des oprateurs agissant sur les nombres ration-
nels.
Ces trois remarques sont d'une importance capitale car elles montrent qu'il est possible de
structurer une application en crant des domaines associs au type des donnes manipules.
Ces domaines sont caractriss par la dfinition de leur frontire constitue de la fonction
de cration de donne et des fonctions d'accs aux composantes de la donne. Un tel domai-
ne est appel un type abstrait de donnes et il est dfini par sa signature.
Avant daborder la dfinition dune reprsentation pour les nombres rationnels, il est nces-
saire douvrir une parenthse relative une difficult de langage courante : les problmes
pose par la citation.
3.2.3 Symbole & Citation
Si nous concevons fort bien qu'il est possible de donner un nom aux choses, il semble plus
difficile d'utiliser ce nom pour parler des choses. Ce problme n'est pas propre l'informa-
tique ou aux mathmatiques, il est attach la notion de langage et les langues naturelles
ne sont pas exemptes de problmes.
En effet, que faut-il rpondre cette invite ?
dis-moi ton nom.
ton nom est une rponse aussi concevable que Alonzo Church et il faudrait utiliser des
guillemets pour lever l'ambigut. Ainsi, si le plus souvent nous parlons des choses, il arrive
rationnel-produit q
1
q
2

soit : n
1
numrateur q
1
( ) =
d
1
dnominateur q
1
( ) =
n
2
numrateur q
2
( ) =
d
2
dnominateur q
2
( ) =
dans : rationnel n
1
n
2
( )
d
1
d
2

( )
=
rationnel-inverse q
soit : n numrateur q ( ) =
d dnominateur q ( ) =
dans : rationnel d ( ) n ( )
=
Les Donnes Les Nombres rationnels
- 56 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
que nous soyons obligs de parler des choses qui nous permettent de parler des choses
4
et
nous utiliserons un mcanisme de citation
5
.
Jusqu prsent, lorsque nous avons introduit un nom pour reprsenter une variable inter-
mdiaire, ce nom tait destin tre valu. Le rsultat de cette valuation est dailleurs la
valeur qui a t lie ce nom.
Nous allons, prsent, tre amen introduire des symboles qui nont pas de signification
dans le cadre de la dfinition que nous sommes en train de construire, mais uniquement dans
le cadre de leur utilisation. En particulier, ils ne sont pas utiliss pour nommer une variable
et ne doivent donc pas tre valus.
Nous conviendrons que les noms en gras ne sont que des symboles et que, ntant lis
aucune valeur, ils ne reprsentent queux-mmes. Nous supposerons, de plus, que nous sa-
vons comparer deux symboles pour savoir sils sont identiques.
4
Pour apprendre nos enfants parler franais (ou anglais...), nous ne pouvons que parler franais (ou
anglais...).
5
L'introduction de la citation dans un langage permet l'apparition de redoutables paradoxes du type de celui-
ci:
La ligne suivante est vraie,
La ligne prcdente est fausse.
3.2.4 Reprsentations interne du Nombre rationnel
Il est temps maintenant de donner une existence effective aux nombres rationnels en leur
dfinissant une forme interne. Pour bien montrer que la forme de cette reprsentation n'a
pas d'importance, nous allons en imaginer deux.
Reprsentation par une Fonction
Notre outil de construction tant la fonction, il est naturel, pour nous, d'utiliser une repr-
sentation interne sur la base d'une fonction.
Un nombre rationnel sera donc un objet-fonction qui associe ses deux composantes, par
exemple
La dfinition de la fonction constructeur est conue dans l'optique de la ncessit d'une s-
lection ultrieure des composantes.
Les fonctions slecteur se contentent alors d'invoquer la fonction associe au nombre ra-
tionnel en l'appliquant l'argument convenable
Les deux expressions ci-dessus illustrent bien quel point la diffrence entre donne et
fonction est conventionnelle. En effet, q joue dans la mme expression tantt le rle d'une
rationnel n d m m numrateur = ( ) n , =
m dnominateur = ( ) d ,
sinon
__
|
numrateur q q numrateur ( ) =
dnominateur q q dnominateur ( ) =
Les Donnes Les Nombres rationnels
- 57 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
donne, tantt le rle d'une fonction. Cette dualit est encore plus vidente si on crit
La construction du nombre rationnel a utilis une technique de programmation trs efficace,
la transmission de messages. Le paramtre m de la fonction associe un nombre rationnel
est un message transmettre ce nombre lorsqu'on lui rclame une de ses composantes.
L'utilisation de cette technique n'est qu'bauche ici et nous verrons qu'on peut en tirer de
multiples avantages.
Reprsentation par une Donne primitive
Aprs avoir utilis les proprits des fonctions, nous pouvons utiliser les proprits des
nombres entiers. Nous pouvons, par exemple reprsenter un nombre rationnel par le nom-
bre entier
6
A la place de 2 et 3 on aurait pu prendre n'importe quel couple de nombres entiers premiers
entre eux. On peut montrer, bien sr, que cette reprsentation est unique et non ambigu
7
.
En effet
La fonction de construction est alors
Les fonctions de slection associes sont un peu plus difficiles dfinir que prcdemment.
Remarquons quil est possible de dfinir les deux invariants suivants
On peut donc dfinir le slecteur de numrateur
et le slecteur de dnominateur
Et voici une autre reprsentation interne des nombres rationnels qui peut faire
6
On remarque, en passant, que lexistence dune telle reprsentation prouve que lensemble des nombres
rationnels est dnombrable. Il nexiste donc pas plus de nombres rationnels que de nombres entiers.
7
Le faire est un exercice intressant.
numrateur q ( ) q numrateur ( ) =
dnominateur q ( ) q dnominateur ( ) =
q 2
n
3
d
=
q
1
q
2
= ( )
n
1
n
2
=
d
1
d
2
=

'

rationnel n d 2
n
3
d
=
N q ( ) n ( ) N q 2 ( ) n 1 + ( ) =
D q ( ) d ( ) D q 3 ( ) d 1 + ( ) =
numrateur q
soit-rec : N q n divise? 2 ( ) q ( ) N q 2 ( ) n 1 + ( ) n , =
dans : N q ( ) 0 ( )
=
dnominateur q
soit-rec :
D q d divise? 3 ( ) q ( ) D q 3 ( ) d 1 + ( ) d , =
dans : D q ( ) 0 ( )
=
Les Donnes Les Nombres rationnels
- 58 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
parfaitement
8
l'affaire.
8
Au moins sur le plan des principes. Il est clair que cette reprsentation est peu efficace.
3.2.5 Comparaison de deux nombres rationnels
Nous avons vu au chapitre prcdent quil tait trs frquent dutiliser une forme rcursive
pour dfinir de nouvelles fonctions. Cette forme rcursive ncessite une dfinition par cas,
un au moins des cas correspondant un cas trivial non rcursif. La dfinition des diffrents
cas implique lexistence de prdicats de comparaison.
La comparaison de deux nombres rationnels pose un problme dlicat d au fait quelle ne
doit pas dpendre de la reprsentation choisie pour les nombre rationnels. La simple com-
paraison de leurs numrateurs et de leurs dnominateurs ne convient pas. En effet, par d-
finition
et on constate quun nombre rationnel est le reprsentant d'une classe d'quivalence. On se
trouve alors confront au choix suivant :
1. soit dfinir un nombre rationnel en lui conservant la forme qu'on lui a donne au
dpart.
2. soit reprsenter systmatiquement un nombre rationnel sous sa forme minimale telle
que son numrateur et son dnominateur sont premiers entre eux.
La deuxime approche est trs simple mettre en oeuvre car elle n'implique que la modifi-
cation du constructeur d'un nombre rationnel. Par contre, elle prsente l'inconvnient, rela-
tif, de traduire le nombre rationnel qu'on lui demande de construire, et nous n'en aurons plus
qu'une forme gale mais pas identique.
Au dpart, notre reprsentation des nombres rationnels a les proprits suivantes
et la dfinition du prdicat rationnels-gaux? doit tre telle que
Les proprits P1 et P2 sont des proprits visibles uniquement du ct des nombres entiers
tandis que la proprit P3 n'est visible que du ct des nombres rationnels. Respecter P3,
c'est construire un ensemble cohrent de nombres rationnels, vouloir respecter P1, P2 et P3,
c'est vouloir, en plus
9
, qu'un nombre rationnel soit une boite deux cases pour y stocker
des nombres entiers.
En ce qui nous concerne nous nous contenterons de respecter P3 et allons modifier le cons-
tructeur rationnel. Pour cela nous allons lgrement adapter notre dfinition d'un nombre
9
Cette confusion des genres conduit souvent des erreurs (bugs) difficiles dtecter et dont les consquen-
ces sont trs difficiles valuer.
q
1
q
2
= ( ) m N
+

n
1
m n
2
= ( ) d
1
m d
2
= ( )
ou
n
2
m n
1
= ( ) d
2
m d
1
= ( )

'

|
(P1) n numrateur rationnel n ( ) d ( ) ( ) = ( ) vrai = :
(P2) d dnominateur rationnel n ( ) d ( ) ( ) = ( ) vrai = :
(P3) rationnels-gaux? rationnel numrateur q ( ) ( ) dnominateur q ( ) ( ) q , ( ) vrai = :
Les Donnes Les Nombres rationnels
- 59 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
rationnel en posant
ce qui conduit une nouvelle fonction de cration
ou bien
Ce serait une erreur grave de choisir une reprsentation minimale puis de concevoir les pr-
dicats de comparaison sur cette hypothse. L'indpendance des oprations vis vis de la re-
prsentation interne ne serait plus respecte et on ne pourrait plus la choisir librement et
ventuellement en changer.
Comme on ne veut pas que la dfinition des prdicats de comparaison dpende de la repr-
sentation interne des nombres rationnels, nous allons faire comme si les nombres rationnels
n'taient pas forcment sous forme minimale et nous allons dfinir les conditions de com-
paraison en consquence
Les prdicats de comparaison associs sont alors,
pour lgalit
pour la supriorit
q
n pgcd n ( ) d ( )
d pgcd n ( ) d ( )
-------------------------------- =
rationnel n d m m numrateur = ( ) n pgcd n ( ) d ( ) , =
m dnominateur = ( ) d pgcd n ( ) d ( ) ,
sinon
__
|
rationnel n d 2
n pgcd n ( ) d ( )
3
d pgcd n ( ) d ( )
=
q
1
q
2
= ( ) n
1
d
2
( ) n
2
d
1
( ) =
q
1
q
2
< ( ) n
1
d
2
( ) n
2
d
1
( ) <
q
1
q
2
> ( ) n
1
d
2
( ) n
2
d
1
( ) >
rationnels-gaux? q
1
q
2

soit : n
1
numrateur q
1
( ) =
d
1
dnominateur q
1
( ) =
n
2
numrateur q
2
( ) =
d
2
dnominateur q
2
( ) =
dans : n
1
d
2
( ) n
2
d
1
( ) =
=
rationnels-sup? q
1
q
2

soit : n
1
numrateur q
1
( ) =
d
1
dnominateur q
1
( ) =
n
2
numrateur q
2
( ) =
d
2
dnominateur q
2
( ) =
dans : n
1
d
2
( ) n
2
d
1
( ) >
=
Les Donnes Barrires d'abstraction
- 60 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
et pour linfriorit
3.3 Barrires d'abstraction
Quoiqu'il en soit, dans les deux cas, on se retrouve dans la situation illustre figure 10, page
60.
L'ide sous-jacente l'abstraction de donnes est de dfinir chaque type de donnes par sa
signature constitue de :
1. lensemble des entits constantes dans ce type ou le constructeur des donnes du
type,
2. l'ensemble des oprations qui permettent d'exprimer toutes les manipulations que
peuvent subir les donnes du type.
3. au moins un prdicat dgalit afin de permettre une dfinition rcursive des fonc-
tions reprsentant les oprations licites pour le type.
L'ensemble des fonctions qui permettent de construire ou manipuler les donnes d'un nou-
veau type dfinit son interface. Les dfinitions de ces fonctions, d'accs public, sont ras-
sembles dans le paquetage associ ce type dit type abstrait de donnes.
La dfinition de paquetages est une mthode de structuration d'application trs efficace car:
1. elle permet de scinder l'application en diffrents domaines indpendants ne commu-
rationnels-inf? q
1
q
2

soit : n
1
numrateur q
1
( ) =
d
1
dnominateur q
1
( ) =
n
2
numrateur q
2
( ) =
d
2
dnominateur q
2
( ) =
dans : n
1
d
2
( ) n
2
d
1
( ) <
=
Figure 10 : Barrires d'abstraction correspondant au type abstrait de donnes : Nombres
rationnels.
rationnels-somme
rationnels-produit
rationnels-inverse
rationnels-gaux?
rationnels-sup?
rationnels-inf?
rationnel numrateur dnominateur
Reprsentation des rationnels en tant
que fonctions & entiers
Dfinition de larithmtique
des rationnels
Nombres rationnels dans le
domaine de lapplication
Les Donnes Qu'est-ce qu'une donne ?
- 61 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
niquant qu' travers des interfaces restreintes et bien dfinies.
2. les interfaces peuvent tre dfinies et utilises avant mme que le paquetage lui-
mme ait t effectivement ralis.
3. les diffrents paquetages constituant l'architecture de l'application peuvent tre ra-
liss en parallle.
L'abstraction par les donnes correspond une stratgie de dveloppement trs puissante
car elle permet de respecter le principe d'engagement minimal. Ce principe stipule qu'il est
prfrable de raliser en premier les parties d'un travail qui sont les moins susceptibles
d'tre remises en cause par un fait nouveau
10
.
Le savoir-faire d'un chef de projet avis rside dans son art d'appliquer ce principe de faon
clairvoyante.
10
En d'autres termes, il n'est jamais bon de prendre des dcisions difficilement rversibles trop tt.
3.4 Qu'est-ce qu'une donne ?
Avant d'explorer d'autres mthodes de composition et d'abstraction de donnes, tirons quel-
ques conclusions des deux exemples prcdents.
Nous avons tout d'abord cr le type de donnes nombres boolen. Pour cela, nous avons
dfini :
1. les deux constantes boolennes vrai et faux, cest dire tous les lments de
lensemble des donnes dfinir,
2. un ensemble d'oprations comme et, ou, pas etc.
Puis nous avons cr le type de donnes nombre rationnel. Pour cela, nous avons dfini :
1. un constructeur de nombres rationnels rationnel. En effet, comme lensemble des
nombres rationnels est infini, il est impossible de dfinir individuellement tous les
nombres rationnels,
2. un ensemble d'oprations rationnels-somme, rationnels-produit etc,
3. les prdicats de comparaison rationnels-egaux?, rationnels-sup? et rationnels-
inf?.
Ces deux types de donnes semblent trs analogues, ils sont cependant conceptuellement
trs diffrents.
Les nombres boolens reprsentent une interprtation particulire d'un type de donnes
primitif, ici la fonction, tandis que le nombre rationnel est construit par assemblage d'l-
ments d'un type existant sans que linterprtation de ceux-ci ne change, ici les entiers. C'est
pourquoi, les nombres boolens ne ncessitent pas de constructeur alors que les nombres
rationnels en exigent un.
On constate donc qu'il existe deux mthodes pour crer un nouveau type de donnes :
1. par changement de linterprtation d'un type existant. Les nombres boolens sont
une nouvelle interprtation de certaines fonctions,
2. par composition (produit cartsien) de types de donnes existant. Les nombres
rationnels sont construits par composition des nombres entiers (qui ne sont quune
nouvelle interprtation de certaines fonctions, Cf. E-23 page 63).
Les Donnes Exercices
- 62 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Nous avons montr que, pour reprsenter des donnes, il suffisait de dfinir un constructeur
et des slecteurs. Mais, rciproquement, est-ce qu'on peut considrer que toute entit ainsi
introduite constitue une donne ?
Nous n'avons pas dfini le constructeur de nombre rationnel et les slecteurs de numrateur
et de dnominateur n'importe comment. En particulier, nous avons pris soin de vrifier que
le prdicat
tait bien toujours vrai dans le cadre des diffrentes reprsentations que nous avons choi-
sies. Plus gnralement, on dira quun type abstrait de donnes est dfinie par un ensemble
de constructeurs et de slecteurs qui doivent vrifier des conditions spcifies.
Nous verrons que cette dfinition du concept de donne va permettre de durcir la program-
mation en introduisant dans les paquetages de donnes des assertions associes aux con-
ditions de validit spcifies. Ces assertions constituent linvariant du type abstrait de
donnes.
Nous verrons un peu plus loin quil peut tre ncessaire galement de dfinir un prdicat
didentification associ un type de donnes.
3.5 Exercices
E-22 On se propose de dfinir lensemble fini des 10 premiers nombres entiers et de construire
une arithmtique traditionnelle sur cet ensemble.
1. En sinspirant de ce qui a t fait propos des nombres boolens, donner une dfinition
pour les 10 nombres entiers compris entre 0 et 9.
2. Dfinir le prdicat zro? tel que zro?(0) = vrai et zro?(n) = faux pour toute autre
valeur de n.
3. Dfinir les fonctions suivant et prcdent partir de la table suivante
4. En dduire une dfinition des fonctions somme et diffrence.
5. En dduire une dfinition des fonction produit, quotient et reste.
6. Que se passerait-il si les fonctions suivant et prcdent taient dfinies partir de
la table suivante ?
rationnels-gaux? rationnel numrateur q ( ) dnominateur q ( ) , ( ) q , ( ) vrai =
n suivant(n) prcdent(n)
0 1
1 2 0
... ... ...
8 9 7
9 8
n suivant(n) prcdent(n)
0 1 9
1 2 0
... ... ...
8 9 7
9 0 8
Les Donnes Exercices
- 63 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
En particulier que peut-on dduire de la dfinition de loppos dun nombre ?
loppos de x not (-x) est tel que
E-23 Cet exercice est difficile mais il constitue un excellent entranement la manipulation de .
Supposons (suivant Alonzo Church) que les nombres entiers positifs soient dfinis par les
fonctions
Un nombre entier n est donc reprsent par n applications successives dune fonction f
un paramtre x.
1. Dfinir la fonction suivant.
2. Dfinir la fonction somme.
3. Dfinir la fonction produit.
4. Dfinir le prdicat zro? qui rend vrai lorsque son argument n est le nombre 0 (vrai
tant la constante boolenne que nous avons dfinie au dbut de ce chapitre).
E-24 Reprenons l'exercice E-15 du chapitre Les Fonctions. Pour rendre la fonction monnaie
plus gnrale, on va utiliser l'ensemble des pices utiliser ainsi que la quantit des pices
disponibles pour chaque valeur.
1. Quelle type de donnes peut-on utiliser pour reprsenter les pices disponibles ?
2. Quelle type de donnes peut-on utiliser pour reprsenter le rsultat de la conversion ?
3. En utilisant les types de donnes identifis aux questions prcdentes, redfinir la fonc-
tion monnaie.
x ( ) x + 0 =
0 fx x =
1 fx f x ( ) =
2 fx f f x ( ) ( ) =
3 fx f f f x ( ) ( ) ( ) =

Les Donnes Exercices


- 64 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
E-25 On se propose de construire un paquetage pour larithmtique des nombres inexacts
11
com-
portant 4 chiffres significatifs partir de celle des nombres entiers. Pour cela, on va dfinir
un type abstrait de donnes pour reprsenter ces nombres virgule sous la forme dune
mantisse et dun exposant.
La mantisse reprsente la valeur comprise entre 0,1 et 0,9999 qui multiplie par une puis-
sance de 10 gale lexposant donne le nombre reprsenter.
Par exemple
La valeur absolue de la forme interne de la mantisse est toujours comprise entre 1000 et
9999 tandis que la valeur de lexposant sajuste en consquence. On appellera cette repr-
sentation : forme normalise.
1. Dfinir le type abstrait de donnes Rels par son constructeur rel. Les valeurs de la
mantisse et de lexposant donnes correspondent pas forcment une forme normali-
se, mais la reprsentation interne, elle, doit toujours ltre.
2. Dfinir les slecteurs mantisse et exposant.
3. Dfinir les trois prdicats gaux?, suprieur? et infrieur?.
3. Dfinir les fonctions addition, soustraction, multiplication et division.
Nota: toute mantisse devenant, mme temporairement, suprieure 9999 est consid-
re comme perdue. On supposera que la fonction quotient sur les entiers existe.
11
Un nombre est dit inexact sil nest pas calculable. Les nombres entiers et les nombres rationnels sont
calculables, tandis que les nombres irrationnels et plus gnralement rels ne le sont pas.
* la valeur de la mantisse est tronque, pas arrondie.
E-26 Les physiciens manipulent des formules qui mettent en prsence des constantes sans dimen-
sions (nayant aucune unit) et des grandeurs physiques associes des units.
On utilise, en gnral, des systmes dunits cohrents cest dire dans lesquels toutes les
units drivent de 3 units de base:
unit de masse note M,
unit de longueur note L,
unit de temps note T.
Par composition multiplicative, ces trois units de base permettent de reconstruire toutes les
autres units. Par exemple
lunit de vitesse est dnote (mtres par seconde),
lunit dacclration est dnote (mtres par seconde par seconde),
lunit de surface est dnote (mtres carr),
les nombres
sont reprsents par
mantisse* exposant
12,456 1245 -2
0,00045 4500 -7
1234578956 1234 6
L T
1

L T
2

L
2
Les Donnes Exercices
- 65 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
lunit de volume est dnote (mtres cube).
Les units se dduisent de lexpression de dfinition de la grandeur physique. Par exemple
lunit de force est dnote car la force est dfinie par la formule de
Newton :
lunit de pression est dnote car la pression est dfinie comme une
force par unit de surface.
Sachant que depuis que nous sommes tout petit, on nous a appris ne pas mlanger les tor-
chons et les serviettes (cest dire nadditionner ou ne soustraire que des grandeurs de m-
mes units), il est important, pour un physicien de vrifier lhomognit des formules quil
utilise.
1. Dfinir le type de donnes Dimensions qui associe les puissances associes M, L et T
dans la construction de lunit dune grandeur physique. Par exemple, une masse serait
reprsente par le triplet <1,0,0>, une vitesse par le triplet <0,1,-1>. Dfinir alors le
constructeur units-physiques.
Nota: on ne reprsente que les units de la grandeur physique, pas sa valeur.
2. Dfinir les slecteurs masse, longueur et temps qui rendent les composantes de
lunit associe la grandeur physique g.
3. Dfinir le prdicat compatibles? rendant vrai lorsque les deux grandeurs physiques
g1 et g2 sont reprsentes par les mmes units.
4. Dfinir les fonctions multiplier et diviser qui rendent les units des grandeurs phy-
siques obtenues par multiplication et par division.
5. Dfinir les fonctions additionner et soustraire qui soit rendent les units des gran-
deurs physiques obtenues par addition ou soustraction, soit rendent le symbole units-
incompatibles.
6. A titre dexemple, crire les expressions de dfinition de la gpsd (grandeur physique
sans dimensions), masse, longueur, temps, puis surface, vitesse et force. Si vos souve-
nirs de physique le permettent crire les expressions de dfinition de nergie-poten-
tielle et nergie-cintique.
L
3
M L T
2

force masse a cclration =
M L
1
T
2

- 66 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
4. Les Structures.
Le chapitre prcdent a montr comment on pouvait introduire des donnes en soi, cest
dire des donnes pouvant tre interprtes concrtement. Les nombres peuvent reprsen-
ter des quantits, les boolens peuvent reprsenter des faits (logique des prdicats), des tats
physiques (niveaux de tension ou de courant pour les lectroniciens) les rationnels peuvent
tre associs aux fractions et reprsenter des oprations de dcoupage et de combinaison.
Bref, les donnes peuvent tre considres comme des choses en soi.
Nous allons, prsent, nous intresser des choses pour organiser les choses, cest dire
des choses qui nexistent que dans la mesure o on dispose de choses en soi organiser.
Nous parlerons alors de structures. Les structures prsentent un caractre dabstraction vi-
dent ce qui va rendre leur manipulation un peu plus dlicate.
Nallez pas croire que nous abordons, enfin, des problmes dinformaticien. La notion de
structure est prsente partout dans ce qui nous entoure. Pour vous en convaincre essayez de
dfinir ce quest une pomme ou une bouteille. Dcrire la matire qui constitue ces objets est
trs insuffisant, il faut, de plus, dcrire comment cette matire de pomme ou cette matire
de bouteille est organise. Les proprits des objets les plus courants sont ainsi dcrites par
leur structure.
4.1 Structures de donnes.
Lorsque quune association de donnes nest dfinies que par un constructeur et des slec-
teurs, on dira quelle constitue une structure de donnes. Une structure est beaucoup plus
simple dfinir quun type puisquil nest pas ncessaire de lui trouver un invariant, ni de
lui dfinir des oprations selon un schma thorique bien tabli. On en utilisera donc sou-
vent, choisies parmi les 5 modles suivants :
1. Paire (2-uplet),
2. Enregistrement (n-uplet),
Les Structures. La Paire (2-uplet).
- 67 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
3. Tableau (n-uplet),
4. Liste,
5. Arbre.
De telles structures peuvent tre utilises pour la reprsentation interne dun type de don-
nes et toute application un peu srieuse manipule des donnes composes par association
d'un nombre fixe ou variable de donnes plus lmentaires.
Par exemple :
1. La mcanique localise les points par le vecteur de leurs coordonnes qui sont des
nombres rels.
2. La gomtrie utilise des ensembles de points dfinis par leurs coordonnes pour
dfinir des polygones complexes.
3. Les mathmatiques dfinissent des nombres de plus en plus riches en associant des
nombres d'un niveau d'abstraction infrieur. Nous avons vu les rationnels construits
par l'association de deux entiers, on connat les complexes construits par l'associa-
tion de deux rels.
4. La gestion construit des enregistrements permettant de reprsenter un article de
stock, un salari, un bulletin de paye, etc.
5. La gestion construit galement des ensembles de salaris, darticles, etc.
6. Les statistiques reprsentent des populations par des multi-ensembles dindividus.
7. etc.
4.2 La Paire (2-uplet).
La Paire
1
est la simple association de deux lments quelconques. Nous lavons dj ren-
contre lorsque nous avons construit les nombres rationnels (1re version). Nous verrons
que son importance est capitale par la varit et la richesse des usages quon pourra en
avoir.
Son constructeur, dont le nom cons est universellement reconnu, peut tre dfini par
Le premier lment de la paire est traditionnellement
2
appel son car, tandis que le deuxi-
me en est le cdr. Les fonctions de slection correspondantes sont
La Paire est principalement utilise
1. pour la construction de doublets,
1
Pour clarifier le discours, nous dsignerons les types et les structures de donnes que nous dfinirons par
un nom commenant par une majuscule et typographi en Gras.
2
Les noms cons, car et cdr (certains prononcent could-er) ont une origine historique lointaine. Ce
sont les noms des deux instructions machine utilises pour la premire implmentation sur IBM 704 du
langage Lisp qui a popularis les paires et les listes qui en dcoulent et que nous verrons un peu plus loin.
.
cons x y b b x y , =
car p p vrai ( ) =
cdr p p faux ( ) =
Les Structures. LEnregistrement (n-uplet).
- 68 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
2. pour la construction dassociations analogues celle qui nous
permettent depuis le dbut de dfinir des variables,
3. pour la construction des listes que nous verrons plus loin.
On associe souvent la paire un petit dessin qui permet de visualiser les constructions quon
peut faire avec
La flche utilise dans ce schma pointe sur le contenu de la boite car ou de la boite cdr. On
appelle donc souvent cette flche un pointeur.
Disposant de la paire, on peut redfinir le constructeur des nombres rationnels
tandis que les slecteurs de numrateur et de dnominateur deviennent
La paire joue un rle fondamental car cest lassociation de donnes la plus simple quon
puisse concevoir. Ce sera la brique de base de pratiquement toutes les associations de don-
nes.
4.3 LEnregistrement (n-uplet).
Nous appellerons Enregistrement la simple association d'un nombre fixe et constant de
donnes de n'importe quel type ou structure, primitif ou non. Cest une simple gnralisa-
tion de la paire que nous venons de voir.
Par exemple
sont des structures au mme titre que
Constructeur dEnregistrements
La fonction de construction dun enregistrement peut tre directement dduite de celle que
nous avons utilise pour construire les paires car elle ne fait aucune hypothse sur les pro-
prits des donnes associes.
Dfinissons, par exemple, la structure de donnes Salari utilise dans le cadre dune ap-
plication de gestion du personnel au sein dune entreprise. Le constructeur dun salari peut
nom valeur ( )
ou
cdr
car
cdr car
rationnel n d cons n ( ) d ( ) =
numrateur q car q ( ) =
dnominateur q cdr q ( ) =
Church Alonzo 1903 Washington USA , , , ( , )
Kleene Stephen 1909 Hartford USA , , , ( , )
10 20 516 31 8 , , , ( , )
Les Structures. LEnregistrement (n-uplet).
- 69 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
tre la fonction
On dit souvent que les symboles de dsignation utiliss dfinissent chacun un champ de
lenregistrement. Nous pouvons, ainsi, dfinir un premier salari
soit
puis un deuxime
ces deux salaris, ainsi que tous ceux que lon dfinirait ainsi, sont reprsents par des ob-
jets-fonction acceptant les messages nom, prnom, date-naissance et fonction.
Slection dun Champ dans un Enregistrement
Le mcanisme de slection est, comme prcdemment, inclus dans lobjet-fonction repr-
sentant la donne. Dans le cadre de lexemple prcdent, on peut dfinir les fonctions de
slection suivantes
et on peut alors vrifier que
Lenregistrement est la structure de donne la plus rustique quon puisse concevoir, mais
elle est dune telle gnralit quon peut lutiliser pour organiser de trs nombreuses appli-
cations.
salari n p d f m m nom = ( ) n , =
m prnom = ( ) p ,
m date-naissance = ( ) d ,
m fonction = ( ) f ,
sinon
__
|
s
1
salari Church Alonzo 1903 Logicien , , , ( ) =
s
1
m m nom = ( ) Church , =
m prnom = ( ) Alonzo ,
m date-naissance = ( ) 1903 ,
m fonction = ( ) Logicien ,
sinon
__
|
s
2
salari Kleene Stephen 1909 Logicien , , , ( ) =
nom s s nom ( ) =
prnom s s prnom ( ) =
date-naissance s s date-naissance ( ) =
fonction s s fonction ( ) =
nom s
1
( ) Church =
fonction s
1
( ) Logicien =
nom s
2
( ) Kleene =
Les Structures. Le Tableau (n-uplet).
- 70 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
4.4 Le Tableau (n-uplet).
Dans certains cas, on peut ne pas vouloir faire jouer un rle particulier certains des champs
dune association de diffrentes donnes. Dans ce cas, le plus simple est de leur affecter un
simple numro. Une telle association est appele Tableau.
Le tableau est donc le cas particulier de structure o la dnomination des champs utilise des
nombres entiers. On pourra alors utiliser larithmtique pour manipuler cette dnomination.
Constructeur de Tableaux
Le constructeur de tableaux peut se dduire immdiatement du constructeur denregistre-
ments. Dfinissons, par exemple, le constructeur
3
pour un tableau de 4 lments
puis construisons quelques tableaux de 4 nombres
Ces tableaux sont des objets-fonction acceptant les messages 1, 2, 3 et 4.
Slection dun Champ dans un Tableau
Le mcanisme de slection tant inclus dans le constructeur et les messages accepts par les
tableaux tant des nombres entiers (les numros de champ), la slection dun champ est
donc immdiate
Dans le cas particulier des tableaux, le mcanisme de transmission de message se traduit
par une formulation tout fait habituelle et on ne dfinit pas de fonction de slection.
Dtermination de la Taille dun Tableau
La forme particulire donne la dnomination des champs de tableau permet dimaginer
une fonction universelle rendant la taille dun tableau quelconque. Pour cela, il suffit de re-
marquer que tous les lments dun tableau ont une valeur et que les numros de champs
sont des entiers conscutifs.
3
Ce constructeur suppose que le numro de la premire composante du tableau est 1. On pourrait consid-
rer, tout aussi bien, que ce numro est 0.
tableau[4] x
1
x
2
x
3
x
4
i i 1 = ( ) x
1
, =
i 2 = ( ) x
2
,
i 3 = ( ) x
3
,
i 4 = ( ) x
4
,
sinon
__
|
t
1
tableau[4] 1 2 3 4 , , , ( ) =
t
2
tableau[4] 10 20 30 40 , , , ( ) =
t
3
tableau[4] 100 200 300 400 , , , ( ) =
t
1
1 ( ) 1 =
t
2
2 ( ) 20 =
t
3
3 ( ) 300 =
t
1
6 ( )
__
| =
Les Structures. Le Filtrage et les Fonctions non curryfies
- 71 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Dans ces conditions
4.5 Le Filtrage et les Fonctions non curryfies
Si le mcanisme le plus lmentaire ne permet que dintroduire que des fonctions un seul
argument, les premires fonctions que nous avons introduite en avait plusieurs. Pour unifier
ces deux points de vue, nous avons introduit la curryfication des fonctions et le paramtre
structur dune fonction non curryfie. Cela signifie-t-il quil existe un mcanisme cach
pour structurer les paramtres ?
Heureusement, il nen est rien et ce que nous avons vu va nous permettre de le montrer sur
un exemple.
Reprenons la dfinition que nous avons introduite pour une addition non curryfie
sa version curryfie serait
Nous pouvons dfinir une fonction add un seul argument en regroupant les deux op-
rande de laddition dans une paire et poser
Lapplication de cette fonction au deux arguments 3 et 4 scrit alors
Nous disposons donc de tous les lments pour dfinir des fonctions non curryfie. Cepen-
dant, la lourdeur dune telle criture va nous amener en introduire une forme plus convi-
viale.
Nous noterons le rsultat de la construction dune paire
et plus gnralement, nous noterons la construction dun enregistrement ou
dun tableau.
On utilisera alors les critures quivalentes suivantes
et plus gnralement, si on suppose que le constructeur dun tableau est la fonction n-
tableau-taille t
soit-rec : taille n t n ( )
__
| = ( ) 0 1 taille n 1 + ( ) + ( ) , =
dans : taille 1 ( )
=
add
nc
x y ( , ) x y + =
add
c
x y x y + =
add p car p ( ) cdr p ( ) + =
add cons 3 ( ) 4 ( ) ( )
cons a ( ) b ( ) a b ( , ) =
a b c , , ( , )
add cons 3 ( ) 4 ( ) ( ) add 3 4 , ( )
add p car p ( ) cdr p ( ) + =
add x y , ( ) x y + =
Les Structures. La Liste & le Chanage des Paires
- 72 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
uplet.
Ce style dcriture qui permet de dfinir des fonctions non curryfies sappelle accs aux
paramtres dune fonction par filtrage. Ce style dcriture est tellement commode que nous
ltendrons chaque fois que nous en auront loccasion.
Ce style est caractris par le fait quon utilise la mme forme syntaxique pour exprimer le
constructeur dune structure (en argument dune fonction) que pour exprimer lutilisation
des slecteur de cette mme structure (en paramtre dune fonction).
4.6 La Liste & le Chanage des Paires
La Liste est lassociation d'un nombre variable de donnes de n'importe quel type ou struc-
ture, primitif ou non. Cest une utilisation particulire de la Paire et la liste ne constitue pas,
proprement parler, une structure, mais plutt une discipline dutilisation de la paire.
Par convention: une liste est constitue uniquement de paires dont le car
4
est la donne
placer dans la liste et dont le cdr est la suite de la liste. La cdr de la dernire paire est . Une
telle construction constitue une liste bien forme.
Les dfinitions mettant en jeu des listes font un usage intensif des fonctions car, cdr et
des compositions de ces deux fonctions. On a donc introduit des abrviations associes
ces compositions.
Dans une composition de car et cdr, chaque occurence de car est note a et chaque
occurence de cdr est note d. Le rsultat de la composition est encadre par c et r.
Par exemple
Par exemple, la liste bien forme l des nombres 3, 5, 6, et 9 est construite uniquement en
utilisant la fonction cons
4
Le choix de car comme rcipient de la donne correspond une facilit de ralisation de la premire
implmentation du langage Lisp.
add n-uplet 3 ( ) 4 ( ) 5 ( ) ( ) ( ) add 3 4 5 , , , ( )
add p p 1 ( ) p 2 ( ) p 3 ( ) + + + =
add x y z , , , ( ) x y z + + + =
car cdr L ( ) ( ) cadr L ( )
car cdr cdr L ( ) ( ) ( ) caddr L ( )
car cdr car L ( ) ( ) ( ) cadar L ( )
L cons 3 cons 5 cons 6 cons 9
__
| , ( ) , ( ) , ( ) , ( ) =
Les Structures. La Liste & le Chanage des Paires
- 73 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Cette liste L est telle que
On appelle, en gnral, tte de la liste l la quantit car(l) et queue de la liste l la quantit
cdr(l). On remarque alors que la queue dune liste est encore une liste ce qui permet de don-
ner une dfinition rcursive de la liste
Cette faon de noter la dfinition des structure rcursive est appele BNF (Backus Naur
Form). Dans cette criture le symbole ::= signifie est de la forme et le signe | signifie ou.
Afin de soutenir nos raisonnements, on utilisera frquement deux autres reprsentation
dune liste: une reprsentation textuelle et une reprsentation graphique (Cf. figure 11, page
73).
Filtrage sur une Liste
Les fonctions dfinies sur les listes ncessitent trs frquemment den sparer la tte de la
queue. Nous utiliserons alors une autre reprsentation de la paire en notant
On utilisera aussi les simplifications suivantes
Figure 11 : Diffrentes reprsentations dune liste. Nota: Ne pas confondre une paire
en notation pointe et une liste deux lments.
car L ( ) 3 =
cdr L ( ) cons 5 cons 6 cons 9
__
| , ( ) , ( ) , ( ) =
cadr L ( ) 5 =
cddr L ( ) cons 6 cons 9
__
| , ( ) , ( ) =
caddr L ( ) 6 =
cdddr L ( ) cons 9
__
| , ( ) =
cadddr L ( ) 9 =
cddddr L ( )
__
| =
liste < > tte < > queue < > ::=
queue < > liste < >
__
| | ::=
tte < > donne quelconque ::=
a b c d
L L [a b c d]
L = cons(a,cons(b,cons(c,cons(d,))))
tte(L)
tte(L) = a
queue(L) = [b c d]
queue(L)
cons a ( ) b ( ) a b [ ]
a b c L [ ] [ ] [ ] a b c L [ ]
a [ ] a [ ]
a b c [ ] [ ] [ ] a b c [ ]
Les Structures. La Liste & le Chanage des Paires
- 74 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Dtermination de la Taille dune Liste
La nature rcursive de la dfinition dune liste permet de dfinir, par induction, une fonction
rendant la taille dune liste
Cette dfinition suppose lexistence du prdicat vide? quil est facile de dfinir
A titre dexemple, valuons lexpression . Cette valuation entra-
ne la construction des quations
dont la rsolution donne
Pour dfinir la fonction taille-liste, nous avons utilis une technique trs utile pour la mani-
pulation des listes : suivre la queue. Cette technique va nous permettre de dfinir de nom-
breuses oprations sur les listes.
Renversement dune Liste
Suivre la queue dune liste entrane un ordre implicite entre les donnes de la liste. Il peut
tre utile de renverser cet ordre et pour cela dfinissons la fonction renverser.
Cette dfinition est (relativement) facile imaginer si on considre que renverser une liste
est une opration pouvant tre reprsente par le schma de la figure 12, page 74.
Tout au long du renversement le nombre des lments dans la liste de dpart ajout au nom-
bre des lments de la liste darrive est constant. On peut donc dcrire cette opration par
un invariant
En effet, la boite pose au sommet de la pile qui reprsente la liste peut tre re-
Figure 12 : Renversement dune liste. On imagine que la liste est une pile de boite quon
reconstruit cot.
taille-liste x L [ ] vide? x L [ ] ( ) 0 1 taille-liste L ( ) + , =
vide? L L
__
| = ( ) =
taille-liste a b c [ ] ( )
taille-liste a b c [ ] ( ) 1 taille-liste b c [ ] ( ) + =
taille-liste b c [ ] ( ) 1 taille-liste c [ ] ( ) + =
taille-liste c [ ] ( ) 1 taille-liste
__
| ( ) + =
taille-liste
__
| ( ) 0 =
taille-liste a b c [ ] ( ) 3 =
Dpart
3 : Arrive
1 2
invariant x L
1
[ ] L
2
, ( ) invariant L
1
x L
2
[ ] , ( ) =
x L
1
[ ]
Les Structures. La Liste & le Chanage des Paires
- 75 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
prsente par x et poser une boite sur la pile qui reprsente la liste peut tre dcrit par
.
Au dpart, on est dans la configuration
et larrive, dans la configuration
La dfinition de la fonction renverser est alors
Construction dune Liste ordonne
Avant de pouvoir renverser lordre dune liste, il faut pouvoir construire une liste ordonne.
Une telle opration rend, partir dune liste donne et dun lment donn, la liste telle que
cet lment se trouve sa place. On dira quon insre llment.
Par exemple
La place laquelle doit se retrouver un lment insrer est dtermine par le prdicat d-
finissant la relation dordre dsire.
Dfinissons, par exemple, une fonction dinsertion pour ordonner des nombres entiers par
ordre croissant. Un nombre x est sa place si les deux conditions suivantes sont satisfai-
tes simultanment
La dfinition de la fonction insrer, dans ce cas, est alors
A titre dexemple, valuons
et
L
2
x L
2
[ ]
invariant L
__
| , ( )
invariant
__
| , ( )
renverser L
soit-rec : inv x L
1
[ ] L
2

.
= vide? x L
1
[ ] ( ) L
2
,
sinon inv L
1
x L
2
[ ] , ( )
dans : inv L
__
| , ( )
=
insre 7 2 5 8 [ ] , ( ) 2 5 7 8 [ ] =
x suivant-dans-la-liste n ( ) < ( ) vrai =
x prcdent-dans-la-liste n ( ) < ( ) faux =
insrer x y L [ ] ( , ) vide? y L [ ] ( ) x [ ] , =
x y > ( ) y insrer x L , ( ) [ ] ,
sinon x y L [ ]
insre 7 2 5 8 [ ] , ( ) cons 2 insrer 7 5 8 [ ] , ( ) , ( ) =
insre 7 5 8 [ ] , ( ) cons 5 insrer 7 8 [ ] , ( ) , ( ) =
insre 7 8 [ ] , ( ) cons 7 8 [ ] , ( ) =
insre 7 2 5 8 [ ] , ( ) cons 2 cons 5 cons 7 8 [ ] , ( ) , ( ) , ( ) =
2 5 7 8 [ ] =
Les Structures. La Liste & le Chanage des Paires
- 76 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Projection dune Liste
Projeter une liste consiste construire une autre liste dont tous les lments sont le rsultat
de lapplication dune fonction darit 1 ( 1 paramtre) tous les lments de la liste don-
ne
Par exemple
La dfinition de la fonction projeter est (assez) facile trouver par induction
Rduction dune Liste
Rduire une liste consiste valuer lexpression quon obtiendrait en appliquant par la
gauche une fonction darit 2 ( 2 paramtres) aux lments de la liste
Par exemple
La dfinition de la fonction rduire est facile trouver par induction
On peut, titre dexemple, valuer ce qui conduit aux qua-
tions
Lorsque loprateur utilis pour la rduction est associatif, cette opration revient insrer
cet oprateur entre chaque lments de la liste complte de llment neutre de loprateur.
Produit interne de deux Listes
Le produit interne
5
nest pas lie lopration de multiplication mais une faon de com-
biner deux ensembles pour en construire un troisime. Le produit interne est donc lopra-
tion entre les deux ensembles et , supposs avoir le
5
Attention, dans les ouvrages mathmatiques franais, produit interne est lautre nom du produit scalaire.
Les anglo-amricains traduisent produit interne par dot-product ou inner-product.
projeter a
1
a
i
[ ] f , ( ) f a
1
( ) f a
i
( ) [ ] =
projeter 1 2 3 4 [ ] x , x x ( ) ( ) 1 4 9 16 [ ] =
projeter x L [ ] f ( , ) vide? x L [ ] ( )
__
| cons f x ( ) projeter L f , ( ) , ( ) , =
rduire f a
0
a
1
a
i
[ ] , , ( ) f a
1
f f , a
i
f f a
0
, ( ) , ( ) , ( ) ( ) , ( ) =
rduire + 0 10 20 30 [ ] , , ( ) 10 20 30 0 + ( ) + ( ) + =
60 =
rduire f e x L [ ] , , ( ) vide? x L [ ] ( ) e f x rduire f e L , , ( ) , ( ) , =
rduire 0 10 20 30 [ ] , , ( )
rduire 0 10 20 30 [ ] , , ( ) 10 rduire 0 20 30 [ ] , , ( ) =
rduire 0 20 30 [ ] , , ( ) 10 20 rduire 0 30 [ ] , , ( ) ( ) =
rduire 0 30 [ ] , , ( ) 10 20 30 rduire 0 [ ] , , ( ) ( ) ( ) =
rduire 0 [ ] , , ( ) 10 20 30 0 ( ) ( ) =
10 20 30 ( ) ( ) =
10 10 ( ) ( ) =
20 =
E e
i
, , { } = F f
i
, , { } =
Les Structures. La Liste & le Chanage des Paires
- 77 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
mme nombre dlments, dont la dfinition est .
Afin de matrialiser cette opration, on lui associe une fonction darit 2 applique tous
les lments de lensemble produit.
Nota: Cela revient simplement inclure dans la dfinition du produit interne la projection
quon ne manquerait pas deffectuer sur lensemble produit.
Par exemple
6
Le produit scalaire de deux vecteurs peut tre dfini comme la rduction par addition du
produit interne par multiplication des deux listes qui reprsentent les deux vecteurs
Si on suppose que les deux listes sont de mme taille, la dfinition de la fonction de produit
interne que nous utiliserons est
Produit externe de deux Listes
La notion de produit externe
7
nest pas non plus lie la notion de multiplication mais la
faon de combiner deux ensembles pour en construire un troisime nomme produit cart-
sien. Le produit externe est donc lopration entre les deux ensembles
et dont la dfinition est . Dans le
cas du produit externe, les deux ensembles nont pas ncessairement le mme nombre
dlments.
Afin de matrialiser cette opration, on lui associe, comme dans le cas du produit interne,
une fonction darit 2 applique tous les lments de lensemble produit.
Par exemple
Pour trouver la dfinition du produit externe, il est important de faire les remarques suivan-
tes :
1. le rsultat est une liste de listes.
2. chaque sous-liste du rsultat est le rsultat dune projection sur la deuxime liste.
6
Pour clarifier lcriture les listes sont prsentes verticalement.
7
Attention, dans les ouvrages mathmatiques franais, produit externe est lautre nom du produit vecto-
riel. Les anglo-amricains traduisent produit externe par cross-product ou outer-product.
E F e
i
f
i
, ( ) , , { } =
prod-int cons
jean
paul
jacques
1 70 ,
1 72 ,
1 68 ,
, , ( )
jean 1 70 , [ ]
paul 1 72 , [ ]
jacques 1 68 , [ ]
=
produit-scalaire v
1
v
2
( , ) rduire + 0 prod-int , , v ,
1
v
2
, ( ) ( ) =
prod-int f x
1
L
1
[ ] , x
2
L
2
[ ] ( , ) vide? x
1
L
1
[ ] ( )
__
| , =
sinon f x
1
x
2
, ( ) prod-int f L ,
1
L
2
, ( ) [ ]
E e
i
, , { } =
F f
i
, , { } = E F e
i
f
j
, ( ) i j , | , , { } =
prod-ext cons
1
2
3
a
b
c
d
, , ( )
1 a [ ] 1 b [ ] 1 c [ ] 1 d [ ]
2 a [ ] 2 b [ ] 2 c [ ] 2 d [ ]
3 a [ ] 3 b [ ] 3 c [ ] 3 d [ ]
=
Les Structures. Les Nuds & les Arbres binaires.
- 78 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
3. si est la fonction utilise pour dfinir le produit externe, la
fonction utilise pour la projection est
Ces remarques faites, on peut trouver (pas trs facilement) la dfinition de la fonction
prod-ext sous la forme
Par exemple
4.7 Les Nuds & les Arbres binaires.
Le nud est une extension peu connue de la paire car son seul intrt est de permettre la
construction des arbres binaires qui eux sont trs connus.
4.7.1 Les Nuds
Le constructeur du nud peut tre la fonction
les slecteurs correspondant sont alors
Un nud est souvent associ la reprsentation graphique suivante
En fait, on prfre souvent pour le Nud la dfinition suivante
f x y xy =
g x y xy [ ] l
1i
( ) f l
1i
( ) y l
1i
y = = =
prod-ext f L
1
L
2
, ( , ) projeter x projeter y f x y , ( )
[ ]
L ,
2
( )
[ ]
L
1
, ( ) =
prod-ext +
0
1
2
3
0
1
2
3
, , ( )
0 1 2 3
1 2 3 4
2 3 4 5
3 4 5 6
=
nud g d a m m gauche = ( ) g , =
m droite = ( ) d ,
m atome = ( ) a ,
sinon
__
|
droite n n droite ( ) =
gauche n n gauche ( ) =
atome n n atome ( ) =
atome
frre
gauche
frre
droite
nud g d a , ( , ) g d a [ ] =
Les Structures. Les Nuds & les Arbres binaires.
- 79 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
les slecteurs correspondant tant
4.7.2 Les Arbres binaires.
Le nud est llment de base pour la construction des arbres binaires dans lequel il appa-
raitra sous deux formes. Un tel arbre est la structure hirarchique reprsente par le schma
de la figure 13, page 79.
La racine est le nud auquel saccroche toute la structure. Les feuilles sont les nuds qui
terminent un chemin. Les nuds proprement parler reprsentent les embranchements.
Cet arbre est dit binaire car chaque embranchement ne possde que deux branches. Les
atomes quil est possible daccrocher aux diffrents nuds vont servir de dcoration.
Les arbres binaires sont des structures particulirement efficaces pour reprsenter des col-
lections dobjets ordonns. En effet, nous avons dj rencontr de telles collections lorsque
nous avons dfini la fonction insrer qui permettait de construire une liste ordonne, mais
le temps ncessaire la recherche dun lment dans une telle liste est dordre . Con-
sidrons, par exemple, la collection organise de la manire dcrite figure 14, page 79.
La recherche dun lment peut tre conduite ainsi :
si llment cherch est infrieur latome du nud, on le recherche dans le sous-
droite g d a [ ] d =
gauche g d a [ ] g =
atome g d a [ ] a =
Figure 13 : Structure dun arbre binaire.
Figure 14 : Collection dentiers ordonns.
Racine
Feuilles
Nuds
n O( )
7
3 9
1 5
11
Les Structures. Les Nuds & les Arbres binaires.
- 80 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
arbre de gauche tandis que sil est suprieur, on le recherche dans le sous-arbre de
droite.
Ainsi, chaque tape on divise par deux lensemble de recherche et le temps de recherche
est dordre . Ceci, bien sr, si larbre est quilibr, cest dire harmonieusement
rparti entre la droite et la gauche. Cette stratgie de rsolution est souvent appele diviser
pour rgner.
Dire quun arbre reprsente des chemins nest pas fortuit car nous verrons que limage dun
parcours dans larbre est une reprsentation trs commode de lutilisation quon va en avoir.
4.7.3 Recherche dans un Arbre binaire
Dfinissons le prdicat appartient? qui rend vrai si un lment donn se trouve dans un
arbre
avec
4.7.4 Construction dun Arbre binaire
La construction dun arbre est une opration assez dlicate aussi allons-nous en expliquer
les dtails.
La dfinition de la fonction adjoindre permettant de rajouter un lment x dans un arbre
a de telle sorte que ses atomes soient organiss selon le schma prcdent sobtient par in-
duction.
Si larbre est vide, il faut crer un nud-racine datome x sans frre gauche ni frre droite.
Si larbre nest pas vide, trois possibilits se prsentent :
1. llment x est latome de la racine de larbre a. Il nest pas ncessaire de construire
un arbre diffrent de a.
2. llment x est infrieur latome de la racine de a. Il faut alors construire un nouvel
arbre dont la racine a le mme atome, dont la branche de droite est identique et dont
la branche de gauche est la branche de gauche prcdente laquelle on a adjoint
llment x.
3. llment x est suprieur latome de la racine de a. Il faut alors construire un nou-
vel arbre dont la racine a le mme atome, dont la branche de gauche est identique et
dont la branche de droite est la branche de droite prcdente laquelle on a adjoint
llment x.
n log O( )
appartient? x A ( , ) arbre-vide? A ( ) ( ) faux , =
x atome A ( ) = ( ) vrai ,
x atome A ( ) < ( ) appartient? x gauche A ( ) , ( ) ,
x atome A ( ) > ( ) appartient? x droite A ( ) , ( )
arbre-vide? A A
__
| = ( ) =
Les Structures. Les Nuds & les Arbres binaires.
- 81 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
La dfinition de la fonction adjoindre est alors
On peut illustrer ce mcanisme en dessinant les arbres obtenus successivement par adjonc-
tion de 3, 5, 1, 7 et 9 (Cf. figure 15, page 81).
4.7.5 Les Parcours dun Arbre binaire.
Parcourir un arbre, cest construire une liste de tous les atomes associs aux diffrents
nuds. Il existe diffrentes manire deffectuer ce parcours:
1. en profondeur par la gauche, ce qui donne une liste des atomes classs par ordre
croissant.
2. en profondeur par la droite, ce qui donne une liste des atomes classs par ordre
dcroissants.
On nutilise pas forcment une fonction de parcours dfinie comme nous allons le faire,
mais les dfinitions que nous allons donner peuvent servir inspirer la dfinition de fonc-
tions de parcours adaptes une application particulire.
Parcours par la gauche
Le parcours par la gauche consiste explorer la branche de gauche de larbre avant de
consulter latome de la racine puis explorer la branche de droite. Ce parcours est souvent
appel parcours gauche-racine-droite.
La dfinition de la fonction de parcours est
La fonction concatner (Cf. exercice E-36) construit la liste en plaant dans une mme
liste et dans le mme ordre les lments de deux listes donnes.
Parcours par la droite
Le parcours par la droite consiste explorer la branche de droite de larbre avant de con-
sulter latome de la racine puis explorer la branche de gauche. Ce parcours est souvent
appel parcours droite-racine-gauche.
Figure 15 : Construction dune collection dentiers ordonns.
adjoindre =
x A ( , ) arbre-vide? A ( ) ( ) nud
__
|
__
| x , , ( ) ,
x atome A ( ) = ( ) A ,
x atome A ( ) < ( ) nud adjoindre x gauche A ( ) , ( ) droite , A ( ) atome A ( ) , ( ) ,
x atome A ( ) > ( ) nud gauche A ( ) adjoindre , x droite A ( ) , ( ) atome A ( ) , ( )
3
5
3
5
3
1
5
3
1
7
5
3
1
7
9
grd a arbre-vide? a ( )
__
| , =
sinon concatner grd gauche a ( ) ( ) cons atome a ( ) grd droite a ( ) ( ) , ( ) , ( )
Les Structures. Codage de Huffman & utilisation des arbres binaires
- 82 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
La dfinition de la fonction de parcours est
4.8 Codage de Huffman & utilisation des arbres binaires
Lorsquon veut transmettre ou enregistrer des donnes, il est ncessaire de dfinir un coda-
ge rendant compatible la reprsentation des donnes et le support physique utilis (conduc-
teurs lectriques, diples magntiques etc.). Actuellement, la technologie que nous
matrisons le mieux (llectronique) incite utiliser un codage binaire qui reprsente les
donnes par des suites de 0 et de 1 (bits).
On peut dfinir des codes de taille fixe tel que ceux dfinis, par exemple, dans le tableau
suivant
Avec un tel code, le message 1021334 sera reprsent par la suite
0001000000100001001100110100
Le dcodage est facile effectuer car il suffit de trononner le message en lments de 4
bits et de consulter la table de codage.
Imaginons que nous utilisions, prsent, un codage dont la taille est variable comme, par
exemple, celui dfini dans la table suivante
Le message prcdent sera, maintenant, reprsent par la suite
10001010100101110111100
On remarque que cette suite ne comporte que 23 signes alors que la suite prcdente en
comportait 28. Lconomie ralise sera maximale si le nombre de bits utiliss pour coder
un chiffre est inversement proportionnel sa frquence dusage. Ce problme constitue la
cl de la tlvision numrique venir et des rseaux numriques multimedia appels encore
autoroute de linformation.
Le problme pos par les codes de taille variable est celui du dcodage en rception. En ef-
fet comment dtecter la limite entre les codes des diffrents chiffres du message ? Une so-
lution trs lgante ce problme consiste dfinir un codage de telle sorte quaucun code
complet dun symbole ne soit le dbut (prfixe) du code dun autre symbole. Un tel code
8

est dit prfix, il peut tre reprsent par larbre binaire de la figure 16, page 83. Ce code
est tel que les chiffres coder sont dans les feuilles de larbre dautant plus prs de la racine
que ce chiffre est frquemment utilis. Chaque nud est dcor par la liste des chiffres si-
tus en dessous.
La technique de codage est trs simple. Il suffit de partir de la racine et en descendant jus-
8
Cette technique de codage a t particulirement tudie par David Huffman. On parle donc de code de
Huffman.
drg a arbre-vide? a ( )
__
| , =
sinon concatner drg droite a ( ) ( ) cons atome a ( ) drg gauche a ( ) ( ) , ( ) , ( )
0 0000 2 0010 4 0100 6 0110 8 1000
1 0001 3 0011 5 0101 7 0111 9 1001
0 0 2 1010 4 1100 6 11100 8 11110
1 100 3 1011 5 1101 7 11101 9 11111
Les Structures. Codage de Huffman & utilisation des arbres binaires
- 83 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
qu la feuille associe au chiffre coder, on ajoute un 1 au code chaque fois quon emprun-
te une branche de droite et un 0 chaque fois quon emprunte une branche de gauche.
Le dcodage consiste descendre dans larbre en prenant la branche de droite chaque fois
que le code comporte un 1 et la branche de gauche chaque fois que le code comporte un 0.
La feuille laquelle on aboutit est le chiffre trouver.
La construction de larbre de Huffman correspond aux expressions de dfinition des feuilles
puis aux expressions de dfinition des nuds
et enfin
Figure 16 : Arbre de Huffman. Dans cet exemple le chiffre 0 est le plus frquemment uti-
lis, suivi par le chiffre 1 puis par les chiffres 2, 3, 4 et 5 et enfin, les chiffres 6, 7, 8 et 9
sont les moins frquement utiliss.
[0 1 2 3 4 5 6 7 8 9]
[0] [1 2 3 4 5 6 7 8 9]
[1 2 3] [4 5 6 7 8 9]
[1] [2 3]
[2] [3]
[4 5]
[6 7 8 9]
[4] [5] [6 7] [8 9]
[6] [7] [8] [9]
n
0
nud
__
|
__
| 0 [ ] , , ( ) =
n
1
nud
__
|
__
| 1 [ ] , , ( ) =
n
2
nud
__
|
__
| 2 [ ] , , ( ) =
n
3
nud
__
|
__
| 3 [ ] , , ( ) =
n
4
nud
__
|
__
| 4 [ ] , , ( ) =
n
5
nud
__
|
__
| 5 [ ] , , ( ) =
n
6
nud
__
|
__
| 6 [ ] , , ( ) =
n
7
nud
__
|
__
| 7 [ ] , , ( ) =
n
8
nud
__
|
__
| 8 [ ] , , ( ) =
n
9
nud
__
|
__
| 9 [ ] , , ( ) =
n
23
nud n
2
n
3
2 3 [ ] , , ( ) =
n
45
nud n
4
n
5
4 5 [ ] , , ( ) =
n
67
nud n
6
n
7
6 7 [ ] , , ( ) =
n
89
nud n
8
n
9
8 9 [ ] , , ( ) =
n
123
nud n
1
n
23
1 2 3 [ ] , , ( ) =
n
69
nud n
67
n
89
6 9 [ ] , , ( ) =
n
49
nud n
45
n
69
4 9 [ ] , , ( ) =
n
19
nud n
123
n
49
1 9 [ ] , , ( ) =
n
09
nud n
0
n
19
0 9 [ ] , , ( ) =
arbre-codage n
09
=
Les Structures. Equivalence oprationnelle.
- 84 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
La fonction de codage dun chiffre peut alors tre dfinie par
Le prdicat dans-liste?, suppos dfini
9
au pralable, rend vrai si un lment donn se
trouve dans une liste donne.
On peut, prsent, dfinir la fonction de codage dun message (suppos prsent dans une
liste)
La fonction de dcodage dun chiffre est alors
et la fonction de dcodage dun message devient
9
Dfinissez-le titre dexercice.
4.9 Equivalence oprationnelle.
Deux objets quelconques sont dits oprationnellement quivalents s'il n'existe aucun
moyen de les distinguer. Cette relation est, naturellement, une relation d'quivalence qui ga-
rantit que deux objets oprationnellement quivalents peuvent tre utiliss indiffremment
dans une expression sans en changer la valeur.
Comme l'interprtation d'un type de donnes est lie sa dfinition, il est de la responsabi-
coder-chiffre =
x a ( , ) arbre-vide? a ( )
__
| ,
dans-liste? x atome gauche a ( ) ( ) , ( ) cons 0 coder-chiffre x gauche a ( ) , ( ) , ( ) ,
dans-liste? x atome droite a ( ) ( ) , ( ) cons 1 coder-chiffre x droite a ( ) , ( ) , ( )
coder-message =
m a ( , ) arbre-vide? a ( )
__
| ,
vide? m ( )
__
| ,
sinon concatner coder-chiffre car m ( ) a , ( ) coder-message cdr m ( ) a , ( ) , ( )
dcoder-chiffre =
m a ( , ) feuille? a ( ) cons car atome a ( ) ( ) m , ( ) ,
vide? m ( ) cons , ( ) ,
sinon car m ( ) 1 = ( ) dcoder-chiffre cdr m ( ) droite a ( ) , ( ) ,
car m ( ) 0 = ( ) dcoder-chiffre cdr m ( ) gauche a ( ) , ( )
dcoder-message =
m a ( , ) vide? m ( )
__
| ,
sinon
soit : cm dcoder-chiffre m a , ( ) =
dans :
soit : c car cm ( ) =
m' cdr cm ( ) =
dans : cons c dcoder-message m' a , ( ) , ( )
Les Structures. Equivalence oprationnelle.
- 85 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
lit d'un type de donnes de dfinir le prdicat qui dfinit l'quivalence oprationnelle de
deux objets de ce type. Il ne peut pas y avoir de dfinition universelle.
Remarque : un type de donnes est donc finalement dfini par ses constructeurs, ses s-
lecteurs et son prdicat d'quivalence oprationnelle.
Ce problme n'est pas un problme propre l'informatique, c'est le problme quotidien de
la perception du monde qui nous entoure. Seulement si, au quotidien, on peut se contenter
d'une perception approximative de la notion d'quivalence, une machine ne peut fonction-
ner qu partir d'une dfinition claire.
En ce qui concerne les types de donnes et les structures considrs comme primitifs, l'qui-
valence oprationnelle de deux objets est suppose dfinie l'aide des trois prdicats iden-
tiques?, mme-valeur? et gaux?. On est ainsi amen distinguer les types de donnes qui
reprsentent des choses qu'on appellera atomes des structures qui sont les choses utilises
pour organiser des choses.
4.9.1 Egalit de deux Atomes.
On dira que deux atomes sont gaux
10
(oprationnellement quivalents) si et seulement si
le prdicat mme-valeur?
11
rend vrai.
Si on se souvient (Cf. Les Fonctions) que le test d'galit de deux fonctions est indcidable
en gnral, la comparaison de deux fonctions n'a pas de sens. Considrons les deux fonc-
tions
Elles sont manifestement oprationnellement quivalentes mais il est impossible de le d-
couvrir et
En d'autres termes les prdicats identiques? et mme-valeur? rpondent toujours pru-
demment, c'est dire faux quand l'galit n'est pas dfinie. Par contre s'il est sr qu'il s'agit
de la mme fonction
Maintenant comment interprter l'valuation suivante ?
En tant qu'objet primitif, le rsultat rendu par le constructeur cons est une paire et deux in-
vocations de cons engendrent ncessairement deux paires diffrentes. La paire est un ob-
jet spcial en ce sens que c'est un objet pour organiser des objets, ce n'est qu'une structure
et la dfinition de l'quivalence oprationnelle de deux structures n'est pas vidente. Cette
difficult est facile illustrer travers le dialogue suivant:
10
Deux atomes sont oprationnellement quivalents s'ils sont de mme type et si leurs valeurs peuvent tre
considres comme gales dans le cadre de leur type.
11
Cest ce prdicat que nous avons not = jusqu prsent.
double x x x + ( ) =
deux-fois x 2 x ( ) =
identiques? double deux-fois , ( ) faux =
mme-valeur? double deux-fois , ( ) faux =
identiques? double double , ( ) vrai =
mme-valeur? cons 1 3 , ( ) cons 1 3 , ( ) , ( ) faux =
Les Structures. Conclusion.
- 86 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Ces deux bouteilles sont-elles gales ?
Elles se ressemblent bien, mais je ne sais pas ce qu'il y a dedans !
4.9.2 Egalit de deux Structures.
Les structures de base sont les paires et les listes. On dira que deux objets structurs l'aide
de paires et de listes sont gaux (oprationnellement quivalents) si et seulement si le pr-
dicat gaux? rpond vrai.
Deux objets structurs sont gaux si:
1. ils sont structurs de la mme manire,
2. leurs atomes correspondants sont gaux au sens de mme-valeur?.
Considrons les exemples suivants
Considrons la situation suivante
Comment interprter les valuations suivantes ?
Pour mme-valeur? les deux listes et sont diffrentes puisque mme-valeur? ne
s'intresse pas ce qu'elles contiennent, par contre pour gaux? elles sont gales puis-
qu'elles sont structures de la mme manire et que leurs atomes correspondants sont gaux.
Quant aux listes et , comme il s'agit en fait de la mme liste sous deux noms diffrents,
mme-valeur? dtecte leur identit.
4.10 Conclusion.
Nous arrivons un tournant important. Nous pouvons tre convaincus, prsent, quil est
possible de dfinir toutes les applications possibles en structurant les ensembles de donnes
quelle doit manipuler ainsi que les fonctions qui permettent ces manipulations. Par contre
il est vident quil est temps de dfinir une technique dcriture de nos dfinitions plus com-
mode et adapte, en particulier, la construction de dfinitions de grande taille telles quon
les rencontrera dans le cadre dapplications relles.
Le chapitre suivant va, donc, introduire une telle criture que nous utiliserons alors syst-
matiquement.
gaux? cons 1 3 , ( ) cons 1 3 , ( ) , ( ) vrai =
gaux? cons 1 5 , ( ) cons 1 6 , ( ) , ( ) faux =
gaux? 1 2 4 [ ] 3 5 [ ] [ ] 1 2 4 [ ] 3 5 [ ] [ ] , ( ) vrai =
l
1
cons 1 cons 2 cons 3
__
| , ( ) , ( ) , ( ) =
l
2
cons 1 cons 2 cons 3
__
| , ( ) , ( ) , ( ) =
l
3
l
1
=
mme-valeur? l
1
l
2
, ( ) faux =
gaux? l
1
l
2
, ( ) vrai =
gaux? l
1
l
3
, ( ) vrai =
mme-valeur? l
1
l
3
, ( ) vrai =
l
1
l
2
l
1
l
3
Les Structures. Exercices.
- 87 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
4.11 Exercices.
E-27 Chercher par invariant une dfinition apparemment quivalente de la fonction rduire.
A laide dexemples, montrer que si cette dfinition se comporte comme celle donne au
paragraphe 4.5, page 71 pour certaines oprations, elle en diffre fondamentalement pour
dautres.
E-28 Montrer quil est possible de dfinir la fonction projeter (Cf. paragraphe 4.5, page 71)
laide de la fonction rduire. Cela prouve que la fonction rduire est plus fondamentale
que la fonction projeter.
E-29 Dfinir le constructeur et les slecteurs de la structure Salari dfinie en utilisant une liste.
E-30 Dfinir le constructeur et les slecteurs dun tableau 4 champs construit en utilisant une
liste. Quel est lintrt de cette reprsentation ?
E-31 Dfinir la fonction diviseurs rendant la liste des diviseurs dun nombre donn. Par exem-
ple
E-32 Dfinir la fonction parfaits rendant la liste des nombres parfaits compris entre 1 et n.
Un nombre est parfait sil est gal la somme de ses diviseurs (Cf. exercice E-31). Par
exemple
E-33 Dfinir la fonction diviseurs-premiers rendant la liste des diviseurs premiers dun nom-
bre donn. Par exemple
E-34 Modifier la fonction diviseurs-premiers de lexercice E-33 de telle sorte que les diviseurs
premiers du nombre donn napparaissent quune seule fois. Par exemple
Nota: il est commode de dfinir une fonction quotient-complet qui rend le dernier quo-
tient de toutes les divisions quon peut effectuer dun nombre m donn par un nombre n
donn. Par exemple
E-35 Dfinir la fonction premiers rendant la liste des nombres premiers compris entre 1 et
n. Un nombre est premier sil nest divis que par 1 et par lui-mme. Par exemple
Nota: on peut utiliser le rsultat de lexercice E-31 pour laborer une premire solution.
E-36 Dfinir la fonction concatner qui place les lments dune liste la suite de ceux dune
diviseurs 6 ( ) 1 2 3 [ ]
diviseurs 8 ( ) 1 2 4 [ ]
diviseurs 12 ( ) 1 2 3 4 6 [ ]
parfaits 10 ( ) 1 6 [ ]
diviseurs-premiers 6 ( ) 1 2 3 [ ]
diviseurs-premiers 8 ( ) 1 2 2 2 [ ]
diviseurs-premiers 8 ( ) 2 1 [ ]
quotient-complet 28 2 , ( ) 7 =
premiers 10 ( ) 7 5 3 2 1 [ ]
Les Structures. Exercices.
- 88 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
autre. Par exemple
E-37 Nous avons vu qu'une liste peut contenir soit des atomes, soit des paires, soit des listes.
1. Dfinir le prdicat paire? qui rend vrai si son argument est une paire. Nous suppose-
rons quil existe un prdicat atome? rendant vrai lorsque son argument nest pas une
paire.
2. Dfinir la fonction aplatir qui rend la liste de tous les atomes contenus dans une liste.
Par exemple
E-38 Nous savons qu'une liste peut contenir soit des atomes, soit des paires, soit des listes.
1. Dfinir le prdicat liste? rendant vrai si son argument est une liste. Nous suppose-
rons quil existe un prdicat paire? qui rend vrai lorsque son argument est une paire.
2. Dfinir la fonction renverser-en-profondeur qui rend la liste qu'on lui donne renver-
se ainsi que toutes les listes et paires qu'elle contient. Par exemple
E-39 Il arrive frquemment qu'on soit amen manipuler un ensemble de donnes. Un ensemble
est une collection d'objets telle qu'un objet ne peut s'y trouver qu'une seule fois.
1. Choisir une reprsentation pour une telle collection et dfinir le constructeur ensem-
ble.
2. Dfinir les primitives suivantes :
ajouter pour ajouter un lment l'ensemble,
retirer retire un lment de l'ensemble,
appartient? teste l'appartenance d'un objet l'ensemble,
union effectue l'union de deux ensembles,
intersection effectue l'intersection de deux ensembles,
diffrence effectue la diffrence de deux ensembles.
3. En dduire la dfinition de la fonction listeensemble qui transforme une liste en
lensemble correspondant.
4. Evaluer les ordres de croissance en temps des diffrentes primitives dfinies ci-dessus.
E-40 Lorsqu'il est ncessaire d'effectuer des statistiques sur une collection d'objets, il est commo-
de de dfinir une structure adapte: le multi-ensemble. Un multi-ensemble est une collec-
tion d'objets telle qu'on peut y trouver le mme objet plusieurs fois.
1. Choisir une reprsentation pour une telle collection et dfinir le constructeur multi-
ensemble.
2. Dfinir les primitives suivantes :
ajouter pour ajouter loccurrence d'un lment du multi-ensemble,
retirer retire loccurrence d'un lment du multi-ensemble,
occurrence? rend le nombre des occurrences d'un lment du multi-ensemble,
union effectue l'union de deux multi-ensembles,
intersection effectue l'intersection de deux multi-ensembles,
diffrence effectue la diffrence de deux multi-ensembles.
3. En dduire la dfinition de la fonction listemult-ens qui transforme une liste en un
concatner 1 2 3 [ ] 4 5 6 [ ] , ( ) 1 2 3 4 5 6 [ ] =
aplatir 1 3 1 7 2 [ ] [ ] 6 [ ] 9 0 [ ] ( ) 1 3 1 7 2 6 9 0 [ ]
renverser-en-profondeur 1 3 1 [ ] 6 1 [ ] 9 [ ] ( ) 9 1 6 [ ] 1 3 [ ] 1 [ ]
Les Structures. Exercices.
- 89 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
multi-ensemble.
4. Evaluer les ordres de croissance en temps des diffrentes primitives dfinies ci-dessus.
Nota: pensez associer l'lment et son nombre doccurrences.
E-41 En rpondant aux questions 4 des exercices E-39 et E-40, vous avez du tre dsols du man-
que d'efficacit flagrant des reprsentations les plus simples. Il est possible d'amliorer sen-
siblement les choses en utilisant une reprsentation plus favorable lorsque les lments
regrouper sont des magnitudes
12
.
Nous supposeront que les lments regrouper peuvent tre classs par les prdicats > et <.
1. En supposant une reprsentation sous la forme d'un arbre binaire, dfinir le construc-
teur ensemble-tri.
2. Dfinir les primitives suivantes :
ajouter pour ajouter un lment, sa place, l'ensemble tri,
retirer retire un lment de l'ensemble tri,
appartient? teste l'appartenance d'un objet l'ensemble tri,
union effectue l'union de deux ensembles tris,
intersection effectue l'intersection de deux ensembles tris,
diffrence effectue la diffrence de deux ensembles tris.
3. En dduire la dfinition de la fonction listeensemble-tri qui transforme une liste
en ensemble tri.
4. Evaluer les ordres de croissance en temps des diffrentes primitives dfinies ci-dessus.
12
Ce termes est issu de l'environnement Smalltalk. Un objet est une magnitude lorsque l'ensemble auquel il
appartient est associ une relation d'ordre total.
E-42 Lorsqu'on veut tudier comment varie une grandeur en fonction du temps (le cours d'une
action en bourse, par exemple) on construit une srie chronologique en rangeant toutes les
valeurs successives de cette grandeur dans la liste . Pour dterminer
la vrai variation de cette grandeur, on peut liminer les fluctuations alatoires en effec-
tuant le filtrage dont l'quation rcurrente est la suivante
Dfinir la fonction filtrer rendant la liste filtre.
E-43 Dfinir directement la fonction produit-scalaire pour calculer le produit-scalaire de deux
listes qu'on supposera de taille identique. Le produit-scalaire est dfini par l'expression
et tant respectivement les termes correspondants de la premire et de la deuxime
liste.
E-44 De nombreux langages modernes (dont Scheme) permettent d'utiliser des nombres entiers
dont la taille n'est limite que par la mmoire disponible sur la machine utilise et non pas
par la taille d'un mot-mmoire (16 ou 32 bits). De tels nombres sont quelque fois appels
big-num.
De tels nombres entiers permettent d'valuer des expressions de la forme :
[3] (fac 300)
x
N
x
N 1
x
N 2
x
1
, , , , { }
y
n
ay
n 1
1 a ( )x
n
avec y
0
+ 0 et 0 a 1 < < = =
l
x
s x
0
y
0
x
1
y
1
x
N
y
N
+ + + =
x
i
y
j
Les Structures. Exercices.
- 90 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
306057512216440636035370461297268629388588804173576999
416776741259476533176716867465515291422477573349939147
888701726368864263907759003154226842927906974559841225
476930271954604008012215776252176854255965356903506788
725264321896264299365204576448830388909753943489625436
053229807765212708224376394491201286786753683057122936
819436995646049816645022771650018517654646934011222603
472972466333258583506870150169794168850353752137554910
289126407157154830282284937952636580145235233156936482
233436799545940952768206080622328123873838808170496000
000000000000000000000000000000000000000000000000000000
000000000000000
On s'appuiera, bien entendu, sur l'arithmtique des nombres entiers du langage utilis ici
Scheme et on supposera, pour les besoins de cet examen, que les entiers de Scheme ne
sont pas des big-nums.
La reprsentation la plus naturelle pour un big-num est la liste de ses chiffres, sans zros
non significatifs
13
, en notation dcimales. C'est donc cette reprsentation que nous allons
adopter.
1. Il reste un point en suspend. La reprsentation d'un big-num peut tre dfinie poids
forts en tte (de liste) ou poids faibles en tte (de liste). Quels sont les arguments
qui nous ont amen choisir une reprsentation poids faibles en tte ?
Dans cette reprsentation, le nombre 128 sera reprsent par la liste (8 2 1). La liste vide
ou la valeur boolenne #F joue le rle de la valeur (bottom).
2. Bien entendu, Scheme ne sait pas afficher un big-num. Dfinir la fonction (afficher
bn) qui affiche un big-num en notation dcimale.
(afficher '(8 2 1)) 128
(afficher '()) ()
(afficher #F) ()
Nota: Le double rle jou par la liste vide ou la valeur boolenne #F ncessitera
souvent la dfinition d'une fonction auxiliaire.
Nous supposerons que les deux constantes d'utilisation frquente suivantes ont t dfinies :
(define zero (0))
(define un (1))
3. Dfinir les trois prdicats (egaux? bn1 bn2), (zero? bn) et (un? bn) ren-
dant #T si les big-nums bn1 et bn2 sont gaux et si, respectivement, le big-num bn
vaut 0 et 1.
4. Dfinir la fonction (naturel-to-bignum n) qui rend l'entier naturel n sous la
forme d'un big-num.
(naturel-to-bignum 345) (5 4 3)
(naturel-to-bignum -2) ()
Nota: le quotient euclidien correspond la fonction Scheme quotient tandis que le
reste euclidien correspond la fonction Scheme remainder.
5. Dfinir la fonction (suivant bn) qui rend le big-num qui suit immdiatement un
big-num donn.
(suivant '(8 2 1)) (9 2 1)
13
Les 0 non significatifs sont gauche dans la reprsentation dcimale courante. Ainsi, les deux entiers 003
et 3 sont identiques.
Les Structures. Exercices.
- 91 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
(suivant '(9 9)) (0 0 1)
Nota: s'inspirer de la technique manuelle est une bonne ide.
6. Dfinir la fonction (precedent bn) qui rend le big-num qui prcde immdiate-
ment un big-num donn.
(precedent '(8 2 1)) (7 2 1)
(precedent '(0 0 1)) (9 9)
(precedent zero) ()
Nota: une difficult dans la dfinition de cette fonction rside dans le fait qu'il ne faut
pas faire apparatre de 0 non significatifs dans la reprsentation du rsultat.
Les fonctions de base prcdente ayant t dfinies, on peut aborder la dfinition des op-
rations arithmtiques principales : somme, diffrence, produit, quotient euclidien, reste
euclidien.
Ces oprations notes respectivement +, -, , / et % peuvent tre dfinies par les expressions
suivantes :
somme : n + 0 = n
n + m = suivant(n) + prcdent(m)
diffrence : n - 0 = n
0 - m =
n - m = prcdent(n) - prcdent(m)
produit : n 0 = 0
n m = n + n prcdent(m)
quotient : si n < m n / m = 0
si n m n / m = 1 + (n - m) / m
reste : si n < m n % m = n
si n m n % m = (n - m) % m
avec
infrieur not < : n < 0 = faux
0 < m = vrai
n < m = prcdent(n) < prcdent(m)
7. Dfinir les fonctions (somme bn1 bn2), (difference bn1 bn2), (pro-
duit bn1 bn2), (quotient bn1 bn2) et (reste bn1 bn2) conformes
leur spcification ci-dessus.
Nota: Vous n'avez pas manqu de remarquer de la dfinition du prdicat < (infrieur)
ne fait pas appel la dfinition de la diffrence.
E-45 On se propose de dfinir une arithmtique des polynmes. Pour cela on supposera quun
polynme est reprsent par la liste de ses coefficients classs par puissances croissantes
Dans un premier temps, on supposera que cette liste a t directement construite la main
en utilisant le constructeur de paires cons.
1. Dfinir la fonction poly-add donnant la somme de deux polynmes. Cette somme est
le polynme dont le coefficient de degrs n est gal la somme des coefficients corres-
2 x 3x
2
7x
5
+ + + 2 1 3 0 0 7 [ ]
Les Structures. Exercices.
- 92 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
pondants dans les deux polynmes ajouts.
2. Dfinir la fonction poly-eval qui calcule la valeur dun polynme pour une valeur
donne de sa variable. On utilisera le schma rcursif de Horner quon peut illustrer par
lexemple
3. Dfinir la fonction scal-poly-mult donnant le polynme produit dun polynme et
dun scalaire donn.
4. En dduire la fonction poly-poly-mult donnant le produit de deux polynmes.
Nota: Il peut tre utile de se souvenir que la multiplication prcdente peut tre prsen-
te comme la multiplication manuelle de deux nombres:
5. En dduire la fonction poly-puissance qui lve un polynme une puissance entire
donne.
6. Dfinir la fonction poly-driver qui donne le polynme drive dun polynme
donn. On se souviendra que la drivation a, entre autres, les proprits suivantes
7. Le constructeur de polynmes que nous avons utilis est totalement inadapt la cons-
truction de polynme creux comme, par exemple, . Dfinir le constructeur de
polynmes poly-cons qui traduit une reprsentation condense des polynmes en la
liste de leurs coefficients. Cette reprsentation est la liste des coefficients rangs,
comme prcdemment, en ordre croissant des degrs. Par contre, lorsquun terme est
une liste un lment, cet lment est le degrs associer au coefficient suivant.
Par exemple
E-46 Les Egyptiens ne connaissaient que les nombres entiers et les fractions de numrateur 1 (di-
tes fractions gyptiennes). Dfinir la fonction dcomposer qui rend la liste des termes de
la dcomposition dun nombre rationnel.

+
1 x + ( ) 2 3x
2
+ ( ) + 3 x 3x
2
+ + =
2 x 3x
2
7x
5
+ + + 2 x 1 x 3 x 0 x 0 x 7 ( ) + ( ) + ( ) + ( ) + ( ) + =
5 2 x 3x
2
7x
5
+ + + ( ) 10 5x 15x
2
35x
5
+ + + ( )
1 2x + ( ) 2 3x
2
+ ( ) 2 4x 3x
2
6x
3
+ + + =
2 0x 3x
2
+ +
1 2x +
2 0x 3x
2
+ +
0 4x 0x
2
6x
3
+ + +
2 4x 3x
2
6x
3
+ + +
drivation k ( ) 0 =
drivation f
1
f
2
+ ( ) drivation f
1
( ) drivation f
2
( ) + =
drivation k f ( ) k drivation f ( ) =
drivation x
n
( ) n x
n 1
=
1 x
20
+
1 9 [ ] 1 [ ] 1 x
9
+ 1 0 0 0 0 0 0 0 0 1 [ ]
2 2 [ ] 1 2 9 [ ] 5 [ ] 2 x
2
2x
3
5x
9
+ + + 2 0 1 2 0 0 0 0 0 5 [ ]
Les Structures. Exercices.
- 93 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Par exemple
E-47 Dans les conditions de lexercice E-23 dfinir la fonction prcdent qui rend le nombre
qui prcde celui donn en argument.
Nota: Cet exercice est difficile. Church lui-mme ny parvint pas. Il venait peine de se
convaincre que cette fonction ntait pas dfinissable, que Kleene en trouva une dfini-
tion qui fut publie en 1981. La difficult que rencontra Church tait que la paire
navait pas encore t dfinie.
E-48 Nous verrons un peu plus loin quune structure de donnes est particulirement utile, elle
est appele Dictionnaire. Un dictionnaire est un ensemble dassociations entre un nom et
une valeur.
1. Dfinir la fonction dictionnaire qui rend un dictionnaire vide.
2. Dfinir la fonction insrer qui rend un dictionnaire correspondant un dictionnaire
donn dans lequel on a insr un nom et la valeur associe.
3. Dfinir la fonction modifier qui rend un dictionnaire tel que la valeur associe un
nom donn dans un dictionnaire donn a t remplace par une valeur donne.
Nota: commencer par dfinir lassociation entre un nom et une valeur.
E-49 Les nombres heureux
14
- Ladjudant runit ses hommes pour dcider qui serait de corve
de patates.
Mettez-vous en file indienne et comptez-vous partir de 2 !
Le premier homme de la file dit 2, le suivant dit 3, le suivant 4 et ainsi de suite.
Le premier de la file, sortez du rang. Vous tes dispens de corve. Quel votre numro ?
2
rpondit le soldat.
Les hommes de 2 en 2 en commenant celui qui vient de partir, sortez des rangs, vous
tes de corve.
Et le processus recommena. Le premier restant dans les rangs avait le numro 3 et il tait
heureux : dispens de corve. Les hommes de 3 en 3 en commenant lui sortirent des rangs
pour la corve...
Dfinir une fonction rendant le nombre heureux numro n. Pour tre sr que vous avez bien
compris, voici les premiers nombres heureux
2 3 5 7 11 13 17 23 25 29...
Les nombres heureux ne sont pas ncessairement premiers et les nombres premiers ne sont
pas ncessairement heureux.
14
Extrait de Jeux et casse-tte programmer de J.Arsac -Ed. DUNOD
E-50 Exercice difficile - Dfinir la fonction placer-reines qui rend les positions dans lesquel-
les on peut placer 8 dames sur un chiquier de telle sorte quaucune ne soit en prise.
Nota: la difficult de cet exercice est surtout lie la reprsentation choisie pour les cases
de lchiquier.
dcompose 19 8 ( ) 2 1 4 1 8 [ ] = car
19
8
----- - 2
1
4
-- -
1
8
--- + + =
Les Structures. Exercices.
- 94 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Les Structures. Exercices.
- 95 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
- 96 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
5. Elments de
Programmation.
Data and procedures and the values they amass,
High-order functions to combine and mix and match,
Objects with their local state, the messages they pass,
A property, a package, the control point for a catch
In the Lambda Order they are all first class.
One Thing to name them all, One Thing to define them,
One Thing to place them in environments and bind them,
In the Lambda Order they are all first-class.
auteur inconnu
Revised
3
Report on the Algorithmic Language Scheme
Notre insistance donner une dfinition rigoureuse des fonctions et une description de leurs
principales proprits est justifie par le fait que, ce que la plupart des langages informati-
ques appelle fonction n'offre pas ces proprits. Le seul point commun entre les fonctions
informatiques usuelles et les fonctions mathmatiques est qu'elles rendent toutes les deux
un rsultat.
Les chapitres prcdents ont montr que le concept de fonction, tel que les mathmatiques
lont dfini, offre toute la puissance ncessaire la description des applications informati-
ques pour en dcrire les donnes, les traitements et lorganisation. Lcriture informelle que
nous avons utilise, si elle nous permet de rflchir et de traduire par crit nos raisonne-
ments, nest pas assez bien dfinie pour garantir quune simple lecture nengendre pas, de
temps en temps, des malentendus.
Ces malentendus ne sont pas trs gnants tant que la forme crite est utilise pour la com-
munication entre des humains car il est toujours possible de discuter et ainsi de faire natre
la comprhension. Par contre, ils interdisent la mcanisation de la mise en uvre des des-
criptions qui ont t construites.
Elments de Programmation. Dfinir & Programmer.
- 97 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
5.1 Dfinir & Programmer.
Dans les chapitres prcdents, nous avons suppos lexistence de la notion de fonction
travers les mcanismes dapplication fonctionnelle et dabstraction fonctionnelle. Nous
avons galement suppos, bien que ce ne soit pas strictement indispensable, lexistence de
donnes primitives. Pour exprimer nos ides concernant tous ces lments, nous avons in-
troduit, au fur et mesure de nos besoins, quelques rgles dcriture soit empruntes direc-
tement aux mathmatiques soit dfinies spcifiquement.
5.1.1 Application fonctionnelle.
Lapplication dune fonction ses arguments est toujours crite sous lune des deux formes
suivantes
5.1.2 Abstraction fonctionnelle.
Labstraction fonctionnelle est toujours crite sous la forme
On se souvient cependant, que a t introduit comme une fonction qui rend une fonction.
Lutilisation de est donc typiquement une application fonctionnelle et il ntait pas nces-
saire dintroduire une criture spciale
1
. Nous lavons fait dune part pour sacrifier la cou-
tume et dautre part pour particulariser labstraction fonctionnelle du fait de son rle
fondamental dans tous nos raisonnements. Ce genre dcriture est souvent appele un su-
cre syntaxique pour dnoter le fait que ce nest pas ncessaire pour survivre mais que cest
tellement bon manger !
1
Un thorme fondamental de Schnfinkel et Curry montre que la -notation peut entirement tre recons-
truite sans labstraction fonctionnelle uniquement partir de deux fonctions primitives convenablement
choisies.
5.1.3 Donnes primitives.
Afin de pouvoir nommer les choses, nous avons suppos lexistence dun ensemble illimit
de symboles reprsents sous la forme dune suite ininterrompue de signes typographiques
nintroduisant pas dambiguit avec dautres reprsentations (celle des nombres par exem-
ple). Ces symboles ont t utiliss soit pour donner un nom des valeurs (ce que rend lva-
<application-fonctionnelle> symbole ::= <argument> , ( ) |
<abstraction-fonctionnelle> [ ] <argument> , ( )
<argument> <application-fonctionnelle> | ::=
<abstraction-fonctionnelle> |
<constante>
<constante> symbole nombre paire liste | | | ::=
<abstraction-fonctionnelle> symbole, , ( ) ::= <dfinition>
<dfinition> <application-fonctionnelle> | ::=
<abstraction-fonctionnelle> |
<constante>
Elments de Programmation. Dfinir & Programmer.
- 98 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
luation dune application fonctionnelle) soit pour tre utiliss en soi travers un
mcanisme de citation.
Pour pouvoir faire des calculs, nous avons supposs que nous disposions des nombres
ainsi que de toutes les oprations que la thorie des nombres met notre disposition (Cf.
tableau 2, page 98).
i
au sens de identique?
ii
dans le cas des Boolens, les oprateurs de relations sont des oprateurs internes.
Chaque ligne de ce tableau dfinit ce quon appelle une algbre et cvonstitue sa signature.
5.1.4 Structures courantes.
Nous avons particulirement utilis deux types de structures, les paires dnotes
et les listes dnotes .
5.1.5 Formes particulires.
Dans le cas de dfinitions complexes, nous avons utilis une premire forme qui permet de
dfinir lenvironnement (des variables intermdiaires) qui donne un sens une expression
et une forme qui permet de concevoir des dfinition par cas
prsente verticalement lorsque cela amliore la lisibilit
Types de donnes Constantes du type
Oprateurs
de relation
Oprateurs
internes
Symboles x y foo baz ... =
i
Boolens vrai faux nant
ii

Nombres
entier
s
-2 -1 0 1 2 ...
= > < + - /
rels 1,2 0,12 ...
Tab. 2 : Types de donnes supposs informellement prdfinis.
tte queue [ ] x
1
x
2
x
N
[ ]
soit(-rec) :

dans :
<prdicat> <consquent> <alternative> ,
<prdicat> <consquent> ,
<prdicat> <consquent> ,

sinon <alternative>
Elments de Programmation. Le Langage Scheme.
- 99 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
5.1.6 Un Langage pour sexprimer, un Langage pour programmer.
Nous avons vu, au cours des premiers chapitres, que labstraction fonctionnelle permet soit
dtendre une algbre prdfinie en dfinissant de nouvelles oprations soit de dfinir de
nouveaux types de donnes (une nouvelle algbre).
Les rgles dexpression qui permettent dexprimer des ides constituent un langage. Lors-
que un langage est conu pour tre interprt de faon mcanique, on lappelle un langage
de programmation.
Un langage est caractris par :
vocabulaire lensemble des mots quil utilise,
syntaxe les rgles de combinaison de ses diffrents mots pour construire les
expressions syntaxiquement bien formes,
smantique le sens quon peut donner aux diffrentes expressions bien formes.
Contrairement un langage naturel, un langage artificiel mcanisable ncessite que
toute expression bien forme est associe une et une seule signification.
5.2 Le Langage Scheme.
Nous allons, prsent, introduire le langage de programmation Scheme
2
dans lequel les
fonctions sont rellement des fonctions et le style de programmation qui lui est associ est
donc appel programmation fonctionnelle.
La syntaxe de ce langage (ses rgles d'criture) est extrmement simple. Nous ne consacre-
rons donc pas beaucoup de temps aux problmes de syntaxe pour nous intresser essentiel-
lement aux problmes de smantique associs son utilisation.
Ainsi, comme tout langage efficace, Scheme possde trois mcanismes de construction :
1. des expressions primitives qui reprsentent les entits les plus simples du langage
considr,
2. des moyens de composition pour construire des expressions composes partir
d'expressions plus simples,
3. des moyens d'abstraction pour nommer ou manipuler comme un tout un objet com-
pos.
Le langage Scheme est remarquable car non seulement il traduit tous les concepts que nous
avons introduits aux chapitres prcdents, mais, en plus, nous verrons quil permet de dfi-
nir une fonction extraordinaire qui permet dvaluer toutes les autres fonctions que
nous appellerons son interprte. Dans un premier temps, nous considrerons simplement
que cette fonction existe, puis petit petit, nous montrerons comment il est possible de la
dfinir. Un langage qui possde la proprit de pouvoir se dfinir lui-mme est dit mta-
circulaire.
Nous pourrons donc utiliser le langage Scheme deux fins :
1. pour dcrire et formaliser des raisonnements sans ambigut. Il peut donc tre utilis
la place de lcriture informelle que nous avons utilise auparavant.
2
Linterprte Scheme prsent ici est la version PC-Scheme/Geneva V4.02 disponible librement par ftp
auprs du serveur cui.unige.ch dans le rpertoire /public/pcs sous la forme de lexcutable auto-
dcompressant pcscheme.exe.
Elments de Programmation. Expressions Scheme.
- 100 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
2. pour demander la rsolution des quations engendres par les dfinitions quil a per-
mis de construire. Le fait que linterprte accepte ces dfinitions prouvent quelles
sont correctes
3
.
Nous nintroduirons pas toutes les possibilits expressives de Scheme, cela pour 3 raisons :
1. certaines dcrivent des concepts smantiques que nous navons pas introduit aux
chapitres prcdents et qui sortent du cadre dune initiation linformatique.
2. certaines concernent des possibilits introduites pour faciliter le dveloppement
dapplications informatiques (fonctions de gestion des fichiers, fonctions de mani-
pulation des objets graphiques utiliss dans la conception des interfaces homme-
machine par exemple) qui sortent du cadre de la simple analyse dun problme
informatique.
3. certaines peuvent tre considres comme une rosion smantique.
Cette maladie (ce terme pjoratif nengage que lauteur) a tendance frapper tous les langa-
ges informatiques qui voluent dune forme smantique aussi pure que possible vers des
formes abtardies, souvent sous la pression des compagnies qui commercialisent les envi-
ronnements de dveloppement associs. Le langage Scheme a pratiquement chapp,
lheure actuelle, cette maladie, cest la principale raison de son choix. Par contre, dautres
langages ont t plus ou moins pervertis (Lisp, Smalltalk donnant C
++
, etc.).
3
Dire quune dfinition est correcte nimplique pas quelle est conforme son cahier des charges. Cela
signifie simplement quelle est cohrente et quelle engendre un processus de calcul que se comporte con-
formment sa dfinition.
5.3 Expressions Scheme.
Toute expression Scheme dnote lapplication d'une fonction ses arguments et sa syntaxe
est la suivante
(fonc a1 a2 a3 ...)
Elle reprsente l'application de la fonction fonc aux arguments a1, a2, a3 ..., elle est
strictement quivalente lcriture que nous avons utilis jusqu pr-
sent. Scheme nintroduit pas de forme particulire pour labstraction fonctionnelle (nous ve-
nons de voir que ce nest pas ncessaire).
Cette criture dnote galement la structure de liste. Ainsi, la liste est la seule reprsenta-
tion utilise pour dnoter les entits complexes Scheme.
Un interprte Scheme fonctionne a priori en mode interactif, il affiche une invite
lcran, [1] par exemple. L'utilisateur tape alors une expression
4
, l'interprte l'value,
affiche le rsultat puis une nouvelle invite.
Nota: les caractres affichs par l'interprte sont composs en courier-italique
4
Cest la parenthse fermante qui dnote la fin de lexpression et non pas des signes typographiques tels que
; ou .
fonc a
1
a
2
a
3
, , , ( )
Elments de Programmation. Expressions Scheme.
- 101 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
tandis que ceux taps par l'utilisateur sont composs en courier-roman.
[1] (+ 3 4)
7
[2] (* 5 6 7)
210
[3] (/ 10 6)
1.66667
+, * et / sont des fonctions primitives de Scheme. La reprsentation des nombres
inexacts
5
comportent toujours un point dcimal. Cette manire d'exprimer les calculs s'ap-
pelle la notation polonaise prfixe. La ligne [1] est quivalente lexpression que
nous avons utilis jusqu prsent.
Cette notation permet de concevoir des fonctions capables de traiter un nombre quelconque
d'arguments
[4] (+ 1 2 3 4)
10
[5] (* 1 2 3 4 5 6)
720
[6] (- 4 3 2 1)
-2
ce qui revient considrer que ces fonctions sont systmatiquement projetes sur la liste de
leurs arguments.
Ce type de notation s'applique immdiatement aux expressions embote
[7] (+ (* 3 5) (* 12 3))
30
Lexpression de la ligne [7] correspond lcriture . Des expressions
qui nous semblent complexes ne troublent pas l'interprte
[8] (+ (* 3 (+ (* 2 4) (+ 3 5))) (+ (- 10 7) 6))
57
On utilise frquemment une prsentation indente (appele pretty-printing) plus lisible par
les humains
[9] (+ (* 3
(+ (* 2 4)
(+ 3 5)))
(+ (- 10 7)
6))
57
On constate qu'un tel interprte fonctionne toujours selon le mme cycle :
1. lecture d'une expression au clavier,
2. valuation de cette expression,
3. affichage du rsultat.
5
Les nombres, en tant que donnes, sont rpartis en deux classes, les nombres exacts qui peuvent tre exac-
tement calculs (les nombres entiers et les nombres rationnels) et les nombres inexacts qui ne peuvent pas
ltre (nombres rels et les nombres complexes).
3 4 +
3 5 ( ) 12 3 ( ) +
Elments de Programmation. Nommage & Environnement.
- 102 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Ce cycle est appel boucle de lecture-valuation-impression (read-eval-print loop), nous y
reviendrons. On peut, cependant, donner dj une bauche de la dfinition de la fonction
interprte
Manifestement lessentiel de linterprte se situe au sein de la fonction Evaluer et nous y
reviendrons.
5.4 Nommage & Environnement.
L'tablissement d'un lien entre un nom et une valeur est ralis en Scheme grce un op-
rateur not define.
Par exemple
[10] (define taille 10)
TAILLE
[11] (+ 1 taille)
11
Les effets de l'application de l'oprateur define ses arguments sont doubles:
1. cration dun lien (nomvaleur) introduit dans lenvironnement courant,
2. production dune valeur arbitrairement
6
dfinie.
Le premier effet, qui ne transparat pas travers la valeur rendue, est appel effet de bord
(side-effect en anglo-amricain).
Voici quelques autres exemples d'utilisation du define
[12] (define pi 3.141592)
PI
[13] (define rayon 5)
RAYON
[14] (* pi rayon rayon)
78.539816
[15] (define circonference
7
(* 2 pi rayon))
CIRCONFERENCE
[16] circonference
31.41592
Loprateur define dnote exactement le signe = utilis pour crer les liens de nommage
que nous avons utiliss aux chapitres prcdents. La ligne [10] est donc quivalente
lcriture , tandis que la ligne [11] traduit .
Cette possibilit d'associer des valeurs des symboles oblige l'interprte grer un diction-
naire des liens (nomvaleur). C'est ce dictionnaire qui matrialise l'environnement dont
nous avons parl prcdemment (Cf. exercice E-48).
6
Dans cette implmentation de Scheme, la valeur rendue par loprateur define est le nom li lui-mme.
Pour cette version de Scheme les lettres majuscules et les lettres minuscules sont identiques.
7
Les accents dans les noms dfinis titre dexemple ont t sacrifis sur lautel de la compatibilit entre les
diffrentes implmentations de Scheme.
interprte ( ) interprte afficher Evaluer lire ( ) , ( ) ( ) ( ) =
taille 10 = 1 taille +
Elments de Programmation. Principaux Objets prdfinis Scheme.
- 103 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
On peut, legrement, amliorer notre bauche de la dfinition de la fonction interprte en
notant que lvaluation dune expression revient lui donner une signification (Cf. paragra-
phe 2.4.1, page 19) laide dun environnement. Il est alors clair que la fonction Evaluer
ne peut valuer une expression que si elle connait lenvironnement qui lui donne un sens.
La dfinition de la fonction interprte devient donc
5.5 Principaux Objets prdfinis Scheme.
5.5.1 Donnes Scheme.
Les donnes pouvant tre manipules en Scheme sont:
1. les nombres boolens,
2. les nombres exacts (entiers),
3. les nombres inexacts (rels),
4. les chanes de caractres,
5. Les fonctions (procdures).
Ces diffrents types sont associs des prdicats didentification et des rgles dcriture
rsums dans le tableau 3, page 103.
5.5.2 Paire Scheme.
La paire Scheme est lassociation de deux objets. Cette association aura de nombreux usa-
ges et servira d'lment de base pour la construction de presque toutes les donnes compo-
ses.
interprte e interprte afficher Evaluer lire ( ) e , ( ) ( ) ( ) =
Types Prdicats didentification Exemples
boolens
atom?
boolean? #T #F
nombres entiers
number?
exact?
integer?
10 21 -5
nombres rels
inexact?
float?
real?
45.2 5.1e2 -12.2
symboles symbol? dumpty
chanes de carac-
tres
string? "humpty"
fonctions procedure?
(lambda (x)
(* 2 x))
Tab. 3 : Types prdfinis Scheme que nous utiliserons.
Elments de Programmation. Principaux Objets prdfinis Scheme.
- 104 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Constructeur de paires.
Une paire est construite par invocation de la fonction cons
[17] (cons 2 3)
(2 . 3)
[18] (cons 34 56)
(34 . 56)
la notation dite paire-pointe est la reprsentation donne par Scheme aux paires. Cette re-
prsentation peut tre utilise comme la constante de dfinition d'une paire
[19] (cons 'a '(b . c))
(A B . C)
[20] (cons '(a . b) '(c . d))
((A . B) C . D)
Slecteurs
Le premier lment d'une paire est sa tte, le deuxime est sa queue. Les slecteurs de tte
et de queue sont respectivement car et cdr.
[21] (cons 'a 34)
(A . 34)
[22] (car (cons 'a 34))
A
[23] (cdr (cons 'a 34))
34
[24] (cdr (cons 'a '(b . c)))
(B . C)
[25] (car '(12 . 34))
12
[26] (cdr '(12 . 34))
34
Prdicat didentification
Le prdicat pair? rend #T lorsquil est appliqu une paire.
[27] (pair? (cons a b))
#T
[28] (pair? 4)
()
5.5.3 Liste Scheme.
La liste Scheme est une chane de paires, comme celle que nous avons dfinie prcdem-
ment. On peut donc construire une liste par des applications successives de la fonction
cons. On dit alors que les lments de la liste sont successivement cons-ss.
[29] (cons 'a (cons 'b (cons 'c ...)))
(A B C ...)
La liste vide est reprsente par le symbole (), une liste bien forme est donc de la forme
[30] (cons 'a (cons 'b (cons 'c (cons 'd '()))))
(A B C D)
Elments de Programmation. Principaux Objets prdfinis Scheme.
- 105 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
La forme (A B C D) est la reprsentation donne par Scheme aux listes bien formes et
cette reprsentation peut tre utilise comme la constante de dfinition d'une liste
[31] (cons 'a '(b c d))
(A B C D)
[32] (cons '(a b) '(b c d))
((A B) B C D)
Une liste qui ne se termine pas sur la liste vide est dite mal forme.
[33] (cons 'a (cons 'b (cons 'c 'd))))
(A B C . D)
La forme (a b c . d) est la reprsentation donne par Scheme aux listes mal formes
et cette reprsentation peut tre utilise comme la constante de dfinition d'une liste mal for-
me. On obtient une liste bien forme lorsqu'on cons-se un objet une liste bien forme et
une liste mal forme lorsqu'on cons-se un objet une liste mal forme.
On peut aussi construire une liste bien forme directement partir d'un ensemble d'argu-
ments, le constructeur correspondant est la fonction list.
[34] (list 'a 'b '(c d) 'd)
(A B (C D) D)
[35] (list)
()
L'accs aux diffrents lments de la liste se fait par des applications successives des fonc-
tions car et cdr, on est donc trs frquemment amen combiner ces deux fonctions et
on a dfini des formes contractes quivalentes.
[36] (define caar (lambda (l) (car (car l))))
CAAR
[37] (define caaar (lambda (l) (car (car (car l)))))
CAAAR
[38] (define cadr (lambda (l) (car (cdr l))))
CADR
[39] (define cdadr (lambda (l) (cdr (car (cdr l)))))
CDADR
On trouve dans l'environnement standard de Scheme des fonctions regroupant jusqu' qua-
tre invocations des fonctions car et/ou cdr dans une mme combinaison.
Les fonctions suivantes (entre autres) sont disponibles dans l'environnement standard de
Scheme (Cf. tableau 4, page 106).
Elments de Programmation. Principaux Objets prdfinis Scheme.
- 106 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
5.5.4 Vecteur Scheme.
Le vecteur Scheme est analogue au tableau dont les lments sont reprs par leur position
(ces vecteurs ne sont en fait que des tableaux htrognes).
Le constructeur de vecteur est la fonction vector.
[40] (vector 'a 'b 'c 'd)
#(A B C D)
[41] (vector 16 '(a . b) '(3 5) "Jo")
#(16 (A . B) (3 5) "Jo")
La forme #(a b c d) est la reprsentation donne par Scheme aux vecteurs et cette re-
prsentation peut tre utilise comme la constante de dfinition d'un vecteur.
Le slecteur de composante est la fonction vector-ref.
[42] (vector-ref #(a b c d d e) 5)
E
Nota: la numrotation des composantes de vecteur commence 0.
La fonction vector permet de construire des vecteurs ayant un nombre quelconque de
composantes, une fonction permettant de dterminer la taille d'un vecteur est donc souvent
utile.
[43] (vector-length #(a b c d d e))
6
Nota: comme le vecteur est une structure de taille fixe, il n'est pas possible de lui rajouter
des composantes. C'est ce qui le distingue d'une liste.
(null? liste) Permet de tester si liste est vide.
(length liste) Rend la longueur de liste.
(append lst1 lst2) Rend une liste gale la concatnation de lst1 et lst2.
Lorsque la deuxime liste est mal forme, le rsultat est
une liste mal forme.
(reverse liste) Rend une liste gale liste renverse.
(map fonc liste) La fonction fonc est applique successivement tous les
lments de liste. Les rsultats de ces applications sont
rendus sous la forme d'une liste. Il sagit donc de la projec-
tion de fonc sur liste.
(for-each fonc liste) La fonction fonc est applique successivement tous les
lments de liste. Cette fonction ne produit aucun rsul-
tat et ne sert qu' appliquer une fonction produisant un effet
de bord tous les lments de la liste.
Tab. 4 : Principales fonctions Scheme disponibles concernant les lis-
tes.
Elments de Programmation. lambda : le constructeur de fonctions.
- 107 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
5.6 lambda : le constructeur de fonctions.
La construction d'une fonction est ralises par loprateur lambda (Cf. paragraphe 2.4.2,
page 20) dont les paramtres sont :
1. la liste de ses paramtres,
2. son expression de dfinition, c'est dire lexpression abstraire.
La forme gnrale d'une expression Scheme utilisant l'oprateur lambda est la suivante
(lambda <liste des paramtres> <exp-df>)
La fonction ainsi produite n'a pas de nom, elle peut tre lie un nom par l'utilisation d'un
define ou directement applique ses arguments.
La forme la plus courante d'une expression Scheme utilisant l'oprateur lambda est la sui-
vante
(lambda (p1 p2 p3 ...) <exp-df>)
Il arrive, plus souvent quon peut le penser a priori, quil soit ncessaire de dfinir une fonc-
tion dont le nombre des arguments est inconnu a priori, on distingue alors deux cas.
Lorsque la fonction peut ne pas avoir darguments du tout, on utilise la forme
(lambda pars <exp-df>)
dans laquelle pars est la liste (ventuellement vide) des arguments auxquels la fonction
est applique.
Lorsque la fonction a au moins n arguments, on utilise la forme
(lambda (p1 p2 ... pn . pars) <exp-df>)
dans laquelle p1, p2 ... et pn reprsentent les n premiers arguments (toujours prsents) et
pars la liste (ventuellement vide) des arguments supplmentaires.
Les expressions suivantes illustrent l'utilisation de l'oprateur lambda. Dfinissons
8
la
fonction somme-carre
[44] (define somme-carre
(lambda (x y)
(+ (* x x) (* y y))))
SOMME-CARRE
Cette ligne traduit lexpression

Dans ce contexte (environnement complt par la dfinition de somme-carre), les deux
expressions suivantes sont alors quivalentes
[45] ((lambda (x y) (+ (* x x) (* y y))) 3 4)
25
[46] (somme-carre 3 4)
25
8
Dans ce cours, nous utiliserons la notation dite de lIndiana et non pas celle dite du MIT. En effet,
cette notation est identique celle que nous avons utilis jusqu prsent.
somme-carr xy x x ( ) y y ( ) + =
Elments de Programmation. Expressions conditionnelles & prdicats.
- 108 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Ces deux lignes traduisent les expressions
On peut aussi dfinir des fonctions qui rendent des fonctions. Reprenons, par exemple, la
dfinition de la fonction derivation (Cf. paragraphe 2.5, page 26)
[47] (define derivation
(lambda (f e)
(lambda (x)
(/ (- (f (+ x e))
(f x))
e))))
DERIVATION
Dfinissons, prsent, la fonction drive de la fonction cos (cosinus) suppose exister
[48] (define d-cos (derivation cos 0.00001))
D-COS
Cette fonction d-cos (quivalente, en fait, une approximation de la fonction sinus) peut
alors tre utilise comme nimporte quelle fonction quon aurait dfini directement
[49] (d-cos 0)
0.000005
[50] (d-cos (/ pi 2))
0.999999
En fait, loprateur define nest pas obligatoire et nous pourrions rcrire les lignes
[12], [13] et [14] sous la forme
[51] ((lambda (pi rayon) (* pi rayon rayon)) 3.141592 5)
78.539816
Cette forme, bien que totalement cohrente avec la dfinition de lambda, perd tellement
en lisibilit quon ne lutilisera jamais. On utilisera donc soit la forme utilisant define soit
une autre forme que nous allons voir plus loin.
5.7 Expressions conditionnelles & prdicats.
Dans l'tat actuel des choses, nous ne savons dfinir une fonction qu' l'aide d'une expres-
sion valuable et nous savons que certaines fonctions ne peuvent tre dfinies que par
cas.
Reprenons la dfinition de la fonction abs qui rend la valeur absolue d'un nombre
Cette dfinition suppose lexistence de la fonction si (Cf. paragraphe 2.2.4, page 12).
5.7.1 if et les expressions conditionnelles.
Le langage Scheme introduit lalternative travers loprateur if. La forme gnrale d'une
expression Scheme utilisant l'oprateur if est la suivante
xy x x ( ) y y ( ) + [ ] 3 4 , ( )
et
somme-carr 3 4 , ( )
abs x ( ) x 0 < ( ) x x , =
Elments de Programmation. quote et citations.
- 109 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
(if <prdicat> <consquent> <alternative>)
ou la forme simplifie
(if <predicat> <consquent>)
La valeur rendue par lvaluation de cette expression est celle de lexpression <cons-
quent> si la valeur de <prdicat> est vrai et celle de lexpression <alternative> (ou
faux si elle est absente) dans le cas contraire. Nous verrons un peu plus loin que lvaluation
dune telle expression pose un subtil problme.
5.7.2 Prdicats.
Un prdicat (Cf. paragraphe 2.2.4, page 12) est une expression qui s'value vrai (not #T)
ou faux (not #F ou () ou nil). Une telle expression est btie partir des oprateurs
primitifs de relation et des oprateurs boolens and, or et not.
Par exemple
[52] (< 4 3)
()
[53] (= 5 (+ 2 3))
#T
5.7.3 Exemples dutilisation dexpressions conditionnelles.
La dfinition de la fonction abs prend alors la forme
[54] (define abs
(lambda (x)
(if (< x 0) (- x) x)))
ABS
Lexpression (if (< x 0) (- x) x) traduit strictement . Quant la
dfinition de la fonction fact, elle peut scrire
[55] (define fact
(lambda (n)
(if (= n 0) 1 (* n (fact (- n 1))))))
FACT
[56] (fact 6)
720
5.8 quote et citations.
Le problme de la citation dun symbole (Cf. paragraphe 3.2.3, page 55) est rsolu en Sche-
me laide de loprateur quote qui cite son argument sans lvaluer.
= < > <= >= , , , ,
x 0 < ( ) x x ,
Elments de Programmation. Equivalence oprationnelle.
- 110 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Par exemple
[57] (define x 4)
X
[58] x
4
[59] (quote x)
X
On utilise, en gnral, une criture allge strictement quivalente qui utilise le signe
[60] x
X
Les expressions (quote x) et x traduisent la citation du symbole que nous crivions x.
5.9 Equivalence oprationnelle.
La traduction de lquivalence oprationnelle (Cf. paragraphe 4.9, page 84) ncessite, au
moins, les fonctions identique?, mme-valeur? et gaux?. Ces trois fonctions, en ce
qui concerne les objets de base Scheme, sont prdfinies sous les noms
5.10 Formes drives.
Les oprateurs define, lambda et if sont suffisants pour dfinir les fonctions, les types
de donnes et les structures ncessaires la conception informatique, nous lavons montr
aux chapitres prcdents. Cependant, il est commode de driver de ces 3 oprateurs les op-
rateurs supplmentaires
cond
let
let*
letrec
5.10.1 cond et les expressions gardes.
L'association de prdicats et d'expressions l'aide d'un ensemble dalternatives s'appelle
des expressions gardes (Cf. paragraphe 2.2.4, page 12). Scheme permet de simplifier la d-
finition de ces expressions l'aide de loprateur driv cond qui peut tre simplement d-
fini partir de loprateur if.
identique? eq?
mme-valeur? eqv?
gaux? equal?
Elments de Programmation. Formes drives.
- 111 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Considrons la dfinition suivante de la fonction abs
[61] (define abs
(lambda (x)
(if (< x 0)
(- x)
(if (= x 0)
0
(if (> x 0)
x)))))
ABS
Elle peut tre crite sous la forme suivante, quivalente mais plus lisible
[62] (define abs
(lambda (x)
(cond ((< x 0) (- x))
((= x 0) 0)
((> x 0) x)))))
ABS
On utilisera trs frquemment des expressions de la forme
(cond (<p1> <e1>) (<p2> <e2>) (<p3> <e3>) ... )
strictement quivalente lexpression suivante qui lui sert de dfinition
9
(if <p1> <e1>
(if <p2> <e2>
(if <p3> <e3>
.....)))
Traduisons, par exemple, la dfinition suivante
ce qui donne
[63] (define divise?
(lambda (n m)
(cond ((= n m) #T)
((> n m) #F)
(#T (divise? n (- m n))))))
DIVISE?
On a plac, en fin de la suite des prdicats, une sentinelle toujours vrai, il est agrable de
donner cette sentinelle une forme plus conviviale et de la dfinir dans l'environnement de
Scheme sous la forme du nom else li la valeur vrai
[64] (define else #T)
ELSE
9
Ce nest pas tout fait exact, mais nous considrerons quil en est strictement ainsi.
divise? n m , ( ) n m = ( ) vrai , =
n m > ( ) faux ,
sinon divise? n m n , ( )
Elments de Programmation. Formes drives.
- 112 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Cette dfinition de else permet de modifier lgrement la dfinition du prdicat divise?
[65] (define divise?
(lambda (n m)
(cond ((= n m) #T)
((> n m) #F)
(else (divise? n (- m n))))))
DIVISE?
Traduisons, prsent, la fonction
qui prend la forme
[66] (define rationnel
(lambda (n d)
(lambda (m)
(cond ((eq? m numerateur) n)
((eq? m denominateur) d)))))
RATIONNEL
Nota: la constante que nous avons frquemment utilise est, en gnral, reprsente par
la constante #F.
Cette petite remarque met en vidence un point faible du langage Scheme. En effet, nous
avons constat quil devait exister autant de diffrents que de types de donnes et que
chacun avait le sien. Ici, le est unique et il sera souvent difficile de lui faire jouer son rle
normal.
5.10.2 let et les extensions de l'environnement.
Nous avons vu que lutilisation de loprateur define ntait pas toujours obligatoire et
nous pouvions rcrire les lignes [12], [13] et [14] sous la forme
[67] ((lambda (pi rayon) (* pi rayon rayon)) 3.141592 5)
78.539816
Cette forme peut tre rcrite galement sous la forme
[68] (let ((pi 3.141592)
(rayon 5))
(* pi rayon rayon))
Cette forme utilise loprateur prdfini let. On utilisera donc trs frquemment des ex-
pressions de la forme
(let ((<n1> <v1>) (<n2> <v2>) ...) <exp>)
qui est strictement quivalente la forme suivante qui lui sert de dfinition
((lambda (<n1> <n2> ...) <exp>) <v1> <v2> ...)
rationnel n d , ( ) m m numrateur = ( ) n , =
m dnominateur = ( ) d ,
sinon
__
|
Elments de Programmation. Formes drives.
- 113 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Traduisons la prdicat
qui prend la forme
[69] (define rationnels-egaux?
(lambda (q1 q2)
(let ((n1 (numerateur q1))
(d1 (denominateur q1))
(n2 (numerateur q2))
(d2 (denominateur q2)))
(= (* n1 d2) (* n2 d1)))))
RATIONNELS-EGAUX?
Plutt que de mmoriser la lambda-dfinition de loprateur let, il est plus simple de con-
sidrer que toutes les expressions de dfinition des variables sont values et que les liens
ne sont construits quensuite. Dans ces conditions, il est clair que lordre dans lequel les va-
riables intermdiaires sont introduites par let na pas dimportance.
5.10.3 let* et les extensions emboites.
On peut tre amen introduire des variables intermdiaires qui dpendent les unes des
autres. Cest ce qui se produit dans lexpression
Cette expression se traduit naturellement en Scheme sous la forme
(let ((x 4))
(let ((y (+ x 2)))
(let ((z (+(* 2 y) x)))
(/ (* x y) z))))
Cette criture traduit le fait que les diffrentes extensions denvironnement cres par les
oprateurs let successifs sont emboites. Comme ce cas de figure est assez frquent, Sche-
me introduit une forme drive utilisant un oprateur not let*
(let* ((<n1> <v1>) (<n2> <v2>) (<n3> <v3>) ...) <exp>)
qui est strictement quivalente
(let ((<n1> <v1>))
(let ((<n2> <v2>))
(let ((<n3> <v3>))
rationnels-gaux? q
1
q
2
, ( )
soit : n
1
numrateur q
1
( ) =
d
1
dnominateur q
1
( ) =
n
2
numrateur q
2
( ) =
d
2
dnominateur q
2
( ) =
dans : n
1
d
2
( ) n
2
d
1
( ) =
=
soit : x 4 =
dans :
soit : y x 2 + =
dans :
soit : z 2y x + =
dans :
x y
z
-----------
Elments de Programmation. Formes drives.
- 114 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
...
<exp>)...)))
Lexpression prcdente peut alors scrire sous la forme
(let* ((x 4))
(y (+ x 2))
(z (+(* 2 y) x)))
(/ (* x y) z))
Plutt que de mmoriser la lambda-dfinition de loprateur let*, il est plus simple de
considrer quil introduit les variables intermdiaires les unes aprs les autres, dans lordre
o elles sont indiques.
5.10.4 letrec et les extensions rcursives.
Dans le cas o il est ncessaire de dfinir un environnement rcursif, on utilisera loprateur
prdfini letrec. Ainsi, la traduction de la fonction
utilise loprateur letrec et prend la forme
[70] (define fact
(lambda (n)
(letrec ((invar-fact (lambda (f m)
(if (= n 0)
f
(invar-fact (* f m)
(- m 1))))))
(invar-fact 1 n))))
FACT
On utilisera trs frquemment des expressions de la forme
(letrec ((<n1> <f1>) (<n2> <f2>) ...) <exp>)
La dfinition dun environnement rcursif (Cf. paragraphe 2.4.5, page 24) impose que les
valeurs lies aux noms soient uniquement des fonctions.
La forme letrec permet dintroduire galement des dfinitions mutuellement rcursives
telles que, par exemple
(letrec ((est-pair? (lambda (n)
(if (= n 0)
#T
(est-impair? (- n 1)))))
(est-impair? (lambda (n)
(if (= n 0)
#F
(est-pair? (- n 1))))))
(est-pair? 9))
fact n
soit-rec : invarFact f m , ( ). = m 0 = ( ) f
sinon invarFact m f m 1 , ( )
dans : invarFact 1 n , ( )
=
Elments de Programmation. Scheme et lapplication fonctionnelle.
- 115 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
5.11 Scheme et lapplication fonctionnelle.
Nous venons de constater que Scheme possde les lments ncessaires tout langage de
programmation puissant
1. des lments primitifs dont l'valuation est immdiate, donnes et oprateurs,
2. une mthode de composition des lments primitifs, les expressions et l'embote-
ment des expressions,
3. une mthode de dnomination.
Scheme tant une mcanique, son mcanisme standard dapplication est lordre applicatif.
Cependant nous verrons, comme nous nous y attendons, des formes spciales qui ne peu-
vent te values quen ordre normal (Cf. paragraphe 2.4.5, page 24).
5.12 Evaluation des expressions composes.
Nous pouvons, prsent, appronfondir un peu le mcanisme standard d'valuation en ordre
applicatif d'une expression Scheme est, la base, remarquablement simple. L'valuation est
effectue en deux temps:
1. Evaluer les sous-expressions de l'expression
2. Appliquer la fonction rsultat le l'valuation de la sous-expression de gauche
ses arguments rsultat de l'valuation des autres sous-expressions.
Ce mcanisme est rcursif puisqu'une sous-expression est de mme nature qu'une expres-
sion. C'est dire toute la puissance de la rcursion qui permet de dcrire un processus sans
avoir aucune ide a priori de sa complexit.
Ce mcanisme ne met en jeu que les deux fonctions
Cette faon de donner un sens une expression par la dfinition d'une fonction qui lui attri-
bue une valeur s'appelle en dfinir une smantique sous forme dnotationnelle. Illustrons
ce mcanisme sur un exemple et considrons l'expression
(* (+ 2 (* 4 6)) (+ 3 5 7))
et valuons-la
i
Ce mcanisme suppose, bien sr, que la valeur reprsente une fonction.
associe, dans lenvironnement , une valeur une expression
Scheme
applique
i

expression Eval

[[ ]]
v
1
v
2
v
n
, , , Apply( ) v
1
v
2
v
n
, ,
v
1
(* (+ 2 (* 4 6)) (+ 3 5 7))) Eval

[[ ]]
* Eval

[[ ]] (+ 2 (* 4 6)) Eval

[[ ]] (+ 3 5 7) Eval

[[ ]] , , Apply( ) =
Elments de Programmation. Evaluation des expressions composes.
- 116 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
avec
Ce mcanisme d'valuation peut tre dcrit par l'arbre de la figure 17, page 116.
Les feuilles de l'arbre dnotent soit un oprande soit un oprateur et chaque noeud dnote
le rsultat de l'valuation du sous-arbre qui lui est attach. Cette rgle d'valuation par pro-
pagation des valeurs vers le haut s'appelle processus d'accumulation d'arbre.
Lorsque le processus d'valuation (parcours de larbre dvaluation) atteint une feuille de
l'arbre, il tombe sur des oprandes et des oprateurs primitifs dont les rgles d'valuation
sont dfinies de la manire suivante :
1. la valeur d'une chane de chiffres est le nombre qu'elle reprsente,
2. la valeur d'un oprateur prdfini est le mcanisme qui ralise l'opration corres-
pondante,
3. la valeur d'un nom est la valeur lie ce nom dans l'environnement courant.
Dans lexemple qui suit, nous allons pousser le bouchon un peu plus loin. Comme le con-
cept que nous allons introduire maintenant est un peu trange, ninsistez pas si cela ne vous
inspire pas, nous y reviendrons plus tard.
Reprenons l'valuation de l'expression
(* (+ 2 (* 4 6)) (+ 3 5 7))
Pour pouvoir pousser lvaluation plus loin il est ncessaire dintroduire quelques dfini-
tions.
Posons, par exemple
Les expressions en gras reprsentent des concepts (formes smantiques) tandis que les ex-
pressions entre double crochets reprsentent notre faon de les reprsenter (formes syntaxi-
(+ 2 (* 4 6)) Eval

[[ ]] + Eval

[[ ]] 2 Eval

[[ ]] (* 4 6) Eval

[[ ]] , , Apply( ) =
(* 4 6) Eval

[[ ]] * Eval

[[ ]] 4 Eval

[[ ]] 6 Eval

[[ ]] , , Apply( ) =
(+ 3 5 7) Eval

[[ ]] + Eval

[[ ]] 3 Eval

[[ ]] 5 Eval

[[ ]] 7 Eval

[[ ]] ( ) , , , =
Fig. 17 : Evaluation par accumulation darbre.
(* 4 6)
(+ 2 24) (+ 3 5 7)
(* 26 15)
390
+ Eval

[[ ]] add =
* Eval

[[ ]] mult =
2 Eval

[[ ]] 2 =
3 Eval

[[ ]] 3 =
4 Eval

[[ ]] 4 =
5 Eval

[[ ]] 5 =
6 Eval

[[ ]] 6 =
7 Eval

[[ ]] 7 =

Elments de Programmation. Formes spciales.


- 117 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
ques). Dans ce tableau, par exemple, add reprsente le mcanisme daddition tandis que +
est notre notation de laddition, 6 reprsente le nombre 6 tandis que 6 reprsente le nom
donn ce nombre
10
(on aurait aussi bien pu le reprsenter par 20 en utilisant un systme
de numration en base 3).
Il vient alors
Essayons daller plus loin dans la comprhension de lvaluation dune expression. La
fonction dcrit le mcanisme qui permet, tant donne un oprateur et ses argu-
ments, deffectuer le calcul reprsent par la fonction associe cet oprateur.
Posons alors
Il vient finalement
En conclusion, nous venons de dcouvrir deux choses remarquables :
1. La fonction concerne surtout les oprateurs et les oprandes primitifs et
les variables dfinies dans lenvironnement auxquels elle attribue une valeur.
2. La fonction concerne le mcanisme de fonctionnement des oprateurs
primitifs et surtout celui des fonctions dfinies par utilisation de lambda. Elle rem-
place ses paramtres par la valeur de ses arguments puis met en route le mcanisme
de l'oprateur primitif ou lvaluation de lexpression de dfinition de la fonction.
Nous reviendrons longuement sur la dfinition des fonctions et surtout de
dont nous navons fait qubaucher le rle.
Ces deux fonctions dfinissent, elles deux, toute la smantique du langage.
10
Les anglo-amricains distinguent ainsi le number (le nombre) du numeral (notation du nombre).
5.13 Formes spciales.
Que se passerait-il si les expressions contenant les oprateurs define, lambda, if...
taient values en ordre applicatif ?
Pour rpondre cette question, considrons l'expression
(define taille 10)
Son valuation en ordre applicatif se ferait en deux tapes :
1. valuation de define, de taille et de 10,
2. application de et .
L'valuation de define rend le mcanisme associ et l'valuation de 10 rend le nombre
10. L'valuation de taille devrait rendre la valeur qui a t lie au symbole taille.
(* (+ 2 (* 4 6)) (+ 3 5 7))) Eval

[[ ]]
mult add 2 mult 4 6 , , Apply( ) , , Apply( ) , add 3 5 7 , , , Apply( ) , Apply( ) =
Apply( )
mult x y , , , Apply( ) mult x y , , ( ) =
add x y , , , Apply( ) add x y , , ( ) =
(* (+ 2 (* 4 6)) (+ 3 5 7))) Eval

[[ ]]
mult add 2 mult 4 6 , ( ) , ( ) add 3 5 7 , , ( ) , ( ) =
Eval

[[ ]]
Apply( )
Eval

[[ ]]
Apply( )
define Eval

[[ ]] taille Eval

[[ ]] 10 Eval

[[ ]]
Elments de Programmation. Formes spciales.
- 118 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Mais ce lien n'aurait pu tre tabli que lors de la mise en uvre de l'oprateur define. Cet-
te valuation ne peut donc qu'chouer.
Pour qu'elle russisse, il faut que le mcanisme associ l'oprateur define soit mis en
uvre avant de tenter l'valuation de l'argument taille. Il faut donc que l'expression qui
contient un define soit value en ordre normal.
Considrons prsent l'expression
(cond ((> n 0) n)
((= n 0) 0)
((< n 0) (- n)))
Son valuation en ordre applicatif se fait en deux tapes:
1. valuation de cond, de ((> n 0) n), de ((= n 0) 0) et de ((< n 0) (-
n)),
2. application de ,
et .
L'valuation de cond rend le mcanisme associ, l'valuation en ordre applicatif de l'ex-
pression
((> n 0) n)
se fait galement en deux tapes:
1. valuation de (> n 0) et de n,
2. application de .
Les valuations russissent, par contre l'application choue car vaut
vrai ou faux valeurs qui soit ne sont pas considres comme des fonctions qui peuvent tre
appliques, soit (Cf. paragraphe 3.1.3, page 52) sont considres comme des fonctions at-
tendant deux arguments.
Pour que l'valuation d'une expression contenant cond russisse, il faut que le mcanisme
associ cond soient mis en uvre avant de tenter l'valuation des arguments de cond. Il
faut donc que l'expression qui contient un cond soit value galement en ordre normal.
On appellera forme standard une expression Scheme qui peut tre value en ordre appli-
catif et forme spciale une expression Scheme qui doit tre value en ordre normal.
Sujet de rflexion dlicat mais passionnant...
La raison pour laquelle if est ncessairement une forme spciale est plus dlicate mettre
en vidence. Supposons quun puriste francophone tente de franciser Scheme et dfinisse
la fonction si
[71] (define si (lambda p e1 e2) (if p e1 e2)))
Il utilise alors cet oprateur pour dfinir la fonction max
[72] (define max
(lambda (x y)
(si (> x y) x y)))
MAX
cond Eval

[[ ]] ((> n 0) n) Eval

[[ ]]
((= n 0) n) Eval

[[ ]] ((< n 0) (- n)) Eval

[[ ]]
(> n 0) Eval

[[ ]] n Eval

[[ ]]
(> n 0) Eval

[[ ]]
Elments de Programmation. O lon reparle de define.
- 119 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
puis demande l'valuation des expressions
[73] (max 4 5)
5
[74] (max 7 8)
8
[75] (max 9 9)
9
Comme tout semble marcher normalement, il utilise cet oprateur pour redfinir la fonction
fact
[76] (define fact
(lambda (n)
(si (= n 0)
1
(* n (fact (- n 1))))))
FACT
puis demande l'valuation de l'expression
[77] (fact 6)
Mais que se passe-t-il donc ? Il est clair que les formes spciales sont rellement
spciales !
5.14 O lon reparle de define.
Le mcanisme dabstraction de base est la dfinition des variables qui consiste donner un
nom des valeurs (fonctions ou donnes) et les manipuler sous ce nom. Nous avons, ainsi,
rencontr les oprateurs define, let, let* et letrec pour dfinir des variables dans
des environnements simples ou rcursifs.
Loprateur define, que nous avons introduit en premier pour des raisons de commodit,
nest pas ncessaire et il nest en fait quune forme drive curieuse de letrec. Expli-
quons-nous sur quelques exemples.
Considrons les trois expressions
[78] (define foo 4)
FOO
[79] (define baz 5)
BAZ
[80] (+ foo baz)
9
Elles sont strictement quivalentes lexpression unique
[81] (let ((foo 4)
(baz 5))
(+ foo baz))
9
Ainsi, define nest quune manire interactive de dfinir lenvironnement qui donne un
sens une expression valuer.
Elments de Programmation. Effets de bord.
- 120 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Si maintenant on considre les deux expressions
[82] (define fact
(lambda (n)
(if (= n 1)
1
(* n (fact (- n 1))))))
FACT
[83] (fact 6)
720
Elles sont strictement quivalentes lexpression unique
[84] (letrec ((fact (lambda (n)
(if (= n 1)
1
(* n (fact (- n 1)))))))
(fact 6))
720
On constate, alors, que lenvironnement cr interactivement, par lintrieur, laide de
define est un environnement rcursif tel que celui cr par letrec.
Dans ces conditions, lutilisation de define ne se justifie rellement que dans la phase de
dveloppement et de mise au point dune application. Nous verrons, cependant, quon uti-
lise define pour tendre lenvironnement de linterprte Scheme, alors quune application
se traduira par une expression unique.
Nous reviendrons plus loin sur cet aspect fondamental de la programmation fonctionnelle
et la construction des paquetages (Cf. paragraphe 3.3, page 60 ).
5.15 Effets de bord.
Le langage Scheme a t conu dune part comme un support de rflexion utilisable exac-
tement comme lcriture informelle des chapitres prcdents et dautre part comme un lan-
gage mcanisable. Cest cette deuxime utilisation qui justifie lappellation de langage de
programmation.
Dans ce cas, il peut tre ncessaire de disposer de fonctions curieuses utilise non pas pour
la valeur quelles rendent, mais pour un effet secondaire. Nous avons rencontr cette nces-
sit lorsque nous avons introduit loprateur define et au cours des exercices E-14, E-15,
E-18 et E-19 dans le cadre dequels nous avons suppos lexistence des fonction affiche
et mettre.
Trois fonctions prdfinies sont souvent utilises poour provoquer un affichage lcran
de la machine utilise pour mcaniser les valuations des expressions Scheme
display provoque laffichage de la valeur de son argument.
newline provoque un passage la ligne.
writeln provoque laffichage de la valeur de ses arguments puis provoque un
passage la ligne.
Elments de Programmation. Exercices.
- 121 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Dans le cas de telles fonctions
11
, comme lordre des choses ne dpend plus dune dpen-
dance fonctionnelle, mais dune perception extrieure il doit tre explicitement indiqu.
Cest le rle de la forme spciale begin. Cette fonction value ses arguments de la gauche
vers la droite et rend la valeur de celui situ le plus droite.
Nota: la fonction begin est la seule fonction qui garantit lordre dans lequel ses argu-
ments sont valus. Cest en ce sens que la forme begin est spciale.
[85] (begin (display 4)
(display 5))
45
[86] (begin (writeln "3 + 4 = " (+ 3 4))
(writeln "3 - 4 = " (- 3 4)))
3 + 4 = 5
3 - 4 = -1
les formes spciales lambda, cond, let, let* et letrec incluent un begin implicite
quil nest donc pas ncessaire de rajouter.
11
Dans lenvironnement Scheme prsent ici, la fonction display rend une valeur non affichable tandis
que les fonctions newline et writeln rendent #F.
5.16 Exercices.
E-51 Donner la transcription en criture Scheme des expressions suivantes
E-52 Donner la transcription en criture Scheme des formes suivantes
E-53 Donner le dfinition Scheme de la fonction fact dont la dfinition formelle est la suivante
E-54 Dterminer la valeur des expressions suivantes
(cons car cdr)
(list ceci (est fou))
3 4 5 + +
x 2x
3 4 5 + 3 4 5 + ( )
3 x
y
-----------
3
x y
-----------
fact 6 ( )
carr x x x =
soit : x 2 =
y 3 =
dans : x y +
soit : x 2 =
dans :
soit : y 3x =
dans :
soit : z x y + =
dans : x y z + +
fact n
soit-rec : F fm m 1 = ( ) f F m f m 1 , ( ) , =
dans : F 1 n , ( )
=
Elments de Programmation. Exercices.
- 122 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
(cons ceci (est-il fou?))
(quote (+ 2 3))
cons
(quote (quote cons))
(car (quote (quote cons)))
((car (list + - * /)) 2 3)
E-55 Etant donne la liste ((a b) (c d)), dfinir les expressions Scheme dont les valeurs
sont respectivement a, b, c et d.
E-56 Dcrire pas pas lvaluation des expressions suivantes
((car (cdr (list + - * /))) 17 5)
(cons (quote -) (cdr (quote (+ b c))))
(cdr (cdr (a b c)))
(cons d (cddr (a b c d e f)))
E-57 Simplifier les expressions suivantes en liminant les valuations redondantes
(+ (- (* 3 a) b) (+ (* 3 a) b))
(cons (car (list a b c)) (cdr (list a b c)))
E-58 Evaluer lexpression suivante
(let ((x 9))
(* x (let ((x (/ x 3)))
(+ x x))))
E-59 Dtecter puis renommer les variables lies qui engendre une collision de nom dans les ex-
pressions suivantes, puis les valuer
(let ((x a)
(y b))
(list (let ((x c)) (cons x y))
(let ((y d)) (cons x y))))
(let ((x ((a b) c)))
(cons (let ((x (cdr x))) (car x))
(let ((x (car x)))
(cons (let ((x (cdr x))) (car x))
(cons (let ((x (car x))) x)
(cdr x))))))
E-60 Evaluer les expressions suivantes
(let ((f (lambda (x) x))) (f a))
(let ((f (lambda x x))) (f a b c))
(let ((f (lambda (x . y) x))) (f a b c))
(let ((f (lambda (x . y) y))) (f a b c))
E-61 Donner une dfinition du constructeur de liste list.
Nota: Cet exercice est un clin doeil, il est trs simple.
E-62 Donner la liste des variables libres contenues dans les expressions suivantes
(lambda (f x) (f x))
(lambda (x) (+ x x))
(lambda (x y) (f x y))
(lambda (x) (cons x (f x y)))
(lambda (x) (let ((y (cons x y))) (list x y z)))
Elments de Programmation. Exercices.
- 123 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Nota: lambda ne peut pas tre considr comme une variable libre.
E-63 Considrons la dfinition suivante
(define ah! (lambda (f x) (f x)))
puis valuer lexpression
(ah! ah!)
E-64 Donner la dfinition Scheme des fonctions suivantes:
1. fonction carre qui lve un nombre x au carr.
2. fonction cube qui lve un nombre x au cube.
3. fonction quatrieme qui lve un nombre x la puissance quatrime.
4. fonction moyenne qui prend la moyenne de deux nombres x et y.
E-65 Donner la dfinition Scheme du prdicat divise? qui rend #T si n divise y et #F autre-
ment.
E-66 Donner la dfinition Scheme de la fonction reste qui rend le reste de la division de m par
n.
E-67 Donner la dfinition Scheme de la fonction quotient qui rend le quotient de la division
du nombre entier positif m par le nombre entier positif n.
E-68 Donner la dfinition Scheme du prdicat premiers? qui rend #T si les deux nombres n
et m sont premiers entre eux (ne se divisent pas) et #F autrement.
E-69 Supposons que la multiplication ne soit pas un oprateur primitif de Scheme. Dfinir une
fonction mult qui multiplie deux nombres entiers positifs n et m partir de l'addition sup-
pose primitive.
E-70 Dfinir la fonction pgcd qui rend le PGCD de deux nombres entiers positifs.
E-71 Donner la dfinition Scheme de la fonction monnaie de lexercice E-14 qui dtermine la
meilleure faon de construire une somme donne s partir d'un stock, suppos suffisant,
de pices de 20 F, de 10 F, de 5 F, de 2 F et de 1 F.
Nota: On provoquera laffichage des rsultats intressants de lvaluation de la fonction
monnaie.
E-72 Traiter lexercice prcdent en supposant maintenant que le stock de pices est limit m20
pices de 20 F, m10 pices de 10 F, m5 pices de 5 F, m2 pices de 2 F et m1 pices de 1 F.
E-73 Vous pouvez imaginer que le processus dvaluation associ la dfinition d'une fonction
n'est pas toujours celui qu'on croyait en d'autres termes il y a un bug. Il est alors commo-
de d'afficher la valeur de quelques stades intermdiaires de l'valuation. La fonction dis-
play est inadapte pour jouer ce rle car elle ne peut pas s'intercaler dans une valuation.
1. Dfinir une fonction afficher qui pourrait s'intercaler n'importe o dans une valua-
tion et permettrait, par exemple, d'crire :
(* (+ 3 4) (afficher (+ 7 8)))
2. En dduire une version trace, fact-tracee, de la fonction factorielle fact.
3. Quelle est donc la dfinition mathmatique de la fonction afficher ?
Nota: Cette dernire question un peu dlicate. Elle ncessite une rflexion profonde sur la
notion d'effet de bord.
Elments de Programmation. Exercices.
- 124 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
E-74 Utiliser la fonction map (Cf. tableau 4, page 106) pour dfinir la fonction transpose qui
prend une liste de paires et qui rend une paire de listes.
ex:
(transpose ((a . 1) (b . 2) (c . 3))) ((a b c) 1 2 3)
E-75 Ce problme est (trs ?) difficile, il constitue une suite l'exercice E-21.
1. Dduire des rsultats de l'exercice E-21 une dfinition formelle purement fonctionnelle
dune expression de la forme
2. On suppose que lvaluation des expression est effectue, comme dans Scheme, en
ordre applicatif. Donner une dfinition Scheme dune fonction pouvant jouer le rle
de la fonction Y prcdente.
Nota: cette question est rellement trs difficile.
soit-rec : f x f =
dans : f ( )
Elments de Programmation. Exercices.
- 125 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
- 126 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
6. Les Structures mutables
Le problme qui se pose maintenant nous est un problme de fond qui va nous obliger,
dans certains cas, changer notre point de vue sur la notion de valeur. Il se pose ds lors
quon est amen distinguer les choses en soi des choses pour organiser les choses ou plus
exactement de dcrire nos relations avec les choses.
La reprsentation des objets rels (une pomme, une voiture etc.) utilise toujours un modle
construit partir dune structure qui regroupe des caractristiques qui nous semble perti-
nentes (taille, poids, couleur etc.). La construction de ce modle dpend plus du point de
vue que nous avons sur lobjet que de lobjet lui-mme. Les philosophes diraient probable-
ment que nous dcrivons non pas lobjet, mais la perception que nous en avons.
Prenons un exemple trs concret pour illustrer cette nouvelle difficult et essayons de d-
crire une voiture. Une voiture prend naissance chez son constructeur, droule son existence
chez son propritaire et achve sa vie chez un casseur. Il est manifeste que ces trois per-
sonnes ne peuvent pas avoir le mme point de vue sur les voitures.
Le constructeur
Il assemble la voiture partir de pices dtaches que lui fournissent ses sous-traitants ou
quil fabrique lui-mme. Lorsque la voiture est assemble, il la perd de vue. Un constructeur
ne voit donc jamais que des voitures neuves, de telles voitures sont hors du temps. Ce
sont donc des objets en soi pouvant tre modliss par une structure du type de celles que
nous venons de voir.
Lutilisateur
Il prend en charge la voiture que lui confie le constructeur et lutilise tout au long de sa
vie (celle de la voiture). Cette voiture accompagne lutilisateur pendant une tranche impor-
tante de sa vie (celle de lutilisateur), et celui-ci aura besoin de modliser son vieillissement
laide de caractristiques ncessairement changeantes (son ge, son kilomtrage etc.) et
Les Structures mutables Etat & Affectation.
- 127 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
ce sont finalement ces caractristiques qui lintressent le plus, elles reprsentent ce quon
va appeler ltat de la voiture.
Le casseur
Il rcupre une voiture dans un tat variable. Cet tat nest pas de mme nature que celui
qui intresse un utilisateur. En effet, pour le casseur, la voiture nest quun source de pices
dtaches doccasion et son tat reprsente les pices dtaches quon peut encore en tirer.
Le concept de fonction que nous avons utilis jusqu prsent semble, a priori, peu propice
la description des tats. Cette impression est, la fois, vraie et fausse et nous allons, pr-
sent, tenter dclairer les choses en analysant en dtail un exemple simple qui nous touche
de prs: notre compte bancaire.
6.1 Etat & Affectation.
On peut noncer ce problme de la manire suivante: si la valeur associer l'expression
(+ 3 4) est bien dfinie, quelle valeur peut-on associer notre compte bancaire ? son
solde bien sr !
En fait ce compte bancaire n'est jamais valu dfinitivement. Et mme plus, il cessera de
nous intresser ds l'instant que nous considrerons sa valeur comme dfinitivement fixe
( la clture du compte).
Cela traduit le fait que l'aspect intemporel de la dfinition d'un objet ne nous convient pas
toujours car nous ne nous intressons pas uniquement un rsultat final mais bien au pro-
cessus qui permet d'y parvenir. Il peut mme se produire que le rsultat final ne nous int-
resse pas du tout et nous prfrons, dans ce cas, dfinir l'histoire d'un objet.
Considrons la gestion de notre compte bancaire et soit la fonction dfinissant
l'histoire du solde de notre compte note . Cette fonction dpend de l'his-
toire de toutes les oprations qui ont t effectues sur ce compte et
la dfinition de cette fonction peut tre crite sous la forme
On aurait pu poser ce problme lorsque nous avons introduit les listes et dfinir le construc-
teur de listes de telle sorte que
On pourrait dfinir, galement, la fonction telle que
Cette faon de penser est trs riche sur un plan thorique mais peu utilise sur un plan pra-
tique (au moins dans ltat actuel des langages informatiques courants). Nous prfrerons
prendre lapproche plus pragmatique de la notion dtat changeant. Cette approche est ce-
pendant moins rigoureuse et elle nous fait perdre tout le bnfice du support mathmatique
sur lequel nous pouvions nous appuyer jusqu prsent. Il sera donc trs important de bien
en apprcier le prix payer.
La difficult que nous venons de soulever nest pas nouvelle, elle est de mme nature que
celle quon rencontre lorsquon tente de dfinir prcisment ce quest le mouvement. Toutes
les tentatives dlaboration dune telle dfinition ont chou et nous nous contentons, en fait,
de la certitude que nous avons que nous parlons peu prs tous de la mme chose.
solde ( )
s
0
s
1
s
2
s
n
, , , , { }
o
0
o
1
o
2
o
n
, , , , { } o
i
solde ( )
s
0
s
1
s
2
s
n
, , , , { } solde o
0
o
1
o
2
o
n
, , , , { } ( ) =
1 [ ] 2 1 [ ] 3 2 1 [ ] , , , { , } cons-liste 1 2 3 , , , , { } ( ) =
solde ( )
0 20 10 5 20 , , , , , { } solde 0 20 10 5 15 , , , , , { } ( ) =
Les Structures mutables Variables d'Etat & Affectation.
- 128 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Une des premires mise en vidence de cet chec est bien connue sous la forme du para-
doxe dAchille et de la tortue du Znon dEle. Ce paradoxe consiste nier lexistence du
mouvement en btissant un raisonnement prouvant quil est impossible Achille de rattra-
per la tortue lorsque quAchille est 10 mtres de la tortue, il se met courir. Il parcourt
ces 10 mtres, mais pendant le mme temps, la tortue a avanc et Achille ne la pas rattrap.
Achille aura donc toujours du chemin faire chaque fois quil aura parcouru le chemin qui
aurait d lui permettre datteindre la tortue.
Ce raisonnement, qui heurte manifestement notre bon sens, na pas encore t rfut de
manire convaincante, cest dire en nintroduisant pas un concept permettant de construire
des paradoxes de mme nature. Il met clairement en vidence la difficult quil y a passer
dune vision statique des choses une vision dynamique.
6.2 Variables d'Etat & Affectation.
Parmi tous les systmes possdant une histoire, il en existe une catgorie dont l'importance
sera fondamentale pour nous, les systmes d'tat. Ces systmes sont tels qu'il est possible
de rsumer tout leur pass l'aide d'un nombre fini de variables. Ces variables sont appeles
variables d'tat et leur valeur, qui rsume tout le pass du systme, dfinit son tat.
Dans le cas de tels systmes, il est trs commode de dfinir une fonction de transition d-
crivant comment on passe d'un tat un autre selon la valeur actuelle de ses paramtres (va-
riables dtat et variables daction).
Ainsi, la construction dune liste peut tre dcrite par le modle dtat
et celle du gestionnaire de compte bancaire par
Les variables l et s sont les variables qui reprsentent le prsent du systme et rsument tout
le pass, les variables et reprsentent le futur immdiat de ces mmes variables. Lex-
posant + dnote le fait que les variables d'tat changent de valeur chaque invocation de la
fonction de transition.
On remarque immdiatement que ces variables sont associes deux types de manipula-
tions
1. on peut les dfinir (opration dnote =) partir d'une valeur value indpendam-
ment de leur valeur antrieure on les initialise.
2. on leur affecte (opration dnote ) une valeur qui dpend de l'tat antrieur et de
la valeur des paramtres de la fonction de transition.
Ainsi, si on considre un symbole et une valeur, on peut effectuer les deux oprations sui-
vantes :
1. on peut associer le symbole la valeur. Il s'agit du mcanisme d'abstraction par
nommage que nous avons introduit au tout dbut de ce cours. Nous avons appel ce
mcanisme dfinition d'une variable.
2. on peut associer la valeur au symbole. Il s'agit du mcanisme d'affectation que
nous venons d'introduire. Nous appellerons ce mcanisme affectation d'une varia-
ble.
l
l
+
cons x l , ( )
s 0
s
+
s x +
l
+
s
+
Les Structures mutables Variables d'Etat & Affectation.
- 129 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Si les oprateurs de dfinition de variables de Scheme sont define, let, let* et le-
trec, l'oprateur d'affectation est set!. Une expression impliquant loprateur set!
1
est
de la forme
(set! <symbole> <valeur>)
Il est clair que l'oprateur set! est ncessairement une forme spciale. En effet, si on con-
sidre l'valuation des expressions suivantes
2
(define foo 6)
foo 6
(set! foo 7) 7
foo 7
le symbole foo ne doit pas tre valu avant l'application de set!.
On peut maintenant envisager la conception d'une application de gestion de compte bancai-
re. Soit solde l'tat du compte lorsqu'on commence s'y intresser. On peut retirer de lar-
gent
(define retirer
(lambda (x) (set! solde (- solde x))))
et en dposer
(define deposer
(lambda (x) (set! solde (+ solde x)))
On peut alors valuer les expression suivantes:
(define solde 0)
ouvre le compte bancaire, on fait ensuite un versement de 1000 puis on effectue quelques
oprations :
(deposer 1000) 1000
(retirer 200) 800
(deposer 50) 850
(retirer 200) 650
(deposer 50) 700
La premire remarque qui s'impose est que les entits retirer et deposer ne sont pas
des fonctions puisque les valuations ci-dessus montrent que leur valeur ne dpend pas que
de la valeur de leur argument, elles produisent un effet de bord, on les appellera plus vague-
ment des procdures.
Le compte bancaire prcdent est peu intressant car la variable solde est unique et on ne
peut pas ouvrir plusieurs comptes simultanment. Nous allons donc gnraliser les choses
en dfinissant un type de donne Compte-bancaire. Nous inaugurons l une structure de
donnes curieuse car elle rassemble une donne, solde, et deux procdures, deposer et
retirer. Le constructeur peut tre celui dcrit figure 18, page 130.
Et voici quelques exemples dopration sur un compte bancaire.
Ouverture dun compte...
(define alonzo-church (compte-bancaire))
1
Le point d'exclamation postfixant le nom set! indique qu'il s'agit d'une opration d'affectation. Prononcer
set-bang .
2
Le signe dnote la valeur de lexpression gauche.
Les Structures mutables Egalit & Identit.
- 130 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Quelques versements...
((deposer-sur alonzo-chruch) 1000) 1000
((deposer-sur alonzo-church) 200) 1200
Consultation du solde...
(solde-de alonzo-church) 1200
Quelques retraits...
((retirer-de alonzo-church) 500) 700
((retirer-de alonzo-church) 300) 400
Cette structure est inhabituelle en ce sens que si le slecteur solde-de est identique aux
slecteurs que nous avons dfinis jusqu prsent, les deux autres slecteurs, retirer-
de et deposer-sur, rendent des procdures de modification de ltat dune donne de
ce type. De tels slecteurs sont donc appels des modificateurs.
Cette structure est appele une structure de donnes mutables ou plus brivement (bien
que de faon un peu impropre) un objet.
Une structure (type) de donne mutable est donc dfinie par :
1. (ventuellement) les constantes de ce type,
2. le constructeur des donnes du type,
3. des slecteurs,
4. des modificateurs.
6.3 Egalit & Identit.
Considrons les deux comptes bancaires
(define alonzo-church (compte-bancaire))
(define stephen-kleene (compte-bancaire))
et rapprochons ces deux expressions des deux expressions suivantes
(define compte-bancaire
(lambda ()
(let* ((solde 0)
(retirer (lambda (x) (set! solde (- solde x))))
(deposer (lambda (x) (set! solde (+ solde x)))))
(lambda (msg)
(cond ((eq? msg consulter) solde)
((eq? msg retirer) retirer)
((eq? msg deposer) deposer))))))
(define solde-de (lambda (cb) (cb consulter)))
(define deposer-sur (lambda (cb) (cb deposer)))
(define retirer-de (lambda (cb) (cb retirer)))
Fig. 18 : Constructeur et slecteurs pour un compte bancaire. Notons lutilisation de
set!
Les Structures mutables Prix payer pour l'Affectation.
- 131 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
(define rat1 (rationnel 3 4))
(define rat2 (rationnel 3 4))
Les deux nombres rationnels rat1 et rat2 sont gaux (oprationnellement quivalents),
par contre, les deux symboles alonzo-church et stephen-kleene ne peuvent ma-
nifestement pas tre utiliss de manire interchangeable bien quils reprsentent tous les
deux le rsultat de lvaluation de la mme fonction
((deposer-sur alonzo-church) 500) 500
((retirer-de alonzo-church) 200) 300
((retirer-de stephen-kleene) 200) -200
Il est donc clair que ces deux objets sont diffrents puisqu'ils ne produisent pas le mme
effet.
On aurait pu dfinir un compte joint
(define alonzo-church (compte-bancaire))
(define stephen-kleene alonzo-church)
c'est dire donner deux noms diffrents au mme compte.
La possibilit d'accder un mme objet par plusieurs noms est appele pseudonymie. Une
source d'erreurs commune est d'oublier que des modifications sur un objet peuvent induire,
par effet de bord, des modifications sur un "autre" objet. ces erreurs sont si difficiles dtec-
ter et analyser que certains ont propos que les langages de programmation interdisent les
effets de bord et la pseudonymie.
Toute opration effectue sous un nom sera perue simultanment sous l'autre nom, en fait
les comptes alonzo-church et stephen-kleene sont, dans ce cas, identiques.
Cette difficult dfinir une galit n'est pas due un dfaut d'expression de notre langage
mais bien de l'ambiguit intrinsque de la notion d'objet. Il y a des objets intemporels qui,
lorsqu'ils ont t perus comme gaux sont oprationnellement quivalents et le resteront
pour l'ternit et des objets ayant une histoire. Bien sr, on pourrait dire que deux objets
sont gaux s'ils ont t crs par le mme constructeur et s'ils sont dans le mme tat, mais
cette galit ne nous permettrait pas, pour autant, de les considrer comme oprationnelle-
ment quivalents et de les utiliser de manire interchangeable.
6.4 Prix payer pour l'Affectation.
Le prix payer pour laffectation se traduit par deux problmes qui se posent ds linstant
quon utilise laffectation dans la dfinition dune expression. Le premier de ces deux pro-
blmes est plutt dordre thorique tandis que le deuxime est plutt dordre pratique.
Le Modle de Substitution est pris en dfaut ...
Jusqu prsent, une fonction est caractrise par son expression de dfinition et un envi-
ronnement local dcrivant ses variables lies : les paramtres. Ce modle peut tre illustr
par lexemple suivant
xy x y +
soit : x =
y =
dans : x y +
=
Les Structures mutables Prix payer pour l'Affectation.
- 132 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Le mcanisme de lapplication dune fonction ses arguments est, jusqu prsent, la sim-
ple dfinition des variables lies partir de la valeur des arguments, ce qui revient une
simple substitution.
L'introduction de l'affectation rend notre modle prcdent inoprant et il a fallu en intro-
duire un autre, un peu plus complexe, que nous allons dcrire compltement petit petit.
Pour mettre en vidence la difficult introduite par laffectation tentons danalyser la cons-
truction dun compte-bancaire la lumire du mcanisme prcdent et voyons o cette
construction choue.
Lvaluation de lexpression
devrait engendrer, dans le cadre du modle de substitution actuel, lobjet suivant
Il est clair que la dfinition de cet objet est absurde.
Laffectation va donc nous obliger dfinir un nouveau modle pour dcrire lapplication
dune fonction ses arguments. Il sagit, en fait, de dfinir une reprsentation pour les va-
riables, les environnements, les fonctions et de dfinition la fonction .
Il est ncessaire de Ramasser les Miettes ...
Afin de mettre le deuxime problme en vidence, examinons dun peu plus prs lvalua-
tion de lexpression suivante
(define foo (cons a b))
Dune faon image, nous dirons que nous venons de prendre une vue nomme foo sur
la paire (A . B) et cest cette vue qui nous permet de la manipuler lorsque nous en avons
besoin.
Considrons, prsent, lvaluation de lexpression
(set! foo 8)
Nous avons dtache la vue foo de la paire (A . B) et nous lavons braque sur le nom-
bre 8. Mais alors, plus personne na de vue sur la paire (A . B) qui devient ainsi inutili-
sable ! Loprateur set! a cr une miette sous la forme dun objet inaccessible.
Sur un plan thorique, on peut considrer que le mcanisme de stockage des objets crs
dispose dun emplacement de taille illimite et lapparition de ces miettes nest pas une g-
ne. Sur un plan pratique, par contre, les possibilits de stockage des objets est limite et ces
miettes finissent par occuper tout lespace disponible et empcher la cration de nouveaux
objets. Lvaluation dune expression chouera faute de place.

soit : solde 0 =
dans :
soit : retirer x affecter solde solde x , ( ) =
dposer x affecter solde solde x + , ( ) =
dans : m m solde = ( ) solde ,
m retirer = ( ) retirer ,
m dposer = ( ) dposer

m m solde = ( ) 0 ,
m retirer = ( ) x affecter 0 0 x , ( ) ( ) ,
m dposer = ( ) x affecter 0 0 x + , ( )
Apply( )
Les Structures mutables Variables & Environnements - Modle graphique
- 133 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Les fonctions de manipulation des environnements doivent donc tre compltes dun m-
canisme ramasse-miettes (garbage collector) qui rcupre systmatiquement la place occu-
pe par les objets pour lesquels il peut prouver quil nexiste plus aucune vue pointe sur
eux.
6.5 Variables & Environnements - Modle graphique
Le modle de substitution tant pris en dfaut, nous avons besoin dun nouveau modle
nous permettant dapprhender comment se fait laccs aux variables dans les diffrentes
circonstances o elles sont utilises.
Mais auparavant, il est ncessaire de nous rafrachir un peu la mmoire. Lorsque nous avons
introduit les variables (au paragraphe 2.4.4, page 23), nous navons introduit le modle de
substitution que comme une commodit mnmonique tout fait valable tant quon nutilise
pas laffectation mais quil nous faut abandonner prsent.
6.6 Les Structures mutables prdfinies de Scheme.
L'oprateur set! que nous avons introduit va nous permettre de dfinir des oprateurs de
mutation pour les listes et les vecteurs.
Paire mutable.
On peut modifier la dfinition de cons de telle sorte qu'on puisse introduire deux opra-
teurs de mutation set-car! et set-cdr! (Cf. figure 19, page 133).
Considrons les listes
(define x (list 1 2 3))
(define (cons x y)
(let ((set-x! (lambda (v) (set! x v)))
(set-y! (lambda (v) (set! y v))))
(lambda (msg)
(cond ((eq? msg 'car) x)
((eq? msg 'cdr) y)
((eq? msg 'set-car!) set-x!)
((eq? msg 'set-cdr!) set-y!))))
(define (car paire) (paire 'car))
(define (cdr paire) (paire 'cdr))
(define (set-car! paire v) ((paire 'set-car!) v))
(define (set-cdr! paire v) ((paire 'set-cdr!) v))
Fig. 19 : Dfinition formelle dune paire mutable.
Les Structures mutables Quelques structures mutables trs utiles.
- 134 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
(define y (list 'a 'b))
(define z (list 'u 'v))
et valuons
(set-car! x y) ((a b) 2 3)
(set-cdr! x z) ((a b) u v)
Mais que donnerait les valuations suivantes ?
(define x (cons 1 '()))
(define y (cons 2 (cons 3 x)))
suivies de
(set-cdr! x y) ???
... Il est clair que la structure ainsi obtenue est un brin pathologique !
Vecteur mutable.
On peut doter, de la mme manire, les vecteurs d'un oprateur de mutation
(vector-set! <vecteur> <indice> <objet>)
6.7 Quelques structures mutables trs utiles.
6.7.1 La Rfrence.
Lorsque nous avons commenc nous intresser aux comptes bancaires, nous avons dfini
la fonction
(define deposer
(lambda (x) (set! solde (+ solde x)))
Cette fonction tait, en fait, trop peu gnrale pour tre intressante. Une premire tentative
de gnralisation pourrait tre
(define deposer
(lambda (x s) (set! s (+ s x)))
Tentons de lutiliser...
[87] (define solde 0)
SOLDE
[88] (deposer 100 solde)
100
[89] solde
0
En fait, cette gnralisation ne peut pas marcher. Laffectation qui a t effectue concerne
la variable s qui appartient lenvironnement cr au moment de lapplication de la fonc-
tion deposer et non pas la variable solde elle-mme qui est donc reste inchange.
Dans ltat actuel des choses, on ne peut pas dfinir le modificateur dune variable passe
en argument dune procdure.
Pour rsoudre ce problme, nous allons dfinir la structure mutable la plus simple quon
puisse concevoir, la Rfrence, dont le constructeur et le modificateur sont donns figure
20, page 135.
Les Structures mutables Quelques structures mutables trs utiles.
- 135 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
1
Il nest pas encore possible de justifier lintrt quon peut avoir faire rendre la rfrence et non
pas lobjet rfrenc, nous verrons que cest un bon coup stratgique.
Dfinissons une rfrence
3
sur une paire. Une rfrence un objet est communment ap-
pel pointeur sur lobjet.
Un pointeur doit tre interprt comme la mthode daccs un objet et non pas, comme
on le fait trop souvent, comme sa simple adresse mmoire ce qui privilgie beaucoup trop
les problmes de ralisation au dtriment des concepts.
(define &pp (reference-a (cons a b)))
On obtient le pointeur &pp quon peut alors drfrencer pour rcuprer la valeur pointe
(&pp) (A . B)
Modifions, prsent, ce sur quoi pointe &pp
((ref! &pp 5)) 5
(&pp) 5
Reconsidrons le problme pos par la dfinition dun modificateur de variable et redfi-
nissons la fonction deposer. La nouvelle version de cette fonction reoit en arguments
une rfrence sur solde et non pas la variable solde elle-mme
(define deposer
(lambda (x &s) ((ref! &s (+ (&s) x))))
Dfinissons alors une rfrence &solde
[90] (define &solde (reference-a 0))
&SOLDE
Puis utilisons la fonction deposer en lui passant la rfrence solde en argument
[91] (deposer 10 &solde)
10
[92] (&solde)
10
3
De la mme faon que nous avons caractriss les prdicats par le signe ? en fin de nom, les modificateurs
par le signe !, nous caractriserons les rfrences des variables par le signe & en prfixe de leur nom.
Cette reprsentation est emprunte au langage C++.
(define reference-a
(lambda (v)
(let ((set-v! (lambda (x) (set! v x))))
(lambda msg
(cond ((eq? msg nil) v)
((eq? (car msg) ref!) set-v!))))))
(define ref!
(lambda (&ref x) ((&ref ref!) x) &ref
1
))
Fig. 20 : Dfinition dune rfrence initialise et de son modificateur. Le slecteur de
la valeur rfrence est implicite. On remarque que la valeur rfrence nest
accessible que par sa rfrence car elle appartient lenvironnement cr au
moment de lapplication de la fonction reference-a.
Les Structures mutables Quelques structures mutables trs utiles.
- 136 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Lorsquon passe une rfrence en argument dune fonction on dit quon effectue un appel
par rfrence. Cette technique dappel vient complter celle que nous utilisons depuis le d-
but : lappel par valeur.
6.7.2 La Pile.
Dfinissons une pile de rangement telle que les objets qu'elle contient sont restitus dans
l'ordre inverse o ils ont t rangs, dernier entr - premier sorti (LIFO : Last In First Out).
Le type Pile peut tre dfini par un constructeur de pile vide pile-vide, une procdure
de rangement push et une procdure de rcupration pop. Le fonctionnement dune telle
pile peut tre illustr par les expressions suivantes
(define p (pile-vide))
(push 5 p) 5
(push 3 p) 3
(push 'bonjour p) bonjour
(pop p) bonjour
(pop p) 3
(pop p) 5
(pop p) ()
On peut dfinir une pile comme tant une rfrence une liste puisque les fonctions car
(pour dpiler) et cons (pour empiler) oprent toutes les deux sur la tte de la liste. Une d-
finition possible est donne figure 21, page 136.
On remarque que lutilisation des structures mutables entraine naturellement la ncessit
de lutilisation du begin implicite puisque les modificateurs oprent essentiellement par
effet de bord. Le style de programmation qui en rsulte est appel programmation impra-
tive.
6.7.3 La File d'attente.
La File est une structure de donnes trs utile lorsqu'on veut ranger des objets comme dans
une file d'attente : premier entr - premier sorti (FIFO : First In First Out).
La structure File peut tre dfinie par le constructeur file-vide, une procdure d'entre
entrer et une procdure de sortie sortir. Le fonctionnement dune telle file peut tre
illustr par les expressions suivantes
(define pile-vide
(lambda () (reference-a nil))
(define push
(lambda (x &p)
(ref! &p (cons x (&p))) x))
(define pop
(lambda (&p)
(let ((sdp (car (&p))))
(ref! &p (cdr (&p))) sdp))))
Fig. 21 : Dfinition dune pile son constructeur et ses oprateurs dempilage et
de dpilage.
Les Structures mutables Quelques structures mutables trs utiles.
- 137 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
(define f (file-vide))
(entrer 'bonjour f) bonjour
(entrer 3 f) 3
(entrer 5 f) 5
(sortir f) bonjour
(sortir f) 3
(sortir f) 5
On peut dfinir une file comme tant une rfrence une liste puisque la fonctions car
(pour sortir) opre sur sa tte (le dbut) tandis que la fonction append (pour entrer) op-
rent sur sa fin (Cf. figure 22, page 137).
6.7.4 Le Dictionnaire.
Nous avons dj eu besoin, et nous aurons souvent besoin, d'une structure pour ranger un
ensemble de couples nomvaleur. Une telle structure est appele un dictionnaire, elle per-
met de ranger une valeur en lui associant un nom unique qui permettra de la retrouver.
On va dfinir la structure de dictionnaire par son constructeur dictionnaire-vide et
les deux oprations
inserer ralise soit la dfinition dune variable soit son affectation si elle a
dj t dfinie.
consulter rend la valeur lie un nom.
Une application vidente dune variante de dictionnaire est la reprsentation des environ-
nements. Le fonctionnement dun dictionnaire peut tre illustr par les expressions suivan-
tes
(define d (dictionnaire-vide))
(inserer 'baz 10 d) 10
(inserer 'bar 7 d) 7
(inserer 'foo 5 d) 5
(consulter 'foo d) 5
(consulter 'baz d) 10
(consulter 'bar d) 7
(consulter 'syngnathe
4
d) ()
(inserer 'foo 8 d) 8
4
poisson marin corps et museau trs allong de l'ordre des catostomes.
(define file-vide
(lambda () (reference-a nil)))
(define entrer
(lambda (x &f)
(ref! &f (append (&f) (list x))) x))
(define sortir
(lambda (&f)
(let ((x (car (&f))))
(ref! &f (cdr (&f))) x)))
Fig. 22 : Dfinition dune file son constructeur et ses oprateurs dentre et de
sortie.
Les Structures mutables Quelques structures mutables trs utiles.
- 138 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
(consulter 'foo d) 8
Le dictionnaire sera reprsent par une rfrence la liste qui contient les paires nomva-
leur (Cf. figure 23, page 138). Sa dfinition utilise la fonction primitive de Scheme assq
qui parcourt une liste de paires afin den extraire celle dont le car est eq?-gal une
cl donne et dont la dfinition formelle est la suivante
(define assq
(lambda (s lp)
(cond ((null? lp) nil)
((eq? s (caar lp)) (car lp))
(else (assq s (cdr lp))))))
Une application curieuse des dictionnaires est la dfinition d'un mmoseur de fonction.
Lorsque certaines fonctions sont trs longues calculer et lorsqu'on se rend compte qu'on
refait frquement le mme calcul, il peut tre intressant de stocker les rsultats dj obte-
nus. Un dictionnaire est tout indiqu pour faire a.
Un mmoseur de fonction
5
cre, partir de la fonction qu'on lui donne, une fonction m-
mose, c'est dire associe sa table des rsultats dj calculs. Cette fonction mmose
vrifie avant d'effectuer un calcul que le rsultat de celui-ci n'est pas dj dans la table. La
dfinition d'un mmoseur est donn figure 24, page 138.
5
On ne peut, bien sr, mmoser ici que de vraies fonctions un argument comparable laide du prdicat
eq?.
(define dictionnaire-vide
(lambda () (reference-a nil)))
(define consulter
(lambda (n &d)
(let ((p (assq n (&d))))
(if p (cdr p)))))
(define inserer
(lambda (n v &d)
(let ((p (assq n (&d)))
(q (cons n v)))
(if p (set-cdr! p v) (ref! &d (cons q (&d))))
v)))
Fig. 23 : Dfinition dun dictionnaire son constructeur et ses oprateurs dinser-
tion et dextraction.
(define memoiser
(lambda (f)
(let ((dr (dictionnaire-vide)))
(lambda (x)
(let ((r (consulter x dr)))
(if r r (inserer x (f x) dr)))))))
Fig. 24 : Memoseur de fonctions.
Les Structures mutables Variables, Environnements & autres Considrations.
- 139 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Dfinissons la fonction fact
(define fact
(lambda (n)
(if (= n 1) 1 (* n (fact (- n 1)))))
et crons une fonction factorielle mmose
(define memo-fact (memoiser fact))
qui n'effectuera jamais deux fois le mme calcul.
6.8 Variables, Environnements & autres Considrations.
Ce paragraphe peut tre saut en premire lecture, mais sa lecture peut apporter une com-
prhension profonde des mcanismes utiliss pour grer les environnements et les varia-
bles.
Lexpression
est absurde car les variable solde, retirer et dposer ont t values trop tt. Le problme
ne se poserait pas si les liens nomvaleur avaient t rangs quelque part pour tre valus
seulement en cas de besoin.
Une variable sera donc reprsente par un lien nomvaleur dans lequel nom et valeur
conservent leur identit et on appellera environnement la structure qui permet de ranger les
liens en attente dvaluation.
Afin de fixer les ides, nous allons considrer quil existe un ensemble denvironnements
E, un ensemble de symboles S et un ensemble de valeurs V. Les symboles de S peuvent tre
utiliss pour nommer les lments de V.
Nous supposerons, galement, que le type Paire est prdfini et que les fonctions suivantes
sont primitives
6
.
6
Nous donnerons un peu plus loin une dfinition de ces fonctions.
m m solde = ( ) 0 ,
m retirer = ( ) x affecter 0 0 x , ( ) ( ) ,
m dposer = ( ) x affecter 0 0 x + , ( )
Les Structures mutables Variables, Environnements & autres Considrations.
- 140 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Ces fonctions vont nous permettre de dfinir la smantique de lvaluation dun symbole,
dune abstraction fonctionnelle et en dduire une dfinition de la fonction .
6.8.1 Dfinitions des Fonctions et .
Les fonctions et sont facile dfinir
6.8.2 Smantique dun Symbole.
La valeur dun symbole est recherche dans lenvironnement dans lequel se fait lvalua-
tion. Si le symbole nest pas trouv dans cet environnement, on poursuit la recherche dans
son environnement-pre. Le rsultat est soit la valeur qui a t lie au symbole, soit si le
symbole nest trouv nulle part.
Nota: ce mcanisme permet de dfinir plusieurs fois un symbole dans une hirarchie den-
vironnements, cest la valeur lie dans lenvironnement courant qui sera obtenue. Cest
exactement leffet que nous voulions obtenir.
La fonction rend lenvironnement obtenu
en ajoutant le lien cr entre le symbole s et la valeur
v lenvironnement e donn.
La fonction modifie lenvironnement e
donn en remplaant la valeur associe au symbole s
par la valeur v et rend v.
La fonction rend la valeur lie au symbole s
dans lenvironnement e.
La fonction recherche, partir de lenviron-
nement e, lenvironnement o le symbole s est li.
La fonction rend un environnement vide dont
lenvironnement e est le pre.
E S V E :
e s v , , ( )
E S V E :
e s v , , ( )
E S V :
e s , ( )
E S E :
e s , ( )
E E :
e ( )
Apply( )
( ) ( )
s
soit : e s , ( ) =
dans : e ( ) ,
e = ( )
soit : e pre , ( ) s , ( ) =
dans : e ( ) e ,

=
e pre e , , ( ) =
s Eval

[[ ]]
soit : e s , ( ) =
dans : e ( ) e s , ( ) ,
=
Les Structures mutables Exercices.
- 141 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
6.8.3 Smantique de set!.
La smantique de loprateur set! est facile dfinir prsent
6.8.4 Smantique dune Forme lambda.
Considrons, dans un premier temps, les abstractions fonctionnelles un seul paramtre. Ce
cas nest pas un cas particulier puisque nous avons vu (paragraphe 2.4.3, page 22) que toute
fonction pouvait tre mise sous forme curryfie. Dans ces conditions, lvaluation dune
abstraction fonctionnelle peut tre dfinie par
Une procdure est alors la liste de lenvironnement qui existait au moment o elle est cre
(il est captur), du symbole qui reprsente son paramtre et de son expression de dfinition.
6.8.5 La Fonction .
La structure des procdures tant dfinie, on peut dfinir la fonction correspon-
dante.
Lexpression de dfinition de la procdure est value dans lenvironne-
ment obtenu en tendant lenvironnement qui avait t captur au moment de la dfinition
de la procdure par lenvironnement qui contient le lien cr entre le param-
tre de la procdure et largument de lapplication v.
6.8.6 Smantique dune Forme letrec.
La seule difficult rencontre dans la dfinition de la smantique de letrec est la cons-
truction de lenvironnement rcursif associ
6.9 Exercices.
E-76 En sinspirant des structures mutables dfinies ci-dessus, on se propose de dfinir une struc-
ture mutable Ensemble.
(set! s x) Eval

[[ ]]
soit : e s , ( ) =
dans : e ( ) e s x , , ( ) ,
=
(lambda (x) <exp>) Eval

[[ ]] cons cons x cons <exp> , ( ) , ( ) , ( ) =


Apply( )
Apply( )
p v , Apply( )
soit : e car p ( ) ( ) cadr p ( ) v , , ( ) =
dans : Eval
e
caddr p ( ) [[ ]]
=
caddr p ( )
car p ( )
cadr p ( )
(letrec ((f <exp1>) <exp2>) Eval

[[ ]]

soit :
soit : e ( ) f , , ( ) =
dans : e f Eval
e
<exp1> [[ ]] , , ( )
dans : Eval
e
<exp2> [[ ]]
=
Les Structures mutables Exercices.
- 142 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
1. Dfinir, au pralable, les fonctions suivantes qui oprent sur une liste
(within? x lst)
prdicat rendant #T si lobjet x est un lment de la liste lst.
(collect pred? lst)
rend la liste des lments de la liste lst pour lesquels le prdicat pred?
rend #T.
(reject pred? lst)
rend la liste des lments de la liste lst pour lesquels le prdicat pred?
rend #F.
2. En utilisant les fonctions prcdentes (et dautres), dfinir la structure mutable Ensem-
ble travers les procdures suivantes
(ensemble-vide)
rend un ensemble vide.
(appartient-a? x ens)
prdicat rendant #T si lobjet x appartient lensemble ens.
(ensemble->liste ens)
rend la liste des lments de lensemble ens.
(inserer-dans x ens)
ajoute lobjet x lensemble ens, sauf sil y est dj et rend ens.
(tout-inserer-dans lst ens)
insre dans lensemble ens tous les lments de la liste lst et rend ens.
(liste->ensemble lst)
rend lensemble construit partir de tous les lments de la liste lst.
(retirer-de x ens)
retire lobjet x de lensemble ens et rend ens modifi.
(tout-retirer-de ensd ens)
retire de lensemble ens tous les lments de lensemble ensd et rend
lensemble ens modifi.
(pour-tous-faire proc ens)
applique la procdure proc chaque lment de ens.
(collecter-dans pred? ens)
rend lensemble de tous les lments de ens pour lesquels le predicat
pred? rend #T.
(rejeter-de pred? ens)
rend lensemble de tous les lments de ens pour lesquels le predicat
pred? rend #F.
Vous avez, probablement sans mme vous en rendre compte, fait une hypothse sur la na-
ture des lments que cet ensemble peut contenir. Prcisez laquelle et trouver une mthode
permettant dviter de la faire.
E-77 Mme exercice que ci-dessus pour la dfinition dune structure mutable de Multi-Ensem-
ble. Un multi-ensemble (les anglo-amricains disent bag) est une collection dlments pas
ncessairement uniques. Chaque lment est donc caractris par son nombre doccuren-
ces.
Les Structures mutables Exercices.
- 143 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
E-78 Modifier la dfinition donne prcdemment pour une structure mutable Dictionnaire afin
den faire une structure mutable Dictionnaire-Tri. Le paramtre de construction dun dic-
tionnaire tri vide sera un prdicat rendant #T lorsque les deux lments compars sont
dans le bon ordre.
E-79 Dfinir une structure mutable Agenda qui permet :
de fixer un rendez-vous pour une date donne,
dannuler le rendez-vous fix une date donne,
de vrifier quun rendez-vous na pas t pris pour une date donne,
de faire la liste des rendez-vous venir,
dannuler tous les rendez-vous passs.
Nota: Afin de ne pas inutilement compliquer le problme, on reprsentera les dates par un
simple nombre entier dunits de temps, on se limitera un seul rendez-vous par unit de
temps. Un rendez-vous sera un objet dont il nest pas ncessaire de prciser la nature.
E-80 Considrons la smantique dune forme letrec telle quelle est dfinie au paragraphe
6.8.6, page 141. Quelle proprit doit ncessairement satisfaire la forme <exp1> pour que
cette smantique soit acceptable ?
E-81 Reprendre la dfinition de la file donne au paragraphe 6.7.3, page 136. Cette dfinition est
peu efficace car pour chaque entre, une nouvelle liste est cre. Trouver un dfinition de
la file qui nentrane pas cet inconvnient.
Nota: reprer le dbut et la fin de la file par une paire quon peut considrer comme un
couple de pointeurs. Attention, cet exercice est difficile.
Les Structures mutables Exercices.
- 144 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
- 145 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
7. Reprsentation des
Donnes abstraites.
Pour illustrer de faon concrte le mcanisme de reprsentation des donnes imaginons une
petite application trs simple, mais trs significative tire du monde de la gestion. Cette tu-
de de cas va, en outre, permettre d'illustrer les diffrents aspects du dveloppement d'une
application informatique :
1. Les spcifications gnrales d'une application sont tablies indpendamment de
toute ide de ralisation, elles tablissent un modle de l'application concevoir en
dfinissant son architecture et en mettant en vidence ses concepts fondamentaux.
2. Les spcifications dtailles prcisent les concepts labors dans les spcifications
gnrales, elles prennent en compte l'existence d'outils gnraux pour choisir la
reprsentation utilise pour les diffrents concepts de l'application parmi un ensem-
ble de reprsentations possibles. Elles introduisent les concepts annexes ncessaires.
3. Les spcifications dtailles peuvent mettre en vidence des fonctions d'usage gn-
ral dvelopper, qui vont accrotre la base d'outils de l'entreprise. Faire rutilisable
est un investissement cl pour l'avenir.
Reprsentation des Donnes abstraites. Le Mgateuf Gym Center.
- 146 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
7.1 Le Mgateuf Gym Center.
Le responsable d'une petite salle de sport a besoin de grer le fichier de ses clients. Pour
cela il tablit des fiches-client qui regroupent toutes les informations ncessaires sa ges-
tion et qui ont la forme suivante
7.1.1 Cahier des charges
Son systme de gestion doit permettre :
1. de tenir jour la liste des clients,
2. de savoir qui fait quoi,
3. de savoir qui a bien pay sa cotisation.
Ce cahier des charges n'est pas trs prcis, mais il en va de mme pour tous les cahiers des
charges. Par contre il va rester sans modification tout au long de cette tude de cas, ce qui
n'est pas trs raliste.
7.2 Spcifications gnrales
Les spcifications gnrales vont tablir un modle de la gestion de cette salle de sport et
dcrire les concepts de client et d'ensemble de clients. Il est de bonne stratgie de spcifier
d'abord les entits correspondant aux niveaux d'abstractions les plus levs. Cela garantit
qu'il ne sera pas ncessaire de revenir trop souvent sur une spcification dj tablie lors-
qu'on s'aperoit qu'elle n'est pas adapte.
Ces spcifications ne dfinissent que les interfaces visibles associes aux paquetages Fi-
chier-Clients et Client. Les corps de ces paquetages ne seront dfinis que dans le cadre des
spcifications dtailles.
7.2.1 Fichier-Clients
Fichier-Clients est manifestement une structure dote du constructeur et des oprations
suivantes :
(fichier-client-vide)
Rend un fichier-clients vide.
Mgateuf Gym Center
Nom :
Prnom
Adresse :
Date de Naissance :
Activit :
Echance Cotisation :
Reprsentation des Donnes abstraites. Spcifications gnrales
- 147 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
(ajouter-client cl fic)
Ajoute le client cl au fichierfic sil ny est pas dj et rend le fichier
fic modifi.
(sont-client? nm pr fic)
Rend un fichier contenant les clients dont les nom et prnom sont nm et
pr dans le fichier fic.
(afficher-liste-clients fic)
Affiche tout le contenu du fichier fic.
(liste-clients-activite act fic)
Rend un fichier contenant les clients dans fic qui pratiquent lactivite
act.
(liste-clients-relance de fic)
Rend un fichier contenant les clients dans fic qui n'ont pas renouvel
leur cotisation la date de.
(supprimer-clients cls fic)
Retire de fic dont tous les lments contenus dans le fichier cls. Cette
primitive est typiquement associer sont-client? ou liste-
clients-relance et rend le fichier fic modifi.
7.2.2 Client
Un client est l'ensemble des renseignements contenus dans sa fiche-client et on peut le re-
prsenter par un type de donnes dont on dfinit le constructeur et les slecteurs.
(client: nm pr adr ddn act ecot)
Rend un client dfini par son nom, son prnom, son adresse, sa date de
naissance, l'activit qu'il pratique et la date d'chance de sa cotisation.
(nom-de cl)
(prenom-de cl)
(adresse-de cl)
(date-naissance-de cl)
(activite-de cl)
(echeance-cotisation-de cl)
Rendent respectivement le nom, le prnom, la date de naissance lactivit
et la date dchance de cotisation du client cl.
La cration d'un nouveau client fait apparatre la ncessit de dfinir une Date et une
Adresse.
7.2.3 Date
Les spcifications de Client ont mis en vidence la ncessit de crer une structure Date
dont on dfinit, a priori, le constructeur et les slecteurs.
(date: a m j)
Rend la nouvelle date correspondant a (anne), m (mois) et j. (jour).
(jour-de d)
(mois-de d)
Reprsentation des Donnes abstraites. Spcifications gnrales
- 148 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
(annee-de d)
Rendent respectivement le jour, le mois et lanne constituant la date d.
7.2.4 Adresse
Les spcifications de Client ont mis en vidence la ncessit de crer une structure Adresse
dont on dfinit, a priori, le constructeur et les slecteurs.
(adresse: n r cp v)
Rend une adresse associe n (numero), r (rue), cp (code-postal) et v
(ville).
(numero-de adr)
(rue-de adr)
(code-postal-de adr)
(ville-de adr)
Rendent respectivement le numro, le nom de la rue, le code postal et la
ville constituant ladresse adr.
7.2.5 Simulons les Spcifications
Voyons comment vont pouvoir s'exprimer les manipulations de Fichier-Clients dfinies
dans le cahier des charges.
Crer quelques clients :
(define cl1 (client: "Church"
"Alonzo"
(adresse: 14
"rue de l'implication"
"06000"
"Cannes")
(date: 1 1 1903)
'musculation
(date: 15 12 1993)))
(define cl2 (client: "Kleene"
"Stephen"
(adresse: 28
"av. de la dduction"
"06000"
"Menton")
(date: 10 1 1909)
'aerobique
(date: 18 12 1993)))
(define cl3 (client: "Schwartzenegger"
"Arnold"
(adresse: 42
"boulevard du biceps"
"06100"
"Nice")
(date: 21 12 1943)
'musculation
(date: 16 12 1993)))
Reprsentation des Donnes abstraites. Spcifications gnrales
- 149 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Dfinir le fichier-clients :
(define fic-MGC (fichier-client-vide))
Ajouter quelques clients :
(ajouter-client cl1 fic-MGC)
(ajouter-client cl2 fic-MGC)
(ajouter-client cl3 fic-MGC)
Afficher la liste des clients :
(afficher-liste-clients fic-MGC)
nom : Church
prenom : Alonzo
adresse : 14, rue de l'implication - 06000 Cannes
date de naissance : 1/1/1903
activit : MUSCULATION
chance de cotisation : 15/12/1993
nom : Kleene
prenom : Stephen
adresse : 28, av. de la dduction - 06000 Menton
date de naissance : 10/1/1909
activit : AEROBIQUE
chance de cotisation : 18/12/1993
nom : Schwartzenegger
prenom : Arnold
adresse : 42, boulevard du biceps - 06100 Nice
date de naissance : 21/12/1943
activit : MUSCULATION
chance de cotisation : 16/12/1993
Identifier un client :
(afficher-liste-clients (sont-client? "Church"
"Alonzo"
fic-MGC))
nom : Church
prenom : Alonzo
adresse : 14, rue de l'implication - 06000 Cannes
date de naissance : 1/1/1903
activit : MUSCULATION
chance de cotisation : 15/12/1993
Liste des clients pratiquant la musculation :
(afficher-liste-clients
(liste-clients-activite 'musculation fic-MGC))
nom : Church
prenom : Alonzo
adresse : 14, rue de l'implication - 06000 Cannes
date de naissance : 1/1/1903
activit : MUSCULATION
chance de cotisation : 15/12/1993
Reprsentation des Donnes abstraites. Spcifications dtailles
- 150 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
nom : Schwartzenegger
prenom : Arnold
adresse : 42, boulevard du biceps - 06100 Nice
date de naissance : 21/12/1943
activit : MUSCULATION
chance de cotisation : 16/12/1993
Liste des clients dont la cotisation n'est pas jour au 15/12/1993 :
(afficher-liste-clients
(liste-clients-relance (date: 15 12 1993) fic-MGC))
nom : Church
prenom : Alonzo
adresse : 14, rue de l'implication - 06000 Cannes
date de naissance : 1/1/1903
activit : MUSCULATION
chance de cotisation : 15/12/1993
Supprimons les clients non jour au 15/12/1993 :
(afficher-liste-clients
(supprimer-clients
(liste-clients-relance (date: 15 12 1993) fic-MGC)
fic-MGC))
nom : Kleene
prenom : Stephen
adresse : 28, av. de la dduction - 06000 Menton
date de naissance : 10/1/1909
activit : AEROBIQUE
chance de cotisation : 18/12/1993
nom : Schwartzenegger
prenom : Arnold
adresse : 42, boulevard du biceps - 06100 Nice
date de naissance : 21/12/1943
activit : MUSCULATION
chance de cotisation : 16/12/1993
Il ne reste plus qu' vrifier auprs du client que le modle tabli est acceptable. Il est pos-
sible, donc souhaitable, de rdiger ds prsent la notice d'utilisation de l'application.
7.3 Spcifications dtailles
Les spcifications gnrales ayant t acceptes, on peut commencer dfinir les spcifi-
cations dtailles qui dcrivent les corps associs aux diffrents paquetages. Pour cela, il est
ncessaire de choisir une reprsentation de Fichier-Clients, de Client, de Date et de
Adresse.
7.3.1 Fichier-Clients
La reprsentation la plus naturelle de Fichier-Clients est un Ensemble de clients puisqu'on
ne connait pas, a priori, le nombre des clients grer et quil ne doit pas y avoir deux clients
Reprsentation des Donnes abstraites. Spcifications dtailles
- 151 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
identiques. Cette reprsentation tant choisie, on peut dfinir les primitives spcifies. Pour
cela nous allons, bien sr
1
, utiliser les oprations de manipulation des ensembles telles
quelles ont t dfinies dans lexercice E-76.
Les spcifications dtailles de Fichier-Clients sont donc.
(define fichier-client-vide
(lambda () (ensemble-vide)))
(define ajouter-client
(lambda (cl fic)
(inserer-dans cl fic)))
(define afficher-liste-clients
(lambda (fic)
(pour-tous-faire afficher-client fic)))
(define sont-clients?
(lambda (nm pr fic)
(collecter-dans
(lambda (cl) (and (eqv? nm (nom-de cl))
(eqv? pr (prenom-de cl))))
fic))))
(define liste-clients-activite
(lambda (act fic)
(collecter-dans
(lambda (cl) (eq? act (activite-de cl)))
fic))))
(define liste-clients-relance
(lambda (de fic)
(collecter-dans
(lambda (cl)
(posterieure-a? de (echeance-cotisation-de cl)))
fic))))
(define supprimer-clients
(lambda (cls fic)
(tout-retirer-de cls fic)))
On se rend compte que le choix des primitives dfinies pour la manipulation des ensembles
est crucial pour les utilisations futures qui en seront faites. Il est donc fondamental, lors-
quon dfinit une nouvelle structure de donnes de la concevoir dans une optique de ruti-
lisation si elle prsente un caractre de gnralit prvisible.
1
Rutiliser les types, structures et fonctions dj dfinies est la cl de la programmation professionnelle.
7.3.2 Client
La solution la plus simple est de construire le vecteur des diffrentes informations qui ca-
ractrisent le client. Le constructeur et les slecteurs de Client sont:
(define client:
(lambda (nm pr adr ddn act ecot)
(vector nm pr adr ddn act ecot)))
Reprsentation des Donnes abstraites. Spcifications dtailles
- 152 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
(define nom-de (lambda (cl) (vector-ref cl 0)))
(define prenom-de (lambda (cl) (vector-ref cl 1)))
(define adresse-de (lambda (cl) (vector-ref cl 2)))
(define date-naissance-de (lambda (cl) (vector-ref cl 3)))
(define activite-de (lambda (cl) (vector-ref cl 4)))
(define echeance-cotisation-de (lambda (cl) (vector-ref cl 5)))
Les spcifications dtailles de Fichier-Clients ont fait apparatre la ncessit de complter
le type Client par une primitive d'affichage.
(define afficher-client
(lambda (cl)
(begin
(display "nom : ")
(display (nom-de cl))
(newline)
(display "prenom : ")
(display (prenom-de cl))
(newline)
(display "adresse : ")
(afficher-adresse (adresse-de cl))
(newline)
(display "date de naissance : ")
(afficher-date (date-naissance-de cl))
(newline)
(display "activite : ")
(display (activite-de cl))
(newline)
(display "echeance de cotisation : ")
(afficher-date (echeance-cotisation-de cl))
(newline)
(newline))))
On peut se rendre compte quil manque les modificateurs permettant de tenir compte du fait
que si un client change rarement de nom, de prnom et de date de naissance, il peut dm-
nager, changer lactivit quil pratique et que la date dchance de sa cotisation va changer
chaque fois quil renouvelle son inscription. Cette limitation nest pas forcment gnante
dans une premire approche car rien nempche de considrer quun client modifi est un
nouveau client, cest donc lhypothse que nous ferons.
7.3.3 Date
La reprsentation la plus simple des dates est le vecteur des diffrentes informations qui la
caractrisent. Le constructeur et les slecteurs de Date sont donc
(define date: (lambda (j m a) (vector j m a)))
(define jour-de (lambda (d) (vector-ref d 0))
(define mois-de (lambda (d) (vector-ref d 1))
(define annee-de (lambda (d) (vector-ref d 2))
Les spcifications dtailles de Fichier-Clients ont fait apparatre la ncessit de complter
le type Date par des primitives adaptes la manipulation des dates.
La comparaison de deux dates peut tre facilement effectue en en comparant deux repr-
sentations entires. Il suffit que la reprsentation d'une date soit unique pour que la compa-
Reprsentation des Donnes abstraites. Le Mgateuf Gym Center s'aggrandit
- 153 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
raison puisse s'effectuer. On peut prendre, par exemple, un nombre qui ressemble au
nombre des jours couls depuis le 1er janvier 1900
(define posterieure-a?
(lambda (d1 d2)
(let ((code (lambda (d)
(+ (jour-de d)
(* (mois-de d) 31)
(* (annee-de d) 366)))))
(> (code d1) (code d2)))))
L'affichage d'une date peut tre dfini par
(define afficher-date
(lambda (d)
(display (jour-de d))
(display "/")
(display (mois-de d))
(display "/")
(display (annee-de d)))
7.3.4 Adresse
La reprsentation la plus simple d'une adresse est le vecteur des diffrentes informations qui
la caractrisent. Le constructeur et les slecteurs de Adresse sont
(define adresse: (lambda (n r cp v) (vector n r cp v)))
(define numero-de (lambda (adr) (vector-ref adr 0)))
(define rue-de (lambda (adr) (vector-ref adr 1)))
(define code-postal-de (lambda (adr) (vector-ref adr 2)))
(define ville-de (lambda (adr) (vector-ref adr 3)))
Les spcifications dtailles de Fichier-Clients ont fait apparatre la ncessit de complter
le type Adresse par une primitive d'affichage.
(define afficher-adresse
(lambda (adr)
(begin
(display (numero-de adr))
(display ", ")
(display (rue-de adr))
(display " - ")
(display (code-postal-de adr))
(display " ")
(display (ville-de adr)))))
7.4 Le Mgateuf Gym Center s'aggrandit
Une application informatique n'est pas un objet fig, elle se corrige de ses invitables dys-
fonctionnements, s'amliore pour suivre la pression de la concurrence, bref elle vit. Une
conception robuste est capable de rsister tous ces changements le plus longtemps possi-
ble.
Poursuivons notre tude du Mgateuf Gym Center en faisant face la premire maladie
des applications informatiques, l'largissement de leur champ d'action.
Reprsentation des Donnes abstraites. Le Mgateuf Gym Center s'aggrandit
- 154 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Aprs avoir fait de bonnes affaires, le Mgateuf Gym Center rachte le Gold Gym of
Venice qui possde, lui aussi, un systme informatis pour la gestion de ses clients. Les
fichiers-clients ayant t conus indpendamment l'un de l'autre, ils n'ont pas la mme
structure.
Une astucieuse architecture de rseau permet au responsable du MGC et de GGV d'avoir
accs de manire transparente au fichier-clients du GGV et celui du MGC et bien entendu,
il nest pas question de modifier l'un ou l'autre.
7.4.1 Specifications gnrales
Supervision est l'ensemble des fichiers-clients dot du constructeur et des oprations sui-
vantes :
(connection-fichier centre)
Rend le fichier-clients du centre centre. Cette fonction tablit, en fait, la
liaison avec le centre dsir et donne un accs au fichier-clients du centre.
(liste-clients fic)
Affiche tout le contenu du fichier-clients associ fic.
(liste-par-activite act fic)
Affiche le fichier des clients contenus dans le fichier-clients associ fic
et qui pratiquent une activit act donne.
(liste-pour-relance de fic)
Affiche le fichier des clients associ fic qui n'ont pas renouvel leur
cotisation la date de.
Fig. 25 : Le rseau mondial de gestion. Les deux centres de sport sont grs indpendamment
l'un de l'autre, mais il faudrait pouvoir les superviser.
Go l d G y m o f Ve ni c e
M g a t e u f Gy m C e n t e r
S u p e r v i s i o n
Reprsentation des Donnes abstraites. Spcifications dtailles de la Supervision.
- 155 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
La spcification de la fonction liste-pour-relance met en vidence la ncessit
d'introduire un type Date dot du constructeur et des oprations suivantes:
(date: j m a)
Rend la nouvelle date correspondant a (anne), m (mois) et j (jour).
(date->MGC-date date)
Convertit date dans la reprsentation d'une date MGC.
(date->GGV-date date)
Convertit date dans la reprsentation d'une date GGV.
7.5 Spcifications dtailles de la Supervision.
Les fichiers associs aux systmes de gestion du MGC et du GGV n'tant pas structurs de
la mme manire, ils ne peuvent pas tre manipuls par les mmes fonctions.
La structure du fichier-clients MGC est suppose supporter les primitives:
(MGC-liste-clients fic)
(MGC-par-activite act fic)
(MGC-pour-relance de fic)
tandis que la structure du fichier-clients GGV est suppose supporter les primitives:
(GGV-liste-clients fic)
(GGV-par-activite act fic)
(GGV-pour-relance de fic)
Il est donc ncessaire dassocier chaque fichier un indicateur permettant de savoir avec
quelles primitives on peut le manipuler. La procdure connection-fichier va donc
associer un type explicite au fichier-clients de chaque centre:
(define (connection-fichier centre)
(cons centre (ouvrir-fichier centre)))
le type centre est un symbole pouvant tre soit MGC soit GGV et la fonction ouvrir-
fichier, non prcise ici, rend le fichier-clients du centre adress.
La structure du fichier-clients telle qu'elle est perue par Supervision est donc une paire
typevaleur laquelle on peut associer les deux slecteurs:
(define type-de (lambda (fic) (car fic)))
(define valeur-de (lambda (fic) (cdr fic)))
Rcapitulons la situation en tablissant le tableau faisant le bilan des oprations et des types:
Types
Oprateurs MGC GGV
liste-clients MGC-liste-clients GGV-liste-clients
par-activite MGC-par-activite GGV-par-activite
pour-relance MGC-pour-relance GGV-pour-relance
date date->MGC-date date->GGV-date
Reprsentation des Donnes abstraites. Aiguillage par le type.
- 156 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
L'uniformisation de l'accs aux diffrents fichier-clients a ainsi t obtenue en dfinissant
une couche de convergence et les oprateurs de Supervision crent l'illusion d'une structure
unique de fichier. On les appelle alors des oprateurs gnriques.
Nous avons alors besoin d'une mthode qui permet de slectionner le bon oprateur au bon
moment. Elle nous est fournie travers les trois approches suivantes :
1. Aiguillage par le type - chaque oprateur matrialise une ligne du tableau.
2. Programmation par transmission de messages - chaque type matrialise une
colonne du tableau.
3. Programmation dirige par les donnes - le tableau lui-mme est associ un
mcanisme dvaluation gnral.
7.6 Aiguillage par le type.
Dans ce cas les oprateurs sont intelligents (?), ils savent adapter leur action en fonction du
type de la donne quon leur soumet. Les spcifications dtailles des primitives de Su-
pervision deviennent alors :
(define liste-clients
(lambda (fic)
(cond ((eq? (type-de fic) 'mgc)
(MGC-liste-clients (valeur-de fic)))
((eq? (type-de fic) 'ggv)
(GGV-liste-clients (valeur-de fic))))))
(define par-activite
(lambda (act fic)
(cond ((eq? (type-de fic) 'mgc)
(MGC-par-activite act (valeur-de fic)))
((eq? (type-de fic) 'ggv)
(GGV-par-activite act (valeur-de fic))))))
(define pour-relance
(lambda (de fic)
(cond ((eq? (type-de fic) 'mgc)
(MGC-pour-relance (date->MGC-date de)
(valeur-de fic)))
((eq? (type-de fic) 'ggv)
(GGV-pour-relance (date->GGV-date de)
(valeur-de fic))))))
Cette technique permet de rajouter facilement de nouveaux oprateurs, par contre l'intro-
duction d'un nouveau type de donnes amne modifier tous les oprateurs gnriques
existant.
L'aiguillage par le type est une technique robuste vis vis des changements qui indui-
sent prfrentiellement une modification du nombre des oprateurs.
Reprsentation des Donnes abstraites. Programmation par Transmission de Messages
- 157 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
7.7 Programmation par Transmission de Messages
Dans ce cas, les objets sont intelligents (?), ils savent identifier l'opration effectuer et
choisir la procdure adquate. Dfinissons, alors, les deux types intelligents Fichier-MGC
et Fichier-GGV partir de leur constructeur:
(define fichier-MGC:
(lambda (fic)
(lambda (message)
(cond ((eq? message 'fichier) fic)
((eq? message 'liste-clients) MGC-liste-clients)
((eq? message 'par-activite) MGC-par-activite)
((eq? message 'pour-relance) MGC-pour-relance)
((eq? message 'date) date->MGC-date)))))
(define fichier-GGV:
(lambda (fic)
(lambda (message)
(cond ((eq? message 'fichier) fic)
((eq? message 'liste-clients) GGV-liste-clients)
((eq? message 'par-activite) GGV-par-activite)
((eq? message 'pour-relance) GGV-pour-relance)
((eq? message 'date) date->GGV-date)))))
Nous venons dutiliser la technique de transmission de messages que nous avions dj ren-
contre. L'oprateur connection-fichier devient alors:
(define connection-fichier
(lambda (centre)
(cond ((eq? centre 'mgc)
(fichier-MGC: (ouvrir-fichier centre)))
((eq? centre 'ggv)
(fichier-GGV: (ouvrir-fichier centre)))))
et enfin les oprateurs gnriques sont dfinis par:
(define liste-clients
(lambda (fic)
((fic 'liste-clients) (fic 'fichier))))
(define par-activite
(lambda (act fic)
((fic 'par-activite) act (fic 'fichier))))
(define pour-relance
(lambda (de fic)
((fic 'pour-relance) ((fic 'date) de) (fic 'fichier))))
La gnricit des oprateurs est obtenue grce une proprit puissante de la programma-
tion par transmission de message, le mme message est interprt de manire diffrente par
les objets qui le reoivent, cette proprit est appele polymorphisme. Le polymorphisme
est une des mthodes les plus puissantes qu'on connaisse pour crer des oprateurs gnri-
ques.
Cette technique permet de rajouter facilement de nouveaux types de donnes, par contre
l'introduction d'un nouvel oprateur amne modifier tous les types de donnes concerns
existant.
Reprsentation des Donnes abstraites. Programmation dirige par les Donnes.
- 158 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
La transmission de messages est une technique robuste vis vis des changements qui
induisent prfrentiellement une modification du nombre des types de donnes.
7.8 Programmation dirige par les Donnes.
Afin d'organiser l'aiguillage de manire plus souple, dfinissons, au pralable, une structure
Aiguillage reprsentant un tableau gnral deux entres permettant la ralisation du ta-
bleau ci-dessus. Une telle structure est indpendante de lapplication supervise, elle est
simplement paramtre pour en dcrire larchitecture.
7.8.1 Spcifications gnrales de lAiguillage.
La structure Table est un tableau dont les lments sont reprs par un symbole de ligne et
un symbole de colonne. Elle est dote du constructeur et des oprations suivantes:
(table-vide)
Rend une table daiguillage vide.
(table-ajouter-element s-lgn s-col x tab)
Ajoute llment x dans la ligne repre par le symbole s-lgn lempla-
cement repr par le symbole s-col dans la table tab.
(table-consulter s-lgn s-col tab)
Rend llment enregistre la ligne s-lgn et dans la colonne s-col
dans la table tab.
7.8.2 Utilisation de Table dans le Cadre de lApplication.
La table prcdente est simplement construite par :
(define *mgc-ggv* (table-vide))
Cette table daiguillage est ncessairement unique pour lapplication MGC-GGV, il est
donc de bonne politique den faire une variable globale afin dtre sr que, par erreur, une
autre table nest pas utilise.
Il est commode dintroduire une fonction de construction de laiguillage
(define operateur
(lambda (tp nm proc)
(table-ajouter-element nm tp proc *mgc-ggv*)
On introduit, alors, toutes les oprations qui ont t dfinies pour lapplication MGC-GGV:
(operateur mgc liste-clients MGC-liste-clients)
(operateur mgc par-activite MGC-par-activite)
(operateur mgc pour-relance MGC-pour-relance)
(operateur mgc date date->MGC-date)
(operateur ggv liste-clients GGV-liste-clients)
(operateur ggv par-activite GGV-par-activite)
(operateur ggv pour-relance GGV-pour-relance)
(operateur ggv date date->GGV-date)
Reprsentation des Donnes abstraites. Programmation dirige par les Donnes.
- 159 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
La fonction connexion-fichier est identique celle qui avait t dfinie pour la ra-
lisation par aiguillage par le type. Les fichiers sont donc typs explicitement et la mtho-
de dvaluation associe lapplication MGC-GGV peut alors tre dfinie par:
(define faire
(lambda (fic op . arg)
(let ((proc ((table-consulter op (type-de fic) *mgc-ggv*))))
(if (null? arg)
(proc (valeur-de fic))
(proc (car arg) (valeur-de fic))))))
et les primitives de Fichier-Clients peuvent tre dfinies par:
(define liste-clients
(lambda (fic)
(faire fic liste-clients))
(define par-activite
(lambda (act fic)
(faire fic par-activite act)))
(define pour-relance
(lambda (de fic)
(faire fic pour-relance (faire fic date de))))
L'utilisation de ces fonctions est illustre par les valuations suivantes :
(define fichier-actif (connection-a-fichier 'ggv))
Le fichier-clients du centre GGV est ouvert et est accessible sous le nom fichier-ac-
tif. Pour obtenir la liste des clients, il suffit d'valuer:
(liste-clients fichier-actif)
pour obtenir la liste des clients pratiquant la musculation, il suffit d'valuer :
(par-activite 'musculation fichier-actif)
et pour obtenir celle des clients dont la cotisation n'est pas jour au 15/12/1993, il suffit
d'valuer:
(pour-relance (date: 15 12 1993) fichier-actif)
Rajouter de nouveaux oprateurs et/ou un nouveau type de donnes devient extrmement
simple, il suffit de dfinir le symbole nommant ce type ou cet oprateur puis de mettre
jour la table d'aiguillage.
Cette technique est extrmement robuste et doit tre envisage chaque fois que le cahier des
charges de lapplication raliser ne semble pas trs stabilis.
7.8.3 Spcifications dtailles de Table.
La structure Table peut tre reprsente par un dictionnaire qui regroupe chaque ligne re-
prsente elle-mme par un dictionnaire. Ses spcifications dtailles sont alors:
(define table-vide
(lambda () (dictionnaire-vide)))
(define table-ajouter-element
(lambda (s-lgn s-col x tab)
(let ((lgn (table-consulter s-lgn tab)))
(if lgn
Reprsentation des Donnes abstraites. Le Cycle de Vie dun Logiciel
- 160 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
(inserer s-col x lgn)
(let ((lgn (inserer s-lgn (dictionnaire-vide) tab)))
(inserer s-col x lgn))))))
(define table-consulter
(lambda (s-lgn s-col tab)
(consulter s-col (consulter s-lgn tab))))
7.9 Le Cycle de Vie dun Logiciel
Avant de commencer, rappelons le cadre du dveloppement professionnel d'une applica-
tion informatique en introduisant quelques ides qui seraient dvelopper considrable-
ment dans le cadre d'un cours consacr au Gnie Logiciel. On a coutume de reprsenter le
cycle de vie d'un logiciel par le schma en V suivant:
La programmation dirige par les donnes colle remarquablement bien ce schma. Les
spcifications gnrales permettent de dfinir la table daiguillage tandis que les spcifica-
tions dtailles permettent de dfinir les oprateurs lmentaires.
Elle est, de plus, particulirement adapte au travail en quipe. Chaque membre de lquipe
est charg de la dfinition des oprations lmentaires que le chef de projet intgre lors-
quelles ont t valides.
Fig. 26 : Le cycle de vie d'un logiciel.
Besoins & Envies
Cahier des Charges
Spcifications gnrales Intgration
Spcifications dtailles Tests unitaires
Programmation
Devis
Recette
Facture
Paiement
Analyser & Concevoir Finaliser
Implmenter
Reprsentation des Donnes abstraites. Exercices.
- 161 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
7.10 Exercices.
E-82 On sest aperu au paragraphe 7.3.2, page 151 que les spcifications de Client supposent
quun client est un structure non mutable. Modifiez les spcifications de Client pour en fai-
re une structure mutable et modifier, en consquence, les spcifications des autres structu-
res de donnes concernes.
E-83 On se propose de raliser la gestion des stocks dun petit commerce de dtail. Ce commerce
revend diffrents articles quil peut se procurer auprs de ses diffrents fournisseurs.
Nota: Afin de rendre la rsolution de ce problme plus progressive, les questions sont po-
ses en ordre inverse comme si lanalyse avait dj t faite. Certaines questions ne prci-
sent pas tous les lments permettant dlaborer une rponse. Dans ce cas, il vous
appartient de faire les choix qui vous semblent judicieux et den prciser clairement la na-
ture.
1. Dfinir un type Articles par son constructeur et ses slecteurs sachant quun article en
stock est caractris par:
rf sa rfrence - un nombre entier positif,
dnom sa dnomination - une chane de caractres,
pvu son prix de vente unitaire - un nombre entier,
qt la quantit en stock.
2. Dfinir un type Stock par son constructeur et son slecteur, sachant quun stock est un
ensemble darticles caractriss par une rfrence qui doit donc tre unique. Dfinir les
fonctions suivantes:
en-stock?
rponds vrai si un article dune rfrence rf donne est en stock.
article-en-stock
rend larticle dune rfrence donne. Cette fonction rend faux si larticle
nest pas prsent.
rfrence-crer
rend un stock contenant tous les articles dun stock donn et un nouvel
article de rfrence rf de dnomination dnom et de prix de vente unitaire
pvu sil ny est pas dj. Sa quantit en stock qt est alors nulle.
3. Utiliser les deux types de donnes prcdents pour dfinir les fonctions de manipula-
tion suivantes:
article-ajouter
ajoute n exemplaires de larticle de rfrence rf dans le stock stk.
article-retirer
retire, si possible, n exemplaires de larticle de rfrence rf du stock stk.
stock-valeur
rend la valeur totale du stock. Cette information permet de valoriser le
stock au moment de ltablissement du bilan.
On se propose, prsent, de perfectionner cette gestion de stock en y adjoignant une gestion
des rapprovisionnements.
Reprsentation des Donnes abstraites. Exercices.
- 162 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
4. Modifier le type Articles en lui adjoignant les champs suivants:
pau prix dachat unitaire - un nombre entier,
qt-alrt quantit minimale dalerte - un nombre entier.
Parmi les fonctions prcdemment dfinies identifier celles qui doivent tre modifies et en
donner la nouvelle version.
5. Dans ce nouveau contexte, dfinir les fonctions suivantes:
stock-rappro
donne la liste des rfrences dont la quantit en stock est en-dessous du
seuil dalerte.
stock-cot-rappro
dtermine le cot dun rapprovisionnement qui ramnerait toutes les
quantits en stock au seuil dalerte.
6. Modifier le type Articles en lui adjoignant le champ
fnrs fournisseur de larticle - un symbole.
Parmi les fonctions prcdemment dfinies identifier celles qui doivent
tre modifies et en donner la nouvelle version. Dans ce nouveau contexte
dfinir la fonction stock-fournisseurs qui rend la liste de tous les four-
nisseurs chacun tant associ la liste des produits quil fournit.
Nota: cet question exige une analyse un peu plus approfondie sur laquelle nous ne don-
nerons aucune indication.
Reprsentation des Donnes abstraites. Annexe : structure Ensemble.
- 163 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
7.11 Annexe : structure Ensemble.
Fonction pour complter les manipulatiuons de liste :
(define within?
(lambda (x lst)
(cond ((null? lst) #F)
((equal? x (car lst)) #T)
(else (within? x (cdr lst))))))
(define collect
(lambda (pred? lst)
(cond ((null? lst) nil)
((pred? (car lst)) (cons (car lst)
(collect pred? (cdr lst))))
(else (collect pred? (cdr lst))))))
(define reject
(lambda (pred? lst)
(let ((not-pred? (lambda (x) (not (pred? x)))))
(collect not-pred? lst))))
Spcifications dtailles de la structure Ensemble :
(define ensemble-vide
(lambda () (reference-a nil)))
(define ensemble->liste
(lambda (ens) (ens)))
(define appartient-a?
(lambda (x ens) (within? x (ensemble->liste ens))))
(define inserer-dans
(lambda (x ens)
(if (appartient-a? x ens)
ens
(ref! ens (cons x (ensemble->liste ens))))))
(define tout-inserer-dans
(lambda (lst ens)
(if (null? lst)
ens
(tout-inserer-dans (cdr lst)
(inserer-dans (car lst) ens)))))
(define liste->ensemble
(lambda (lst)
(tout-inserer-dans lst (ensemble-vide))))
(define retirer-de
(lambda (x ens)
(ref! ens (reject (lambda (y) (equal? y x))
(ensemble->liste ens)))))
(define tout-retirer-de
(lambda (ens1 ens2)
Reprsentation des Donnes abstraites. Annexe : structure Ensemble.
- 164 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
(ref! ens2
(reject (lambda (y) (appartient-a? y ens1))
(ensemble->liste ens2)))))
(define pour-tous-faire
(lambda (proc ens)
(for-each proc (ensemble->liste ens))))
(define collecter-dans
(lambda (pred? ens)
(liste->ensemble (collect pred? (ensemble->liste ens)))))
(define rejeter-de
(lambda (pred? ens)
(liste->ensemble (reject pred? (ensemble->liste ens)))))
Reprsentation des Donnes abstraites. Annexe : structure Ensemble.
- 165 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
- 166 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
8. Objets & Programmation
Oriente Objets
J'appellerai socit de l'esprit ce systme selon lequel chaque esprit est
compos d'un grand nombre de petits processus que nous appellerons
agents. Chaque agent ne peut, lui seul, effectuer que quelques tches
simples ne demandant ni esprit ni rflexion. Pourtant, le regroupement de
ces agents en socits selon des modalits bien particulires peut
aboutir la vritable intelligence.
Marvin Minsky
La Socit de l'Esprit
Nous allons tenter de fixer ici les principales ides sous-jacentes au concept d'objet. Ce con-
cept n'est pas apparu sous la forme d'une construction purement thorique ayant trouv une
ralisation, il est le fruit de l'volution. C'est ce qui fait, la fois, sa force et sa faiblesse.
C'est sa force en ce sens qu'il s'est forg partir d'une profonde ncessit et c'est sa faiblesse
car d'une part il ne peut pas tre considr comme dfinitif et d'autre part il souffre de la
prsence de mutants probablement mal forms et n'ayant pas encore subis le filtre de la s-
lection naturelle.
Dire que le logiciel est en crise est un lieu commun. Pourtant, il est incontestable qu'il
existe, aujourd'hui de bons logiciels le traitement de texte que je suis en train d'utiliser
en est la preuve. Il est donc possible de crer des logiciels comme on fabrique des appareils
lectromnagers : conomiques, raisonnablement fiables, agrables utiliser et prsentant
une esthtique indiscutable.
Mais o se situe donc le problme ? Il se situe l o se situait le problme de la construction
des grands btiments la fin du moyen-ge, certaines cathdrales s'tant effondres plu-
sieurs fois avant de trouver leur forme dfinitive.
On construit, aujourd'hui encore, les logiciels diffusion restreinte par essais et erreurs, ils
ne bnficient pas de l'volution lente due la stabilit du problme rsoudre, de sites de
tests prliminaires nombreux ni de la pression de la concurrence qui les contraindrait
Objets & Programmation Oriente Objets
- 167 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
s'amliorer pour survivre. Les professionnels sont bien conscients du problme et font de
leur mieux pour y remdier en utilisant des mthodes, des outils etc.
La figure suivante, tire d'un ouvrage
1
de B.J. Cox, illustre bien comment se situait, il y a
une dizaine d'annes, le problme pos par ces logiciels-l.
1
Object Oriented Programming - An Evolutionary Approach - Addison-Wesley.
Ces logiciels sont fondamentaux car ils grent des hpitaux, des administrations, ils pilotent
des avions, des missiles etc. Bien les concevoir est souvent une ncessit vitale.
L'approche objet, en considrant qu'une application est constitue d'un ensemble d'agents
cooprants, fournit un mcanisme simple et uniforme pour apprhender les diffrents as-
pects qui apparaissent ncessairement lorsque l'chelle d'une application dpasse les possi-
bilits d'un individu unique. Les deux mots simple et uniforme caractrisent un objet bien
form. Mais qu'il sera difficile de faire simple !
Si certains considrent que l'invention de la machine vapeur a marqu le dbut de l're
industrielle, dautres pensent (dont J.B.Cox) que son vrai point de dpart plutt t l'in-
vention de la pice dtache interchangeable.
En 1798, pour satisfaire une commande gouvernementale de mousquets, Eli Whitney ima-
gine de diviser le travail de telle sorte que chaque pice de l'arme puisse tre fabrique par
un spcialiste selon des standards dfinis afin que toutes les pices s'assemblent sans pro-
blme.
L'lectronique est ne pratiquement en mme temps que l'informatique, vers les annes
1945. La productivit d'un ingnieur lectronicien a t multiplie par un facteur d'environ
1 000 000 tandis que pendant le mme temps celle d'un ingnieur informaticien n'tait mul-
tiplie que par un facteur d'environ 500. Il est clair que l'invention du circuit intgr, la pice
interchangeable parfaite, est probablement la cause d'une telle divergence.
L'objet a donc pour objectif de jouer le rle de la pice interchangeable dans un systme
logiciel. En fait le mot objet semble, a posteriori, plutt mal choisi, le mot agent introduit
par Marvin Minsky serait mieux adapt car une pice dtache a toujours un rle fonction-
nel incontestable, mais nous respecterons la tradition en parlant d'objets.
Fig. 27 : Les cots dun ensemble de logiciels dvelopps pour ladministration amricaine
selon le U.S. Government Accounting Office Report - 1979.
Fournis mais
jamais utiliss
$ 2.0M
Pays mais
jamais fournis
$ 3.2M
Abandonns
ou refaits
$ 1.3M
Utiliss
tels quels
$ 0.1M
Utiliss aprs
rfection
$ 0.2M
Objets & Programmation Oriente Objets Qu'est-ce qu'un Objet ?
- 168 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
L'approche objet fait partie des stratgies efficaces pour attaquer la conception d'une appli-
cation, ce n'est donc pas une mthode proprement parler, il s'agit plutt d'un style de pro-
grammation ou mieux dun mode de raisonnement.
L'ide de pice interchangeable logicielle n'est pas rellement nouvelle, nous avons tous
utilis, et nous utilisons tous abondamment, des bibliothques de procdures toutes faites.
Mais nous avons pu constater que ces procdures ne constituent pas rellement des pices
interchangeables.
Nous allons donc voir pourquoi les objets sont bien arms pour jouer ce rle de pice inter-
changeable et nous programmerons objet pour utiliser son effet dmultiplicateur.
8.1 Qu'est-ce qu'un Objet ?
Concevoir une application sur une base modulaire est une ncessit pour, au moins, trois
raisons :
1. Il est trs difficile de traiter efficacement plus de quelques problmes simultan-
ment,
2. Le cahier des charges d'une application voluant tout au long de la ralisation, il est
plus facile de ne changer que quelques pices bien identifies,
3. La maintenance est plus facile lorsque le fait de changer une pice n'a pas de cons-
quences sur le comportement des autres pices de l'application.
Il est bien crit que l'application est conue sur une base modulaire, elle n'est pas conue en
morceaux. Le dcoupage en modules engendre la pagaille si le concept de module et le m-
canisme des interactions entre les modules ne sont pas aussi uniformes que possible.
Pour paraphraser Adele Goldberg
2
nous dirons que le secret d'une architecture russie est
l'utilisation systmatique d'une ide trs simple.
L'objet est conu pour tre une entit simple qu'on peut utiliser systmatiquement pour btir
une application modulaire. Pour pouvoir supporter de manire uniforme les diffrentes ap-
proches de modlisation que nous avons rencontrs. L'objet :
1. possde un tat interne il va permettre une utilisation saine de laffectation,
2. regroupe des fonctions qui lui sont propres il constitue une sorte de paquettage,
3. peut tre manipul comme un tout cest une abstraction.
Dot de toutes ces qualits, l'objet n'est pas une entit passive, il vaut mieux alors le consi-
drer comme un agent. L'objet est alors un outil pour construire des modules uniformes.
2
Un des concepteurs de Smalltalk 80 chez Xerox.
8.1.1 Attributs d'un Objet
Nous allons partir d'une ide un peu curieuse. Considrons les diffrentes structures de don-
ne (ventuellement mutables) que nous avons dfinis jusqu'ici et remarquons qu'elles ont
toutes t bties (ou auraient pu tre bties) sur le mme modle.
(define constructeur:
(lambda (<attributs initialiss>)
(let ((<attributs non initialiss>)
(<procdures de modification>))
Objets & Programmation Oriente Objets Qu'est-ce qu'un Objet ?
- 169 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
(lambda <message>
(cond <interprtation des messages>)))))
L'aspect universel de ce patron va nous suggrer l'ide qu'il est possible de concevoir une
structure de donnes pour crer des structures de donnes et notre premier problme
est la reprsentation des attributs d'une structure de donnes.
Un attribut est un couple nomvaleur, et nous ne connaissons pas, a priori, le nombre des
attributs associer la structure de donnes construire. Les attributs sont associs aux
oprations suivantes :
1. Dfinir - un nouvel attribut est ajout la stucture de donnes.
2. Consulter - pour rcuprer la valeur dun attribut repr par son nom.
3. Modifier - pour changer la valeur dun attribut repr par son nom.
L'ensemble des attributs d'une structure de donnes peut donc tre reprsent par un dic-
tionnaire que nous supposerons, comme d'habitude, dfini par ailleurs et analogue celui
du paragraphe 6.7.4, page 137.
Les spcifications gnrales du dictionnaire utilis sont celles de la figure 28, page 169.
Le constructeur de structures de donnes que nous appellerons objet peut tre dfini com-
me la figure 29, page 170.
Ce constructeur est trs simplifi et nous le perfectionnerons au fur et mesure de nos be-
soins, cependant, dans cet tat, il illustre parfaitement la faisabilit de notre projet.
On peut ainsi dfinir un chat
(define gros-minet (objet))
Ce n'est encore qu'une coquille vide laquelle nous allons associer deux attributs
(gros-minet 'def 'couleur "noir et blanc")
(gros-minet 'def 'age 3)
puis les consulter
(gros-minet 'get 'couleur) noir et blanc
(gros-minet 'get 'age) 3
En tout cas, on peut dfinir un constructeur de chats
(dictionnaire-vide)
Rend un dictionnaire vide.
(dictionnaire-definir nm val dic)
Introduit un nouveau couple nmval dans le dictionnaire dic. Rend
le symbole 'deja-defini en cas derreur et ok sinon.
(dictionnaire-affecter nm val dic)
Remplace la valeur associe nm par val dans le dictionnaire dic.
Rend le symbole non-defini en cas derreur et ok sinon.
(dictionnaire-consulter nm dic)
Rend la valeur associe nm dans le dictionnaire dic. Rend le sym-
bole non-defini en cas derreur.
Fig. 28 : Spcification gnrales du dictionnaire.
Objets & Programmation Oriente Objets Qu'est-ce qu'un Objet ?
- 170 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
(define chat:
(lambda (c a)
(let ((nouveau-chat (objet)))
(nouveau-chat 'def 'couleur c)
(nouveau-chat 'def 'age a)
nouveau-chat)))
On peut alors crer des chats l'aide de ce constructeur de chats, on dira quon instancie
des chats.
(define tom (chat: "gris et blanc" 2))
et accder ses attrributs en utilisant le slecteur universel get et le modificateur universel
set
(tom 'get 'couleur) gris et blanc
(tom 'get 'age) 2
(tom 'set 'age (+ 1 (tom 'get 'age)))
(tom 'get 'age) 3
Manifestement, objet est un constructeur universel de structures de donnes mutables. Il
permet galement de faire une chose que nos structures de donnes prcdentes ne permet-
taient pas : rajouter de nouveau attributs.
(tom 'def 'griffes "pointues")
Il est remarquable de constater toutes les possibilits quoffre le constructeur objet mal-
gr sa grande simplicit. Il permet de crer nimporte quelle structure mutable et chaque
fois quon lui ajoute un nouvel attribut, son slecteur et son modificateur sont fournis avec.
Nous nallons pourtant pas en rester l.
8.1.2 Mthodes & Messages d'un Objet
Perfectionnons un peu notre constructeur universel. En effet, comme nous ne connaissons
pas, a priori, le nombre des attributs, il serait trs souhaitable de vrifier qu'on ne tente pas
d'accder un attribut qui n'existe pas ou de redfinir un attribut qui existe. La prtention
de objet tre un constructeur universel oblige prendre beaucoup plus de prcautions
que dhabitude et envisager toutes les mauvaises utilisations possibles des structures cons-
truites laide d objet.
(define objet
(lambda ()
(let ((attributs (dictionnaire-vide)))
(lambda (id nom . valeur)
(cond ((eq? id 'def)
(dictionnaire-definir nom
(car valeur)
attributs))
((eq? id 'set)
(dictionnaire-affecter nom
(car valeur)
attributs))
((eq? id 'get)
(dictionnaire-consulter nom attributs))))))
Fig. 29 : Constructeur dune structure de donnes mutable universelle avec un dic-
tionnaire des attributs.
Objets & Programmation Oriente Objets Qu'est-ce qu'un Objet ?
- 171 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
Mthodes prives & Liens statiques
Ainsi, les expressions
(dictionnaire-definir nom (car valeur) attributs)
(dictionnaire-affecter nom (car valeur) attributs)
(dictionnaire-consulter nom attributs)
utilises dans la fonction de gestion des messages gagneront tre remplace par des fonc-
tions qui vrifient que l'attribut consult existe.
(define objet
(lambda ()
(let* (<dictionnaire des attributs>
(definir (lambda (nom valeur)
(let ((cr (dictionnaire-definir
nom valeur attributs)))
(if (eq? cr 'deja-defini)
(writeln "deja defini : " nom)
ok))))
(affecter (lambda (nom valeur)
(let ((cr (dictionnaire-affecter
nom valeur attributs)))
(if (eq? cr 'non-defini)
(writeln "non defini : " nom)
ok))))
(consulter (lambda (nom)
(let ((valeur (dictionnaire-consulter
nom attributs)))
(if (eq? valeur 'non-defini)
(writeln "non defini : " nom)
valeur)))))
<procdure-objet>))
La dfinition du constructeur dobjets doit tre modifie en consquence et devient celle de
la figure 30, page 171 .
Les procdures definir, affecter et consulter, associes aux messages def, set
et get constituent les mthodes de lobjet. ces procdures tant dfinies l'intrieur du
constructeur d'objet, on les appelle ses mthodes prives qui lui sont systmatiquement
lies au moment de sa construction. On dit alors que le lien entre l'objet et ses mthodes
prives est un lien statique.
(define objet
(lambda ()
(let* ((attributs (dictionnaire-vide))
(definir ...)
(affecter ...)
(consulter ...))
(lambda (id nom . valeur)
(cond ((eq? id 'def) (definir nom valeur))
((eq? id 'set) (affecter nom valeur))
((eq? id 'get) (consulter nom)))))))
Fig. 30 : Dfinition sre du constructeur dobjets.
Objets & Programmation Oriente Objets Qu'est-ce qu'un Objet ?
- 172 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
Mthodes publiques & Liens dynamiques
Si dans les exemples prcdents, les attributs dfinis ntaient, par vocation, que des don-
nes, rien nempche dintroduire un attribut sous la forme dune procdure.
(define gros-minet (objet))
(gros-minet 'def 'se-dfend
(lambda () (writeln " en griffant")))
Cette procdure peut alors tre invoque
3
aprs avoir t obtenue laide du message get.
((gros-minet get se-defend)) en griffant
On peut ainsi rajouter de nouvelles mthodes. Comme elles auront ncessairement t d-
finies l'extrieur de l'objet et on les appellera ses mthodes publiques. Si on prend la
prcaution de ne pas nommer une mthode publique avec le mme nom que celui dune m-
thode prive, on peut modifier la dfinition de objet de telle sorte que les methodse publi-
ques soient directement invoques.
(define objet
(lambda ()
(let* (<dictionnaire des attributs>
<methodes prives>)
(lambda (id . args)
(cond ((eq? id 'def) (definir (car args)(cadr args)))
((eq? id 'set) (affecter (car args)(cadr args)))
((eq? id 'get) (consulter (car args)))
(else ((consulter id))))))))
Tentons une simulation moins triviale de cette possibilit. Dfinissons un objet inter-
valle dot dune origine et dune extrmit.
(define intervalle (objet))
(intervalle def origine 5)
(intervalle def extremite 10)
Dfinissons une fonction pour le calcul du milieu de lintervalle
(define milieu (lambda (...) ...))
et associons cette procdure au message 'milieu de lobjet intervalle
(intervalle 'def 'milieu milieu)
et envoyons le message 'milieu lobjet intervalle
(intervalle 'milieu) 7.5
Ce fonctionnement tant satisfaisant, essayons de dfinir rellement la fonction milieu
(define milieu
(lambda (nom valeur)
(/ (+ (<attribut origine>)
(<attribut extremite>)
2))
Mais que sont donc ces deux termes <attribut origine> et <attribut extremite>
qu'il est ncessaire d'introduire dans la dfinition de cette fonction ?
Et bien, ce sont les attributs de lobjet qui reoit le message 'milieu. Il est donc ncessaire
de rajouter le destinataire du message dans les paramtres de la procdure-mthode. Pour
respecter la coutume, nous l'appellerons self.
3
Notez le double parenthsage.
Objets & Programmation Oriente Objets Qu'est-ce qu'un Objet ?
- 173 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
(define moyenne
(lambda (self)
(/ (+ (self 'get 'origine)
(self 'get 'extremite)
2))
La dfinition de la fonction de gestion des messages devient
(define objet
(lambda ()
(let* (<dictionnaire des attributs>
<methodes prives>)
(lambda (id . args)
(cond ((eq? id 'def) (definir (car args)(cadr args)))
((eq? id 'set) (affecter (car args)(cadr args)))
((eq? id 'get) (consulter (car args)))
(else ((consulter id) self)))))))
Lintroduction des mthodes publiques introduit un petit problme. Si maintenant, on peut
dfinir des mthodes publiques a priori quelconques, on ne peut plus se contenter du seul
argument self et il faut prvoir la possibilit dun nombre quelconque darguments sup-
plmentaires. Pour cela il suffit de modifier lgrement la structure des arguments de lob-
jet-procdure.
(define objet
(lambda ()
(let* (<dictionnaire des attributs>
<methodes prives>)
(lambda (id . args)
(let ((nom (car args))
(valeur (cadr args)))
(cond <traitements des messages de base>
(else ((consulter id) self args)))))))
Le seul problme qui persiste est celui de la dfinition de self dans objet. La variable
self reprsente l'objet qui reoit le message, cest dire lobjet lui-mme. Si on se sou-
vient qu'un objet est sa fonction de gestion des messages, on va la dfinir en lui donnant le
nom self. La dfinition de objet devient alors celle de la figure 31, page 174.
Tout objet, dans ce contexte, possde systmatiquement trois mthodes prives associes
aux messages 'def, 'set et 'get. On peut, en revanche, lui associer autant de mthodes
publiques qu'on le dsire. Ces mthodes tant attaches l'objet aprs sa cration, on dit que
le lien entre un objet et ses mthodes publiques est un lien dynamique.
Objets & Programmation Oriente Objets Qu'est-ce qu'un Objet ?
- 174 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
8.1.3 Espce d'un Objet & Hritage.
Nous avons vu que dfinir l'architecture d'une application c'est dfinir des objets et des re-
lations entre eux. Nous venons de dfinir une premire relation entre des objets : la relation
appartient-. En effet, on peut dire que les attributs d'un objet lui appartiennent, ou que ses
attributs le composent. Cette relation permet ainsi de crer une structure hirarchique des
objets de l'applications.
C'est cette relation qui permet de dire : une voiture comporte quatre roues, un moteur, une
carrosserie...
Le pouvoir structurant de cette relation est suffisamment puissant pour qu'en gnral, il ne
soit pas ncessaire d'en dfinir une autre. Cependant, il peut tre commode de dfinir une
autre relation entre objets. Cette relation est abondamment utilise par les naturaliste
4
, c'est
la relation est-une-espce-de qui leur a permis de classifier les objets de la nature.
C'est cette relation qui permet de dire que si le chien, le chat et la vache sont des mammi-
fres, ces trois espces d'animaux ont en commun un certains nombre de proprits. En par-
ticulier, ils ont (souvent) des poils et allaitent leurs petits.
Si on considre qu'il existe un espce d'animal fictif le mammifre, le chien est une espce
de mammifre, le chat galement ainsi que la vache. On dira que le chien, le chat et la vache
hritent des proprits du mammifre.
L'hritage porte sur les attributs (les poils) aussi bien que sur les mthodes (allaiter) que
tous les mammifres ont en commun.
Hritage & Surcharge des Attributs et des Mthodes publiques
Hriter d'un attribut ou dune mthode publique signifie que si on ne trouve pas cet attribut
ou cette methode publique au sein d'un objet, on peut aller le chercher au sein de l'objet dont
il hrite. Ainsi, si on appelle, conformment la coutume, super l'objet dont un objet h-
4
Lauteur ntant pas naturaliste, il prie ses lecteurs de lui pardonner les approximations que ses exemples,
emprunts aux sciences naturelles, comportent probablement.
(define objet
(lambda ()
(letrec ((attributs (dictionnaire-vide))
(definir ...)
(affecter ...)
(consulter ...)
(self
(lambda (id . args)
(let ((nom (car args))
(valeur (cadr args)))
(cond ((eq? id 'def) (definir nom valeur))
((eq? id 'set) (affecter nom valeur))
((eq? id 'get) (consulter nom))
(else
((consulter id) self args))))))
self)))
Fig. 31 : Constructeur dune structure de donnes mutable universelle avec un dic-
tionnaire des attributs et des mthodes publiques et un accs aux attributs
du recepteur des messages.
Objets & Programmation Oriente Objets Qu'est-ce qu'un Objet ?
- 175 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
rite, cet hritage se matrialise par la modification des mthodes prives affecter et
consulter. Si l'attribut ou la methode publique cherch ne se trouve pas dans l'objet re-
cevant un message 'set ou 'get, ce message est transmis super.
La fonction affecter et la fonction consulter sont alors redfinie ainsi
(define objet
(lambda ()
(letrec (<dictionnaire des attributs>
<definition des mthodes prives>
(affecter (lambda (nom valeur)
(let ((cr (dictionnaire-affecter
nom valeur attributs)))
(if (eq? cr 'non-defini)
(super set nom valeur)
ok))))
(consulter (lambda (nom)
(let ((valeur (dictionnaire-consulter
nom attributs)))
(if (eq? valeur 'non-defini)
(super get nom)
valeur))))
<definition de self>)
self)))
Pour incorporer l'hritage des attributs et des mthodes publiques, la dfinition de objet
doit tre modifie comme indiqu figure 32, page 175.
Supposons que les mammifres aient, en gnral, des poils blancs, dfinissons mammife-
re et dotons-le de poils blancs.
(define mammifere (objet nil))
(mammifere 'def 'poils "blanc")
(define objet
(lambda (super)
(letrec ((attributs (dictionnaire-vide))
(definir ...)
(affecter ...)
(consulter ...)
(self
(lambda (id . args)
(let ((nom (car args))
(valeur (cadr args)))
(cond ((eq? id 'def) (definir nom valeur))
((eq? id 'set) (affecter nom valeur))
((eq? id 'get) (consulter nom))
(else
((consulter id) self args))))))
self)))
Fig. 32 : Constructeur dune structure de donnes mutable universelle avec un dic-
tionnaire des attribut et des mthodes, un accs aux attributs du recepteur
des messages et un anctre dont il hrite des attributs.
Objets & Programmation Oriente Objets Qu'est-ce qu'un Objet ?
- 176 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
Dfinissons maintenant un chat felix en tant que espce de mammifere et en le dotant
de griffes.
(define felix (objet mammifere))
(felix 'def 'griffes "pointues")
Ainsi dfini, felix possde les poils de mammifre et ses griffes en propre et on peut
linterroger connatre ses caractristiques.
(felix 'get 'poils) blancs
(felix 'get 'griffes) pointues
Je connais un autre chat gros-minet qui, comme felix, a des griffes, mais qui, lui, a
des poils blancs et noirs.
(define gros-minet (objet felix))
(gros-minet 'def 'poils "blancs et noirs")
Comment est-donc gros-minet ?
(gros-minet 'get 'poils) blancs et noirs
(gros-minet 'get 'griffes) pointues
On dit que l'attribut poils de gros-minet a surcharg l'attribut poils de mammi-
fere.
La technique d'hritage permet de dcrire un cas gnral dfinissant un ensemble de points
communs entre diffrents objets tandis que la technique de surcharge permet d'introduire
des exceptions.
Cette technique d'hritage n'est pas tout fait dans l'esprit de celle utilise implicitement
par les naturalistes. Lorsqu'on dit que le chat hrite des poils du mammifre, cela signifie
qu'il hrite de l'attribut poils mais pas de la couleur ventuelle de ces poils. Dautre part, il
nest pas trs normal de permettre felix ou gros-minet de modifier la valeur dun
des attributs dont il a hrit. Nous reviendrons donc sur l'hritage afin d'affiner sa dfinition.
Dfinissons, prsent, chez mammifere une mthode pour nourrir ses petits.
(mammifere 'def 'nourrit-ses-petits
(lambda (self args)
(writeln "en les allaitant")))
Comment felix nourrit-il ses petits ?
(felix 'nourrit-ses-petits) en les allaitant
Dotons gros-minet d'une mthode associe, elle aussi, au message 'nourrit-ses-
petits.
(gros-minet 'def 'nourrit-ses-petits
(lambda (self args)
(writeln "avec soin")))
Comment gros-minet nourrit-il ses petits ?
(gros-minet 'nourrit-ses-petits) avec soin
La mthode associe 'nourrit-ses-petits chez gros-minet a, comme on sy at-
tendait, surcharg celle de mammifere.
Il est assez frquent qu'on utilise l'hritage des mthodes pour introduire une variation sur
une des mthodes de l'objet dont on hrite cette variation est, par exemple, la correction
d'un bug. On dfinit donc une mthode surchargeant celle qu'on veut modifier. Comme cel-
le-ci n'introduit qu'une variation, il est trs utile de pouvoir invoquer la mthode surcharge,
Objets & Programmation Oriente Objets Qu'est-ce qu'un Objet ?
- 177 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
c'est dire d'envoyer le message correspondant super. Il est donc ncessaire de passer
super en arguments des procdures-mthode. La dfinition de objet est alors celle de la
figure 33, page 177.
Modifions, par exemple, la mthode 'nourrit-ses-petits de gros-minet.
(gros-minet 'def 'nourrit-ses-petits
(lambda (self super args)
(super 'nourrit-ses-petits)
(writeln "avec soin")))
Comment gros-minet nourrit-il ses petits ?
[93] (gros-minet 'nourrit-ses-petits)
en les allaitant
avec soin
Notre Pre Tous
Le mcanisme d'hritage des attributs et des mthodes permet de rechercher un attribut ou
une mthode manquante. Il est clair que nous n'avons pas encore trait le cas o on ne trouve
nulle part l'attribut ou la mthode cherch. Ce problme peut tre lgamment rsolu en d-
finissant un pseudo-objet dont tout objet hrite a priori.
La dfinition de notre pre tous est donc
(lambda (id nom . args)
(error "symbole inconnu : " nom))
Que se passe-t-il, prsent ?
[94] (gros-minet 'courir)
[ERROR encountered!] symbole inconnu :
COURIR
(define objet
(lambda (super)
(letrec ((attributs (dictionnaire-vide))
(definir ...)
(affecter ...)
(consulter ...)
(self
(lambda (id . args)
(let ((nom (car args))
(valeur (cadr args)))
(cond ((eq? id 'def) (definir nom valeur))
((eq? id 'set) (affecter nom valeur))
((eq? id 'get) (consulter nom))
(else
((consulter id) self super args))))))
self)))
Fig. 33 : Constructeur dune structure de donnes mutable universelle avec un dic-
tionnaire des attribut et des mthodes, un accs aux attributs du recepteur
des messages, un anctre dont il hrite des attributs et des mthodes et
un accs direct son anctre.
Objets & Programmation Oriente Objets Objets-Classe & Objets-Instance
- 178 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
[95] (felix 'get 'moustaches)
[ERROR encountered!] symbole inconnu :
MOUSTACHES
Ce pseudo-objet doit systmatiquement dfinir super au cas o lascendant dun objet na
pas t explicitement dfini. La dfinition est facilement modifie en consquence. Cette
dfinition peut tre considre comme finale, figure 34, page 178.
8.2 Objets-Classe & Objets-Instance
Crer des objet est laborieux car, pour chacun d'entre eux, il faut dcrire ses attributs et ses
mthodes. Il serait trs agrable d'automatiser un peu leur fabrication.
Par exemple, il serait agrable de disposer d'un modle universel de chats permettant de fa-
briquer autant de chats identiques que nous voulons. Un tel modle devrait comporter tous
les lments qui permettent de caractriser les chats qui nous intressent.
Nous dirons, par exemple, que nous nous intressons aux chats qui ont trois attributs :
poils, griffes et queue et dont le comportement est dcrit par deux mthodes :
court et nourrit-ses-petits.
Construisons alors un objet chat.
(define chat (objet))
Finalement la seule chose que cet objet chat a faire, c'est de crer des chats. Il lui faut
donc simplement une mthode lui permettant de le faire. Nous l'associerons aux message
'new pour respecter la coutume.
(define objet
(lambda ascendant
(letrec ((attributs (dictionnaire-vide))
(definir ...)
(affecter ...)
(consulter ...)
(super
(if (null? ascendant)
(lambda (id nom . args)
(error "symbole inconnu : " nom))
(car ascendant)))
(self
(lambda (id . args)
(let ((nom (car args))
(valeur (cadr args)))
(cond ((eq? id 'def) (definir nom valeur))
((eq? id 'set) (affecter nom valeur))
((eq? id 'get) (consulter nom))
(else
((consulter id) self super args))))))
self)))
Fig. 34 : Le constructeur dobjets en version finale.
Objets & Programmation Oriente Objets Objets-Classe & Objets-Instance
- 179 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
(chat 'set 'new
(lambda (self super args)
(let ((un-chat (objet)))
(un-chat 'def 'poils)
(un-chat 'def 'griffes)
(un-chat 'def 'queue)
(un-chat 'def 'nourrit-ses-petits
(lambda (self super args)
(writeln "en les allaitant")))
(un-chat 'def 'court
(lambda (self super args)
(writeln "en souplesse")))
un-chat)))
Et maintenant fabriquons tout un tas de chats
(define felix (chat 'new))
(define tom (chat 'new))
(define gros-minet (chat 'new))
que nous pouvons individualiser.
(felix 'set 'poils 'noirs-et-blancs)
(tom 'set 'poils 'gris-et-blancs)
(gros-minet 'set 'poils 'blancs-et-noirs)
Cet objet chat qui nous permet de fabriquer tous les chats dont nous avons besoin s'appelle
une classe. Tous les chats fabriqus par la classe chat seront appels ses instances.
Ce qui distingue essentiellement une classe d'une instance, c'est le fait que ses attributs sont
destins tre partags par toutes ses instances et qu'elle ne reconnat que le message 'new
qui lui permet de fabriquer des instances. Une classe est, si on peut dire, un moule instan-
ces.
La classe chat que nous venons de dfinir n'utilise pas la possibilit d'hritage. Que fau-
drait-il changer pour que cette classe chat hrite d'une classe mammifere ?
Dfinissons d'abord la classe mammifere en lui attribuant des poils et une mthode pour
nourrir ses petits.
(define mammifere (objet))
(mammifere 'def 'new
(lambda (self super args)
(let ((un-mammifere (objet)))
(un-mammifere 'def 'poils)
(un-mammifere 'def 'nourrit-ses-petits
(lambda (self super args)
(writeln "en les allaitant")))
un-mammifere)))
Dfinissons maintenant la classe chat en la faisant hriter de la classe mammifere et en
lui attribuant en propre des griffes, une queue et une mthode pour courir.
(define chat (objet mammifere))
L'antcdent d'une instance est tout simplement obtenu en instanciant l'antcdant de la
classe.
(chat 'def 'new
(lambda (self super args)
(let ((un-chat (objet (super 'new))))
Objets & Programmation Oriente Objets Une Serrure Code
- 180 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
(un-chat 'def 'griffes)
(un-chat 'def 'queue)
(un-chat 'def 'court
(lambda (self super args)
(writeln "en souplesse")))
un-chat)))
La conception d'une application informatique fonde sur un style de programmation orient
objet est la dfinition de toutes les classes de l'application. L'application, elle-mme, est une
classe, son lancement est simplement son instanciation.
Pour illustrer ce mcanisme de conception un peu droutant au dbut, nous allons prendre
un exemple typique : la ralisation d'une serrure code.
8.3 Une Serrure Code
Vous connaissez tous les serrures commandes par un petit clavier permettant d'ouvrir la
porte donnant accs un immeuble. Nous allons en donner une description et nous en cons-
truirons une espce de simulateur. La structure du systme est celle de la figure 35, page
180.
Cette serrure est constitue d'un clavier qui comporte des touches, d'un boitier lectronique
qui dtecte les appuis sur les touches, qui ouvre la porte lorsque le code correct (squence
de touches) a t tap et qui attend que la porte soit referme pour rarmer la serrure.
8.3.1 Spcifications gnrale du Systme de Serrure
Nous allons structurer notre application l'aide de trois catgories d'objets :
1. des touches,
2. un codeur,
3. une porte.
Dans un premier temps nous allons concevoir le dialogue qui dcrit les interactions entre
ces trois objets :
chaque touche reoit le message appuyer qui lui indique qu'on a appuy sur elle,
Fig. 35 : Serrure code : son clavier, son dcodeur et sa porte.
2 3
4 5 6
7 8 9
0
1
Objets & Programmation Oriente Objets Une Serrure Code
- 181 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
elle le signale alors au codeur en lui envoyant le message signaler.
le codeur reoit les messages signaler de chaque touche, il vrifie la conformit
du code puis envoie le message ouvrir la porte lorsque le code est correct.
la porte reoit le message ouvrir du codeur. Elle dverrouille la serrure.
Lorsqu'on a franchit la porte, on lui envoit le message fermer pour la refermer.
Elle envoie alors le message rearmer au codeur qui rarme la serrure. On peut ,
quand on le dsire, lui envoyer le message entrer? pour essayer d'entrer.
Le dialogue de base est conu autour de ces messages et il est dcrit figure 36, page 181.
Cette structure de dialogue tant dfinie, on peut, prsent, dfinir les diffrents objets
constituant le systme. Nous allons utiliser une reprsentation graphique relativement clas-
sique qui met en vidence les attributs et les mthodes publiques associs lobjet consid-
r.
La structure d'une instance de la classe Porte est facile dcrire, elle est donne figure 37,
page 182. Elle comporte deux attributs etat et codeur. Le premier indique si elle est
ouverte ou ferme, le deuxime qui il faudra envoyer le message rearmer lorsque la
porte aura reu le message fermer. Si on examine les attributs des instances de Porte, on
constate qu'ils jouent deux rles totalement diffrents. Si etat peut tre considr comme
un composant de porte, codeur ne le peut pas. Cet attribut particulier permet simplement
une porte de s'associer un partenaire de dialogue. De tels attributs sont appels des ac-
cointances. Nous dirons alors qu'une instance de Porte a un attribut et une accointance.
La structure dune instance de Touche peut tre dcrite sous la forme indique figure 38,
page 182. Son premier attribut permet de lidentifier car la cl de la serrure sera une suite
des codes de touches.
Fig. 36 : Structure du dialogue de la serrure code.
uneTouche
unCodeur
unePorte
signaler
rarmer
ouvrir
appuyer
entrer?
fermer
Objets & Programmation Oriente Objets Une Serrure Code
- 182 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
La structure dune instance de Codeur est celle de la figure 39, page 182. Lattribut cle
reprsente la squence des touches sur lesquelles il faut appuyer pour ouvrir la porte et lat-
tribut etat reprsente ce quil reste de la squence-cl faire pour ouvrir la porte.
Fig. 37 : Structure dune instance de Porte.
Fig. 38 : Structure dune instance de Touche.
unePorte
tat:
codeur:
rarmer ouvrir fermer entrer?
uneTouche
code:
codeur:
signaler appuyer
Fig. 39 : Structure dune instance de Codeur.
unCodeur
cl:
porte:
tat:
ouvrir signaler rarmer
Objets & Programmation Oriente Objets Une Serrure Code
- 183 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
Ces spcifications mettent en vidence une difficult qui se pose toujours lorsquon conoit
une application mettant en uvre des objets possdant des accointances. Lapplication nest
dans un tat cohrent que lorsque toutes les relations daccointance sont en place. Dun
autre cot, il est frquent que ces relations daccointance soient cycliques (ici, porte et co-
deur), dans ce cas, on ne peut pas crer tous les objets du cycle directement associs leur
accointances.
Il sera ncessaire que certains dentre eux senregistrent auprs de leurs accointances au
cours de leur processus dinstanciation. Nous dirons, par exemple dans le cas prsent, que
cest la porte qui senregistre auprs de son codeur. Lordre dans lequel les objets sont ins-
tancis nest pas indiffrent et il est fondamental, avant daller plus loin, de vrifier que tous
les cycles de relation daccointance peuvent tre rsolus dans larchitecture choisie.
Simulons ces spcifications et titre d'exemple, dfinissons une serrure code 10 touches.
(define le-verrou (codeur 'new (1 6 3 3)))
(define la-porte (porte 'new le-verrou))
Lorsque le codeur est instanci, il nest pas termin puisquil ne peut pas encore connatre
sa porte. Ce nest que lorsque la porte aura t instancie et se sera enregistre auprs de
celui-ci quil sera dans un tat cohrent.
(define t0 (touche 'new 0 le-verrou))
(define t1 (touche 'new 1 le-verrou))
(define t2 (touche 'new 2 le-verrou))
(define t3 (touche 'new 3 le-verrou))
(define t4 (touche 'new 4 le-verrou))
(define t5 (touche 'new 5 le-verrou))
(define t6 (touche 'new 6 le-verrou))
(define t7 (touche 'new 7 le-verrou))
(define t8 (touche 'new 8 le-verrou))
(define t9 (touche 'new 9 le-verrou))
Une ouverture de la porte donnerait lieu au dialogue suivant
(t1 'appuyer) BEEP
(la-porte 'entrer?) "...desole, fermee !"
(t6 'appuyer) BEEP
(t3 'appuyer) BEEP
(t3 'appuyer) BRRR
(la-porte 'entrer?) "je vous en prie..."
(laporte 'fermer) CLAP
Cette forme d'analyse d'une application informatique, fonde sur la dfinition d'entits qui
cooprent en changeant des messages, est souvent appele programmation guide par
les vnements. Cette approche est trs efficace pour le dveloppement d'application
interactives ; en particulier, tous les logiciels appels : Interfaces Graphiques Interactives
5

(GUI - Graphical User Interface) ont t conus selon ce principe pour lequel ils ont servi
de champ d'exprience.
5
Les plus connus sont Windows, X-Windows, Motif, Open-look. Mais, tout seigneur tout honneur, c'est le
systme d'exploitation des Macintosh lui-mme issu de l'environnement Smalltalk dvelopp par le Xerox
PARC (Palo Alto Research Center), sur une ide de Alan Kay, qui a fait la dmonstration de la valeur
extraordinaire de ces interfaces graphiques, en particulier, et de l'approche objet en gnral.
Objets & Programmation Oriente Objets Une Serrure Code
- 184 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
8.3.2 Spcifications dtailles
Les classes tant considres comme des moules instances, les attributs des classes que
nous allons dfinir vont reprsenter toute linformation quil est ncessaire de connatre
pour construire une instance. En particulier, les mthodes publiques associes aux instances
seront des attributs des classes.
En effet, comme toutes les instances dune classe peuvent partager les mmes mthodes pu-
bliques, il nest pas astucieux de crer ces mthodes au moment o linstance est cre car,
dans ce cas, il sen crera autant que dinstances.
En faisant des mthodes publiques des attributs de la classe, nous forons toutes les instan-
ces partager les mmes procdures qui ne sont ainsi cres quune seule fois.
Spcification dtaille de la Classe Porte :
(define porte (objet))
Les mthodes d'ouverture, de fermeture et dentre sont
(porte def ouverture
(lambda (self super args)
(self set etat ouverte)
brrr)))
(porte def fermeture
(lambda (self super args)
((self get codeur) rearmer)
(self set etat fermee)
clap))
(porte def entree
(lambda (self super args)
(let ((etat (self get etat)))
(cond ((eq? etat ouverte)
"je vous en prie...")
((eq? etat fermee)
"...desole, fermee !")))))
La mthode de classe pour la cration des instances de Porte est, quant elle
(porte def new
(lambda (self super args)
(let ((le-codeur (car args))
(une-porte (objet)))
(une-porte def codeur le-codeur)
(une-porte def etat fermee)
(une-porte def ouvrir (self get ouverture))
(une-porte def fermer (self get fermeture))
(une-porte def entrer? (self get entree))
(le-codeur set porte une-porte)
une-porte)))
Le message de cration d'une porte est de la forme
(porte 'new un-codeur)
Nota: Comme une porte ne peut tre cre qu'aprs l'instanciation de son codeur, il faut
qu'elle s'enregistre auprs de ce codeur.
Objets & Programmation Oriente Objets Une Serrure Code
- 185 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
Spcification dtaille de la Classe Touche :
(define touche (obje))
la mthode dinstance pour appuyer sur une touche est
(touche def appui
(lambda (self super args)
((self get codeur) signaler (self get code))))
La mthode de cration des instances de Touche est, quant elle
(touche def new
(lambda (self super args)
(let ((mon-code (car args))
(mon-codeur (cadr args))
(une-touche (objet)))
(une-touche def code mon-code)
(une-touche def codeur mon-codeur)
(une-touche def appuyer (self get appui))
une-touche)))
Le message de cration d'une touche est de la forme
(touche 'new 8 le-codeur)
Spcification dtaille de la Classe Codeur :
(define codeur (objet))
Ltat du codeur reprsent par lattribut etat contient la liste des touches sur lesquelles
il faut encore appuyer. Chaque fois que le codeur reoit la signalisation dune touche, il v-
rifie que lidentificateur de la touche est gal la tte de liste de etat.
(codeur def signalisation
(lambda (self super args)
(let ((le-code (car args))
(mon-etat (self get etat))
(ma-porte (self get porte)))
(if (eq? le-code (car mon-etat))
(self set etat (cdr mon-etat))
(self rearmer))
(if (null? (self get etat))
(ma-porte ouvrir)
beep))))
La mthode de rarmement du codeur est
(codeur def rearmement
(lambda (self super args)
(self set etat (self get cle))
ok))
La mthode de cration des instances de Codeur les met dans ltat initial
(codeur def new
(lambda (self super args)
(let ((la-cle (car args))
(un-codeur (objet)))
(un-codeur def cle la-cl)
(un-codeur def etat la-cle)
(un-codeur def porte nil)
(un-codeur def signaler
Objets & Programmation Oriente Objets Un petit Coup d'Oeil en Arrire
- 186 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
(self get signalisation))
(un-codeur def rearmer
(self get rearmement))
un-codeur)))
Le message de cration d'un codeur et de sa cl est de la forme
(codeur 'new (1 6 3 3))
8.4 Un petit Coup d'Oeil en Arrire
Mais nous aurions trs bien pu raliser l'implmentation de la serrure code en n'utilisant
que des type abstraits de donnes mutables car les objets impliqus ne ncessitent pas
l'hritage.
Ainsi, sur le cahier des charges prcdent, et partir de la mme analyse, nous allons re-
dfinir toute lapplication prcdente en sappuyant uniquement sur des structures de don-
nes. Le dialogue ne pouvant plus tre assur par une transmission de messages, les
messages des spcifications-objet sont remplacs par des fonctions. De mme, les classes
dfinies dans les spcifications dtailles sont remplaces par la dfinition du constructeurs
des structures de donnes correspondantes.
Spcifications dtailles de Porte
Une porte est dfinie par son constructeur.
(define porte
(lambda (codeur)
(let* ((etat fermee)
(etat! (lambda (e) (set! etat e)))
(self (lambda (msg)
(cond ((eq? msg etat) etat)
((eq? msg etat!) etat!)))))
((codeur porte!) self)
self)))
Les messages ouvrir, fermer et entrer? sont implants travers des procdures-mes-
sages.
(define porte-ouvrir
(lambda (porte)
((porte etat!) ouverte)
brrr))
(define porte-fermer
(lambda (porte)
((porte etat!) fermee)
clap))
(define porte-entrer
(lambda (porte)
(let ((etat (porte etat)))
(cond ((eq? etat ouverte)
je vous en prie...)
((eq? etat fermee)
...desole, fermee !)))))
Objets & Programmation Oriente Objets Un petit Coup d'Oeil en Arrire
- 187 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
Spcifications dtailles de Codeur
Un codeur est dfini par son constructeur.
(define codeur
(lambda (cle)
(let* ((etat cle)
(etat! (lambda (e) (set! etat e)))
(porte nil)
(porte! (lambda (p) (set! porte p))))
(lambda (msg)
(cond ((eq? msg cle) cle)
((eq? msg etat) etat)
((eq? msg etat!) etat!)
((eq? msg porte) porte)
((eq? msg porte!) porte!))))))
Les messages rarmer et signaler sont implants travers des procdures-messages.
(define codeur-rearmer
(lambda (codeur)
((codeur etat!) (codeur cle))
ok))
(define codeur-signaler
(lambda (code codeur)
(let ((etat (codeur etat)))
(if (eq? code (car etat))
((codeur etat!) (cdr etat))
(codeur-rearmer codeur))
(if (null? (codeur etat))
(porte-ouvrir (codeur porte))
beep))))
Spcifications dtailles de Touche
Une touche est dfinie par son codeur.
(define touche
(lambda (code codeur)
(lambda (msg)
(cond ((eq? msg code) code)
((eq? msg codeur) codeur)))))
Le message appuyer est implants travers une procdure.
(define touche-appuyer
(lambda (touche)
(codeur-signaler (touche code)
(touche codeur))))
Une touche ntant cre que pour grer quun seul message, il est possible den simplifier
considrablement la dfinition en rassemblant le constructeur et la procdure-message.
(define touche-appuyer
(lambda (code codeur)
(lambda () (codeur-signaler code codeur))))
Nous verrons pourtant, un peu plus loin, un bonne raison de ne pas utiliser cette simplifica-
tion.
Objets & Programmation Oriente Objets Exercices
- 188 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
Un petit scnario douverture de la porte
A titre dmonstratif, redfinissons la serrure code 10 touches non simplifies
(define verrou (codeur (1 6 3 3)))
(define la-porte (porte verrou))
(define t0 (touche 0 verrou))
(define t1 (touche 1 verrou))
(define t2 (touche 2 verrou))
(define t3 (touche 3 verrou))
(define t4 (touche 4 verrou))
(define t5 (touche 5 verrou))
(define t6 (touche 6 verrou))
(define t7 (touche 7 verrou))
(define t8 (touche 8 verrou))
(define t9 (touche 9 verrou))
Une ouverture de la porte donnerait lieu un dialogue trs analogue au prcdent.
(touche-appuyer t1) BEEP
(porte-entrer la-porte) "...desole, fermee !"
(t6 touche-appuyer ) BEEP
(t3 touche-appuyer ) BEEP
(t3 touche-appuyer ) BRRR
(porte-entrer la-porte) "je vous en prie..."
(porte-fermer la-porte) CLAP
Cet exercice pourrait sembler strile car pourquoi refaire d'une autre faon ce qui a dj t
fait ?
En fait il s'agissait simplement de faire remarquer que le concept d'objet peut exister mme
en l'absence d'un outil permettant de programmer objets, il n'est pas ncessaire de dispo-
ser d'un langage objets officiel
6
pour utiliser le concept d'objet dans l'analyse des probl-
mes et tous les langages de programmation permettent de btir tout ou partie d'un support
pour le dveloppement d'objets.
Ce chapitre nous a ainsi permis d'introduire un style de programmation trs efficace, la pro-
grammation oriente objets. Nous l'avons introduite en dfinissant une extension objet
Scheme fonde sur la notion de classe, d'instance, d'attribut, de mthode et surtout de l'h-
ritage fond sur le concept de lien dynamique.
En rsum :
Un objet est donc un type abstrait de donnes mutables qui interprte des messages et
qui est dot de l'hritage des attributs et des mthodes.
6
Smalltalk, Flavors, C
++
, Pascal-Objet, Eiffel...
8.5 Exercices
Pour les exercices impliquant une analyse par approche objet, on suppose disponible le lan-
gage objet qui a t dfini en cours. Il comporte :
objet constructeur d'un objet de base sans attributs.
Tout objet reconnat a priori les messages suivants:
Objets & Programmation Oriente Objets Exercices
- 189 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
def dfinition d'un nouvel attribut ou d'une nouvelle mthode publique.
set modification de la valeur d'un attribut.
get consultation de la valeur d'un attribut.
E-84 Quels sont les inconvnients qui peuvent tre rencontrs du fait que les attributs et les m-
thodes publiques ont t placs dans le mme dictionnaire :
1. sur un plan purement fonctionnel,
2. sur le plan de lfficacit.
E-85 Comment peut-on remdier simplement aux inconvnients fonctionnels identifis lexer-
cice prcdent sans pour autant dfinir deux dictionnaires spars.
E-86 Il est clair que la structure de dictionnaire est une structure de donne fondamentale. En d-
finir une version objet en dfinissant une classe Dictionnaire afin que toutes les applica-
tions puissent en profiter. Une instance de Dictionnaire disposerait des methodes
'definir, 'affecter, 'consulter et 'pour-tous-faire.
E-87 En utilisant la classe Dictionnaire dfinie ci-dessus, dfinir un objet Mta-Classe qui , com-
me les classes permettent dinstancier des objets, permettrait dinstancier des classes.
E-88 Reprendre la dfinition de la structure de pile et dfinir une classe Pile.
E-89 Reprendre la dfinition des nombres rationnels vue au chapitre Les Donnes et en dduire
une classe NombreRationnel.
E-90 Reprendre les spcifications de l'ensemble dfini au chapitre Reprsentation des Donnes
abstraites et dfinir une classe Ensemble.
E-91 Reprendre les spcifications de la file dfinie au chapitre Les Structures mutables et dfinir
une classe File.
E-92 La plupart des parkings sont quips d'un systme permettant l'affichage permanent du
nombre des places disponibles. Ce systme est compos du distributeur de tickets situ
l'entre du parking, d'un dtecteur de passage situ en sortie du parking, d'un afficheur situ
l'extrieur (sur le chemin de l'entre) et d'un mcanisme de comptage.
1. Etablir la liste des objets de l'application.
2. Etablir le dialogue permettant la coopration entre ces objets.
3. Dfinir les classes associes aux objets de l'application.
4. Dfinir un scnario dmontrant le fonctionnement de cette application.
E-93 Reprendre les exercices E-66 et E-67 du chapitre Elments de Programmation et en donner
une solution objet.
Nota: il est commode de dfinir une classe Pice et une classe Monnayeur.
E-94 Comment faut-il dfinir une classe et ses instances associes pour qu'un attribut de la classe,
alors appel variable de classe, soit partag par toutes les instances de la classe ?
Illustrer ce mcanisme en crant la classe Facture dont les instances sont dfinies de la fa-
on suivante :
variable de classe : taux de tva
variables d'instance : liste d'critures, total HT, total TTC.
Objets & Programmation Oriente Objets Exercices
- 190 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
mthodes : 'ajouter - ajoute une criture la facture et met le
total HT et TTC jour.
'afficher - affiche la facture.
Il est commode de considrer que les critures sont des objets et de crer une classe Ecri-
ture telle que ses instances sont dfinies de la faon suivante:
variables d'instances : dnomination, prix unitaire HT, quantit.
mthode : 'evaluer - dtermine le prix total HT
E-95 De nombreux langages objet permettent l'hritage multiple des attributs et des mthodes.
En d'autres termes, un objet peut hriter de plusieurs anctres. Modifier le constructeur
d'objets vu en cours de telle sorte qu'il supporte l'hritage multiple.
Lorsqu'il est ncessaire d'aller consulter les anctres pour rechercher un attribut ou une m-
thode non disponible chez le receveur du message, on interroge les anctres dans l'ordre
o ils ont t dfinis.
Opinion personnelle : La notion d'hritage n'est dj pas particulirement facile utiliser,
alors, notre avis, l'emploi de l'hritage multiple est presque toujours le signe d'une ana-
lyse mal conduite.
Objets & Programmation Oriente Objets Annexes
- 191 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
8.6 Annexes
8.6.1 Constructeur d'Objets
(define objet
(lambda ascendant
(letrec ((attributs (dictionnaire-vide))
(definir (lambda (nom valeur)
(let ((cr (dictionnaire-definir
nom valeur attributs)))
(if (eq? cr 'deja-defini)
(error "deja defini : " nom)
'ok))))
(affecter (lambda (nom valeur)
(let (( cr (dictionnaire-affecter
nom valeur attributs)))
(if (eq? cr 'non-defini)
(super 'set nom valeur)
'ok))))
(consulter (lambda (nom)
(let ((valeur (dictionnaire-consulter
nom attributs)))
(if (eq? valeur 'non-defini)
(super 'get nom)
valeur))))
(super (if (null? ascendant)
(lambda (id nom . args)
(error "symbole inconnu : " nom))
(car ascendant)))
(self (lambda (id . args)
(let ((nom (car args))
(valeur (cadr args)))
(cond ((eq? id 'def)
(definir nom valeur))
((eq? id 'set)
(affecter nom valeur))
((eq? id 'get)
(consulter nom))
(else
((consulter id)
self super args)))))))
self)))
8.6.2 Dictionnaire des Attributs & des Mthodes
Sa dfinition ne pose pas de problme particulier car il est trs semblable ceux que nous
avons dj vus.
(define dictionnaire-vide
(lambda () (reference-a nil)))
(define dictionnaire-consulter
(lambda (s &d)
(let ((p (assq s (&d))))
(if p (cdr p) non-defini))))
Objets & Programmation Oriente Objets Annexes
- 192 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
(define dictionnaire-definir
(lambda (s v &d)
(let ((p (assq s (&d)))
(q (cons s v)))
(if p
deja-defini
(ref! &d (cons q (&d)))))))
(define dictionnaire-affecter
(lambda (s v &d)
(let ((p (assq s (&d)))
(q (cons s v)))
(if p
(set-cdr! p v)
non-defini))))
Lors de l'implmentation d'un langage objet rel, la ralisation de ce dictionnaire doit tre
particulirement soigne car c'est le passage oblig de la gestion des attributs et des mtho-
des et ses performances sont critiques.
Objets & Programmation Oriente Objets Annexes
- 193 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5
- 194 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
9. Spcifier puis
Implmenter.
Jusqu' prsent nous avons beaucoup parl d'applications mais nous avons (volontairement)
compltement oubli la machine (l'ordinateur) et nous avons fait comme si la machine de
nos rves existait. Malheureusement ce n'est pas encore tout fait vrai et nous n'avons su
raliser (vers 1945) qu'un seul type de machine que nous savons peu prs bien matriser :
le processeur de Von Neumann dont le fonctionnement est uniquement fond sur laffecta-
tion.
Ce processeur ne permet pas de manipuler directement toutes les abstractions que nous
avons imagines et il va falloir les construire. Le rsultat en est un autre style de
programmation : la programmation imprative.
Ce style de programmation est li un type de processeur, c'est son mode d'emploi plus ou
moins directement exprim. C'est le style de programmation qu'il est le plus facile d'acqu-
rir sur le tas. Malheureusement, ce style, pratiqu seul, est vite inefficace dans un cadre pro-
fessionnel. C'est la raison de notre insistance sur les techniques de spcification que nous
avons dveloppes et du langage Scheme utilis essentiellement comme outil de raisonne-
ment.
Ce dernier chapitre montre donc comment on peut traduire les diffrents styles de program-
mation que nous avons introduits en utilisant une programmation imprative illustre
l'aide d'un langage bien adapt : le langage C. Nous allons ainsi retrouver les notions de
type de donnes, de fonction, d'environnement, d'effets de bord, d'tat et de transmission de
messages.
Ce chapitre n'a pas la prtention d'apprendre utiliser le langage C mais seulement de mon-
trer que les spcifications d'une application labores en utilisant le langage Scheme peu-
vent tre transposes en langage C ou en tout autre langage de la mme nature (Pascal,
Ada...).
Spcifier puis Implmenter. Les Elments de construction d'une Application C.
- 195 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Nous allons uniquement procder par analyse d'exemples dmontrant les principales tech-
niques de transposition utilisables. Nous ne serons pas exhaustifs mais simplement dmons-
tratifs.
Avant de commencer, rappelons le cadre du dveloppement professionnel d'une applica-
tion informatique en introduisant quelques ides qui seraient dvelopper considrable-
ment dans le cadre d'un cours consacr au Gnie Logiciel.
Le travail de l'informaticien se situe soit au niveau de l'analyse et de la conception, soit au
niveau de l'implmentation, soit au niveau de la finalisation. Il est classique de faire ses
classes au niveau de la finalisation puis au niveau du codage avant de prendre la responsa-
bilit d'une analyse et d'une conception.
Une bonne conception a pour objectif de minimiser les cots directs du dveloppement
(cot de l'laboration des spcifications dtailles et de l'implmentation) et les cots indi-
rects dus aux alas de la finalisation. La plupart du temps, les projets informatiques achop-
pent au niveau des cots indirects trs difficiles valuer au moment de la construction du
devis qui va fixer le prix du logiciel.
Une analyse propre et complte ainsi qu'une programmation simple et lisible contribuent
minimiser les cots indirects de dveloppement. De mme que l'analyse et la conception
d'une application sont grandement facilites par la connaissance d'un ensemble de bons
coups une bonne programmation suppose la connaissance des bons coups.
Les bons coups sont de deux natures :
coups tactiques ils font avancer la solution du problme. Dfinir un type abs-
trait de donnes, dfinir une fonction sont des coups tacti-
ques.
coups stratgiques ils empchent la solution de reculer en mettant en place des
barrires. Dfinir un paquetage pour empcher la propagation
des erreurs, concevoir une architecture simple sont des coups
stratgiques.
9.1 Les Elments de construction d'une Application C.
9.1.1 Expressions.
L'expression est la plus petite entit de structuration d'une application C. Elle est construite
partir de lapplication de fonctions leurs arguments. On peut donc la rapprocher d'une
expression Scheme avec cependant une diffrence de forme importante.
Sans autre prcision, une instruction sera note
<expression>
Voici quelques exemples d'expressions C
5
y+6*z
(a+b)*(c-d)
sin(x)
Spcifier puis Implmenter. Les Elments de construction d'une Application C.
- 196 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
De nombreux oprateurs sont utiliss sous forme infixe avec priorit et associativit im-
plicite (en gnral gauche) tandis que les fonctions sont utilise en notation parenthse
habituelle. Une expression C est, comme une expression Scheme, utilise soit pour produire
une valeur soit pour produire un effet de bord.
Ainsi
afficher("Bonjour tous");
ne produit qu'un effet de bord.
Certaines expressions rendent une valeur interprte comme les valeurs vrai et faux, ces ex-
pressions sont les prdicats nots
<prdicat>
Les prdicats sont construits partir des oprations de relation == (gal ?) != (diffrent ?)
< (infrieur ?) <= (infrieur ou gal ?) > (suprieur ?) >= (suprieur ou gal ?) et des op-
rateurs logiques | (pas) && (et) || (ou).
9.1.2 Instructions.
L'instruction est la plus petite entit de structuration d'une application C. On peut la rappro-
cher d'une expression Scheme avec cependant une diffrence fondamentale : alors que les
expressions Scheme sont conues, en gnral, pour tre simplement values et produire
une valeur, les instructions C impliquent presque systmatiquement une valuation associe
une affectation et sont donc trs souvent quivalentes set!.
Sans autre prcision, une instruction sera note
<instruction>;
La fin de chaque instruction C est signale par ;.
Voici quelques exemples d'instructions C
x = 5;
x = y+6*z;
x = (a+b)*(c-d);
Ce sont des instructions d'affectation construites selon le modle
<expression de gauche> = <expression de droite>;
et qui fonctionnent selon le mcanisme suivant:
1. Lexpression de droite et lexpression de gauche sont values dans un ordre quel-
conque,
2. lexpression de droite est ensuite affect ce que reprsente le rsultat de l'valua-
tion de lexpression de gauche.
Lexpression de gauche doit ncessairement reprsenter un moyen d'accs une donne
1
. Nous reviendrons, bien sr, sur les principales techniques permettant de dfinir l'accs
une variable. Ici nous avons utilis le fait qu'un nom (symbole) permet d'accder une don-
ne.
Une expression C est, comme une expression Scheme, utilise pour produire une valeur ou
pour produire un effet de bord. Ainsi lexpression de droite de
1
Le rsultat de l'valuation du terme de gauche doit tre ce que les concepteurs du langage C ont appel une
l-value.
Spcifier puis Implmenter. Les Elments de construction d'une Application C.
- 197 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
x = 4*sin(6*t);
produit une valeur affecte la variable x, tandis que
afficher("Bonjour tous");
ne produit qu'un effet de bord. La partie gauche dune instruction est donc facultative.
9.1.3 Dclarations.
Une dclaration sert dfinir une entit manipule par les instructions, elle est analogue
une expression Scheme contenant un define ou un let.
Sans autre prcision, une dclaration sera note
<dclaration>;
Voici quelques exemples de dclarations C
int foo = 5,
bar = 8;
float baz;
tout fait analogues l'expression Scheme
(define foo 5)
Nous reviendrons longuement sur le rle jou par les dclarations et sur la manire de les
crire.
9.1.4 Blocs de code
Le bloc de code est la plus petite entit de structuration d'une application langage C. Cest
une squence de dclarations et d'instructions.
{ <dclaration>;
....
<declaration>;
<instruction>;
....
<instruction>;}
Une instruction pouvant tre un bloc de code on peut engendrer des structures embotes de
la forme:
{ <dclaration>;
{ <dclaration>;
<instruction>;
<instruction>;}
{ <dclaration>;
<instruction>;
<instruction>;}
<instruction>;
<instruction>;}
Il est de bonne discipline d'indenter les blocs afin de les mettre clairement en vidence.
Nous introduirons chaque fois que l'occasion se prsentera des rgles de bonne criture. Le
langage C tant en format libre (on peut intercaler autant d'espaces, de tabulations ou de
retour la ligne que nous le dsirons), ces rgles peuvent lgrement varier d'un groupe
d'individus l'autre.
Spcifier puis Implmenter. Les Elments de construction d'une Application C.
- 198 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Sans autre prcision, nous noterons un bloc de code
<bloc de code>
Un bloc de code est analogue la construction Scheme suivante
(let ((...)
(...)
(...))
......)
Nota: les blocs de code C ne sont pas des objets de 1re classe, ils ne peuvent ni tre affec-
ts une variable, ni tre invoqus. Ils ne rendent pas de valeur.
La dfinition d'un bloc de code peut tre considr soit comme un coup tactique s'il permet,
par exemple, d'introduire une nouvelle abstraction soit comme un coup stratgique s'il est
simplement utilis comme une barrire anti-erreurs.
9.1.5 Fonctions & Procdures
Une fonction-procdure langage C est essentiellement un bloc de code nomm associ des
paramtres. Comme en Scheme, on parlera de fonction lorsque ce bloc de code rend une
valeur et n'est le sige d'aucun effet de bord et de procdure dans le cas contraire.
Voici, par exemple, un fonction Scheme
(define (factorielle n)
(if (= n 1)
1
(* n (factorielle (- n 1))))))
et son quivalent C
....
factorielle(n)
....
{
if (n == 1) {
return(1);
} else {
return(n*factorielle(n-1));
}
}
Cet exemple induit deux remarques:
1. l'application de la fonction factorielle son argument est note facto-
rielle(n) comme en mathmatique.
2. la fin de l'valuation de la fonction et la valeur rendue sont indiques explicitement
comme largument de la fonction implicite return(...).
On peut galement noter, au passage, l'apparition du prdicat (n == 1) et de la forme
spciale
if <prdicat> <bloc de code> else <bloc de code>
dont on note la bonne criture
if <prdicat> {
<dclaration>;
....
<instruction>;
Spcifier puis Implmenter. Les Elments de construction d'une Application C.
- 199 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
} else {
<dclaration>;
....
<instruction>;
}
La construction des fonctions est assure par la mme opration de composition qu'en Sche-
me et le corps d'une fonction peut contenir des invocations d'autres fonctions. Les dfini-
tions rcursives sont bien entendu possibles mais elles engendrent toujours un processus
de calcul rcursif. Nous verrons un peu plus loin comment engendrer un processus itratif.
9.1.6 Structures de Donnes
La construction des types abstraits de donnes en Scheme est trs naturelle car Scheme as-
sure une intendance que le langage C (et les autres) ne prend pas en charge.
Reprenons, par exemple, la dfinition des Rationnels en Scheme. Cette dfinition s'ap-
puyait sur un constructeur et deux slecteurs
(define rationnel
(lambda (num denom)
(lambda (msg)
(cond ((eq? msg 'numerateur) num)
((eq? msg 'denominateur) denom))))
Ce constructeur dfinit, la fois, l'association du numrateur et du dnominateur d'un nom-
bre rationnel et la mthode d'accs au numrateur et au dnominateur. La dfinition des
fonctions de slection devient alors triviale
(define numerateur (lambda (un-rat) (un-rat 'numerateur))
(define denominateur (lambda (un-rat) (un-rat 'denominateur))
La dfinition C des Rationnels est un peu plus complexe car elle comporte deux parties.
Il faut d'abord dclarer l'association constitue du numrateur et du dnominateur qui cons-
titue un nombre rationnel
struct rationnel {
.... numerateur;
.... denominateur;};
On a ainsi dcrit ce qu'on avait appel une structure dans le chapitre Les Structures. Cette
description tait implicite en Scheme, elle doit tre explicite en C. Une fois cette structure
dfinie, on peut lui associer le constructeur et les slecteurs suivants
....
RationnelCreer(num,denom)
....
{....}
....
RationnelNumerateur(unRat)
....
{....}
....
RationnelDenominateur(unRat)
....
{....}
Spcifier puis Implmenter. Architecture d'une Application C.
- 200 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
On peut constater qu'il reste quelques points de suspension dont il faudra prciser le contenu
et le rle. Considrons l'ensemble des dclarations suivantes
struct rationnel {
.... numerateur;
.... denominateur;};
.... RationnelCreer(...);
.... RationnelNumerateur(...);
.... RationnelDenominateur(...);
elles dcrivent uniquement ce que doit connatre un utilisateur de Rationnels, on l'appellera
l'interface de la structure de donnes. Cette interface sera utilise par le ralisateur du type
Rationnels pour dcrire les entites exportes (donc accessibles tous) et par un utilisateur
du type Rationnels pour annoncer ce qu'il en importe.
Par contre
....
RationnelCreer(num,denom)
....
{....}
....
RationnelNumerateur(unRat)
....
{....}
....
RationnelDenominateur(unRat)
....
{....}
dcrit comment le type Rationnels a t ralis, on l'appellera son implmentation. Par na-
ture, l'interface est publique tandis que l'implmentation est cache (prive).
Si on voulait caractriser en une seule phrase la diffrence essentielle qui distingue Scheme
des langages impratifs comme le langage C on pourrait dire :
Scheme associe les donnes aux fonctions, tandis que C associe les fonctions aux donnes.
Sur un plan pratique, cela se traduit par le fait que pour dfinir un type abstrait de donnes
en Scheme on commence par dfinir son constructeur (fonction) tandis qu'en langage C, on
commence par dfinir l'association des donnes.
9.2 Architecture d'une Application C.
Sur ces bases, on peut noncer la rgle de bonne architecture suivante:
Une application C orthodoxe est constitue par :
1. une fonction - Cette fonction nomme main est la fonction invoque au moment du
lancement de l'application.
2. un ensemble de structures de donnes - Ces structures de donnes reprsentent les
entits manipules par l'application. elles sont, chacune, constitus d'une interface et
d'une implmentation.
Spcifier puis Implmenter. Processus de Dveloppement d'une Application.
- 201 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Les traducteurs du langage C sont toujours inclus dans des environnements de dveloppe-
ment comportant essentiellement:
le traducteur (appel compilateur),
un diteur de programme,
un intgrateur de programmes (appel diteur des liens),
des outils d'aide la mise au point,
un gestionnaire de versions,
un documenteur,
....
Comme le cas de figure qui nous intresse est celui o l'application dvelopper est suffi-
samment importante pour ncessiter la constitution d'une quipe de dveloppement, l'appli-
cation a t scinde en de nombreux modules (nous avons vu au cours des chapitres
prcdents comment y parvenir) qui seront implments simultanment et indpendam-
ment par plusieurs personnes.
Par convention, une application langage C est constitue de l'ensemble
2
des fichiers dfi-
nissant les interfaces et de l'ensemble des fichiers dfinissant les implmentations des types
abstraits de donnes de l'application. Les fichiers dcrivant une interface sont nomms
xxxx.h et ceux dcrivant une implmentation xxxx.c.
Par exemple, l'interface et l'implmentation des Rationnels seraient nommes
3
rationnel.h
rationnel.c
Le couple (rationnel.h, rationnel.c) constitue le paquetage des rationnels.
2
Il n'est pas rare de rencontrer des applications comportants plusieurs centaines de fichiers.
3
Les rgles de dnomination des fichiers de l'application peut tre lgrement modifie d'un systme
d'exploitation l'autre.
9.3 Processus de Dveloppement d'une Application.
En quelques mots, on peut dcrire l'activit d'une quipe de dveloppeurs lorsqu'elle est ar-
rive en phase d'implmentation.
Les processeurs utiliss pour construire les ordinateurs ont un mode demploi qui est traduit
sous la forme dun langage trs rustique. Le langage C et a fortiori Scheme sont trs diff-
rents et les programmes doivent tre traduits dans le langage natif du processeur. C'est le
compilateur qui est charg de ce travail.
Chaque fichier xxxx.c dcrivant l'implmentation d'un des types abstraits de donnes de
l'application est traduit pour produire un fichier xxxx.o qui est en fait orphelin car il ne
peut oprer qu'en coopration avec tous ses frres dveloppes par les membres de l'quipe
ou mme achets tout fait.
La runion de tous les orphelins est la phase d'intgration de l'application. C'est l'diteurs
des liens qui en est charg.
Le processus de dveloppement peut tre approximativement reprsent par la figure 40,
page 202.
Spcifier puis Implmenter. Constitution des Paquetages.
- 202 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
9.4 Constitution des Paquetages.
Imaginons une application utilisant des ensembles. Dans la phase de spcification, nous
avons dfini les Ensembles partir des Listes elles-mmes dfinies partir des Paires.
L'interface du type Paires est constitue de la dclaration de la structure dune paire et de
la dclaration des fonctions publiques de manipulationdune paire mises la disposition des
utilisateurs de cette structure. Elle est contenue dans le fichier paire.h et ressemble des
dclarations de la forme
struct paire {
.... tete;
.... queue;};
.... cons(...);
.... car(...);
.... cdr(...);
.... null(...);
L'interface du type Listes est dfinies dans le fichier liste.h. Cette interface importe les
lments publics du type Paires ncessaires la dfinition du type Listes
#include "paire.h"
.... lenght(...);
.... append(...);
.... reverse(...);
.... forEach(...);
L'interface du type Ensembles est dfinie dans le fichier ensemble.h. Comme ce type
est construit partir des Listes, il en importe l'interface
#include "liste.h"
struct ensemble {
.... liste;};
.... EnsembleCreer(...);
.... EnsembleAjouter(...);
Fig. 40 : Structure dune application C.
xxx.h
xxx.c

xxx.o
yyy.h
yyy.c

yyy.o

zzz.h
zz1.c

zzz.o

aaa
paquettages traduction intgration
Spcifier puis Implmenter. Typage explicite des Donnes.
- 203 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
.... EnsembleRetirer(...);
.... EnsembleVide(...);
La dclaration d'importation d'une interface est donc
#include "xxxxx.h"
Le module monApp.c utilisant le type Ensembles doit importer l'interface associe
#include "ensemble.h"
.....
.....
.....
.....
Le paquetage Paires sera constitu du couple (paire.h , paire.c), le paquetage Listes
du couple (liste.h , liste.c) et Ensembles sera constitu du couple (ensemble.h
, ensemble.c).
Si le langage C permet de construire des paquetages, c'est au prix d'une discipline volontai-
re du dveloppeur. L'importance stratgique du paquetage a conduit l'introduction de ce
concept dans certains langages de programmation qui ne le possdaient pas (Pascal) et
concevoir des langages autour de ce concept (Ada).
9.5 Typage explicite des Donnes.
Toutes les donnes ont un type, il n'existe donc pas de langage informatique
4
dans lequel
les donnes ne sont pas types. Par contre il existe deux conceptions pour exprimer le fait
que toute donne est type.
Le concept de donnes apparait sous deux aspects:
1. la valeur de la donne,
2. le symbole qui sert nommer cette valeur.
Ainsi, nous avons dfini deux oprations propos des donnes:
dfinition qui consiste donner un nom une valeur,
affectation qui consiste associer une valeur un nom.
On peut donc dfinir le type de la donnes soit en typant son nom, soit en typant sa valeur.
La premire technique est appele typage explicite tandis que la deuxime est appele ty-
page implicite.
Pour en donner une image frappante on pourrait poser le problme du typage dans les ter-
mes suivants:
Pour organiser une cuisine vaut-il mieux utiliser des botes en fer avec des tiquettes dessus
(Caf, Farine, Sel, Sucre...) ou prendre des botes transparentes qui permettent d'en voir le
contenu ?
Un tel choix est stratgique et il n'y a pas de raison irrfutable permettant de considrer une
de ces deux techniques comme meilleure que l'autre. Chacune des deux a ses avantages et
4
Nous avons exclu de la catgorie des langages informatiques les langages constituant le mode demploi
des diffrents processeurs utiliss pour construire des machines informatiques.
Spcifier puis Implmenter. Typage explicite des Donnes.
- 204 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
ses inconvnients et aucune ne mrite les guerres de religion dont elles sont quelque fois
l'objet.
La premire permet de se dpanner en toute scurit en cas de pnurie de bote, car les bo-
tes sont, dans l'ensemble, rcuprables. Mais comment, simplement par transparence, dis-
tinguer sans erreur le sucre du sel ?
9.5.1 Types de Base.
Le langage C est un langage typage explicite. Ce sont donc les noms des donnes (les
variables) qui sont typs. Ainsi, chaque fois qu'on dfinira un nouveau nom, il faudra lui
associer un type. Ce type est la simple indication de la manire dinterprter la donne as-
socie ce nom. Bien entendu, un traducteur C vrifie que les associations de variables sont
bien cohrentes relativement leur type.
9.5.2 Les Donnes simples.
Le langage C permet de dfinir diffrents types de donnes simples associer des noms
de variables. On dispose essentiellement des types suivants:
char caractres - qui reprsentent le codage des signes typographiques,
int entiers - qui reprsentent les nombres qui tombent juste,
float rels - qui reprsentent les nombres qui ne tombent pas juste.
et un certain nombre de variantes dont nous ne parlerons pas.
On peut donc dclarer, par exemple, deux variables entires x et y valant respectivement 3
et 4
int x = 3;
int y = 4;
Cette dclaration aurait galement pu s'crire (notez la virgule)
int x = 3,
y = 4;
Les constantes entires sont reprsents par des nombres sans virgule (point dcimal chez
les anglo-saxons)
18 56 -34 32500
Les constantes rels sont reprsentes par des nombres avec virgule et avec ventuellement
un exposant
12.4 3.14 12.67e6 3.0e-4
Les caractres sont reprsents par leur dessin typographique entre '
'a' 'z' 'A' '+''4'
Il existe des variantes de reprsentation que nous ne donnerons pas. On peut galement d-
finir des noms sans y associer la moindre valeur (demi-dfinition)
int x,y,z;
Une valeur pourra leur tre associe plus tard par une affectation.
Spcifier puis Implmenter. Typage explicite des Donnes.
- 205 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
9.5.3 Les Pointeurs.
Alors que Scheme gre les environnements notre place, le langage C ne le fait pas et pour
permettre cette gestion " la main ", on dispose d'un type un peu particulier, la rfrence
une donne appel communment pointeur. Ainsi on pourra dfinir des rfrences un ca-
ractre, des rfrences un nombre entier, des rfrences un nombre rel et , en rgle g-
nrale, des rfrences tout type existant.
La dfinition d'une rfrence prend la forme suivante
<type existant> * <symbole>;
Par exemple
int * pix;
float * pfy;
char * pcz;
pix, pfy et pcz sont respectivement des pointeurs sur (rfrence ) un entier, un rel et
un caractre.
Les pointeurs permettent de mettre en place des mcanismes puissants de gestion des envi-
ronnements. Le concept de pointeur peut tre illustr par l'image suivante:
Si je veux permettre un ami d'entrer chez moi, je peux soit lui donner la cl de ma porte
(accs direct mon appartement) soit la cl de ma boite aux lettres dans laquelle j'aurai mis
la cl de mon appartement (accs indirect). Ma boite aux lettres est un pointeur sur mon
appartement.
En rsum, on peut dire que le pointeur permet des rfrencement indirects, c'est dire
dfinition diffre. En effet, je peux, au dernier moment, mettre la cl d'un autre apparte-
ment dans ma boite aux lettres.
Le concept d'accs est associ aux deux oprateurs * et &
&x rend un pointeur sur la variable x.
*px rend la valeur de la variable dont le pointeur est la valeur de px.
On peut, par exemple, crire
int x;
int *px = &x;
px est alors un pointeur sur x. Comme px est un pointeur sur x, *px dnote la valeur de
x, ce qui peut tre illustr par le dessin suivant
Le pointeur tant conu pour permettre des accs diffrs, il peut arriver dans quelques cas
trs intressants qu'on ne sache pas, au dpart, sur quel type d'objets il sera amen pointer,
dans ce cas on utilisera le type fictif void
5
void *pp;
pp est un pointeur sur on verra bien quoi plus tard !
Ce type void est simplement une indication au traducteur C qui lui indique quune variable
de ce type est rpute compatible avec nimporte quel autre type de variable et que le pro-
grammeur prend la responsabilit dassurer la cohrence de ce quil crit.
5
Le mot-cl void aura une autre signification dans un autre contexte, attention !
x px
*px &x
Spcifier puis Implmenter. Typage explicite des Donnes.
- 206 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
9.5.4 Types construits.
Pour pouvoir construire de nouveau types de donnes, il faut pouvoir associer des types
dj dfinis. Pour cela, on dispose de deux techniques d'association:
tableau dans le cas o l'association est homogne, c'est dire porte unique-
ment sur des types identiques. On parlera alors d'un tableau de
caractres ou d'un tableau d'entiers.
structure dans le cas o l'association est htrogne, c'est dire porte sur des
types diffrents.
On peut comparer les possibilits respectives de Scheme et langage C dans le tableau sui-
vant
Tableaux
Un tableau est une association constitue dun nombre fini dlments homognes (du
mme type). La dclaration d'un tableau de quelque chose a la forme suivante
int x[10];
char msg[25];
float taux[5];
dfinissent respectivement un tableau de 10 entiers nomm x, un tableau de 25 caractres
nomm msg et un tableaux de 5 rels nomm taux. Lexpression [n] est le constructeur
dune association de n lments identiques du type de lexpression immdiatement gau-
che du nom de l'objet.
Par exemple
int x[10];
construit une association nomme x de 10 lments de type int. On peut dcrire des type
plus complexes laide de ce mcanisme
char roman[5][10][15][80];
peut sinterprter en disant (en partant de la droite) quun roman est constitu de paquets
de 80 caractres (les lignes) regroups par paquets de 15 (les paragraphes) regroups par
paquets de 10 (les chapitres) eux-mmes regroups par paquets de 5.
L'accs un lment d'un tableau se fait par son indice (celui du premier lment est 0)
x[6] msg[12] taux[4]
sont respectivement l'lment n6 du tableau x, l'lment n12 du tableau msg et le dernier
lment du tableau taux. Bien entendu, l'indice utilis peut tre une variable entire (at-
tention ne pas dborder).
Le concept de tableau est identique celui de vecteur Scheme
(define x (make-vector 10))
Taille Scheme langage C
fixe vecteur
homogne tableau
htrogne structure
variable liste dfinir
Spcifier puis Implmenter. Typage explicite des Donnes.
- 207 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
produit le mme effet que la dclaration C
int x[10];
tandis que les expressions Scheme
(set! y (vector-ref x 5))
(vector-set! x 5 7)
svaluent respectivement comme les instructions C
y = x[5];
x[5]=7;
Structure
Une structure est lassociation dun nombre fini dlments ventuellement htrognes (de
types diffrents). La dclaration dune nouvelle structure a la forme suivante
struct rationnel {
int numerateur;
int denominateur;
};
le nom du type qui vient ainsi dtre cr est struct rationnel et ses deux compo-
santes sont nommes numerateur et denominateur. La dfinition dun nombre ration-
nel est identique celle dune donne appartenant un type de base
struct rationnel x = {4,5};
dfinit le nombre rationnel x valant 4/5. On peut, bien entendu, dfinir un pointeur sur un
nombre rationnel
struct rationnel *px = &x;
La dclaration dune nouvelle structure associe la dfinition dun nouvel lment qui-
vaut au constructeur correspondant de Scheme.
La dsignation d'une composante de la structure utilise les notations pointes x.numera-
teur et x.denominateur qui reprsentent respectivement la composante numera-
teur et la composante denominateur du nombre rationnel x.
Si on suppose quil existe un fonction daffichage EntierAfficher(), on obtiendrait
EntierAfficher(x.numerateur); 4
EntierAfficher(x.denominateur); 5
Laccs aux composantes du nombre rationnel x peut, galement, tre effectu partir du
pointeur px
EntierAfficher((*px).numerateur); 4
EntierAfficher((*px).denominateur); 5
Il existe une notation quivalente
px->numerateur
La notation pointe joue un rle de slecteur lorsquelle apparait au sein d'une expression
valuer et de modificateur lorsquelle apparat comme membre de gauche d'une affecta-
tion
EntierAfficher(x.numerateur); 4
x.numerateur = 6;
EntierAfficher(x.numerateur); 6
Spcifier puis Implmenter. Typage explicite des Donnes.
- 208 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Voici, par exemple, une structure paire qui permettrait de construire des listes de
caractres
6
struct paire {
char tete;
struct paire *queue;
};
Si on suppose que NULL reprsente une liste vide, les dclarations
struct paire p1 = {d,NULL},
p2 = {c,&p1},
p3 = {b,&p2},
lc = {a,&p3};
permettent de construire la liste lc qui contient les 4 caractres a, b, c et d.
Enumration.
Nous avons vu au chapitre Abstraire par les Fonctions quon pouvait dfinir un ensemble
soit partir dune proprit commune tous ses lments soit en numrant les lments
qui en font partie. On peut, sur ce principe, dfinir de nouveau type de donnes en langage
C en numrant simplement les valeurs que les donnes de ce type peuvent prendre.
Une telle dclaration a la forme suivante
enum booleen {vrai,faux};
vrai et faux sont deux nouvelles constantes qui vont permettre de donner une valeur aux
donnes de type boolen.
Par exemple, on peut crire
enum booleen a = vrai,
b = faux,
c = vrai;
Le nom du type qui vient ainsi dtre cr est enum booleen. On peut de cette manire
dfinir des types trs pratiques
enum jour {
lundi,mardi,mercredi,jeudi,vendredi,samedi,dimanche
};
ou
enum couleur {
rouge,jaune,vert,bleu,violet
};
La dfinition dun ensemble numr permet de dfinir des symboles en langage C comme
le permet la quote-ation Scheme. En particulier, on peut dfinir les identificateurs de mes-
sage de cette manire
enum symbole {
voir,prendre,extraire,afficher,set,get
};
6
On retrouve cette occasion le fait que le langage C type explicitement les noms de ses donnes. cela ne
nous permet donc pas de dfinir une paire de nimporte quoi. Nous avons dfinit une paire pour construire
des listes de caractres, nous ne pourrions pas avec cette paire-l construire des listes contenant la fois
des caractres et autre chose.
Spcifier puis Implmenter. Typage explicite des Donnes.
- 209 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
9.5.5 Nommage des Types.
Les types de donnes construits sous la forme de structures ont des noms peu commodes et
il est intressant, car cela amliore la lisibilit
7
des programmes, de leur attribuer un nom
plus reprsentatif. On peut dfinir des synonymes pour dsigner un type existant l'aide de
loprateur de nommage typedef dont la forme gnrale est la suivante
typedef <nom du type> <synonyme>;
Ainsi
typedef struct rationnel Rationnel;
dfinit le synonyme Rationnel au nom de type struct rationnel. Ce synonyme peut
tre utilis partout la place du nom standard
Rationnel x = {4,5};
permet de dfinir un nombre rationnel.
Il est trs utile dutiliser typedef en association avec une discipline personnelle de dno-
mination. Je vous propose la suivante:
1. le nom dun type qui reprsente une entit commence par une majuscule. On nom-
mera, par exemple, Rationnel, Client.
2. le nom dun type qui reprsente un pointeur sur une entit est crit en majuscule. On
nommera ainsi RATIONNEL un pointeur sur un Rationnel.
On associera donc systmatiquement loprateur typedef la dfinition dune structure
struct rationnel {
int numerateur;
int denominateur;
};
typedef struct rationnel Rationnel, *RATIONNEL;
ce qui permettra dcrire ultrieurement
Rationnel r = {22,7};
RATIONNEL pr = &r;
7
La lisibilit d'un programme caractrise la facilit avec laquelle on en comprend le fonctionnement en en
lisant seulement le texte. Un mythe selon lequel il existe des langage lisibles et des langages non lisibles
alimente la guerre de religion des langages, en fait, il existe des programmes clairement structurs et des
programmes confus
...Ce qui se conoit bien s'nonce clairement
Et les mots pour le dire nous viennent aisment...
9.5.6 Type d'une Fonction
Le type dune fonction est dfini par son domaine associ son codomaine, on dira, par
exemple, que la fonction est de type ce qui signifie que son paramtre prend
ses valeurs dans R et que son rsultat appartient R. La fonction serait de
type .
Le type dune fonction dfinie en langage C est dclar au moment de sa dfinition
int
factorielle(n)
sin x ( ) R R
moyenne x y , ( )
R R R
Spcifier puis Implmenter. Typage explicite des Donnes.
- 210 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
int n;
{....}
dfinit la fonction factorielle comme tant de type . Cette criture correspond
au langage C traditionnel, la norme ANSI du langage C prconise lcriture quivalente
suivante
int
factorielle(int n)
{....}
La dclaration du type dune fonction va nous permettre de prciser la dfinition des inter-
faces des types abstraits de donnes.
Ainsi linterface du paquetage des Rationnels contenue dans le fichier rationnel.h scrirait
struct rationnel {
int numerateur;
int denominateur;
};
typedef struct rationnel Rationnel, *RATIONNEL;
RATIONNEL RationnelCreer (int,int);
int RationnelNumerateur (RATIONNEL);
int RationnelDenominateur (RATIONNEL);
tandis que le fichier dimplmentation rationnel.c contiendrait
#include "rationnel.h"
RATIONNEL
RationnelCreer(num,denom);
int num;
int denom;
{...}
int
RationnelNumerateur(unRat);
RATIONNEL unRat;
{
return(unRat->numerateur);
}
int
RationnelDenominateur(unRat);
RATIONNEL unRat;
{
return(unRat->denominateur);
}
Il peut arriver qu'un fonction ne rende pas de valeur (lorsqu'elle ne produit qu'un effet de
bord par exemple), il peut arriver galement qu'elle n'ait pas de paramtre, dans ce cas le
type de son domaine ou de son codomaine est nomm void
8
.
On dclarerait, par exemple
void RationnelAfficher(RATIONNEL);
8
Ce void l signifie jamais rien !
N N
Spcifier puis Implmenter. Les Environnements d'une Application C.
- 211 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
int random(void);
9.5.7 Forage du Type.
Le typage des noms a t introduit pour permettre au traducteur C de vrifier la cohrence
des expressions C que nous avons crites. La rgle de cohrence de base est trs simple, elle
consiste simplement considrer quune expression nest cohrente que si toutes les varia-
bles impliques dans lapplication dune fonction ses argument respectent le type annonc
dans le patron de cette fonction.
Cette rgle, comme toute rgle gnrale, supporte deux exceptions:
1. le type fictif void ne prjuge daucun type a priori, il faudra donc dfinir le type
effectif utilis le moment venu.
2. les oprateurs arithmtiques +, -, * et / peuvent tre dfinis (avoir un sens) mme
lorsquils sapplique des variables de types diffrents (nombres exacts et nombres
inexacts).
Ainsi, un type peut tre forc soit notre insu dans les expressions arithmtiques soit no-
tre instigation lorsquil sagit de dfinir finalement ce quon associe une variable void.
Lexpression 4+6.2 est ainsi automatiquement interprte comme 4.0+6.2 et le nombre
exact 4 t forc sous la forme inexacte 4.0. Par contre, certaines fonctions dites gn-
riques, rendent des valeurs qualifies de void.
Il existe, par exemple, une fonction trs importante dont le patron est
void * malloc(int);
Cette fonction rend un pointeur sur on verra bien quoi plus tard. Ainsi, lorsquon utilise cet-
te fonction, il est ncessaire de prciser comment on va interprter ce on verra bien quoi
plus tard en forant le type de ce que rend cette fonction.
Ecrivons, par exemple
RATIONNEL pr;
....
pr = (RATIONNEL)malloc(...);
Lopration note (RATIONNEL) dnote le forage du type on verra bien quoi plus tard
dans le type RATIONNEL.
9.6 Les Environnements d'une Application C.
L'environnement d'une application reprsente la structure o toutes les donnes d'une ap-
plication sont ranges. On distingue les environnements permanents dont la structure est
fixe pendant toute la dure de l'excution du programme de l'application et l'environnement
volatil dont la structure va voluer en permanence. De plus, selon le degrs d'accessibilit
des donnes, un environnement pourra tre qualifi de local ou de global.
Les environnements sont associs aux diffrentes abstractions de l'applications
Spcifier puis Implmenter. Les Environnements d'une Application C.
- 212 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Ces diffrents types d'environnements sont caractriss par la dure de vie (extent) et le do-
maine de visibilit (scope) des variables qui s'y trouvent. Un environnement est qualifi de
permanent lorsque les donnes qu'il contient sont immortelles et de volatil lorsque les don-
nes qu'il contient naissent et meurent ventuellement au cours d'une excution de l'appli-
cation.
Un environnement est qualifi de local lorsque l'accs aux donnes qui y sont situes est
limit aux instructions C situes soit dans le paquetage soit dans la fonction propritaire de
cet environnement et de global lorsque toutes les instructions C de l'application ont accs
aux donnes qu'il contient.
Il existe un environnement manuel dont la gestion est systmatiquement effectue travers
des pointeurs placs dans les autres environnements. Un des principaux agrments de l'uti-
lisation du langage C rside dans la grande facilit qu'il offre pour la gestion d'un tel envi-
ronnement.
9.6.1 Rgles de Visibilit.
Les rgles de visibilit associes aux diffrentes variables d'une application sont rgies par
la structure emboite des abstractions qu'il est possible de construire en langage C (Cf. fi-
gure 41, page 212).
Ainsi une abstraction a toujours accs aux variables de celles qui l'englobent tandis qu'elle
n'a jamais accs aux variables de celles qu'elle contient.
Niveau d'abstraction Environnement
Application global permanent
Paquetage local permanent
Fonction & Bloc de code priv
permanent
volatil
Fig. 41 : Structure emboite des abstractions langage C.
Application
Fichier
Fonction
Bloc de Code
Instruction
Spcifier puis Implmenter. Les Environnements d'une Application C.
- 213 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
9.6.2 Environnement permanent global d'une Application.
Une application C est constitue d'une ensemble de paquetages dont les instructions ont li-
brement accs aux donnes contenues dans l'environnement permanent global.
Les variables appartenant cet environnement sont dclares, l'intrieur des paquetages
de l'application qui en ont l'usage, en dehors de toute fonction et sont qualifies de extern.
En fait, peu de donnes justifient d'tre places dans cet environnement.
On y place, en gnral, un compte-rendu d'erreur de faon le rendre accessible immdia-
tement toutes les fonctions de l'application et les donnes d'un intrt indiscutablement
gnral. Par exemple, si on utilise un paquetage dfinissant un type de listes, on y placera
la constante liste vide.
Considrons une application dont l'architecture comprend les fichiers foo.c, bar.c et
baz.c et nous avons dfini une variable utilise comme compte-rendu d'erreur error-
Report. Cette variable est, par exemple, dfinie dans le fichier foo.c
int errorReport = 0;
main()
{....)
Elle est ensuite dclare dans le fichier bar.c.
extern int errorReport;
BAR
CreerBar(...)
...
{....)
puis dans le fichier baz.c:
extern int errorReport;
BAZ
Fig. 42 : Paquetages et environnements statique global.
Paquetage Paquetage Paquetage Paquetage
Environnement statique global
Application
Spcifier puis Implmenter. Les Environnements d'une Application C.
- 214 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
CreerBaz(...)
...
{....)
9.6.3 Environnement statique local d'un Paquetage.
Chaque paquetage est constitu d'un ensemble de fonctions dont les instructions ont libre-
ment accs aux donnes contenues dans l'environnement permanent local du paquetage.
Les instructions appartenant aux autres paquetages n'ont pas accs ces donnes.
Les variables appartenant cet environnement sont dclares, l'intrieur des paquetages
9

de l'application qui en ont l'usage, en dehors de toute fonction et sont qualifies de static.
Cet environnement est en gnral utilis pour y placer les constantes utiles l'implmenta-
tion du type de donnes dfini par le paquetage.
Le mot static dnote ici une restriction de la visibilit du nom ainsi qualifi, on peut ga-
lement l'utiliser pour empcher la visibilit de fonctions considres comme prives.
9
Dans le fichier d'implmentation correspondant xxx.c.
9.6.4 Environnements privs d'un Bloc de Code.
Le bloc de code, et par extension la fonction, constitue une barrire d'abstraction dans les
applications C qui limite la visibilit des variables qui y sont dfinies aux seules instructions
qui y sont contenues.
Environnement permanent priv
Chaque fonction, ou plus prcisment chaque bloc de code, peut tre associ un environ-
nement permanent priv.
Cet environnement contient des donnes qui ne sont accessibles qu'aux instructions du bloc
de code ou de la fonction considr. Ces donnes sont qualifies de static. Comme ces
Fig. 43 : Fonctions et environnement statique local.
Fonction Fonction Fonction Fonction
Environnement statique local
Paquetage
Spcifier puis Implmenter. Les Environnements d'une Application C.
- 215 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
donnes sont immortelles, on retrouve leur valeur chaque fois qu'on entre dans le bloc de
code correspondant.
Pour illustrer l'utilisation d'un tel environnement, imaginons une fonction qui compte le
nombre de fois o elle a t invoque
int
decompte()
{
static int comptage = 0;
comptage = comptage+1;
return(comptage);
}
La variable comptage est initialement dfinie gale 0. Comme elle est immortelle, elle
est incrmente chaque appel de decompte() et conserve sa valeur d'un appel l'autre.
Une telle fonction est utile dans la phase de mise au point d'une application en permettant
de reprer les fonctions qui, trs utilises, peuvent justifier une optimisation.
Environnement priv volatil dit automatique
Une application possde systmatiquement un environnement volatil priv. Cet environne-
ment est tendu au moment de l'entre dans tout bloc de code l'aide des variables qui y
sont dfinies et au moment de tout appel de fonction l'aide de ses paramtres. Cette exten-
sion est prive au bloc considr. La description d'un tel environnement a t vue la fin
du chapitre Abstraire par les Donnes.
Ainsi, les donnes dclares dans un bloc de code naissent lorsqu'on y entre et meurent
quand on en sort.
On utilise, en gnral, l'environnement automatique pour y dfinir des variables utilises
pour dnoter un rsultat intermdiaire dont la dure de vie n'a pas excder celle du calcul
effectu. Ces variables sont redfinies chaque invocation du bloc de code et disparaissent
la fin de l'excution du bloc. Nous pouvons, par exemple, tendre le paquetage des nom-
bres rationnels en y ajoutant une fonction permettant d'additionner deux nombres ration-
nels.
RATIONNEL
RationnelAjouter(unRat_1,unRat_2)
RATIONNEL unRat_1;
RATIONNEL unRat_2;
{
int num1 = RationnelNumerateur(unRat_1);
int num2 = RationnelNumerateur(unRat_2);
int dnm1 = RationnelDenominateur(unRat_1);
int dnm2 = RationnelDenominateur(unRat_2);
return(RationnelCreer(num1*dnm2+num2*dnm1,dnm1*dnm2));
}
les variables num1, num2, dnm1 et dnm2 sont prives la fonction RationnelAjou-
ter(), elles ne sont dfinies qu'au moment o on entre dans la fonction et meurent quand
on en sort.
Une utilisation intressante des blocs de code est le confinement d'une correction effectue
lors de la maintenance d'une fonction de l'application. Imaginons, par exemple que la fonc-
tion suivante provoque une erreur
void
Spcifier puis Implmenter. Les Environnements d'une Application C.
- 216 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
RectangleEtendre(...)
...
{
int x,y;
...
... une erreur est dtecte ce niveau
...
}
Cette erreur pourrait tre corrige en permutant les deux variables x et y. Malheureusement
si le remde est vident, cette fonction, dj ancienne et qui a subi de nombreuses correc-
tions, est devenue quasiment incomprhensible et il est pratiquement impossible de remon-
ter l'histoire de x et y.
La seule solution ( dfaut d'une re-criture de cette fonction) consiste intercaler un bloc
de code pour effectuer la permutation ncessaire
void
RectangleEtendre(...)
...
{
int x,y;
...
...
{ /* correction de lerreur : debut */
int z = x;
x = y;
y = z;
} /* correction de lerreur : fin */
...
}
La variable z ainsi introduite pour effectuer la permutation ne risque pas d'interfrer avec
une autre variable z de la fonction.
En rgle gnrale, il est de bonne politique de ne dfinir les variables temporaires qu'au ni-
veau du bloc de code o elles sont effectivement utilises.
9.6.5 Environnement manuel dit le tas.
L'environnement dynamique manuel correspond une structure nomme tas (heap) dans
lequel il est possible d'allouer puis de dsallouer des donnes. Ce n'est pas une possibilit
offerte directement par le langage C lui-mme, mais par un paquetage spcial dont l'inter-
face rsume est la suivante:
void * malloc(int);
void free(void *);
malloc() est la fonction permettant l'allocation d'une donne et free() celle permet-
tant la destruction de cette donne et la libration de la place occupe.
D'autre langages impratifs (Pascal, Ada...), incorporent dans le langage lui-mme ces deux
oprateurs.
Extension de l'Environnement manuel
La fonction malloc(...) rend un pointeur sur on verra bien plus tard donnant accs
un emplacement allou dans le tas pouvant contenir l'lment dont la taille est passe en ar-
gument. C'est l'oprateur C sizeof(...) qui nous donne cette taille.
Spcifier puis Implmenter. Les Environnements d'une Application C.
- 217 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Par exemple
sizeof(int)
sizeof(float)
sizeof(Rationnel)
rendent respectivement la taille
10
d'un int, d'un float et d'un Rationnel.
Nous pouvons, prsent, dfinir le constructeur de Rationnels et terminer la dfinition de
leur paquetage.
RATIONNEL
RationnelCreer(num,denom)
int num;
int denom;
{
RATIONNEL unRat = (RATIONNEL)malloc(sizeof(Rationnel));
unRat->numerateur = num;
unRat->denominateur = denom;
return(unRat);
}
Si les pointeurs permettant d'accder aux donnes ainsi alloues sont placs dans les envi-
ronnements permanents ou lenvironnement automatique, les donnes elles-mmes sont
dans le tas.
Libration dans l'Environnement manuel
Une entit qui a t alloue sur le tas peut tre dtruite l'aide de la fonction free(...)
lorsqu'on est sr qu'elle n'est plus utilise.
Pour cela, dans le cas du paquetage des Rationnels, il est ncessaire de dfinir un destruc-
teur.
void
RationnelDetruire(unRat)
RATIONNEL unRat;
{
free(unRat);
}
Librer ou ne pas librer ?
Il n'est pas toujours facile de savoir si on peut dtruire un objet ou non, cette question peut
mme devenir indcidable. Pour illustrer le problme, examinons l'application Serrure
Code du chapitre Objets & Programmation Oriente Objets.
Le mcanisme de transmission de messages utilis dans le dialogue entre les diffrents ob-
jets de l'application ncessite la prsence d'un objet codeur commun en tant qu'accointance
toutes les touches et la porte.
Imaginons que dans un certain cadre, il soit ncessaire de crer puis de dtruire des touches
tout au long d'une excution de l'application. Il est clair que la destruction d'une touche ne
doit pas entraner, a priori, la destruction du codeur. Mais comment savoir si la touche d-
truire n'est pas la dernire accder au codeur (la porte et toutes les autres touches ont dj
t dtruites) auquel cas, il faut dtruire le codeur ?
10
La taille d'un int, d'un char ou d'un float dpendant de la machine sur laquelle on travaille, la seule
faon d'crire un programme portable d'une machine l'autre est d'utiliser l'oprateur sizeof(...).
Spcifier puis Implmenter. Paquetage de la Paire.
- 218 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Un remde possible (mais pas systmatique) consiste ne pas partager d'objets entre diff-
rents propritaires. Dans ce cas, un objet est systmatiquement dupliqu avant que d'tre af-
fect un attribut. Il peut donc tre ncessaire de dfinir un duplicateur de Rationnels.
RATIONNEL
RationnelDupliquer(unRat)
RATIONNEL unRat;
{
RationnelCreer(unRat->num,unRat->denom);
}
9.7 Paquetage de la Paire.
Une des structure de donnes les plus importantes s'est rvle tre la Liste. La liste a t
dfinie partir d'un autre type de donnes, la Paire. Nous allons transposer en C d'abord le
paquetage de la Paire puis celui de la Liste. Nous allons ainsi constater que cela fait, l'uti-
lisation de ces paquetages va nous permettre de programmer en C dans un style trs proche
de celui de la programmation Scheme.
9.7.1 Spcifications dtailles de la Paire.
La Paire peut tre dfinie partir de son constructeur, de ses slecteurs et de ses modifica-
teurs.
(define cons
(lambda (car cdr)
(let ((set-car (lambda (nv) (set! car nv)))
(set-cdr (lambda (nv) (set! cdr nv))))
(lambda (msg)
(cond ((eq? msg 'car) car)
((eq? msg 'cdr) cdr)
((eq? msg 'set-car) set-car)
((eq? msg 'set-cdr) set-cdr))))))
(define car (lambda (p) (p car))
(define cdr (lambda (p) (p cdr))
(define set-car! (lambda (p v) ((p set-car) v)))
(define set-cdr! (lambda (p v) ((p set-cdr) v)))
La technique de transposition des messages Scheme en fonctions C nous tant devenue fa-
milire, nous ne la dtaillerons pas.
9.7.2 Interface de la Paire.
La structure de la paire (dduite directement des paramtres du constructeur Scheme) est
contenue dans le fichier de dfinition dinterface. Il est clair qu'il est particulirement con-
fortable de dfinir les fonctions correspondant celles dfinies en Scheme en leur donnant
les mmes noms
11
.
11
Nous serons obligs de sacrifier les caractres ? ! et : que nous avions utiliss pour reprsenter respecti-
vement les prdicats, les modificateurs et les constructeurs sur l'autel de la syntaxe du langage C.
Spcifier puis Implmenter. Paquetage de la Paire.
- 219 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
La paire tant trs souvent utilise pour construire des listes il est ncessaire de complter
la paire de la paire vide et du prdicat permettant de savoir si une paire est la paire vide. La
technique la plus simple pour dfinir une constante, ici la paire vide que nous nommerons
nil, est de se souvenir qu'il n'y a pas de diffrence entre donne et procdure et donc de
dfinir une procdure jouant le rle de cette constante.
L'interface du paquetage de paire est contenu dans le fichier paire.h.
struct paire {
void *car;
void *cdr;
};
typedef struct paire Paire, *PAIRE;
PAIRE cons(void *,void *);
PAIRE nil(void);
int null(PAIRE);
void * car(PAIRE);
void * cdr(PAIRE);
void set_car(PAIRE,void *);
void set_cdr(PAIRE,void *);
9.7.3 Implmentation de la Paire.
L'implmentation de la paire sera possible ds que nous aurons choisi une reprsentation
pour la paire vide. Le plus simple est d'associer la constante nil une paire pathologique,
la plus pathologique de toutes est sans conteste celle dont la tte est elle-mme.
On tombe, ici, sur un problme dlicat quon rencontre, dans presque tous les langages de
programmation, ds lors quon veut introduire les constantes associes un nouveau type de
donnes. En effet, comment tre sr que ces constantes ne seront pas recres, par hasard,
en manipulant dautres types de donnes ?
On essaye donc dimaginer des configurations quil est pratiquement impossible de crer au
hasard. Malheureusement cette mthodes nest que probablement sre et son utilisation
produit (trs rarement heureusement) des bugs non reproductibles sur lesquels on pose, en
gnral, un voile pudique.
L'implmentation de ce paquetage est classique et n'attire pas dautre commentaire. Elle est
contenue dans le fichier paire.c
#include "paire.h"
PAIRE
cons(car,cdr)
void * car;
void * cdr;
{
PAIRE p= (PAIRE)malloc(sizeof(Paire));
p->car = car;
p->cdr = cdr;
return(p);
}
PAIRE
nil()
{
Spcifier puis Implmenter. Paquetage de la Liste.
- 220 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
PAIRE p = (PAIRE)malloc(sizeof(Paire));
p->car = p;
return(p);
}
int
null(p)
PAIRE p;
{
return (p == car(p));
}
void *
car(p)
PAIRE p;
{
return(p->car);
}
void
cdr(p)
PAIRE p;
{
if null(p) {
return(p);
} else {
return(p->cdr);
}
}
void
set_car(p,x)
PAIRE p;
void *x;
{
p->car = x;
}
void *
set_cdr(p,x)
PAIRE p;
void *x;
{
if !null(p) {p->cdr = x;}
}
9.8 Paquetage de la Liste.
Le paquetage associ la liste est un peu nouveau pour nous en ce sens qu'il ne correspond
pas une structure particulire de donnes mais simplement la dfinition de fonctions de
manipulation des paires et des listes.
Spcifier puis Implmenter. Paquetage de la Liste.
- 221 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
9.8.1 Spcifications dtailles de la Liste.
Nous nous contenterons de dfinir les deux fonctions length et append titre d'exem-
ple. Il serait trs facile d'en rajouter autant que ncessaire. On se souvient que les spcifica-
tions de ces deux fonctions sont
(define length
(lambda (ll)
(if (null? ll)
0
(+ 1 (length (cdr ll)))))
(define append
(lambda (l1 l2)
(if (null? l1)
l2
(cons (car l1) (append (cdr l1) l2))))
Linterprte Scheme sait afficher les listes dans la mesure o elles ne contiennent que des
objets quil sait afficher. On pourrait cependant spcifier une procdure d'affichage relati-
vement gnrale
(define display-liste
(lambda (ll)
(cond ((null? ll) (newline))
(else (display (car ll))
(display " ")
(display-liste (cdr ll)))))
9.8.2 Interface de la Liste.
Nous verrons un peu plus tard pourquoi il nest pas possible de dfinir une fonction daffi-
chage rellement gnrique, nous nous contenterons donc, titre dexemple, de laffichage
dune liste de chanes de caractres.
L'interface du paquetage de liste est contenu dans le fichier liste.h.
#include "paire.h"
typedef PAIRE LISTE;
void DisplayListeTexte(LISTE);
int length(LISTE);
LISTE append(LISTE,LISTE);
9.8.3 Implmentation de la Liste.
L'implmentation de la liste est contenue dans le fichier liste.c.
#include "liste.h"
int
length(lst)
LISTE lst;
{
if (null(lst)) {
return(0);
} else {
Spcifier puis Implmenter. Le Paquetage de la Pile.
- 222 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
return(1 + length(cdr(lst)));
}
}
LISTE
append(l1,l2)
LISTE l1,l2;
{
if (null(l1)) {
return(l2);
} else {
return(cons(car(l1),append(cdr(l1),l2)));
}
}
Le langage C ne sait pas, naturellement, afficher les listes, il faut donc dfinir une fonction
daffichage pour une liste. Mais, alors que les fonctions prcdentes sont gnriques, cette
fonction-ci ne peut pas ltre. En effet, tant quon se contente de manipuler laveuglette
des lments contenus dans une liste, cette manipulation peut tre gnrique, par contre, ds
quil sagit deffectuer des oprations sur ces lments, il faut que lopration elle-mme
soit gnrique.
Par exemple, on ne peut faire la somme des lments correspondants de deux listes que si
on peut tre srs que ce sont des nombres. Il devient alors clair quon ne peut pas faire des
listes de nimporte quoi nimporte comment.
Voici, titre dexemple, le fonction daffichage dune liste homogne de chanes de carac-
tres.
void
DisplayListeTexte(lst)
LISTE lst;
{
if (null(lst)) {
printf("\n");
} else {
printf(" ");
printf(car(lst));
DisplayListe(cdr(lst));
}
}
Je pense que la similitude avec la programmation Scheme commence vous sauter aux
yeux.
9.9 Le Paquetage de la Pile.
La paquetage de la Pile va se dduire directement des spcifications dtailles que nous
avons dfinies au chapitre consacr aux Structures mutables.
9.9.1 Spcifications dtailles de la Pile.
(define pile-vide
(lambda () (reference-a nil))
Spcifier puis Implmenter. Le Paquetage de la Pile.
- 223 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
(define push
(lambda (x &p)
(ref! &p (cons x (&p))) x))
(define pop
(lambda (&p)
(let ((sdp (car (&p))))
(ref! &p (cdr (&p))) sdp))))
9.9.2 Interface de la Pile.
Linterface de la Pile est contenue dans le fichier pile.h.
#include "liste.h"
struct pile {
LISTE lp;
};
typedef struct pile Pile *PILE;
PILE pile_vide(void);
void * push(void *,PILE);
void * pop(PILE);
9.9.3 Implmentation de la Pile
Limplmentation de la Pile est contenue dans le fichier pile.c.
#include "pile.h"
PILE
pile_vide();
{
PILE p= (PILE)malloc(sizeof(Pile));
p->lp = nil();
return(p);
}
void
push(x,p)
PILE p;
void * x;
{
p->lp = cons(x,p->lp);
return(x);
}
void *
pop(p)
PILE p;
{
void * sdp = car(p->lp);
p->lp = cdr(p->lp);
return(sdp);
Spcifier puis Implmenter. Les Procdures C.
- 224 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
}
9.10 Les Procdures C.
Nous avons dja appris dfinir puis invoquer une procdure. Par exemple, nous avons
dfini la procdure factorielle.
int
factorielle(n)
int n;
{
if (n == 1) {
return(1);
} else {
return(n*factorielle(n-1));
}
}
que nous pouvons invoquer dans une instruction de la forme
j = factorielle(6);
Nous avons galement appris dclarer une procdure pour construire les interfaces des pa-
quetages:
int factorielle(int);
Approfondissons, prsent, les proprits des procdures C et en particulier demandons-
nous en quoi les procdures C ne sont pas des citoyens de premire classe comme les pro-
cdures Scheme.
Dans le cadre des langages de programmation, les citoyens de premire classe peuvent tre:
1. dfinis - ils constituent des valeurs qu'il est possible de nommer afin d'en faire une
abstraction.
2. affects - ils peuvent tre associs un nom afin d'tre manipuls.
3. crs - on peut leur dfinir un constructeur.
4. subir une application - ils peuvent constituer un argument de procdure.
5. constituer le rsultat d'une valuation.
Dans tous les langages de programmation, les donnes sont des citoyens de premire classe,
par contre, il est assez rare que les procdures le soient
12
. Comparons, sur ce point, les pr-
rogatives des donnes et des procdures en Scheme et en C (Cf. tableau 5, page 225).
On remarque que Scheme ne sait pas crer de donnes. Cela ne doit pas nous surprendre
puisqu'en fait Scheme considre que toutes ses entits sont des fonctions. Nous avons
d'ailleurs dfini les donnes partir de leur constructeur.
Manipuler une procdure comme une donne ncessite, en fait, deux choses:
1. il faut pouvoir les affecter une variable. Cela permet de les passer en argument
d'une autre procdure ou de les rcuprer comme rsultat d'une application.
2. il faut disposer d'un oprateur de cration de procdure. Cela permet de concevoir
des procdures qui construisent des procdures. Cela permet, en plus, de dissocier la
12
Scheme est exceptionnel de ce point de vue l.
Spcifier puis Implmenter. Les Procdures C.
- 225 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
procdure du nom qu'on lui associe et ainsi de lui donner une existence en tant que
telle.
Le langage C ne dispose pas d'un oprateur pour crer une procdure. On ne peut donc pas
dfinir de procdure qui construirait une procdure. Cela revient considrer que le nom
d'une procdure qui a t dfinie est une constante.
Si on veut pouvoir affecter une procdure une variable, il est ncessaire de dfinir un type
procdure. En fait, le langage C permet de dfinir un pointeur sur une procdure. La d-
claration d'une tel pointeur est complexe, aussi nous n'en verrons que les formes les plus
utiles.
La forme la plus simple est la suivante
int (*pf)();
qui dfinit la variable pf comme tant un pointeur sur une fonction qui rend un entier. Une
autre forme est galement utile
int (*tpf[10])();
qui dfinit tpf comme tant un tableau de 10 pointeurs sur des fonctions qui rendent des
entiers.
La lecture de ces dclarations dmarre au nom dfini puis avance un coup droite puis un
coup gauche. Les signes () dnotent fonction, les signes [] dnotent tableau et le signe
* dnote pointeur.
Donnes langage C Donnes Scheme
Dfinition int foo=5; (define foo 5)
Affectation foo=8; (set! foo 8)
Cration unRat=(RATIONNEL)malloc(...); -
Argument factorielle(foo); (factorielle foo)
Rsultat return(1); (lambda (...)... 1)
Tab. 5 : Prrogatives des donnes.
int (*tpf[10])()
fonction qui rend un ... est un tableau de 10 ...
pointeurs sur ... entier
Spcifier puis Implmenter. Les Procdures C.
- 226 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
La manipulation des procdures en C devient facile et est souvent utilise (Cf. tableau 6,
page 226).
Le mcanisme d'valuation des procdures C est identique celui des procdures Scheme.
Les arguments de la procdure sont valus puis celle-ci est appliques au rsultat de cette
valuation. Ce mcanisme que nous avions appel valuation en ordre applicatif est appel
passage des arguments par valeur dans le contexte des langages de programmation imp-
ratifs tels C, Pascal et Ada.
A titre d'exemple, reprenons le petit exercice de virtuosit qui consistait redfinir les boo-
lens uniquement l'aide de fonctions.
Les constantes vrai et faux ont t dfinies cette occasion partir des deux fonctions
(define vrai (lambda (a b) a)
(define faux (lambda (a b) b)
associes la fonction d'affichage correspondante.
(define booleen-afficher (lambda (b) (display (b "V" "F")))
Les deux premires fonctions se traduisent immdiatement en C.
char *
vrai(a,b)
char *a;
char *b;
{
return(a);
}
et
char *
faux(a,b)
char *a;
char *b;
{
return(b);
}
A partir de l il est agrable de dfinir un synonyme pour le type pointeur sur une fonction
qui rend un pointeur sur des caractres et qui nous sert de boolen.
Procdures langage C Procdures Scheme
Dfinition
int
factorielle(n)
int n; {...}
(define square
(lambda (x) (* x x))
Affectation
int (*pf)();
pf = factorielle;
...
pf(6);
(set! foo square)
Cration - (lambda (x) (* x x))
Tab. 6 : Prrogatives des fonctions.
Spcifier puis Implmenter. Transmission de Messages en langage C.
- 227 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
typedef char * (*Booleen)();
Cela nous permet de dfinir la fonction d'affichage des boolens de manire plus conforta-
ble.
void
BooleenAfficher(a)
Booleen a;
{
printf(a("V","F"));
}
Les fonctions and et or avaient t dfinies par
(define and (lambda (a b) (a b faux))
(define or (lambda (a b) (a vrai b))
ce qui se traduit immdiatement en C par
Booleen
and(a,b)
Booleen a;
Booleen b;
{
return(a(b,faux));
}
Booleen
or(a,b)
Booleen a;
Booleen b;
{
return(a(vrai,b));
}
Un exemple d'utilisation de ces drles de boolens pourrait tre
main()
{
BooleenAfficher(vrai);
printf("\n");
BooleenAfficher(faux);
printf("\n");
BooleenAfficher(and(faux,faux));
BooleenAfficher(and(faux,vrai));
BooleenAfficher(and(vrai,faux));
BooleenAfficher(and(vrai,vrai));
}
9.11 Transmission de Messages en langage C.
La technique de transposition utilise jusqu' prsent introduit un grand nombre de proc-
dures dans le domaine public de l'application. Cela pose assez rapidement deux problmes:
1. Il devient vite difficile de trouver des noms de procdure lorsque leur nombre
devient lev (de quelques centaines quelques milliers).
2. Il est difficile d'utiliser des paquetages d'origine diverses cause des nombreuses
collisions de noms qui ne vont pas manquer de se produire et qui sont insolubles.
Spcifier puis Implmenter. Transmission de Messages en langage C.
- 228 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Le remde cette situation est d'utiliser la transmission de messages qui resoud les deux
problmes prcdents d'une part du fait que toutes les procdures d'un paquetage devien-
nent prives et d'autre part du fait que les messages qui leur sont associs permettent le po-
lymorphisme.
Donnons, titre d'exemple, une implmentation des Rationnels utilisant la transmision de
messages comme technique d'invocation du constructeur et des slecteurs associs.
La structure des nombre rationnels n'a pas besoin d'tre modifie, elle est contenue dans le
fichier rationnel.h
struct rationnel {
int num;
int denom;
};
typedef struct rationnel Rationnel, *RATIONNEL;
L'interface du paquetage est, elle, compltement diffrente. On se souvient que dans le cas
des langages objets, on avait dfini une classe associe chacun des types d'objet de l'ap-
plication. Cette classe tait une structure de donnes qui contenait uniquement les mthodes
associes ses futures instances. Nous allons donc dfinir une structure contenant, sous la
forme de pointeurs sur procdure, toutes les primitives associes au type de donnes d-
finir.
Cette interface est contenue dans le fichier rationnel.h.
#include "rationnel.h"
struct rationnel {
int num;
int denom;
};
typedef struct rationnel Rationnel, *RATIONNEL;
struct c_rationnel {
RATIONNEL (*creer)();
int (*numerateur)();
int (*denominateur)();
};
typedef struct c_rationnel Ratio;
extern Ratio RATIO;
Nous reviendrons sur le rle jou sur la dclaration finale du fichier d'interface. Le fichier
d'implmentation dfinit toutes les procdures qui seront associer aux messages.
Ces procdures seront naturellement prives. Cette implmentation est contenue dans le fi-
chier rationnel.c.
#include "rationnel.h"
static RATIONNEL
creer(num,denom)
int num;
int denom;
{
RATIONNEL unRat = (RATIONNEL)malloc(sizeof(Rationnel));
unRat->num = num;
unRat->denom = denom;
Spcifier puis Implmenter. Rcursion terminale & Processus itratif.
- 229 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
return(unRat);
}
static int
numerateur(unRat)
RATIONNEL unRat;
{
return(unRat->num);
}
static int
denominateur(unRat)
RATIONNEL unRat;
{
return(unRat->denom);
}
Ratio RATIO = {creer,numerateur,denominateur};
La dernire ligne du fichier d'implmentation introduit la dfinition de la donne globale
RATIO qui joue le rle d'un dictionnaire des mthodes. C'est parce que cette donne globale
doit tre la disposition de tous les clients du type Rationnels que sa dclaration en tant
qu'extern t place dans le fichier d'interface.
Le fichier t-rationnel.c illustre l'utilisation de ces pseudo-messages pour manipuler
des instances de Rationnels.
#include "rationnel.h"
main()
{
RATIONNEL unRat = RATIO.creer(4,5);
AfficherEntier(RATIO.numerateur(unRat));
AfficherEntier(RATIO.denominateur(unRat));
}
9.12 Rcursion terminale & Processus itratif.
Il nous reste un dernier problme traiter, c'est celui de la description des processus itratifs
que Scheme sait associer une dfinition rcursive terminale mais que le langage C ne sait
ni reconnatre ni exploiter.
9.12.1 Traduction de l'Invariant.
Nous avons vu qu'une dfinition rcursive terminale pouvait (et devait) toujours tre asso-
cie un invariant qui garantit la validit du processus itratif engendr. C'est cet invariant
qui va nous servir d'intermdiaire entre la forme Scheme et la forme C de l'itration.
On se souvient que l'invariant est un prdicat qui est vrai au dbut de l'itration, qui le reste
tout au long de l'itration et qui signale, en devenant faux, que l'itration doit cesser.
Spcifier puis Implmenter. Rcursion terminale & Processus itratif.
- 230 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Reprenons l'exemple simple de la fonction factorielle dfinie sous forme itrative.
On peut vrifier que l'expression
(fact-iter 1 n)
a pour but de rendre linvariant asoci cette dfinition vrai, on l'appellera l'initialisation
de l'itration.
L'expression
(if (= m 1) ...)
interrompt l'itration ds que cet invariant devient faux, on l'appellera la sortie de l'itration.
Quant la procdure fact-iter dont le seul but est de faire tourner l'itration, nous l'ap-
pellerons le corps de l'itration.
La structure de cette itration est alors dcrite figure 44, page 230. La traduction C de cette
itration peut s'crire
....
f = 1;
m = n;
loop:
if (m == 1) goto sortie;
f = m*f;
m = m-1;
goto loop;
(define factorielle
(lambda (n)
(letrec ((fact-iter
(lambda (f m)
(if (= m 1)
f
(fact-iter (* n f) (- m 1))))))
(fact-iter 1 n))))
f = n*f;
m = m-1;
f = 1;
Fig. 44 : Structure dune itration.
f = 1;
m = n;
m == n
f = m*f;
m = m-1;
initialisations
corps
sortie
Spcifier puis Implmenter. Rcursion terminale & Processus itratif.
- 231 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
sortie:
....
loop: et sortie: s'appellent des labels et l'instruction goto permet de rejoindre l'ins-
truction associe au label cible.
Cette instruction goto a une trs mauvaise rputation car malgr son caractre indispensa-
ble, mal utilise elle transforme les programmes en fouillis indescriptibles. Aussi, dans les
annes 70, une violente campagne anti goto fut dclenche par les chercheurs en informa-
tique qui dfinirent des structures de remplacement plus sres bien que tout aussi efficaces.
A l'heure actuelle il est toujours trs mal vu d'utiliser cette instruction goto mme lors-
qu'elle est irremplaable
13
. Ainsi donc, l'exemple ci-dessus n'est pas suivre sans discer-
nement.
13
L'implmentation d'une machine tats finis (CF. cours de Mathmatique pour l'informatique) est le seul
cas o l'utilisation du goto s'impose la fois pour son efficacit et pour sa lisibilit.
9.12.2 Structures de Boucle.
Comme il est frquent qu'il existe plusieurs conditions rendant l'invariant d'itration faux,
la structure de boucle la plus gnrale est la suivante
loop {
....
exitif <prdicat 1>;
....
exitif <prdicat 2>;
....
exitif <prdicat 3>;
...
}
Malheureusement, cette structure n'existe pas en C (nous verrons cependant comment la
recrer). Le langage C fournit deux structures correspondant aux deux cas particuliers sui-
vants
while <predicat> {
...
}
lorsqu'il n'existe qu'une seule condition rendant l'invariant faux et que cette condition est
valuer au dbut du corps de l'itration, et
do {
...
} while <predicat>;
lorsqu'il n'existe qu'une seule condition rendant l'invariant faux et que cette condition est
valuer la fin du corps de l'itration.
La premire forme dnote que l'itration est effectue tant que le prdicat est vrai, tandis
que la deuxime dnote que l'itration est effectue jusqu' ce que le prdicat devienne faux.
Cette restriction rend trs malaise l'utilisation de ces structures dans le cas gnral. On uti-
lise alors souvent la forme suivante
while(1) {
....
if <prdicat 1> break;
Spcifier puis Implmenter. Le Pr-Processeur C.
- 232 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
....
if <prdicat 2> break;
....
}
Dans ces conditions, la fonction factorielle pourrait tre dfinie en C par
int
factorielle(n)
int n;
{
int f = 1;
while (n != 1) {
f = n*f;
n = n-1;
};
return(f);
}
le prdicat (n != 1) signifiant n diffrent de 1, ou par la forme quivalente:
int
factorielle(n)
int n;
{
int f = 1;
while(1) {
if (n <= 1) break;
f = n*f;
n = n-1;
};
return(f);
}
9.13 Le Pr-Processeur C.
Une particularit du langage C est dtre systmatiquement associ un prprocesseur. Un
prprocesseur est une sorte dditeur de texte paramtrable permettant de dfinir des formes
textuelles quivalentes entre elles. Ces formes textuelles sappellent des macro-dfinitions.
Ce prprocesseur est systmatiquement invoqu sur le texte des programmes C avant quils
soient soumis au traducteur C lui-mme.
Les commandes au prprocesseur sont repres par le fait que la ligne qui en contient une
commence par le signe #.
Le prproceseur fonctionnement uniquement par remplacement textuel, il ninterprte
jamais le texte quon lui soumet et les macro-dfinitions ne sont que des rgles de rempla-
cement textuel.
Prprocesseur Traducteur C
texte C
macro-dfinitions
texte C pur
Spcifier puis Implmenter. Le Pr-Processeur C.
- 233 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
Le prprocesseur peut donc tre utilis sur nimporte quel texte.
9.13.1 Intgration de Fichiers.
Nous avons dj rencontr la commande dintgration de fichiers
#include <nom de fichier>
Cette commande insre le fichier indiqu dans le fichier qui la contient. Elle est trs utile
pour insrer des portions communes de texte C pour garantir leur identit totale. Cest pour
cela que nous lutilisons pour tre srs que linterface dun paquetage est bien peru de fa-
on identique par tous ses clients.
9.13.2 Dfinition de Constantes.
Les expressions C contiennent parfois des constantes dintrt gnral. Il est alors fonda-
mental de garantir que cette constante est bien vue partout de la mme faon. Une comman-
de du prprocesseur permet de dfinir de telles constantes
#define PI 3.1415926
#define TVA 0.186
Nous verrons quil peut tre utile de dfinir simplement un symbole sans lui associer de va-
leur
#define DEJA_FAIT
Lors de la conception dune application, on dfinit alors frquemment un fichier des cons-
tantes. Ces constantes peuvent souvent tre interprtes comme des symboles un peu ana-
logues aux symboles Scheme.
9.13.3 Dfinition de Formes spciales.
Une forme spciale est une dfinition paramtre. Bien que sa forme soit trs analogue
celle dune fonction C, elle est interprte de manire radicalement diffrente.
Considrons, par exemple, les macros dfinition suivantes
#define loop while(1)
#define exitif(p) if (p) break
et la fraction de programme C suivante
...
loop {
...
...
exitif(n<0);
...
exitif(n==0);
...
}
...
sera remplac, par le prprocesseur, par le fragment suivant
...
while(1){
...
Spcifier puis Implmenter. Le Pr-Processeur C.
- 234 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
...
if (n<0) break;
...
if (n==0) break;
...
}
...
Les macro-dfinitions sont alors trs souvent utilises pour gommer laspect ingrat de cer-
taines critures C. Cette souplesse unique dans le modelage de laspect extrieur des pro-
grammes, est un des arguments majeur du choix trs frquent du couple
prprocesseur,traducteur C pour le dveloppement de grandes applications.
Les macro-dfinitions ayant la mme forme que les fonctions, sans en avoir le cot dex-
cution, certaines optimisations sont ralises en remplaant des fonctions frotement sollici-
tes par des macro-dfinitions quivalentes.
#define RationnelNumerateur(r) r->numerateur
#define RationnelDenominateur(r) r->denominateur
Une macro-dfinition conduisant un simple remplacement textuel, il peut se produire des
effets pervers dont il faut se mfier. Considrons, par exemple, la dfinition suivante
#define somme(x,y) x+y
et le fragment de programme
...
x = 3*somme(4,5);
...
qui prend la forme
...
x = 3*4+5);
...
ce qui nest certainement pas le rsultat souhait.
La dfinition correcte serait
#define somme(x,y) (x+y)
9.13.4 Traitement conditionnel.
Il arrive frquemment quune application (ou un paquetage) soit cliente, simultanment,
dun paquetage A et dun paquetage B dont la dfinition utilise la paquetage A. On peut
imaginer un paquetage Dictionnaire utilisant la fois le paquetage Paire et le paquetage
Liste. Il va alors se produire des redfinitions que le traducteur C ne tolre pas. Il faut donc
faire en sorte de ne pas importer une interface qui a dj t importe.
Il arrive frquemment, galement, quon soit amen dvelopper une application devant
tre compatible avec diffrentes plateformes de dveloppement. On veut, par exemple une
application pouvant fonctionner la fois sous Unix, sous MS-DOS et Macintosh. Ces sys-
tmes fonctionnent laide de bibliothques de fonctions en gnral incompatibles.
Ce problme est facilement rsolu en incluant des commandes conditionnelles construites
partir des commandes
#if <prdicat>
#ifdef <symbole>
Spcifier puis Implmenter. Le Pr-Processeur C.
- 235 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
#ifndef <symbole>
#else
#endif
Il nest donc pas rare de rencontrer des fichiers dinterface et des fichiers dimplmentation
de la forme suivante
...
... <portion de C multi-plateforme>
...
#ifdef MSDOS
...
... <portion de C pour une plateforme MS-DOS>
...
#endif
#ifdef UNIX
...
... <portion de C pour une plateforme UNIX>
...
#endif
#ifdef MACINTOSH
...
... <portion de C pour une plateforme Macintosh>
...
#endif
...
Selon la constante dfinie (dans un fichier de configuration, bien sr) les fragments de pro-
grammes incompatibles avec la plateforme cible ne seront pas soumis au traducteur.
En ce qui concerne les fichiers dinterface, il est trs souhaitable de les dfinir de faon con-
ditionnelle.
Linterface du paquetage de Paire devient, par exemple
#ifndef PAIRE_DEFINIE
struct paire {
void *car;
void *cdr;
};
typedef struct paire Paire, *PAIRE;
PAIRE cons(void *,void *);
PAIRE nil(void);
int null(PAIRE);
void * car(PAIRE);
void * cdr(PAIRE);
void set_car(PAIRE,void *);
void set_cdr(PAIRE,void *);
#define PAIRE_DEFINIE
#endif
Spcifier puis Implmenter. Conclusion.
- 236 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
9.14 Conclusion.
Nous n'avons vu qu'une toute petite partie du langage C, mais vous avez pu constater qu'elle
permet de programmer des applications dj fort complexes. L'approche que nous avons
suivie:
1. Analyse du problme (en utilisant tous les outils de raisonnement notre disposition
comme les mathmatiques, la logique, le bon sens, l'exprience...) , et spcifications
des besoins,
2. Dfinition d'une architecture de solution,
3. Spcification des lments de cette architecture,
4. Formulation de tout ce qui prcde l'aide d'un langage de raisonnement (Scheme
par exemple - cela permet de vrifier la cohrence de ce qui prcde),
5. Programmation dans un environnement de dveloppement (centr autour de langa-
ges comme C, Pascal, Ada, Fortran ...),
prsente un grand caractre de gnralit. C'est une bonne stratgie qui, bien que perfectible
(les chercheurs y travaillent), constitue notre meilleur outil de travail.
Nous avons pu constater que nos schmas de raisonnement sont simples et en nombre fina-
lement trs faible (mme s'ils ne sont pas toujours vidents mettre en oeuvre). Ils prsen-
tent, cependant, une richesse suffisante pour aborder avec succs la plupart des problmes
informatiques qu'on rencontre couramment
14
.
14
Il existe, bien sr, des problmes qui rsistent ce style d'attaque. Ils constituent alors des domaines de
recherche.
9.15 Exercices.
Traduire en langage C les exercices poss dans les chapitres prcdents sera un excellent
entranement.
E-96 Sur le modle de la Pile (paragraphe 9.9, page 222), donner une implmentation de la File
telle quelle a t spcifie au paragraphe 6.7.3, page 136 du chapitre Les Structures muta-
bles.
E-97 Utiliser les spcifications du dictionnaire dfinies au paragraphe 6.7.3, page 136 du chapitre
Les Structures mutables pour en implmenter une version C.
Nota: utilisez la liste implmente dans ce chapitre.
E-98 Utiliser les spcifications du dictionnaire dfinies au paragraphe 6.7.3, page 134 du chapitre
Les Structures mutables pour en implmenter une version C.
Nota: utilisez la liste implmente dans ce chapitre.
E-99 En utilisant les spcifications dfinies dans le cadres des exercices et E-14 au chapitres Les
Fonctions, donner une implmentation C du monnayeur.
E-100 Donner une implmentation C de la fonction de recherche de point fixe dfinie au paragra-
phe 2.7.2, page 32 du chapitre Les Fonctions.
Spcifier puis Implmenter. Exercices.
- 237 -
C
o
p
y
r
i
g
h
t


J
e
a
n

D
E
M
A
R
T
I
N
I

-

1
9
9
4

-

1
9
9
5

-

1
9
9
6

-

1
9
9
7
E-101 Donner une implmentation C de la fonction de recherche dichotomique de la solution de
lquation dfinie dans le cadre de lexercice E-17. f x ( ) 0 =

You might also like