Algorithme de McNaughton et Yamada

De testwiki
Aller à la navigation Aller à la recherche

En informatique théorique, et notamment en théorie des automates finis, lModèle:'algorithme de McNaughton et Yamada est un algorithme pour calculer une expression régulière à partir d'un automate fini.

Origine

Il porte le nom de Robert McNaughton et Hisao Yamada, deux scientifiques américain et japonais qui ont décrit l'algorithme[1]. Cet algorithme est également appelé algorithme de KleeneModèle:Référence souhaitée.

On appelle également algorithme de McNaughton et Yamada un autre algorithme, donné dans le même article[1], qui permet de construire un automate sans epsilon transition à partir d'une expression régulière.

Principe

Étant donné un automate à n états, et dont les états sont numérotés de 1 à n, on donne une expression pour les langages composés des mots qui étiquettent les chemins de i à j, pour tout couple i, j. Cette expression est construite par récurrence au moyen d'une condition sur les chemins ; cette condition stipule que les chemins ne passent que par certains états autorisés. À chaque itération de l’algorithme, on fixe un nouvel état par lequel on s’autorise à passer. À la fin de l’algorithme, on obtient alors tous les chemins possibles.

Le fonctionnement de cet algorithme rappelle alors l’algorithme de Floyd-Warshall sur les graphes, où à chaque nouvelle étape, on s’autorise à passer par un nouveau sommet fixé.

Description

Soit 𝒜=(Q,,I,T) un automate fini sur un alphabet A, donné par un ensemble fini d'états Q, un ensemble Q×A×Q de transitions, et des ensembles I,TQ d'états initiaux respectivement terminaux.

On note Lp,q l'ensemble des mots qui sont étiquettes de chemins de p à q. Le langage L reconnu par l'automate est l'ensemble

L=iItTLi,t

L'algorithme de McNaugthon et Yamada est une méthode pour calculer des expressions régulières pour les Lp,q.

On note Lp,q(k) l'expression pour l’ensemble des mots qui étiquettent des chemins de p à q et dont tous les sommets intermédiaires sont inférieurs ou égaux à k. Les sommets de départ p et d’arrivée q ne sont pas intermédiaires, donc ils ne sont pas soumis à la contrainte d’être inférieurs ou égaux à k.

On construit les Lp,q(k) par récurrence sur k, en commençant avec k=0, et en terminant avec k=n. Lorsque k=n, la contrainte sur k n’est plus une restriction, et Lp,q(n)=Lp,q si pq, et ε+Lp,p(n)=Lp,p.

Pour k=0, comme les sommets sont numérotés à partir de 1, la contrainte exprime simplement qu’il n’y a pas de sommet intermédiaire. Les seuls chemins sont des transitions de p à q (on ignore un chemin de longueur 0 en un état p).

On a donc

Lp,q(0)=(p,a,q)a

Pour la récurrence, on considère un chemin de p à q dont les sommets intermédiaires sont plus petits que k. Deux cas sont alors possibles :

  1. les sommets intermédiaires sont plus petits que k1; alors l’étiquette est dans Lp,q(k1);
  2. le chemin passe par l’état k. On décompose alors le chemin en parties dont les sommets intermédiaires sont plus petits que k1. Pour cela, on considère chaque occurrence du sommet k dans ce chemin : entre deux occurrences consécutives, les sommets intermédiaires sont plus petits que k-1. On a alors la formule
Lp,q(k)=Lp,q(k1)+Lp,k(k1)(Lk,k(k1))*Lk,q(k1).

Il y a donc n+1 étapes (k=0,,n). Chacune des étapes demande le calcul de n2 expressions, et la taille des expressions elles-mêmes croît avec k. S’il est facilement programmable, l’algorithme est assez pénible à la main. Il est alors utile d’utiliser les règles qui permettent de simplifier des expressions régulières.

Pseudo-code

On va représenter les L(k) (respectivement L) sous forme de matrices, dont le coefficient en (i,j) est Li,j(k) (respectivement Li,j). On a alors, pour 𝒜=(Q,,I,T) un automate fini à n états sur l'alphabet A:

  Fonction McNaughton-Yamada(𝒜)
     L:=((p,a,q)a)1𝑝,𝑞n  \\à l'itération k de la boucle for, cette matrice représente L(k)
     for 𝑘:=1 to 𝑛
         for 𝑝:=1 to 𝑛
             for 𝑞:=1 to 𝑛
                L𝑝,𝑞:=L𝑝,𝑞+L𝑝,𝑘(L𝑘,𝑘)*L𝑘,𝑞
     R :=   \\expression rationnelle à retourner
     for 𝑝I:
         for 𝑞T:
             if 𝑝==𝑞 then
                R := R + ε + Lp,p \\on n'ajoute ε qu'aux Lp,p𝑝IT
             else
                R := R + Lp,q
     retourner R
  Fin Fonction

Exemples

Un premier exemple

L'automate 𝒜1 considéré.

Appliquons l'algorithme de McNaughton et Yamada à l'automate 𝒜1 représenté. On va utiliser la représentation matricielle introduite dans la partie précédente. On a :

  • L(0)=(abb);
  • L(1)=(a+a(a)*ab+a(a)*bb+(a)*b)=(a+a*bb);
  • L(2)=(a++(a*b)(b)*a*b+(a*b)(b)*bb+bb*b)=(a+a*b+b+).

D'où L=(ϵ+a+a*b+ϵ+b+)=(a*a*b+b*).

Le langage L(𝒜1) reconnu par 𝒜1est alors dénoté par l'expression rationnelle L1,1+L1,2=a*+a*b+. Après simplifications, on a L(𝒜1)=a*b+, ce qui est bien le résultat attendu.

L'automate 𝒜1, avec les états numérotés dans l'ordre inverse.

Considérons maintenant le même automate, mais avec une numérotation différente des états. L'algorithme appliqué à cet automate donne :

  • L(0)=(bba)
  • L(1)=(b+ba)
  • L(2)=(b+a*b+a+)
D'où L=(b*a*b+a*).

L(𝒜1) est alors dénoté par L2,2+L2,1=a*+a*b+, soit exactement la même expression rationnelle que précédemment : pour cet exemple particulier, le choix du nouvel état autorisé à chaque étape ne change pas l'expression rationnelle obtenue en fin d'algorithme.

Un deuxième exemple, où la numérotation des états change le résultat

L'automate 𝒜2.

Donnons maintenant l'exemple présenté dans l'ouvrage de référence de Sakarovitch[2]. Appliquons maintenant l'algorithme à l'automate 𝒜2. On a :

  • L(0)=(abab)
  • L(1)=(a+a*ba+a*b)
  • L(2)=((a*b)*a+(a*b)+(a*b)*a+(a*b)+)
  • L=(ε+(a*b)*a+(a*b)+(a*b)*a+(a*b)*).

D'où L(𝒜2)=L1,1=ε+(a*b)*a+.

L'automate 𝒜2, avec les états numérotés dans l'ordre inverse.

De même que pour le premier exemple, appliquons à nouveau l'algorithme en changeant la numérotation des états. On a :

  • L(0)=(baba)
  • L(1)=(b+b*ab+b*a)
  • L(2)=((b*a)*b+(b*a)+(b*a)*b+(b*a)+)
  • L=((b*a)*b*(b*a)+(b*a)*b+(b*a)*).

D'où L(𝒜2)=L2,2=(b*a)* : l'expression rationnelle obtenue pour le même langage est différente.

Notes et références

Modèle:Références

Bibliographie

Articles connexes

Modèle:Portail