Ordres bien fondés et induction structurelle
Cours complet · informatique (MP2I/MPI), chapitre 9 · MP2I et MPI
Travailler ce chapitre sur Adloun Exercices corrigés de ce chapitre
9.1 Généraliser la récurrence
Au chapitre chap:recursivite, chaque preuve reposait sur une récurrence portant sur un entier : le variant décroissait, et une suite d'entiers positifs strictement décroissante est finie. Mais les objets de la suite de ce livre ne sont pas des entiers. Un arbre n'a pas de « rang », une formule logique non plus, un mot pas davantage — et pourtant on veut prouver des choses à leur sujet, exactement de la même manière.
Le programme place cette généralisation très haut : « le principe d'induction est une notion fondamentale et transverse à l'ensemble de ce programme. Il permet d'écrire des démonstrations avec facilité dès que l'on s'intéresse à toute sorte de structures (arbres, formules de logiques, classes de langage, etc.). »
Il fixe aussi la mesure : « l'objectif n'est pas d'étudier la théorie abstraite des ensembles ordonnés mais de poser les définitions et la terminologie ». On pose donc le vocabulaire, et l'on s'en sert.
9.2 Ensembles ordonnés
Une relation sur un ensemble est une relation d'ordre si elle est réflexive, antisymétrique et transitive. L'ordre est total si deux éléments quelconques sont toujours comparables, partiel sinon. On note pour « et ».
Soit .
- est un prédécesseur de si ; est alors un successeur de .
- est un prédécesseur immédiat de si et qu'aucun ne vérifie : rien ne s'intercale.
est minimal s'il n'admet aucun prédécesseur : aucun ne vérifie .
Un élément minimum est plus petit que tous les autres ; un élément minimal n'est plus grand qu'aucun autre. Dans un ordre total les deux coïncident ; dans un ordre partiel, non — et il peut y avoir plusieurs minimaux.
Sur les parties de ordonnées par inclusion, privées de : et sont tous deux minimaux, et aucun n'est le minimum.
9.2.1 Fabriquer des ordres
Sur munis de et :
Il faut que les deux composantes soient plus petites. C'est un ordre partiel même si et sont totaux : et ne sont pas comparables.
Sur ce même produit :
C'est l'ordre du dictionnaire : on départage sur la première composante, et l'on ne regarde la seconde qu'en cas d'égalité. Il est total dès que et le sont — c'est là toute sa différence avec l'ordre produit.
9.3 Ordre bien fondé
Un ordre sur est bien fondé s'il n'existe aucune suite infinie strictement décroissante
De façon équivalente : toute partie non vide de admet au moins un élément minimal.
Le variant du chapitre chap:algo-prog était un entier positif qui décroît strictement. La raison pour laquelle cela prouvait la terminaison n'était pas que le variant fût un entier : c'était que est bien fondé.
Dès lors, n'importe quel ordre bien fondé fait l'affaire. Une fonction récursive dont les appels décroissent strictement pour un ordre bien fondé termine — même si aucun entier ne décroît.
(* Précondition : m >= 0 et n >= 0. *)
let rec ackermann m n =
if m = 0 then n + 1
else if n = 0 then ackermann (m - 1) 1
else ackermann (m - 1) (ackermann m (n - 1))
Aucun des deux arguments ne décroît à chaque appel : dans le dernier cas, reste égal à dans l'appel interne. Mais le couple décroît strictement pour l'ordre lexicographique :
- car ;
- car et ;
- pour l'appel externe.
Et l'ordre lexicographique sur est bien fondé. La fonction termine donc — pour tout , bien qu'elle croisse plus vite que toute fonction exprimable par une composition finie d'exponentielles.
Le programme demande de « faire le lien avec la notion d'accessibilité dans un graphe orienté acyclique ». Un ordre bien fondé sur un ensemble fini se lit comme un graphe orienté acyclique : les sommets sont les éléments, un arc va de vers quand est un prédécesseur immédiat de . « Bien fondé » y devient « sans cycle », et les éléments minimaux sont les sommets sans arc sortant. Le tri topologique du chapitre chap:parcours exploitera exactement cette correspondance.
9.4 Ensembles inductifs
9.4.1 Engendrer par des règles
On se donne :
- des assertions — des éléments de base, admis sans condition ;
- des règles d'inférence : « si appartiennent à l'ensemble, alors y appartient aussi ».
L'ensemble inductif engendré est le plus petit ensemble contenant les assertions et clos par les règles.
Sans lui, la définition ne dit rien : tout entier contient et est clos par , mais aussi. « Le plus petit » signifie : rien d'autre que ce que les règles obligent à mettre. C'est ce qui autorise le raisonnement par induction — car tout élément a alors été construit en un nombre fini d'applications de règles, et le raisonnement peut suivre cette construction.
Une barre de fraction se lit « si le dessus, alors le dessous » ; une barre sans rien au-dessus est une assertion. Ces trois systèmes se traduisent mot pour mot en types OCaml, et c'est ce qui rend le langage si adapté :
type nat = Zero | S of nat
type 'a arbre = Vide | Noeud of 'a arbre * 'a * 'a arbre
type formule = Var of string | Et of formule * formule
Le programme y insiste : « on insiste sur les aspects pratiques : construction de structure de données et filtrage par motif ».
9.4.2 L'ordre induit
Sur un ensemble inductif, on pose : lorsque est l'un des constituants de , c'est-à-dire l'un des arguments d'une règle ayant produit — et l'on prend la clôture transitive.
Cet ordre est bien fondé : tout élément se construit en un nombre fini d'étapes, donc toute chaîne décroissante finit sur une assertion.
Pour , on a et : un sous-arbre est strictement plus petit que l'arbre. Les éléments minimaux sont les Vide. C'est ce qui fait terminer toutes les fonctions récursives sur les arbres du chapitre chap:arbres — sans qu'aucun entier n'ait à décroître.
9.5 La preuve par induction structurelle
Soit un ensemble inductif engendré par des assertions et des règles, et une propriété sur . Si :
- est vraie pour chaque assertion ;
- pour chaque règle, si est vraie de tous les arguments, alors elle l'est du résultat ;
alors est vraie sur tout entier.
Démonstration
Supposons fausse quelque part, et soit l'ensemble non vide des contre-exemples. L'ordre induit étant bien fondé, possède un élément minimal . Ce n'est pas une assertion, par 1. Il provient donc d'une règle appliquée à des arguments , tous strictement plus petits que , donc tous hors de par minimalité : est vraie de chacun. Par 2, est vraie de — qui n'est donc pas un contre-exemple. Contradiction.
Le programme le formule ainsi : « on présente la preuve par induction structurelle comme une généralisation de la preuve par récurrence ». Sur , les deux coïncident : l'assertion est , la règle est le successeur, et l'on retrouve mot pour mot l'initialisation et l'hérédité.
Le gain est qu'il n'y a plus rien à inventer. Un cas de preuve par constructeur du type : le squelette de la démonstration est exactement le squelette du match.
Pour un arbre binaire , notons son nombre de nœuds et son nombre de feuilles — les nœuds dont les deux fils sont vides. Notons le nombre de nœuds ayant deux fils non vides. Montrons
let rec feuilles = function
| Vide -> 0
| Noeud (Vide, _, Vide) -> 1
| Noeud (g, _, d) -> feuilles g + feuilles d
Démonstration
Par induction structurelle sur , non vide.
Cas . Alors et : l'identité tient.
Cas avec exactement un fils non vide, disons . Alors et , car la racine n'est ni une feuille ni un nœud double. Par hypothèse d'induction sur — strictement plus petit — , d'où le résultat.
Cas avec deux fils non vides. Alors et , la racine comptant cette fois. Par hypothèse d'induction sur et sur :
Remarquez la correspondance : trois cas de preuve, trois motifs de filtrage. Le compilateur qui vérifie l'exhaustivité de votre match vérifie, littéralement, que votre preuve n'oublie aucun cas.
Méthode : Écrire une preuve par induction structurelle
- Énumérer les constructeurs du type. Ils donnent les cas, tous les cas.
- Pour chaque assertion (constructeur sans argument récursif) : prouver directement.
- Pour chaque règle : supposer vraie de chaque argument récursif, en déduire pour le résultat.
- Ne jamais supposer sur autre chose que les arguments — c'est la seule hypothèse que l'ordre induit autorise.
9.6 Ce qu'il faut retenir
| Objet | Ce qui décroît | Ce que l'on prouve |
|---|---|---|
| Boucle | un variant entier | terminaison |
| Fonction récursive | un ordre bien fondé sur l'argument | terminaison |
| Type inductif | l'ordre induit (les constituants) | une propriété, par induction |
Les trois lignes disent la même chose : il n'existe pas de suite infinie strictement décroissante. C'est cette unique propriété qui fait qu'un programme s'arrête et qu'une preuve se termine.
À partir d'ici, tous les objets du livre sont inductifs — arbres, formules propositionnelles, expressions régulières, arbres de preuve, mots engendrés par une grammaire. Le raisonnement de ce chapitre servira à chacun, sans être réappris.