Académique Documents
Professionnel Documents
Culture Documents
Notes de Cours
26 Septembre 2016
(rev. 427418d)
Avertissement au lecteur
Ces notes documentent le cours de thorie des langages enseign dans le cadre
de la BCI dinformatique. Elles sont, malgr nos efforts (et ceux de plusieurs g-
nrations dtudiants qui nous ont aid lamliorer, en dernier lieu A. Amarilli),
encore largement perfectibles et probablement non-exemptes derreurs. Merci de
bien vouloir signaler toute erreur, de syntaxe (un comble !) ou autre, aux auteurs
(yvon@limsi.fr, akim@lrde.epita.fr, pierre@senellart.com).
2
Chapitre 1
I Notes de Cours 9
2 Mots, Langages 11
2.1 Quelques langages rels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.1 La compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.2 Bio-informatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.1.3 Les langues naturelles . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2 Terminologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.1 Bases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.2 Quelques notions de calculabilit . . . . . . . . . . . . . . . . . . . . . . 14
2.3 Oprations sur les mots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.1 Facteurs et sous-mots . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.2 Quotient de mots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3.3 Ordres sur les mots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3.4 Distances entre mots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3.5 Quelques rsultats combinatoires lmentaires . . . . . . . . . . . . . . 19
2.4 Oprations sur les langages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.4.1 Oprations ensemblistes . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.4.2 Concatnation, toile de Kleene . . . . . . . . . . . . . . . . . . . . . . 21
TABLE DES MATIRES
4 Automates finis 31
4.1 Automates finis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1.1 Bases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1.2 Spcification partielle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.1.3 tats utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.1.4 Automates non-dterministes . . . . . . . . . . . . . . . . . . . . . . . . 37
4.1.5 Transitions spontanes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.2 Reconnaissables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.2.1 Oprations sur les reconnaissables . . . . . . . . . . . . . . . . . . . . . 45
4.2.2 Reconnaissables et rationnels . . . . . . . . . . . . . . . . . . . . . . . . 48
4.3 Quelques proprits des langages reconnaissables . . . . . . . . . . . . . . . . 53
4.3.1 Lemme de pompage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.3.2 Quelques consquences . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.4 Lautomate canonique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.4.1 Une nouvelle caractrisation des reconnaissables . . . . . . . . . . . . 55
4.4.2 Automate canonique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.4.3 Minimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5 Grammaires syntagmatiques 63
5.1 Grammaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.2 La hirarchie de Chomsky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.2.1 Grammaires de type 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.2.2 Grammaires contextuelles (type 1) . . . . . . . . . . . . . . . . . . . . . 66
4
TABLE DES MATIRES
5
TABLE DES MATIRES
II Annexes 151
6
TABLE DES MATIRES
17 Bibliographie 183
18 Index 185
7
TABLE DES MATIRES
8
Premire partie
Notes de Cours
Chapitre 2
Mots, Langages
Lobjectif de ce chapitre est de fournir une introduction aux modles utiliss en informatique
pour dcrire, reprsenter et effectuer des calculs sur des squences finies de symboles. Avant
dintroduire de manire formelle les concepts de base auxquels ces modles font appel (
partir de la section 2.2), nous prsentons quelques-uns des grands domaines dapplication
de ces modles, permettant de mieux saisir lutilit dune telle thorie. Cette introduction
souligne galement la filiation multiple de ce sous-domaine de linformatique thorique dont
les principaux concepts et outils trouvent leur origine aussi bien du ct de la thorie des
compilateurs que de la linguistique formelle.
2.1.1 La compilation
proccupe, en particulier, de vrifier que les expressions arithmtiques sont bien formes,
que les blocs de programmation ou les constructions du langages sont respectes... Comme
chacun en a fait lexprience, tous les programmes ne sont pas syntaxiquement corrects,
gnrant des messages de plainte de la part des compilateurs. Lensemble des programmes
corrects dans un langage de programmation tel que Pascal ou C est donc galement un sous-
ensemble particulier de toutes les squences finies que lon peut former avec les atomes du
langage.
En fait, la tche de lanalyseur syntaxique va mme au-del de ces contrles, puisquelle vise
mettre en vidence la structure interne des squences de symboles quon lui soumet. Ainsi
par exemple, un compilateur dexpression arithmtique doit pouvoir analyser une squence
telle que Var + Var Var comme Var + (Var Var), afin de pouvoir traduire correctement le
calcul requis.
Trois problmes majeurs donc pour les informaticiens : dfinir la syntaxe des programmes
bien forms, discriminer les squences datomes respectant cette syntaxe et identifier la
structuration interne des programmes, permettant de dterminer la squence dinstructions
excuter.
2.1.2 Bio-informatique
12
2.2. TERMINOLOGIE
Par langue naturelle, on entend tout simplement les langues qui sont parles (parfois aussi
crites) par les humains. Les langues humaines sont, de multiples niveaux, des systmes
de symboles :
les suites de sons articules pour changer de linformation sanalysent, en dpit de la
variabilit acoustique, comme une squence linaire unidimensionnelle de symboles
choisis parmi un inventaire fini, ceux que lon utilise dans les transcriptions phon-
tiques. Toute suite de sons nest pas pour autant ncessairement une phrase articulable,
encore moins une phrase comprhensible ;
les systmes dcriture utilisent universellement un alphabet fini de signes (ceux du
franais sont des symboles alphabtiques) permettant de reprsenter les mots sous la
forme dune suite linaire de ces signes. L encore, si tout mot se reprsente comme
une suite de lettres, la rciproque est loin dtre vraie ! Les suites de lettres qui sont des
mots se trouvent dans les dictionnaires 1 ;
si lon admet, en premire approximation, que les dictionnaires reprsentent un nombre
fini de mots, alors les phrases de la langue sont aussi des squences dlments pris
dans un inventaire fini (le dictionnaire, justement). Toute suite de mots nest pas une
phrase grammaticalement correcte, et toutes les phrases grammaticalement correctes
ne sont pas ncessairement comprhensibles.
Sattaquer au traitement informatique des noncs de la langue naturelle demande donc, de
multiples manires, de pouvoir distinguer ce qui est de la langue de ce qui nen est pas.
Ceci permet par exemple denvisager de faire ou proposer des corrections. Le traitement
automatique demande galement didentifier la structure des noncs ( o est le sujet ? ,
o est le groupe verbal ? ...) pour vrifier que lnonc respecte des rgles de grammaire
( le sujet saccorde avec le verbe ) ; pour essayer de comprendre ce que lnonc signifie :
le sujet du verbe est ( lactif) lagent de laction ; voire pour traduire dans une autre langue
(humaine ou informatique !). De nombreux problmes du traitement des langues naturelles
se modlisent comme des problmes de thorie des langages, et la thorie des langages doit
de nombreuses avances aux linguistes formels.
2.2 Terminologie
2.2.1 Bases
tant donn un ensemble fini de symboles , que lon appelle lalphabet, on appelle mot toute
suite finie (ventuellement vide) dlments de . Par convention, le mot vide est not ;
certains auteurs le notent 1, voire 1 . La longueur dun mot u, note |u|, correspond au nombre
total de symboles de u (chaque symbole tant compt autant de fois quil apparat). Bien
1. Pas toutes : penser aux formes conjugues, aux noms propres, aux emprunts, aux nologismes, aux argots. . .
13
CHAPITRE 2. MOTS, LANGAGES
entendu, || = 0. Autre notation utile, |u|a compte le nombre total doccurrences du symbole
a dans le mot u. On a naturellement : |u| = a |u|a .
P
Lensemble de tous les mots forms partir de lalphabet (resp. de tous les mots non-vides)
est not ? (resp. + ). Un langage sur est un sous-ensemble de ? .
Lopration de concatnation de deux mots u et v de ? rsulte en un nouveau mot uv, constitu
par la juxtaposition des symboles de u et des symboles de v. On a alors |uv| = |u| + |v| et
une relation similaire pour les dcomptes doccurrences. La concatnation est une opration
interne de ? ; elle est associative, mais pas commutative (sauf dans le cas dgnr o
ne contient quun seul symbole). est llment neutre pour la concatnation : u = u = u ;
ceci justifie la notation 1 ou encore 1 . Conventionnellement, on notera un la concatnation
de n copies de u, avec bien sr u0 = . Si u se factorise sous la forme u = xy, alors on crira
y = x1 u et x = uy1 .
? , muni de lopration de concatnation, possde donc une structure de monode (rappelons :
un monode est un ensemble muni dune opration interne associative et dun lment neutre ;
lorsquil ny a pas dlment neutre on parle de semi-groupe). Ce monode est le monode libre
engendr par : tout mot u se dcompose de manire unique comme concatnation de
symboles de .
Quelques exemples de langages dfinis sur lalphabet = {a, b, c}.
? = {, a, b, c, aa, ab, ac, ba, . . .}, soit lensemble de tous les mots composs de lettres
de ;
{, a, b, c}, soit tous les mots de longueur strictement infrieure 2 ;
{ab, aab, abb, acb, aaab, aabb, . . .}, soit tous les mots qui commencent par un a et finissent
par un b ;
{, ab, aabb, aaabbb, . . .}, soit tous les mots commenant par n a suivis dautant de b. Ce
langage est not {an bn | n 0} ;
{, abc, aabbcc, aaabbbccc, . . .}, soit tous les mots contenant n occurrences de la lettre a,
suivies de n occurrences de la lettre b, suivies dautant de fois la lettre c. Ce langage est
not {an bn cn | n 0}.
{aa, aaa, aaaaa, . . .}, tous les mots composs dun nombre premier de a.
Il existe un nombre dnombrable de mots dans ? , mais le nombre de langages dans ? est
indnombrable. Parmi ceux-ci, tous ne sont pas la porte des informaticiens : il existe, en
effet, des langages qui rsistent tout calcul, cest--dire, plus prcisment, qui ne peuvent
pas tre numrs par un algorithme.
14
2.3. OPRATIONS SUR LES MOTS
Dfinition 2.2 (Langage rcursif). Un langage L est rcursif sil existe un algorithme A qui,
prenant un mot u de ? en entre, rpond oui si u est dans L et rpond non sinon. On dit alors que
lalgorithme A dcide le langage L.
Tout langage rcursif est rcursivement numrable : il suffit, pour construire une num-
ration de L, de prendre une procdure quelconque dnumration de ? (par exemple par
longueur croissante) et de soumettre chaque mot numr lalgorithme A qui dcide L. Si la
rponse de A est oui, on produit le mot courant, sinon, on passe au suivant. Cette procdure
numre effectivement tous les mots de L. Seuls les langages rcursifs ont un rel intrt
pratique, puisquils correspondent des distinctions qui sont calculables entre mots dans L
et mots hors de L.
De ces dfinitions, retenons une premire limitation de notre savoir dinformaticien : il existe
des langages que ne nous savons pas numrer. Ceux-ci ne nous intresseront plus gure.
Il en existe dautres que nous savons dcider et qui recevront la majeure partie de notre
attention.
Au-del des problmes de la reconnaissance et de la dcision, il existe dautres types de
calculs que nous envisagerons et qui ont des applications bien pratiques dans les diffrents
domaines dapplications voqus ci-dessus :
comparer deux mots, valuer leur ressemblance
rechercher un motif dans un mot
comparer deux langages
apprendre un langage partir dexemples
...
On dit que u est un facteur de v sil existe u1 et u2 dans ? tels que v = u1 uu2 . Si u1 = (resp.
u2 = ), alors u est un prfixe (resp. suffixe) de v. Si w se factorise en u1 v1 u2 v2 . . . un vn un+1 , o
tous les ui et vi sont des mots de ? , alors v = v1 v2 . . . vn est sous-mot 2 de w. Contrairement
2. Attention : il y a ici dsaccord entre les terminologies franaises et anglaises : subword ou substring signifie
en fait facteur et cest subsequence ou scattered subword qui est lquivalent anglais de notre sous-mot.
15
CHAPITRE 2. MOTS, LANGAGES
aux facteurs, les sous-mots sont donc construits partir de fragments non ncessairement
contigus, mais dans lesquels lordre dapparition des symboles est toutefois respect. On
appelle facteur (resp. prfixe, suffixe, sous-mot) propre de u tout facteur (resp. prfixe, suffixe,
sous-mot) de u diffrent de u.
On notera |pref |k (u) (resp. |suff |k (u)) le prfixe (resp. le suffixe) de longueur k de u. Si k |u|,
|pref |k (u) dsigne simplement u.
Les notions de prfixe et de suffixe gnralisent celles des linguistes 3 : tout le monde saccorde
sur le fait que in est un prfixe de infini ; seuls les informaticiens pensent quil en va de mme
pour i, inf ou encore infi. De mme, tout le monde est daccord pour dire que ure est un suffixe
de voilure ; mais seuls les informaticiens pensent que ilure est un autre suffixe de voilure.
Un mot non-vide u est primitif si lquation u = vi nadmet pas de solution pour i > 1.
Deux mots x = uv et y = vu se dduisant lun de lautre par change de prfixe et de suffixe
sont dits conjugus. Il est facile de vrifier que la relation de conjugaison 4 est une relation
dquivalence.
Le miroir ou transpos uR du mot u = a1 . . . an , o ai , est dfini par : uR = an . . . a1 . Un mot
est un palindrome sil est gal son miroir. radar, sas sont des palindromes du vocabulaire
commun. On vrifie simplement que les prfixes de uR sont prcisment les transposs des
suffixes de u et rciproquement.
Dfinition 2.3 (Quotient droit dun mot). Le quotient droit dun mot u par le mot v, dnot
uv1 ou encore u/v , est dfini par :
si u = wv
(
w
u/v = uv 1
=
pas dfini si v nest pas un suffixe de u
Par exemple abcde(cde)1 = ab, et abd(abc)1 nest pas dfini. Il ne faut pas voir uv1 comme un
produit : v1 ne reprsente pas un mot. On peut dfinir de la mme faon le quotient gauche
de v par u : u1 v ou u\ v.
Les relations de prfixe, suffixe, facteur et sous-mot induisent autant de relations dordre
sur ? : ce sont, en effet, des relations rflexives, transitives et antisymtriques. Ainsi pourra-
t-on dire que u p v si u est un prfixe de v. Deux mots quelconques ne sont pas ncessairement
comparables pour ces relations : ces ordres sont partiels.
16
2.3. OPRATIONS SUR LES MOTS
Il est possible de dfinir des ordres totaux sur ? , la condition de disposer dun ordre total
sur .
Dfinition 2.4 (Ordre lexicographique). Lordre lexicographique sur ? not l est dfini par
u l v ssi
soit u est un prfixe de v
soit sinon u = tu0 , v = tv0 avec u0 , et v0 , , et le premier symbole de u0 prcde celui de v0
pour .
Cet ordre conduit des rsultats contre-intuitifs lorsque lon manipule des langages in-
finis. Par exemple il existe un nombre infini de prdcesseurs au mot b dans {a, b}? :
{, a, aa, ab, aaa, . . .}.
Lordre radiciel (ou ordre alphabtique, ou encore ordre militaire) utilise galement , mais
privilgie, lors des comparaisons, la longueur des chanes.
Dfinition 2.5 (Ordre radiciel). Lordre radiciel sur ? not a est dfini par u a v ssi
soit |u| |v|
soit sinon |u| = |v| et u l v
Contrairement lordre lexicographique, il sagit dun ordre bien fond : les mots plus petits
quun mot arbitraire u sont en nombre fini. Dautre part pour tout w, w0 si u a v alors
wuw0 a wvw0 , ce qui nest pas le cas pour lordre lexicographique (p.ex. : a l ab, mais
c a d >l c ab d).
On notera que les dictionaires utilisent lordre lexicographique et non celui nomm ici al-
phabtique .
Pour toute paire de mots il existe un plus long prfixe (resp. suffixe, facteur, sous-mot)
commun. Dans le cas des suffixes et prfixes, ce plus long facteur commun est de plus
unique.
Si lon note plpc(u, v) le plus long prfixe commun u et v, alors la fonction dp (u, v) dfinie
par :
dp (u, v) = |uv| 2|plpc(u, v)|
17
CHAPITRE 2. MOTS, LANGAGES
Dmonstration. Dans tous les cas, la seule proprit demandant un effort de justification est
lingalit triangulaire. Dans le cas des suffixes, elle se dmontre comme pour les prfixes.
Pour traiter le cas des facteurs et des sous-mots, il est utile de considrer les mots sous une
perspective un peu diffrente. Il est en effet possible denvisager un mot u de + comme une
fonction de lintervalle I = [1 . . . |u|] vers , qui chaque entier i associe le ie symbole de u :
u(i) = ui . toute squence croissante dindices correspond alors un sous-mot ; si ces indices
sont conscutifs on obtient un facteur.
Nous traitons dans la suite le cas des sous-mots et notons plsmc(u, v) le plus long sous-mot
commun u et v. Vrifier dm (u, w) dm (u, v) + dm (v, w) revient vrifier que :
soit encore :
|plsmc(u, v)| + |plsmc(v, w)| |v| + |plsmc(u, w)|
En notant I et J les squences dindices de [1 . . . |v|] correspondant respectivement plsmc(u, v)
et plsmc(v, w), on note tout dabord que :
On note ensuite que le sous-mot de v construit en considrant les symboles aux positions de
I J est un sous-mot de u et de w, donc ncessairement au plus aussi long que plsmc(u, w).
On en dduit donc que : |I J| |plsmc(u, w)|. Puisque, par ailleurs, on a |I J| |v|, on peut
conclure que :
|plsmc(u, w)| + |v| |I J| + |I J|
Et on obtient ainsi prcisment ce quil fallait dmontrer. Le cas des facteurs se traite de
manire similaire.
Une autre distance communment utilise sur ? est la distance ddition, ou distance de
Levenshtein, dfinie comme tant le plus petit nombre doprations ddition lmentaires
ncessaires pour transformer le mot u en le mot v. Les oprations ddition lmentaires
sont la suppression ou linsertion dun symbole. Ainsi la distance de chien chameau est-elle
de 6, puisque lon peut transformer le premier mot en lautre en faisant successivement les
oprations suivantes : supprimer i, insrer a, puis m, supprimer n, insrer a, puis u. Cette
mtamorphose dun mot en un autre est dcompose dans le tableau 2.1.
18
2.3. OPRATIONS SUR LES MOTS
De multiples variantes de cette notion de distance ont t proposes, qui utilisent des en-
sembles doprations diffrents et/ou considrent des poids variables pour les diffrentes
oprations. Pour prendre un exemple rel, si lon souhaite raliser une application qui cor-
rige les fautes de frappe au clavier, il est utile de considrer des poids qui rendent dautant
plus proches des squences quelles ne diffrent que par des touches voisines sur le clavier,
permettant dintgrer une modlisation des confusions de touches les plus probables. On
considrera ainsi, par exemple, que batte est une meilleure correction de bqtte que botte ne
lest 5 , bien que les deux mots se transforment en bqtte par une srie de deux oprations
lmentaires.
Lutilitaire Unix diff implante une forme de calcul de distances. Cet utilitaire permet de
comparer deux fichiers et dimprimer sur la sortie standard toutes les diffrences entre leurs
contenus respectifs.
x y
u v
u t y
5. Cest une premire approximation : pour bien faire il faudrait aussi prendre en compte la frquence relative
des mots proposs... Mais cest mieux que rien.
19
CHAPITRE 2. MOTS, LANGAGES
Ce rsultat est utilis pour dmontrer deux autres rsultats lmentaires, qui dcoulent de la
non-commutativit de la concatnation.
Dmonstration. Si |x| |y|, alors le rsultat prcdent nous permet dcrire directement x = yt,
ce qui, en identifiant u et y, et v t, nous permet de driver directement les galits voulues
pour k = 0.
Le cas o |x| < |y| se traite par induction sur la longueur de y. Le cas o |y| vaut 1 tant
immdiat, supposons la relation vraie pour tout y de longueur au moins n, et considrons
y avec |y| = n + 1. Il existe alors t tel que y = xt, do lon drive xtz = xxt, soit encore
tz = xt, avec |t| n. Lhypothse de rcurrence garantit lexistence de u et v tels que x = uv et
t = (uv)k u, do y = uv(uv)k u = (uv)k+1 u.
Dmonstration. Ce rsultat sobtient de nouveau par induction sur la longueur de xy. Pour
une longueur gale 2 le rsultat vaut trivialement. Supposons le valable jusqu la longueur
n, et considrons xy de longueur n + 1. Par le thorme prcdent, il existe u et v tels que
x = uv, y = (uv)k u, do on dduit : uv(uv)k u = (uv)k uuv, soit encore uv = vu. En utilisant
lhypothse de rcurrence il vient alors : u = ti , v = t j , puis encore x = ti+j et y = ti+k(i+j) , qui
est le rsultat recherch.
Linterprtation de ces rsultats est que les quations du type xy = yx nadmettent que des
solutions priodiques, cest--dire des squences qui sont construites par itration dun mme
motif de base.
Les langages tant des ensembles, toutes les oprations ensemblistes classiques leur
sont donc applicables. Ainsi, les oprations dunion, dintersection et de complmentation
(dans ? ) se dfinissent-elles pour L, L1 et L2 des langages de ? par :
L1 L2 = {u ? | u L1 ou u L2 }
L1 L2 = {u ? | u L1 et u L2 }
L = {u ? | u < L}
20
2.4. OPRATIONS SUR LES LANGAGES
On note, de nouveau, que cette opration est associative, mais pas commutative. Comme
prcdemment, litration de n copies du langage L se notera Ln , avec, par convention :
L0 = {}. Attention : ne pas confondre Ln avec le langage contenant les puissances nimes des
mots de L et qui serait dfini par {u ? | v L, u = vn }.
Lopration de fermeture de Kleene (ou plus simplement ltoile) dun langage L se dfinit par :
[
L? = Li
i0
L? contient tous les mots quil est possible de construire en concatnant un nombre fini
(ventuellement rduit zro) dlments du langage L. On notera que si est un alphabet,
? , tel que dfini prcdemment, reprsente 6 lensemble des squences finies que lon peut
construire en concatnant des symboles de . Remarquons que, par dfinition, ? nest pas
vide, puisquil (ne) contient (que) .
On dfinit galement
[
L+ = Li
i1
Dfinition 2.9 (Langage des prfixes). Soit L un langage de ? , on dfinit le langage des prfixes
de L, not Pref (L) par :
Pref (L) = {u ? | v ? , uv L}
6. Notez que, ce faisant, on identifie un peu abusivement les symboles (les lments de ) et les squences
formes dun seul symbole de .
21
CHAPITRE 2. MOTS, LANGAGES
Attention ne pas confondre cette notion avec celle des langages prfixes. On dit quun
langage L est un langage prfixe si pour tout u, v, L, u , v, on a u < Pref (v). En utilisant
un langage prfixe fini, il est possible de dfinir un procd de codage donnant lieu des
algorithmes de dcodage simples : ces codes sont appels codes prfixes. En particulier, les
codes produits par les codages de Huffman sont des codes prfixes.
Exercice 2.10. Petite application du concept : montrez que le produit de deux langages prfixes est
encore un langage prfixe.
Dfinition 2.11 (Langage des suffixes). Soit L un langage de ? , on dfinit le langage des suffixes
de L, not Suff (L) par :
Suff (L) = {u ? | v ? , vu L}
Dfinition 2.12 (Langage des facteurs). Soit L un langage de ? , on dfinit le langage des
facteurs de L, not Fac(L) par :
Fac(L) = {v ? | u, w ? , uvw L}
Le quotient droit de L par u est donc lensemble des mots de ? dont la concatnation par
u est dans L. De mme, le quotient gauche de L par u, u1 L =u\ L, est lensemble des mots
de ? qui, concatns u, produisent un mot de L.
Dfinition 2.14 (Congruence droite). Une congruence droite de ? est une relation R de ? qui
vrifie :
w, w0 ? , w R w0 u, wu R w0 u
Dfinition 2.15 (Congruence droite associe un langage L). Soit L un langage et soient
w1 , w2 deux mots tels que L/w1 = L/w2 . Il est clair, par dfinition du quotient, que lon a alors
u, L/w1 u = L/w2 u . Sen dduit une congruence droite RL naturellement associe L et dfinie par :
w1 RL w2 L/w1 = L/w2
2.4.4 Morphismes
Dfinition 2.16 (Morphisme). Un morphisme dun monode M dans un monode N est une
application telle que :
(M ) = N : limage de llment neutre de M est llment neutre de N.
(uv) = (u)(v)
22
Chapitre 3
Une premire famille de langages est introduite, la famille des langages rationnels. Cette
famille contient en particulier tous les langages finis, mais galement de nombreux langages
infinis. La caractristique de tous ces langages est la possibilit de les dcrire par des formules
(on dit aussi motifs, en anglais patterns) trs simples. Lutilisation de ces formules, connues
sous le nom dexpressions rationnelles 1 , sest impose sous de multiples formes comme la
bonne manire de dcrire des motifs reprsentant des ensembles de mots.
Aprs avoir introduit les principaux concepts formels ( la section 3.1), nous tudions
quelques systmes informatiques classiques mettant ces concepts en application.
1. On trouve galement le terme dexpression rgulire, mais cette terminologie, quoique bien installe, est
trompeuse et nous ne lutiliserons pas dans ce cours.
CHAPITRE 3. LANGAGES ET EXPRESSIONS RATIONNELS
3.1 Rationalit
Parmi les oprations dfinies dans P(? ) la section 2.4, trois sont distingues et sont
qualifies de rationnelles : il sagit de lunion, de la concatnation et de ltoile. A contrario,
notez que la complmentation et lintersection ne sont pas des oprations rationnelles. Cette
distinction permet de dfinir une famille importante de langages : les langages rationnels.
Dfinition 3.1 (Langage rationnel). Soit un alphabet. Les langages rationnels sur sont dfinis
inductivement par :
(i) {} et sont des langages rationnels
(ii) a , {a} est un langage rationnel
(iii) si L1 et L2 sont des langages rationnels, alors L1 L2 , L1 L2 , et L1 ? sont galement des langages
rationnels.
Bien entendu, dans cette dfinition inductive on na le droit qu un nombre fini dapplications
de la rcurrence (iii).
Tous les langages finis sont rationnels, puisquils se dduisent des singletons par un nombre
fini dapplications des oprations dunion et de concatnation. Par dfinition, lensemble
des langages rationnels est clos pour les trois oprations rationnelles (on dit aussi quil est
rationnellement clos).
La famille des langages rationnels correspond prcisment au plus petit ensemble de langages
qui (i) contient tous les langages finis, (ii) est rationnellement clos.
Un langage rationnel peut se dcomposer sous la forme dune formule finie, correspondant
aux oprations (rationnelles) qui permettent de le construire. Prenons lexemple du langage
sur {0, 1} contenant tous les mots dans lesquels apparat au moins une fois le facteur 111. Ce
langage peut scrire : ({0} {1})? {1}{1}{1}({0} {1})? , exprimant que les mots de ce langage
sont construits en prenant deux mots quelconques de ? et en insrant entre eux le mot 111 :
on peut en dduire que ce langage est bien rationnel. Les expressions rationnelles dfinissent un
systme de formules qui simplifient et tendent ce type de notation des langages rationnels.
Dfinition 3.2 (Expression rationnelle). Soit un alphabet. Les expressions rationnelles (RE)
sur sont dfinies inductivement par :
(i) et sont des expressions rationnelles
(ii) a , a est une expression rationnelle
(iii) si e1 et e2 sont deux expressions rationnelles, alors (e1 + e2 ), (e1 e2 ), et (e1 ? ) sont galement des
expressions rationnelles.
Une expression rationnelle est donc toute formule construite par un nombre fini dapplica-
tions de la rcurrence (iii).
24
3.1. RATIONALIT
Vcsn travaille sur des expressions rationnelles (et des automates) de types plus
gnraux. Le concept de type se nomme contexte dans Vcsn. Nous utiliserons le
contexte le plus simple, lal_char(a-z), b, qui dsigne les expressions sur lalphabet
{a, b, . . . , z} qui calculent un boolen (B). Le cryptique lal_char signifie que les
tiquettes sont des lettres (labels are letters) et que les lettres sont de simples char.
Dfinissons ce contexte.
25
CHAPITRE 3. LANGAGES ET EXPRESSIONS RATIONNELS
>>> ctx.expression((a+b+c)*)
>>> ctx.expression((a+b+c)*abc(a+b+c)*)
Dfinition 3.3 (Expressions rationnelles quivalentes). Deux expressions rationnelles sont qui-
valentes si elles dnotent le mme langage.
e e e
e e e
? ?
e+ f f +e e+ e
?
e+e e (e? ) e?
e( f + g) e f + eg (e + f )g eg + f g
(e f )? e e( f e)?
(e + f )? e? (e + f )? (e + f )? (e? + f )
?
?
(e + f )? (e? f ? ) ?
(e + f )? (e? f ) e?
En utilisant ces identits, il devient possible doprer des transformations purement syn-
26
3.2. EXTENSIONS NOTATIONNELLES
taxiques 2 qui prservent le langage dnot, en particulier pour les simplifier. Un exemple de
rduction obtenue par application de ces expressions est le suivant :
>>> ctx.expression((c+a+b+a)*+\z)
>>> ctx.expression(\e*)
Les expressions rationnelles constituent un outil puissant pour dcrire des langages simples
(rationnels). La ncessit de dcrire de tels langages tant rcurrente en informatique, ces
formules sont donc utilises, avec de multiples extensions, dans de nombreux outils dusage
courant.
Par exemple, grep est un utilitaire disponible sous UNIX pour rechercher les occurrences
dun mot(if) dans un fichier texte. Son utilisation est simplissime :
imprime sur la sortie standard toutes les lignes du fichier mon-texte contenant au moins
une occurrence du mot chaine.
En fait grep permet un peu plus : la place dun mot unique, il est possible dimprimer les
occurrences de tous les mots dun langage rationnel quelconque, ce langage tant dfini sous
la forme dune expression rationnelle. Ainsi, par exemple :
2. Par transformation syntaxique on entend une simple rcriture des mots (ici les expressions rationnelles elles-
mmes) sans devoir faire appel ce quils reprsentent. Par exemple les rgles de rcriture x + 0 ; x et 0 + x ; x
expriment syntaxiquement la neutralit de la valeur du mot 0 pour lopration reprsente par + sans connatre
ni cette valeur, ni cette opration.
27
CHAPITRE 3. LANGAGES ET EXPRESSIONS RATIONNELS
recherche (et imprime) toute occurrence dun mot du langage cha? ine dans le fichier mon-texte.
tant donn un motif exprim sous la forme dune expression rationnelle e, grep analyse le
texte ligne par ligne, testant pour chaque ligne si elle appartient (ou non) au langage ? (e)? ;
lalphabet (implicitement) sous-jacent tant lalphabet ASCII (ou encore un jeu de caractres
tendu tel que ISO Latin 1).
La syntaxe des expressions rationnelles permises par grep fait appel aux caractres * et |
pour noter respectivement les oprateurs ? et +. Ceci implique que, pour dcrire un motif
contenant le symbole *, il faudra prendre la prcaution dviter quil soit interprt comme
un oprateur, en le faisant prcder du caractre dchappement \. Il en va de mme pour
les autres oprateurs (|, (, )). . . et donc aussi pour \. La syntaxe complte de grep inclut
de nombreuses extensions notationnelles, permettant de simplifier grandement lcriture des
expressions rationnelles, au prix de la dfinition de nouveaux caractres spciaux. Les plus
importantes de ces extensions sont prsentes dans le tableau 3.2.
28
3.2. EXTENSIONS NOTATIONNELLES
Gure plus difficile, le deuxime groupe : isse, isses, t, issions, issiez, issent. Do le
nouveau motif :
Le troisime groupe est autrement complexe : disons simplement quil implique de considrer
galement les formes en usse (pour boire ou encore valoir ) ; les formes en insse (pour
venir , tenir et leurs drivs. . . ). On parvient alors quelque chose comme :
Cette expression est un peu trop gnrale, puisquelle inclut des squences comme unssiez ;
pour linstant on sen contentera. Pour continuer, revenons notre ambition initiale : chercher
des verbes. Il importe donc que les terminaisons que nous avons dfinies apparaissent bien
comme des suffixes. Comment faire pour cela ? Imposer, par exemple, que ces squences
soient suivies par un caractre de ponctuation parmi : [,;.!:?]. On pourrait alors crire :
indiquant que la terminaison verbale doit tre suivie dun des sparateurs. grep connat
mme une notation un peu plus gnrale, utilisant : [:punct:], qui comprend toutes
les ponctuations et [:space:], qui inclut tous les caractres despacement (blanc, tabu-
lation. . . ). Ce nest pas satisfaisant, car nous exigeons alors la prsence dun sparateur, ce
qui nest pas le cas lorsque le verbe est simplement en fin de ligne dans le fichier.
Nous utiliserons donc \>, qui est une notation pour lorsque celui-ci est trouv la fin dun
mot. La condition que la terminaison est bien en fin de mot scrit alors :
Dernier problme : rduire le bruit. Notre formulation est en effet toujours excessivement
laxiste, puisquelle reconnat des mots comme masse ou passions, qui ne sont pas des
formes de limparfait du subjonctif. Une solution exacte est ici hors de question : il faudrait
rechercher dans un dictionnaire tous les mots susceptibles dtre improprement dcrits par
cette expression : cest possible (un dictionnaire est aprs tout fini), mais trop fastidieux.
Une approximation raisonnable est dimposer que la terminaison apparaisse sur un radical
comprenant au moins trois lettres, soit finalement (en ajoutant galement \< qui spcifie un
dbut de mot) :
3. Loption -E donne accs toutes les extensions notationnelles.
29
CHAPITRE 3. LANGAGES ET EXPRESSIONS RATIONNELS
> grep -E \
\<[a-z]{3,}([]n?t|[iau]n?ss(e|es|ions|iez|ent))\> \
Balzac.txt
Dautres programmes disponibles sur les machines UNIX utilisent ce mme type dextensions
notationnelles, avec toutefois des variantes mineures suivant les programmes : cest le cas
en particulier de (f)lex, un gnrateur danalyseurs lexicaux ; de sed, un diteur de flux
de texte en batch ; de perl, un langage de script pour la manipulation de fichiers textes ;
de (x)emacs. . . On se reportera aux pages de documentation de ces programmes pour une
description prcise des notations autorises. Il existe galement des bibliothques permettant
de manipuler des expressions rationnelles. Ainsi, pour ce qui concerne C, la bibliothque
regexp permet de compiler des expressions rationnelles et de les excuter pour tester
la reconnaissance dun mot. Des bibliothques quivalentes existent en C++, en Java. . .
Attention Une confusion frquente viter : pour exprimer des ensembles de noms de
fichiers les shells UNIX utilisent des notations comparables, mais avec une smantique
diffrente. Par exemple, foo* dsigne les fichiers dont le nom a foo pour prfixe (comme
par exemple foo.java) et non pas ceux dont le nom appartient au langage f o(o? ).
30
Chapitre 4
Automates finis
Nous introduisons ici trs succinctement les automates finis. Pour les lecteurs intresss par
les aspects formels de la thorie des automates finis, nous recommandons particulirement
la lecture de quelques chapitres de Hopcroft et Ullman (1979), ou en franais, des chapitres
initiaux de Sakarovitch (2003). Lexpos ncessairement limit prsent dans les sections qui
suivent reprend pour lessentiel le contenu de Sudkamp (1997).
4.1.1 Bases
Dans cette section, nous introduisons le modle le plus simple dautomate fini : lautomate
dterministe complet. Ce modle nous permet de dfinir les notions de calcul et de langage
associ un automate. Nous terminons cette section en dfinissant la notion dquivalence
entre automates, ainsi que la notion dutilit dun tat.
Dfinition 4.1 (Automate fini dterministe (complet)). Un automate fini dterministe (com-
plet) (DFA, deterministic finite automaton) est dfini par un quintuplet A = (, Q, q0 , F, ), o :
est un ensemble fini de symboles (lalphabet)
Q est un ensemble fini dtats
q0 Q est ltat initial
F Q est lensemble des tats finaux
est une fonction totale de Q dans Q, appele fonction de transition.
b b b
a a
0 1 2
Dans cette reprsentation, ltat initial 0 est marqu par un arc entrant sans origine et les
tats finaux (ici lunique tat final est 2) par un arc sortant sans destination. La fonction de
transition correspondant ce graphe sexprime matriciellement par :
a b
0 1 0
1 2 1
2 0 2
Pour dfinir un automate dans Vcsn, lister ligne par ligne les transitions, avec la syn-
taxe source -> destination tiquette, tiquette.... Les tats initiaux sont
dnots par $ -> 0, et les finaux par 2 -> $.
Lautomate 4.1 scrit donc :
>>> a = vcsn.automaton(
context = "lal_char(ab), b"
$ -> 0
0 -> 0 b
0 -> 1 a
1 -> 1 b
1 -> 2 a
2 -> 2 b
2 -> 0 a
2 -> $
)
Un calcul dans A est une squence de transitions e1 . . . en de A, telle que pour tout couple
de transitions successives ei , ei+1 , ltat destination de ei est ltat origine de ei+1 . Ltiquette
dun calcul est le mot construit par concatnation des tiquettes de chacune des transitions.
Un calcul dans A est russi si la premire transition a pour tat dorigine ltat initial, et
si la dernire transition a pour destination un des tats finaux. Le langage reconnu par
lautomate A, not L(A), est lensemble des tiquettes des calculs russis. Dans lexemple
prcdent, le mot baab appartient au langage reconnu, puisquil tiquette le calcul (russi) :
(0, b, 0)(0, a, 1), (1, a, 2)(2, b, 2).
32
4.1. AUTOMATES FINIS
Cette notation met en vidence lautomate comme une machine permettant de reconnatre
des mots : tout parcours partant de q0 permet de consommer un un les symboles du mot
reconnatre ; ce processus stoppe lorsque le mot est entirement consomm : si ltat ainsi
atteint est final, alors le mot appartient au langage reconnu par lautomate.
On drive un algorithme permettant de tester si un mot appartient au langage reconnu par
un automate fini dterministe.
La complexit de cet algorithme dcoule de lobservation que chaque tape de calcul cor-
respond une application de la fonction (), qui elle-mme se rduit la lecture dune
case dun tableau et une affectation, deux oprations qui seffectuent en temps constant. La
reconnaissance dun mot u se calcule en exactement |u| tapes.
Dfinition 4.2 (Langage reconnaissable). Un langage est reconnaissable sil existe un automate
fini qui le reconnat.
Dans Vcsn, un automate peut-tre vu comme une fonction qui calcule un boolen
reprsentant lappartenance du mot au langage de lautomate :
>>> a(baab)
>>> a(a)
>>> a.shortest(10)
Lautomate 4.3 est un exemple trs similaire au premier. Ltat 0 est la fois initial et final.
Il reconnat le langage correspondant aux mots u tels que |u|a est divisible par 3 : chaque
33
CHAPITRE 4. AUTOMATES FINIS
b b b
a a
0 1 2
tat correspond une valeur du reste dans la division par 3 : un calcul russi correspond
ncessairement un reste gal 0 et rciproquement.
Par un raisonnement similaire celui utilis pour dfinir un calcul de longueur quelconque,
il est possible dtendre rcursivement la fonction de transition en une fonction ? de
Q ? Q par :
? (q, ) = q
? (q, au) = ? ((q, a), u)
On notera que, puisque est une fonction totale, ? est galement une fonction totale : limage
dun mot quelconque de ? par ? est toujours bien dfinie, i.e. existe et est unique. Cette
nouvelle notation permet de donner une notation alternative pour le langage reconnu par
un automate A :
L(A) = {u ? | ? (q0 , u) F}
Nous avons pour linstant plutt vu lautomate comme une machine permettant de recon-
natre des mots. Il est galement possible de le voir comme un systme de production : partant
de ltat initial, tout parcours conduisant un tat final construit itrativement une squence
dtiquettes par concatnation des tiquettes rencontres le long des arcs.
Si chaque automate fini reconnat un seul langage, la rciproque nest pas vraie : plusieurs
automates peuvent reconnatre le mme langage. Comme pour les expressions rationnelles,
on dira dans ce cas que les automates sont quivalents.
Dfinition 4.3 (Automates quivalents). Deux automates finis A1 et A2 sont quivalents si et
seulement sils reconnaissent le mme langage.
Ainsi, par exemple, lautomate 4.4 est-il quivalent lautomate 4.1 : tous deux reconnaissent
le langage de tous les mots qui contiennent un nombre de a congru 2 modulo 3.
b b b
a a b
0 1 2 3
a
a
Nous lavons not plus haut, ? est dfinie pour tout mot de ? . Ceci implique que lalgo-
rithme de reconnaissance (algorithme 4.2) demande exactement |u| tapes de calcul, corres-
pondant une excution complte de la boucle. Ceci peut savrer particulirement inefficace,
34
4.1. AUTOMATES FINIS
comme dans lexemple de lautomate 4.5, qui reconnat le langage {ab}{a, b}? . Dans ce cas en
effet, il est en fait possible daccepter ou de rejeter des mots en ne considrant que les deux
premiers symboles.
a, b
2
b a, b
a
a b
0 1 3
Pour contourner ce problme et pouvoir arrter le calcul aussi tt que possible, nous introdui-
sons dans cette section des dfinitions alternatives, mais qui savrent en fait quivalentes,
des notions dautomate et de calcul.
Dfinition 4.4 (Automate fini dterministe). Un automate fini dterministe est un quintuplet
A = (, Q, q0 , F, ), o :
est un ensemble fini de symboles (lalphabet)
Q est un ensemble fini dtats
q0 Q est ltat initial
F Q sont les tats finaux
est une fonction partielle de Q dans Q
La diffrence avec la dfinition 4.1 est que est ici dfinie comme une fonction partielle. Son
domaine de dfinition est un sous-ensemble de Q . Selon cette nouvelle dfinition, il est
possible de se trouver dans une situation o un calcul sarrte avant davoir atteint la fin de
lentre. Ceci se produit ds que lautomate atteint une configuration (q, au) pour laquelle il
nexiste pas de transition dorigine q tiquete par a.
La dfinition 4.4 est en fait strictement quivalente la prcdente, dans la mesure o les
automates partiellement spcifis peuvent tre complts par ajout dun tat puits absorbant
les transitions absentes de lautomate original, sans pour autant changer le langage reconnu.
Formellement, soit A = (, Q, q0 , F, ) un automate partiellement spcifi, on dfinit A0 =
(, Q0 , q00 , F0 , 0 ) avec :
Q0 = Q {qp }
q00 = q0
F0 = F
q Q, a , 0 (q, a) = (q, a) si (q, a) existe, 0 (q, a) = qp sinon.
a , 0 (qp , a) = qp
35
CHAPITRE 4. AUTOMATES FINIS
Ltat puits, qp , est donc celui dans lequel on aboutit dans A0 en cas dchec dans A ; une fois
dans qp , il est impossible datteindre les autres tats de A et donc de rejoindre un tat final.
Cette transformation est illustre pour lautomate 4.6, dont le transform est prcisment
lautomate 4.5, ltat 2 jouant le rle de puits.
a, b
a b
0 1 3
Exercice 4.5 (BCI-0506-1). On dit quun langage L sur ? est local sil existe I et F deux sous-
ensembles de et T un sous-ensemble de 2 (lensemble des mots sur de longueur 2) tels que
L = (I? ? F) \ (? T? ). En dautres termes, un langage local est dfini par un ensemble fini de
prfixes et de suffixes de longueur 1 (I et F) et par un ensemble T de facteurs interdits de longueur
2. Les langages locaux jouent en particulier un rle important pour infrer un langage L partir dun
ensemble dexemples de mots de L.
1. Montrer que le langage L1 dnot par aa? est un langage local ; que le langage L2 dnot par
ab(ab)? est un langage local. Dans les deux cas, on prendra = {a, b}.
2. Montrer que le langage L3 dnot par aa? + ab(ab)? nest pas local.
3. Montrer que lintersection de deux langages locaux est un langage local ; que lunion de deux
langages locaux nest pas ncessairement un langage local.
4. Montrer que tout langage local est rationnel.
5. On considre maintenant que = {a, b, c}. Soit C lensemble fini suivant C = {aab, bca, abc}.
Proposer et justifier une construction pour lautomate reconnaissant le plus petit (au sens de
linclusion) langage local contenant tous les mots de C. Vous pourrez, par exemple, construire
les ensembles I, F et T et en dduire la forme de lautomate.
6. On rappelle quun morphisme est une application de ? 1
vers ?
2
telle que (i) () = et
?
(ii) si u et v sont deux mots de 1 , alors (uv) = (u)(v). Un morphisme lettre--lettre est
induit par une injection de 1 dans 2 , et est tendu rcursivement par (au) = (a)(u).
Par exemple, pour (a) = (b) = x, (c) = y on a (abccb) = xxyyx.
36
4.1. AUTOMATES FINIS
Montrer que tout langage rationnel L est limage par un morphisme lettre--lettre dun langage
local L0 .
Indication : Si A = (, Q, q0 , F, ) est un automate fini dterministe reconnaissant L, on dfinira
le langage local L0 sur lalphabet dont les symboles sont les triplets [p, a, q], avec p, q Q et
a et on considrera le morphisme induit par ([p, a, q]) = a.
Dfinition 4.6 (Accessible, co-accessible, utile, mond). Un tat q de A est dit accessible sil
existe u dans ? tel que ? (q0 , u) = q. q0 est trivialement accessible (par u = ). Un automate dont
tous les tats sont accessibles est lui-mme dit accessible.
Un tat q de A est dit co-accessible sil existe u dans ? tel que ? (q, u) F. Tout tat final est
trivialement co-accessible (par u = ). Un automate dont tous les tats sont co-accessibles est lui-mme
dit co-accessible.
Un tat q de A est dit utile sil est la fois accessible et co-accessible. Dun automate dont tous les
tats sont utiles on dit quil est mond (en anglais trim).
Les tats utiles sont donc les tats qui servent dans au moins un calcul russi : on peut les
atteindre depuis ltat 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). Cest prcisment ce
que montre le thorme suivant.
Thorme 4.7 (mondage). Si L(A) , est un langage reconnaissable, alors il est galement
reconnu par un automate mond.
Dans cette section, nous augmentons le modle dautomate de la dfinition 4.4 en autorisant
plusieurs transitions sortantes dun tat q porter le mme symbole : les automates ainsi spci-
fis sont dits non-dterministes. Nous montrons que cette gnralisation naugmente toutefois
pas lexpressivit du modle : les langages reconnus par les automates non-dterministes
sont les mmes que ceux reconnus par les automates dterministes.
37
CHAPITRE 4. AUTOMATES FINIS
Non-dterminisme
On peut galement considrer comme une fonction de Q dans 2Q : limage par dun
couple (q, a) est un sous-ensemble de Q (ventuellement lorsquil ny a pas de transition
tiquet a sortant de q). On aurait aussi pu, sans perte de gnralit, nautoriser quun seul
tat initial.
La nouveaut introduite par cette dfinition est lindtermination 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-dterminisme, signifiant quil existe des tats dans lesquels la lecture dun symbole
a dans lentre provoque un choix (ou une indtermination) et que plusieurs transitions
alternatives sont possibles.
Notez que cette dfinition gnralise proprement la notion dautomate fini : la dfinition 4.4
est un cas particulier de la dfinition 4.8, avec pour tout (q, a), lensemble (q, a) ne contient
quun seul lment. En dautres termes, tout automate dterministe est non-dterministe.
Remarquez que le vocabulaire est trs trompeur : tre non-dterministe ne signifie pas ne pas
tre dterministe ! Cest pour cela que nous notons non-dterministe avec un tiret, et non
pas non dterministe .
Les notions de calcul et de calcul russi se dfinissent exactement comme dans le cas d-
terministe. On dfinit galement la fonction de transition tendue ? de Q ? dans 2Q
par :
? (q, ) = {q}
? (q, au) = r(q,a) ? (r, u)
S
L(A) = {u ? | q0 I : ? (q0 , u) F , }
Pour quun mot appartienne au langage reconnu par lautomate, il suffit quil existe, parmi
tous les calculs possibles, un calcul russi, cest--dire un calcul qui consomme tous les
symboles de u entre un tat initial et un tat final ; la reconnaissance nchoue donc que
si tous les calculs aboutissent une des situations dchec. Ceci implique que pour calculer
lappartenance dun mot un langage, il faut, en principe, examiner successivement tous les
chemins possibles, et donc ventuellement revenir en arrire dans lexploration des parcours
de lautomate lorsque lon rencontre une impasse. Cette exploration peut toutefois se ramener
un problme daccessibilit dans le graphe sous-jacent lautomate, puisquun mot est
38
4.1. AUTOMATES FINIS
3
a b b
a a
1 2 4
Deux transitions sortantes de 1 sont tiquetes par a : (1, a) = {1, 2}. aa donne lieu un
calcul russi passant successivement par 1, 2 et 4, qui est final ; aa donne aussi lieu un
calcul (1, a, 1)(1, a, 1), qui nest pas un calcul russi.
reconnu par lautomate si lon arrive prouver quau moins un tat final (ils sont en nombre
fini) est accessible depuis au moins un tat initial (ils sont en nombre fini) sur un chemin
tiquet par u. Dans ce nouveau modle, le problme de la reconnaissance dun mot reste
donc polynomial en la longueur du mot en entre.
Thorme 4.9 (Dterminisation). Pour tout NFA A, on peut construire un DFA A0 quivalent
A. De plus, si A a n tats, alors A0 a au plus 2n tats.
Les tats de A0 sont donc associs de manire biunivoque des sous-ensembles de Q (il y en
a un nombre fini) : ltat initial est lensemble I ; chaque partie contenant un tat final de A
donne lieu un tat final de A0 ; la transition sortante dun sous-ensemble E, tiquete par a,
atteint lensemble de tous les tats de Q atteignables depuis un tat de E par une transition
tiquete par a. A0 est le dterminis de A. Illustrons cette construction sur lautomate 4.8.
Lautomate 4.8 ayant 4 tats, son dterminis en aura donc 16, correspondant au nombre de
sous-ensembles de {1, 2, 3, 4}. Son tat initial est le singleton {1}, et ses tats finaux tous les
sous-ensembles contenant 4 : il y en a exactement 8, qui sont : {4}, {1, 4}, {2, 4}, {3, 4}, {1, 2, 4},
{1, 3, 4}, {2, 3, 4} ,{1, 2, 3, 4}. Considrons par exemple les transitions sortantes de ltat initial :
1 ayant deux transitions sortantes sur le symbole a, {1} aura une transition depuis a vers
ltat correspondant au doubleton {2, 3}. Le dterminis est lautomate 4.9. On notera que
cette figure ne reprsente que les tats utiles du dterminis : ainsi {1, 2} nest pas reprsent,
puisquil nexiste aucun moyen datteindre cet tat.
39
CHAPITRE 4. AUTOMATES FINIS
3
a b
1 4
a
a
b
2
b
{4} a {2}
b a b
b
a a
{1} {2, 3} {3} {2, 4}
a b
a
{3, 4}
Que se passerait-il si lon ajoutait lautomate 4.8 une transition supplmentaire bouclant
dans ltat 1 sur le symbole a ? Construisez le dterminis de ce nouvel automate.
Dmontrons maintenant le thorme 4.9 ; et pour saisir le sens de la dmonstration, reportons
nous lautomate 4.8, et considrons les calculs des mots prfixs par aaa : le premier a conduit
une indtermination entre 2 et 3 ; suivant les cas, le second a conduit donc en 4 (si on a
choisi daller initialement en 2) ou en 3 (si on a choisi daller initialement en 3). La lecture
du troisime a lve lambigut, puisquil ny a pas de transition sortante pour 4 : le seul
tat possible aprs aaa est 3. Cest ce qui se lit sur lautomate 4.9 : les ambiguts initiales
correspondent aux tats {2, 3} (atteint aprs le premier a) et {3, 4} (atteint aprs le second a) ;
aprs le troisime le doute nest plus permis et ltat atteint correspond au singleton {3}.
Formalisons maintenant ces ides pour dmontrer le rsultat qui nous intresse.
40
4.1. AUTOMATES FINIS
Oprons une rcurrence sur la longueur de u : si u est gal le rsultat est vrai par
dfinition de ltat initial dans A0 . Supposons que le rsultat est galement vrai pour tout
mot de longueur strictement infrieure |u|, et considrons u = va. Soit (q0 , va) `?A (p, a) `A
(q, ) un calcul dans A : par lhypothse de rcurrence, il existe un calcul dans A0 tel que :
({I}, v) `?A0 (G, ), avec p G. Ceci implique, en vertu de la dfinition mme de 0 , que q
appartient H = 0 (G, a), et donc que ({I}, u = va) `?A0 (H, ), avec q H. Inversement, soit
({I}, u = va) `?A0 (G, a) `A0 (H, ) : pour tout p dans G il existe un calcul dans A tel que
(q0 , v) `?A (p, ). G ayant une transition tiquete par a, il existe galement dans G un tat p
tel que (p, a) = q, avec q H, puis que (q0 , u = va) `?A (q, ), avec q H. On dduit alors que
lon a (q0 , u = va) `?A (q, ), avec q F si et seulement si ({I}, u) `?A0 (G, ) avec q G, donc avec
F G , , soit encore G F0 . Il sensuit directement que L(A) = L(A0 ).
a, b
a a, b a, b a, b
0 1 2 3 n
Dans la mesure o ils napportent aucun gain en expressivit, il est permis de se demander
quoi servent les automates non-dterministes. Au moins deux choses : ils sont plus faciles
construire partir dautres reprsentations des langages et sont donc utiles pour certaines
preuves (voir plus loin) ou algorithmes. Ils fournissent galement des machines bien plus
(dans certains cas exponentiellement plus) compactes que les DFA, ce qui nest pas une
proprit ngligeable.
41
CHAPITRE 4. AUTOMATES FINIS
a, b, c, d a, c
b d
0 1 2
Il est commode, dans la pratique, de disposer dune dfinition encore plus plastique de la
notion dautomate fini, en autorisant des transitions tiquetes par le mot vide, qui sont
appeles les transitions spontanes.
Dfinition 4.11 (Automate fini transitions spontanes). Un automate fini (non-dterministe)
transitions spontanes (-NFA, nondeterministic finite automaton with moves) est dfini
par un quintuplet A = (, Q, I, F, ), o :
est un ensemble fini de symboles (lalphabet)
Q est un ensemble fini dtats
I Q est lensemble des tats initiaux
F Q est lensemble des tats finaux
Q ( {}) Q est la relation de transition.
Encore une fois, on aurait pu ne conserver quun seul tat initial, et dfinir comme une
fonction (partielle) de Q ( {}) dans 2Q .
Formellement, un automate non-dterministe avec transitions spontanes se dfinit comme
un NFA la diffrence prs que permet dtiqueter les transitions par . Les transitions
spontanes permettent dtendre la notion de calcul : (q, u) `A (p, v) si (i) u = av et (q, a, p)
ou bien (ii) u = v et (q, , p) . En dautres termes, dans un -NFA, il est possible de changer
dtat sans consommer de symbole, en empruntant une transition tiquete par le mot vide.
Le langage reconnu par un -NFA A est, comme prcdemment, dfini par
42
4.1. AUTOMATES FINIS
a b c
0 1 2
Cette nouvelle extension najoute rien lexpressivit du modle, puisquil est possible
de transformer chaque -NFA A en un NFA quivalent. Pour cela, nous introduisons tout
dabord la notion d-fermeture dun tat q, correspondant tous les tats accessibles depuis
q par une ou plusieurs transitions spontanes. Formellement :
Dfinition 4.12 (-fermeture dun tat). Soit q un tat de Q. On appelle -fermeture (en anglais
closure) de q lensemble -closure(q) = {p Q | (q, ) `?A (p, )}. Par construction, q -closure(q).
Intuitivement, la fermeture dun tat q contient tous les tats quil est possible datteindre
depuis q sans consommer de symboles. Ainsi, la fermeture de ltat 0 de lautomate 4.12
est-elle gale {0, 1, 2}.
Thorme 4.13. Pour tout -NFA A, il existe un NFA A0 tel que L(A) = L(A0 ).
Par une rcurrence similaire la prcdente, on montre alors que tout calcul (q0 , u) `?A p est
quivalent un calcul (q0 , u) `?A0 p0 , avec p -closure(p0 ), puis que L(A) = L(A0 ).
On dduit directement un algorithme constructif pour supprimer, nombre dtats constant, les
transitions spontanes. Appliqu lautomate 4.12, cet algorithme construit lautomate 4.13.
a b c
b c
0 1 2
Dans le cas de la preuve prcdente on parle d-fermeture arrire dun automate (on pourrait
dire amont ) : la fonction commence (en amont) par effectuer les ventuelles transitions
spontanes, puis enchane par une transition sur lettre. De mme tout tat (amont) depuis
lequel on arrive un tat final en descendant les transitions spontanes devient lui-mme
final.
On peut galement introduire l-fermeture avant dun -NFA (on pourrait dire aval ) : on
poursuit toute transition non-spontane par toutes les transitions spontanes (en aval), et
deviennent initiaux tous les tats en aval (par transitions spontanes) dun tat initial.
43
CHAPITRE 4. AUTOMATES FINIS
On prfre en gnral la fermeture arrire, qui nintroduit pas de nouveaux tats initiaux.
Les transitions spontanes introduisent une plasticit supplmentaire lobjet automate.
Par exemple, il est facile de voir que lon peut, en les utilisant, transformer un automate fini
quelconque en un automate quivalent dot dun unique tat final nayant que des transitions
entrantes.
Le mot vide se note \e dans Vcsn. Pour utiliser des -NFA, il faut spcifier que le mot
vide est une tiquette valide. Le contexte est lan_char, b au lieu de lal_char,
b. Ainsi lautomate 4.12 scrit (notez le r au dbut de la chane) :
>>> a = vcsn.automaton(r
context = "lan_char, b"
$ -> 0
0 -> 0 a
0 -> 1 \e
1 -> 1 b
1 -> 2 \e
2 -> 2 c
2 -> $
)
Exercice 4.14 (BCI-0304). Considrant que lon ne peut avoir simultanment des adjectifs avant
et aprs le nom, un linguiste propose de reprsenter lensemble des groupes forms dun nom et
dadjectif(s) par lexpression rationnelle : a? n + na? .
a b
b
0 1 2
a
44
4.2. RECONNAISSABLES
4.2 Reconnaissables
Nous avons dfini la section 4.1 les langages reconnaissables comme tant les langages
reconnus par un automate fini dterministe. Les sections prcdentes nous ont montr que
nous aurions tout aussi bien pu les dfinir comme les langages reconnus par un automate
fini non-dterministe ou encore par un automate fini non-dterministe avec transitions spon-
tanes.
Dans cette section, nous montrons dans un premier temps que lensemble des langages recon-
naissables est clos pour toutes les oprations classiques , en produisant des constructions
portant directement sur les automates. Nous montrons ensuite que les reconnaissables sont
exactement les langages rationnels (prsents la section 3.1.1), puis nous prsentons un
ensemble de rsultats classiques permettant de caractriser les langages reconnaissables.
Thorme 4.16 (Clture par complmentation). Les langages reconnaissables sont clos par com-
plmentation.
Le thorme suivant est une tautologie, puisque par dfinition les langages rationnels sont
clos par lunion. Nanmoins sa preuve fournit la construction dun automate dterministe
acceptant lunion des langages de deux automates dterministes.
Thorme 4.17 (Clture par union). Les langages reconnaissables sont clos par union.
Nous verrons un peu plus loin (automate 4.18) une autre construction, plus simple, pour
cette opration, mais qui linverse de la prcdente, ne prserve pas le dterminisme de la
machine ralisant lunion.
45
CHAPITRE 4. AUTOMATES FINIS
Thorme 4.18 (Clture par intersection). Les langages reconnaissables sont clos par intersection.
Nous prsentons une preuve constructive, mais notez que le rsultat dcoule directement
des deux rsultats prcdents et de la loi de de Morgan L1 L2 = L1 L2 .
Exercice 4.19 (AST-0506). Lintersection ne fait pas partie des oprations rationnelles. Pourtant,
lintersection de deux langages rationnels est galement un langage rationnel. Si le langage L1 est
reconnu par lautomate dterministe complet A1 = (, Q1 , q10 , F1 , 1 ) et L2 par lautomate dterministe
complet A2 = (, Q2 , q20 , F2 , 2 ), alors L = L1 L2 est reconnu par lautomate A = (, Q1 Q2 , q0 , F, ).
Les tats de A sont des couples dtats de Q1 et de Q2 , et :
q0 = (q10 , q20 )
F = F1 F2
((q1 , q2 ), a) = (1 (q1 , a), 2 (q2 , a))
A simule en fait des calculs en parallle dans A1 et dans A2 , et termine un calcul russi lorsquil
atteint simultanment un tat final de A1 et de A2 .
Dans la suite de cet exercice, on considre = {a, b}.
1. Soient L1 le langage des mots qui commencent par un a et L2 le langage des mots dont la longueur
est un multiple de 3. Proposez, pour chacun de ces langages, un automate fini dterministe et
complet.
2. Construisez, en utilisant les directives donnes ci-dessus, un automate pour L1 L2 .
3. Nous allons maintenant retrouver cette construction dans le cas gnral en utilisant la loi de
de Morgan : L1 L2 = L1 L2 . On rappelle que si L est rationnel et reconnu par A dterministe
complet, L est rationnel et est reconnu par A, qui se dduit de A en rendant finals les tats
non-finaux de A, et en rendant non-final les tats finals de A. A est galement dterministe et
complet.
a. Nous nous intressons tout dabord au calcul dun automate dterministe A pour L1 L2 .
Lautomate pour lunion de deux langages rationnels reconnus respectivement par A1 et
A2 se construit en ajoutant un nouvel tat initial q0 et deux transitions vers les tats
46
4.2. RECONNAISSABLES
initiaux q10 et q20 . Son ensemble dtats est donc Q = Q1 Q2 {q0 }. On note A0 lautomate
obtenu en liminant la transition .
Prouvez que, si A1 et A2 sont dterministes, alors A0 ne possde quun seul tat non-
dterministe 1 .
b. La dterminisation de A0 conduit un automate A dont lensemble des tats est en corres-
pondance avec les parties de Q. Prouvez, par induction, que si A1 et A2 sont dterministes
et complets, seules les parties correspondant des doubletons dtats {q1 , q2 }, q1 Q1 , q2
Q2 donnent lieux des tats utiles du dterminis. Montrez qualors on retrouve bien
pour A une fonction de transition conforme la construction directe prsente ci-dessus.
c. Quels sont les tats finaux de A0 ? Quen dduisez-vous pour ceux de lautomate reprsen-
tant le complmentaire du langage de A ? Concluez en achevant de justifier la construction
directe donne ci-dessus.
Thorme 4.21 (Clture par miroir). Les langages reconnaissables sont clos par miroir.
Thorme 4.22 (Clture par concatnation). Les langages reconnaissables sont clos par concat-
nation.
47
CHAPITRE 4. AUTOMATES FINIS
Thorme 4.23 (Clture par toile). Les langages reconnaissables sont clos par toile.
En application de cette section, vous pourrez montrer (en construisant les automates corres-
pondants) que les langages reconnaissables sont aussi clos pour les oprations de prfixation,
suffixation, pour les facteurs, les sous-mots. . .
Les proprits de clture dmontres pour les reconnaissables (pour lunion, la concatnation
et ltoile) la section prcdente, compltes par la remarque que tous les langages finis sont
reconnaissables, nous permettent daffirmer que tout langage rationnel est reconnaissable.
Lensemble des langages rationnels tant en effet le plus petit ensemble contenant tous les
ensembles finis et clos pour les oprations rationnelles, il est ncessairement inclus dans
lensemble des reconnaissables. Nous montrons dans un premier temps comment exploiter
les constructions prcdentes pour construire simplement un automate correspondant
une expression rationnelle donne. Nous montrons ensuite la rciproque, savoir que tout
reconnaissable est galement rationnel : les langages reconnus par les automates finis sont
prcisment ceux qui sont dcrits par des expressions rationnelles.
Les constructions de la section prcdente ont montr comment construire les automates
ralisant des oprations lmentaires sur les langages. Nous allons nous inspirer de ces
constructions pour driver un algorithme permettant de convertir une expression rationnelle
en un automate fini reconnaissant le mme langage.
Il existe de nombreuses faons de construire un tel automate, celle que nous donnons ci-
dessous est la construction de Thompson pure qui prsente quelques proprits simples :
un unique tat initial q0 sans transition entrante
48
4.2. RECONNAISSABLES
partir de ces automates lmentaires, nous allons construire de manire itrative des
automates pour des expressions rationnelles plus complexes. Si A1 et A2 sont les automates
de Thompson de e1 et e2 , alors lautomate 4.18 reconnat le langage dnot par lexpression
e1 + e2 .
q10 A1 q1F
q0 qF
q20 A2 q2F
Lunion correspond donc une mise en parallle de A1 et de A2 : un calcul dans cette machine
est russi si et seulement sil est russi dans lune des deux machines A1 ou A2 .
La machine reconnaissant le langage dnot par concatnation de deux expressions e1 et e2
correspond une mise en srie des deux machines A1 et A2 , o ltat final de A1 est connect
ltat initial de A2 par une transition spontane comme sur lautomate 4.19.
49
CHAPITRE 4. AUTOMATES FINIS
q10 A1 q1F q20 A2 q2F
La machine ralisant ltoile est, comme prcdemment, construite en rajoutant une possibi-
lit de boucler depuis ltat final vers ltat initial de la machine, ainsi quun arc permettant
de reconnatre , comme sur lautomate 4.20.
q0 q10 A1 q1F qF
a
b
b
Cette construction simple produit un automate qui a 2n tats pour une expression forme
par n oprations rationnelles autres que la concatnation (car toutes les autres oprations
rajoutent exactement deux tats) ; chaque tat de lautomate possde au plus deux transitions
sortantes. Cependant, cette construction a le dsavantage de produire un automate non-
dterministe, contenant de multiples transitions spontanes. Il existe dautres procdures
permettant de traiter de manire plus efficace les expressions ne contenant pas le symbole
(par exemple la construction de Glushkov) ou pour construire directement un automate
dterministe.
50
4.2. RECONNAISSABLES
>>> vcsn.B.expression((a+b)*b).thompson()
51
CHAPITRE 4. AUTOMATES FINIS
ejj
ei j e jk eik + ei j e j j ? e jk
qi qj qk ; qi qk
eik
Thorme de Kleene
Nous avons montr comment construire un automate correspondant une expression ra-
tionnelle et comment driver une expression rationnelle dnotant un langage quivalent
celui reconnu par un automate fini quelconque. Ces deux rsultats permettent dnoncer un
des rsultats majeurs de ce chapitre.
Thorme 4.24 (Thorme de Kleene). Un langage est reconnaissable (reconnu par un automate
fini) si et seulement si il est rationnel (dnot par une expression rationnelle).
Ce rsultat permet de tirer quelques consquences non encore envisages : par exemple que
les langages rationnels sont clos par complmentation et par intersection finie : ce rsultat,
loin dtre vident si on sen tient aux notions doprations rationnelles, tombe simplement
lorsque lon utilise lquivalence entre rationnels et reconnaissables.
De manire similaire, les mthodes de transformation dune reprsentation lautre sont
bien pratiques : sil est immdiat de driver de lautomate 4.3 une expression rationnelle
pour le langage contenant un nombre de a multiple de 3, il est beaucoup moins facile
dcrire directement lexpression rationnelle correspondante. En particulier, le passage par
la reprsentation sous forme dautomates permet de dduire une mthode pour vrifier
si deux expressions sont quivalentes : construire les deux automates correspondants, et
52
4.3. QUELQUES PROPRITS DES LANGAGES RECONNAISSABLES
vrifier quils sont quivalents. Nous savons dj comment raliser la premire partie de ce
programme ; une procdure pour tester lquivalence de deux automates est prsente la
section 4.3.2.
Intuitivement, le lemme de pompage (ou lemme de ltoile, et en anglais pumping lemma ou star
lemma) pose des limitations intrinsques concernant la diversit des mots appartenant un
langage rationnel infini : au del dune certaine longueur, les mots dun langage rationnel
sont en fait construits par itration de motifs apparaissant dans des mots plus courts.
Thorme 4.25 (Lemme de pompage). Soit L un langage rationnel. Il existe un entier k tel que
pour tout mot x de L plus long que k, x se factorise en x = uvw, avec (i) |v| > 0 (ii) |uv| k et (iii)
pour tout i 0, uvi w est galement un mot de L.
Ce que signifie fondamentalement ce lemme, cest que la seule faon daller linfini pour
un langage rationnel, cest par itration de motifs : L(uv? w) L do le nom de lemme
de ltoile .
Dmonstration. Lorsque le langage est fini, le lemme est trivial : on peut choisir un k qui
majore la longueur de tous les mots du langage.
Sinon, soit A un DFA de k tats reconnaissant L, et x un mot de L, de longueur suprieure
ou gale k (le langage tant infini, un tel x existe toujours). La reconnaissance de x dans
A correspond un calcul q0 . . . qn impliquant |x| + 1 tats. A nayant que k tats, le prfixe
de longueur k + 1 de cette squence contient ncessairement deux fois le mme tat q, aux
indices i et j, avec 0 i < j k. Si lon note u le prfixe de x tel que ? (q0 , u) = q et v le facteur
tel que ? (q, v) = q, alors on a bien (i) car au moins un symbole est consomm le long du
cycle q . . . q ; (ii) car j k ; (iii) en court-circuitant ou en itrant les parcours le long du circuit
q . . . q.
Attention : certains langages non rationnels vrifient la proprit du lemme : elle nest
quune condition ncessaire, mais pas suffisante, de rationalit. Considrez par exemple
{an bn | n N} ? {ba}? .
Ce lemme permet, par exemple, de prouver que le langage des carrs parfaits, L = {u
? , v tel que u = v2 }, nest pas rationnel. En effet, soit k lentier spcifi par le lemme de
53
CHAPITRE 4. AUTOMATES FINIS
pompage et x un mot plus grand que 2k : x = yy avec |y| k. Il est alors possible dcrire
x = uvw, avec |uv| k. Ceci implique que uv est un prfixe de y, et y un suffixe de w. Pourtant,
uvi w doit galement tre dans L, alors quun seul des y est affect par litration : ceci est
manifestement impossible.
Vous montrerez de mme que le langage ne contenant que les mots dont la longueur est un
carr parfait et que le langage des mots dont la longueur est un nombre premier ne sont pas
non plus des langages reconnaissables.
Une manire simple dexprimer cette limitation intrinsque des langages rationnels se fonde
sur lobservation suivante : dans un automate, le choix de ltat successeur pour un tat q ne
dpend que de q, et pas de la manire dont le calcul sest droul avant q. En consquence,
un automate fini ne peut grer quun nombre fini de configurations diffrentes, ou, dit autrement,
possde une mmoire borne. Cest insuffisant pour un langage tel que le langage des carrs
parfaits pour lequel laction conduire (le langage reconnatre) aprs un prfixe u dpend
de u tout entier : reconnatre un tel langage demanderait en fait un nombre infini dtats.
Dans cette section, nous tablissons quelques rsultats complmentaires portant sur la d-
cidabilit, cest--dire sur lexistence dalgorithmes permettant de rsoudre quelques pro-
blmes classiques portant sur les langages rationnels. Nous connaissons dj un algorithme
pour dcider si un mot appartient un langage rationnel (lalgorithme 4.2) ; cette section
montre en fait que la plupart des problmes classiques pour les langages rationnels ont des
solutions algorithmiques.
54
4.4. LAUTOMATE CANONIQUE
Thorme 4.28. Soient A1 et A2 deux automates finis. Il existe une procdure permettant de dcider
si A1 et A2 sont quivalents.
Dmonstration. Il suffit en effet pour cela de former lautomate reconnaissant (L(A1 )L(A2 ))
(L(A1 ) L(A2 )) (par exemple en utilisant les procdures dcrites la section 4.2.1) et de tester
si le langage reconnu par cet automate est vide. Si cest le cas, alors les deux automates sont
effectivement quivalents.
Dans cette section, nous donnons une nouvelle caractrisation des langages reconnaissables,
partir de laquelle nous introduisons la notion dautomate canonique dun langage. Nous
prsentons ensuite un algorithme pour construire lautomate canonique dun langage recon-
naissable reprsent par un DFA quelconque.
Dfinition 4.29 (Mots indistinguables dun langage). Soit L un langage de ? . Deux mots u et
v sont dits indistinguables dans L si pour tout w ? , soit uw et vw sont tous deux dans L, soit
uw et vw sont tous deux dans L. On notera L la relation dindistinguabilit dans L.
En dautres termes, deux mots u et v sont distinguables dans L sil existe un mot w ? tel que
uw L et vw < L, ou bien le contraire. La relation dindistinguabilit dans L est une relation
rflexive, symtrique et transitive : cest une relation dquivalence.
Considrons, titre dillustration, le langage L = a(a + b)(bb)? . Pour ce langage, u = aab et
v = abb sont indistinguables : pour tout mot x = uw de L, y = vw est en effet un autre mot de
L. En revanche u = a et v = aa sont distinguables : en concatnant w = abb u, on obtient aabb
qui est dans L ; en revanche, aaabb nest pas un mot de L.
De manire similaire, on dfinit la notion dindistinguabilit dans un automate dterministe.
55
CHAPITRE 4. AUTOMATES FINIS
Autrement dit, deux mots u et v sont indistinguables pour A si le calcul par A de u depuis q0
aboutit dans le mme tat q que le calcul de v. Cette notion est lie la prcdente : pour deux
mots u et v indistinguables dans L(A), tout mot w tel que ? (q, w) aboutisse dans un tat final
est une continuation valide la fois de u et de v dans L ; inversement tout mot conduisant un
chec depuis q est une continuation invalide la fois de u et de v. En revanche, la rciproque
est fausse, et deux mots indistinguables dans L(A) peuvent tre distinguables dans A.
Pour continuer, rappelons la notion de congruence droite, dj introduite la section 2.4.3 :
Dfinition 4.31 (Invariance droite). Une relation dquivalence R sur ? est dite invariante
droite si et seulement si : u R v w, uw R vw. Une relation invariante droite est appele une
congruence droite.
Par dfinition, les deux relations dindistinguabilit dfinies ci-dessus sont invariantes
droite.
Nous sommes maintenant en mesure dexposer le rsultat principal de cette section.
Thorme 4.32 (Myhill-Nerode). Soit L un langage sur , les trois assertions suivantes sont
quivalentes :
(i) L est un langage rationnel
(ii) il existe une relation dquivalence sur ? , invariante droite, ayant un nombre fini de classes
dquivalence et telle que L est gal lunion de classes dquivalence de
(iii) L possde un nombre fini de classes dquivalence
56
4.4. LAUTOMATE CANONIQUE
Ce rsultat fournit une nouvelle caractrisation des langages reconnaissables et peut donc
tre utilis pour montrer quun langage est, ou nest pas, reconnaissable. Ainsi, par exemple,
L = {u ? | a , i N tq. u = a2 } nest pas reconnaissable. En effet, pour tout i, j, a2 et
i i
j i
a2 sont distingus par a2 . Il ny a donc pas un nombre fini de classes dquivalence pour L ,
et L ne peut en consquence tre reconnu par un automate fini. L nest donc pas un langage
rationnel.
57
CHAPITRE 4. AUTOMATES FINIS
Comme les relations dindistinguabilit prcdentes, cette relation est une relation dqui-
valence, note sur les tats de Q. Lensemble des classes dquivalence [q] est note Q .
Pour un automate fini dterministe A = (, Q, q0 , F, ), on dfinit lautomate fini A par :
A = (, Q , [q0 ] , F , ), avec : ([q] , a) = [(q, a)] ; et F = [q] , avec q dans F. La fonction
est correctement dfinie en ce sens que si p et q sont indistinguables, alors ncessairement
(q, a) (p, a).
Montrons, dans un premier temps, que ce nouvel automate est bien identique lautomate
canonique AL . On dfinit pour cela une application , qui associe un tat de A un tat de
AL de la manire suivante :
Notons dabord que est une application : si u et v de ? aboutissent tous deux dans des
tats indistinguables de A, alors il est clair que u et v sont galement indistinguables, et sont
donc dans la mme classe dquivalence pour L : le rsultat de ne dpend pas dun choix
particulier de u.
Montrons maintenant que est une bijection. Ceci se dduit de la suite dquivalences
suivante :
Montrons enfin que les calculs dans A sont en bijection par avec les calculs de AL . On a en
effet :
([q0 ] ) = []L , car ? (q0 , ) = q0 [q0 ]
( ([q] , a) = L (([q] ), a) car soit u tel que ? (q0 , u) [q] , alors : (i) (? (q0 , u), a)
([q] , a) (cf. la dfinition de ) et [ua]L = ( ([q] , a)) = L ([u], a) (cf. la dfinition de
L ), ce quil fallait prouver.
si [q] est final dans A , 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 lautomate canonique.
Il sensuit que chaque calcul dans A est isomorphe (par ) un calcul dans AL , et ainsi
que, ces deux automates ayant les mmes tats initiaux et finaux, ils reconnaissent le mme
langage.
4.4.3 Minimisation
58
4.4. LAUTOMATE CANONIQUE
a a
a b
0 1 2
b b
b b
3 4 5
a a a, b
a, b b b
0 1, 3 2, 4 5
59
CHAPITRE 4. AUTOMATES FINIS
Exercice 4.35 (BCI-0607-2-1). On sintresse, dans cet exercice, la reprsentation de grands dic-
tionnaires par des automates finis. Nous considrons ici quun dictionnaire est une liste finie de mots :
il existe donc un automate fini qui le reprsente. Une telle reprsentation garantit en particulier que
la recherche dun mot aura une complexit linaire en la longueur du mot recherch.
Considrons la liste de mots L = {lier, lierai, lions, oser, osier, oserai}, qui correspond au langage de
lautomate 4.25 (sur laquelle les noms des tats sont omis).
l i e r
l i e r a i
l i o n s
o s e r
o s i e r
o s e r a i
1. Construisez, par une mthode vue en cours, un automate dterministe pour le langage L. Vous
procderez en deux temps, en prenant soin de dtailler chacune des tapes : suppression des
transitions , puis dterminisation de lautomate sans transition .
2. On dit que deux tats p et q dun automate dterministe sont indistinguables si pour tout mot
u de , (p, u) F (q, u) F.
Autrement dit, deux tats p et q sont indistinguables si et seulement si tout mot conduisant
un calcul russi dbutant en p conduit un calcul russi dbutant en q et rciproquement.
(a) Identifiez dans lautomate dterministe construit la question 1 un couple dtats indis-
tinguables ; et un couple dtats distinguables (non-indistinguables).
(b) La relation dindistinguabilit est une relation binaire sur lensemble des tats dun auto-
mate. Prouvez que cest une relation dquivalence (i.e. quelle est rflexive, symtrique,
et transitive).
60
4.4. LAUTOMATE CANONIQUE
61
CHAPITRE 4. AUTOMATES FINIS
62
Chapitre 5
Grammaires syntagmatiques
Dans cette partie, nous prsentons de manire gnrale les grammaires syntagmatiques, ainsi
que les principaux concepts affrents. Nous montrons en particulier quau-del de la classe
des langages rationnels, il existe bien dautres familles de langages, qui valent galement la
peine dtre explores.
5.1 Grammaires
Dfinition 5.1 (Grammaire). Une grammaire syntagmatique G est dfinie par un quadruplet
(N, , P, S), o N, et P dsignent respectivement des ensembles de non-terminaux (ou variables),
de terminaux, et de productions (ou rgles de production). N et sont des alphabets disjoints. Les
productions sont des lments de (N )? (N )? , que lon note sous la forme . S est un
lment distingu de N, appel le symbole initial ou encore laxiome de la grammaire.
p1 = S aSb
p2 = S ab
Ainsi, par exemple, la drivation suivante est une drivation pour la grammaire 5.1 :
?
permettant de dduire que S aaaaSbbbb.
G1
Ces dfinitions prliminaires tant poses, il est maintenant possible dexprimer formelle-
ment le lien entre grammaires et langages.
Dfinition 5.4 (Langage engendr par une grammaire). On appelle langage engendr par G,
?
not L(G), le sous-ensemble de ? dfini par L(G) = {w ? | S w}.
G
L(G) est donc un sous-ensemble de ? , contenant prcisment les mots qui se drivent par
?
depuis S. Lorsque , contenant des non-terminaux, se drive de S, on dit qu est un
G
proto-mot (en anglais sentential form). Pour produire un mot 1 du langage, il faudra alors
habilement utiliser les productions, de manire se dbarrasser, par rcritures successives
depuis laxiome, de tous les non-terminaux du proto-mot courant. Vous vrifierez ainsi que
le langage engendr par la grammaire 5.1 est lensemble des mots forms en concatnant n
fois le symbole a, suivi de n fois le symbole b (soit le langage {an bn , n 1}).
Si toute grammaire engendre un langage unique, la rciproque nest pas vraie. Un langage L
peut tre engendr par de multiples grammaires, comme on peut sen persuader en rajoutant
1. La terminologie est ainsi faite que lorsque lon parle de grammaires, il est dusage dappeler phrases les
squences dlments terminaux, que nous appelions prcdemment mots. Il sensuit parfois (et cest fort fcheux),
que le terme de mot est parfois employ pour dnoter les lments de lalphabet (et non plus les lments de
? ). Nous essaierons dviter cette confusion, et nous continuerons de parler de mots pour dsigner les lments
dun langage, mme lorsque ces mots correspondront ce quil est commun dappeler phrase dans le langage
courant.
64
5.2. LA HIRARCHIE DE CHOMSKY
volont des non-terminaux ou des terminaux inutiles. Il existe plusieurs manires pour un
non-terminal dtre inutile : par exemple en napparaissant dans aucune partie droite (ce qui
fait quil napparatra dans aucun proto-mot) ; ou bien en napparaissant dans aucune partie
gauche (il ne pourra jamais tre limin dun proto-mot, ni donc tre utilis dans la drivation
dune phrase du langage...). Nous reviendrons sur cette notion dutilit des lments de la
grammaire la section 9.1.2.
Comme nous lavons fait pour les expressions rationnelles ( la section 3.1.3) et pour les auto-
mates finis (voir la section 4.1), il est en revanche possible de dfinir des classes dquivalence
de grammaires qui engendrent le mme langage.
Dfinition 5.5 (quivalence entre grammaires). Deux grammaires G1 et G2 sont quivalentes
si et seulement si elles engendrent le mme langage.
Les grammaires syntagmatiques dcrivent donc des systmes permettant dengendrer, par
rcritures successives, les mots dun langage : pour cette raison, elles sont parfois galement
appeles grammaires gnratives. De ces grammaires se dduisent (de manire plus ou moins
directe) des algorithmes permettant de reconnatre les mots dun langage, voire, pour les
sous-classes les plus simples, de dcider si un mot appartient ou non un langage.
Le processus de construction itrative dun mot par rcriture dune suite de proto-mots
permet de tracer les tapes de la construction et apporte une information indispensable pour
interprter le mot. Les grammaires syntagmatiques permettent donc galement dassocier
des structures aux mots dun langage, partir desquelles il est possible de calculer leur
signification. Ces notions sont formalises la section 6.2.
Dfinition 5.6 (Type 0). On appelle grammaire de type 0 une grammaire syntagmatique dans
laquelle la forme des productions est non-contrainte.
Le type 0 est le type le plus gnral. Toute grammaire syntagmatique est donc de type 0 ;
toutefois, au fur et mesure que les autres types seront introduits, on prendra pour convention
dappeler type dune grammaire le type le plus spcifique auquel elle appartient.
Le principal rsultat retenir pour les grammaires de type 0 est le suivant, que nous ne
dmontrerons pas.
2. Les dveloppements des travaux sur les grammaires formelles ont conduit largement raffiner cette
hirarchie. Il existe ainsi, par exemple, de multiples sous-classes des langages algbriques, dont certaines seront
prsentes dans la suite.
65
CHAPITRE 5. GRAMMAIRES SYNTAGMATIQUES
Thorme 5.7. Les langages rcursivement numrables sont les langages engendrs par une gram-
maire de type 0.
Lensemble des langages rcursivement numrables est not RE. Rappelons quil a t
introduit la section 2.2.2.
Ce qui signifie quen dpit de leur apparente simplicit, les grammaires syntagmatiques
permettent de dcrire (pas toujours avec lgance, mais cest une autre question) exacte-
ment les langages que lon sait reconnatre (ou numrer) avec une machine de Turing. Les
grammaires syntagmatiques de type 0 ont donc une expressivit maximale.
Ce rsultat est thoriquement satisfaisant, mais ne nous en dit gure sur la vritable nature
de ces langages. Dans la pratique, il est extrmement rare de rencontrer un langage de type
0 qui ne se ramne pas un type plus simple.
Les grammaires monotones introduisent une premire restriction sur la forme des rgles, en
imposant que la partie droite de chaque production soit ncessairement plus longue que la
partie gauche. Formellement :
Dfinition 5.8 (Grammaire monotone). On appelle grammaire monotone une grammaire syn-
tagmatique dans laquelle toute production est telle que || ||.
Cette dfinition impose quau cours dune drivation, les proto-mots dune grammaire mo-
notone stendent de manire monotone. Cette contrainte interdit en particulier dengendrer
le mot vide . Nous reviendrons en dtail sur cette question la section 5.2.6.
Les langages engendrs par les grammaires monotones sont galement obtenus en posant
une contrainte alternative sur la forme des rgles, conduisant la notion de grammaire
contextuelle :
Les grammaires contextuelles sont donc telles que chaque production ne rcrit quun symbole
non-terminal la fois, le contexte (cest--dire les symboles encadrant ce non-terminal) restant
inchang : do la qualification de contextuelles pour ces grammaires. Par construction, toute
grammaire contextuelle est monotone (car , ). Le thorme suivant nous dit plus :
grammaires contextuelles et monotones engendrent exactement les mmes langages.
Thorme 5.10. Pour tout langage L engendr par une grammaire monotone G, il existe une
grammaire contextuelle qui engendre L.
Dmonstration. Soit L engendr par la grammaire monotone G = (N, , S, P). Sans perte de
gnralit, nous supposons que les terminaux napparaissent que dans des productions de
66
5.2. LA HIRARCHIE DE CHOMSKY
Lemme 5.11. Si G est une grammaire monotone, il existe une grammaire monotone quivalente dans
laquelle toutes les parties droites ont une longueur infrieure ou gale 2.
Il est clair que G0 est monotone et que lapplication successive de ces nouvelles rgles a bien
pour effet global de rcrire de proche en proche en par :
1 2 . . . m 0 1 X1 3 . . . m
G
0 1 2 X2 4 . . . n
G
0 ...
G
0 1 2 . . . n1 Xn1
G
0 1 2 . . . n1 n
G
Soit alors u dans L(G) : si u se drive de S sans utiliser , alors u se drive pareillement
? ?
de S dans G0 . Si u se drive dans G par S vw vw u, alors u se drive dans
G G G
G0 en remplaant ltape de drivation vw vw par les tapes de drivation dtailles
G
ci-dessus. Inversement, si u se drive dans G0 sans utiliser aucune variable Xi , elle se drive
lidentique dans G. Si X1 apparat dans une tape de la drivation, son limination par
application successive des n rgles prcdentes implique la prsence du facteur dans le
proto-mot drivant u : u se drive alors dans G en utilisant .
Par itration de cette transformation, il est possible de transformer toute grammaire mono-
tone en une grammaire monotone quivalente dont toutes les productions sont telles que
leur partie droite (et, par consquent, leur partie gauche, par monotonicit de G) ont une
longueur infrieure ou gale 2. Le lemme suivant nous permet darriver la forme dsire
pour les parties gauches (les productions de la forme A a pouvant tre gardes telles
quelles).
Lemme 5.12. Si G est une grammaire monotone ne contenant que des productions de type AB CD,
avec A, B, C et D dans N {}, alors il existe une grammaire quivalente satisfaisant la proprit du
thorme 5.10.
67
CHAPITRE 5. GRAMMAIRES SYNTAGMATIQUES
On dduit directement le rsultat qui nous intresse : toute grammaire monotone est qui-
valente une grammaire dans laquelle chaque production ne rcrit quun seul et unique
symbole.
Ces rsultats permettent finalement dintroduire la notion de langage contextuel.
Dfinition 5.13 (Langage contextuel). On appelle langage contextuel (ou langage sensible au
contexte, en abrg langage CS) un langage engendr par une grammaire contextuelle (ou par une
grammaire monotone).
Les langages contextuels constituent une classe importante de langages, que lon rencontre
effectivement (en particulier en traitement automatique des langues). Un reprsentant no-
table de ces langages est le langage {an bn cn , n 1}, qui est engendr par la grammaire 5.2
daxiome S.
p1 = S aSQ
p2 = S abc
p3 = cQ Qc
p4 = bQc bbcc
La grammaire 5.2 est monotone. Dans cette grammaire, on observe par exemple les driva-
tions listes dans le tableau 5.3.
Il est possible de montrer quen fait les seules drivations qui russissent dans cette gram-
maire produisent les mots (et tous les mots) du langage {an bn cn , n 1}, ce qui est dailleurs
loin dtre vident lorsque lon examine les productions de la grammaire.
Un dernier rsultat important concernant les langages contextuels est le suivant :
Thorme 5.14. Tout langage contextuel est rcursif, soit en notant RC lensemble des langages
rcursifs, et CS lensemble des langages contextuels : CS RC.
Ce que dit ce rsultat, cest quil existe un algorithme capable de dcider si un mot appartient
ou pas au langage engendr par une grammaire contextuelle. Pour sen convaincre, esquis-
sons le raisonnement suivant : soit u le mot dcider, de taille |u|. Tout proto-mot impliqu
dans la drivation de u est au plus aussi long que u, cause de la proprit de monotonie.
68
5.2. LA HIRARCHIE DE CHOMSKY
p2
S abc
G
p1
S aSQ
G
p2
aabcQ
G
p3
aabQc
G
p4
aabbcc
G
p1
S aSQ
G
p1
aaSQQ
G
p2
aaabcQQ
G
p3
aaabQcQ
G
p4
aaabbccQ
G
p3
aaabbcQc
G
p3
aaabbQcc
G
p4
aaabbbccc
G
Il suffit donc, pour dcider u, de construire de proche en proche lensemble D de tous les
proto-mots quil est possible dobtenir en inversant les productions de la grammaire. D
contient un nombre fini de proto-mots ; il est possible de construire de proche en proche les
lments de cet ensemble. Au terme de processus, si S est trouv dans D, alors u appartient
L(G), sinon, u nappartient pas L(G).
Ce bref raisonnement ne dit rien de la complexit de cet algorithme, cest--dire du temps quil
mettra se terminer. Dans la pratique, tous les algorithmes gnraux pour les grammaires CS
sont exponentiels. Quelques sous-classes particulires admettent toutefois des algorithmes
de dcision polynomiaux.
Pour finir, notons quil est possible de montrer que la rciproque nest pas vraie, donc quil
existe des langages rcursifs qui ne peuvent tre dcrits par aucune grammaire contextuelle.
Une contrainte supplmentaire par rapport celle impose pour les grammaires contextuelles
consiste exiger que toutes les productions contextuelles aient un contexte vide. Ceci conduit
la dfinition suivante.
Dfinition 5.15 (Grammaire hors-contexte). On appelle grammaire de type 2 (on dit galement
grammaire hors-contexte, en anglais Context-free, ou grammaire algbrique, en abrg CFG)
une grammaire syntagmatique dans laquelle toute production est de la forme : A , avec A
69
CHAPITRE 5. GRAMMAIRES SYNTAGMATIQUES
dans N et dans V + .
Le sens de cette nouvelle contrainte est le suivant : chaque fois quune variable A figure dans
un proto-mot, elle peut tre rcrite indpendamment du contexte dans lequel elle apparat. Par
dfinition, toute grammaire hors-contexte est un cas particulier de grammaire contextuelle.
Cette nouvelle restriction permet dintroduire la notion de A-production :
Dfinition 5.16 (A-production). On appelle A-production une production dont la partie gauche est
rduite au symbole A.
Attention : il est ais de faire des dfinitions complexes dentits simples. Une grammaire
complique, par exemple sensible au contexte, peut dfinir un langage simple, par exemple
hors-contexte, rationnel, voire fini.
p1 = S aSb
p2 = aSb aaSbb
p3 = S ab
Rgularit
Les grammaires de type 3 rduisent un peu plus la forme des rgles autorises, dfinissant
une classe de langages encore plus simple que la classe des langages hors-contexte.
Dfinition 5.18 (Grammaire de type 3). On appelle grammaire de type 3 (on dit galement
grammaire rgulire, en abrg grammaire RG) (en anglais regular) une grammaire syntagmatique
70
5.2. LA HIRARCHIE DE CHOMSKY
dans laquelle toute production est soit de la forme A aB, avec a dans et A, B dans N, soit
de la forme A a.
Par dfinition, toute grammaire rgulire est hors-contexte. Le trait spcifique des gram-
maires rgulires est que chaque rgle produit un symbole terminal et au plus un non-
terminal sa droite. Les drivations dune grammaire rgulire ont donc une forme trs
simple, puisque tout proto-mot produit par n tapes successives de drivation contient en
tte n symboles terminaux, suivis dau plus un non-terminal. La drivation se termine par
la production dun mot du langage de la grammaire, lorsque le dernier terminal est limin
par une rcriture de type A a.
La notion de langage rgulier se dfinit comme prcdemment par :
Dfinition 5.19 (Langage rgulier). Un langage est rgulier si et seulement si il existe une
grammaire rgulire qui lengendre.
Le rsultat principal concernant les langages rguliers est nonc dans le thorme suivant :
Thorme 5.20. Si L est un langage rgulier, il existe un automate fini A qui reconnat L. Rcipro-
quement, si L est un langage reconnaissable, avec < L, alors il existe une grammaire rgulire qui
engendre L.
Ainsi les langages rguliers, un dtail prs (que nous discutons la section 5.2.6), ne sont
rien dautre que les langages rationnels, aussi connus sous le nom de reconnaissables. Leurs
proprits principales ont t dtailles par ailleurs (notamment la section 4.2) ; nous y
renvoyons le lecteur.
Pour avoir lintuition de ce thorme, considrons la grammaire engendrant le langage
aa(a + b)? a et lautomate reconnaissant ce langage, tous deux reproduits dans le tableau 5.5.
G A
a
S aA
A aB a a a
S A B Z
B aB | bB
B a
b
71
CHAPITRE 5. GRAMMAIRES SYNTAGMATIQUES
dans la construction suivante, qui vise fournir une dmonstration de lquivalence entre
rationnels et rguliers.
Une consquence de cette quivalence est que si tout langage rgulier est par dfinition hors
contexte, le contraire nest pas vrai. Nous avons rencontr plus haut ( la section 5.2.3) une
grammaire engendrant {an bn , n 1}, langage dont on montre aisment quen vertu du lemme
de pompage pour les langages rationnels (cf. la section 4.3.1), il ne peut tre reconnu par un
automate fini. La distinction introduite entre langages rguliers et langages hors-contexte
nest donc pas de pure forme : il existe des langages CF qui ne sont pas rationnels.
Exercice 5.21 (BCI-0405-1, suite (exercice 4.15)). 2 Construisez, par une mthode du cours,
une grammaire rgulire G telle que L(G) = L(A), o A est lautomate 4.14.
Variantes
Il est possible de dfinir de manire un peu plus librale les grammaires de type 3 : la
limitation essentielle concerne en fait le nombre de non-terminaux en partie droite et leur
positionnement systmatique droite de tous les terminaux.
Dfinition 5.22 (Grammaire de type 3). On appelle grammaire de type 3 (ici grammaire linaire
droite) (en anglais right linear) une grammaire syntagmatique dans laquelle toute production
est soit de la forme : A uB, avec u dans ? et A, B dans N, soit de la forme A u, avec u
dans + .
72
5.2. LA HIRARCHIE DE CHOMSKY
Cette dfinition est donc plus gnrale que la dfinition des grammaires rgulires. Il est
pourtant simple de montrer que les langages engendrs sont les mmes : chaque grammaire
linaire droite admet une grammaire rgulire quivalente. La dmonstration est laisse
en exercice. Les grammaires linaires droite engendrent donc exactement la classe des
langages rationnels.
On montre, de mme, que les grammaires linaires gauche (au plus un non-terminal dans
chaque partie droite, toujours positionn en premire position) engendrent les langages
rationnels. Ces grammaires sont donc aussi des grammaires de type 3.
Attention : ces rsultats ne sappliquent plus si lon considre les grammaires linaires quel-
conques (dfinies comme tant les grammaires telles que toute partie droite contient au
plus un non-terminal) : les grammaires linaires peuvent engendrer des langages hors-contexte non
rationnels. Pour preuve, il suffit de considrer de nouveau la grammaire 5.1.
On ne peut pas non plus gnraliser en acceptant les grammaires dont les rgles panachent
linarit gauche et droite. Il est facile de reconnatre la grammaire 5.1 dans le dguisement
linaire suivant.
S aX | ab
X Sb
Il existe des grammaires encore plus simples que les grammaires rgulires. En particulier
les grammaires choix finis sont telles que tout non-terminal ne rcrit que des terminaux.
On appelle de telles grammaires les grammaires de type 4 :
Dfinition 5.23 (Grammaire de type 4). On appelle grammaire de type 4 (on dit galement
grammaire choix finis, en abrg grammaire FC) une grammaire syntagmatique dans laquelle
toute production est de la forme : A u, avec A dans N et u dans + .
Les grammaires de type 4, on sen convaincra aisment, nengendrent que des langages finis,
mais engendrent tous les langages finis qui ne contiennent pas le mot vide.
La dfinition que nous avons donne des grammaires de type 1 implique un accroisse-
ment monotone de la longueur des proto-mots au cours dune drivation, ce qui interdit
la production du mot vide. Cette limitation thorique de lexpressivit des grammaires
contextuelles a conduit noncer une version faible (cest--dire ne portant que sur les
reconnaissables ne contenant pas le mot vide) de lquivalence entre langages rguliers et
langages rationnels.
Pour rsoudre cette limitation, on admettra quune grammaire contextuelle (ou hors-contexte,
ou rgulire) puisse contenir des rgles de type A et on acceptera la possibilit quun
langage contextuel contienne le mot vide. Pour ce qui concerne les grammaires CF, nous
reviendrons sur ce point en tudiant les algorithmes de normalisation de grammaires ( la
section 9.1.4).
73
CHAPITRE 5. GRAMMAIRES SYNTAGMATIQUES
Pour ce qui concerne les grammaires rgulires, notons simplement que si lon accepte
des productions de type A , alors on peut montrer que les langages rguliers sont
exactement les langages reconnaissables. Il suffit pour cela de complter la construction
dcrite la section 5.2.4 en marquant comme tats finaux de A tous les tats correspondant
une variable pour laquelle il existe une rgle A . La construction inverse en est galement
simplifie : pour chaque tat final A de lautomate, on rajoute la production A .
Pour diffrentier les rsultats obtenus avec et sans , on utilisera le qualificatif de strict
pour faire rfrence aux classes de grammaires et de langages prsentes dans les sections
prcdentes : ainsi on dira quune grammaire est strictement hors-contexte si elle ne contient
pas de production de type A ; quelle est simplement hors-contexte sinon. De mme on
parlera de langage strictement hors-contexte pour un langage CF ne contenant pas et de
langage hors-contexte sinon.
5.2.7 Conclusion
F C RG CF CS RC RE
Il est important de bien comprendre le sens de cette hirarchie : les grammaires les plus
complexes ne dcrivent pas des langages plus grands, mais permettent dexprimer des
distinctions plus subtiles entre les mots du langage de la grammaire et ceux qui sont ne sont
pas grammaticaux.
Un autre point de vue, sans doute plus intressant, consiste dire que les grammaires plus
complexes permettent de dcrire des lois plus gnrales que celles exprimables par des
grammaires plus simples. Prenons un exemple en traitement des langues naturelles : en
franais, le bon usage impose que le sujet dune phrase affirmative saccorde avec son verbe
en nombre et personne. Cela signifie, par exemple, que si le sujet est un pronom singulier
la premire personne, le verbe sera galement la premire personne du singulier. Si lon
appelle L lensemble des phrases respectant cette rgle, on a :
la phrase lenfant mange est dans L
la phrase lenfant manges nest pas dans L
Une description de la syntaxe du franais par une grammaire syntagmatique qui voudrait
exprimer cette rgle avec une grammaire rgulire est peut-tre possible, mais serait certai-
nement trs fastidieuse, et sans aucune vertu pour les linguistes, ou pour les enfants qui
apprennent cette rgle. Pourquoi ? Parce quen franais, le sujet peut tre spar du verbe
par un nombre arbitraire de mots, comme dans lenfant de Jean mange, lenfant du fils de
Jean mange... Il faut donc implanter dans les rgles de la grammaire un dispositif de m-
morisation du nombre et de la personne du sujet qui retienne ces valeurs jusqu ce que
le verbe soit rencontr, cest--dire pendant un nombre arbitraire dtapes de drivation.
La seule solution, avec une grammaire rgulire, consiste envisager lavance toutes les
configurations possibles, et de les encoder dans la topologie de lautomate correspondant,
puisque la mmorisation fournie par la grammaire est de taille 1 (le pass de la drivation
74
5.2. LA HIRARCHIE DE CHOMSKY
est immdiatement oubli). On peut montrer quune telle contrainte sexprime simplement
et sous une forme bien plus naturelle pour les linguistes, lorsque lon utilise une grammaire
CF.
La prix payer pour utiliser une grammaire plus fine est que le problme algorithmique
de la reconnaissance dune phrase par une grammaire devient de plus en plus complexe.
Vous savez dj que ce problme est solvable en temps linaire pour les langages rationnels
(rguliers), et non-solvable (indcidable) pour les langages de type 0. On peut montrer quil
existe des automates gnralisant le modle dautomate fini pour les langages CF et CS,
do se dduisent des algorithmes (polynomiaux pour les langages CF, exponentiels en
gnral pour les langages CS) permettant galement de dcider ces langages. En particulier,
le problme de la reconnaissance pour les grammaires CF sera tudi en dtail dans les
chapitres 7 et 8.
75
CHAPITRE 5. GRAMMAIRES SYNTAGMATIQUES
76
Chapitre 6
Dans ce chapitre, nous nous intressons plus particulirement aux grammaires et aux lan-
gages hors-contexte. Rappelons que nous avons caractris ces grammaires la section 5.2.3
comme tant des grammaires syntagmatiques dont toutes les productions sont de la forme
A u, avec A un non-terminal et u une squence quelconque de terminaux et non-terminaux.
Autrement dit, une grammaire algbrique est une grammaire pour laquelle il est toujours
possible de rcrire un non-terminal en cours de drivation, quel que soit le contexte (les
symboles adjacents dans le proto-mot) dans lequel il apparat.
Ce chapitre dbute par la prsentation, la section 6.1, de quelques grammaires CF exem-
plaires. Cette section nous permettra galement dintroduire les systmes de notation clas-
siques pour ces grammaires. Nous dfinissons ensuite la notion de drivation gauche et
darbre de drivation, puis discutons le problme de lquivalence entre grammaires et de
lambigut (section 6.2). La section 6.3 introduit enfin un certain nombre de proprits
lmentaires des langages CF, qui nous permettent de mieux cerner la richesse (et la com-
plexit) de cette classe de langages. Ltude des grammaires CF, en particulier des algorithmes
permettant de traiter le problme de la reconnaissance dun mot par une grammaire, sera
poursuivie dans les chapitres suivants, en particulier au chapitre 7.
S GN GV (par p1 )
GD
S NP GV (par p4 )
GD
Louis GV (par p21 )
GD
Louis V (par p5 )
GD
Louis boude (par p17 )
GD
Il existe dautres drivations de Louis boude, consistant utiliser les productions dans un
ordre diffrent : par exemple p5 avant p4 , selon : S GN GV GN V GN boude
GD GD GD GD
NP boude Louis boude. Ceci illustre une premire proprit importante des grammaires
GD
hors contexte : lors dune drivation, il est possible dappliquer les productions dans un
ordre arbitraire. Notons galement qu la place de Louis, on aurait pu utiliser Marie ou Paul,
ou mme le fils boude et obtenir un nouveau mot du langage : nouveau, cest la proprit
dindpendance au contexte qui sexprime. Ces exemples clairent un peu la signification des
noms de variables : GN dsigne les groupes nominaux, GV les groupes verbaux... La premire
78
6.1. QUELQUES EXEMPLES
production de GD dit simplement quun nonc bien form est compos dun groupe nominal
(qui, le plus souvent, est le sujet) et dun groupe verbal (le verbe principal) de la phrase.
Cette grammaire permet galement dengendrer des noncs plus complexes, comme par
exemple :
le paternel sert le fromage
qui utilise une autre production (p6 ) pour driver un groupe verbal (GV) contenant un verbe
et son complment dobjet direct.
La production p3 est particulire, puisquelle contient le mme symbole dans sa partie gauche
et dans sa partie droite. On dit dune production possdant cette proprit quelle est rcursive.
Pour tre plus prcis p3 est rcursive gauche : le non-terminal en partie gauche de la
production figure galement en tte de la partie droite. Comme cest llment le plus
gauche de la partie droite, on parle parfois de coin gauche de la production.
Cette proprit de p3 implique immdiatement que le langage engendr par GD est infini,
puisquon peut crer des noncs de longueur arbitraire par application itre de cette rgle,
engendrant par exemple :
le fils de Paul mange
le fils de la fille de Paul mange
le fils de la fille de la fille de Paul mange
le fils de la fille de la fille . . . de Paul mange
Il nest pas immdiatement vident que cette proprit, savoir quune grammaire contenant
une rgle rcursive engendre un langage infini, soit toujours vraie... Pensez, par exemple,
ce qui se passerait si lon avait une production rcursive de type A A. En revanche, il
est clair quune telle production risque de poser problme pour engendrer de manire syst-
matique les mots de la grammaire. Le problme est dviter de tomber dans des drivations
interminables telles que : GN GN GNP GN GNP GNP GN GNP GNP GNP . . ..
GD GD GD
Une autre remarque sur GD : cette grammaire engendre des noncs qui ne sont pas corrects
en franais. Par exemple, la fils avale a` le petite dessert.
Dernire remarque concernant GD : cette grammaire engendre des noncs qui sont (du
point de vue du sens) ambigus. Ainsi Louis parle a` la fille de Paul, qui peut exprimer soit
une conversation entre Louis et la fille de Paul, soit un change concernant Paul entre Louis et
la fille. En crivant les diverses drivations de ces deux noncs, vous pourrez constater que
les deux sens correspondent deux drivations employant des productions diffrentes pour
construire un groupe verbal : la premire utilise p7 , la seconde p9 .
Dans cette section, nous prsentons des fragments 1 dune autre grammaire, celle qui dcrit
la syntaxe des programmes pour linterprteur bash. Nous ferons, dans la suite, rfrence
cette grammaire sous le nom de GB .
1. Ces fragments sont extraits de Learning the Bash Shell, de C. Newham et B. Rosenblatt, OReilly & associates,
1998, consultable en ligne ladresse http://safari.oreilly.com.
79
CHAPITRE 6. LANGAGES ET GRAMMAIRES HORS-CONTEXTE
hnumberi hnumberi 0
GB
hnumberi 10
GB
hnumberi 510
GB
3510
GB
Un mot tout dabord sur les notations : comme il est dusage pour les langages informa-
tiques, cette grammaire est exprime en respectant les conventions initialement proposes
par Backus et Naur pour dcrire le langage ALGOL 60. Ce systme de notation des gram-
maires est connu sous le nom de Backus-Naur Form ou en abrg BNF. Dans les rgles de la
grammaire 6.3, les non-terminaux figurent entre chevrons (hi) ; les terminaux sont les autres
chanes de caractres, certains caractres spciaux apparaissant entre apostrophes ; les pro-
ductions sont marques par loprateur F ; enfin les productions alternatives ayant mme
partie gauche sont spares par le symbole |, les alternatives pouvant figurer sur des lignes
distinctes.
Les lments de base de la syntaxe sont les mots et les chiffres, dfinis dans la grammaire 6.3.
hletteri F a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
| A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z
hdigiti F 0|1|2|3|4|5|6|7|8|9
Les deux premires dfinitions sont des simples numrations de terminaux dfinissant les
lettres (hletteri), puis les chiffres (hdigiti). Le troisime non-terminal, hnumberi, introduit
une figure rcurrente dans les grammaires informatiques : celle de la liste, ici une liste de
chiffres. Une telle construction ncessite deux productions :
une production rcursive (ici rcursive gauche) spcifie une liste comme une liste
suivie dun nouvel lment ;
la seconde alternative achve la rcursion, en dfinissant la liste compose dun unique
chiffre.
80
6.2. DRIVATIONS
Ce couple de rgles permet de driver des squences de longueur arbitraire, selon des dri-
vations similaires celle du tableau 6.4. On reconnat dans celle-ci une drivation rgulire :
le fragment de GB rduit aux trois productions relatives aux nombres et daxiome hnumberi
dfinit une grammaire rgulire et pourrait tre reprsent sous la forme dun automate fini.
Le mme principe est luvre pour dcrire les mots, hwordi, par des listes de lettres ; ou
encore les listes de mots (hword_listi).
Une seconde figure remarquable et typique des langages de programmation apparat dans
les productions du tableau 6.5.
hgroup_commandi F { hlisti }
6.2 Drivations
Nous lavons vu, une premire caractristique des grammaires CF est la multiplicit des
drivations possibles pour un mme mot. Pour neutraliser cette source de variabilit,
nous allons poser une convention permettant dordonner lapplication des productions.
Cette convention pose, nous introduisons une reprsentation graphique des drivations et
dfinissons les notions dambigut et dquivalence entre grammaires.
81
CHAPITRE 6. LANGAGES ET GRAMMAIRES HORS-CONTEXTE
Dfinition 6.1 (Drivation gauche). On appelle drivation gauche dune grammaire hors-
contexte G une drivation dans laquelle chaque tape de drivation rcrit le non-terminal le plus
gauche du proto-mot courant.
Un premier rsultat est alors nonc dans le thorme suivant, qui nous assure quil est
justifi de ne sintresser quaux seules drivations gauches dune grammaire.
? L
Thorme 6.3. Soit G une grammaire CF daxiome S, et u dans ? : S u si et seulement si S u
G G
R
(idem pour S u).
G
82
6.2. DRIVATIONS
Attention : si lon peut driver par drivation gauche tous les mots dun langage, on ne peut
pas en dire autant des proto-mots. Il peut exister des proto-mots qui ne sont pas accessibles par
une drivation gauche : ce nest pas gnant, dans la mesure o ces proto-mots ne permettent
pas de driver davantage de mots de la grammaire.
En utilisant ce rsultat, il est possible de dfinir une relation dquivalence sur lensemble des
drivations de G : deux drivations sont quivalentes si elles se transforment en une mme
drivation gauche. Il apparat alors que ce qui caractrise une drivation, ou plutt une classe
de drivations, est partiellement 2 indpendant de lordre dapplication des productions, et
peut donc simplement tre rsum par lensemble 3 des productions utilises. Cet ensemble
partiellement ordonn admet une expression mathmatique (et visuelle) : larbre de drivation.
Dfinition 6.4 (Arbre de drivation). Un arbre de drivation dans G est un arbre A tel que :
tous les nuds de A sont tiquets par un symbole de V = T N,
la racine est tiquete par S,
si un nud n nest pas une feuille et porte ltiquette X, alors X N,
si n1 , n2 , . . . , nk sont les fils de n dans A, dtiquettes respectives X1 , X2 , . . . , Xk , alors X
X1 X2 Xk est une production de G.
Notons que cette dfinition nimpose pas que toutes les feuilles de larbre soient tiquetes
par des terminaux : un arbre peut trs bien dcrire un proto-mot en cours de drivation.
Pour passer de larbre de drivation la drivation proprement dite, il suffit de parcourir
larbre de drivation en lisant les productions appliques. La drivation gauche sobtient en
effectuant un parcours prfixe de larbre, cest--dire en visitant dabord un nud pre, puis
tous ses fils de gauche droite. Dautres parcours fourniront dautres drivations quiva-
lentes.
Un arbre de drivation (on parle aussi darbre danalyse dun mot) correspondant la produc-
tion de lnonc Paul mange son fromage dans la grammaire des dimanches est reprsent
la figure 6.6. Les numros des nuds sont ports en indice des tiquettes correspondantes ;
la numrotation adopte correspond un parcours prfixe de larbre. Sur cette figure, on voit
en particulier quil existe deux nuds tiquets GN, portant les indices 2 et 8.
Larbre de drivation reprsente graphiquement la structure associe un mot du langage,
de laquelle se dduira linterprtation lui donner.
On appelle parsage (en anglais parsing) dun mot dans la grammaire le processus de construc-
tion du ou des arbres de drivation pour ce mot, lorsquils existent.
Linterprtation correspond la signification dun nonc pour la grammaire des dimanches,
la valeur du calcul dnot par une expression arithmtique pour une grammaire de calculs,
2. Partiellement seulement : pour quun non-terminal A soit driv, il faut quil est t pralablement produit
par une production qui le contient dans sa partie droite.
3. En ralit un multi-ensemble, pas un ensemble au sens traditionnel : le nombre dapplications de chaque
production importe.
83
CHAPITRE 6. LANGAGES ET GRAMMAIRES HORS-CONTEXTE
S1
GN2 GV 5
NP3 V6 GN8
son10 fromage12
6.2.3 Ambigut
Dfinition 6.5 (Ambigut dune grammaire). Une grammaire est ambigu sil existe un mot
admettant plusieurs drivations gauches dans la grammaire.
De manire quivalente, une grammaire est ambigu sil existe un mot qui admet plusieurs arbres de
drivation.
84
6.2. DRIVATIONS
Sum Sum
Number Number
Sum + Sum Sum + Sum
Digit Digit
Number Number Number Number
1 3
Digit Digit Digit Digit
3 5 5 1
S ASB | AB
A aA | a
B bB | b
Grammaire 6.9 Une grammaire ambigu
Le mot aabb admet ainsi plusieurs analyses, selon que lon utilise ou pas la premire pro-
duction de S. Cette grammaire engendrant un langage rgulier (lequel ?), il est toutefois
lmentaire, en utilisant le procd de transformation dun automate en grammaire rgu-
lire, de construire une grammaire non-ambigu qui reconnat ce langage. Lambigut est
une proprit des grammaires.
Cette proprit contamine pourtant parfois mme les langages :
Dfinition 6.6 (Ambigut dun langage). Un langage hors-contexte est (intrinsquement) am-
bigu si toutes les grammaires hors-contexte qui lengendrent sont ambigus.
Un langage intrinsquement ambigu ne peut donc tre dcrit par une grammaire non-
ambigu. Un exemple fameux est L = L1 L2 = {an bn cm } {am bn cn }, soit {an bm cp , avec m =
n ou m = p}. Dcrire L1 demande dintroduire une rcursion centrale, pour apparier les a et
les b ; L2 demande galement une rgle exhibant une telle rcursion, pour apparier les b et
les c. On peut montrer que pour toute grammaire hors-contexte engendrant ce langage, tout
mot de la forme an bn cn aura une double interprtation, selon que lon utilise le mcanisme
dappariement (de comptage) des a et des b ou celui qui contrle lappariement des b et des
c.
Fort heureusement, les langages (informatiques) intrinsquement ambigus ne courent pas les
rues : lorsque lon conoit un nouveau langage informatique, il suffit de se prmunir contre
les ambiguts qui peuvent conduire des conflits dinterprtation. Ainsi, les grammaires
formelles utilises pour les langages de programmation sont-elles explicitement conues
pour limiter lambigut danalyse.
En revanche, lorsquon sintresse au langage naturel, lambigut lexicale (un mot ayant
85
CHAPITRE 6. LANGAGES ET GRAMMAIRES HORS-CONTEXTE
plusieurs catgories ou plusieurs sens) et syntaxique (un nonc avec plusieurs interprta-
tions) sont des phnomnes massifs et incontournables, quil faut donc savoir affronter avec
les outils adquats.
6.2.4 quivalence
Ces notions sont importantes puisque, on la vu, cest larbre de drivation qui permet
dinterprter le sens dun nonc : transformer une grammaire G1 en une autre grammaire
G2 qui reconnat le mme langage est utile, mais il est encore plus utile de pouvoir le faire
sans avoir changer les interprtations. dfaut, il faudra se rsoudre utiliser des mcanismes
permettant de reconstruire les arbres de drivation de la grammaire initiale partir de ceux
de la grammaire transforme.
Bien que se prtant de multiples applications pratiques, les grammaires algbriques sont
intrinsquement limites dans la structure des mots quelles engendrent. Pour mieux appr-
hender la nature de cette limitation, nous allons introduire quelques notions nouvelles. Si a
est un symbole terminal dun arbre de drivation dune grammaire G, on appelle ligne de a
la squence de rgles utilise pour produire a partir de S. Chaque lment de la ligne est
une paire (P, i), o P est une production, et i lindice dans la partie droite de P de lanctre de
a. Considrant de nouveau la grammaire 5.1 pour le langage an bn et une drivation de aaabbb
dans cette grammaire, la ligne du second a de aaabbb correspond la squence (S aSb, 2),
(S aSb, 1).
On dit alors quun symbole est original si tous les couples (P, i) qui constituent sa ligne sont
diffrents. Contrairement au premier et au second a de aaabbb, le troisime a nest pas original,
puisque sa ligne est (S aSb, 2), (S aSb, 2), (S ab, 1). Par extension, un mot est dit
original si tous les symboles qui le composent sont originaux.
Le rsultat intressant est alors quune grammaire algbrique, mme lorsquelle engendre un
nombre infini de mots, ne peut produire quun nombre fini de mots originaux. En effet, puisquil
ny a quun nombre fini de productions, chacune contenant un nombre fini de symboles
dans sa partie droite, chaque symbole terminal ne peut avoir quun nombre fini de lignes
86
6.3. LES LANGAGES HORS-CONTEXTE
diffrentes. Les symboles tant en nombre fini, il existe donc une longueur maximale pour
un mot original et donc un nombre fini de mots originaux.
quoi ressemblent alors les mots non-originaux ? Soit s un tel mot, il contient ncessairement
un symbole non-original a, dont la ligne contient donc deux fois le mme anctre A. La
drivation complte de s pourra donc scrire :
? ? ?
S uAy uvAxy uvwxy
G G G
o u, v, w, x, y sont des squences de terminaux, la squence w contenant le symbole a. Il
est alors facile de dduire de nouveaux mots engendrs par la grammaire, en remplaant w
(qui est une drivation possible de A) par vwx qui est une autre drivation possible de A.
Ce processus peut mme tre itr, permettant de construire un nombre infini de nouveaux
mots, tous non-originaux, et qui sont de la forme : uvn wxn z. Ces considrations nous amnent
un thorme caractrisant de manire prcise cette limitation des langages algbriques.
Thorme 6.8 (Lemme de pompage pour les CFL). Si L est un langage CF, alors il existe un
entier k tel que tout mot de L de longueur suprieure k se dcompose en cinq facteurs u, v, w, x, y,
avec vx , , |vwx| < k et tels que pour tout n, uvn wxn y est galement dans L.
Ce rsultat est utile pour prouver quun langage nest pas hors-contexte. Montrons, titre
dillustration, que {an bn cn , n 1} nest pas hors-contexte. Supposons quil le soit et consi-
drons un mot z suffisamment long de ce langage. Dcomposons z en uvwxy, et notons
zn = uvn wxn y. Les mots v et x ne peuvent chacun contenir quun seul des trois symboles de
lalphabet, sans quoi leur rptition aboutirait des mots ne respectant pas le squencement
impos : tous les a avant tous les b avant tous les c. Pourtant, en faisant crotre n, on augmente
simultanment, dans zn , le nombre de a, de b et de c dans des proportions identiques : ceci
nest pas possible puisque seuls deux des trois symboles sont concerns par lexponentiation
de v et x. Cette contradiction prouve que ce langage nest pas hors-contexte.
Dans cette section, nous tudions les proprits de clture pour les langages hors-contexte,
dune manire similaire celle conduite pour les reconnaissables la section 4.2.1.
87
CHAPITRE 6. LANGAGES ET GRAMMAIRES HORS-CONTEXTE
Dmonstration. Pour les trois oprations, une construction simple permet dtablir ce rsultat.
Si, en effet, G1 et G2 sont dfinies par : G1 = (N1 , 1 , P1 , S1 ) et G2 = (N2 , 2 , P2 , S2 ), on vrifie
simplement que :
G = (N1 N2 {S}, 1 2 , P1 P2 {S S1 , S S2 }, S) engendre exactement L1 L2 .
G = (N1 N2 {S}, 1 2 , P1 P2 {S S1 S2 }, S) engendre exactement L1 L2 .
G = (N1 {S}, 1 , P1 {S SS1 , S }, S) engendre exactement L1 ? .
Dans cette section, nous prsentons sommairement les principaux rsultats de dcidabilit
concernant les grammaires et langages hors-contexte. Cette panoplie de nouveaux rsultats
vient enrichir le seul dont nous disposons pour linstant, savoir que les langages hors-
contexte sont rcursifs et quen consquence, il existe des algorithmes permettant de dcider
si un mot u de ? est, ou non, engendr par une grammaire G. Nous aurons loccasion de
revenir longuement sur ces algorithmes, notamment au chapitre 7.
Nous commenons par deux rsultats positifs, qui snonce comme :
Thorme 6.11. Il existe un algorithme permettant de dterminer si le langage engendr par une
grammaire hors-contexte est vide.
Dmonstration. La preuve exploite en fait un argument analogue celui utilis dans notre
dmonstration du lemme de pompage (thorme 6.8) : on considre un arbre de driva-
tion hypothtique quelconque de la grammaire, engendrant w. Supposons quun chemin
contienne plusieurs fois le mme non-terminal A (aux nuds n1 et n2 , le premier dominant
le second). n1 domine le facteur w1 , n2 domine w2 ; on peut remplacer dans w la partie corres-
pondant w1 par celle correspondant w2 . Donc, sil existe un mot dans le langage engendr,
il en existera galement un qui soit tel que le mme non-terminal napparat jamais deux fois
4. Rappelons : L1 L2 = L1 L2 .
88
6.3. LES LANGAGES HORS-CONTEXTE
dans un chemin. Dans la mesure o les non-terminaux sont en nombre fini, il existe un
nombre fini de tels arbres. Il suffit alors de les numrer et de vrifier sil en existe un dont la
frontire ne contient que des terminaux : si la rponse est oui, alors L(G) est non-vide, sinon,
L(G) est vide.
Thorme 6.12. Il existe un algorithme permettant de dterminer si le langage engendr par une
grammaire hors-contexte est infini.
Ces rsultats sont les seuls rsultats positifs pour les grammaires CF, puisquil est possible
de prouver les rsultats ngatifs suivants :
il nexiste pas dalgorithme pour dcider si deux grammaires sont quivalentes (rap-
pelons : la preuve du rsultat (positif) obtenu pour les langages rationnels utilisait la
clture par intersection de ces langages) ;
il nexiste pas dalgorithme pour dcider si le langage engendr par une grammaire CF
est inclus dans le langage engendr par une autre grammaire CF ;
il nexiste pas dalgorithme pour dcider si une grammaire CF engendre en fait un
langage rgulier ;
il nexiste pas dalgorithme pour dcider si une grammaire est ambigu.
Munis de ces rsultats, nous pouvons maintenant aborder le problme de la reconnaissance
des mots engendrs par une grammaire CF, qui fait lobjet des chapitres suivants.
89
CHAPITRE 6. LANGAGES ET GRAMMAIRES HORS-CONTEXTE
90
Chapitre 7
Introduction au parsage de
grammaires hors-contexte
Dans ce chapitre, nous prsentons les principales difficults algorithmiques que pose lana-
lyse de grammaires hors-contexte. Il existe, en fait, trois tches distinctes que lon souhaiterait
effectuer laide dune grammaire : la reconnaissance, qui correspond au calcul de lappar-
tenance dun mot un langage ; lanalyse (ou le parsage), qui correspond au calcul de tous
les arbres danalyse possibles pour un nonc ; la gnration, qui correspond la production
de tous les mots du langage dcrit par une grammaire. Dans la suite de ce chapitre, nous ne
nous intresserons quaux deux premires de ces tches.
Les langages hors-contexte tant une sous classe des langages rcursifs, nous savons quil
existe des algorithmes permettant daccomplir la tche de reconnaissance. En fait, il en existe
de multiples, qui, essentiellement se ramnent tous deux grands types : les analyseurs
ascendants et les analyseurs descendants. Comme expliqu dans la suite, toute la difficult
pour les analyseurs consiste affronter le non-dterminisme inhrent aux langages hors-
contexte de manire :
Ce chapitre est organis comme suit : dans la section 7.1, nous prsentons lespace de re-
cherche du parsage ; nous prsentons ensuite les stratgies ascendantes dans la section 7.2
et descendantes en section 7.3, ainsi que les problmes que pose la mise en uvre de telles
stratgies. Cette tude des analyseurs se poursuit au chapitre 8, o nous prsentons des analy-
seurs dterministes, utilisables pour certains types de grammaires ; ainsi quau chapitre 9, o
nous tudions des techniques de normalisation des grammaires, visant simplifier lanalyse,
ou se prmunir contre des configurations indsirables.
Une rfrence extrmement riche et complte pour aborder les questions de parsage est
Grune et Jacob (1990).
CHAPITRE 7. INTRODUCTION AU PARSAGE DE GRAMMAIRES HORS-CONTEXTE
Un point de vue gnral sur la question de la reconnaissance est donn par la considration
suivante. Comme toute relation binaire, la relation binaire sur les squences de (N )?
G
se reprsente par un graphe dont les sommets sont les squences de (N )? et dans lequel
un arc de vers indique que . On lappelle le graphe de la grammaire G. Ce graphe est
G
bien sr infini ds lors que L(G) est infini ; il est en revanche localement fini, signifiant que tout
sommet a un nombre fini de voisins.
La question laquelle un algorithme de reconnaissance doit rpondre est alors la suivante :
existe-t-il dans ce graphe un chemin du nud S vers le nud u ? Un premier indice : sil
en existe un, il en existe ncessairement plusieurs, correspondant plusieurs drivations
diffrentes rductibles une mme drivation gauche. Il nest donc pas ncessaire dexplorer
tout le graphe.
Pour rpondre plus compltement cette question, il existe deux grandes manires de
procder : construire et explorer de proche en proche les voisins de S en esprant rencontrer
u : ce sont les approches dites descendantes ; ou bien inversement construire et explorer les
voisins 1 de u, en essayant de remonter vers S : on appelle ces approches ascendantes. Dans
les deux cas, si lon prend soin, au cours de lexploration, de se rappeler des diffrentes tapes
du chemin, on sera alors mme de reconstruire un arbre de drivation de u.
Ces deux groupes dapproches, ascendantes et descendantes, sont considrs dans les sec-
tions qui suivent, dans lesquelles on essayera galement de suggrer que ce problme admet
une implantation algorithmique polynomiale : dans tous les cas, la reconnaissance de u de-
mande un nombre dtapes born par k|u|p pour un certain p fix qui est indpendant de
lentre.
Le second problme intressant est celui de lanalyse, cest--dire de la construction de tous
les arbres de drivation de u dans G. Pour le rsoudre, il importe non seulement de dterminer
non pas un chemin, mais tous les chemins 2 et les arbres de drivation correspondants. Nous
le verrons, cette recherche exhaustive peut demander, dans les cas o la grammaire est
ambigu, un temps de traitement exponentiel par rapport la longueur de u. En effet, dans
une grammaire ambigu, il peut exister un nombre exponentiel darbres de drivation, dont
lnumration (explicite) demandera ncessairement un temps de traitement exponentiel.
Supposons qutant donne la grammaire 6.1 des repas dominicaux, nous soyons confronts
lnonc : le fils mange sa soupe. Comment faire alors pour :
vrifier que ce mot appartient au langage engendr par la grammaire ?
lui assigner, dans le cas o la rponse est positive, une (ou plusieurs) structure(s)
arbore(s) ?
1. En renversant lorientation des arcs.
2. En fait, seulement ceux qui correspondent une drivation gauche.
92
7.2. RECONNAISSANCE ASCENDANTE
Une premire ide dexploration nous est donne par lalgorithme suivant, qui, partant des
terminaux du mot dentre, va chercher inverser les rgles de production pour parvenir
rcrire le symbole initial de la grammaire : chaque tape de lalgorithme vise rduire la
taille du proto-mot courant, en substituant la partie droite dune production par sa partie
gauche. Dans lalgorithme prsent ci-dessous, cette rduction se fait par la gauche : on
cherche rcrire le proto-mot courant en commenant par les symboles qui se trouvent le
plus gauche : chaque tape, il sagit donc didentifier, en commenant par la gauche, une
partie droite de rgle. Lorsquune telle partie droite est trouve, on la remplace par la partie
gauche correspondante et on continue. Si on ne peut trouver une telle partie droite, il faut
remettre en cause une rgle prcdemment applique (par retour en arrire) et reprendre
la recherche en explorant un autre chemin. Cette recherche sarrte lorsque le proto-mot
courante ne contient plus, comme unique symbole, que laxiome S.
Une trace de lexcution de cet algorithme est donne ci-dessous, aprs que le proto-mot
courant a t initialis avec le fils mange sa soupe :
1. on remplace le par la partie gauche de la rgle le DET. = DET fils mange sa soupe.
2. on essaie de remplacer DET en le trouvant comme partie droite. chec. Idem pour DET
fils, DET fils mange...
3. on rcrit fils : N. = DET N mange sa soupe.
4. on essaie de remplacer DET en le trouvant comme partie droite. chec.
5. on rcrit DET N : GN. = GN mange sa soupe.
6. on essaie de remplacer GN en le trouvant comme partie droite. chec. Idem pour GN
mange, GN mange sa...
7. on rcrit mange : V. = GN V sa soupe.
8. on essaie de remplacer GN en le trouvant comme partie droite. chec. Idem pour GN
V, GN V sa...
9. on rcrit V : GV. = GN GV sa soupe.
10. on essaie de remplacer GN en le trouvant comme partie droite. chec.
11. on rcrit GN GV : S. = S sa soupe.
12. on essaie de remplacer S en le trouvant comme partie droite. chec. Idem pour S sa, S
sa soupe.
13. on rcrit sa : DET. Rsultat : S DET soupe.
14. on essaie de remplacer S en le trouvant comme partie droite. chec. Idem pour S DET,
S DET soupe.
15. on essaie de remplacer DET en le trouvant comme partie droite. chec. Idem pour DET
soupe.
16. on remplace soupe par N. = S DET N.
17. on essaie de remplacer S en le trouvant comme partie droite. chec. Idem pour S DET,
S DET GN.
18. on essaie de remplacer DET en le trouvant comme partie droite. chec.
19. on remplace DET N par GN. = S GN.
20. on essaie de remplacer S en le trouvant comme partie droite. chec.
93
CHAPITRE 7. INTRODUCTION AU PARSAGE DE GRAMMAIRES HORS-CONTEXTE
21. on essaie de remplacer S GN en le trouvant comme partie droite. chec. On est bloqu :
on fait un retour arrire jusquen 11. = GN GV sa soupe.
... on va dabord parcourir entirement le choix aprs GN jusqu GN GV GN. Nouvelle
impasse. Donc on revient en arrire en 8. Et on recommence...
... tt ou tard, on devrait finalement parvenir une bonne solution.
Cette stratgie est mise en uvre par lalgorithme 7.1.
La procdure dtaille dans lalgorithme 7.1 correspond la mise en uvre dune stratgie
ascendante (en anglais bottom-up), signifiant que lon cherche construire larbre de driva-
tion depuis le bas (les feuilles) vers le haut (la racine de larbre), donc depuis les symboles
de vers S. La stratgie mise en uvre par lalgorithme 7.1 consiste explorer le graphe
de la grammaire en profondeur dabord. Chaque branche est explore de manire successive ;
chaque chec (lorsque toutes les parties droites possibles ont t successivement envisa-
ges), les choix prcdents sont remis en cause et des chemins alternatifs sont visits. Seules
quelques branches de cet arbre mneront finalement une solution. Notez quil est pos-
sible damliorer un peu bulrp pour ne considrer que des drivations droites. Comment
faudrait-il modifier cette fonction pour oprer une telle optimisation ?
Comme en tmoigne laspect un peu rptitif de la simulation prcdente, cette stratgie
conduit rpter de nombreuses fois les mmes tests, et reconstruire en de multiples
occasions les mmes constituants (voir la figure 7.2).
Lactivit principale de ce type dalgorithme consiste chercher, dans le proto-mot courant,
une squence pouvant correspondre la partie droite dune rgle. Lalternative que cette
stratgie danalyse conduit valuer consiste choisir entre remplacer une partie droite
identifie par le non-terminal correspondant (tape de rduction, en anglais reduce), ou
bien diffrer la rduction et essayer dtendre la partie droite en considrant des symboles
supplmentaires (tape dextension, on dit aussi dcalage, en anglais shift ). Ainsi les tapes de
rduction 9 et 11 dans lexemple prcdent conduisent-elles une impasse, amenant les
remplacer par des tapes dextension, qui vont permettre dans notre cas de construire lobjet
direct du verbe avant dentreprendre les bonnes rductions. Comme on peut le voir dans cet
exemple, lefficacit de lapproche repose sur la capacit de lanalyseur prendre les bonnes
dcisions (shift ou reduce) au bon moment. cet effet, il est possible de pr-calculer un
certain nombre de tables auxiliaires, qui permettront de mmoriser le fait que par exemple,
mange attend un complment, et que donc il ne faut pas rduire V avant davoir trouv ce
complment. Cette intuition sera formalise dans le chapitre suivant, la section 8.2.
94
7.3. RECONNAISSANCE DESCENDANTE
ma sur
mange
sa soupe
DET N mange
DET soupe
95
CHAPITRE 7. INTRODUCTION AU PARSAGE DE GRAMMAIRES HORS-CONTEXTE
de cette recherche sont dtectes en confrontant des prfixes terminaux du proto-mot courant
avec les terminaux de lnonc analyser. Comme prcdemment, dans une recherche en
profondeur dabord, les situations dchecs conduisent remettre en cause les choix prc-
demment effectus ; une recherche en largeur dabord conduit dvelopper simultanment
plusieurs proto-mots. La recherche sarrte lorsque le proto-mot driv depuis S est identique
la squence quil fallait analyser.
Simulons, par exemple, le fonctionnement dun analyseur en profondeur dabord :
1. S
2. GN GV
3. DET N GV
4. la N GV. chec : lentre commence par le, pas par la. On revient DET N GV
5. le N GV.
6. le fille GV. Nouvel chec = le N GV
...
7. le fils GV.
... le fils V.
... le fils boude. chec = le fils V
... le fils sennuie. chec = le fils V
... le fils mange. Il reste des terminaux non-analyss dans lentre, mais le proto-mot ne
contient plus de non-terminaux. chec et retour en 7.
...
Algorithmiquement, cette stratgie danalyse correspond une boucle dans laquelle lanaly-
seur examine le non-terminal le plus gauche du proto-mot courant et essaie de le driver
tout en restant compatible avec lnonc dentre. Cet analyseur construit donc des driva-
tions gauches. Son activit alterne des tapes de prdiction (en anglais prediction) dun symbole
terminal ou non-terminal et des tapes dappariement (en anglais matching) des terminaux pr-
dits avec les mots de lentre. Pour cette raison, le parsage descendant est souvent qualifi
de prdictif. Le pseudo-code dun tel analyseur est donn dans lalgorithme 7.3.
Une implantation classique de cette stratgie reprsente sous la forme dune pile de laquelle
est exclu le prfixe terminal u1 . . . uk : chaque tape il sagit de dpiler le non-terminal A
en tte de la pile, et dempiler la place un suffixe de la partie droite correspondante (),
96
7.4. CONCLUSION PROVISOIRE
aprs avoir vrifi que l(ventuel) prfixe terminal de (uuk+1 . . . uk + l) tait effectivement
compatible avec la partie non-encore analyse de u.
Pour que cette stratgie soit efficace, il est possible de pr-calculer dans des tables lensemble
des terminaux qui peuvent dbuter lexpansion dun non-terminal. En effet, considrons de
nouveau la grammaire 6.1 : cette grammaire possde galement les productions suivantes,
GN NP, NP Louis, NP Paul, correspondant des noms propres. ltape 2 du
parcours prcdent, lalgorithme pourrait tre (inutilement) conduit prdire un constituant
de catgorie NP, alors mme quaucun nom propre ne peut dbuter par le, qui est le premier
terminal de lnonc analyser. Cette intuition est formalise dans les analyseurs LL, qui
sont prsents dans la section 8.1.
Dans loptique dune stratgie de reconnaissance descendante, notre grammaire possde
un vice de forme manifeste, savoir la production GN GN GNP, qui est rcursive
gauche : lorsque cette production est considre, elle insre en tte du proto-mot courant un
nouveau symbole GN, qui son tour peut tre remplac par un nouveau GN, conduisant
un accroissement indfini de . Dans le cas prsent, la rcursivit gauche est relativement
simple liminer. Il existe des configurations plus complexes, dans lesquelles cette rcursivit
gauche rsulte non pas dune rgle unique mais dune squence de rgles, comme dans :
S A, A S. On trouvera au chapitre 9 une prsentation des algorithmes permettant
dliminer ce type de rcursion.
Notons, pour finir, que nous avons esquiss ci-dessus les principales tapes dune stratgie
descendante en profondeur dabord. Il est tout aussi possible denvisager une stratgie en
largeur dabord, consistant conduire de front lexamen de plusieurs proto-mots. Lcriture
dun algorithme mettant en uvre cette stratgie est laisse en exercice.
Nous avons, dans ce chapitre, dfini les premires notions ncessaires ltude des algo-
rithmes danalyse pour les grammaires algbriques. Les points de vue sur ces algorithmes
diffrent trs sensiblement suivant les domaines dapplication :
dans le cas des langages informatiques, les mots (des programmes, des documents
structurs) sont longs, voire trs longs ; lambigut est proscrire, pouvant conduire
des conflits dinterprtation. Les algorithmes de vrification syntaxique doivent donc
avoir une faible complexit (idalement une complexit linaire en fonction de la taille
de lentre) ; il suffit par ailleurs en gnral de produire une analyse et une seule. Les
algorithmes qui rpondent ce cahier des charges sont prsents au chapitre 8.
dans le cas des langues naturelles, lambigut est une des donnes du problme, quil
faut savoir contrler. Les mots tant courts, une complexit suprieure (polynomiale, de
faible degr) pour lanalyse est supportable. On peut montrer qu laide de techniques
de programmation dynamique, consistant sauvegarder dans des tables les fragments
danalyse raliss, il est possible de parvenir une complexit en O(n3 ) pour construire
dun seul coup tous les arbres danalyse. Leur numration exhaustive conserve une
complexit exponentielle.
Quel que soit le contexte, les algorithmes de parsage bnficient toujours dune tape de
97
CHAPITRE 7. INTRODUCTION AU PARSAGE DE GRAMMAIRES HORS-CONTEXTE
98
Chapitre 8
Dans ce chapitre, nous prsentons deux stratgies danalyse pour les grammaires hors-
contexte, qui toutes les deux visent produire des analyseurs dterministes. Comme pr-
sent au chapitre 7, le parsage peut tre vu comme lexploration dun graphe de recherche.
Lexploration est rendue coteuse par lexistence de ramifications dans le graphe, correspon-
dant des chemins alternatifs : ceci se produit, pour les analyseurs descendants, lorsque le
terminal le plus gauche du proto-mot courant se rcrit de plusieurs manires diffrentes
(voir la section 7.1). De telles alternatives ncessitent de mettre en uvre des stratgies de
retour arrire (recherche en profondeur dabord) ou de pouvoir explorer plusieurs chemins
en parallle (recherche en largeur dabord).
Les stratgies danalyse prsentes dans ce chapitre visent viter au maximum les circons-
tances dans lesquelles lanalyseur explore inutilement une branche de larbre de recherche
(en profondeur dabord) ou dans lesquelles il conserve inutilement une analyse dans la liste
des analyses alternatives (en largeur dabord). cet effet, ces stratgies mettent en uvre des
techniques de pr-traitement de la grammaire, cherchant identifier par avance les produc-
tions qui conduiront des chemins alternatifs ; ainsi que des contrles permettant de choisir
sans hsiter la bonne ramification. Lorsque de tels contrles existent, il devient possible de
construire des analyseurs dterministes, cest--dire des analyseurs capables de toujours faire
le bon choix. Ces analyseurs sont algorithmiquement efficaces, en ce sens quils conduisent
une complexit danalyse linaire par rapport la longueur de lentre.
La section 8.1 prsente la mise en application de ce programme pour les stratgies danalyse
descendantes, conduisant la famille danalyseurs prdictifs LL. La section 8.2 sintresse
la construction danalyseurs ascendants, connus sous le nom danalyseurs LR, et prsente
les analyseurs les plus simples de cette famille.
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
8.1 Analyseurs LL
Nous commenons par tudier les grammaires qui se prtent le mieux des analyses des-
cendantes et drivons un premier algorithme danalyse pour les grammaires SLL(1). Nous
gnralisons ensuite cette approche en introduisant les grammaires LL(1), ainsi que les algo-
rithmes danalyse correspondants.
Comme expliqu la section 7.3, les analyseurs descendants essayent de construire de proche
en proche une drivation gauche du mot u analyser : partant de S, il sagit daboutir,
par des rcritures successives du (ou des) proto-mots(s) courant(s), u. chaque tape
de lalgorithme, le non-terminal A le plus gauche est rcrit par A , conduisant
lexploration dune nouvelle branche dans larbre de recherche. Deux cas de figure sont alors
possibles :
(i) soit dbute par au moins un terminal : dans ce cas on peut immdiatement vrifier si le
proto-mot courant est compatible avec le mot analyser et, le cas chant, revenir sur
le choix de la production A . Cest ce que nous avons appel la phase dappariement.
(ii) soit dbute par un non-terminal (ou est vide) : dans ce cas, il faudra continuer de
dvelopper le proto-mot courant pour valider la production choisie et donc diffrer la
validation de ce choix.
Une premire manire de simplifier la tche des analyseurs consiste viter dutiliser dans la
grammaire les productions de type point ii : ainsi lanalyseur pourra toujours immdiatement
vrifier le bien-fond des choix effectus, lui vitant de partir dans lexploration dun cul-de-
sac.
Ceci nlimine toutefois pas toute source de non-dterminisme : sil existe un non-terminal A
apparaissant dans deux productions de type point i A a et A a, alors il faudra quand
mme considrer (en srie ou en parallle) plusieurs chemins alternatifs.
Considrons, titre dexemple, le fragment prsent par la grammaire 8.1. Elle prsente la
particularit de ne contenir que des productions de type point i ; de plus, les coins gauches
des productions associes ce terminal sont toutes diffrentes.
S if ( B ) then { I }
S while ( B ) { I }
S do { I } until ( B )
B false | true
I ...
Grammaire 8.1 Fragments dun langage de commande
Il est clair quun analyseur trs simple peut tre envisag, au moins pour explorer sans
hsitation (on dit aussi : dterministiquement) les drivations de S : soit le premier symbole
apparier est le mot-cl if , et il faut appliquer la premire production ; soit cest while et il
faut appliquer la seconde ; soit cest do et il faut appliquer la troisime. Tous les autres cas de
figure correspondent des situations derreur.
100
8.1. ANALYSEURS LL
Si lon suppose que tous les non-terminaux de la grammaire possdent la mme proprit
que S dans la grammaire 8.1, alors cest lintgralit de lanalyse qui pourra tre conduite
de manire dterministe par lalgorithme suivant : on initialise le proto-mot courant avec
S et chaque tape, on consulte les productions du non-terminal A le plus gauche, en
examinant sil en existe une dont le coin gauche est le premier symbole ui non encore
appari. Les conditions prcdentes nous assurant quil existe au plus une telle production,
deux configurations sont possibles :
il existe une production A ui , et on lutilise ; le prochain symbole apparier devient
ui+1 ;
il nen existe pas : le mot analyser nest pas engendr par la grammaire.
Cet algorithme se termine lorsque lon a limin tous les non-terminaux du proto-mot :
on vrifie alors que les terminaux non-encore apparis dans lentre correspondent bien au
suffixe du mot engendr : si cest le cas, lanalyse a russi. Illustrons cet algorithme en utilisant
la grammaire 8.2 ; le tableau 8.3 dcrit pas--pas les tapes de lanalyse de aacddcbb par cette
grammaire.
S aSb
S cC
C dC
C c
Grammaire 8.2 Une grammaire LL(1) simple
101
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
production (la transition) utiliser. Pour la grammaire 8.2, cette matrice est reproduite dans
le tableau 8.4.
a b c d
S aSb cC
C c dC
Si S est prdit et a le premier terminal non appari, alors rcrire S par aSb. Les cases vides
sont des situations dchec.
Cette analogie 1 suggre que la stratgie danalyse applique ci-dessus a une complexit
linaire : un mot de longueur k ne demandera jamais un nombre dtapes suprieur k :
le dterminisme rend lanalyse algorithmiquement efficace, ce qui justifie les efforts pour
rechercher des algorithmes dterministes.
Les grammaires prsentant les deux proprits prcdentes sont appeles des grammaires
LL(1) simples et sont dfinies formellement par :
Dfinition 8.1 (Grammaire SLL(1)). Une grammaire G = (N, , S, P) est une grammaire SLL(1)
si et seulement si :
(i) (A ) P, a , = a
(ii) A N, (A a1 1 ) P et (A a2 2 ) P et a1 1 , a2 2 a1 , a2
1. Cest un peu plus quune analogie : une grammaire rgulire, par dfinition, vrifie la proprit (i) ci-
dessus ; si elle vrifie de plus la proprit (ii), alors vous vrifierez que lalgorithme de transformation de la
grammaire en automate dcrit la section 5.2.4 aboutit en fait un automate dterministe.
102
8.1. ANALYSEURS LL
La cl du succs des analyseurs pour les grammaires SLL(1) est la possibilit de contrler sans
attendre la validit dune prdiction, rendue possible par la proprit que tout non-terminal
rcrit comme premier symbole un symbole terminal.
Considrons alors une grammaire qui na pas cette proprit, telle que celle de la gram-
maire 8.5, qui engendre des formules arithmtiques.
S S+F|F
F FT |T
T (S) | D
D 0 | | 9 | 0D | | 9D
Grammaire 8.5 Une grammaire pour les expressions arithmtiques
Examinons alors les productions de T : lune commence par rcrire le terminal ( : cela
signifie donc que T, et donc F aussi, drive des proto-mots de type (. T peut galement se
rcrire D ; ce non-terminal respecte la contrainte prcdente, nous garantissant quil rcrit
toujours en premier un chiffre entre 0 et 9. On en dduit que les drivations de T dbutent
soit par (, soit par un chiffre ; il en va alors de mme pour les drivations de F. quoi nous
sert cette information ? Dune part, dtecter une erreur ds que F apparat en tte dun
proto-mot alors quun autre terminal (par exemple + ou ) doit tre appari. Mais on peut
faire bien mieux encore : supposons en effet que lon cherche driver T. Deux productions
sont disponibles : le calcul prcdent nous fournit un moyen infaillible de choisir entre elles :
si le symbole apparier est (, il faut choisir T (S) ; sinon si cest un chiffre, il faut choisir
T D.
En dautres termes, le calcul des terminaux qui sont susceptibles dinitier une drivation
gauche permet de slectionner au plus tt entre productions ayant une mme partie gauche,
ainsi que danticiper sur lapplication errone de productions. En fait, ces symboles jouent
le mme rle que les terminaux apparaissant en coin gauche des productions de grammaire
SLL(1) et leur calcul est donc essentiel pour anticiper sur les bonnes prdictions.
Lexemple prcdent suggre une approche rcursive pour effectuer ce calcul, consistant
examiner rcursivement les coins gauches des productions de la grammaire jusqu tomber
sur un coin gauche terminal. Formalisons maintenant cette intuition.
FIRST Pour commencer, dfinissons lensemble FIRST(A) des symboles terminaux pouvant
apparatre en tte dune drivation gauche de A, soit :
103
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
NULL NULL est lensemble des non-terminaux drivant le mot . Il est dfini par :
Dfinition 8.3 (NULL). Soit G = (N, , S, P) une grammaire CF. On appelle NULL le sous-ensemble
de N dfini par :
?
NULL = {A N, A }
G
104
8.1. ANALYSEURS LL
S c | ABS
A B|a
B b|
Grammaire 8.6 Une grammaire (ambigu) pour (a | b)? c
// Initialisation.
foreach A N do FIRST0 (A) := ;
k := 0;
cont := true;
while cont = true do
k := k + 1;
foreach A N do
FIRSTk (A) := FIRSTk1 (A)
foreach (A X1 . . . Xk ) P do
j := 0;
repeat
j := j+1;
// Par convention, si X j est terminal, FIRST(X j ) = {X j }
FIRSTk (A) := FIRSTk (A) FIRSTk (X j )
until X j < NULL;
// Vrifie si un des FIRST a chang; sinon stop
cont := false;
foreach A N do
if FIRSTk (A) , FIRSTk1 (A) then
cont := true
Algorithme 8.7 Calcul de FIRST
soit gaux . Cette procdure sachve lorsquun examen de toutes les productions de P
nentrane aucun nouvel ajout dans NULL. Il est facile de voir que cet algorithme termine en
un nombre fini dtapes (au plus |N|). Illustrons son fonctionnement sur la grammaire 8.6.
Un premier examen de lensemble des productions conduit insrer B dans NULL ( cause
de B ) ; la seconde itration conduit ajouter A, puisque A B. Une troisime et dernire
itration najoute aucun autre lment dans NULL : en particulier S ne drive pas puisque
tout mot du langage engendr par cette grammaire contient au moins un c en dernire
position.
Calculer FIRST Nous savons maintenant calculer NULL : il est alors possible dcrire une
procdure pour calculer FIRST(A) pour tout A. Le pseudo-code de cette procdure est donn
par lalgorithme 8.7.
Illustrons le fonctionnement de cet algorithme sur la grammaire 8.6 : linitialisation conduit
faire FIRST(S) = FIRST(A) = FIRST(B) = . La premire itration ajoute c dans FIRST(S), puis
a dans FIRST(A) et b dans FIRST(B) ; la seconde itration conduit augmenter FIRST(S) avec
a (qui est dans FIRST(A)), puis avec b (qui nest pas dans FIRST(A), mais comme A est dans
NULL, il faut aussi considrer les lments de FIRST(B)) ; on ajoute galement durant cette
105
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
itration b dans FIRST(A). Une troisime itration ne change pas ces ensembles, conduisant
finalement aux valeurs suivantes :
FIRST(S) = {a, b, c}
FIRST(A) = {a, b}
FIRST(B) = {b}
FOLLOW FOLLOW est ncessaire pour contrler par anticipation la validit de prdictions
?
de la forme A , ou, plus gnralement A : pour valider un tel choix, il faut en effet
G
connatre les terminaux qui peuvent apparatre aprs A dans un proto-mot. Une fois ces
terminaux connus, il devient possible de valider lapplication de A en vrifiant que le
symbole apparier fait bien partie de cet ensemble ; si ce nest pas le cas, alors lutilisation
de cette production aboutira ncessairement un chec.
Formellement, on dfinit :
?
FOLLOW(A) = {a , u ? , , (N )? , S uA uAa}
Comment calculer ces ensembles ? En fait, la situation nest gure plus complique que pour
le calcul de FIRST : la base de la rcursion est que si A X1 . . . Xn est une production de G,
alors tout symbole apparaissant aprs A peut apparatre aprs Xn . La prise en compte des
non-terminaux pouvant driver complique un peu le calcul, et requiert davoir au pralable
calcul NULL et FIRST. Ce calcul se formalise par lalgorithme 8.8.
Illustrons, de nouveau, le fonctionnement de cette procdure sur la grammaire 8.6. La pre-
mire itration de cet algorithme conduit examiner la production S ABS : cette rgle
prsente une configuration traite dans la premire boucle for avec X j = A, l = 0 : les
lments de FIRST(B), soit b, sont ajouts FOLLOW1 (A). Comme B est dans NULL, on
obtient aussi que les lments de FIRST(S) sont dans FOLLOW1 (A), qui vaut alors {a, b, c}
(j = 1, l = 1). En considrant, toujours pour cette production, le cas j = 2, l = 0, il savre
que les lments de FIRST(S) doivent tre insrs galement dans FOLLOW1 (B). La suite du
droulement de lalgorithme napportant aucun nouveau changement, on en reste donc :
FOLLOW(S) =
FOLLOW(A) = {a, b, c}
FOLLOW(B) = {a, b, c}
On notera que FOLLOW(S) est vide : aucun terminal ne peut apparatre la droite de S dans
un proto-mot. Ceci est conforme ce que lon constate en observant quelques drivations : S
figure, en effet, toujours en dernire position des proto-mots qui le contiennent.
106
8.1. ANALYSEURS LL
// Initialisation
foreach A N do FOLLOW0 (A) := ;
foreach (A X1 . . . Xn ) P do
for j = 1 to n 1 do
if X j N then
for l = 0 to n j do
// Inclut le cas o X j+1 . . . X j+l+1 =
if X j+1 . . . X j+l NULL? then
FOLLOW0 (X j ) = FOLLOW0 (X j ) FIRST(X j+l+1 )
k := 0;
cont := true;
while cont = true do
k := k + 1;
foreach A N do
FOLLOWk (A) := FOLLOWk1 (A)
foreach (A X1 . . . Xn ) P do
j := n+1;
repeat
j := j-1;
FOLLOWk (X j ) := FOLLOWk (X j ) FOLLOWk (A)
until X j < NULL;
// Vrifie si un des FOLLOW a chang; sinon stop
cont := false;
foreach A N do
if FOLLOWk (A) , FOLLOWk1 (A) then cont := true ;
Algorithme 8.8 Calcul de FOLLOW
Nous avons montr la section prcdente comment calculer les ensembles FIRST() et
FOLLOW(). Nous tudions, dans cette section, comment les utiliser pour construire des
analyseurs efficaces. Lide que nous allons dvelopper consiste dduire de ces ensembles
une table M (dans N ) permettant de dterminer coup sr les bons choix effectuer pour
construire dterministiquement une drivation gauche.
Comme pralable, gnralisons la notion de FIRST des squences quelconques de (N )?
de la manire suivante 2 .
(
FIRST(X1 ) si X1 < NULL
FIRST( = X1 Xk ) =
FIRST(X1 ) FIRST(X2 Xk ) sinon
Revenons maintenant sur lintuition de lanalyseur esquiss pour les grammaires SLL(1) :
pour ces grammaires, une production de type A a est slectionne coup sr ds que A
2. Rappelons que nous avons dj tendu la notion de FIRST (et de FOLLOW) pour des terminaux quelconques
par FIRST(a) = FOLLOW(a) = a.
107
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
est le plus gauche du proto-mot courant et que a est le symbole apparier dans le mot en
entre.
Dans notre cas, cest lexamen de lensemble des lments pouvant apparatre en tte de la
drivation de la partie droite dune production qui va jouer le rle de slecteur de la bonne
production. Formellement, on commence remplir M en appliquant le principe suivant :
Si A , avec , , est une production de G et a est un lment de FIRST(),
alors on insre dans M(A, a)
Ceci signifie simplement que lorsque lanalyseur descendant voit un A en tte du proto-mot
courant et quil cherche apparier un a, alors il est licite de prdire , dont la drivation peut
effectivement dbuter par un a.
Reste prendre en compte le cas des productions de type A : lide est que ces productions
peuvent tre appliques lorsque A est le plus gauche du proto-mot courant, et que le symbole
apparier peut suivre A. Ce principe doit en fait tre gnralis toutes les productions A
o ne contient que des symboles dans NULL ( NULL? ). Ceci conduit la seconde rgle
de remplissage de M :
Si A , avec NULL? , est une production de G et a est un lment de
FOLLOW(A), alors insrer dans M(A, a).
Considrons alors une dernire fois la grammaire 8.6. Lapplication du premier principe
conduit aux oprations de remplissage suivantes :
par le premier principe on insrera c dans M(S, c), puis ABS dans les trois cases M(S, a),
M(S, b), M(S, c). Ce principe conduit galement placer a dans M(A, a), B dans M(A, b)
puis b dans M(B, b).
reste tudier les deux productions concernes par le second principe de remplissage.
Commenons par la production B : elle est insre dans M(B, x) pour tout symbole
dans FOLLOW(B), soit dans les trois cases M(B, a), M(B, b), M(B, c). De mme, la partie
droite de A B doit tre insre dans toutes les cases M(A, x), avec x dans FOLLOW(A),
soit dans les trois cases : M(A, a), M(A, b), M(A, c).
On parvient donc la configuration du tableau 8.9.
a b c
S ABS ABS ABS
c
A a B B
B
B
b
Lexamen du tableau 8.9 se rvle instructif pour comprendre comment analyser les mots
avec cette grammaire. Supposons, en effet, que lon souhaite analyser le mot bc. Le proto-mot
courant tant initialis avec un S, nous consultons la case M(S, b) du tableau 8.9, qui nous
108
8.1. ANALYSEURS LL
prescrit de rcrire S en ABS. Comme nous navons vrifi aucun symbole dans lopration,
nous consultons maintenant la case M(A, b). De nouveau la rponse est sans ambigut :
appliquer A B. ce stade, les choses se compliquent : lopration suivante demande
de consulter la case M(B, b), qui contient deux productions possibles : B b et B .
Si, toutefois, on choisit la premire, on aboutit rapidement un succs de lanalyse : b
tant appari, il sagit maintenant dapparier le c, partir du proto-mot courant : BS. Aprs
consultation de la case M(B, c), on limine le B ; choisir S c dans la case M(S, c) achve
lanalyse.
Pour aboutir ce rsultat, il a toutefois fallu faire des choix, car le tableau 8.9 ne permet pas
de mettre en uvre une analyse dterministe. Ceci est d lambigut de la grammaire 8.6,
dans laquelle plusieurs (en fait une infinit de) drivations gauches diffrentes sont possibles
pour le mot c (comme pourra sen persuader le lecteur en en listant quelques-unes).
Nous sommes finalement en mesure de dfinir les grammaires LL(1) et de donner un algo-
rithme pour les analyser.
Dfinition 8.5 (Grammaire LL(1)). Une grammaire hors-contexte est LL(1) si et seulement si sa
table danalyse prdictive M() contient au plus une squence de (N )? pour chaque valeur (A, a)
de N .
Toutes les grammaires ne sont pas LL(1), comme nous lavons vu la section prcdente en
tudiant une grammaire ambigu. Il est, en revanche, vrai que toute grammaire LL(1) est
non ambigu. La dmonstration est laisse en exercice.
Une grammaire LL(1) est susceptible dtre analyse par algorithme 8.10 (on suppose que la
construction de M est une donne de lalgorithme).
8.1.6 LL(1)-isation
109
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
S if B then S
S if B then S else S
...
Grammaire 8.11 Une grammaire non-LL(1) pour if -then-else
Le mot cl if slectionne maintenant une production unique ; cest aussi vrai pour else. Le
fragment dcrit dans la grammaire 8.12 devient alors susceptible dtre analys dterminis-
tiquement (vrifiez-le en examinant comment appliquer coup sr S0 ).
Ce procd se gnralise au travers de la construction utilise pour dmontrer le thorme
suivant :
Thorme 8.6 (Factorisation gauche). Soit G = (N, , S, P) une grammaire hors-contexte, alors
il existe une grammaire quivalente G0 telle que si A X1 Xk et A Y1 Yl sont deux
A-productions de G0 , alors X1 , Y1 .
S if B then S S0
S0 else S |
...
Grammaire 8.12 Une grammaire factorise gauche pour if -then-else
110
8.1. ANALYSEURS LL
Le rattrapage sur erreur La dtection derreur, dans un analyseur LL(1), correspond une
configuration (non-terminal A le plus gauche, symbole a apparier) pour laquelle la table
danalyse ne prescrit aucune action. Le message donner lutilisateur est alors clair :
Arriv au symbole numro X, jai rencontr un a alors que jaurais d avoir . . . (suit
lnumration des symboles tels que M(A, .) est non-vide).
Stopper l lanalyse est toutefois un peu brutal pour lutilisateur, qui, en gnral, souhaite
que lon dtecte en une seule passe toutes les erreurs de syntaxe. Deux options sont alors
possibles pour continuer lanalyse :
sil nexiste quun seul b tel que M(A, b) est non-vide, on peut faire comme si on venait
de voir un b, et continuer. Cette stratgie de rcupration derreur par insertion com-
porte toutefois un risque : celui de dclencher une cascade dinsertions, qui pourraient
empcher lanalyseur de terminer correctement ;
lalternative consisterait dtruire le a et tous les symboles qui le suivent jusqu
trouver un symbole pour lequel une action est possible. Cette mthode est de loin
prfrable, puisquelle conduit une procdure qui est assure de se terminer. Pour
obtenir un dispositif de rattrapage plus robuste, il peut tre souhaitable dabandonner
compltement tout espoir dtendre le A et de le faire disparatre : lanalyse reprend
alors lorsque lon trouve, dans le flux dentre, un symbole dans FOLLOW(A).
Les grammaires LL(k) Nous lavons vu, toutes les grammaires ne sont pas LL(1), mme
aprs limination des configurations les plus problmatiques (rcursions gauches...). Ceci
signifie que, pour au moins un couple (A, a), M(A, a) contient plus dune entre, indiquant
que plusieurs prdictions sont en concurrence. Une ide simple pour lever lindtermination
concernant la bonne expansion de A consiste augmenter le regard avant. Cette intuition se
formalise travers la notion de grammaire LL(k) et danalyseur LL(k) : pour ces grammaires,
il suffit dun regard avant de k symboles pour choisir sans hsitation la A-production
appliquer ; les tables danalyse correspondantes croisent alors des non-terminaux (en ligne)
avec des mots de longueur k (en colonne). Il est important de raliser que ce procd ne
permet pas de traiter toutes les grammaires : cest videmment vrai pour les grammaires
111
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
ambigus ; mais il existe galement des grammaires non-ambigus, pour lesquelles aucun
regard avant de taille born ne permettra une analyse descendante dterministe.
Ce procd de gnralisation des analyseurs descendants, bien que fournissant des rsultats
thoriques importants, reste dune donc utilit pratique modeste, surtout si on compare cette
famille danalyseurs lautre grande famille danalyseurs dterministes, les analyseurs de
type LR, qui font lobjet de la section suivante.
Nous dtaillons dans cette section les constructions dun analyseur LL pour la grammaire 8.5,
qui est rappele dans la grammaire 8.13, sous une forme lgrement modifie. Laxiome est
la variable Z.
Z S#
S S+T |T
T TF|F
F (S) | D
D 1|2
Grammaire 8.13 Une grammaire (simplifie) pour les expressions arithmtiques
Z S#
S TS0
S0 +TS0 |
T FT0
T0 FT0 |
F (S) | D
D 1|2
Grammaire 8.14 Une grammaire LL pour les expressions arithmtiques
Le calcul de NULL permet didentifier S0 et T0 comme les seules variables drivant le mot vide.
Les tapes du calcul des ensembles FIRST et FOLLOW sont dtailles dans le tableau 8.15.
Il est alors possible de dterminer la table danalyse prdictive, reprsente dans le ta-
bleau 8.16. Cette table est sans conflit, puisque chaque case contient au plus une production.
Cette table permet effectivement danalyser dterministiquement des expressions arithm-
tiques simples, comme le montre la trace dexcution du tableau 8.17.
112
8.2. ANALYSEURS LR
FIRST FOLLOW
It. 1 2 3 4 5 It. 0 1 2
Z ( (12 Z
S ( (12 (12 S #) #) #)
S0 + + + + + S0 #) #)
T ( (12 (12 (12 T + +#) +#)
T0 * * * * * T0 +#) +#)
F ( (12 (12 (12 (12 F * *+#) *+#)
D 12 12 12 12 12 D *+#) *+#)
# + ( ) 1 2
Z Z S# Z S# Z S#
S S TS0 S TS0 S TS0
S0 S0 S0 + TS0 S0
T T FT0 T FT0 T FT0
T T
0 0 T
0 0
T FT 0 T
0
F T (S) TD TD
D D1 D2
8.2 Analyseurs LR
8.2.1 Concepts
Comme voqu la section 7.2, les analyseurs ascendants cherchent rcrire le mot ana-
lyser afin de se ramener, par des rductions successives, laxiome de la grammaire. Les
bifurcations dans le graphe de recherche correspondent alors aux alternatives suivantes :
(i) la partie droite dune production A est trouve dans le proto-mot courant ; on
choisit de remplacer par A pour construire un nouveau proto-mot et donc dappliquer
une rduction.
(ii) on poursuit lexamen du proto-mot courant en considrant un autre facteur 0 , obtenu,
par exemple, en tendant par la droite. Cette action correspond un dcalage de
lentre.
Afin de rationaliser lexploration du graphe de recherche correspondant la mise en uvre de
cette dmarche, commenons par dcider dune stratgie dexamen du proto-mot courant :
linstar de ce que nous avons mis en uvre dans lalgorithme 7.1, nous lexaminerons
toujours depuis la gauche vers la droite. Si lon note le proto-mot courant, factoris en
= , o est la partie dj examine, lalternative prcdente se rcrit selon :
possde un suffixe correspondant la partie droite dune rgle : rduction et
dveloppement dun nouveau proto-mot.
est tendu par la droite par dcalage dun nouveau terminal.
113
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
Cette stratgie conduit la construction de drivations droites de lentre courante. Pour vous
en convaincre, remarquez que le suffixe du proto-mot courant nest jamais modifi : il ny
a toujours que des terminaux droite du symbole rcrit, ce qui est conforme la dfinition
dune drivation droite.
Illustrons ce fait en considrant la grammaire 8.18.
S AB
A aA | b
B bB | a
Grammaire 8.18 Une grammaire pour a? bb? a
Soit alors u = abba ; une analyse ascendante de ce mot est reproduite au tableau 8.19.
En considrant les rductions opres, on obtient la drivation : S AB AbB Aba
G G G G
aAba abba, qui est effectivement une drivation droite. On note galement quon a introduit
G
un troisime type daction de lanalyseur, consistant accepter lentre comme un mot de
la grammaire. Il existe enfin un quatrime type daction, non reprsent ici, consistant
diagnostiquer une situation dchec de lanalyse.
Dernire remarque concernant cette trace : les diffrentes transformations possibles de via
les actions de rduction et de dcalage nagissent que sur les suffixes de . Ceci suggre
dimplanter sous la forme dune pile, sur laquelle saccumulent (puis se rduisent) pro-
gressivement les symboles de u. Si lon adopte ce point de vue, une pile correspondant la
trace du tableau 8.19 passerait par les tats successifs suivants : a, ab, aA, A, Ab, Aba, AbB, AB,
S. Bien naturellement, cette implantation demanderait galement de conserver un pointeur
vers la position courante dans u, afin de savoir quel symbole empiler. Dans la suite, nous
ferons lhypothse que est effectivement implant sous la forme dune pile.
Comment procder pour rendre ce processus dterministe ? Cherchons des lments de
rponse dans la trace danalyse prsente dans le tableau 8.19. Ce processus contient quelques
114
8.2. ANALYSEURS LR
Action
abba abba dcaler
abba a bba dcaler
abba ab ba rduire par A b
aAba aA ba rduire par A aA
Aba A ba dcaler
Aba Ab a dcaler
Aba Aba rduire par B a
AbB AbB rduire par B bB
AB AB rduire par S AB
S fin : accepter lentre
actions dterministes, comme la premire opration de dcalage : lorsquen effet (la pile) ne
contient aucun suffixe correspondant une partie droite de production, dcaler est lunique
action possible.
De manire duale, lorsque est vide, dcaler est impossible : il faut ncessairement rduire,
lorsque cela est encore possible : cest, par exemple, ce qui est fait durant la dernire rduction.
Un premier type de choix correspond au second dcalage : = a est ce moment gal une
partie droite de production (B a), pourtant on choisit ici de dcaler (ce choix est presque
toujours possible) plutt que de rduire. Notons que la dcision prise ici est la (seule) bonne
dcision : rduire prmaturment aurait conduit positionner un B en tte de , conduisant
lanalyse dans une impasse : B napparaissant en tte daucune partie droite, il aurait t
impossible de le rduire ultrieurement. Un second type de configuration (non reprsente
ici) est susceptible de produire du non-dterminisme : il correspond au cas o lon trouve
en queue de deux parties droites de productions : dans ce cas, il faudra choisir entre deux
rductions concurrentes.
Rsumons-nous : nous voudrions, de proche en proche, et par simple consultation du sommet
de la pile, tre en mesure de dcider dterministiquement si laction effectuer est un dcalage
ou bien une rduction (et dans ce cas quelle est la production utiliser), ou bien encore si
lon se trouve dans une situation derreur. Une condition suffisante serait que, pour chaque
production p, on puisse dcrire lensemble Lp des configurations de la pile pour lesquelles
une rduction par p est requise ; et que, pour deux productions p1 et p2 telles que p1 , p2 , Lp1
et Lp2 soient toujours disjoints. Voyons quelle(s) condition(s) cela est possible.
115
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
?
LA = { = ( N)? tq. v ? , S Av v}
D D
En dautres termes, tout mot de LA contient un suffixe et est tel quil existe une
rduction dun certain v en S qui dbute par la rduction de en A. Chaque fois quun tel
mot apparat dans la pile dun analyseur ascendant gauche-droit, il est utile doprer la
rduction A ; linverse, si lon trouve dans la pile un mot absent de LA , alors cette
rduction ne doit pas tre considre, mme si ce mot se termine par .
Examinons maintenant de nouveau la grammaire 8.18 et essayons de calculer les langages Lp
pour chacune des productions. Le cas de la premire production est clair : il faut imprative-
ment rduire lorsque la pile contient AB, et cest l le seul cas possible. On dduit directement
que LSAB = {AB}. Considrons maintenant A aA : la rduction peut survenir quel que
soit le nombre de a prsents dans la pile. En revanche, si la pile contient un symbole diffrent
de a, cest quune erreur aura t commise. En effet :
une pile contenant une squence baA ne pourra que se rduire en AA, dont on ne sait
plus que faire ; ceci proscrit galement les piles contenant plus dun A, qui aboutissent
pareillement des configurations dchec ;
une pile contenant une squence B . . . A ne pourra que se rduire en BA, dont on ne sait
non plus comment le transformer.
En consquence, on a : LAaA = aa? A. Des considrations similaires nous amnent conclure
que :
LAb = a? b ;
LBbB = Abb? B ;
LBa = Ab? a ;
Chacun des ensembles Lp se dcrivant par une expression rationnelle, on dduit que len-
semble des Lp se reprsente sur lautomate 8.20, qui ralise lunion des langages Lp . Vous
noterez de plus que (i) lalphabet dentre de cet automate contient la fois des symboles
terminaux et non-terminaux de la grammaire ; (ii) les tats finaux de lautomate 8.20 sont
associs aux productions correspondantes ; (iii) toute situation dchec dans lautomate cor-
respond un chec de lanalyse : en effet, ces configurations sont celles o la pile contient
un mot dont lextension ne peut aboutir aucune rduction : il est alors vain de continuer
lanalyse.
Comment utiliser cet automate ? Une approche nave consiste mettre en uvre la procdure
suivante : partant de ltat initial qi = q0 et dune pile vide on applique des dcalages jusqu
atteindre un tat final q. On rduit ensuite la pile selon la production associe q, donnant lieu
une nouvelle pile qui induit un repositionnement dans ltat qi = ? (q0 , ) de lautomate.
La procdure est itre jusqu puisement simultan de la pile et de u. Cette procdure est
formalise travers lalgorithme 8.21.
Lalgorithme 8.21 est inefficace : en effet, chaque rduction, on se repositionne ltat initial
de lautomate, perdant ainsi le bnfice de lanalyse des symboles en tte de la pile. Une
meilleure implantation consiste mmoriser, pour chaque symbole de la pile, ltat q atteint
116
8.2. ANALYSEURS LR
A aA
2
a A
b Ab
1 3
a b b
B B bB
0 5 6
A b a
S
a Ba
4 7
9 B
S AB
8
// Initialisation.
:= // Initialisation de la pile.
q := q0 // Se positionner dans ltat initial.
i := j := 0;
while i |u| do
while j || do
j := j + 1;
q := (q, j )
while q < F do
:= ui // Empilage de ui
if (q, ui ) existe then q := (q, ui ) else return false ;
i := i + 1
// Rduction de p = A .
:= 1 A ;
j := 0;
q := q0
if = S q F then return true else return false;
Algorithme 8.21 Reconnaissance ascendante guide par un automate A = (
N, Q, q0 , F, ). Version 1
117
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
// Initialisations.
:= (, q0 ) // Initialisation de la pile.
q := q0 // Se positionner dans ltat initial.
i := 0;
while i |u| do
while q < F do
if (q, ui ) existe then
q := (q, ui ) // Progression dans A.
push(, (ui , q)) // Empilage de (ui , q).
i := i + 1
else
return false
// On atteint un tat final: rduction de p = A .
j := 0;
// Dpilage de .
while j < || do
pop();
j := j + 1
// (x, q) est sur le sommet de la pile: repositionnement.
push(, (A, (q, A)));
q := (q, A);
if = (S, q) q F then return true else return false ;
Algorithme 8.22 Reconnaissance ascendante guide par un automate A = (
N, Q, q0 , F, ). Version 2
dans A. la suite dune rduction, on peut alors directement se positionner sur q pour
poursuivre lanalyse. Cette amlioration est mise en uvre dans lalgorithme 8.22.
Notez, pour finir, que lon effectue en fait deux sortes de transitions dans A : celles qui
sont effectues directement lissue dun dcalage et qui impliquent une extension de la
pile ; et celles qui sont effectues lissue dune rduction et qui consistent simplement
un repositionnement ne ncessitant pas de nouveau dcalage. Ces deux actions sont parfois
distingues, lune sous le nom de dcalage (shift), lautre sous le nom de goto.
De lautomate prcdent, se dduit mcaniquement une table danalyse (dite LR(0)), donne
pour lautomate 8.20 au tableau 8.23. Cette table rsume les diffrentes actions effectuer en
fonction de ltat courant de lautomate.
Le tableau 8.23 se consulte de la faon suivante. Pour chaque tat, la colonne Action
dsigne lunique type daction effectuer :
s
effectuer un dcalage. Lire le symbole en tte de pile, si cest un x, consulter la colonne
correspondante dans le groupe Shift , et transiter dans ltat correspondant. Attention :
le dcalage a bien lieu de manire inconditionnelle, cest--dire indpendamment de
la valeur du symbole empil ; en revanche, cette valeur dtermine la transition de
lautomate exercer.
rA
118
8.2. ANALYSEURS LR
Shift Goto
tat Action a b A B
0 s 1 3 4
1 s 1 3 2
2 r A aA
3 rAb
4 s 7 5 8
5 s 7 5 6
6 r B bB
7 rBa
8 r S AB
rduire la pile selon A . lissue de la rduction, le A sera pos sur la pile. Transiter
vers ltat correspondant A dans le groupe Goto et ltat au sommet de la pile
aprs en avoir retir .
Toutes les autres configurations (qui correspondent aux cases vides de la table) sont des
situations derreur. Pour distinguer, dans la table, les situations o lanalyse se termine avec
succs, il est courant dutiliser la transformation suivante :
on ajoute un nouveau symbole terminal reprsentant la fin du texte, par exemple # ;
on transforme G en G0 en ajoutant un nouvel axiome Z et une nouvelle production
Z S#, o S est laxiome de G.
on transforme lentre analyser en u# ;
ltat (final) correspondant la rduction Z S# est (le seul) tat dacceptation, puis-
quil correspond la fois la fin de lexamen de u (# est empil) et la prsence du
symbole S en tte de la pile.
Il apparat finalement, qu laide du tableau 8.23, on saura analyser la grammaire 8.18
de manire dterministe et donc avec une complexit linaire. Vous pouvez vrifier cette
affirmation en tudiant le fonctionnement de lanalyseur pour les entres u = ba (succs),
u = ab (chec), u = abba (succs).
Deux questions se posent alors : (i) peut-on, pour toute grammaire, construire un tel auto-
mate ? (ii) comment construire lautomate partir de la grammaire G ? La rponse (i) est
non : il existe des grammaires (en particulier les grammaires ambigus) qui rsistent toute
analyse dterministe. Il est toutefois possible de chercher se rapprocher de cette situation,
comme nous le verrons la section 8.2.3. Dans lintervalle, il est instructif de rflchir la
manire de construire automatiquement lautomate danalyse A.
Lintuition de la construction se fonde sur les remarques suivantes. Initialement, on dispose
de u, non encore analys, quon aimerait pouvoir rduire en S, par le biais dune srie non-
encore dtermine de rductions, mais qui sachvera ncessairement par une rduction de
type S .
Supposons, pour linstant, quil nexiste quune seule S-production : S X1 . . . Xk : le but
original de lanalyse aboutir une pile dont S est lunique symbole en ayant dcal tous les
119
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
X1 X2 Xk S X1 . . . Xk
0 1 2 k
Chaque tat le long de cette branche correspond la rsolution dun sous-but supplmentaire,
la transition Xi annonant lempilage de Xi , et dclenchant la recherche dun moyen dempiler
Xi+1 . Pour formaliser cette ide, nous introduisons le concept de production (ou rgle) pointe 3 .
Dfinition 8.8 (Production pointe). Une production pointe dune grammaire hors-contexte G
est un triplet (A, , ) de N (N )? (N )? , avec A = une production de G. Une
production pointe est note avec un point : A .
Une production pointe exprime la rsolution partielle dun but : A exprime que la
rsolution du but empiler A en terminant par la rduction A a t partiellement
accomplie, en particulier que a dj t empil et quil reste encore empiler les symboles de
. Chaque tat de la branche de lautomate correspondant la production A sidentifie
ainsi une production pointe particulire, les tats initiaux et finaux de cette branche
correspondant respectivement : A et A .
Retournons notre problme original, et considrons maintenant le premier des sous-buts :
empiler X1 au fond de la pile . Deux cas de figure sont possibles :
soit X1 est symbole terminal : le seul moyen de lempiler consiste effectuer une
opration de dcalage, en cherchant un tel symbole en tte de la partie non encore
analyse de lentre courante.
soit X1 est un non-terminal : son insertion dans la pile rsulte ncessairement dune
srie de rductions, dont la dernire tape concerne une X1 -production : X1 Y1 . . . Yn .
De nouveau, le but observer X1 au fond de la pile se dcompose en une srie de sous-
buts, donnant naissance une nouvelle branche de lautomate pour le mot Y1 . . . Yn .
Comment relier ces deux branches ? Tout simplement par une transition entre les deux
tats initiaux, indiquant que lempilage de X1 se rsoudra en commenant lempilage
de Y1 (voir la figure 8.25). Sil existe plusieurs X1 -productions, on aura une branche (et
une transition ) par production.
Ce procd se gnralise : chaque fois quune branche porte une transition (q, X) = r,
avec X un non-terminal, il faudra ajouter une transition entre q et tous les tats initiaux
des branches correspondants aux X-productions.
3. On trouve galement le terme ditem et en anglais de dotted rule.
120
8.2. ANALYSEURS LR
X1 X2 Xk S X1 X2 . . . Xk
S X1 X2 . . . Xk S X1 X2 . . . Xk
Y1 Y2 Yn X1 Y1 Y2 . . . Yn
X1 Y1 Y2 . . . Yn X1 Y1 Y2 . . . Yn
Ce rsultat assure, en particulier, que lorsque lon atteint un tat final de lautomate (pour
= ), la pile contient effectivement un mot appartenant au contexte LR(0) de la production
associe ltat final atteint.
Il est naturellement possible de dterminiser cet automate, en appliquant les algorithmes
de suppression des transitions spontanes (voir le thorme 4.13), puis la construction des
sous-ensembles dcrite dans le thorme 4.9 ; on prendra soin de propager lors de ces trans-
formations linformation de rduction associe aux tats finaux des branches. En clair, si un
tat q du dterminis contient une production pointe originale de type A , alors q sera
un tat (final) dans lequel cette rduction est possible. Le lecteur est vivement encourag
entreprendre cette dmarche et vrifier quil retrouve bien, en partant de la grammaire 8.18,
un automate ressemblant fortement lautomate 8.20.
Une construction directe de lautomate LR(0) consiste construire la vole les ensembles
ditems qui dfinissent les tats de lautomate dterminis, ainsi que les transitions associes.
Soit I un ensemble ditems, on dfinit tout dabord la clture de I comme :
Dfinition 8.10 (Clture dun ensemble ditems LR(0)). La clture cl(I) dun ensemble I ditems
LR(0) est le plus petit ensemble vrifiant :
I cl(I)
121
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
Une grammaire LR(0) peut tre analyse de manire dterministe. La dfinition dune gram-
maire LR(0) correspond des contraintes qui sont souvent, dans la pratique, trop fortes pour
des grammaires relles , pour lesquelles la construction de la table LR(0) aboutit des
conflits. Le premier type de configuration problmatique correspond une indtermination
entre dcaler et rduire (conflit shift/reduce) ; le second type correspond une indtermina-
tion sur la rduction appliquer ; on parle alors de conflit reduce/reduce. Vous noterez, en
revanche, quil ny a jamais de conflit shift/shift. Pourquoi ?
Comme pour les analyseurs descendants, il est possible de lever certaines indterminations
en sautorisant un regard en avant sur lentre courante ; les actions de lanalyseur seront alors
conditionnes non seulement par ltat courant de lautomate danalyse, mais galement par
les symboles non-analyss. Ces analyseurs font lobjet de la section qui suit.
Commenons par tudier le cas le plus simple, celui o les conflits peuvent tre rsolus avec
un regard avant de 1. Cest, par exemple, le cas de la grammaire 8.26 :
S E# (1)
E T+E|T (2), (3)
Tx (4)
Considrons une entre telle que x + x + x : sans avoir besoin de construire la table LR(0),
il apparat quaprs avoir empil le premier x, puis lavoir rduit en T, par T x, deux
alternatives vont soffrir lanalyseur :
4. Un L pour left-to-right, un R pour rightmost derivation, un 0 pour 0 lookahead ; en effet, les dcisions
(dcalage vs. rduction) sont toujours prises tant uniquement donn ltat courant (le sommet de la pile).
122
8.2. ANALYSEURS LR
LR(1)
5. En fait, les prendre toutes est un peu excessif, comme il apparatra bientt.
123
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
Les numros de rgles associs aux rductions correspondent lordre dans lesquelles elles
apparaissent dans la table ci-dessus (1 pour S E#...). On notera que la signification des
en-ttes de colonne change lgrement entre les deux reprsentations : dans la table LR(0),
les actions sont effectues sans regard avant ; les labels de colonnes indiquent des transitions ;
dans la table SLR, les actions rduire et dcaler sont effectues aprs consultation du
regard avant. Ltat 6 est un tat dacceptation ; par la convention selon laquelle un fichier se
termine par une suite infinie de #, cette action est reporte en colonne # : en quelque sorte
FOLLOW(S) = {#}. Par consquent, lire un # dans ltat 1 de la table SLR conduira bien
accepter lentre (a).
q0 = [Z , ?], o ? est un symbole joker qui vaut pour nimporte quel symbole
terminal ;
F = {[A , a], avec A P} ; chaque tat final est associe la production A ,
correspondant la rduction oprer ;
q = [A X, a] Q, (q, X) = [A X , a] ; comme prcdemment, ces
transitions signifient la progression de la rsolution du but courant par empilement de
X;
q = [A B, a] Q tq. B N, q0 = [B , b] tq. b FIRST(a), (q, ) = q0 .
La condition supplmentaire b FIRST(a) (voir la section 8.1.3) introduit une informa-
tion de dsambigusation qui permet de mieux caractriser les rductions oprer. En
particulier, dans le cas LR(1), on espre quen prenant en compte la valeur du premier
symbole drivable depuis a , il sera possible de slectionner la bonne action effectuer
en cas de conflit sur B.
Pour illustrer ce point, considrons de nouveau la grammaire 8.26. Ltat initial de lau-
tomate LR(1) correspondant est [S E#] ; lequel a deux transitions , correspondant
aux deux faons dempiler un E, atteignant respectivement les tats q1 = [E T + E, #]
et q2 = [E T, #]. Ces deux tats se distinguent par leurs transitions sortantes : dans
le cas de q1 , vers [T x, +] ; dans le cas de q2 , vers [T x, #]. lissue de la
rduction dun x en T, le regard avant permet de dcider sans ambigut de laction :
si cest un +, il faut continuer de chercher une rduction E T + E ; si cest un #, il
faut rduire selon E T.
124
8.2. ANALYSEURS LR
S0 S#
S V=E|E
E V
V E | x
Grammaire 8.28 Une grammaire pour les manipulations de pointeurs
125
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
S #
[S S#, ?] [S S #, ?] [S S# , ?]
V = E
[S V = E, #] [S V = E, #] [S V = E, #] [S V = E , #]
E
[S E, #] [S E , #]
V
[E V, #] [E V , #]
V
[E V, =] [E V , =]
x
[V x, #] [V x , #]
x [V
[V x, =] x , =]
* E
[V * E, #] [V * E, #] [V * E , #]
* E
[V * E, =] [V * E, =] [V * E , =]
Pour amliorer la lisibilit, les ne sont pas reprsents. Ltat dacceptation est reprsent
en gras.
Pour vous aider dans votre construction, lautomate 8.29 permet de visualiser leffet de lajout
du regard avant sur la construction de lautomate danalyse.
126
8.2. ANALYSEURS LR
Cette procdure de construction du DFA A est dtaille dans lalgorithme 8.30, qui utilise
deux fonctions auxiliaires pour effectuer directement la dterminisation.
En guise dapplication, vous vrifierez que la mise en uvre de lalgorithme 8.30 construit
directement le dterminis de lautomate 8.29.
127
CHAPITRE 8. INTRODUCTION AUX ANALYSEURS DTERMINISTES
8.2.4 Complments
LR et LL La famille des analyseurs LR(k) permet danalyser tous les langages LL(k) et bien
dautres langages non-ambigus. La raison de cette plus grande gnricit des analyseurs
LR est au fond leur plus grande prudence : alors quun analyseur LL(k) doit pouvoir
slectionner sans erreur une production A sur la seule base des k symboles terminaux
non encore apparis (dont tout ou partie peut tre driv de A), un analyseur LR(k) fonde sa
dcision dappliquer une rduction A sur (i) la connaissance de lintgralit de la partie
droite et (ii) la connaissance des k symboles terminaux droite de A. Pour k fix, il est alors
normal quun analyseur LR(k), ayant plus dinformation sa disposition quun analyseur
LL(k), fasse des choix plus clairs, faisant ainsi porter moins de contraintes sur la forme de
la grammaire.
LR et LALR et ... Utiliser un gnrateur danalyseurs tel que bison ne fait que reporter
sur la machine la charge de construire (et manipuler) un gros automate ; ce qui, en dpit
de lindniable bonne volont gnrale des machines, peut malgr tout poser problme. Le
remde le plus connu est dessayer de compresser avec perte, lorsque cela est possible (et cest
le cas gnral) les tables danalyse LR(1), donnant lieu la classe danalyseurs LALR(1), qui
sont ceux que construit yacc. Il existe de nombreuses autres variantes des analyseurs LR
visant fournir des solutions pour sauver le dterminisme de lanalyse, tout en maintenant
les tables dans des proportions raisonnables.
Notes historiques Linvention de LL est due Conway (1963). Sa formalisation fut faite
par Lewis et Stearns (1968). On doit la dcouverte de la famille LR Donald Knuth en 1965
(Knuth, 1965). Il est galement lorigine de lappellation LL.
128
Chapitre 9
Dans ce chapitre, nous tudions quelques rsultats complmentaires concernant les gram-
maires hors-contexte, rsultats qui garantissent dune part que les cas de rgles potentielle-
ment problmatiques pour lanalyse (productions , rcursions gauches...) identifies dans
les discussions du chapitre 7 possdent des remdes bien identifis ; dautre part, quil est
possible dimposer a priori des contraintes sur la forme de la grammaire, en utilisant des
transformations permettant de mettre les productions sous une forme standardise. On parle,
dans ce cas, de grammaires sous forme normale. Nous prsentons dans ce chapitre les deux
formes normales les plus utiles, la forme normale de Chomsky et la forme normale de
Greibach.
Dans cette section, nous nous intressons tout dabord aux procdures qui permettent de
simplifier les grammaires CF, en particulier pour faire disparatre un certain nombre de
configurations potentiellement embarrassantes pour les procdures danalyse.
Commenons par deux rsultats lmentaires, que nous avons utiliss sans les formaliser
diffrentes reprises.
Une premire notion utile est celle du langage engendr par un non-terminal A. Formelle-
ment,
Dfinition 9.1 (Langage engendr par un non-terminal). Soit G = (N, , S, P) une grammaire
CF. On appelle langage engendr par le non-terminal A, not LA (G), le langage engendr par la
grammaire G0 = (N, , A, P).
Le langage engendr par un non-terminal est donc le langage obtenu en choisissant ce non-
terminal comme axiome. Le langage engendr par la grammaire G est alors simplement le
langage L(G) = LS (G).
CHAPITRE 9. NORMALISATION DES GRAMMAIRES CF
Dfinition 9.2 (Sous-grammaire). Soit G = (N, , S, P) une grammaire CF. On appelle sous-
grammaire toute grammaire G0 = (N, , S, P0 ), avec P0 P. Si G0 est une sous-grammaire de G,
alors L(G0 ) L(G).
Dmonstration. Le lemme prcdent concernant les sous-grammaires nous assure que L(G)
L(G0 ). Inversement, soit u dans L(G0 ) : si sa drivation nutilise pas la production A ,
alors la mme drivation existe dans G ; sinon si sa drivation utilise A , alors il existe
?
une drivation dans G utilisant A .
G
Nous terminons cette section par un second procd permettant de construire des grammaires
quivalentes, qui utilise en quelque sorte la distributivit des productions.
Lemme 9.4 ( Distributivit des drivations). Soit G une CFG, A 1 B2 une A-production
de G et {B 1 , . . . , B n } lensemble des B-productions. Alors, la grammaire G0 drive de G
en supprimant A 1 B2 et en ajoutant aux productions de G lensemble {A 1 1 2 , . . . , A
1 n 2 } est faiblement quivalente G.
La seule contrainte dfinitoire pose sur les productions des CFG est que leur partie gauche
soit rduite un non-terminal. Toutefois, un certain nombre de configurations posent des
problmes pratiques, notamment lorsquil sagit de mettre en uvre des algorithmes dana-
lyse. Nous nous intressons, dans cette section, aux configurations qui, sans introduire de
difficults majeures, sont source dinefficacit.
Une premire source dinefficacit provient de lexistence de non-terminaux napparaissant
que dans des parties droites de rgles. En fait, ces non-terminaux ne drivent aucun mot
et peuvent tre supprims, ainsi que les rgles qui y font rfrence, sans altrer le langage
engendr par la grammaire.
130
9.1. SIMPLIFICATION DES GRAMMAIRES CF
Une configuration voisine est fournie par des non-terminaux (diffrents de laxiome) qui
napparatraient dans aucune partie droite. Ces non-terminaux ne pouvant tre drivs de
laxiome, ils sont galement inutiles et peuvent tre supprims.
Enfin, les non-terminaux improductifs sont ceux qui, bien que drivables depuis laxiome,
napparaissent dans aucune drivation russie, parce quils sont impossibles liminer.
Pensez, par exemple, un non-terminal X qui napparatrait (en partie gauche) que dans une
seule rgle de la forme X aX.
Formalisons maintenant ces notions pour construire un algorithme permettant de se dbar-
rasser des non-terminaux et des productions inutiles.
Dfinition 9.5 (Utilit dune production et dun non-terminal). Soit G une CFG, on dit quune
? P
production P = A de G est utile si et seulement sil existe un mot w tel que S xAy
G G
?
xy w. Sinon, on dit que P est inutile.
G
De mme, on qualifie dutiles les non-terminaux qui figurent en partie gauche des rgles utiles.
Lidentification des productions et non-terminaux utiles se fait en appliquant les deux pro-
cdures suivantes :
La premire tape consiste tudier successivement toutes les grammaires GA =
(N, , A, P) pour A N. Le langage L(GA ) contient donc lensemble des mots qui se
drivent depuis le non-terminal A. Il existe un algorithme (cf. la section 6.3) permettant
de dterminer si L(GA ) est vide. On construit alors G0 en supprimant de G tous les
non-terminaux A pour lesquels L(GA ) = , ainsi que les productions dans lesquels ils
apparaissent 1 . La grammaire G0 ainsi construite est fortement quivalente G. En effet :
L(G0 ) L(G), par le simple fait que G0 est une sous-grammaire de G ; de plus, les
drivations gauches de G0 sont identiques celles de G.
? ?
L(G) L(G0 ) : sil existe un mot u ? tel que S u mais pas S 0 u, alors
G G
ncessairement la drivation de u contient un des non-terminaux limins de G.
Ce non-terminal drive un des facteurs de u, donc engendre un langage non-vide,
ce qui contredit lhypothse.
Cette procdure nest toutefois pas suffisante pour garantir quun non-terminal est
utile : il faut, de plus, vrifier quil peut tre driv depuis S. Cest lobjet de la seconde
phase de lalgorithme.
Dans une seconde tape, on construit rcursivement les ensembles NU et PU contenant
respectivement des non-terminaux et des productions. Ces ensembles contiennent ini-
tialement respectivement S et toutes les productions de partie gauche S. Si, une tape
donne de la rcursion, NU contient A, alors on ajoute PU toutes les rgles dont A est
partie gauche, et NU tous les non-terminaux figurant dans les parties droites de ces
rgles. Cette procdure sarrte aprs un nombre fini ditrations, quand plus aucun
1. La procdure esquisse ici est mathmatiquement suffisante, mais algorithmiquement nave. Une impl-
mentation plus efficace consisterait dterminer de proche en proche lensemble des non-terminaux engendrant
un langage non-vide, par une procdure similaire celle dcrite plus loin. Lcriture dun tel algorithme est
laisse en exercice.
131
CHAPITRE 9. NORMALISATION DES GRAMMAIRES CF
S a | AB
A b
Grammaire 9.1 limination des productions inutiles : lordre importe
Les cycles correspondent des configurations mettant en jeu des productions improduc-
tives de la forme A B. Ces productions, que lon appelle non-gnratives, effectuent
un simple renommage de variable, sans rellement entraner la gnration (immdiate ou
indirecte) de symboles terminaux.
Ces productions sont potentiellement nuisibles pour les algorithmes de gnration ou encore
danalyse ascendante, qui peuvent tre conduits dans des boucles sans fin. Ceci est vident
dans le cas de productions de type A A, mais apparat galement lorsque lon a des cycles
de productions non-gnratives comme dans : A B, B C, C A. Ces cycles doivent
donc faire lobjet dun traitement particulier. Fort heureusement, pour chaque mot dont la
drivation contient un cycle, il existe galement une drivation sans cycle, suggrant quil
est possible de se dbarrasser des cycles sans changer le langage reconnu. Cest prcisment
ce quaffirme le thorme suivant :
Thorme 9.6 (limination des cycles). Soit G une CFG. On peut contruire une CFG G0 , faiblement
quivalente G, qui ne contient aucune production de la forme A B, o A et B sont des non-
terminaux.
Avant de rentrer dans les dtails techniques, donnons lintuition de la construction qui
va tre dveloppe dans la suite : pour se dbarrasser dune rgle A B sans perdre
de drivation, il suffit de rajouter la grammaire une rgle A pour chaque rgle
B : ceci permet effectivement bien de court-circuiter la production non-gnrative.
Reste un problme rsoudre : que faire des productions B C ? En dautres termes,
comment faire pour sassurer quen se dbarrassant dune production non-gnrative, on
nen a pas ajout une autre ? Lide est de construire en quelque sorte la clture transitive de
ces productions non-gnratives, afin de dtecter (et de supprimer) les cycles impliquant de
telles productions.
132
9.1. SIMPLIFICATION DES GRAMMAIRES CF
S A A B B bb C B
S B A B B C C Aa
A aB C aAa
Grammaire 9.2 Une grammaire contenant des productions non-gnratives
CS = {S, A, B, C}
CA = {A, B, C}
CB = {B, C}
CC = {B, C}
La grammaire 9.3, G0 , contient alors les productions qui correspondent aux quatre seules
productions gnratives : a aB, B bb, C aAa, C Aa.
133
CHAPITRE 9. NORMALISATION DES GRAMMAIRES CF
S aB B bb A aB C aAa
S bb B aAa A bb C Aa
S aAa B Aa A aAa C bb
S Aa A Aa
Grammaire 9.3 Une grammaire dbarrasse de ses productions non-gnratives
9.1.4 Productions
Ce rsultat dit deux choses : dune part que lon peut liminer toutes les productions
sauf peut-tre une (si L(G)), dont la partie gauche est alors laxiome ; dautre part que
laxiome lui-mme peut tre rendu non-rcursif (i.e. ne figurer dans aucune partie droite).
Lintuition du premier de ces deux rsultats sexprime comme suit : si S drive , ce ne peut
tre quau terme dun enchanement de productions nimpliquant que des terminaux qui
engendrent . En propageant de manire ascendante la proprit de driver , on se ramne
une grammaire quivalente dans laquelle seul laxiome drive (directement) .
134
9.1. SIMPLIFICATION DES GRAMMAIRES CF
Productions de G Productions de G0
S ASB | c S ASB | AS | SB | S | c
A aA | B A aA | a | B
B b| B b
Cette procdure est illustre par la grammaire 9.4 : G contenant deux terminaux qui drivent
le mot vide (N = {A, B}), les productions de G0 se dduisent de celles de G en considrant
toutes les manires possibles dviter davoir utiliser ces terminaux.
On appelle directement rcursifs les non-terminaux A dune grammaire G qui sont tels que
? ?
A A (rcursion gauche) ou A A (rcursion droite). Les productions impliquant des
rcursions gauches directes posent des problmes aux analyseurs descendants, qui peuvent
tre entrans dans des boucles sans fin (cf. les sections 7.3 et 8.1). Pour utiliser de tels analy-
seurs, il importe donc de savoir se dbarrasser de telles productions. Nous nous attaquons
ici aux rcursions gauches directes ; les rcursions gauches indirectes seront traites plus loin
( la section 9.2.2).
Il existe un procd mcanique permettant dliminer ces productions, tout en prservant le
langage reconnu. Lintuition de ce procd est la suivante : de manire gnrique, un terminal
rcursif gauche est impliqu dans la partie gauche de deux types de production : celles qui
sont effectivement rcursives gauche et qui sont de la forme :
A A1 | A2 . . . | An
A 1 | 2 . . . | m
135
CHAPITRE 9. NORMALISATION DES GRAMMAIRES CF
Leffet net de lutilisation de ces productions conduit donc des drivations gauches de A
dans lesquelles on accumule droite de A un nombre arbitraire de i ; llimination de A
introduisant en tte du proto-mot le symbole (terminal ou non-terminal) x j . Formellement :
?
A Ai1 Ai2 i1 . . . Ain . . . i1
G G G
On vrifie, par les techniques habituelles de preuve (e.g. par induction sur la longueur des
drivations) que cette transformation produit bien une grammaire (faiblement) quivalente
la grammaire de dpart.
En guise dillustration, reprenons la grammaire 8.5 des expressions arithmtiques, entre-
vue lors de notre prsentation des analyseurs LL(1). La grammaire 9.5, qui rappelle cette
grammaire 2 , contient deux terminaux directement rcursifs gauche.
S SF|F
F F/T | T
T (S) | D
D 0 | . . . | 9 | 0D | . . . | 9D
Grammaire 9.5 Une grammaire pour les expressions arithmtiques
Le premier non-terminal traiter est S, qui contient une rgle directement rcursive et
une rgle qui ne lest pas. On introduit donc le nouveau symbole S0 , ainsi que les deux
productions : S FS0 | F et S0 FS0 | F. Le traitement du symbole F se droule de
manire exactement analogue.
La notion de forme normale dune grammaire rpond la ncessit, pour un certain nombre
dalgorithmes de parsage, de disposer dune connaissance a priori sur la forme des produc-
tions de la grammaire. Cette connaissance est exploite pour simplifier la programmation
2. une diffrence prs, et de taille : nous utilisons ici les oprateurs et /, qui sont ceux qui sont associatifs
par la gauche et qui justifient lcriture dune grammaire avec une rcursion gauche. Si lon avait que + et , il
suffirait dcrire les rgles avec une rcursion droite et le tour serait jou !
136
9.2. FORMES NORMALES
dun algorithme de parsage, ou encore pour acclrer lanalyse. Les principales formes nor-
males (de Chomsky et de Greibach) sont dcrites dans les sections qui suivent. On verra
que les algorithmes de mise sous forme normale construisent des grammaires faiblement
quivalentes la grammaire dorigine : les arbres de drivation de la grammaire normalise
devront donc tre transforms pour reconstruire les drivations (et les interprtations) de la
grammaire originale.
Thorme 9.9 (Forme normale de Chomsky). Toute grammaire hors-contexte admet une gram-
maire faiblement quivalente dans laquelle toutes les productions sont soit de la forme A BC, soit
?
de la forme A a, avec A, B, C des non-terminaux et a un terminal. Si, de surcrot, S , alors
G
la forme normale contient galement S . Cette forme est appele forme normale de Chomsky,
abrge en CNF conformment la terminologie anglaise (Chomsky Normal Form).
Supposons que cette proprit soit vraie pour toutes les drivations de longueur n et soit A et
?
u tels que A u en n+1 tapes. La premire production est de la forme : A x1 A1 x2 A2 Ak ,
o chaque xi ne contient que des terminaux. Par hypothse de rcurrence, les portions de
u engendres dans G par les variables Ai se drivent galement dans G0 ; par construction
137
CHAPITRE 9. NORMALISATION DES GRAMMAIRES CF
?
chaque xi se drive dans G0 en utilisant les nouvelles variables Aa , donc A 0 u. La rciproque
G
se montre de manire similaire.
Seconde phase de la procdure : les seules productions de G0 dans lesquelles apparaissent
des terminaux sont du type recherch A a ; il sagit maintenant de transformer G0 en G00
de manire que toutes les productions qui contiennent des non-terminaux en partie droite en
contiennent exactement 2. Pour aboutir ce rsultat, il suffit de changer toutes les productions
de type A B1 ...Bm , m 3 dans G0 par lensemble des productions suivantes (les non-
terminaux Di sont crs pour loccasion) : {A B1 D1 , D1 B2 D2 , ... , Dm2 Bm1 Bm }. De
nouveau, il est relativement direct de montrer que le langage engendr par G00 est le mme
que celui engendr par G.
Les arbres de drivation des grammaires CNF ont une forme extrmement caractristique,
puisque chaque nud interne de larbre a soit un fils unique et ce fils est une feuille portant
un symbole terminal ; soit exactement deux fils et ces deux fils sont des variables.
Comme exemple dapplication, entreprenez la mise sous forme normale de Chomsky de la
grammaire 9.6. Le rsultat auquel vous devez aboutir est la grammaire 9.7.
S bA A a B b
S aB A aS B bS
A bAA B aBB
Grammaire 9.6 Une grammaire Chomsky-normaliser
S Ab A A a B b Aa a
S Aa B A Aa S B Ab S Ab b
A Ab D1 B Aa D2 D1 AA
D2 BB
Grammaire 9.7 Une grammaire Chomsky-normalise
En plus de son importance thorique, cette forme normale prsente de nombreux avantages :
un premier avantage est que les terminaux sont introduits par des productions ddies,
de type A a (au moins une par terminal). Ceci savre particulirement bienvenu
pour les algorithmes de parsage descendant.
La mise sous CNF facilite galement les tapes de rduction des analyseurs ascendants,
puisquil suffit simplement de regarder les couples de non-terminaux successifs pour
juger si une telle opration est possible.
En revanche, cette transformation conduit en gnral une augmentation sensible du nombre
de productions dans la grammaire. Cette augmentation joue dans le sens dune pnalisation
gnrale des performances des analyseurs.
138
9.2. FORMES NORMALES
tion 9.1.5), dans la mesure o elle impose une contrainte qui garantit que chaque production
augmente de manire strictement monotone le prfixe terminal du proto-mot en cours de
drivation. la diffrence de la forme normale de Chomsky, lexistence de la forme normale
de Greibach est plus utilise pour dmontrer divers rsultats thoriques que pour fonder des
algorithmes danalyse.
La forme normale de Greibach est dfinie dans le thorme suivant :
Thorme 9.10 (Forme normale de Greibach). Tout langage hors-contexte L ne contenant pas
peut tre engendr par une grammaire dont toutes les productions sont de la forme A a, avec a un
terminal et est une squence de non-terminaux (ventuellement vide). Cette grammaire est appele
forme normale de Greibach, en abrg GNF, conformment la terminologie anglaise.
Si L contient , alors ce rsultat reste valide, en ajoutant toutefois une rgle S , qui drive
depuis laxiome, comme dmontr la section 9.1.4.
Lemme 9.11. Soit G une grammaire CF. Il existe une grammaire quivalente G0 dont toutes les
productions sont de la forme :
Ai a, avec a
Ai A j , et A j est class strictement aprs Ai dans lordonnancement des non-terminaux
(j > i).
La procdure de construction de G0 est itrative et traite les terminaux dans lordre dans
lequel ils sont ordonns. On note, pour dbuter, que si lon a pris soin de se ramener une
grammaire dont laxiome est non rcursif, ce que lon sait toujours faire (cf. le rsultat de la
section 9.1.4), alors toutes les productions dont S = A0 est partie gauche satisfont par avance
la proprit du lemme 9.11. Supposons que lon a dj trait les non-terminaux numrots
de 0 i 1, et considrons le non-terminal Ai . Soit Ai une production dont Ai est partie
gauche, telle que dbute par une variable A j . Trois cas de figure sont possibles :
(a) j < i : A j est class avant Ai ;
(b) j = i : A j est gale Ai ;
(c) j > i : A j est class aprs Ai ;
139
CHAPITRE 9. NORMALISATION DES GRAMMAIRES CF
Pour les productions de type (a), on applique itrativement le rsultat du lemme 9.4 en
traitant les symboles selon leur classement : chaque occurrence dun terminal A j , j < i est
remplace par lexpansion de toutes les parties droites correspondantes. Par lhypothse de
rcurrence, tous les non-terminaux ainsi introduits ont ncessairement un indice strictement
suprieur i. Ceci implique qu lissue de cette phase, toutes les productions dduites de
Ai sont telles que leur partie droite ne contient que des variables dont lindice est
au moins i. Toute production dont le coin gauche nest pas Ai satisfait par construction la
proprit du lemme 9.11 : laissons-les en ltat. Les productions dont le coin gauche est Ai
sont de la forme Ai Ai , sont donc directement rcursives gauche. Il est possible de
transformer les Ai - productions selon le procd de la section 9.1.5, sans introduire en coin
gauche de variable prcdant Ai dans le classement. En revanche, cette procdure conduit
introduire de nouveaux non-terminaux, qui sont conventionnellement numrots depuis
n + 1 dans lordre dans lequel ils sont introduits. Ces nouveaux terminaux devront subir le
mme traitement que les autres, traitement qui est toutefois simplifi par la forme des rgles
(rcursions droites) dans lesquels ils apparaissent. Au terme de cette transformation, tous les
non-terminaux dindice suprieur i + 1 satisfont la proprit du lemme 9.11, permettant
la rcurrence de se poursuivre.
Notons qu lissue de cette phase de lalgorithme, cest--dire lorsque le terminal dindice
maximal n + p a t trait, G0 est dbarrasse de toutes les chanes de rcursions gauches : on
peut en particulier envisager de mettre en uvre des analyses descendantes de type LL et
satteler la construction de la table danalyse prdictive correspondante (voir la section 8.1).
Cette premire partie de la construction est illustre par le tableau 9.8.
Considrons maintenant ce quil advient aprs que lon achve de traiter le dernier non-
terminal An+p . Comme les autres, il satisfait la proprit que le coin gauche de toutes les
An+p -productions est soit un terminal, soit un non-terminal dindice strictement plus grand.
Comme ce second cas de figure nest pas possible, cest donc que toutes les An+p -productions
sont de la forme : An+p a, avec a , qui est la forme recherche pour la GNF. Considrons
alors les An+p1 productions : soit elles ont un coin gauche terminal, et sont dj conformes
la GNF ; soit elles ont An+p comme coin gauche. Dans ce second cas, en utilisant de nouveau
le procd du lemme 9.4, il est possible de remplacer An+p par les parties droites des An+p -
productions et faire ainsi merger un symbole terminal en coin gauche. En itrant ce processus
pour i = n + p i = 0, on aboutit, de proche en proche, une grammaire quivalente celle de
dpart et qui, de plus, est telle que chaque partie droite de production dbute par un terminal.
Il reste encore liminer les terminaux qui apparatraient dans les queues de partie droite
(cf. la mise sous CNF) pour obtenir une grammaire qui respecte les contraintes nonces
ci-dessus.
Pour complter cette section, notons quil existe des variantes plus contraintes de la GNF, qui
constituent pourtant galement des formes normales. Il est en particulier possible dimposer,
dans la dfinition du thorme 9.10, que toutes les parties droites de production contiennent
au plus deux variables : on parle alors de forme normale de Greibach quadratique (Salomaa,
1973, p.202).
140
9.2. FORMES NORMALES
tat initial S A2 A2
A1 A1 A1 | a
A2 A1 A1 | A2 A1 | b
Traitement de A1 S A2 A2
A1 a | aR1 A3 est nouveau
A2 A1 A1 | A2 A1 | b
R1 A1 | A1 R1 rcursion droite
Traitement de A2 S A2 A2
(premire tape) A1 aA1 | aA1 R1
A2 aA1 A1 | aA1 R1 A1 | A2 A1 | b
R1 A1 | A1 R1
Traitement de A2 S A2 A2
(seconde tape) A1 aA1 | aA1 A3
A2 aA1 A1 | aA1 A3 A1 | b | aA1 A1 A4 | aA1 A3 A1 A4 | bA4
A3 A1 | A1 A3
A4 A1 | A1 A4
Traitement de A3 S A2 A2
A1 aA1 | aA1 A3
A2 aA1 A1 | aA1 A3 A1 | b | aA1 A1 A4 | aA1 A3 A1 A4 | bA4 A4 est nouveau
A3 aA1 | aA1 A3 | aA1 A3 A3
A4 A1 | A1 A4
Traitement de A4 S A2 A2
A1 aA1 | aA1 A3
A2 aA1 A1 | aA1 A3 A1 | b | aA1 A1 A4 | aA1 A3 A1 A4 | bA4
A3 aA1 | aA1 A3 | aA1 A3 A3
A4 aA1 | aA1 A4 | aA1 A3 | aA1 A3 A4
141
CHAPITRE 9. NORMALISATION DES GRAMMAIRES CF
142
Chapitre 10
Notions de calculabilit
Si le langage est infini, un tel algorithme dnumration ne termine donc pas. On peut donner
une dfinition quivalente des langages semi-dcidables, en termes dalgorithmes prenant
un mot en entre et rpondant Vrai si le mot appartient au langage.
Proposition 10.2. Un langage L est semi-dcidable si et seulement sil existe un algorithme A
tel que pour tout mot u :
Chapitre rdig par Pierre Senellart.
CHAPITRE 10. NOTIONS DE CALCULABILIT
Les langages semi-dcidables sont ainsi ceux qui sont reconnus par un algorithme, sans
prsager du comportement de cet algorithme sur les mots qui ne sont pas dans le langage.
Les langages dcidables, par contre, ont un algorithme qui dcide si oui ou non un mot
appartient au langage :
Dfinition 10.3. Un langage L est rcursif (ou dcidable, ou calculable) sil existe un
algorithme A qui, prenant un mot u de en entre, termine et produit Vrai si u est dans L et Faux
sinon. On dit alors que lalgorithme A dcide le langage L.
videmment, tout langage dcidable est galement semi-dcidable ; dans ce qui suit, nous
allons voir que tout langage nest pas ncessairement semi-dcidable, et que tout langage
semi-dcidable nest pas ncessairement dcidable.
Dans cette partie, nous allons montrer quil existe des langages non semi-dcidables. Ce
rsultat est assez simple dmontrer et il repose sur des arguments de cardinalit, cest--
dire, du nombre de langages semi-dcidables par rapport au nombre de langages.
Nous commenons par quelques rappels de mathmatiques lmentaires. tant donn un
ensemble E, lensemble des parties de E, not 2E , est lensemble de tous les sous-ensembles
de E (X E et X 2E sont ainsi synonymes). tant donns deux ensembles A et B, on
144
10.2. LANGAGES NON SEMI-DCIDABLES
Nous sommes maintenant arms pour prouver lexistence de langages non semi-dcidables :
Thorme 10.5. Soit un alphabet. Il existe un langage L tel que L nest pas semi-dcidable.
Lide de la dmonstration est de montrer que lensemble des langages semi-dcidables est in-
fini dnombrable (car ils sont indexs par les algorithmes) tandis que lensemble des langages
est infini non dnombrable (comme ensemble des parties dun ensemble dnombrable).
Dmonstration. Soit A lensemble de tous les algorithmes numrant des langages sur .
Pour A A, on note f (A) le langage numr par A. Par dfinition de la semi-dcidabilit,
f est une surjection de A vers lensemble des langages semi-dcidables. Chaque algorithme
de A a une description finie, par exemple comme une suite dinstructions dun langage de
programmation, ou comme une suite de bits. Autrement dit, chaque algorithme de A est
dcrit par un mot dun certain langage, sur un certain alphabet 0 (disons, 0 = { 0, 1 } pour
une description par suite de bits). Donc A peut tre vu comme un sous-ensemble de 0 :
il y a une injection de A vers 0 et donc une surjection g de 0 vers A. Par ailleurs, il est
facile de construire une bijection h de N vers 0 : on numre les mots un un par taille
croissante (, 0, 1, 00, 01, 10, 11, 001. . .) et on affecte chaque entier n N le n + 1-me mot
de cette numration. Au final, f g h est une surjection de N vers lensemble des langages
semi-dcidables et ce dernier est infini dnombrable.
Considrons maintenant lensemble de tous les langages, 2 . Supposons par labsurde que
tous les langages soient semi-dcidables. Alors daprs la remarque prcdente, il existe une
surjection f g h de N vers 2 . Mais on vient de voir quil tait possible de construire une
145
CHAPITRE 10. NOTIONS DE CALCULABILIT
Cette preuve montre en fait quil existe beaucoup plus de langages non semi-dcidables (une
infinit non dnombrable) que de langages semi-dcidables (une infinit dnombrable). Nous
donnerons la fin de la partie suivante quelques exemples de langages non semi-dcidables,
mais la plupart des langages non semi-dcidables nont en fait pas de description en franais
puisquil ny a quun nombre infini dnombrable de telles descriptions !
Les langages non semi-dcidables ont peu dintrt en pratique : il nexiste pas dalgorithme
dnumration pour ces langages donc il est rare de sy intresser. Un langage qui serait semi-
dcidable mais non dcidable est par contre beaucoup plus intressant : on peut numrer
lensemble de ses mots, mais on ne peut pas en fournir dalgorithme de reconnaissance. Le
mathmaticien David Hilbert avait fix comme lun des grands dfis des mathmatiques du
20e sicle le problme de dcision (Entscheidungsproblem) : parvenir une mthode automatique
de calcul permettant de prouver si un rsultat mathmatique est vrai ou faux. Lexistence de
langages semi-dcidables (donc formellement descriptibles) mais non dcidables (donc pour
lequel il est impossible de dcider de lappartenance dun mot) a pour consquence limpos-
sibilit de rsoudre le problme de dcision de Hilbert. Certains langages correspondant
des concepts trs utiles en pratique se trouvent tre semi-dcidables mais non dcidables.
Nous allons montrer que cest le cas du langage de larrt.
Le langage de larrt est lensemble H des mots sur un alphabet donn dcrivant les couples
dalgorithmes et entres tels que lalgorithme termine sur cette entre. Formellement, soit
= { 0, 1 }. Soit A lensemble des algorithmes prenant en entre un mot u de . Quitte
rencoder en binaire les descriptions des algorithmes, on peut voir tout algorithme A de A
comme un mot de . Quitte galement ajouter un codage spcial pour les paires, on peut
voir toute paire forme dun algorithme A A et dun mot u comme un mot f (A, u)
de , f tant une injection de A vers (on peut faire en sorte que f et f 1 soient
exprimables par un algorithme de A). Le langage de larrt est lensemble H tel que
x H si et seulement si il existe A A et u avec x = f (A, u) et A sarrtant sur u.
La preuve de non-dcidabilit du langage de larrt utilise encore une fois un argument
diagonal.
Thorme 10.6 (Turing). Le langage de larrt est semi-dcidable mais non dcidable.
146
10.3. LANGAGES NON DCIDABLES
Largument diagonal, lide de coder les algorithmes par des mots du langage et le rsultat
lui-mme rappellent la preuve du thorme dincompltude de Gdel, qui est un analogue
pour la logique mathmatique du thorme de larrt de Turing en logique informatique.
Le thorme de Gdel nonce que dans tout systme formel permettant dexprimer larith-
mtique, il existe des noncs mathmatiques que lon ne peut ni prouver ni infirmer. Le
thorme de larrt montre que quand on se fixe un modle de calcul suffisamment puissant,
il existe des proprits mathmatiques de ce modle de calcul qui ne peuvent tre calcules.
Beaucoup de problmes concrets dans de nombreux domaines de linformatique sont ainsi
dcrits par des langages semi-dcidables mais non dcidables. Ici, le problme dterminer si
x X a la proprit P est dcrit par le langage lensemble des x X qui ont la proprit P .
Dans tous les exemples ci-dessous, lensemble des x X lui-mme est toujours dcidable.
tant donns deux ensembles de mots, dterminer si une squence de mots du premier
ensemble peut tre identique une squence de mots du second ensemble (problme
de correspondance de Post).
tant donnes des rgles de calcul dans un groupe, dterminer si deux expressions sont
gales.
147
CHAPITRE 10. NOTIONS DE CALCULABILIT
Nous prcisons maintenant ce que nous entendons par un algorithme dans les parties qui
prcdent. Rappelons quun algorithme est un procd de calcul automatique prenant en
entre des donnes ventuelles (un mot sur un certain alphabet) et produisant en sortie des
donnes (un mot sur un certain alphabet). Une des mthodes les plus pratiques de formaliser
cette notion dalgorithme est par le biais des machines de Turing, qui peuvent tre vues comme
des automates finis bande. Nous dfinissons les machines de Turing dans le cas simple o la
sortie est soit Vrai soit Faux ; on peut facilement tendre la dfinition au cas o la machine
produit une sortie non boolenne, par exemple en rajoutant une seconde bande.
Dfinition 10.7. Une machine de Turing (dterministe) est la donne de :
(i) un ensemble fini Q dtats ;
(ii) un alphabet de travail ;
(iii) b est un symbole spcial blanc ;
(iv) \{b} est lalphabet dentre/sortie ;
(v) q0 est un tat initial ;
(vi) F Q est un ensemble dtats finaux ;
(vii) : Q\F Q {L, R} est une fonction de transition.
tant donne une machine de Turing (Q, , b, , q0 , F, ), un calcul sur lentre u est une
squence de configurations { (qk , k , ik ) }16k6n o qk Q est ltat courant, k : Z est une
fonction associant un symbole chaque position dune bande virtuelle infinie, et ik Z est la position
actuelle sur la bande. On impose que la squence de configurations respecte les proprits suivantes :
q1 = q0 , i1 = 0, 1 (x) = ux pour 1 6 x 6 |u| et 1 (x) = b pour x < [1, |u|].
Pour 1 6 k 6 n 1, (qk , k ) = (qk+1 , k+1 , ) avec :
ik+1 = ik + 1 si = R, ik+1 = ik 1 sinon ;
Pour x , ik , k (x) = k+1 (x) ;
Pour x = ik , k (x) = k et k+1 (x) = k+1 .
Un calcul dune machine de Turing est dit acceptant (ou produisant Vrai) sil conduit un tat
final, chouant (ou produisant Faux) sil conduit un tat non final depuis lequel il nexiste pas de
transition possible.
De mme quun automate fini dterministe, une machine de Turing effectue un calcul sur un
mot dentre pour dterminer si le mot est accept ou non. Ici, le calcul est plus complexe que
pour un automate car les transitions peuvent galement dpendre des symboles crits sur
une bande de papier de taille non borne (dcrite par les k ) ; noter cependant quun calcul
acceptant ou chouant donn nutilisera quune partie finie de cette bande.
Pour un exemple de machine de Turing et de son excution, voir http://ironphoenix.org/
tril/tm/ (Palindrome Detector).
Les machines de Turing peuvent tre utilises comme modle de calcul pour les notions
de semi-calculabilit et calculabilit, ce qui donne un cadre formel aux rsultats prsents
dans les parties prcdentes. Elles sont galement utilises pour formaliser les notions de
complexit dun problme : la complexit est la longueur du calcul que doit faire une machine
de Turing pour rsoudre ce problme en fonction de la taille de lentre.
148
10.4. MODLES DE CALCULS
De manire trs intressante, un grand nombre dautres formalismes ont le mme pouvoir
dexpression que les machines de Turing, cest--dire quils permettent de dcider exactement
les mmes langages.
-calcul. Introduit par Church paralllement Turing, ce formalisme, la base des langages
de programmation fonctionnels, est bas sur la dfinition et lapplication de fonctions
rcursives, dcrites dans un langage logique muni de rgles de rduction permettant de
rcrire ces formules logiques.
Fonctions rcursives. La thorie des fonctions rcursives a t labore par Gdel et Kleene
comme modle de fonction calculable bas sur un ensemble de fonctions et primitives
de base : fonctions constantes, composition, rcursion, etc.
Machines registres. Une alternative aux machines de Turing plus proche des ordinateurs
moderne est celle des machines registres : ici, la mmoire nest plus reprsente comme
une bande infinie, mais comme un ensemble de registres mmoire (ou variables) qui
peuvent tre lus et crits dans un ordre quelconque. Larchitecture de von Neumann,
utilise pour concevoir les premiers ordinateurs, est un exemple de ces machines
registres.
Langages de programmation Turing-complets. La plupart des langages utiliss pour d-
velopper des logiciels 1 sont Turing-complets : si on suppose quils sont excuts dans
un environnement sans limite de mmoire, ils permettent de dcider nimporte quel
langage dcidable par une machine de Turing.
Les grammaires gnratives de type 0, introduites par Chomsky, ne sont pas un modle de
calcul proprement parler, mais engendrent exactement les langages semi-dcidables.
Cette remarquable quivalence de modles formels aussi divers de ce que peut tre un
processus automatique de calcul a conduit Church et Turing formuler ce quon appelle
la thse de ChurchTuring : ce qui est intuitivement calculable (ou ce qui est humainement
calculable), cest ce qui est calculable par une machine de Turing (ou par le -calcul, etc.).
1. Les exceptions sont quelques rares langages qui sont utiliss pour des buts spcifiques, comme SQL sans
les fonctions utilisateurs pour linterrogation de bases de donnes relationnelles, ou XPath pour la navigation
dans les arbres XML.
149
CHAPITRE 10. NOTIONS DE CALCULABILIT
150
Deuxime partie
Annexes
Chapitre 11
Complments historiques
Ce chapitre porte sur lhistoire de linformatique. Le but est de donner un contexte historique
aux grandes notions et rsultats abords dans le cours, en expliquant brivement qui ont
t les logiciens et informaticiens qui ont laiss leurs noms aux notions de calculabilit et de
langages formels.
154
11.1. BRVES BIOGRAPHIES
fut lun des premiers tenter de baser les mathmatiques sur un raisonne-
ment logique formel. Les lois de De Morgan expriment que la ngation dune
disjonction est la conjonction des ngations, et vice-versa.
est connu pour ses travaux sur la thorie des fonctions rcursives, un modle
de calculabilit, mais surtout pour deux rsultats fondamentaux de logique
mathmatique : le thorme de compltude de Gdel montre que tout rsul-
tat vrai dans tout modle de la logique du premier ordre est dmontrable ;
le thorme dincompltude de Gdel montre que dans tout systme formel
permettant dexprimer larithmtique, il existe des noncs mathmatiques
que lon ne peut ni prouver ni infirmer. Il mourut dans des circonstances
tragiques : victime de paranoa, il tait convaincu quon cherchait lempoi-
sonner, et refusa petit petit de salimenter.
est une chercheuse en langages formels. Elle est en particulier connue pour la
forme normale de Greibach dune grammaire hors-contexte et ses consquences
sur lquivalence entre grammaires hors-contexte et automates pile.
155
CHAPITRE 11. COMPLMENTS HISTORIQUES
est reconnu comme lun des plus grands mathmaticiens ayant exist. Il a
apport des contributions majeures dans de nombreux domaines, comme
la gomtrie, lanalyse (p. ex., espaces de Hilbert), la physique mathmatique
et la logique. En 1900, il nonce 23 problmes ouverts importants des ma-
thmatiques. Cette liste a eu une trs grande influence sur la recherche en
mathmatique au 20e sicle. Lun de ces problmes, le problme de dcision
(ou Entscheidungsproblem), consistait obtenir une procdure automatique
permettant de dcider si un nonc mathmatique est vrai ou faux. En 1920,
Hilbert nonce un programme pour laxiomatisation des mathmatiques, par lequel tout
nonc mathmatique pourrait tre prouv ou infirm partir des axiomes. Kurt Gdel a
montr que cela tait impossible ; Alonzo Church et Alan Turing en ont indpendamment d-
duit limpossibilit de rsoudre le problme de dcision. Lpitaphe de David Hilbert rsume
sa vision de la science :
Wir mssen wissen. (Nous devons savoir.)
Wir werden wissen. (Nous saurons.)
156
11.1. BRVES BIOGRAPHIES
est connu pour ses travaux sur la conception logique des circuits lectro-
niques. Il est en particulier lauteur avec W. V. Quine de la mthode de Quine
McCluskey de minimisation de fonctions boolennes en utilisant la notion
dimpliquants premiers.
est lun des fondateurs de la thorie des automates. Il introduit lalgorithme de minimisation
qui porte son nom, et la notion dautomate avec sortie (introduite galement indpendam-
ment par George H. Mealy).
157
CHAPITRE 11. COMPLMENTS HISTORIQUES
Pour approfondir lhistoire de la thorie des langages, voir les auteurs suivants : Hodges
(1992), Doxiadis et Papadimitriou (2010), Dowek (2007), Turing (1936), Barsky (1997), Perrin
(1995).
158
11.2. POUR ALLER PLUS LOIN
Attributions
Certaines photographies sont reproduites en vertu de leur licence dutilisation Creative
Commons, et attribues :
John Backus : Pierre Lescanne
Stephen C. Kleene : Konrad Jacobs (Mathematisches Forschungsinstitut Oberwolfach)
Peter Naur : Eriktj (Wikipedia EN)
Kenneth Thompson : Bojars (Wikimedia)
Les photographies suivantes sont reproduites en vertu du droit de citation :
Janusz Brzozowski
Alonzo Church
Sheila Greibach
Vladimir Levenshtein
Edward F. McCluskey
Les autres photos sont dans le domaine public.
159
CHAPITRE 11. COMPLMENTS HISTORIQUES
160
Chapitre 12
1. Pour L1 , on vrifie que le choix de I1 = {a}, F1 = {a} et T1 = {ab, ba, bb} garantit L1 =
(I1 ? ? F1 ) \ ? T1 ? .
Pour L2 , il en va de mme pour I2 = {a}, F2 = {b} et T2 = {aa, bb}.
6. Lintuition de ce beau rsultat est quun automate fini A est dfini par son tat initial,
ses tats finaux, et ses transitions. Transposs dans lensemble des chemins dans A,
ltat initial est caractris par les prfixes de longueur 1 des chemins ; les tats finaux
par les suffixes de longueur 1, et les transitions par des facteurs de longueur 2.
Formellement, soit L rationnel et A = (, Q, qo , F, ) un automate fini dterministe re-
connaissant L. On dfinit L0 sur lalphabet 0 = Q Q par les trois ensembles :
I = {(q0 , a, (qo , a)), a }
F = {(q, a, r), q Q, a, r (a, q) F}
0 0 \ {(q, a, r)(r, b, p), q Q, a, b, r (a, q), b (r, b)}.
Soit maintenant un mot u de L. Son calcul dans A est par construction un mot w de L0
qui vrifie de plus (w) = u, donc L (L0 ). Rciproquement, si u = (w), avec w dans
L0 , alors on dduit immdiatement un calcul pour u dans A, et donc u L.
1. A nest pas dterministe. Ltat 0 a deux transitions sortantes tiquetes par le symbole
b, vers 0 et vers 1.
2. Le langage reconnu par A est lensemble des mots se terminant par le suffixe b(c + a)? d,
soit ? b(c + a)? d.
3. faire...
1 2 a 3 4 5 n 6
0 13
7 8 9 10 11 12
n a
162
CORRECTION DE LEXERCICE 4.14
Alternativement, en utilisant le tableau des cltures arrires (tableau 12.3), il faut donc
ajouter une transition (p, a) = q0 pour tout tat p dans l-fermeture arrire de q. On
marque ensuite comme final tous les tats dans la fermeture arrire des tats final.
Cette procdure aboutit lautomate 12.4.
Les tats 1, 2, 4, 5, 7, 9, 10, 12 et 13 sont devenus inutiles dans lautomate 12.4, si on les
limine, on obtient lautomate 12.5. Cet automate nest pas dterministe, ltat 0 ayant
deux transitions sortantes pour le symbole n.
4. Aprs dterminisation par la mthode des sous-ensembles, on aboutit finalement
lautomate 12.6.
163
CHAPITRE 12. CORRECTION DES EXERCICES
n
a
a n
a n
1 2 3 4 5 6
a
0 n 13
a
a
n
7 8 9 10 11 12
n a
a
n
a
3 6
a
0 n
a
a
n
8 11
n
3 6
a
0
n a
a
6, 8 11
164
12.4. CORRECTION DE LEXERCICE 4.15
1 b
a b
0 a 2
b
3
165
CHAPITRE 12. CORRECTION DES EXERCICES
a, b
a, b a, b
a, b
a, b
a, b a, b
b
b
a
a
a, b a, b
a, b
a, b
Automate 12.8 Les automates pour A1 ( gauche), A2 (en haut) et leur intersection (au
milieu)
c. Les tats finaux du dterminis sont ceux qui contiennent un tat final de A1
ou de A2 . Les seuls non-finaux sont donc de la forme : {q1 , q2 }, avec la fois q1
non-final dans A1 et q2 non-final dans A2 . Puisque les tats non-finaux de A1
sont prcisment les tats finals de A1 (et idem pour A2 ), les tats finals de A
correspondent des doubletons {q1 , q2 }, avec q1 dans F1 et q2 dans F2 .
On retrouve alors le mme ensemble dtats finals que dans la construction directe.
La dernire vrification est un peu plus fastidieuse et concerne ltat initial q0 .
Notons tout dabord que q0 na aucune transition entrante (cf. le point [b]). Notons
galement que, suite llimination des transitions , q0 possde les mmes tran-
sitions sortantes que celles quaurait ltat {q10 , q20 } du dterminis. Deux cas sont
envisager :
soit la partie {q10 , q20 } nest pas construite par lalgorithme de dterminisation
et on peut assimiler q0 cette partie ;
soit elle est construite et on peut alors rendre cette partie comme tat initial
et supprimer q0 : tous les calculs russis depuis q0 seront des calculs rus-
sis depuis {q10 , q02 }, et rciproquement, puisque ces deux tats ont les mmes
transitions sortantes.
166
12.6. CORRECTION DE LEXERCICE 4.20
Le langage contenant les mots dont la longueur est divisible par 3 est reconnu par un automate
trois tats, chaque tat correspondant un reste de la division par 3. De 0 on transite vers
1 (indpendamment de lentre) ; de 1 on transite vers 2, et de 2 vers 0, qui est la fois initial
et final.
Le langage a b est reconnu par un automate 3 tats. Ltat initial a une unique transition
sortante sur le symbole dentre a vers ltat 1, dans lequel on peut soit boucler (sur a ou b)
ou bien transiter dans 2 (sur b). 2 est le seul tat final.
Lintersection de ces deux machines conduit A1 , lautomate 12.9 non-dterministe, qui
correspond formellement au produit des automates intersects. Lapplication de la mthode
des sous-ensembles conduit A2 , lautomate 12.10, dterministe.
a, b
0 a 1 2 3
a, b a, b
b
4
a, b
a, b b
{3, 4}
1. En utilisant les mthodes du cours, on obtient lautomate 12.11, dterminis. Cet auto-
mate est appel larbre accepteur des prfixes (il comprend exactement un tat par prfixe
dans le langage).
2. (a) Les tats ( f ) et (p) sont deux tats finaux sans transition sortante : ils sont indistin-
guables ; ltat ( f ) est final quand (e) est non-final : le mot permet de les distinguer
(i.e. quil conduit un calcul russi depuis ( f ) mais pas depuis (e)).
167
CHAPITRE 12. CORRECTION DES EXERCICES
i e r a i
a b c d e f
o
l g n s
h i
q e r
r s
o
i
s e r a i p
k l m n o
168
12.8. CORRECTION DE LEXERCICE 5.21
premire de ces alternatives, il est de plus assur que, comme v nest pas dans A, il
nexiste pas de calcul (p, v2 ) aboutissant dans un tat final. Ceci contredit toutefois le
fait que p et q sont indistinguables.
5. Le calcul de la relation dindistinguabilit demande de la mthode : dans la mesure o
lautomate est sans cycle, ce calcul peut seffectuer en considrant la longueur du plus
court chemin aboutissant dans un tat final.
Commenons par linitialisation : {d, f, i, n, s, p} sont distingus de tous les autres tats
par leur finalitude . On distingue deux sous-ensembles : { f, i, s, p} sont distingus de
d et de n par le mot ai, mais sont indistinguables entre eux. ce stade, on ne peut
conclure sur d et n.
Les tats desquels dbute un calcul russi de longueur 1 sont : c, e, h, r, m, o : c et m
sont distingus des autres par le mot rai, r et h sont distingus du couple (e, o) par
respectivement s et r, et sont aussi distingus entre eux ; e et o sont indistinguables.
Les tats depuis lesquels dbutent un calcul russi de longueur 2 sont d, g, q, n. g et
q sont distingus des deux autres, et distingus entre eux. En revanche, d et n sont
indistinguables.
En poursuivant ce raisonnement, on aboutit finalement aux classes dquivalence sui-
vantes : { f, i, p, s}, {e, o}, {d, n}, {m, c}, {a}, {b}, {g}, {h}, { j}, {k}, {l}, {q}, {r}.
6. Aprs ralisation des fusions, on obtient lautomate 12.12.
i o n
l s
e
r a i
e
o r
s i e
169
CHAPITRE 12. CORRECTION DES EXERCICES
S A | bA
A aA | aB
B bB |
Grammaire 12.13 Grammaire rgulire pour lautomate (non-dterministe)
S aA | bB
A aA | bC
B aA
C bC |
Grammaire 12.14 Grammaire rgulire pour lautomate (dterministe)
170
Troisime partie
Rfrences
Liste des Algorithmes
174
Chapitre 13
176
Chapitre 14
178
Chapitre 15
180
Chapitre 16
182
Chapitre 17
Bibliographie
Barsky, R. F. (1997). Noam Chomsky: A Life of Dissent. MIT Press. Biographie de Noam
Chomsky, galement disponible en ligne sur http://cognet.mit.edu/library/books/
chomsky/chomsky/. 11.2
Dowek, G. (2007). Les mtamorphoses du calcul. Une tonnante histoire des mathmatiques. Le
Pommier. Lhistoire du calcul et du raisonnement, des mathmaticiens grecs aux progs
rcents en preuve automatique. Grand prix de philosophie 2007 de lAcadmie franaise.
11.2
Hodges, A. (1992). Alan Turing. The Enigma. Random House. Biographie dAlan Turing,
traduit en franais sous le nom de Alan Turing ou lnigme de lintelligence. 11.2
Perrin, D. (1995). Les dbuts de la thorie des automates. Technique et science informatique,
14(4). Un historique de lmergence de la thorie des automates. 11.2
184
Chapitre 18
Index
186
Greibach, Sheila, 155 longueur
Gdel, Kurt, 155 - dun mot, 13
H M
Hilbert, David, 156 machine de Turing, 148
McCluskey, Edward J., 157
I monode, 14
infini dnombrable, 145 - libre, 14
injective, 145 Moore, Edward F., 157
intersection morphisme, 22
- dautomates, 46 mot, 13
item, 120 - conjugu, 16
-s distinguables dun langage, 55
J - facteur, 15
Janusz Brzozowski, 153 -s indistinguables dun automate, 56
John Backus, 153 -s indistinguables dun langage, 55
John von Neumann, 157 - miroir, 16
K - prfixe, 15
Ken Thompson, 158 - primitif, 16
Kleene, Stephen C., 156 - suffixe, 15
- transpos, 16
Kurt Gdel, 155
- vide, 13
L
langage, 14
N
Naur, Peter, 157
- ambigu, 85
NFA, 38
- contextuel, 68
Noam Chomsky, 154
- de larrt, 146
non-terminal, 63
- des facteurs, 22
- utile, 131
- des prfixes, 21
-directement rcursif, 135
- des suffixes, 22
- engendr O
- par un non-terminal, 129 ordre
- par une grammaire, 64 - alphabtique, 17
- hors contexte, 70 - bien fond, 17
- prfixe, 22 - lexicographique, 17
- rationnel, 24 - militaire, 17
- reconnaissable, 33 - partiel, 16
- reconnu, 32 - radiciel, 17
- rcursif, 15 - total, 17
- rcursivement numrable, 14 origine
- rgulier, 71 - dune transition, 31
lemme
- de ltoile, 53 P
- de pompage palindrome, 16
hors-contexte, 87 parsage, 83
rationnel, 53 partie
Levenshtein, Vladimir, 156 - droite, 63
187
CHAPITRE 18. INDEX
S
semi-calculable, 143
semi-dcidable, 143
semi-groupe, 14
Sheila Greibach, 155
Simple LL, 102
sous-mot, 15
star lemma, 53
Stephen C. Kleene, 156
surjective, 145
symbole
- initial, 63
- pr-terminal, 78
smantique, 84
T
188