Adloun

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

Définition 9.1Relation d'ordre

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 ».

Définition 9.2Prédécesseur, successeur, et leurs versions immédiates

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.
Définition 9.3Élément minimal

est minimal s'il n'admet aucun prédécesseur : aucun ne vérifie .

AttentionMinimal n'est pas minimum

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

Définition 9.4Ordre produit

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.

Définition 9.5Ordre lexicographique

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é

Définition 9.6Ordre 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.

ImportantC'est exactement ce qui fait terminer un programme

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.

Exemple 9.7Une terminaison que seul ne prouve pas : la fonction d'Ackermann

(* 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.

iRemarqueLe lien avec les graphes

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

Définition 9.8Système de règles, ensemble inductif

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.

Important« Le plus petit » est le mot décisif

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.

Exemple 9.9Trois ensembles inductifs, écrits comme des règles

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

Définition 9.10Ordre 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.

Exemple 9.11Sur les arbres

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

◆Théorème 9.12Principe d'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.

ImportantUne généralisation de la récurrence, et rien d'autre

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.

Exemple 9.13Une identité sur les arbres, prouvée par induction

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

ImportantUn seul principe, trois usages
ObjetCe qui décroîtCe que l'on prouve
Boucleun variant entierterminaison
Fonction récursiveun ordre bien fondé sur l'argumentterminaison
Type inductifl'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.

Continuer sur Adloun : animation, QCM, fiches, exercices