|   | 
|  Avant-propos  | 
13 | 
|   | 
|   | 
|  Chapitre 1.  Introduction  | 
17 | 
|   | 
|          1.1. Pourquoi étudier l'informatique (et en particulier la programmation) ? | 17 | 
|          1.2. Qu'est-ce-que la programmation ? | 18 | 
|          1.3. Les étapes du développement d'un programme | 18 | 
|                  1.3.1. Première étape : la spécification. | 18 | 
|                  1.3.2. Deuxième étape : la recherche d'un algorithme pour résoudre le problème | 19 | 
|                  1.3.3. Troisième étape : la transcription de l'algorithme dans un langage de programmation ou « écriture du programme » | 19 | 
|                  1.3.4. Quatrième étape : la validation du programme | 20 | 
|                  1.3.5. Récapitulatif | 20 | 
|                  1.3.6. Exemple | 21 | 
|          1.4. Les langages de programmation | 21 | 
|          1.5. Pourquoi OCaml ? | 23 | 
|          1.6. Comment se procurer OCaml ? | 23 | 
|          1.7. Plan de l'ouvrage | 23 | 
|          1.8. Logiciels utilisés dans cet ouvrage | 24 | 
|   | 
| PREMIÈRE PARTIE. ÉLÉMENTS DE PROGRAMMATION    | 
25 | 
|   | 
|  Chapitre 2.  Introduction à OCaml  | 
27 | 
|   | 
|          2.1. Notions d'expression et de valeur | 27 | 
|          2.2. Les types de base | 28 | 
|                  2.2.1. Le type int | 28 | 
|                  2.2.2. Le type float | 28 | 
|                  2.2.3. Le type bool | 29 | 
|                  2.2.4. Le type char | 29 | 
|                  2.2.5. Le type string | 30 | 
|          2.3. La boucle interactive de OCaml ou comment utiliser OCaml? | 30 | 
|          2.4. Définitions | 33 | 
|                  2.4.1. Notion d'identificateur | 33 | 
|                  2.4.2. Définitions globales | 33 | 
|                  2.4.3. Définitions locales | 37 | 
|          2.5. Expressions conditionnelles | 41 | 
|          2.6. De l'usage des parenthèses | 42 | 
|   | 
|  Chapitre 3.  Fonctions  | 
43 | 
|   | 
|          3.1. Fonctions d'une variable | 43 | 
|                  3.1.1. Introduction | 43 | 
|                  3.1.2. Définition de fonctions | 44 | 
|                  3.1.3. Exemples | 45 | 
|                  3.1.4. Application d'une fonction | 46 | 
|          3.2. Fonctions à plusieurs paramètres | 47 | 
|                  3.2.1. Définition d'une fonction à plusieurs paramètres | 47 | 
|                  3.2.2. Application d'une fonction à plusieurs paramètres | 48 | 
|          3.3. Composition de fonctions | 49 | 
|          3.4. Définition locale de fonction | 50 | 
|          3.5. Portée statique | 51 | 
|          3.6. Introduction au typage d'une fonction | 52 | 
|          3.7. Restriction du domaine de définition d'une fonction | 54 | 
|          3.8. Un exemple complet : écrire les nombres en lettres | 55 | 
|                  3.8.1. Les fonctions unité, dizaine, centaine et millier | 58 | 
|                  3.8.2. La fonction écrire_millier | 59 | 
|                  3.8.3. La fonction écrire_centaine | 60 | 
|                  3.8.4. La fonction écrire_dizaine_unité | 60 | 
|   | 
|  Chapitre 4.  Fonctions récursives  | 
65 | 
|   | 
|          4.1. Notion de récursivité | 66 | 
|          4.2. Définition d'une fonction récursive en OCaml | 67 | 
|                  4.2.1. Fonctions simplement récursives | 67 | 
|                  4.2.2. Fonctions mutuellement récursives | 69 | 
|          4.3. Évaluation d'un appel à une fonction récursive | 70 | 
|          4.4. Propriétés des fonctions récursives | 73 | 
|          4.5. Méthode de décomposition récursive | 75 | 
|                  4.5.1. Méthode générale | 75 | 
|                  4.5.2. Un exemple simple : le calcul du reste de la division euclidienne de deux nombres naturels | 76 | 
|                  4.5.3. Un exemple magique : les tours de Hanoi | 76 | 
|   | 
|  Chapitre 5.  Listes  | 
79 | 
|   | 
|          5.1. Syntaxe - Typage - Évaluation | 79 | 
|                  5.1.1. Définition | 79 | 
|                  5.1.2. Syntaxe et évaluation | 80 | 
|                  5.1.3. Typage | 80 | 
|                  5.1.4. L'opérateur :: | 81 | 
|          5.2. Fonctions simples sur les listes | 82 | 
|          5.3. Filtrage | 87 | 
|                  5.3.1. Vocabulaire et définitions | 87 | 
|                  5.3.2. Récapitulatif des formes possibles de filtre | 89 | 
|                  5.3.3. Mise en correspondance d'un filtre avec une valeur | 90 | 
|                  5.3.4. Évaluation d'une expression de filtrage | 90 | 
|          5.4. Fonctions récursives sur les listes | 91 | 
|                  5.4.1. Longueur d'une liste | 91 | 
|                  5.4.2. Recherche d'un élément dans une liste | 92 | 
|                  5.4.3. Dernier élément d'une liste | 93 | 
|                  5.4.4. Recherche du plus petit élément d'une liste | 94 | 
|                  5.4.5. Intervalle d'entiers | 94 | 
|                  5.4.6. Extraction des entiers pairs d'une liste d'entiers | 95 | 
|                  5.4.7. Remplacement de certains éléments | 95 | 
|                  5.4.8. Concaténation de deux listes | 96 | 
|          5.5. Manipulation de listes triées | 96 | 
|                  5.5.1. Recherche d'un élément dans une liste triée | 97 | 
|                  5.5.2. Insertion dans une liste triée | 97 | 
|          5.6. Algorithmes de tri | 99 | 
|                  5.6.1. Tri par insertion | 99 | 
|                  5.6.2. Tri par sélection | 100 | 
|                  5.6.3. Tri par fusion | 100 | 
|                  5.6.4. Comparaison de ces différentes méthodes de tri | 103 | 
|   | 
|  Chapitre 6.  Types produits (paires et n-uplets)  | 
107 | 
|   | 
|          6.1. Produit de deux types | 107 | 
|          6.2. Construction des paires (syntaxe, typage, évaluation) | 108 | 
|          6.3. Quelques exemples simples de fonctions manipulant des paires | 108 | 
|          6.4. Fonction récursive retournant une paire | 111 | 
|          6.5. Filtrage des couples | 112 | 
|          6.6. Listes et paires | 112 | 
|                  6.6.1. Listes de vecteurs | 113 | 
|                  6.6.2. Listes d'associations | 113 | 
|          6.7. Généralisation des couples : les n-uplets | 115 | 
|          6.8. Fonctions à plusieurs arguments versus fonctions à un argument n-uplet | 116 | 
|          6.9. Un exemple plus conséquent : la date du lendemain | 117 | 
|   | 
|  Chapitre 7.  Types enregistrements  | 
121 | 
|   | 
|          7.1. Déclaration d'un type enregistrement | 122 | 
|          7.2. Création et manipulation d'enregistrements | 124 | 
|          7.3. Accès aux composantes d'un enregistrement | 124 | 
|          7.4. Filtrage des enregistrements | 126 | 
|          7.5. Un petit exemple : les notes d'un étudiant | 127 | 
|          7.6. Un exemple plus conséquent: les nombres rationnels | 129 | 
|                  7.6.1. Représentation non normalisée (sans simplification systématique) | 129 | 
|                  7.6.2. Simplifier les rationnels | 130 | 
|                  7.6.3. Représentation normalisée | 131 | 
|                  7.6.4. Simplifier en calculant | 132 | 
|   | 
|  Chapitre 8.  Types sommes  | 
135 | 
|   | 
|          8.1. Exemple de la définition du type des formes géométriques | 135 | 
|          8.2. Déclaration d'un type somme | 137 | 
|          8.3. Construction des expressions d'un type somme (syntaxe, typage, évaluation) | 138 | 
|          8.4. Filtrage sur les types sommes | 139 | 
|                  8.4.1. Manipulations de formes | 139 | 
|                  8.4.2. Bilan sur les filtres | 141 | 
|          8.5. Modélisation d'un jeu de tarot | 142 | 
|                  8.5.1. Définition des cartes ordinaires | 142 | 
|                  8.5.2. Définition privilégiant la nature des cartes | 143 | 
|                  8.5.3. Définition préservant la symétrie nature/couleur | 144 | 
|                  8.5.4. Définition du type des cartes | 144 | 
|   | 
|  Chapitre 9.  Types récursifs  | 
147 | 
|   | 
|          9.1. Polynômes à une indéterminée | 147 | 
|          9.2. Cocktails | 152 | 
|          9.3. Expressions arithmétiques | 156 | 
|          9.4. Arbres | 159 | 
|          9.5. Arbres binaires de recherche | 164 | 
|                  9.5.1. Présentation | 164 | 
|                  9.5.2. Recherche dans un arbre binaire de recherche | 165 | 
|                  9.5.3. Parcours d'un arbre binaire de recherche | 167 | 
|                  9.5.4. Insertion dans un arbre binaire de recherche | 168 | 
|                  9.5.5. Construction d'un arbre binaire de recherche | 168 | 
|          9.6. Types mutuellement récursifs | 169 | 
|   | 
|  Chapitre 10.  Introduction à l'ordre supérieur  | 
171 | 
|   | 
|          10.1. Fonctions numériques | 172 | 
|                  10.1.1. Calcul de la pente d'une fonction en 0 | 172 | 
|                  10.1.2. Dérivée d'une fonction | 172 | 
|                  10.1.3. Calcul d'un zéro d'une fonction par une méthode dichotomique | 174 | 
|                  10.1.4. Composition de fonctions | 176 | 
|          10.2. Itération d'une fonction | 177 | 
|                  10.2.1. Calcul du n-ième terme d'une suite définie récursivement | 177 | 
|                  10.2.2. Sommation | 178 | 
|                  10.2.3. Application d'une fonction à tous les éléments d'une liste | 179 | 
|                  10.2.4. Itérer une fonction sur une liste | 180 | 
|          10.3. Fonctions paramétrées par un prédicat | 184 | 
|                  10.3.1. Extraction d'éléments dans une liste | 184 | 
|                  10.3.2. Insertion dans une liste triée, tri d'une liste | 185 | 
|   | 
|  Chapitre 11.  Données mutables  | 
189 | 
|   | 
|          11.1. Introduction à la programmation impérative | 189 | 
|                  11.1.1. Regard en arrière sur la programmation fonctionnelle | 189 | 
|                  11.1.2. Valeurs modifiables ou mutables | 190 | 
|          11.2. Les références | 191 | 
|          11.3. Les champs mutables dans les enregistrements | 194 | 
|                  11.3.1. Déclaration, création, consultation et modification | 194 | 
|                  11.3.2. Retour sur les références | 198 | 
|                  11.3.3. Synonymie, partage | 199 | 
|          11.4. Tableaux | 200 | 
|                  11.4.1. Vecteurs | 201 | 
|                  11.4.2. Analogie chaîne de caractères, vecteur | 203 | 
|                  11.4.3. Matrices | 205 | 
|          11.5. Impression à l'écran | 207 | 
|          11.6. Séquences | 209 | 
|          11.7. Boucles | 211 | 
|                  11.7.1. Boucle while | 211 | 
|                  11.7.2. Boucle for | 211 | 
|                  11.7.3. La factorielle : version « impérative » | 213 | 
|                  11.7.4. Boucles et tableaux : quelques exemples | 214 | 
|          11.8. Résolution de systèmes linéaires par l'algorithme du pivot de Gauß  | 219 | 
|          11.9. Recherche et tri dans un vecteur | 223 | 
|                  11.9.1. Recherche dans un vecteur | 224 | 
|                  11.9.2. Tris | 226 | 
|          11.10. Fichiers et opérations de base | 232 | 
|   | 
|  Chapitre 12.  Exceptions  | 
239 | 
|   | 
|          12.1. Fonctions partielles et exceptions | 239 | 
|          12.2. Déclaration d'une exception | 240 | 
|          12.3. Levée d'une exception | 242 | 
|          12.4. Traitement d'une exception | 244 | 
|          12.5. Exception et ordre d'évaluation | 247 | 
|          12.6. Utilisation avancée des exceptions | 248 | 
|                  12.6.1. Recherche d'un élément dans un tableau | 249 | 
|                  12.6.2. Acquisition sûre de données | 250 | 
|                  12.6.3. Un algorithme à essais successifs | 251 | 
|   | 
|  Chapitre 13.  Introduction à la modularité  | 
253 | 
|   | 
|          13.1. Développement de gros logiciels | 253 | 
|          13.2. Modules | 255 | 
|                  13.2.1. Définition d'un module | 255 | 
|                  13.2.2. Impacts sur le développement de logiciels | 255 | 
|          13.3. Syntaxe des modules | 257 | 
|                  13.3.1. Forme des déclarations dans l'interface | 257 | 
|                  13.3.2. Un premier exemple de module | 258 | 
|                  13.3.3. Modules de la bibliothèque standard | 258 | 
|          13.4. Utilisation des ressources d'un module | 260 | 
|                  13.4.1. Notation pointée | 260 | 
|                  13.4.2. La directive open | 261 | 
|          13.5. Compilation séparée | 261 | 
|          13.6. Utilisation interactive des modules | 264 | 
|          13.7. Types abstraits | 264 | 
|   | 
|  Chapitre 14.  Choix des structures de données  | 
269 | 
|   | 
|          14.1. Structures de données linéaires | 269 | 
|                  14.1.1. Comparaison vecteur-liste | 269 | 
|                  14.1.2. Représentation des piles | 271 | 
|                  14.1.3. Représentation des files | 273 | 
|                  14.1.4. Listes chaînées | 277 | 
|                  14.1.5. Retour sur la représentation des files | 283 | 
|                  14.1.6. Conclusion sur les structures de données linéaires | 284 | 
|          14.2. Structures de données arborescentes | 284 | 
|                  14.2.1. Arbres | 284 | 
|                  14.2.2. Files de priorité | 289 | 
|                  14.2.3. Tas | 290 | 
|          14.3. Autres structures de données | 296 | 
|   | 
| DEUXIÈME PARTIE. QUELQUES DÉVELOPPEMENTS COMPLETS    | 
297 | 
|   | 
|  Chapitre 15.  Alignement de séquences ADN  | 
299 | 
|   | 
|          15.1. Le problème posé | 299 | 
|          15.2. Quelques éléments de vocabulaire sur les séquences | 300 | 
|          15.3. Représentation des séquences d'ADN | 301 | 
|          15.4. Opérations d'édition | 301 | 
|          15.5. Alignement | 302 | 
|                  15.5.1. Affichage d'un alignement | 302 | 
|                  15.5.2. Application d'un alignement à une séquence | 304 | 
|                  15.5.3. Coût d'un alignement | 304 | 
|          15.6. Alignement optimal et distance d'édition | 305 | 
|                  15.6.1. Calcul de la distance d'édition | 306 | 
|                  15.6.2. Calcul d'un alignement de coût optimal | 309 | 
|          15.7. Un algorithme efficace d'alignement de deux séquences | 311 | 
|                  15.7.1. Calcul de la matrice D | 312 | 
|                  15.7.2. Recherche d'un alignement optimal | 315 | 
|          15.8. Conclusion | 317 | 
|   | 
|  Chapitre 16.  Vérification de formules logiques  | 
319 | 
|   | 
|          16.1. Le rôle de la logique en informatique | 319 | 
|          16.2. Le calcul propositionnel | 319 | 
|                  16.2.1. Syntaxe du calcul propositionnel | 320 | 
|                  16.2.2. Représentation des formules en OCaml | 321 | 
|                  16.2.3. Tables de vérité | 322 | 
|                  16.2.4. Interprétation d'une formule | 323 | 
|                  16.2.5. Tautologie/contradiction | 324 | 
|          16.3. Analyse syntaxique de formules | 328 | 
|                  16.3.1. Syntaxe concrète des formules | 329 | 
|                  16.3.2. Conception descendante de l'analyseur syntaxique | 330 | 
|          16.4. Preuve de formules propositionnelles en déduction naturelle | 340 | 
|                  16.4.1. Preuve formelle et règles de déduction | 341 | 
|                  16.4.2. Tactique de preuve et vérification | 343 | 
|                  16.4.3. Un exemple | 346 | 
|          16.5. Réalisation en OCaml de l'assistant à la preuve | 348 | 
|                  16.5.1. Type des tactiques | 348 | 
|                  16.5.2. Représentation d'un but | 349 | 
|                  16.5.3. Affichage d'un but | 349 | 
|                  16.5.4. Application d'une tactique à un but | 353 | 
|                  16.5.5. Analyse syntaxique d'une tactique | 357 | 
|                  16.5.6. Vérification interactive | 360 | 
|          16.6. Conclusion | 363 | 
|   | 
|  Chapitre 17.  Un exemple graphique : le jeu COURT-CIRCUIT  | 
365 | 
|   | 
|          17.1. Description du jeu | 365 | 
|          17.2. Représentation du jeu | 366 | 
|          17.3. Remplissage de la zone de jeu | 369 | 
|                  17.3.1. Générateur aléatoire | 369 | 
|                  17.3.2. Principe de remplissage de la zone de jeu | 369 | 
|                  17.3.3. Création du tableau: appariement des couleurs | 369 | 
|                  17.3.4. Permutation du tableau: mélange des couleurs | 370 | 
|                  17.3.5. Affichage textuel de la zone de jeu | 371 | 
|          17.4. Détection d'un circuit valide et suppression d'un couple de pièces | 372 | 
|                  17.4.1. Détection de circuits valides | 372 | 
|                  17.4.2. Angles d'un circuit | 378 | 
|          17.5. Affichage graphique statique de la zone de jeu et des circuits | 380 | 
|                  17.5.1. Présentation de la bibliothèque graphique | 380 | 
|                  17.5.2. Dessin des pièces | 383 | 
|                  17.5.3. Affichage graphique de la zone de jeu | 388 | 
|                  17.5.4. Affichage graphique des circuits | 389 | 
|                  17.5.5. Effaçage d'une pièce sélectionnée et d'un circuit | 390 | 
|          17.6. Affichage graphique avec gestion de l'action du joueur | 391 | 
|                  17.6.1. Premiers pas en gestion évènementielle | 391 | 
|                  17.6.2. Interaction avec le joueur | 393 | 
|                  17.6.3. La version de base du jeu | 395 | 
|                  17.6.4. Version de base modulaire | 397 | 
|          17.7. Enrichissement du jeu avec des niveaux | 401 | 
|                  17.7.1. Représentation du jeu | 402 | 
|                  17.7.2. Circuits | 405 | 
|                  17.7.3. Interaction avec le joueur | 405 | 
|                  17.7.4. Affichage du jeu | 405 | 
|                  17.7.5. Lancement du jeu | 408 | 
|          17.8. Aide au joueur | 409 | 
|                  17.8.1. Suggestion | 409 | 
|                  17.8.2. Backtrack | 411 | 
|                  17.8.3. Arrêt entre les niveaux | 412 | 
|          17.9. Jeu contre la montre et pause | 414 | 
|                  17.9.1. Une première version à temps compté | 415 | 
|                  17.9.2. Version avec indication de la progression du jeu | 416 | 
|                  17.9.3. Version avec pause | 419 | 
|          17.10. Scores, table des meilleurs scores | 421 | 
|                  17.10.1. Scores | 422 | 
|                  17.10.2. Table des meilleurs scores | 424 | 
|                  17.10.3. Fin du jeu | 431 | 
|          17.11. Améliorations | 433 | 
|          17.12. Conclusion | 438 | 
|   | 
|  Bibliographie  | 
439 | 
|   | 
|   | 
|  Index  | 
441 | 
|   |