cursus.

Cours 1 · FondementsLeçon 1 sur 2

Mots et langages

5 h de lecture10 sections Version PDF

À la fin de cette leçon, vous saurez

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é Σ\Sigma, est un ensemble fini et non vide de symboles. Ce ne sont pas forcément des lettres : Σ={a,b}\Sigma = \{a, b\}, Σ={0,1}\Sigma = \{0, 1\}, 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 Σ\Sigma est une suite finie de symboles de Σ\Sigma. Sur Σ={a,b}\Sigma = \{a, b\}, abba et aaa sont des mots ; abc n'en est pas un, car c n'appartient pas à l'alphabet.

La longueur d'un mot uu, notée u|u|, est le nombre de symboles qui le composent : abba=4|abba| = 4. On peut aussi compter les occurrences d'un symbole donné : abbaa=2|abba|_a = 2.

Le cas particulier qui décide de tout : le mot vide, noté ε\varepsilon. C'est le mot de longueur zéro, ε=0|\varepsilon| = 0. Trois pièges à désamorcer immédiatement :

  • ε\varepsilon est un mot, au même titre que les autres. « De longueur nulle » ne veut pas dire « inexistant ».
  • ε\varepsilon \neq \emptyset. 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.
  • ε\varepsilon 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 ww :

NotionDéfinitionExemples sur abba
Préfixeun début de ww : w=uvw = u \cdot v, on garde uuε\varepsilon, a, ab, abb, abba
Suffixeune fin de wwε\varepsilon, a, ba, bba, abba
Facteurun morceau contigu, n'importe oùtous les précédents, plus b, bb

Remarquez que ε\varepsilon et ww lui-même sont toujours à la fois préfixe, suffixe et facteur de ww. 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 :

uv=uvpar exempleabba=abba.u \cdot v = uv \qquad \text{par exemple} \quad ab \cdot ba = abba.

Deux propriétés structurent tout le reste, et méritent d'être énoncées comme telles.

Elle est associative : (uv)w=u(vw)(u \cdot v) \cdot w = u \cdot (v \cdot w). On peut donc écrire uvwuvw sans parenthèses.

Elle admet un élément neutre, et c'est ε\varepsilon : uε=εu=uu \cdot \varepsilon = \varepsilon \cdot u = u. 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 : abbaab \neq ba en général. L'ordre des symboles est l'information portée par un mot.

Enfin, les longueurs s'ajoutent : uv=u+v|u \cdot v| = |u| + |v|. Cette égalité si simple est la clé des preuves par récurrence sur la longueur du chapitre suivant.

Quiz · vérifiez votre compréhension Sans réponse

Parmi ces affirmations sur le mot vide ε sur l'alphabet Σ = {a, b}, laquelle est correcte ?

Σ* : l'ensemble de tous les mots

On note Σ\Sigma^* l'ensemble de tous les mots que l'on peut former sur Σ\Sigma, y compris ε\varepsilon. C'est le terrain de jeu du cours entier.

Σ\Sigma^* 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 Σ={a,b}\Sigma = \{a, b\} :

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 nn s'obtient en plaçant l'une des Σ|\Sigma| lettres devant un mot de longueur n1n-1. Il y a donc exactement Σn|\Sigma|^n mots de longueur nn — 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 LL sur Σ\Sigma est un sous-ensemble de Σ\Sigma^*, c'est-à-dire LΣL \subseteq \Sigma^*.

Rien de plus. Un langage est un ensemble de mots — fini ou infini. Quelques exemples sur Σ={a,b}\Sigma = \{a, b\} :

  • L1={a,ab,abb}L_1 = \{a, ab, abb\} — un langage fini de trois mots ;
  • L2={ε}L_2 = \{\varepsilon\} — le langage qui ne contient que le mot vide (un élément) ;
  • L3=L_3 = \emptyset — le langage vide, aucun mot ;
  • L4={anbnn0}={ε,ab,aabb,aaabbb,}L_4 = \{a^n b^n \mid n \geq 0\} = \{\varepsilon, ab, aabb, aaabb b, \dots\} — un langage infini, qui reviendra hanter le chapitre 6 ;
  • L5L_5 = « tous les mots qui contiennent le facteur aa » — infini lui aussi.

Notez encore la distinction, cruciale et régulièrement ratée en examen : {ε}\{\varepsilon\} et \emptyset 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 L1L2L_1 \cup L_2, l'intersection L1L2L_1 \cap L_2 et le complément L=ΣL\overline{L} = \Sigma^* \setminus L sont les opérations ensemblistes habituelles.

La concaténation de langages étend celle des mots à tout l'ensemble :

L1L2={uvuL1, vL2}.L_1 \cdot L_2 = \{\, u \cdot v \mid u \in L_1,\ v \in L_2 \,\}.

On prend chaque mot du premier, chaque mot du second, on les colle. Si L1={a,ab}L_1 = \{a, ab\} et L2={b,c}L_2 = \{b, c\}, alors L1L2={ab,ac,abb,abc}L_1 \cdot L_2 = \{ab, ac, abb, abc\}.

Enfin, l'opération reine de la théorie, l'étoile de Kleene :

L={ε}LL2L3L^* = \{\varepsilon\} \cup L \cup L^2 \cup L^3 \cup \cdots

LnL^n est la concaténation de LL avec lui-même nn fois. Autrement dit, LL^* contient tous les mots obtenus en concaténant zéro, un ou plusieurs mots de LL. Le « zéro » est capital : εL\varepsilon \in L^* toujours, même si εL\varepsilon \notin L. 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 Σ\Sigma^* 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 · vérifiez votre compréhension Sans réponse

Soit L = {ab}. Lequel de ces mots n'appartient PAS à 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 nn sur un alphabet donné, et vous vérifiez que leur nombre vaut bien Σn|\Sigma|^n.

Le but n'est pas la programmation mais la définition : en écrivant concatener(u, ε), on comprend une fois pour toutes pourquoi ε\varepsilon est l'élément neutre, et en comptant les mots, on construit la formule au lieu de l'apprendre.

Exercice · JavaScript · à vous de jouer

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.

En attente
// 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));
}

Console de sortie
Le résultat s'affiche dans la console

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é uv=u+v|uv| = |u| + |v| 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 · 1 / 4Toucher pour retourner

Exercices d'entraînement

Exercice 1 · cherchez avant de lire la correction

Dénombrer des mots

On travaille sur l'alphabet Σ={a,b,c}\Sigma = \{a, b, c\}.

  1. Combien y a-t-il de mots de longueur exactement 33 ?
  2. Combien de mots de longueur au plus 33 (le mot vide compris) ?
Exercice 2 · cherchez avant de lire la correction

Préfixes, suffixes, facteurs

Soit le mot w=abbaw = abba.

  1. Donner tous ses préfixes.
  2. Combien ww possède-t-il de facteurs distincts ?
Exercice 3 · cherchez avant de lire la correction

Opérations sur les langages

Soit L1={a,ab}L_1 = \{a, ab\} et L2={b,c}L_2 = \{b, c\}.

  1. Donner tous les mots de L1L2L_1 \cdot L_2.
  2. Le mot vide ε\varepsilon appartient-il à L1L_1^* ? Justifier.
Fin de la leçon

Vous avez parcouru les 10 sections.

Marquez-la terminée pour faire avancer votre parcours, ou revenez sur un point avant de passer à la suite.