3. Expressions rationnelles


Expression rationnelle

Les expressions rationnelles sur A décrivent les langages rationnels. Elles sont définies de la façon suivante :

  1. ∅ est une expression rationnelle qui décrit le langage rationnel ∅ ;
  2. ε est une expression rationnelle qui décrit le langage rationnel {ε} ;
  3. pour tout a de A, a est une expression rationnelle qui décrit le langage rationnel {a} ;
  4. Si l1 et l2 sont des expressions rationnelles qui décrivent L1 et L2 ∈ Rat(A*) alors :
    1. (l1 | l2) et (l1 + l2) sont des expressions rationnelles identiques qui décrivent le langage rationnel L1 ∪ L2 ∈ Rat(A*),
    2. (l1l2) et (l1.l2) sont des expressions rationnelles identiques qui décrivent le langage rationnel L1 × L2 ∈ Rat(A*),
    3. (l1)* est une expression rationnelle qui décrit le langage rationnel (L1)*.

Attention, dans le point "2" de la définition précédente, le symbole ε représente deux notions différentes. Le premier est un symbole d'une expression rationnelle alors que le second symbolyse l'ensemble contenant uniquement le mot vide. Cependant, il y a isomorphisme entre ces deux notions.

Comme la réunion et la concaténation sont associatives, on omettra généralement les parenthèses inutiles. On écrira par exemple (u | v | w) plutôt que ((u |v) | w) ou (u | (v | w)) et de même pour la concaténation. Bien sûr, il est sous-entendu qu'aucun des symboles "|", "*", "ε", "(" et ")" n'appartient à l'alphabet A. Sinon, il faut soit les différencier en renomant les symboles, soit les entourer de guillemets.

Par exemple, le langage L={(({a}∪{b})*×{a})*×({b}×{c})*} peut être désigné par l'expression rationnelle((a|b)*a)*(bc)*.


Théorème des expressions rationnelles

Toute langage dénoté par une expression rationnelle est un langage rationnel.

En résumé, étant donné un alphabet A et C={ |, *, ε, (, )}, tel que A∩C=∅ :

Par exemple, 01 désigne le langage {01}, 0* désigne le langage {0}* et (0|1)*011 désigne le langage ne comportant que des chaînes se terminant par 011 sur l'alphabet {0,1}. Comme exemple plus complexe, on peut donner [A-Z,a-z][A-Z,a-z,0-9]* qui décrit la syntaxe des identificateurs en Pascal : des mots commençant par une lettre, majuscule ou minuscule ([A-Z,a-z]) et suivit d'une suite quelconque de caractères parmi les lettres et les chiffres ([A-Z,a-z,0-9]*).

Notons enfin que si wn désigne bien un langage rationnel quand n est un entier fixé, par contre, ce n'est pas toujours vrai dans le cas général, quand n est une variable. En effet, par exemple, (ab)3 désigne ababab qui est une expression rationnelle, de même que [a,b]2 qui désigne (a|b)(a|b). Par contre le langage désigné par anbn n'est pas rationnel : il s'agit des mots commençant par un certain nombre de a et suivis du même nombre de b, et ce langage ne peut pas être obtenu à partir des parties finies d'un alphabet A par simple application des opérations ×,∪ et *. Ceci illustre bien le fait que tout langage sur A n'est pas nécessairement rationnel. Il est possible de démontrer qu'un langage n'est pas rationnel (section sur le lemme de l'étoile).


Expression rationnelle standard

Une expression rationnelle (rationnelle) est dite standard si et seulement si les seuls opérateurs utilisés sont les opérateurs ×,∪ et *.

En conséquence, si un langage peut être décrit par une expression rationnelle standard, c'est-à-dire utilisant uniquement les opérateur ×,∪ et *, alors ce langage est nécessairement rationnel. Cependant, l'expression standard, si elle existe nécessairement, peut s'avérer extrêmement complexe. Une autre façon de prouver qu'un langage est rationnel est, nous le verrons plus loin dans le cours, de construire un automate d'état fini reconnaissant ce langage. D'autres solutions consistent à décomposer le langage comme union, étoile ou concaténation de deux langages rationnels, à présenter une grammaire rationnelle ou d'essayer de décrire le complémentaire du langage. En effet, nous verrons plus loin que le complémentaire d'un langage rationnel est un langage rationnel (théorème). Enfin, nous verrons aussi que l'intersection de deux langages rationnels est un langage rationnel (théorème).

Les expressions rationnelles décrivent des langages, c'est-à-dire des ensembles de mots sur un alphabet A donné (souvent implicitement). De fait, il s'avère que deux expressions différentes peuvent décrire un même langage. Par exemple, a*a et aa* désignent toutes deux l'ensemble des chaînes de n a consécutifs pour n>0. On peut par ce biais définir une équivalence entre expressions rationnelles.


Equivalence d'expressions rationnelles

Deux expressions rationnelles w1 et w2 sont dites équivalentes (ou par abus de langage "égales"), noté "w1≡w2" (ou "w1=w2"), si elles décrivent le même langage rationnel.

Soient, u, v et w des expressions rationnelles, on a entre autres les propriétés suivantes :

  • L'union
    • u|v = v|u (commutativité)
    • u|u = u (idempotence)
    • u|∅ = u (∅ : élément neutre)
    • u|(v|w) = (u|v)|w (associativité)
  • La mise à l'étoile
    • u** = u* (idempotence)
    • ∅* = ε
  • La mise à l'étoile et l'union
    • u* = u|u* (absorption)
  • La concaténation
    • uε = εu = u (ε : élément neutre à gauche et à droite)
    • u ∅ = ∅ u = ∅ (∅ : élément absorbant à gauche et à droite)
    • u(vw) = (uv)w (associativité)
  • La concaténation et l'union
    • (u|v)w = uw|vw (distributivité à droite de la concaténation par rapport à l'union)
    • u(v|w) = uv|uw (distributivité à gauche de la concaténation par rapport à l'union)

uw ≠ wu (la concaténation n'est pas commutative) !... sauf si u = w


Facteur itérant

Un facteur itérant est une sous-chaîne non vide pouvant être "étoilée". Autrement dit, v est facteur itérant de m ∈ L si : m=uvw, |v| ≠ 0, ∀ i, uviw ∈ L (uv*w ⊂ L).

Par exemple, dans le mot "bbaab" du langage décrit par bb(a2)*b, le facteur "aa" est un facteur itérant.


Mot primitif

Un mot primitif est un mot u tel que u=vn si n=1, c'est-à-dire s'il n'est pas puissance d'un autre mot que lui-même.

Par exemple, "abab" n'est pas primitif alors que "ab" l'est sur l'alphabet {a,b}.

Exercices et tests :

Exercice 3.1. Ecrire les expressions rationnelles décrivant les langages suivants :

    1. {ab}
    2. {anbam, n ≥ 0, m ≥ 0}
    3. {an, n ≥ 2}

Solution

Exercice 3.2. Décrire les langages définis par les expressions rationnelles suivantes (on donne d'abord l'alphabet puis l'expression) :

    1. A1={0,1,2,3,4,5,6,7,8,9,H}, ([1-9][0-9]*(0|2|4|6|8)) | (0|2|4|6|8)
    2. A1, ([0-9]|10|11|12)H[0-5][0-9]
    3. A2={a,b, ..., z}, regarder(ai|as|a|ons|ez|ont)
    4. A3={a,b,c}, ((a|b|c)(a|b|c)(a|b|c))*
    5. A3, (a|b|c)*a(a|b|c)*a(a|b|c)
    6. A3, (b|c)*a(b|c)*a(b|c)*

Solution

Exercice 3.3. Donner l'alphabet (si nécessaire) et l'expression rationnelle permettant de décrire :

    1. le langage dont les mots sont les nombres décimaux ; Aide
    2. Les mots sur {a,b} qui contiennent au moins un b et ne peuvent avoir deux b consécutifs (c'est à dire que bb ne peut être un facteur des mots du langage) ;
    3. l'ensemble des mots sur {a,b,c} tels que toute paire de a est immédiatement suivie d'une paire de b. Aide

Solution

Exercice 3.4. Pour chacune des expressions rationnelles suivantes, donner une expression rationnelle plus simple décrivant le même langage :

    1. a+a*bc | aa?b?c Aide
    2. ([a-z]*)*(c(ab)* | ca(b(ab)*))
    3. a(ba)*b | (ab)+cd Aide
    4. a(ba)*b(bc|c) | ab*b?c Aide

Solution

Exercice 3.5. Expression des chemins sous Unix

On veut représenter des noms complets de fichiers UNIX constitués d'un chemin absolu (c'est à dire partant de la racine) suivi du nom connu localement dans le répertoire. On considère que la longueur des chaînes à représenter n'est pas limitée et on impose les contraintes supplémentaires suivantes : toute sous-chaîne représentant un nom local de répertoire ou de fichier (c'est à dire comprise entre deux '/') ne doit ni être vide, ni se terminer par un '.', ni contenir deux points juxtaposés.

On se donne l'alphabet suivant : {A-Z,a-z,0-9,'.', '/','_'}

Ecrire une expression rationnelle (la plus simple possible) sur cet alphabet qui représente un nom complet de fichier UNIX tel qu'il est spécifié ci-dessus.

Solution

Exercice 3.6. Prouver que le langage suivant est rationnel : les mots sur {a,b} ne contenant pas la chaîne "aba". Aide

Solution

Exercice 3.7. Expression rationnelles positives

Les expressions rationnelles positives sont définies, comme les expressions rationnelles, de manière inductive :

Le langage dénoté par une expression rationnelle positive est défini comme le langage dénoté par une expression rationnelle. On note PRat(A*) la famille des langages dénotés par une expression rationnelle positive.

  1. Vérifier que ε n'appartient à aucun langage de PRat(A*). Aide
  2. Montrer que PRat(A*) ⊂ Rat(A*) Aide.
  3. Montrer que si L ∈ Rat(A*) alors L\ε ∈ PRat(A*). Aide
  4. Donner le principe de l'algorithme qui transforme une expression rationnelle en une expression rationnelle positive équivalente (à ε près).

Solution


vendredi, 28/11/03 13:12