Chapitre 1 · 5 h
Mots et langages
Alphabet, mot, longueur, mot vide ; concaténation, préfixe, suffixe, facteur ; le langage comme ensemble de mots ; union, concaténation, étoile de Kleene ; dénombrer les mots.
Un compilateur, un moteur de recherche, un validateur de formulaire, un correcteur orthographique : tous partagent une même question, posée des milliards de fois par seconde. Une suite de caractères appartient-elle à un ensemble décrit à l'avance — les programmes C corrects, les adresses de courriel valides, les nombres bien formés ?
Répondre à cette question, c'est tout le cours. Mais avant de décider si un mot appartient à un langage, il faut définir avec une précision totale ce qu'est un mot, ce qu'est un langage, et ce qu'on a le droit d'en faire. Ce premier chapitre pose ce vocabulaire. Il paraît élémentaire ; il ne l'est pas, et la moitié des erreurs de l'année viennent d'une définition mal assimilée ici — en particulier celle du mot vide.
Alphabet, mot, longueur
Un alphabet, noté , est un ensemble fini et non vide de symboles. Ce ne sont pas forcément des lettres : , , l'ensemble des caractères ASCII, ou même un ensemble de mots entiers d'un langage de programmation traités comme des symboles uniques.
Un mot (ou chaîne) sur est une suite finie de symboles de . Sur
, abba et aaa sont des mots ; abc n'en est pas un, car c n'appartient
pas à l'alphabet.
La longueur d'un mot , notée , est le nombre de symboles qui le composent : . On peut aussi compter les occurrences d'un symbole donné : .
Le cas particulier qui décide de tout : le mot vide, noté . C'est le mot de longueur zéro, . Trois pièges à désamorcer immédiatement :
- est un mot, au même titre que les autres. « De longueur nulle » ne veut pas dire « inexistant ».
- . Le mot vide est un objet ; l'ensemble vide est un ensemble sans aucun élément. Confondre les deux est l'erreur la plus fréquente du cours.
- n'est pas le symbole
espace. Un espace est un symbole de longueur 1 comme un autre.
Préfixe, suffixe, facteur
Trois façons de « prendre un morceau » d'un mot :
| Notion | Définition | Exemples sur abba |
|---|---|---|
| Préfixe | un début de : , on garde | , a, ab, abb, abba |
| Suffixe | une fin de | , a, ba, bba, abba |
| Facteur | un morceau contigu, n'importe où | tous les précédents, plus b, bb |
Remarquez que et lui-même sont toujours à la fois préfixe, suffixe et facteur de . Ce ne sont pas des cas dégénérés qu'on écarte : les définitions les incluent, et les preuves du cours s'appuient sur cette inclusion.
La concaténation
L'opération de base sur les mots est la concaténation : mettre bout à bout. On la note par un point, souvent omis :
Deux propriétés structurent tout le reste, et méritent d'être énoncées comme telles.
Elle est associative : . On peut donc écrire sans parenthèses.
Elle admet un élément neutre, et c'est : . C'est ici que le mot vide gagne son utilité — il joue pour la concaténation le rôle que zéro joue pour l'addition. Sans lui, la théorie serait pleine de cas particuliers.
En revanche, la concaténation n'est pas commutative : en général. L'ordre des symboles est l'information portée par un mot.
Enfin, les longueurs s'ajoutent : . Cette égalité si simple est la clé des preuves par récurrence sur la longueur du chapitre suivant.
Quiz · 1 question
Parmi ces affirmations sur le mot vide ε sur l'alphabet Σ = {a, b}, laquelle est correcte ?
- ε est identique à l'ensemble vide ∅ — mot vs ensemble
- ε est un mot de longueur 0, et il vérifie u·ε = u pour tout mot u — longueur 0 et élément neutre
- ε n'est pas un mot, c'est l'absence de mot — existence
Réponse : ε est bel et bien un mot — le seul de longueur 0 — et il est l'élément neutre de la concaténation : u·ε = ε·u = u, exactement comme 0 pour l'addition. Il ne faut pas le confondre avec l'ensemble vide ∅, qui est un ensemble sans élément, alors que ε est un objet (un mot). Dire que ε « n'est pas un mot » interdirait de l'accepter dans un automate, ce qui casserait la moitié des constructions du cours.
Σ* : l'ensemble de tous les mots
On note l'ensemble de tous les mots que l'on peut former sur , y compris . C'est le terrain de jeu du cours entier.
est infini — il n'y a pas de mot le plus long — mais il est dénombrable : on peut énumérer ses éléments sans en oublier aucun, en les rangeant par longueur croissante. Sur :
longueur 0 : εlongueur 1 : a, blongueur 2 : aa, ab, ba, bblongueur 3 : aaa, aab, aba, abb, baa, bab, bba, bbb...Le comptage suit une logique simple : chaque mot de longueur s'obtient en plaçant l'une des lettres devant un mot de longueur . Il y a donc exactement mots de longueur — 1, 2, 4, 8 sur un alphabet de deux lettres, comme dans la liste ci-dessus. Vous retrouverez cette formule par vous-même dans l'exercice, en la construisant plutôt qu'en la récitant.
Un langage est un ensemble de mots
Voici la définition centrale, et elle est d'une simplicité désarmante :
Un langage sur est un sous-ensemble de , c'est-à-dire .
Rien de plus. Un langage est un ensemble de mots — fini ou infini. Quelques exemples sur :
- — un langage fini de trois mots ;
- — le langage qui ne contient que le mot vide (un élément) ;
- — le langage vide, aucun mot ;
- — un langage infini, qui reviendra hanter le chapitre 6 ;
- = « tous les mots qui contiennent le facteur
aa» — infini lui aussi.
Notez encore la distinction, cruciale et régulièrement ratée en examen : et sont deux langages différents. Le premier contient un mot (le mot vide) ; le second n'en contient aucun. C'est la même différence qu'entre une boîte contenant une feuille blanche et une boîte vide.
Les opérations sur les langages
Comme les langages sont des ensembles, on hérite des opérations ensemblistes, plus deux opérations propres aux mots.
L'union , l'intersection et le complément sont les opérations ensemblistes habituelles.
La concaténation de langages étend celle des mots à tout l'ensemble :
On prend chaque mot du premier, chaque mot du second, on les colle. Si et , alors .
Enfin, l'opération reine de la théorie, l'étoile de Kleene :
où est la concaténation de avec lui-même fois. Autrement dit, contient tous les mots obtenus en concaténant zéro, un ou plusieurs mots de . Le « zéro » est capital : toujours, même si . C'est encore le mot vide qui se glisse dans la définition, et l'oublier fausse la moitié des exercices sur les expressions régulières du chapitre 5. La notation que vous employez depuis le début n'est d'ailleurs rien d'autre que l'étoile de Kleene appliquée à l'alphabet vu comme un langage de mots d'une lettre.
Quiz · 1 question
Soit L = {ab}. Lequel de ces mots n'appartient PAS à L* ?
- ε (le mot vide) — zéro copie de ab
- ababab — trois copies de ab
- aba — les symboles vont-ils par paires ab ?
Réponse : L* contient tous les mots formés en concaténant zéro, un ou plusieurs exemplaires de ab : ε (zéro copie), ab, abab, ababab… Le mot vide en fait toujours partie, même si ε ∉ L. En revanche aba ne s'écrit pas comme une suite de blocs « ab » — il faudrait un a final orphelin. Il n'appartient donc pas à L*. Retenez que l'étoile inclut toujours ε, mais n'autorise que des concaténations entières de mots de L.
À vous
L'exercice est votre premier contact avec ces objets, en code. Vous implémentez les opérations de base — longueur, concaténation, préfixe — puis vous énumérez tous les mots de longueur sur un alphabet donné, et vous vérifiez que leur nombre vaut bien .
Le but n'est pas la programmation mais la définition : en écrivant concatener(u, ε), on
comprend une fois pour toutes pourquoi est l'élément neutre, et en comptant les
mots, on construit la formule au lieu de l'apprendre.
Exercice de code
Implémentez les opérations de base sur les mots (longueur, concaténation, préfixe), puis énumérez tous les mots de longueur n sur un alphabet donné. Vérifiez que leur nombre vaut |Σ|^n — et retrouvez pourquoi.
Point de départ
// Un mot est une suite finie de symboles pris dans un alphabet. En code, on
// le représente par une chaîne, et l'alphabet par un tableau de symboles.
const SIGMA = ["a", "b"]; // alphabet à 2 lettres
const MOT_VIDE = ""; // le mot vide, noté ε en cours (longueur 0)
// ── À VOUS (1) : les opérations de base ─────────────────────────────────────
function longueur(u) {
return 0; // à compléter
}
function concatener(u, v) {
return ""; // à compléter — attention : concatener(u, MOT_VIDE) doit rendre u
}
function estPrefixe(u, w) {
// u est-il un préfixe de w ? (w commence-t-il par u ?)
return false; // à compléter
}
// ── À VOUS (2) : dénombrer ──────────────────────────────────────────────────
// motsDeLongueur(n) doit rendre TOUS les mots de longueur n sur SIGMA.
// Combien y en a-t-il ? Vérifiez que |resultat| = |SIGMA|^n.
function motsDeLongueur(n) {
return []; // à compléter (récursion ou boucle)
}
// ── Vérification ────────────────────────────────────────────────────────────
console.log("longueur('abba') =", longueur("abba"), "(attendu 4)");
console.log("concatener('ab','ba') =", concatener("ab", "ba"), "(attendu abba)");
console.log("concatener('ab', ε) =", "'" + concatener("ab", MOT_VIDE) + "'", "(attendu ab)");
console.log("estPrefixe('ab','abba') =", estPrefixe("ab", "abba"), "(attendu true)");
console.log("");
for (let n = 0; n <= 3; n++) {
const m = motsDeLongueur(n);
console.log("mots de longueur " + n + " : " + m.length + " -> [" + m.join(", ") + "]");
console.log(" |SIGMA|^" + n + " = " + Math.pow(SIGMA.length, n));
}
Solution
function longueur(u) {
return u.length;
}
function concatener(u, v) {
return u + v; // le mot vide est l'élément neutre : u·ε = ε·u = u
}
function estPrefixe(u, w) {
return w.slice(0, u.length) === u;
}
function motsDeLongueur(n) {
if (n === 0) return [MOT_VIDE]; // un seul mot de longueur 0 : ε
const petits = motsDeLongueur(n - 1); // les mots de longueur n-1
const resultat = [];
for (const m of petits) // devant chacun,
for (const lettre of SIGMA) // on place chaque lettre
resultat.push(lettre + m);
return resultat;
}
// ── Ce que l'exercice montre ────────────────────────────────────────────────
//
// 1. Le mot vide ε n'est PAS "rien" : c'est un mot, de longueur 0, et il est
// l'élément neutre de la concaténation (u·ε = u). L'oublier fausse
// récurrences et automates — la moitié des erreurs du cours viennent de là.
//
// 2. Le dénombrement suit une récurrence : chaque mot de longueur n s'obtient
// en ajoutant UNE des |SIGMA| lettres devant un mot de longueur n-1. D'où
// (nb de longueur n) = |SIGMA| × (nb de longueur n-1), avec 1 pour n=0.
// La solution de cette récurrence est |SIGMA|^n. On ne l'a pas récitée :
// on l'a construite, et le code la vérifie (1, 2, 4, 8 sur un alphabet de 2).
//
// 3. Σ* — l'ensemble de TOUS les mots — est donc infini, mais DÉNOMBRABLE :
// on peut les énumérer longueur par longueur, sans en oublier aucun. C'est
// la première brique de tout le cours : un langage sera un sous-ensemble
// de ce Σ*.
Ce que la suite en fait
Ce vocabulaire est le socle de tout. Le chapitre 2 se dote des outils pour prouver des propriétés sur ces objets — l'induction et la récurrence sur la longueur d'un mot, qui reposent directement sur l'égalité vue ici.
Ensuite, tout le cours consistera à décrire des langages — d'abord les plus simples, les langages réguliers, par des automates (chapitre 3) et des expressions régulières (chapitre 5) — et à comprendre ce que chaque outil peut et ne peut pas décrire. La question « ce mot appartient-il à ce langage ? » de l'introduction ne vous quittera plus.
À retenir
Flashcards · 4 cartes
- Quelle est la différence entre ε, ∅ et {ε} ?
- ε est le mot vide : un mot de longueur 0, élément neutre de la concaténation (u·ε = u). ∅ est le langage vide : un ensemble sans aucun mot. {ε} est le langage qui contient exactement un mot, le mot vide. ∅ et {ε} sont donc deux langages différents — l'un a zéro élément, l'autre en a un. Les confondre est l'erreur la plus fréquente du cours.
- Qu'est-ce qu'un langage sur un alphabet Σ ?
- Un sous-ensemble de Σ* : L ⊆ Σ*, c'est-à-dire un ensemble de mots, fini ou infini. Σ* est l'ensemble de TOUS les mots formables sur Σ (y compris ε) : il est infini mais dénombrable, et compte |Σ|^n mots de longueur n. Tout le cours consiste à décrire des langages et à cerner ce que chaque outil de description peut exprimer.
- Que contient l'étoile de Kleene L*, et quel piège faut-il retenir ?
- L* = {ε} ∪ L ∪ L² ∪ L³ ∪ … : tous les mots obtenus en concaténant zéro, un ou plusieurs mots de L. Le piège : ε ∈ L* TOUJOURS (la concaténation de zéro mot), même quand ε ∉ L. Oublier ce cas « zéro copie » fausse beaucoup d'exercices sur les expressions régulières.
- Quelles sont les deux propriétés clés de la concaténation de mots ?
- Elle est associative — (uv)w = u(vw), donc on écrit uvw sans parenthèses — et admet ε pour élément neutre — u·ε = ε·u = u. Elle n'est PAS commutative : ab ≠ ba en général. Et les longueurs s'ajoutent : |uv| = |u| + |v|, égalité sur laquelle reposent les preuves par récurrence sur la longueur du chapitre suivant.
Exercices d'entraînement
Exercice 1
Dénombrer des mots
On travaille sur l'alphabet .
- Combien y a-t-il de mots de longueur exactement ?
- Combien de mots de longueur au plus (le mot vide compris) ?
Correction
- Chaque position se choisit indépendamment parmi lettres, donc il y a mots de longueur .
- On additionne les mots de chaque longueur, sans oublier (longueur ) : Le terme compte le seul mot de longueur nulle, le mot vide.
Exercice 2
Préfixes, suffixes, facteurs
Soit le mot .
- Donner tous ses préfixes.
- Combien possède-t-il de facteurs distincts ?
Correction
-
Un mot de longueur a exactement préfixes (on coupe avant chaque lettre, plus le mot entier). Ici : ,
a,ab,abb,abba— soit préfixes. -
On compte les facteurs par longueur, en éliminant les doublons :
- longueur : — ;
- longueur :
a,b— ; - longueur :
ab,bb,ba— ; - longueur :
abb,bba— ; - longueur :
abba— .
Total : facteurs distincts. La lettre
an'est comptée qu'une fois, bien qu'elle apparaisse deux fois dans — un facteur est un mot, pas une position.
Exercice 3
Opérations sur les langages
Soit et .
- Donner tous les mots de .
- Le mot vide appartient-il à ? Justifier.
Correction
- On concatène chaque mot de avec chaque mot de :
- Oui. Par définition, contient la concaténation de zéro mot de , qui vaut . C'est vrai pour tout langage, même quand — le piège classique de l'étoile de Kleene.