Minimisation d'automate, propriétés de clôture, lemme de pompage et preuves de non-régularité — le cas a^n b^n, le second point qui coince.
Le bloc II touche à sa fin avec la question la plus profonde du cours. Jusqu'ici, chaque langage rencontré était régulier — on lui trouvait un automate. Mais est-ce toujours le cas ? Tous les langages sont-ils réguliers ?
La réponse est non, et savoir le prouver est le second point qui coince de l'année. Ce chapitre y mène en trois temps : d'abord un outil pour obtenir l'automate le plus économe (la minimisation), ensuite l'inventaire de ce que la classe régulière sait faire (les propriétés de clôture), enfin l'outil qui trace sa frontière (le lemme de pompage), avec l'exemple que le chapitre 1 avait mystérieusement mis de côté : .
La minimisation
Pour un langage régulier donné, il existe une infinité d'automates qui le reconnaissent — on peut toujours ajouter des états inutiles. Mais il en existe un seul de taille minimale, à renommage près : l'automate minimal. La minimisation est la procédure qui le trouve.
L'idée repose sur la relation d'équivalence du chapitre 2. Deux états sont indistinguables si, depuis l'un ou l'autre, exactement les mêmes mots mènent à l'acceptation — les fusionner ne change rien au langage reconnu. La minimisation regroupe les états indistinguables en classes d'équivalence, chaque classe devenant un état unique du minimal.
Deux usages justifient ce travail :
- Comparer deux langages. Deux automates reconnaissent le même langage si et seulement si leurs minimaux sont identiques (à renommage près). C'est le test d'équivalence, sinon délicat.
- Optimiser. Un analyseur lexical avec le moins d'états possible est plus rapide et plus léger — ce qui compte au chapitre 9.
Retenez surtout le résultat d'existence : à chaque langage régulier correspond un automate minimal unique, qui en est en quelque sorte l'empreinte.
Les propriétés de clôture
Une classe de langages est close par une opération si, en l'appliquant à des langages de la classe, on reste dans la classe. Les langages réguliers sont remarquablement stables :
| Opération | Les réguliers sont-ils clos ? | Comment on le voit |
|---|---|---|
| Union | oui | un AFN qui lance les deux automates en parallèle |
| Concaténation | oui | brancher le premier sur le second (ε-transition) |
| Étoile | oui | boucler l'automate sur lui-même |
| Complément | oui | échanger acceptants/non-acceptants (automate complet) |
| Intersection | oui | automate produit, ou via De Morgan |
Ces clôtures ne sont pas de simples curiosités : ce sont des outils de preuve. Elles permettent de construire de nouveaux langages réguliers sans repartir de zéro — et, retournées, de prouver la non-régularité. Si n'était pas régulier alors que l'est, on en déduirait que ne l'est pas ; c'est une technique de repli quand le lemme de pompage est malcommode à appliquer directement.
Le complément mérite un rappel : sa clôture exige un automate complet (chapitre 3). C'est là que le soin apporté à l'état puits porte ses fruits.
On sait que L₁ ∩ L₂ n'est pas régulier, et que L₂ est régulier. Que peut-on conclure sur L₁ ?
Le lemme de pompage
Voici l'outil central du chapitre, et l'un des plus subtils de l'année. Il repose sur une intuition simple qu'il faut avoir en tête avant la formule :
Un automate fini a un nombre fini d'états, donc une mémoire bornée. S'il lit un mot plus long que son nombre d'états, il repasse forcément par un même état — et la portion de mot lue entre ces deux passages forme une boucle que l'on peut répéter à volonté.
C'est le principe des tiroirs : plus de lettres que d'états, donc un état revisité.
L'animation rend cette boucle visible. L'automate ci-dessous compte les a modulo 3 ; sur le mot
aaa, son chemin r0 → r1 → r2 → r0 revient à son point de départ. Ce cycle est exactement le
facteur que le lemme « pompe » : puisqu'il ramène au même état, on peut le répéter (aaaaaa) ou
le retirer (ε) sans jamais quitter le langage. Retenez l'image — c'est tout le mécanisme du lemme.
L'automate démarre dans l'état r0. Mot à lire : « aaa ».
Formellement :
Lemme de pompage. Si est régulier, alors il existe une longueur (la « longueur de pompage ») telle que tout mot avec peut s'écrire avec :
- ,
- (le facteur n'est pas vide),
- et pour tout , le mot appartient encore à .
Autrement dit, la boucle peut être répétée (), supprimée (), ou laissée telle quelle (), sans jamais sortir du langage. « Pomper » , c'est jouer sur ce .
L'utiliser : un jeu, et un sens de lecture
Le lemme sert dans un seul sens : prouver qu'un langage n'est pas régulier. C'est un raisonnement par l'absurde, et le meilleur moyen de ne pas s'y perdre est de le voir comme un jeu à quatre coups, dont vous devez sortir gagnant :
- L'adversaire suppose régulier et fournit la longueur (vous ne la connaissez pas).
- Vous choisissez un mot malin, avec . C'est le coup décisif.
- L'adversaire découpe comme il veut, en respectant et .
- Vous exhibez un tel que — contradiction.
Si vous gagnez quel que soit le découpage, n'est pas régulier. L'ordre des quantificateurs est tout : « pour tout , il existe , pour tout découpage, il existe ». Vous contrôlez et ; l'adversaire contrôle et le découpage.
Le cas
Appliquons le jeu à — le langage « autant de que de , les avant les » que le chapitre 1 avait déjà isolé.
Le choix du mot est tout : on joue . Pourquoi celui-là ? Parce que la contrainte oblige le bloc à tomber entièrement dans la zone des — le mot commence par lettres . Le facteur ne contient donc que des , et il en contient au moins un.
Il suffit alors de pomper : prendre donne avec — plus de que de , donc hors de . Contradiction. Comme ce raisonnement vaut pour n'importe quel découpage, n'est pas régulier.
La leçon générale dépasse cet exemple : un automate fini ne sait pas compter jusqu'à un nombre arbitraire. Reconnaître exigerait de retenir , qui n'est pas borné, alors que l'automate n'a qu'un nombre fini d'états. Le lemme de pompage est la traduction rigoureuse de cette limite — et c'est justement pour compter qu'on introduira, au chapitre 8, une mémoire supplémentaire : la pile.
Pour prouver que L = {aⁿbⁿ} n'est pas régulier avec le lemme de pompage, pourquoi choisit-on le mot w = aᵖbᵖ plutôt que, par exemple, w = (ab)ᵖ ?
À vous
L'exercice transforme le lemme en jeu jouable. L'adversaire annonce et essaie tous les découpages possibles ; vous devez fournir le mot et le facteur pompé qui casse, et gagner contre chaque découpage.
C'est en jouant qu'on comprend pourquoi le choix du mot est décisif : c'est lui qui coince le facteur dans les . Une fois cette mécanique vue tourner, le lemme de pompage cesse d'être un enchaînement de quantificateurs opaque et devient une stratégie que vous savez dérouler.
Prouvez que a^n b^n n'est pas régulier, en jouant contre un adversaire : il annonce une longueur p et découpe votre mot, vous choisissez le mot puis le facteur pompé qui sort du langage. Le secret est le choix du mot a^p b^p — il coince le facteur y dans les a.
// On veut PROUVER que L = { a^n b^n | n >= 0 } n'est pas régulier. // L = { ε, ab, aabb, aaabbb, ... } (autant de a que de b, a avant b) // // Le lemme de pompage, vu comme un JEU en 4 coups : // 1. L'adversaire (qui affirme « L est régulier ») annonce une longueur p. // 2. VOUS choisissez un mot w de L, avec |w| >= p. // 3. L'adversaire découpe w = x y z avec |xy| <= p et |y| >= 1 (y non vide). // 4. VOUS choisissez un entier i tel que x y^i z ne soit PAS dans L. // Si vous gagnez QUEL QUE SOIT le découpage, L n'est pas régulier. // Appartenance à L : autant de a que de b, tous les a avant tous les b. function estDansL(mot) { const m = mot.match(/^(a*)(b*)$/); // a...a puis b...b if (!m) return false; // un b avant un a -> non return m[1].length === m[2].length; // même nombre } // ── À VOUS (2) : choisir le bon mot ───────────────────────────────────────── // Pour une longueur p donnée, quel mot de L rend l'adversaire perdant ? // Indice : il faut que |xy| <= p FORCE y à ne contenir que des a. function choisirMot(p) { return ""; // à compléter, en fonction de p } // ── À VOUS (4) : choisir i qui casse ──────────────────────────────────────── // Étant donné un découpage x, y, z (avec y = que des a, forcé par l'étape 2), // rendez un i tel que x + y.repeat(i) + z ne soit PAS dans L. function choisirI(x, y, z) { return 1; // à corriger (i = 1 redonne w, qui EST dans L : mauvais choix) } // ── Le jeu : l'adversaire essaie TOUS les découpages valides ──────────────── function jouer(p) { const w = choisirMot(p); if (w.length < p || !estDansL(w)) { console.log("Mot invalide."); return; } console.log("p = " + p + ", vous jouez w = " + w + " (dans L, |w| >= p)"); let vousGagnezToujours = true; for (let coupe = 1; coupe <= p; coupe++) { // |xy| <= p for (let ly = 1; coupe - ly >= 0 && ly <= coupe; ly++) { const x = w.slice(0, coupe - ly); const y = w.slice(coupe - ly, coupe); const z = w.slice(coupe); if (y.length < 1) continue; const i = choisirI(x, y, z); const pompe = x + y.repeat(i) + z; if (estDansL(pompe)) { console.log(" PERDU sur x=" + x + " y=" + y + " z=" + z + " : " + pompe + " est dans L"); vousGagnezToujours = false; } } } console.log(vousGagnezToujours ? "GAGNÉ pour tout découpage -> L n'est pas régulier." : "à revoir"); } jouer(3); jouer(5);
Ce que la suite en fait
Le bloc II est complet : vous savez décrire les langages réguliers de trois façons équivalentes, les optimiser, connaître leurs clôtures, et surtout prouver qu'un langage leur échappe. La frontière est tracée.
Le bloc III la franchit. Puisque les automates finis ne savent pas compter, on leur ajoute une mémoire : une pile. Le chapitre 7 introduit d'abord les grammaires hors contexte, une manière de engendrer les langages plutôt que de les reconnaître, capable justement de décrire ; le chapitre 8 leur associe les automates à pile, et donnera un lemme de pompage algébrique qui tracera, un cran plus haut, la frontière suivante.
À retenir
Exercices d'entraînement
Non-régularité par pompage
Montrer, à l'aide du lemme de pompage, que le langage n'est pas régulier.
Non-régularité par clôture
Soit l'ensemble des mots sur comptant autant de a que de b. En utilisant une propriété de clôture, montrer que n'est pas régulier (on admet que ne l'est pas).
Minimisation
Un AFD à états A (initial), B, C, D reconnaît « les mots contenant au moins un a ». Ses transitions sont : , , , , et depuis C ou D, toute lettre mène à C ou D (états acceptants, absorbants). Montrer que son automate minimal a états.
Vous avez parcouru les 9 sections.
Marquez-la terminée pour faire avancer votre parcours, ou revenez sur un point avant de passer à la suite.