Langage rationnel
Les langages rationnels ou langages réguliers ou encore langages reconnaissables peuvent être décrits de plusieurs façons équivalentes :
- ce sont les langages décrits par les expressions régulières ou rationnelles, d'où le nom de langages réguliers ;
- ce sont les langages obtenus, à partir des lettres et de l'ensemble vide, par les opérations rationnelles, à savoir l'union, le produit et l'étoile (ou fermeture de Kleene), d'où le nom de langages rationnels ;
- ce sont les langages reconnus par des automates finis, d'où le nom de langages reconnaissables.
Ce sont aussi :
- les langages dont le monoïde syntaxique est fini,
- les langages qui admettent une description dans la logique monadique du second ordre avec successeur,
- les langages de type 3 dans la hiérarchie de Chomsky : ce sont les langages qui peuvent être engendrés par une grammaire régulière, c'est-à-dire une grammaire linéaire droite (ou linéaire gauche),
- les langages reconnus par des machines de Turing qui n'écrivent pas sur leur bande (ce sont aussi les automates boustrophédon (en)) ;
- les langages reconnus par des automates alternants (en).
Les langages rationnels ont de très nombreuses applications, à la fois théoriques et pratiques. Ils sont utilisés en informatique (par exemple en compilation, en linguistique (par exemple pour décrire la morphologie d'une langue), ils interviennent dans les traitements de texte, ou dans des commandes spécifiques comme grep du système Unix.
Pour la manipulation des langages rationnels et des automates, il existe de nombreux outils informatiques, notamment dans les systèmes du type Unix comme la commande lex. Le langage informatique Java fournit aussi la classe Pattern. Les algorithmes utilisés pour manipuler les langages rationnels possèdent en général une implémentation rapide et efficace.
Sommaire |
Définition
On considère un ensemble fini
de caractères ou lettres, appelé alphabet. Une chaîne de caractères (ou chaîne ou mot) est une suite finie, éventuellement vide, de caractères. Par exemple, la chaîne formée de la lettre
, puis de la lettre
, puis encore de la lettre
, se note
.
L'ensemble des mots que l'on peut former avec ces lettres de
est noté
. Toute partie de
s'appelle un langage.
Opérations rationnelles
Les opérations suivantes, définies sur les langages, sont appelées les opérations rationnelles. Soient
et
deux parties de
:
- la concaténation ou le produit de
et
, noté
, est l'ensemble de mots
, où
est dans
et
est dans
. Par exemple, le produit de
et de
est
; - l'union ensembliste, notée
; - la fermeture de Kleene, notée
est le plus petit langage qui contient le mot vide
, le langage
, et qui est clos pour l'opération de concaténation. C'est aussi l'ensemble de tous les produits de tous les mots de
. Par exemple,
.
Langages rationnels
L'ensemble des langages rationnels sur l'alphabet
est le plus petit ensemble de langages stable pour les opérations rationnelles, et qui contient le langage vide
, les langages réduit à une lettre et le langage composé du mot vide
.
Expressions rationnelles
Les expressions rationnelles sur l'alphabet
sont des expression obtenues à partir des des constantes 0, 1, et de constantes
, pour les lettres
de
, par des opérations suivantes :
- L'opération
ou
(pour représenter l'union) - L'opération
(pour représenter le produit, ce point est d'ailleurs souvent omis) - L'opération
(pour représenter l'étoile).
Chaque expression rationnelle
dénote un langage rationnel. Ce langage, noté
, est défini comme suit :
,
,
pour chaque lettre 
,
, 
Deux expressions rationnelles sont équivalentes si elles dénotent le même langage.
Exemple
Les expressions
et
sont équivalentes.
Variantes
Pour diminuer les parenthèses dans les expressions, on omet les parenthèses résultant de l'associativité des opérations, et de donner la plus haute priorité à l'étoile de Kleene, suivie de la concaténation, puis de l'union. Formellement, cela signifie que l'on identifie des expressions qui se déduisent l'une de l'autre par l'application de ces règles[1].
On ajoute parfois aussi, aux opérateurs sur les expressions, la fermeture
, donnant l'expression
. Le langage dénoté est donné par
, au sens de Opérateur plus. En revanche, l'opérateur de complémentation ne fait pas partie des opérations définissant les expressions rationnelles. Par contre, on défini les 'expressions rationnelles étendues comme les expressions incluant aussi l'opérateur de complémentation.
Notons enfin que dans les expressions régulières fournis par de nombreux outils de programmation ou d'édition, comme Unix, qed, grep, Emacs, d'autres opérateurs sont fréquemment ajoutés, avec des propriétés qui les rendent capables de décrire des langages qui ne sont pas rationnels. Ces expressions ne sont donc pas strictement équivalentes aux expressions rationnelles définies formellement ci-dessus.
Expressions rationnelles et automates finis
Le théorème de Kleene
Le théorème de Kleene affirme que l'ensemble des langages rationnels sur un alphabet
est exactement l'ensemble des langages sur
reconnaissables par automate fini. C'est le résultat fondamental pour la théorie et les applications.
La correspondance entre langages rationnels et langages reconnaissables est effective : pour toute expression régulière, on peut construire effectivement, et de plusieurs façons, des automates qui reconnaissent le langage dénoté par l'expression. Réciproquement, à tout automate fini on peut associer une expression régulière qui dénote le langage reconnu par l'automate. Là aussi, il y a plusieurs méthodes, et on peut obtenir des expressions différentes, mais équivalentes.
Hauteur d'étoile
La hauteur d'étoile d'une expression rationnelle
est le nombre
défini récursivement comme suit :
pour toute lettre 

.
En d'autres termes, la hauteur d'étoile d'une expression est le nombre maximum d'étoiles imbriquées. Par exemple,
et
. Ces deux expressions dénotent le même langage, donc la notion de hauteur d'étoile est liée à l'expression.
La hauteur d'étoile d'un langage rationnel
est le minimum des hauteurs d'étoile des expressions dénotant ce langage, c'est-à-dire
La question de l'existence de langages rationnels de hauteur d'étoile arbitrairement grande a été posée par Eggan et résolue par Françoise Dejean et Marcel-Paul Schützenberger[2]. Le problème de la hauteur d'étoile (en) est de calculer, de manière efficace, la hauteur d'étoile d'un langage rationnel. Ce problème a résisté longtemps. Il a été résolu la première fois en 1982; le meilleur algorithme, dû à Kirsten, est de 2005 (voir la page anglaise).
Une question qui est toujours ouverte concerne le problème de la hauteur d'étoile généralisée (en): si l'on autorise, comme opérateur supplémentaire, l'opérateur de complémentation, le pouvoir de description des expressions rationnelles (appelées généralisées) augment bien entendu. Il n'est pas connu s'il existe des langages rationnels de hauteur d'étoile généralisée arbitrairement grande (ni même de hauteur 2). Les langages de hauteur d'étoile généralisée 0 sont les « langages sans étoiles » caractérisés par Marcel-Paul Schützenberger.
Le théorème de Myhill-Nerode
À tout langage
de
, on associe une relation d'équivalence
sur
définie de la façon suivante :
si et seulement si pour tout mot
de
, on a 
Cette relation est une équivalence régulière à droite car elle est compatible avec la concaténation : si
alors
.
Le théorème de Myhill-Nerode (en) affirme qu'un langage
est rationnel si et seulement si la relation
est d'index fini, c'est-à-dire possède un nombre fini de classes d'équivalence.
Ce théorème a un intérêt théorique puisqu'il donne une caractérisation intrinsèque de l'automate minimal reconnaissant un langage donné. En effet, les états de l'automate fini déterministe minimal reconnaissant un langage rationnel
sont en bijection avec les classes d'équivalence de la relation
[3]. Ce résultat est aussi à la base d'un algorithme efficace de minimisation (en), appelé l'algorithme de Moore.
Propriétés
- Les langages rationnels sont fermés, en plus de l'union, du produit et de l'étoile, par complémentation et donc par intersection.
- Les langages rationnels sont fermés par image miroir : si
est un langage rationnel, alors
est rationnel, où
est l'ensemble des retournés ou images miroir des mots de
.
- L'ensemble des préfixes, l'ensemble des suffixes, l'ensemble des facteurs, l'ensemble des sous-mots des mots d'un langage rationnel est un langage rationnel.
- Pour tout langage rationnel
et tout mot
, le quotient gauche

est un langage rationnel.
- L'image d'un langage rationnel par un morphisme est un langage rationnel.
- L'image par un morphisme inverse d'un langage rationnel est un langage rationnel
- L'image, par une substitution rationnelle, d'un langage rationnel est un langage rationnel (une substitution
de
dans
est une application de
dans l'ensemble des parties de
qui est un morphisme pour la structure de monoïde multiplicatif sur l'ensemble des parties de
, c'est-à-dire
et
, où le produit dans le membre droit est le produit des parties de
. Une substitution rationnelle est une substitution
telle qui
est un langage rationnel sur
pour toute lettre
de
).
- Le produit de mélange (en anglais shuffle product) de deux langages rationnels est un langage rationnel (le produit de mélange de deux mots
et
est l'ensemble des mots
, où les
et les
sont des mots, tels que
et
. Le produit de mélange de deux langages est la réunion des produits de mélange des mots des langages).
- La première moitié d'un langage
est le langage
.
En d'autre termes, on coupe au milieu des mots de
de longueur paire et on garde la première partie. Si
est un langage rationnel, alors
est un langage rationnel.
- Si l'on supprime, dans les mots d'un langage rationnel, une lettre sur deux, le résultat est encore un langage rationnel.
Lemme d'itération
Le lemme d'itération (en anglais pumping lemma, traduit parfois malheureusement par lemme de pompage) donne une propriété nécessaire des langages rationnels. Il s'énonce informellement comme suit : dans tout mot assez long
d'un langage rationnel
, on peut trouver un facteur
non vide que l'on peut répéter un nombre arbitraire de fois, tout en restant dans le langage
.
C'est en fait une propriété d'un automate reconnaissant le langage
: un mot assez long reconnu par l'automate contient nécessairement un circuit qui l'on peut parcourir un nombre arbitraire de fois, tout en restant reconnu par l'automate
Ce lemme n'est pas une caractérisation des langages rationnels : il existe des langages qui vérifient la propriété d(itération mais qui ne sont pas rationnels.
Exemples et contre-exemples
Les langages suivants sont rationnels :
- L'ensemble des notations décimales de entiers naturels sur l'alphabet :
. - Les langages finis.
- L'ensemble des mots qui contiennent un mot donné.
- L'ensemble des mots qui contiennent un nombre pair de "1".
- L'ensemble des mots qui sont l'écriture en binaire d'un entier congruent à 2 modulo 5.
Les langages suivants ne sont pas rationnels :
- L'ensemble de mots

- Les ensembles
,
- Une expression bien parenthésée est obtenue comme étant soit le mot vide, soit
où
et
sont bien parenthésées. L'ensemble des expressions bien parenthésées est aussi appelé le langage de Dyck.
Ce n'est pas un langage rationnel car son intersection avec le langage rationnel
n'est pas un langage rationnel (c'est le langage précédent à un changement de symboles près). - L'ensemble des palindromes.
Histoire
La théorie débute dans les années 1940[4]. Warren McCulloch et Walter Pitts ont décrit, en 1943, le système nerveux en modélisant les neurones par des automates simples. Le logicien Stephen Cole Kleene a ensuite prouvé, en 1956, ce que l'on appelle le théorème de Kleene. En 1956, E. F. Moore (en) publie son algorithme de minimisation. En 1958, A. Nerode (en) et J. Myhill (en) publient leur caractérisation. En 1959, Michael Rabin et Dana Scott donnent, dans un célèbre article[5], un traitement rigoureux de la théorie des automates. Cet exposé pionnier leur vaut le Prix Turing.
Du point de vue pratique, c'est Ken Thompson qui implémente les expressions rationnelles dans l'éditeur qed, puis l'éditeur ed sous Unix, et finalement dans grep. Depuis lors, les expressions rationnelles ont été largement utilisées dans les utilitaires tels que lex ainsi que dans les langages de programmation nés sous Unix, tels que expr, awk, Perl, Python... Une bonne partie d'entre eux reposent sur la bibliothèque regex, créée par Henry Spencer (en).
Voir aussi
Notes
- Pour une définition précise des règles de simplification, on peut consulter Sakarovitch (2003)
- Dejean et Schützenberger (1966)
- voir par exemple Hopcroft Ullman (1979) ou Carton (2008) ou Sakarovitch (2003)
- Pour un exposé des premières années de la théorie des automates et des langages rationnels, voir Perrin (1995)
- Rabin et Scott (1959)
Références
- Dominique Perrin, « Les débuts de la théorie des automates », dans Technique et science informatiques, vol. 14, no 4, 1995, p. 409-433 [texte intégral]
- Françoise Dejean et Marcel-Paul Schützenberger, « On a Question of Eggan », dans Information and Control, vol. 9, no 1, 1966, p. 23-2
- (en) J. E. Hopcroft et J. D. Ullman, Introduction to Automata Theory, Languages and Computations, Addison-Wesley, 1979 (ISBN 0-201-02988-X)
- Olivier Carton, Langages formels, calculabilité et complexité, Vuibert, 2008 (ISBN 978-2-7117-2077-4)
- (en) Michael O. Rabin et Dana Scott, « Finite automata and their decision problems », dans IBM J. Res. Develop., vol. 3, 1959, p. 114-125
- Jacques Sakarovitch, Éléments de théorie des automates, Vuibert, 2003 (ISBN 978-2-7117-4807-5).
Traduction anglaise avec corrections: Elements of Automata Theory, Cambridge University Press 2009, (ISBN 9780521844253)
, est l'ensemble de mots
, où
est dans
est dans
et de
est
;
;
est le plus petit langage qui contient le mot vide
, le langage
.
(pour représenter l'union)
(pour représenter le produit, ce point est d'ailleurs souvent omis)
(pour représenter l'étoile).
,
,
pour chaque lettre
,
, 
pour toute lettre 
.
si et seulement si pour tout mot 
est rationnel, où 
de
est une application de
et
, où le produit dans le membre droit est le produit des parties de
est un langage rationnel sur
pour toute lettre
, où les
et les
sont des mots, tels que
et
. Le produit de mélange de deux langages est la réunion des produits de mélange des mots des langages).
.
est un langage rationnel.
.
,
où
sont bien parenthésées. L'ensemble des expressions bien parenthésées est aussi appelé le
n'est pas un langage rationnel (c'est le langage précédent à un changement de symboles près).