Mots, langages et Automates

Transcription

Mots, langages et Automates
Bruno Mery (Doctorant, LaBRI bureau 123, [email protected])
Université de Bordeaux, année 2007-2008
Informatique Théorique 1
INF154T Groupe CSB5A2
Travaux Dirigés
Mots, langages et Automates
1
Mots et expressions rationelles
Rappels
– Notation : on notera conventionellement a, b, c . . . (éventuellement
avec un ou plusieurs indices i) les lettres d’un alphabet, généralement
noté A.
– De même, on notera u, v, w . . . (éventuellement indicés) les mots d’un
alphabet A, c’est-à-dire composés d’un nombre fini (éventuellement
nul) de lettres de A, et on note u = a1 . . . an pour définir un mot, |u| = n
pour définir sa longueur, |u|ai = k pour dire que le mot u comporte
k fois la lettre ai , u ∈ A∗ pour déterminer que u est un mot fini de
l’alphabet A.
– On note ε le mot vide, ou mot de longueur nulle, qui est l’élément neutre
pour la concaténation (εu = uε = u, ∀u).
– Pour un ensemble A donné, l’adjonction d’une astérisque en exposant se prononce ”A étoile de Kleene”, et on a par définition A∗ =
S
∗
i
0≤i<+∞ A (un élément de A est donc bien un k-uple avec k ∈ N
d’éléments de A, et donc une séquence d’éléments de A).
– Un langage de mots sur l’alphabet A est un élément L ∈ P(A∗ ) – autrement dit, un ensemble de mots sur cet alphabet.
– Une expression rationnelle e décrivant un langage sur l’alphabet A est
définie inductivement comme suit :
– soit e est réduite à une lettre, auquel cas elle représente le mot composé de cette lettre (e = a ∈ A),
1
– soit e est la concaténation de deux expressions e0 et e00 , et elle
représente les mots qui sont la concaténation de deux expressions
(e.g. e = ab, (a, b) ∈ A2 : le mot ab de longueur 2),
– soit e est l’union de deux expressions e0 et e00 , auquel cas elle
représente l’ensemble des mots représentés par e0 ou e00 (e.g. e =
u + v : le mot u et le mot v),
– soit e est l’étoile de Kleene d’une expression e0 , auquel cas elle
représente l’ensemble des mots représentés par e0 autant de fois
que souhaité (y compris aucune). Par exemple, a∗ est l’ensemble
{ε, a, aa, aaa, . . .}.
– Exemples :
– a(a + b)∗ b est l’ensemble des mots de {a, b}∗ commençant par a et
finissant par b.
– ((a + b)(a + b))∗ est l’ensemble des mots de {a, b}∗ de longueur
paire.
– A∗ uA∗ est l’ensemble des mots de A∗ ayant u pour facteur.
Exercice 1 Soit A = {a, b, c}. Donner des expressions rationelles pour chacun des langages suivants :
1. L’ensemble des mots de A∗ qui comptent au moins une fois la lettre a
2. L’ensemble des mots de A∗ qui ne commencent pas par la lettre a.
3. L’ensemble des mots de A∗ contenant au moins un a et un b, tels que
la première occurrence de a précède la première occurrence de b.
Corrigé 1
1. A∗ aA∗
2. (b + c)A∗
3. c∗ a(a + c)∗ bA∗
2
2
Automates déterministes
Rappels
– Les Automates sont une classe de formalismes permettant de
modéliser divers phénomènes, dont certains langages.
– Ici, on parlera d’automates d’états finis (c’est-à-dire représentables avec
un nombre fini d’états), définis par rapport à un alphabet A.
– Un automate A est défini par une collection d’états Q = {q0 , q1 . . .}, et
un ensemble de transitions sur ces états T = {t0 ,t1 , . . .}.
– On distingue, dans Q, des états que l’on qualifie d’initiaux, et des états
que l’on qualifie de terminaux (rien ne s’oppose à ce qu’un état initial
soit aussi terminal.
– Une transition t associe un état q (dit ”de départ”) à un état q0 (dit
”d’arrivée”), et est étiquetée par une lettre a ∈ A.
– Un automate A est dit déterministe quand, pour tout état q, il n’y a au
plus qu’une transition émanant de cet état et étiquetée par une même
lettre a ∈ A. Dans un automate déterministe, il n’y a qu’un et un seul
état initial.
– Un automate déterministe est complet quand, pour tout état q, il y a
exactement une transition étiquetée par chacune des lettres de A.
– Un mot u de A∗ est reconnu par l’automate fini déterministe A s’il
existe un chemin reliant un état initial à un état terminal, dont les
étiquettes des transitions sont constituées par les lettres du mot u
(dans le même ordre).
– Le langage reconnu par l’automate A est l’ensemble des mots reconnus par A .
– Un langage L est reconnaissable s’il existe un automate fini déterministe
qui le reconnaisse.
– Ces formalités mises à part, un automate est surtout représenté par
un graphe, dans lequel les états sont des nœuds et les transitions, des
arcs. On signale les états initiaux par une double flèche entrante, les
terminaux par une double flèche sortante, et on peu optionellement
étiqueter les états.
3
Exercice 2 Donner une expression rationelle représentant les langages reconnus par chacun des automates suivants :
F IG . 1 – Un automate
F IG . 2 – Un autre automate
Corrigé 2
1. Fig. 1 : (ab)∗ (b + aa + ε)
2. Fig. 2 : (ab) + (aba + b)a(aa)∗
Exercice 3 Donner, pour chaque langage sur A = {a, b, c} donné par les
expressions rationelles suivantes, un automate fini déterministe qui le reconnaisse :
1. (a + b)∗ ca∗
2. A∗ (b + c)
3. A∗ aA∗ bA∗
Corrigé 3 Voir figure 3. Penser au déterminisme des automates obtenus. . .
4
F IG . 3 – Les automates de l’exercice 3
Exercice 4 Donner des automates finis déterministes sur {a, b} reconnaissant les langages. . .
1. l’ensemble des mots de longueur paire,
2. l’ensemble des mots se terminant par a,
3. l’ensemble des mots contenant au plus une occurrence de la lettre a,
4. l’ensemble des mots contenant au moins deux occurrences de leur
dernière lettre,
5. l’ensemble des mots ayant pour préfixe aba,
6. l’ensemble des mots ayant pour suffixe aba,
7. l’ensemble des mots ayant pour facteur aba,
8. l’ensemble des mots comportant un nombre pair de a et un nombre
impair de b.
Corrigé 4 Les automates des 1, 2 et 3 sont donnés en Fig. 4. Le 4 (le plus
long et délicat, sans dessin. . . ) peut être décrit comme suit : un état initial,
un état ”a”, un état ”b”, un état ”ab”, un état ”bb” (final), un état ”aa”
(final), un état ”abb” (final), un état ”aab” (final), un état ”aabb” (final).
Transitions : a de initial vers ”a”, b de initial vers ”b”, a de ”a” vers ”aa”, b
5
de ”a” vers ”ab”, a de ”b” vers ”ab”, b de ”b” vers ”bb”, boucle a sur ”aa”,
transition b de ”aa” vers ”aab”, a de ”ab” vers ”aab”, b de ”ab” vers ”abb”,
a de ”bb” vers ”abb”, boucle b sur ”bb”, boucle a sur ”aab”, transition b
de ”aab” vers ”aabb”, boucle b sur ”abb”, transition a de ”abb” à ”aabb”,
boucles a et b sur ”aabb” (ouf). Les automates 5, 6, 7 sont donnés Fig. 5
(le corps est similaire, les conditions préfixe-suffixe-facteur influent sur les
retours autorisés). Enfin, l’automate 8 est donné Fig. 6 : il suffit de conserver
en mémoire simultanément le nombre de a modulo 2 et le nombre de b
modulo 2.
F IG . 4 – Premiers automates de l’exercice 4
6
F IG . 5 – Exercice 4 : préfixe, suffixe, facteur
F IG . 6 – Exercice 4 : pair / impair
7
3
Quelques algorithmes sur les automates
Rappels
– Compléter un automate déterministe :
– Pour compléter un automate déterministe, s’il n’est pas déjà complet, il suffit de rajouter un état (non final, non initial) ”puits”, ne
comportant aucune transition sortante mis à part une boucle pour
chaque lettre de l’alphabet concerné, et vers lequel on envoie toutes
les transitions ”manquantes”.
– Intersection de langages reconnaissables :
– Soient L1 , L2 des langages sur A∗ reconnus respectivement par les
automates finis déterministes complets A1 et A2 . Alors L1 ∩ L2 est
reconnaissable, par l’automate produit A1 × A2 .
– A1 × A2 est construit comme suit : les états sont des couples d’états
(q, r) où les q sont des états de A1 et r, des états de A2 . Les états
initiaux sont les couples d’états respectivement initiaux dans les
deux automates, de même pour les états finaux.
– Il y a une transition de (q, r) à (q0 , r0 ) par la lettre ai dans l’automate
produit si, et seulement si, il y a une transition de q à q0 et de r à r0
par la même lettre ai dans les automates de départ.
– Des simplifications sont possibles (notamment dans le cas des états
”puits”).
– Automates non déterministes avec ε-transitions :
– Un automate non déterministe est analogue d’un automate déterministe,
à la différence près qu’un état peut posséder plusieurs transitions
sortantes étiquetées par une même lettre, et peut avoir plusieurs
états initiaux. Il peut également utiliser des transitions étiquetées
par ε, qui doivent se comprendre comme ”on peut passer d’un état
à un autre sans consommer de lettre”.
– Théorème de Kleene : les langages qui sont reconnus par des automates à états finis non déterministes avec ε-transitions sont aussi
reconnus par des automates à états finis déterministes complets,
et représentables par des expressions rationnelles (les réciproques
sont vraies). On appelle cette classe de langage langages rationnels
(ou parfois langages réguliers).
– Déterminisation d’un automate :
– Le processus de déterminisation d’un automate fini non-déterministe
consiste à construire, pas à pas, l’ensemble des états et l’ensemble
des transitions de l’ (d’un) automate fini déterministe équivalent.
– Le principe est le suivant : pour chaque état de l’automate non
8
déterministe, on repère la classe d’états accessible par un ensemble
de transitions étiquetées par la même lettre, qui formera un état
dans l’automate déterministe ; on identifie ensuite les transitions
nécessaires à la reproduction du comportement de l’automate de
départ.
– Plus précisément, soit une classe d’états représentant Q0 l’ensemble
des états initiaux qinit1 , qinit2 , . . . : ce sera l’état initial du nouvel
automate. Soit ensuite la classe Q0:a qui regroupe l’ensemble des
états accessibles depuis les états initiaux par toutes les transitions
étiquetées par a. C’est un état du nouvel automate, et on a une transition (unique) partant de Q0 , dirigée sur Q0:a , étiquetée par a. On
répète pour toutes les lettres de l’alphabet concerné.
– Par la suite, on ré-itère ce procédé pour tous les nouvelles classes
d’états que l’on définit, jusqu’à obtenir un ensemble de classes,
et de transitions entre ces classes, qui soit stable. On distingue et
confond les classes suivant leur comportement face à la réception
des lettres. . . Les états finaux sont les classes dont un membre était
final dans l’automate de départ.
– On peut prouver par induction que cette procédure termine en
O(2n ), pour un automate non déterministe de n états.
– Union de langages reconnaissables :
– Soit deux langages reconnaissables par deux automates finis
déterministes A1 et A2 .
– Alors l’union des deux langages est reconnue par l’automate fini
non déterministe A1+2 , construit en prenant l’union des deux automates, avec pour états initiaux les états initiaux de chacun des automates de départ, et un unique état final, nouveau, accessible depuis
chacun des anciens états finaux par des ε-transitions (construction
triviale).
– Alors cette même union des langages est aussi reconnaissable par
un automate fini déterministe, formé par la déterminisation de
A1+2 .
9
Exercice 5 Complèter les automates suivants (sur A = {a, b, c}). À quelles
expressions rationnelles correspondent-ils ?
(Voyez les figures 7, 8 et 9.)
F IG . 7 – Automate 1/3, exercice 5
F IG . 8 – Automate 2/3, exercice 5
10
F IG . 9 – Automate 3/3, exercice 5
Corrigé 5 Dessins sur commande (peu fondamentaux). Il s’agit simplement de rajouter un état puits, avec une boucle a, b, c et aucune autre transition sortante, et d’y faire arriver les quelques transitions manquantes. En
1 : a et c depuis l’état du bas et celui du haut, a, b, c pour le central ; en
2 : c de tous les états et a, b, c de l’état final ; en 3 : a, c de l’état en bas à
gauche, b, c de l’état en haut à droite. Des expressions représentant ces langages sont : pour 1, (a + b + c)b, pour 2 : (a(ba)∗ a + b(ab)∗ b)b∗ a, pour 3 :
((aa + bb)∗ cc∗ (a + b))∗ (aa + bb)∗ cc∗ . La complétation1 est instantanée et peu
utile en pratique, sauf pour la résolution de l’exercice suivant.
Exercice 6 Soit A un automate fini déterministe complet. Pour le manipuler, on dispose des primitives initial(A), renvoyant l’état q0 initial, final(q) qui renvoit vrai quand l’état q est final, apply(q, a) qui,
en appliquant la transition étiquetée par la lettre a à l’état q, renvoie l’état
d’arrivée. Considérons un mot u donné sous la forme d’un tableau u[0],
u[1]... de longueur n.
Donner alors un algorithme recon(A, u, n) qui renvoie vrai si le
mot u de longueur n est reconnu par l’automate A , faux sinon.
Quelle est sa complexité (selon n) en temps ? en espace ?
1 Si
quelqu’un dispose d’un synonyme correct pour rendre complet qui ne fasse pas
référence au complément, je suis preneur.
11
Corrigé 6 Avec une définition récursive :
recon(A, u, n) = apply_w(initial(A), u, n)
apply_w(q, u, n) =
if n=0 final(q)
else apply_w(apply(q, u[0]), &u[1], n-1)
(Où &u[1] est le mot u pris à partir de la deuxième lettre.) La complexité
est de O(n) en temps, O(1) en espace, quel que soit l’automate (qui, lui,
occupe une complexité de Kolmogorov de O(|Q| + |T |)). On peut faire les
démonstrations par induction si nécessaire.
Exercice 7 Le miroir d’un mot u est le mot composé des mêmes lettres,
écrites en ordre inverse de celles de u. En supposant que le langage L est
reconnaissable par un automate fini déterministe complet A et que ce dernier dispose d’un unique état final, donner (l’idée d’) une méthode pour
construire un automate reconnaissant l’ensemble des miroirs des mots de L
(le langage miroir de L). Dans le cas général, le langage miroir d’un langage
reconnaissable est-il reconnaissable ?
Corrigé 7 Idée de procédure : on échange l’état final et l’état initial, puis
on inverse les directions des transitions constructives (i.e., toutes sauf celles
menant à un état ”puits”). Il y a des précisions à apporter pour que cette
construction soit déterministe (des problèmes avec les transitions entrantes
étiquetées par la même lettre). . . L’important est que, dans le cas général,
cela marche aussi, mais peut donner des automates non déterministes (en
particulier à plusieurs états initiaux) : il suffit alors de déterminiser le
résultat.
Exercice 8 Pour chacune des paires d’automates suivantes (sur A = {a, b}),
construire un automate fini déterministe reconnaissant l’intersection des
langages définis au départ. Donner ensuite une expression rationelle correspondant à cet automate.
(Voyez les figures 10, 11 et 12.)
12
F IG . 10 – Automate 1/3, exercice 8
F IG . 11 – Automate 2/3, exercice 8
13
F IG . 12 – Automate 3/3, exercice 8
Corrigé 8 Procédure graphique. L’idée est d’appliquer directement l’algorithme donné dans les rappels, en envoyant les transitions surnuméraires
sur un unique état puits (qu’on peut éventuellement supprimer à la fin) ;
on a des automates qui disposent de paires des états des automates initiaux (penser à numéroter les automates avant. . . ). Expressions rationelles
correspondant : 1 : aaba, 2 : a + ab + ba (les mots comportant exactement
un a et au plus un b), 3 : beaucoup trop complexe dans ce cadre (mots de
longueur paire comportant obligatoirement le facteur aaa et plus aucun a
après ce facteur). Automates représentés en Fig. 13, 14 et 15.
14
F IG . 13 – Automate 1, Exercice 8
F IG . 14 – Automate 2, Exercice 8
15
F IG . 15 – Automate 3, Exercice 8
16
Exercice 9 Pour chacun des automates non déterministes suivants (sur
A = {a, b}), appliquer la procédure de déterminisation2 : (Voyez les figures
16, 17 et 18.)
F IG . 16 – Automate 1/3, exercice 9
2 Telle
quelle, sans optimisations. Il est fortement conseillé d’étiqueter les états avant de
commencer !
17
F IG . 17 – Automate 2/3, exercice 9
18
F IG . 18 – Automate 3/3, exercice 9
19
Corrigé 9 L’idée est d’appliquer mécaniquement l’algorithme de déterminisation,
pour s’y familiariser. Je donne le tableau de construction des états et transitions à chaque fois. . . (en supposant les états d’origine numérotés) :
1 : Mise en bouche, on pourrait remarquer que A∗ aA∗ aA∗ est rigoureusement équivalente à b∗ ab∗ aA∗ .
0
(0, 1)
(0, 1, 2)
a
(0, 1)
(0, 1, 2)
(0, 1, 2)
b
0
(0, 1)
(0, 1, 2)
Voir Fig. 19.
F IG . 19 – Automate 1, Exercice 9
2 : Moins immédiat mais assez rapide.
0
(0, 1)
(2, 3)
(0, 3)
(0, 1, 3)
a
(0, 1)
(0, 1)
(0, 3)
(0, 1, 3)
(0, 1, 3)
20
b
(2, 3)
(2, 3)
F IG . 20 – Automate 2, Exercice 9
Voir Fig. 20.
3 : Volontairement abscons. On a ici des ε-transitions fondamentalement inutiles (on traite cela en posant que tout ensemble d’états comprenant 4 ou 5 contient aussi 6), deux états de départ, et il est plus facile de
visualiser quoi que ce soit sur l’automate de départ que celui d’arrivée
(qui n’est pas du tout minimal). Le langage est ((aa + bb)A∗ ab(a + b))∗ (aa +
bb)A∗ ab.
(0, 1)
2
3
(4, 6)
(5, 6)
(6, 7)
6
(6, 8)
(6, 7, 0, 1)
(6, 0, 1)
(6, 7, 2)
(6, 8, 3)
(6, 3)
(6, 7, 4)
(6, 1, 5)
a
2
(4, 6)
(6, 7)
(6, 7)
(6, 7)
(6, 7)
(6, 7, 0, 1)
(6, 7, 2)
(6, 7, 2)
(6, 7, 4)
(6, 7, 0, 1)
(6, 7)
(6, 7)
(6, 7)
b
3
(5, 6)
6
6
(6, 8)
6
(6, 0, 1)
(6, 8, 3)
(6, 3)
(6, 8)
(6, 1, 5)
(6, 5)
(6, 8)
(6, 3)
(Note : les classes d’états sont des ensembles, donc (6, 5) et (5, 6) représentent
la même classe.) Voir Fig. 21.
21
F IG . 21 – Automate à ne pas dessiner souvent. . .
22
Exercice 10 Pour chaque expression rationnelle (sur A = {a, b}), construire
un automate déterministe correspondant, éventuellement en construisant
d’abord un automate non déterministe.
1. ba + (a + bb)a∗ b
2. (bb + a)∗ (aa + b)∗
3. (aa)∗ + (aaa)∗
4. (aa + bb + (ab + ba)(aa + bb)∗ (ab + ba))∗
Corrigé 10 Dans certains cas, il est plus rapide de faire l’union de plusieurs automates et de déterminiser le résultat. C’est le cas pour le premier (qui est assez simple). . . Pour le troisième, il suffit de conserver en
mémoire simultanément la longueur du mot modulo 2 et 3 (ce qui nécessite
6 états), et il est beaucoup plus rapide de concevoir directement un automate déterministe pour le dernier cas (l’union des sous-parties ne posant
pas de problèmes).
Le deuxième automate est le plus long à réaliser. On peut explorer
toutes les possibilités par un automate non déterministe (en donnant des
transitions avec a si on suppose qu’on se trouve dans la première partie, a
si on se suppose dans la deuxième, etc.), et déterminiser le résultat : c’est
long. On peut aussi déterminer les motifs qui ne sont pas dans le langage
(bab, baaa, . . . ), faire un automate et donner le complémentaire. Ou encore
avoir la bonne intuition directement.
Exemples de corrections en Fig. 22, 23, 24, 25.
23
F IG . 22 – Automate 1, Exercice 10
F IG . 23 – Automate 2, Exercice 10
24
F IG . 24 – Automate 3, Exercice 10
F IG . 25 – Automate 4, Exercice 10
25
4
Interlude : exemples concrets
Les automates finis, déterministes ou non, sont certes un moyen
de représenter graphiquement une certaine classe de langages. Plus
concrètement, il s’agit également d’une forme de machines d’états finis, servant à modéliser de nombreuses situations pour formaliser une intelligence
artificielle élémentaire (cas d’un ennemi de jeu vidéo des années 90, Fig. 26),
ou pour mettre sur le papier un protocole de communication (cas d’un protocole élémentaire d’un serveur, Fig. 27). En général, on utilisera des formalismes plus spécialisés (transducteurs, réseaux de Pétri, ou formalismes
dédiés comme UML. . . ), mais les automates sont un bon point de départ –
à ceci près qu’il n’y a généralement pas d’état final à proprement parler, les
mécanismes devant théoriquement fonctionner en boucle sauf interruption
manuelle. Plus prosaı̈quement, on utilise aussi souvent les automates pour
reconnaı̂tre certains motifs comme :
– une adresse email valide (pour un formulaire en ligne),
– une somme supérieure ou égal à un certain prix, exprimée en pièces
de différentes valeurs (pour un distributeur),
– un score correct de match de rugby (pour un tableau de scores),
– etc.
F IG . 26 – Routine gérant un personnage de jeu – les états donnent le comportement du personnage, les lettres sont les actions possibles du joueur.
26
F IG . 27 – Boucle principale, schématisée, d’un serveur. Les états sont les
actions en cours, les lettres sont les commandes reçues.
Exercice 11 Donner un pseudo-automate modélisant le processus (très
simplifié) d’attribution d’un marché public : lorsqu’un besoin se fait sentir, un projet est déposé, sur lequel l’autorité compétente reçoit un certain
nombre de candidatures, fait connaı̂tre son choix à une certaine date, et
charge le lauréat de la réalisation concrète.
Corrigé 11 Simple suggestion : états ”attente” (l’autorité est à l’écoute des
besoins) avec boucle, transition ”besoin” (un besoin a été signalé) vers un
état ”projet” (un appel à projets est lancé, avec les contraintes de réalisation
et une limite de temps), qui dispose d’une boucle ”dépôt de candidatures”
et d’une transition ”date limite” (on atteint le temps limite) vers un état
”réalisation” (le projet retenu est réalisé, s’il y en a un), qui dispose d’une
transition ”fin” vers l’état ”attente”.
Exercice 12 Donner un automate validant le format des adresses postales
simples (numéro voie, code postal ville) sur l’alphabet A = Aa ∪ An ∪ {, }, Aa
étant l’ensemble des lettres classiques (y compris majuscules, accents. . . et
les caractères point et espace), An , l’ensemble des chiffres.
27
Corrigé 12 Il suffit d’implémenter l’expression rationnelle A∗n A∗a , (A, )∗ A∗n A∗a
(la partie entre parenthèses est destinée aux options du type ”résidence,
escalier, appartement, boı̂te postale. . . ” et est optionnelle).
28
5
Minimisation d’un automate déterministe
Rappels
– Un théorème du cours (revu plus loin) précise, entre autres, que, pour
tout automate fini reconnaissant le langage L, il existe un automate
fini déterministe complet reconnaissant le même langage L tel que le
nombre d’états soit minimal. On appel cet automate l’automate minimal
reconnaissant L ; il est unique à isomorphisme près3 .
– La construction de l’automate minimal d’un langage peut se faire à
partir d’un automate fini déterministe complet existant, selon une
méthode qui analogue à l’algorithme de déterminisation.
– Cette méthode consiste à dégager des classes d’états équivalents du
point de vue de la reconnaissance du langage, c’est-à-dire dont la fusion ne changera pas la production de l’automate.
– On procède par raffinements successifs :
– au départ, on distingue deux classes d’états : les états terminaux et
les autres.
– Ensuite, à chaque étape, on choisit une lettre a de l’alphabet et une
classe K = {q, . . .}. On partitionne K suivant la classe cible par a.
(Par exemple, supposons qu’à la première étape nous ayons 0, 1, 2
comme états non terminaux, 3, 4 comme états terminaux, et que a
envoie 0 sur 1, 1 sur 1 et 2 sur 3 dans l’automate de départ ; alors, à
la deuxième étape, on distinguera les classes {0, 1}, {2} et {3, 4}.)
– On itère le procédé pour chaque lettre et chaque classe, jusqu’à
ce que ces dernières soient stables. L’automate est alors minimisé,
l’état initial est celui qui comporte l’état initial de départ, les états
terminaux sont ceux qui comportent un des états terminaux de
départ.
Exercice 13 Minimiser à la volée les automates suivants (sur A={a, b})
(Fig. 28, 29, 30) :
3 C’est-à-dire
que les états peuvent avoir différentes étiquettes, être placés
différemment. . . mais qu’il s’agira toujours du même automate du point de vue de sa
matrice de transitions.
29
F IG . 28 – Automate à minimiser 1/3
F IG . 29 – Automate à minimiser 2/3
30
F IG . 30 – Automate à minimiser 3/3
Corrigé 13 On aura reconnu, sous d’habiles déguisements, le langage
AA∗, le langage des mots de longueur paire, et le langage des mots ayant
aaa pour suffixe. Dans les deux premiers cas, la minimisation est directe (il
n’y a que deux états correspondant aux terminaux et non-terminaux), dans
le dernier, il y a quelques étapes (pour un total de 5 états, dont un puits).
31
6
Propriétés des langages rationnels
Rappels
– La classe des langages rationelle est close par les opérations suivantes : complément, étoile de Kleene, concaténation, union, intersection, différence, miroir, image par un homomorphisme. Autrement
dit, si on construit un langage à partir de langages rationnels et de
ces opérations, il sera aussi rationnel ; par contraposée, si un langage
non rationnel est réalisé à partir d’une de ces opérations, alors un des
langages de départ n’était pas rationnel non plus.
– Lemme d’Arden : il existe une méthode pour résoudre certaines
équations sur les langages rationnels. Notamment pour X = A · X ∪ B,
avec A, B deux langages rationnels, la solution est unique : X = A∗ · B.
– Lemme de pompage (ou lemme de l’étoile, pumping lemma. . . ) : soit L
un langage rationnel. Alors il existe un entier N pour lequel, pour tout
mot u ∈ L tel que u ≥ N, u puisse s’écrire xvy (où x, v, y sont respectivement préfixe, facteur et suffixe de u), avec v 6= ε, et tel que xv ∗ y ∈ L.
Autrement dit, à partir d’une certaine longueur, un motif se répète (ce
qui est normal : un automate à états finis ne peut produire des mots
de longueur arbitraire qu’avec des boucles ou retour en arrière). Ce
lemme permet, par contraposée, de prouver qu’un langage n’est pas
rationnel, en prouvant qu’un tel nombre ne peut exister.
– Résidus (ou résiduels) d’un langage : le résidu d’un langage L pour un
mot u donné est le langage formé de l’ensemble des v tels que uv ∈ L.
On le note u−1 L, ou parfois L(u). L’ensemble des résidus de L pour
l’alphabet A est l’ensemble des u−1 L pour u ∈ A∗ .
– Théorème de Myhill-Nerode : un langage L est reconnaissable si et seulement s’il n’a qu’un nombre fini de résidus distincts.
– Le théorème de Myhill-Nerode permet de justifier la minimisation
des automates. Le nombre d’états de l’automate minimal d’un langage L est le nombre de ses résidus distincts.
– Ce théorème a deux applications : utiliser les résidus pour calculer
directement l’automate minimal d’un langage à partir d’une description ou d’une expression rationnelle (voir le cours d’Anne Dicky), et
surtout prouver, par contraposée, qu’un langage n’est pas rationnel
(il suffit de donner un ensemble infini de résidus distincts).
32
Exercice 14 (Difficile sans le cours.) Prouver que les langages suivants ne
sont pas rationnels :
1. {ww, w ∈ L, L rationnel et infini}
2. {an bn cn , n ∈ N}
3. {u ∈ {a, b, c}∗ /|u|a = |u|b = |u|c }
4. {a p , p premier}
Corrigé 14 (On peut utiliser le cours d’Anne Dicky pour avoir des idées
plus précises sur la démarche à suivre.)
1. (Presque immédiat.) Myhill-Nerode : soit u un mot de L. Alors u−1 L =
{u}. L étant un langage infini, il y a une infinité de résidus distincts
pour le langage, il n’est pas rationnel (et il en sera de même pour tous
les langages à copie).
2. (Inspiré de {an bn }.) Myhill-Nerode : examinons les résidus du langage pour abc, aabbc, . . . an bn c : ils forment la suite {ε}, {c}, {cc}, . . . , {cn }
qui sont deux à deux distincts. Il existe donc un nombre infini de
résidus distincts pour le langage (et il en sera de même pour tous les
langages à compteurs).
3. (Proche du cours.) Clôture : si le langage était rationnel, alors son
intersection avec a∗ b∗ c∗ , {an bn cn } le serait aussi, ce qui est faux (vu
plus haut).
4. (Cours.) Lemme de pompage : Supposons a p décomposable en xvy
avec v 6= ε et xv∗ y ⊆ L. Alors, pour p suffisamment grand, ∃q = |x| +
|y|/, ∀n ≥ 0, q+n(p−q) = |xvn y|premier. Ainsi on aurait q+(1+ p)(p−q)
un nombre premier, or cette expression est décomposable en p(1+ p−
q) : contradiction, a p n’est pas décomposable de cette manière, donc
n’est pas rationnel.
33
7
Automates et langages : exercices bonus
Exercice 15 Simplifier (factoriser) les expressions rationelles suivantes :
1. ((a + aab)∗ + (a + aaa)∗ )∗
2. (ab + ba)(abb + bab)
3. a∗ + (aba + baa + aab + abb + aaa + bba + bab + bbb)
Corrigé 15
1. (a(ab + ε)∗
2. (ab + ba)2 b
3. a∗ + A3
Exercice 16 Pour chacun des langages L définis par les expressions rationnelles suivantes, donner un automate reconnaissant A∗ − L (pour A =
{a, b}) :
1. a
2. (aba)∗
3. (ab + ba + a∗ bbb)∗
Corrigé 16 Pas de dessins cette fois ci. La construction est simple : soit un
automate fini déterministe complet : tout mot de A∗ donne un calcul dans
cet automate qui s’achève sur un état donné. Si cet état est terminal, le mot
appartient au langage reconnu par l’automate, sinon, non. Pour avoir les
mots du langage complémentaire, il suffit donc d’inverser les rôles : les
anciens terminaux de l’automates sont non terminaux, les anciens non terminaux sont terminaux. La construction est donc : construire un automate
déterministe pour L, le complèter, inverser états terminaux et non terminaux pour obtenir un automate reconnaissant A∗ − L (trivial en 1, facile en
2, plus long en 3).
Exercice 17 Les langages suivants sont-ils rationnels ? Justifier.
1. a∗ b∗
2. {an , n ≥ 0}
3. {an bam , n, m ≥ 0}
4. {an ban , n ≥ 0}
34
5. Le langage des mots comportant un nombre pair de a et un nombre
impair de b.
6. Le langage des mots pour lesquels a et b n’ont pas la même parité.
7. Le langage des mots n’ayant pas le même nombre de a que de b.
Corrigé 17
1. Oui (il s’agit d’une expression rationnelle).
2. Oui (c’est a∗ ).
3. Oui (c’est a∗ ba∗ ).
4. Non (Myhill-Nerode avec (an b) comme motif : on exhibe {an−1 } en
tant que résidu paramétré par n non borné).
5. Oui (on peut construire un automate à quatre états : 00, 01, 10, 11, initial en 00, final en 01, etc.).
6. Oui (même automate avec 01 et 10 comme terminaux).
7. Non. Intermédiaire : prouver par Myhill-Nerode que le langage
{an bm , n 6= m} n’est pas rationnel (résidu pour an : {b∗ } − {bn }, puis
clôture par intersection avec a∗ b∗ .
35