INF4048 Partie1 2022-2023
INF4048 Partie1 2022-2023
INF4048 Partie1 2022-2023
Étienne KOUOKAM
1 Généralités 7
1.1 Historique et définition . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2 Types de compilateurs . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.1 Les compilateurs monolithiques . . . . . . . . . . . . . . . 9
1.2.2 Les compilateurs modulaires . . . . . . . . . . . . . . . . . 9
1.3 Architecture de la partie avant d’un compilateur . . . . . . . . . . 12
2 Les langages 14
2.1 Les mots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.1.1 Définitions de base . . . . . . . . . . . . . . . . . . . . . . 15
2.1.2 Récurrence sur les mots basés sur l’adjonction d’une occur-
rence à droite . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.3 La concaténation . . . . . . . . . . . . . . . . . . . . . . . 18
2.2 Langages et opérations élémentaires sur les langages . . . . . . . . 19
2.2.1 Réunion ou somme de langages . . . . . . . . . . . . . . . 20
2.2.2 Concaténation des langages . . . . . . . . . . . . . . . . . 21
2.2.3 Itération et quotient de langages . . . . . . . . . . . . . . . 21
2.3 Système d’équations linéaires en langages . . . . . . . . . . . . . . 23
2.3.1 Equations linéaires à une inconnue (lemme d’Arden) . . . 23
2.3.2 Inéquations linéaires à une inconnue . . . . . . . . . . . . 25
2.3.3 Système d’équations linéaires . . . . . . . . . . . . . . . . 26
2.4 Monoïdes et morphismes de monoïdes . . . . . . . . . . . . . . . . 29
2.4.1 Définition des monoïdes . . . . . . . . . . . . . . . . . . . 29
2.4.2 Morphisme de monoïdes et propriété principale de Σ∗ . . . 31
3
4
OUVRAGES DE REFERENCE
5
6
Démarche
Généralités
Exemple :
— Quelles sont les couleurs existant dans un jeu de cartes ?
— Est-ce que cette suite de chiffres représente un nombre pair ?
— Est-ce que cette suite de chiffres représente un nombre premier ?
Dans le sens le plus usuel du terme, la compilation est une transformation que
l’on fait subir à un programme décrit dans un langage évolué pour le rendre exé-
cutable.
Fondamentalement, la compilation est une opération consistant en la traduc-
tion d’un programme écrit en langage source en un programme équivalent écrit
en langage cible ou objet, comme le montre la figure 1.1. Par exemple, un texte
écrit en Pascal, C, Java, etc., exprime un algorithme et il s’agit de produire un
7
8
autre texte, spécifiant le même algorithme dans le langage d’une machine que
nous cherchons à programmer.
Le langage source n’est autre que celui qu’il faut analyser ; le langage objet, celui
vers lequel il faut traduire ; ce dernier pouvant être le langage machine, l’assem-
bleur ou un langage intermédiaire.
à-dire adapté à l’esprit humain) vers un langage de plus bas niveau (conçu pour
être exécuté efficacement par une machine).
A l’opposée, un décompilateur est un programme qui essaye de reconstruire le
programme source à partir du code objet.
Cette partie permet d’analyser le code source. Elle et qui elle-même se charge
de :
— l’analyse lexicale (A voir) : dans cette phase, les caractères isolés qui consti-
tuent le texte source sont regroupés pour former des unités lexicales, qui
sont les mots du langage. L’analyse lexicale opère sous le contrôle de l’ana-
lyse syntaxique ; elle apparaît comme une sorte de fonction de lecture amé-
liorée, qui fournit un mot lors de chaque appel.
— l’analyse syntaxique (A voir) : alors que l’analyse lexicale reconnaît les
mots du langage, l’analyse syntaxique en reconnaît les phrases. Le rôle
principal de cette phase est de dire si le texte source appartient au langage
considéré, c’est-à-dire s’il est correct relativement à la grammaire de ce
dernier.
— l’analyse sémantique (que nous ne verrons pas) : la structure du texte
source étant correcte, il s’agit ici de vérifier certaines propriétés séman-
tiques, c’est-à-dire relatives à la signification de la phrase et de ses consti-
tuants :
— les identificateurs apparaissant dans les expressions ont-ils été décla-
rés ?
— les opérandes ont-ils les types requis par les opérateurs ?
— les opérandes sont-ils compatibles ? n’y a-t-il pas des conversions à
insérer ?
— les arguments des appels de fonctions ont-ils le nombre et le type re-
quis ?
— etc.
C’est cette partie qui fait la synthèse en générant le programme cible. Ellle se
charge de :
— Optimisation du code : il s’agit généralement ici de transformer le code
afin que le programme résultant s’exécute plus rapidement. Par exemple
— détecter l’inutilité de recalculer des expressions dont la valeur est déjà
connue,
— transporter à l’extérieur des boucles des expressions et sous-expressions
dont les opérandes ont la même valeur à toutes les itérations
— détecter, et supprimer, les expressions inutiles
— la Génération de code intermédiaire (que nous ne verrons pas non plus
cours de M1) : Après les phases d’analyse, certains compilateurs ne pro-
duisent pas directement le code attendu en sortie, mais une représentation
intermédiaire, une sorte de code pour une machine abstraite. Cela permet
de concevoir indépendamment les premières phases du compilateur (consti-
E. Kouokam - Support de Langages formels & Compilation - 2022-2023 —-> Généralités11
tuant ce que l’on appelle sa face avant) qui ne dépendent que du langage
source compilé et les dernières phases (formant sa face arrière) qui ne dé-
pendent que du langage cible ; l’idéal serait d’avoir plusieurs faces avant
et plusieurs faces arrière qu’on pourrait assembler librement 1
1. De la sorte, avec n faces avant pour n langages source et m faces arrière correspondant à
m machines cibles, on disposerait automatiquement de n ∗ m compilateurs distincts. Mais cela
reste, pour le moment, un fantasme d’informaticien.
12
représentation intermédiaire
Les langages
Deux types de langages seront étudiés par la suite. Leur application à la compi-
lation donne lieu à deux types d’analyse :
— Les langages réguliers : l’analyse lexicale,
— Les langages algébriques : l’analyse syntaxique.
Nous considérons dans ce cours des listes finies de symboles, et des ensembles
homogènes de telles listes : d’une façon générale une liste finie de symboles s’ap-
pellera un mot et un ensemble de mots s’appellera un langage. Cependant, ce
vocabulaire n’est pas adapté à toutes les situations :
On notera que les caractères blancs (c’est-à-dire les espaces, les tabulations et les
marques de fin de ligne) ne font généralement pas partie des alphabets 1 .
On appelle mot toute suite finie (éventuellement vide) d’éléments de Σ. Ainsi,
un mot u sur l’alphabet Σ est une application
u : {1, · · · , m} → Σ
1. Il en découle que les unités lexicales, sauf mesures particulières (apostrophes, guillemets,
etc.), ne peuvent pas contenir des caractères blancs. D’autre part, la plupart des langages
autorisent les caractères blancs entre les unités lexicales.
14
E. Kouokam - Support de Langages formels & Compilation - 2022-2023 —-> Les langages15
où :
m est un entier appelé la longueur de |u|
{1, · · · , m} est l’ensemble des entiers naturels i tels que 1 ≤ i ≤ m.
— u(i) est appelée la ième lettre, le ième caractère ou le ième symbole de u.
— Si u(i) = x, on dira que u(i) est une occurrence de x dans u.
— On peut noter u[i] au lieu de u(i) : on constate alors que la définition des
mots nous est très familière.
Exemple 2 Si Σ = {a, b}, alors Σ0 = {ǫ}, Σ1 = {a, b}, Σ2 = {aa, ab, ba, bb},
etc.
Σ∗ est donc l’ensemble de tous les mots qu’on peut former à partir de Σ. On note
Σ+ le même ensemble mais privé du mot vide : Σ∗ = Σ+ ∪ {ǫ}
Remarque 1:
e
ǫx = x si, comme il a été convenu ci-dessus, on identifie le symbole x avec le
mot de longueur 1 qu’il définit.
|ux| = |u| + 1.
Ainsi, tout élément de Σ∗ ou bien est ǫ ou bien s’obtient à partir d’un élément
de Σ par "adjonction" d’un caractère à droite. Les deux clauses suivantes :
— ǫ ∈ Σ∗ (le mot sans caractère)
— ∀x ∈ Σ∗ : si u ∈ Σ∗ alors ux ∈ Σ∗ (adjonction de x à droite de u).
constituent donc une définition inductive de Σ∗ .
Plus précisément, Σ∗ est le plus petit ensemble vérifiant les deux propriétés ci-
dessus.
De plus, chaque élément de Σ∗ admet une construction unique à partir de ǫ par
adjonctions successives de caractères à droite.
Lorsque l’on écrit les mots par simple juxtaposition de caractères, il faut éviter
que ceux-ci interagissent les uns avec les autres : chaque caractère doit être indé-
composable en des éléments appartenant à l’alphabet en cause.
La condition que Σ doit satisfaire pour cela s’exprime sous la forme suivante :
Les notions de base relatives aux mots peuvent se définir par récurrence sur les
mots : on doit comprendre une telle définition comme le schéma d’une procédure
récursive. En fait, la plupart des définitions relatives aux mots seront basées sur
ce principe de récurrence, ou l’une de ses variantes (cf. ci-dessous).
Remarque 2:
Dans ce qui précède, nous avons supposé implicitement que les symboles (par
exemple a et b) étaient des objets insécables et que l’on pouvait placer "côte
à côte" sans qu’ils risquent de se mélanger : ceci est nécessaire en particulier
lorsque l’on a besoin de connaître le symbole qui a été adjoint le dernier dans la
construction d’un mot.
Dans la pratique, on utilise souvent des symboles qui se présentent déjà sous la
forme de "chaînes de caractères" : pour pouvoir les reconnaître, il faut alors user
d’artifices : ces artifices sont les séparateurs (parenthèses, caractère blanc, etc.).
Exemple 6 Si l’on veut absolument utiliser l’ensemble aba, ab, bb, b comme
un alphabet, on ne peut pas se contenter de juxtaposer des occurrences de ses
éléments pour en faire des mots car, par exemple le "mot" ababb peut se lire de
trois façons différentes ! On peut résoudre ce problème en intercallant des blancs
(par exemple aba bb), ou bien, et c’est la solution que nous adopterons le plus
souvent, en considérant l’alphabet [aba], [ab], [bb], [b] où chacun des symboles est
soigneusement encapsulé : ainsi, les trois lectures précédentes correspondent-elles
à trois mots bien identifiables : [aba][bb], [aba][b][b] et [ab][ab][b].
18
2.1.3 La concaténation
La concaténation est l’opération ”.” : Σ∗ × Σ∗ → Σ∗ qui consiste à mettre
deux mots "bout à bout". Ainsi, pour tout u ∈ Σ∗ et tout v ∈ Σ∗ , u.v est définie
par récurrence sur v de la façon suivante :
1. u.ǫ = u
2. u.(vx) = (u.v)x pour tout v ∈ Σ∗ et tout x ∈ Σ
L’énoncé P[v] en cause ici est " pour tout u ∈ Σ∗ u.v est défini"
La concaténation est une opération interne de Σ∗ ; elle est associative, mais pas
commutative (sauf dans le cas dégénéré où Σ ne contient qu’un seul symbole). ǫ
est l’élément neutre pour la concaténation : uǫ = ǫu = u ; ceci justifie la notation
1 ou encore 1Σ .
Contrairement aux facteurs, les sous-mots sont donc construits à partir de frag-
ments non nécessairement contigus, mais dans lesquels l’ordre d’apparition des
symboles est toutefois respecté. On appelle facteur (resp. préfixe, suffixe,
sous-mot) propre de u tout facteur (resp. préfixe, suffixe, sous-mot) de u dif-
férent de u.
L’ensemble des langages P (Σ∗ ) étant l’ensemble des parties d’un ensemble, est na-
turellement muni d’opérations ensemblistes "classiques" qui leur sont applicables.
bien connues : réunion, intersection, complémentaire. La réunion, aussi notée
additivement, est souvent appelé la somme : il s’agit ici de la réutilisation d’un
symbole connu, à des fins nouvelles.
20
L1 ∪ L2 = L1 + L2 = {u ∈ Σ∗ |u ∈ L1 ou u ∈ L2 }
La somme
∀L1 , L2 , L3 langages de Σ∗ :
(L1 + L2 ⊆ L3 ) ⇒ (L1 ⊆ L3 et L2 ⊆ L3 )
Exer-
cice 1 : Démontrer ce résultat
Les autres propriétés les plus connues de la réunion se traduisent immédiate-
ment dans la notation additive récapitulée dans le tableau 2.2
Propriété de la somme
Règle Réunion
Neutralité de ∅ ∅+L=L+∅=L
Associativité L1 + (L2 + L3 ) = (L1 + L2 ) + L3
Commutativité L1 + L2 = L2 + L1
Idempotence L+L=L
Croissance (L1 ⊆ L2 ) ⇒ (L + L1 ⊆ L + L2 )
Table 2.2 – Propriétés de la réunion de 2 langages
Remarque 4:
toutes les propriétés de l’addition ordinaire ne sont pas vraies ici, en particulier,
on ne peut pas "simplifier". Plus précisément, on peut avoir L+L1 = L+L2 alors
que L1 6= L2 . En effet, si par exemple on a L1 ⊆ L et L2 ⊆ L, on a L + L1 = L
et L + L2 = L même si L1 6= L2 .
A partir de la somme, on peut définir une opération de différence ensembliste
par
L1 − L2 = {u|u ∈ L1 et u ∈/ L2 }
Cependant, il faut ne jamais oublier que cette opération n’est pas la réciproque
de la somme. En effet :
— (L1 − L2 ) + L2 = L1 + L2 , ce qui n’est égal à L1 que si L2 ⊆ L1
— (L1 + L2 ) − L2 = L1 − L2 , ce qui n’est égal à L1 que si L1 ∩ L2 = ∅
E. Kouokam - Support de Langages formels & Compilation - 2022-2023 —-> Les langages21
Propriétés de la concaténation
Règle Réunion
Neutralité ǫ.L = L.ǫ = L
Associativité L1 .(L2 .L3 ) = (L1 .L2 ).L3
Croissance (L1 ⊆ L2 ) ⇒ (L.L1 ⊆ L.L2 et L1 .L ⊆ L2 .L)
Nullité L.∅ = ∅.L = ∅
Distributivité L1 .(L2 + L3 ) = L1 .L2 + L1 .L3 et (L1 + L2 ).L3 = L1 .L3 + L2 .L3
Par ailleurs, on a :
|L1 .L2 | ≤ |L1 |.|L2 |
Démonstration
On peut voir l’équation X = A · X ∪ B comme la définition récursive d’un
langage : un mot de ce langage est soit dans B, soit formé d’un mot dans A
suivi d’un autre mot du langage, et on peut interpréter la solution comme une
définition itérative : un mot est formé d’une suite de mots dans A, puis d’un mot
final dans B.
— La vérification de 1. est aisée. En effet, AL + B = AA∗ B + B = (AA∗ +
ǫ)B = A∗ B = L
— Deux possibilités :
Méthode 1 Soit M une solution de (2.1) : ceci signifie que M = AM + B
et donc en particulier, que AM + B ⊆ M i-e B ⊆ M et AM ⊆ M.
Pour montrer 2., i-e A∗ B ⊆ M, il suffit de vérifier que Ai B ⊆ M pour
tout i. C’est une récurrence facile :
— Pour i=0, on a A0 B = B ⊆ M
— Supposons que Ai B ⊆ M. Alors, Ai+1 B = A(Ai B) ⊆ AM ⊆ M
24
L = An+1 L ∪ An B ∪ An−1 B ∪ · · · ∪ AB ∪ B
Application
Le lemme d’Arden permet, par la résolution d’un système d’équation par
substitution, de déterminer le langage reconnu par un automate fini. On procède
comme dans la méthode d’élimination de Gauss : on exprime une variable en
fonction des autres, on la remplace par cette expression, on résout le système
à une variable de moins, et on explicite la valeur de la variable éliminée. Soit
A = (Q, F , I, T ) un automate fini sur un alphabet Z. Pour chaque état q ∈ Q,
E. Kouokam - Support de Langages formels & Compilation - 2022-2023 —-> Les langages25
Exemple
Un automate à deux états L’automate ci-contre donne le système d’équations :
L1 = 1L1 ∪ 0L2 ∪ ε
Le lemme d’Arden donne L2 = 1∗ 0·L1 . En injectant cette
L2 = 1L2 ∪ 0L1
expression de L2 dans l’expression précédente de L1 et en factorisant, on obtient
L1 = (1 ∪ 01∗ 0) · L1 ∪ {ε}, et par application du lemme d’Arden, L1 = (1 ∪ 01∗ 0)∗ .
(I) AX + B ⊆ X (2.3)
L’inéquation (I) a une plus petite solution et celle-ci est égale à la plus
petite solution L = A∗ B de l’équation (E)(2.1).
L1 M1
L2 M2
Les m-uplets de langages se comparent terme à terme, i-e .. ⊆ ..
. .
Lm Mm
ce qui revient à dire que Li ⊆ Mi pour chaque i.
Sa plus petite solution est tout simplement A∗ B : la preuve de ce fait est une
transposition du cas d’une seule équation à une seule inconnue. Ce résultat est
intéressant mais le calcul de A∗ n’est pas très effectif : la résolution pratique de
(2.4) se fait par un algorithme facile à implanter, dont nous allons parler dans un
instant.
Résolution du système d’équations (2.4)
1. (2.4) admet une plus petite solution.
2. Si ǫ ∈
/ Ai,j pour chaque i et chaque j, alors (2.4) admet une solution unique.
E. Kouokam - Support de Langages formels & Compilation - 2022-2023 —-> Les langages27
1. ne fait que reprendre le résultat admis plus haut (1. et 2.). On peut encore
observer que le système d’inéquations correspondant à (2.4) admet la même plus
petite solution que lui.
Méthode de GAUSS
Un usage itéré des deux opérations suivantes permet de calculer effectivement
la plus petite solution de (2.4) : il suffit de transposer aux langages la méthode de
Gauss, bien connue pour la résolution des équations à coefficients réels. L’équa-
tion de Xi peut se mettre sous la forme Xi = Ai,i Xi + Ci où Ci ne dépend pas
de Xi : sous cette forme, il est possible de la "résoudre" en appliquant le résultat
relatif à une équation unique ; on obtient ainsi la "résolvante partielle de (l’équa-
tion de) Xi " : Xi = A∗i,i Ci , dont le second membre ne dépend plus de Xi .
On vérifie que pour tout entier i compris entre 1 et m :
Résolution partielle
Soit (F) le système obtenu à partir de (2.4) en remplaçant l’équation de Xi par
sa résolvante partielle, alors :
la plus petite solution de (F) est égale à la plus petite solution de (2.4).
Substitution
De même, on vérifie que, pour tout couple d’entiers i 6= k compris entre 1 et m :
Substitution
Soit (F) P
le système obtenu à partir de (2.4) en remplaçant Xi par le second
membre m j=1 Ai,j + Bi de son équation dans celle de Xk , alors :
la plus petite solution de (F) est égale à la plus petite solution de (2.4).
Exemple
Considérons le système d’équations (2.5) suivant :
X0 = bX0 + aX1
X1 = aX2 + bX3
(2.5)
X2 = aX1 + bX3 + ǫ
X3 = bX1 + aX3
— résolution de X3
— substitution de X3 dans les équations de X2 puis X1
— substitution de X2 dans l’équation de X1
le transforment en :
X0 = b∗ aX1
X3 = a∗ bX1
X2 = aX1 + ba∗ bX1 + ǫ = (a + ba∗ b)X1 + ǫ
X1 = aX2 + bX3 = a(a + ba∗ b)X1 + a + ba∗ bX1 = (aa + ba∗ b + aba∗ b)X1 + a
Enfin, la résolution de X1 et des substitutions évidentes, conduisent à la solution
cherchée :
X0 = b∗ aX1 = b∗ a(aa + ba∗ b + aba∗ b)∗ a
X1 = (aa + ba∗ b + aba∗ b)∗ a
X3 = a∗ bX1 = a∗ b
X2 = aX1 + ba∗ bX1 = (a + ba∗ b)X1 + ǫ
X1 = aX2 + bX3 = a(a + ba∗ b)X1 + ba∗ bX1 = (aa + ba∗ b + aba∗ b)X1
X0 = b∗ a(aa + ba∗ b + aba∗ b)∗ a
X1 = (aa + ba∗ b + aba∗ b)∗ a
(2.6)
X2 = (a + ba∗ b)(aa + ba∗ b + aba∗ b)∗ a + ǫ
X3 = a∗ b
Remarques
1. Même lorsque la condition d’unicité est vérifiée, l’expression de la solu-
tion peut varier très sensiblement en fonction de l’ordre suivant lequel on
effectue les opérations, comme il est facile de le constater en résolvant le
système précédent d’une autre façon.
2. L’opération de substitution peut, dans certaines circonstances, être utilisée
"à l’envers". Par exemple, dans le système (2.7) suivant :
X0 = bX0 + aX1
X1 = aX1 + bX3
(2.7)
X 2 = aX1 + bX3 + ǫ
X3 = bX1 + aX3
Ce dernier est "plus simple" que le système initial mais il admet la même
plus petite solution que lui, car une substitution du second membre de
l’équation de X1 dans l’équation de X2 redonne le système initial !
E. Kouokam - Support de Langages formels & Compilation - 2022-2023 —-> Les langages29
Dans cette section, nous donnons quelques définitions générales qui recouvrent
des situations très courantes par la suite ; nous ferons encore des conventions
d’écriture qui sont simplement inspirées de celles qui précèdent : elles simplifient
sensiblement l’écriture et la lecture de mainte propriété mais, pour s’en convaincre
et pour garder conscience de ce qu’elles signifient, on peut revenir à la notation
complète !
Les monoïdes
Exemple 9 .
— L’ensemble N des entiers naturels est muni de deux structures de mo-
noïdes : (N, +, 0) et (N, ×, 1).
— Les triplets qui suivent, où L ⊆ Σ∗ est un langage sur un alphabet Σ, sont
des monoïdes, en vertu de propriétés vues dans les sections précédentes :
30
qui, avec l’élément neutre (ǫ, ǫ), en fait un très beau monoïde.
Exemple 11 le sous-monoïde engendré par C1 = {a, ab, c, bc} n’est pas libre par
rapport à C1 : (a)(bc) = (ab)(c)
On dit qu’un sous-monoïde est libre s’il existe un ensemble générateur par rapport
auquel il est libre.
Exemple 12 le sous-monoïde engendré par C2 = {ab, cd, abcd} n’est pas libre
par rapport à C2 car (ab)(cd) = abcd, mais il l’est pas rapport à C2′ = {ab, cd}.
En revanche le sous-monoïde précédent engendré par C1 n’est intrinsèquement
pas libre quelle que soit sa partie génératrice.
Remarque 6:
Les sous-monoïdes du monoïde libre ne sont pas nécessairement libres (c’est-à-
dire qu’ils n’ont pas nécessairement de partie génératrice par rapport à laquelle ils
sont libres). La situation est différente dans les espaces vectoriels où tout espace
vectoriel admet une base (même en dimension infinie, grâce au théorème de Zorn),
en particulier tout sous-espace d’un espace vectoriel admet une base (donc une
partie libre).
Un code est une partie C de Σ∗ qui engendre un sous-monoïde de Σ∗ libre par
rapport à C. Tout élément du sous-monoïde s’écrit d’une manière unique comme
suite d’éléments de C. Cela signifie qu’on peut "décoder" les éléments de C*.
E. Kouokam - Support de Langages formels & Compilation - 2022-2023 —-> Les langages31
Remarque 7:
Cette représentation ne prend pas en compte les syncopes 000001.
L’application qui a tout élément du code C = 10∗ associe sa longueur se prolonge
en un isomorphisme de C ∗ dans le monoïde libre sur l’alphabet N privé de 0 (où
chaque entier, est une "lettre", donc l’alphabet est infini) :
φ(1000010011101) = 531121
Vocabulaire et convention
Nous dirons que l’application f ci-dessus est l’extension de f aux mots et, en
nous inspirant de l’identification Σ à une partie de Σ∗ , nous la noterons simple-
ment f : la propriété précédente nous le permet !
Chapitre 3
Dans toute la suite, les alphabets sont supposés finis et cette hypothèse
joue un rôle essentiel.
Un langage est dit régulier ssi on peut le construire, à partir de langages finis,
par un nombre fini d’applications d’opérations régulières.
Mais nous allons reformuler cette définition de façon plus formelle avant de don-
ner des exemples.
33
34
EReg(Σ) est l’ensemble des expressions définies par application des clauses in-
ductives suivantes :
a x ∈ EReg(Σ) pour tout x ∈ Σ
b ∅ ∈ EReg(Σ)
c Si α ∈ EReg(Σ) et β ∈ EReg(Σ), alors (α + β) ∈ EReg(Σ)
d Si α ∈ EReg(Σ) et β ∈ EReg(Σ), alors (α.β) ∈ EReg(Σ)
e Si α ∈ EReg(Σ) alors (α∗ ) ∈ EReg(Σ)
EReg(Σ) est l’ensemble des expressions définies par application des clauses in-
ductives suivantes :
a x ∈ EReg(Σ) pour tout x ∈ Σ
b ∅ ∈ EReg(Σ)
c Si L ∈ EReg(Σ) et M ∈ EReg(Σ), alors (L + M) ∈ EReg(Σ)
d Si L ∈ EReg(Σ) et M ∈ EReg(Σ), alors (L.M) ∈ EReg(Σ)
e Si L ∈ EReg(Σ) alors (L∗ ) ∈ EReg(Σ)
Une expression régulière est, littéralement, une présentation formelle d’un lan-
gage régulier : elle définit la forme (ou le motif) qui sert de modèle aux mots du
langage en question.
Ce dernier exemple est un peu plus délicat à justifier que ceux qui le précèdent :
les automates que nous étudierons par la suite permettent de calculer des expres-
sions régulières de façon plus systématique Remarque 8:
.
1. Il existe des langages sur Σ qui ne sont pas réguliers, dès que Σ 6= ∅
2. On peut construire des langages qui sont réguliers, mais pour lesquels on
ne peut pas trouver effectivement d’expression régulière
Propriété
q•e=q
q • (x × y) = (q • x) • y
quels que soient q ∈ Q, x ∈ D et y ∈ D
Remarque 9:
Les éléments de l’ensemble Q s’appellent souvent des états. Par ailleurs, il est
intéressant de considérer Q comme un alphabet : les états sont alors des symboles.
Dans ce qui suit, ces symboles sont souvent des entiers naturels avec lesquels il
faut prendre les précautions d’usage (cf section 2.1). Nous appliquerons àQtoutes
les conventions faites à propos des alphabets, par exemple, Q = 0 + 1 + 2 + 3 + 4
représente {0} + {1} + {2} + {3} + {4} = {0, 1, 2, 3, 4} et non pas la somme, au
sens arithmétique du terme !
Nous n’utilisons que les actions du monoïde (Σ∗ , ., ǫ) des mots sur un alphabet
fini Σ.
Propriété principale
Vocabulaire et convention
Nous dirons que l’application •¯ est l’action définie par • et nous la noterons
simplement • : la propriété principale nous y autorise.
Avec cette convention, la seconde condition que doit vérifier • pour être une action
est
q¯•(uv) = (q¯•u)¯•v pour tout u, v ∈ Σ∗
La vérification de cette propriété est un peu longue (voyez la démonstration
analogue qui a été faite pour la propriété principale de Σ∗ ).
La récurrence définissant l’action correspond à une procédure récursive.
38
Les égalités justifiées par 2) sont des appels récursifs. Dans la dernière expression,
tous les • ont enfin leur sens d’origine : il ne reste plus qu’à effectuer les calculs.
On éviterait les appels récursifs en remplaçant 2) par q • xu = (q • x) • u utilisable
lorsque l’on construit les mots par adjonction d’occurrences à gauche : ceci est
évidemment correct et peut quelquefois se montrer intéressant.
Exemple 18 Lorsque l’on fait agir le monoïde (Σ∗ , ., ǫ) sur l’ensemble Σ∗ lui-
même (cf. l’exemple précédent), l’action naturelle est la concaténation Σ∗ × Σ
La propriété principale est importante car elle permet de donner de bonnes re-
présentations d’une action • de (Σ∗ , ., ǫ) sur un ensemble Q :
— L’action • peut se définir par une table sur laquelle on reporte la valeur
de q • x à l’intersection de la ligne q ∈ Q et de la colonne x ∈ Σ : cette
table est finie lorsque Q l’est (ce que nous supposerons définitivement un
peu plus bas).
— Le graphe de transition est une représentation géométrique dont la lecture
est plus immédiate (du moins, lorsque Q et Σ n’ont pas trop d’éléments).
Ce graphe est constitué de nœuds et d’arêtes étiquetés :
— un nœud q pour chaque q ∈ Q
— une arête de q ver r pour chaque q ∈ Q, chaque x ∈ Σ et r = q • x.
Exemple 19 On pose Σ = a + b et Q = 0 + 1 + 2 + 3 + 4
Remarquez qu’il n’est pas nécessaire de préciser l’orientation d’une arête dont
l’origine et l’extrémité sont confondues. Une autre convention consiste à coller
plusieurs étiquettes sur une arête pour en représenter plusieurs de même origine
et même extrémité
E. Kouokam - Support de Langages formels & Compilation - 2022-2023 —-> Langages réguliers et automates
3.2.1 Bases
Dans cette section, nous introduisons le modèle le plus simple d’automate fini :
l’automate déterministe complet. Ce modèle nous permet de définir les notions
de calcul et de langage associé à un automate. Nous terminons cette section en
définissant la notion d’équivalence entre automates, ainsi que la notion d’utilité
d’un état.
Un automate fini correspond à un graphe orienté, dans lequel certains des noeuds
(états) sont distingués et marqués comme initial ou finaux et dans lequel les arcs
(transitions) sont étiquetés par des symboles de Σ. Une transition est donc un
triplet de Q × Σ × Q. Si δ(q, a) = r on dit que a est l’étiquette de la transition
(q; a; r) ; q en est l’origine, et r la destination.
Les automates admettent une représentation graphique, comme celle de la figure
3.1. Dans cette représentation, l’état initial 0 est marqué par un arc entrant sans
origine et les états finaux (ici l’unique état final est 2) par un arc sortant sans
destination. La fonction de transition correspondant à ce graphe s’exprime ma-
triciellement par le graphe de la figure 3.2 : Un calcul dans l’automate A est une
Un calcul dans A est réussi si la première transition a pour état d’origine l’état
initial, et si la dernière transition a pour destination un des états finaux. Le
langage reconnu par l’automate A, noté L(A), est l’ensemble des étiquettes
des calculs réussis. Dans l’exemple précédent, le mot baab appartient au langage
reconnu, puisqu’il étiquette le calcul (réussi) : (0, b, 0), (0, a, 1), (1, a, 2), (2, b, 2).
L(A) = {u ∈ Σ∗ | δ ∗ (q0 , u) ∈ F }
Nous avons pour l’instant plutôt vu l’automate comme une machine permettant
de reconnaître des mots. Il est également possible de le voir comme un système
de production : partant de l’état initial, tout parcours conduisant à un état fi-
nal construit itérativement une séquence d’étiquettes par concaténation des éti-
quettes rencontrées le long des arcs.
Si chaque automate fini reconnaît un seul langage, la réciproque n’est pas vraie :
plusieurs automates peuvent reconnaître le même langage. Comme pour les ex-
pressions rationnelles, on dira dans ce cas que les automates sont équivalents.
Ainsi, par exemple, l’automate de la figure 3.4 est-il équivalent à celui de la fi-
gure 3.1 : tous deux reconnaissent le langage de tous les mots qui contiennent un
nombre de a congru à 2 modulo 3.
Nous l’avons noté plus haut, δ ∗ est définie pour tout mot de Σ∗ . Ceci implique
que l’algorithme de reconnaissance (par exple l’algorithme 1) demande exacte-
ment |u| étapes de calcul, correspondant à une exécution complète de la boucle.
Ceci peut s’avérer particulièrement inefficace, comme dans l’exemple de l’auto-
mate de la figure 3.5, qui reconnaît le langage ab{a, b}∗ . Dans ce cas en effet, il
est en fait possible d’accepter ou de rejeter des mots en ne considérant que les
deux premiers symboles.
La différence avec la définition 1 est que δ est ici définie comme une fonction
partielle. Son domaine de définition est un sous-ensemble de Q × Σ. Selon cette
nouvelle définition, il est possible de se trouver dans une situation où un calcul
s’arrête avant d’avoir atteint la fin de l’entrée. Ceci se produit dès que l’automate
E. Kouokam - Support de Langages formels & Compilation - 2022-2023 —-> Langages réguliers et automates
atteint une configuration (q, au) pour laquelle il n’existe pas de transition d’ori-
gine q étiquetée par a.
— Un état q de A est dit accessible s’il existe u dans Σ∗ tel que δ ∗ (q0 , u) = q.
q0 est trivialement accessible (par u = ǫ). Un automate accessible est un
automate dont tous les états sont accessibles.
— Un état q de A est dit co-accessible s’il existe u dans Σ∗ tel que δ ∗ (q, u) ∈ F .
Tout état final est trivialement co-accessible (par u = ǫ). Un automate co-
accessible est un automate dont tous les états sont co-accessibles.
— Un état q de A est dit utile s’il est à la fois accessible et co-accessible. Un
automate émondé (en anglais trim automaton) est un automate dont
tous les états sont utiles.
Les états utiles sont donc les états qui servent dans au moins un calcul réussi :
on peut les atteindre depuis l’état initial, et les quitter pour un état final. Les
autres états, les états inutiles, ne servent pas à grand’chose, en tout cas pas au
peuplement de L(A). C’est précisément ce que montre le théorème suivant.
ThéorËme 1 (Émondage).
Si L(A) 6= ∅ est un langage reconnaissable, alors il est également reconnu par un
automate émondé.
Non-déterminisme
Définition 6 (Automate fini non-déterministe).
Un automate fini non-déterministe (NFA) est défini par un quintuplet A = (Σ, Q, I, F, δ)
où :
— Σ est un ensemble fini de symboles (l’alphabet)
— Q est un ensemble fini d’états
— I ⊂∈ Q est l’état initial
— F ⊂ Q sont les états finaux
— δ ⊂ Q × Σ × Q est une relation, chaque triplet (q, a, q ′) ∈ δ est une
transition.
La nouveauté introduite par cette définition est l’indétermination qui porte sur
les transitions : pour une paire (q, a), il peut exister dans A plusieurs transitions
possibles. On parle, dans ce cas, de non-déterminisme, signifiant qu’il existe
des états dans lesquels la lecture d’un symbole a dans l’entrée provoque un choix
(ou une indétermination) et que plusieurs transitions alternatives sont possibles.
Pour qu’un mot appartienne au langage reconnu par l’automate, il suffit qu’il
existe, parmi tous les calculs possibles, un calcul réussi, c’est-à-dire un calcul qui
consomme tous les symboles de u entre un état initial et un état final ; la recon-
naissance n’échoue donc que si tous les calculs aboutissent à une des situations
46
d’échec. Ceci implique que pour calculer l’appartenance d’un mot à un langage, il
faut examiner successivement tous les chemins possibles, et donc éventuellement
revenir en arrière dans l’exploration des parcours de l’automate lorsque l’on ren-
contre une impasse. Dans ce nouveau modèle, le temps de reconnaissance d’un
mot n’est plus linéaire, mais proportionnel au nombre de chemins dont ce mot
est l’étiquette, qui peut être exponentiel en fonction de la taille de l’entrée.
L’automate de la figure 3.8 ayant 4 états, son déterminisé en aura donc 16,
E. Kouokam - Support de Langages formels & Compilation - 2022-2023 —-> Langages réguliers et automates
Nous allons ensuite montrer que tout calcul dans A correspond à exactement
un calcul dans A’, soit formellement que :
48
OPERATION DESCRIPTION
ǫ-fermeture(e) Ensemble des états de l’AFN accessibles depuis l’état e de
l’AFN par des ǫ-transitions uniquement
i-e ǫ − f ermeture(e) = {p ∈ Q | (e, ǫ) ⊢∗A (p, ǫ)}
ǫ-fermeture(T) Ensemble des états de l’AFN accessibles depuis un état e
appartenant à T par des ǫ-transitions uniquement
i-e ǫ − f ermeture(T ) = {p ∈ Q | ∀e ∈ T, (e, ǫ) ⊢∗A (p, ǫ)}
Transiter(T,a) Ensemble des états de l’AFN vers lesquels il existe une
transition sur le symbole d’entrée a à partir d’un état e
appartenant à T
Table 3.1 – Opérations sur les états d’un AFN
Démonstration
En posant A = (Σ, Q, q0 , F, δ), on construit A′ = (Σ, Q, q0 , F ′ , δ ′) avec
— F ′ = {q ∈S Q| ǫ − f ermeture(q) ∩ F 6= ∅}
— δ ′ (q, a) = p∈ǫ−f ermeture(q) δ(p, a)
On déduit directement un algorithme constructif pour supprimer, à nombre d’états
constant, les transitions spontanées. Appliqué à l’automate de la figure 3.11, cet
algorithme construit l’automate représenté à la figure 3.12.
construit de telle sorte que D simulera "en parallèle" tous les déplacements pos-
sibles que N peut effectuer sur une chaîne d’entrée donnée.
Un algorithme simple pour calculer ǫ-fermeture(T) utilise une pile pour conserver
les états dont les transitions sur ǫ n’ont pas encore été examinées. L’algorithme
3 suivant présente une telle procédure.
Corrigé: Nous présentons une preuve constructive, mais notez que le résultat
découle directement des deux résultats précédents et de la loi de de Morgan
L1 ∩ L2 = L1 ∪ L2
Soit L1 et L2 deux langages reconnaissables, reconnus respectivement par A1 et
A2 , deux AFD complets. On construit un automate A′ = (Σ, Q = Q1 ×Q2 , q0 , F, δ)
pour L1 ∩ L2 de la manière suivante :
— q0 = (q01 , q02 )
— F = (F1 × Q2 ) ∪ (Q1 × F2 )
— δ((q1 , q2 ), a) = (δ1 (q1 , a), δ2 (q2 , a))
La construction de l’automate intersection est identique à celle de l’automate
réalisant l’union, à la différence près qu’un calcul réussi dans A doit ici réussir
simultanément dans les deux automates A1 et A2 . Ceci s’exprime dans la nouvelle
définition de l’ensemble F des états finaux comme : F = (F1 , F2 ).
ThéorËme 7 (Clôture par miroir).
Les langages reconnaissables sont clos par miroir.
Corrigé: Soit L un langage reconnaissable, reconnu par A = (Σ, Q, q0 , F, δ), et
n’ayant qu’un unique état final, noté qF . A’, défini par A′ = (Σ, Q, qF , {q0 }, δ ′ ), où
δ ′ (q, a) = p si et seulement si δ(p, a) = q reconnaît exactement le langage miroir de
L. A’ est en fait obtenu en inversant l’orientation des arcs de A : tout calcul de A
énumérant les symboles de u entre q0 et qF correspond à un calcul de A’ énumérant
uR entre qF et q’. On notera que même si A est déterministe, la construction ici
proposée n’aboutit pas nécessairement à un automate déterministe pour le miroir.
ThéorËme 8 (Clôture par concaténation).
Les langages reconnaissables sont clos par concaténation.
Corrigé: Soient L1 et L2 deux langages reconnus respectivement par A1 et A2 ,
où l’on suppose que les ensembles d’états Q1 et Q2 sont disjoints et que A1 a un
unique état final de degré extérieur nul (aucune transition sortante). On construit
l’automate A pour L1 L2 en identifiant l’état final de A1 avec l’état initial de A2 .
Formellement on a A = (Σ, Q = Q1 ∪ Q2 {q02 }, q01 , F2 , δ) où δ est défini par :
— ∀q ∈ Q1 , q 6= qF , a ∈ Σ, δ(q, a) = δ1 (q, a)
— δ(q, a) = δ2 (q, a) si q ∈ Q2
— δ(qF 1 , a) = (δ1 (qF , a) ∪ δ2 (q02 , a))
Tout calcul réussi dans A doit nécessairement atteindre un état final de A2 et
pour cela préalablement atteindre l’état final de A1 , seul point de passage vers
les états de A2 . De surcroît, le calcul n’emprunte, après le premier passage dans
q1F , que des états de A2 : il se décompose donc en un calcul réussi dans chacun
des automates.
Réciproquement, un mot de L1 L2 se factorise sous la forme u = vw, v ∈ L1 et w ∈
L2 . Chaque facteur correspond à un calcul réussi respectivement dans A1 et dans
A2 , desquels se déduit immédiatement un calcul réussi dans A.
54
En application de cette section, vous pourrez montrer (en construisant les auto-
mates correspondants) que les langages reconnaissables sont aussi clos pour les
opérations de préfixation, suffixation, pour les facteurs, les sous-mots...
Figure 3.13 – AFD pour ∅ Figure 3.14 – Automate pour ǫ Figure 3.15 – AFD pour {a}
manière itérative des automates pour des expressions rationnelles plus complexes.
Si A1 et A2 sont les automates de Thompson de e1 et e2 , alors l’automate de la
figure 3.16 reconnaît le langage dénoté par l’expression e1 + e2 .
Cette construction simple produit un automate qui a 2n états pour une expres-
sion formée par n opérations rationnelles autres que la concaténtation (car toutes
les autres opérations rajoutent exactement deux états) ; chaque état de l’auto-
mate possède au plus deux transitions sortantes. Cependant, cette construction a
le désavantage de produire un automate non-déterministe, contenant de multiples
transitions spontanées. Il existe d’autres procédures permettant de traiter de ma-
E. Kouokam - Support de Langages formels & Compilation - 2022-2023 —-> Langages réguliers et automates
nière plus efficace les expressions ne contenant pas le symbole ǫ (par exemple la
construction de Gloushkow) ou pour construire directement un automate.
L’opération cruciale de cette méthode est celle qui consiste à supprimer l’état
qi , où qi n’est ni initial, ni final. On suppose qu’il y a au plus une transition entre
deux états : si ça n’est pas le cas, il est possible de se ramener à cette configu-
ration en prenant l’union des transitions existantes. On note eii l’étiquette de la
transition de qi vers qi si celle-ci existe ; si elle n’existe pas on a simplement eii = ǫ.
Vous noterez que le résultat obtenu dépend de l’ordre selon lequel les états sont
examinés.
Théorème de Kleene
Nous avons montré comment construire un automate correspondant à une
expression rationnelle et comment dériver une expression rationnelle dénotant un
langage équivalent à celui reconnu par un automate fini quelconque. Ces deux
résultats permettent d’énoncer un des résultats majeurs de ce chapitre.
assez long, il contient un facteur différent de ǫ qui peut être itéré à volonté tout
en restant dans L. En d’autres termes, les mots "longs" de L sont construits par
répétition d’un facteur s’insérant à l’intérieur de mots plus courts.
Remarque 10:
: le lemme est aussi vérifié pour de nombreux langages non-rationnels : il n’ex-
prime donc qu’une condition nécessaire (mais pas suffisante) de rationalité.
Ce lemme permet, par exemple, de prouver que le langage des carrés parfaits
défini par L = {u ∈ Σ∗ , ∃v tel que u = v 2 } n’est pas un langage rationnel. En
effet, soit p l’entier spécifié par le lemme de pompage et s un mot plus grand
que 2p : s = tt avec |t| ≥ k. Il est alors possible d’écrire s = xyz, avec |xy| ≥ p.
Ceci implique que xy est un préfixe de t, et t un suffixe de w. Pourtant, xy i z doit
également être dans L, alors qu’un seul des t est affecté par l’itération : ceci est
manifestement impossible.
Une manière simple d’exprimer cette limitation intrinsèque des langages ration-
nels se fonde sur l’observation suivante : dans un automate, le choix de l’état
successeur pour un état q ne dépend que de q, et pas de la manière dont le cal-
cul s’est déroulé avant q. En conséquence, un automate fini ne peut gérer qu’un
nombre fini de configurations différentes, ou, dit autrement, possède une mémoire
bornée. C’est insuffisant pour un langage tel que le langage des carrés parfaits
pour lequel l’action à conduire (le langage à reconnaître) après un préfixe u dé-
pend de u tout entier : reconnaître un tel langage demanderait en fait un nombre
infini d’états.
Corrigé:
i ⇒ ii : A étant rationnel, il existe un AFD A qui le reconnaît. La relation d’équi-
valence ≡A ayant autant de classes d’équivalence qu’il y a d’états, ce nombre est
nécessairement fini. Cette relation est bien invariante à droite, et L, défini comme
{u ∈ Σ∗ δ(q0 ; u) ∈ F , est simplement l’union des classes d’équivalence associées
aux états finaux de A.
ii ⇒ iii : Soit ≡ la relation satisfaisant la propriété ii, et u et v tels que u ≡ v. Par
la propriété d’invariance droite, on a pour tout mot w dans Σ∗ , uw ≡ vw. Ceci
entraîne que soit uw et vw sont simultanément dans L (si leur classe d’équiva-
lence commune est un sous-ensemble de L), soit tout deux hors de L (dans le cas
contraire). Il s’en suit que u ≡L v : toute classe d’équivalence pour ≡ est incluse
dans une classe d’équivalence de ≡L , il y a donc moins de classes d’équivalence
pour ≡L que pour ≡, ce qui entraîne que le nombre de classes d’équivalence de
≡L est fini.
iii ⇒ i : Construisons l’automate A = (Σ, Q, q0 , F, δ) suivant :
— chaque état de Q correspond à une classe d’équivalence [u]L de ≡L , d’où
il s’en suit que Q est fini.
— q0 = [ǫ]L , classe d’équivalence de ǫ
— F = {[u]L , u ∈ L}
— δ([u]L , a) = [ua]L . Cette définition de δ est indépendante du choix d’un
représentant de [u]L : si u et v sont dans la même classe pour ≡L , par
invariance droite de ≡L , il en ira de même pour ua et va.
A ainsi défini est un automate fini déterministe et complet. Montrons maintenant
que A reconnaît L et pour cela, montrons par induction que (q0 , u) ⊢A [u]L .
Cette propriété est vraie pour u = ǫ, supposons la vraie pour tout mot de taille
inférieure à k et soit u = va de taille k + 1. On a (q0 , ua) ⊢A (p, a) ⊢A (q, ǫ). Or,
par l’hypothèse de récurrence on sait que p = [u]L ; et comme q = δ([u]L , a), alors
q = [ua]L , ce qui est bien le résultat recherché. On déduit que si u est dans L(A),
un calcul sur l’entrée u aboutit dans un état final de A, et donc que u est dans
L. Réciproquement, si u est dans L, un calcul sur l’entrée u aboutit dans un état
[u]L , qui est, par définition de A, final.
Ce résultat fournit une nouvelle caractérisation des langages reconnaissables et
peut donc être utilisé pour montrer qu’un langage est, ou n’est pas, reconnais-
i
sable. Ainsi, par exemple, L = {u ∈ Σ∗ | ∃a ∈ Σ, i ∈ N tq. u = a2 } n’est
64
i j i
pas reconnaissable. En effet, pour tout i, j, a2 et a2 sont distingués par a2 . Il
n’y a donc pas un nombre fini de classes d’équivalence pour ≡L , et L ne peut
en conséquence être reconnu par un automate fini. L n’est donc pas un langage
rationnel.
Corrigé:
Soit A un automate fini déterministe reconnaissant L. ≡A définit une relation
d’équivalence satisfaisant les conditions de l’alinéa ii de la preuve du théorème
15 présenté ci-dessus. Nous avons montré que chaque état de A correspond à une
classe d’équivalence (pour ≡A ) incluse dans une classe d’équivalence pour ≡L .
Le nombre d’états de A est donc nécessairement plus grand que celui de AL.
Le cas où A et AL ont le même nombre d’états correspond au cas où les classes
d’équivalence sont toutes semblables, permettant de définir une correspondance
biunivoque entre les états des deux machines.
Montrons maintenant que Φ est une bijection. Ceci se déduit de la suite d’équiva-
Φ([q]v ) = Φ([p]v ) ⇔ ∃u, v ∈ Σ∗ , δ ∗ (q0 , u) = q, δ ∗ (q0 , u) = p et u ≡L v
lences suivante : ⇔ δ ∗ (q0 , u) ≡v δ ∗ (q0 , u)
⇔ [q]v = [p]v
Montrons enfin que les calculs dans Av sont en bijection par Φ avec les calculs de
AL . On a en effet :
— P hi([q0 ]v ) = [ǫ]L car δ ∗ (q0 , ǫ) = q0 ∈ [q0 ]v
— P hi(δ([q]v , a)) = δL (P hi([q]v , a) car soit u tel que δ ∗ (q0 , u) ∈ [q]v , alors
(i)δ(δ ∗ (q0 , u), a) ∈ δv (qv , a) (cf. la définition de δv ) et [ua]L = P hi(δ([q]v , a)) =
δL ([u], a) (cf. la définition de δL ), ce qu’il fallait prouver.
— si [q]v est final dans Av , alors il existe u tel que δ ∗ (q0 , u) soit un état final
de A, impliquant que u est un mot de L, et donc que [u]L est un état final
de l’automate canonique.
Il s’en suit que chaque calcul dans Av est isomorphe (par Φ) à un calcul dans
AL , puis, que ces deux automates ayant les mêmes états initiaux et finaux, ils
reconnaissent le même langage.
3.5.3 Minimisation
L’idée de l’algorithme de minimisation de l’automate déterministe A = (Σ, Q, q0 , F, δ)
consiste alors à chercher à identifier les classes d’équivalence pour ≡v , de manière
à dériver l’automate Av (alias AL ). La finitude de Q nous garantit l’existence d’un
algorithme pour calculer ces classes d’équivalence. La procédure itérative décrite
ci-dessous esquisse une implantation naïve de cet algorithme, qui construit la
partition correspondant aux classes d’équivalence par raffinement d’une partition
initiale Π0 qui distingue simplement états finaux et non-finaux.
Cet algorithme se glose comme suit :
— Initialiser avec deux classes d’équivalence : F et Q F
— Itérer jusqu’à stabilisation :
— pour toute paire d’état q et p dans la même classe de la partition Πk ,
s’il existe a ∈ Σ tel que δ(q, a) et δ(p, a) ne sont pas dans la même
classe pour Πk , alors ils sont dans deux classes différentes de Πk+1 .
On vérifie que lorsque cette procédure s’arrête (après un nombre fini d’étapes),
deux états sont dans la même classe si et seulement si ils sont indistinguables.
66