✖

Réunion de langages réguliers

Soient deux langages réguliers L1, L2. Nous allons démontrer que leur réunion L = L1 ∪ L2 est aussi un langage régulier.

Méthode avec un automate déterministe

Idée de la méthode

Nous avons deux langages réguliers L1 et L2 et nous voulons démontrer que leur réunion L1 ∪ L2 est de nouveau un langage régulier. Comme L1 et L2 sont réguliers, il existe des automates finis A1 et A2 qui acceptent les langages L1 et L2, c’est-à-dire que L(A1) = L1 et L(A2) = L2. Nous construisons ensuite un automate fini A qui accepte le langage L1 ∪ L2, ce qui prouve que le langage L1 ∪ L2 est régulier.

Comment faire ? Nous disposons des automates finis A1 et A2, qui acceptent chacun un des langages. On peut dire qu’un mot w appartient au langage L1 ∪ L2 si et seulement si au moins l’un des automates A1 ou A2 l’accepte.

L’automate A pourrait fonctionner ainsi : pour une entrée w, il simule le calcul de l’automate A1 sur l’entrée w. Si A1 accepte le mot w, alors A accepte aussi le mot w. Si A1 rejette le mot w, alors A essaie de simuler le calcul de A2 sur l’entrée w. Si A2 accepte le mot w, alors A accepte aussi le mot w. Sinon, il le rejette.

Il nous reste à formaliser ce que signifie que l’automate A « simule » le calcul d’un autre automate.

Formalisation

Nous avons deux langages réguliers L1 et L2, acceptés par les automates finis

A1=(Q1;Σ1;δ1;q1;F1)A2=(Q2;Σ2;δ2;q2;F2).

Nous construisons un automate fini A = (Q ; Σ ; δ ; q ; F) qui accepte le langage L = L1 ∪ L2. Nous utilisons l’idée de simuler deux automates A1, A2. Imaginons que l’entrée est le mot w = w1w2… wn et que nous simulons simultanément le déroulement des automates A1 et A2 sur le mot w. La configuration initiale de l’automate A1 est (q1 ; w1w2… wn), celle de A2 est (q2 ; w1w2… wn). Effectuons maintenant une étape de calcul dans chaque automate, ce qui nous amène aux configurations (δ1(q1, w1) ; w2… wn) et (δ2(q2, w1) ; w2… wn).

Nous voyons que ces configurations ne diffèrent que par leur première composante ; la seconde – la partie non lue du mot – est toujours la même. Pendant la simulation, nous n’avons donc pas besoin de garder deux configurations de deux automates : une seule configuration de la forme (⟨qi, qj⟩ ; wl… wn) suffit, où qi ∈ Q1 et qj ∈ Q2. Autrement dit, notre automate A aura pour configuration initiale (⟨q1, q2⟩ ; w). La première composante du couple ⟨q1, q2⟩ représente l’état dans lequel se trouve actuellement l’automate A1, la seconde l’état actuel de l’automate A2.

Nous pouvons donc écrire que l’ensemble des états de l’automate A à construire est Q = Q1 × Q2. C’est le produit cartésien des ensembles d’états des deux automates précédents. L’idée suivante est que l’automate A a pour état initial ⟨q1, q2⟩ et que, si l’automate A1 passe à l’état qi en lisant la lettre w1 et l’automate A2 à l’état qj en lisant la lettre w1, alors l’automate A passe à l’état ⟨qi, qj⟩ en lisant la lettre w1.

Nous écrivons la fonction de transition δ ainsi (on suppose ici que nous sommes actuellement dans les états qi et qj) :

δ(⟨qi,qj⟩,w)=⟨δ1(qi,w),δ2(qj,w)⟩

Il ne reste que quelques détails à régler. Pour l’alphabet, on a Σ= Σ1 ∪ Σ2. L’état initial est q = ⟨q1, q2⟩. Et les états finals sont tous les couples ⟨qi, qj⟩ tels que qi ∈ F1 ou qj ∈ F2.

Illustration de la méthode

Prenons deux automates. Le premier est l’automate A1, qui accepte tous les mots (y compris le mot vide) où les 0 et les 1 alternent, c’est-à-dire les mots de la forme 01, 0101, 010101, …

L’autre automate A2 accepte les mots qui contiennent au moins un 0 :

La réunion de ces langages est formée des mots qui contiennent un 0 ou qui sont de la forme 01, 0101, … Construisons maintenant l’automate fini A = (Q ; Σ ; δ ; q ; F) qui accepte exactement ce langage réunion. Voyons d’abord à quoi ressemblent les états de ce nouvel automate A. Ce sera le produit cartésien des ensembles d’états du premier et du second automate :

Q=Q1×Q2={⟨q0,p0⟩,⟨q0,p1⟩,⟨q1,p0⟩,⟨q1,p1⟩,⟨q2,p0⟩,⟨q2,p1⟩}

Voici les six états de l’automate A qui accepte le langage réunion L(A1) ∪ L(A2). Dans le diagramme, ils ressembleraient à ceci :

Ne t’inquiète pas de voir des états formés de couples d’états – cela sert seulement à mieux s’y retrouver dans ce qui se passe dans l’automate. Les états pourraient très bien s’appeler simplement q0, …, q5. Les états finals sont ceux qui contiennent l’état q0 ou p1, qui sont les états finals des automates d’origine. L’état initial est ⟨q0, p0⟩.

Il faut maintenant trouver toutes les transitions. Écrivons un tableau :

01⟨q0,p0⟩⟨q0,p1⟩⟨q1,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q2,p1⟩

Et remplissons-le peu à peu. On cherche d’abord où mène la transition depuis l’état ⟨q0, p0⟩ avec l’entrée 0. On regarde où mène la transition depuis l’état q0 avec l’entrée 0 dans l’automate A1 : vers l’état q1. Dans l’automate A2, la transition depuis p0 avec un 0 mène à l’état p1. On écrit donc ⟨q1, p1⟩ dans le tableau :

01⟨q0,p0⟩⟨q1,p1⟩⟨q0,p1⟩⟨q1,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q2,p1⟩

Avec l’entrée 1, on obtient : pour l’automate A1, on a δ1(q0, 1) = q2 et pour l’automate A2, on a δ2(p0, 1) = p0. On obtient donc l’état ⟨q2, p0⟩.

01⟨q0,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q0,p1⟩⟨q1,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q2,p1⟩

Complétons le reste du tableau :

01⟨q0,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q0,p1⟩⟨q1,p1⟩⟨q2,p1⟩⟨q1,p0⟩⟨q2,p1⟩⟨q0,p0⟩⟨q1,p1⟩⟨q2,p1⟩⟨q0,p1⟩⟨q2,p0⟩⟨q2,p1⟩⟨q2,p0⟩⟨q2,p1⟩⟨q2,p1⟩⟨q2,p1⟩

Et d’après ce tableau, il ne reste qu’à dessiner le reste du diagramme.

On peut vérifier que l’automate fonctionne comme prévu. Essayons d’accepter le mot 0100. L’automate passe successivement par les états

⟨q0,p0⟩,⟨q1,p1⟩,⟨q0,p1⟩,⟨q1,p1⟩,⟨q2,p1⟩

Comme l’état ⟨q2, p1⟩ est final, l’automate A accepte le mot 0100. Que se passerait-il si l’on essayait d’accepter le mot 0100 avec les automates A1 et A2 ? L’automate A1 passerait successivement par ces états :

q0,q1,q0,q1,q2

L’automate a fini dans l’état q2, qui n’est pas final, donc l’automate A1 n’accepterait pas ce mot. Et l’automate A2 ?

p0,p1,p1,p1,p1

L’état p1 est final, donc l’automate A2 accepterait le mot 0100. Remarque que les automates A1 et A2 ont fini dans les états q2 et p1, ce qui est cohérent avec le fait que l’automate A a fini dans l’état ⟨q2, p1⟩.

Méthode avec un automate non déterministe

Exemple

On peut aussi démontrer que l’ensemble des langages réguliers est stable par réunion en construisant un automate non déterministe, bien plus simple.

Nous avons donc deux langages réguliers L1, L2 et nous voulons démontrer que leur réunion L = L1 ∪ L2 est aussi un langage régulier. Comme L1, L2 sont réguliers, il existe des automates A1, A2 qui acceptent ces langages. C’est-à-dire que L(A1) = L1 et L(A2) = L2. À l’aide de ces automates, nous construisons un automate A qui accepte le langage L, c’est-à-dire L(A) = L.

Supposons que les automates finis A1 et A2 ressemblent à ceci :

et

Pour obtenir un automate qui accepte la réunion des deux langages, on crée un nouvel état initial et, depuis cet état, on trace deux ε-transitions vers les anciens états initiaux. C’est tout. L’automate ressemblerait à ceci :

Formalisation

Nous avons deux automates A1 = (Q1 ; Σ ; δ1 ; q1 ; F1) et A2 = (Q2 ; Σ ; δ2 ; q2 ; F2). Nous construisons l’automate A = (Q ; Σ ; δ ; q0 ; F) qui accepte la réunion des langages acceptés par les automates précédents, c’est-à-dire L(A) = L(A1) ∪ L(A2). On a alors :

  • Q = Q1 ∪ Q2 ∪ {q0}
  • F = F1 ∪ F2

Et nous définissons la fonction de transition δ ainsi :

δ(q,a)={δ1(q,a)siq∈Q1δ2(q,a)siq∈Q2{q1;q2}siq=q0∧a=ε∅siq=q0∧a≠ε

Sources

Chapitres: Propriétés de clôture des langages réguliers, Réunion de langages réguliers, Intersection de langages réguliers, Différence de langages réguliers, Complémentaire d’un langage régulier, Concaténation de langages réguliers, Étoile d’un langage régulier