Cours n° 6, 22 novembre 2011

Jean-François Perrot

Tout langage reconnaissable par un automate fini est régulier
Théorème de Kleene

  1. Construction d'un automate reconnaissant le langage donné par une e.r.
    1. Premier exemple
    2. Second exemple, où apparaît l'opérateur d'union

  2. Réciproquement, construire une e.r. pour le langage reconnu par un automate fini
    1. L'algorithme de McNaughton & Yamada

Construction d'un automate reconnaissant le langage donné par une e.r.

Une telle construction découle des résultats du cours n°6, qui donnent pour les 3 opérations union, produit et étoile,
trois procédés pour construire un automate reconnaissant leur résultat à partir des automates reconnaissant leurs opérandes.
D'autre part, le logiciel automate (dans son étape de compilation) propose par défaut un procédé (dit algorithme de Thompson),
que nous allons examiner ici.

Réciproquement, construire une e.r. pour le langage reconnu par un automate fini

Si nous y arrivons, nous aurons montré l'équivalence entre les deux propriétés être la valeur d'une e.r. et être reconnu par un automate fini,
équivalence due au grand logicien américain S. C. Kleene en 1956.
Il y a plusieurs méthodes pour effectuer cette construction, qui sont plus ou moins efficaces.
Nous présentons ici la plus directement intuitive...

L'algorithme de McNaughton & Yamada

Le langage reconnu par l'automate est la réunion (finie) des langages obtenus en prenant un seul état terminal à la fois.
Notre automate ayant n états, nous nous concentrons donc sur la construction d'une e.r. pour chacun des n×n langages
Ls,s' = { w∈X* | s.w = s' } formé de tous les mots qui envoient un état s quelconque sur un autre état s'.
Si nous y parvenons, le langage reconnu par l'automate sera la valeur d'une réunion finie d'e.r., donc d'une e.r.

L'idée est de procéder pas à pas en prenant en compte un nombre croissant d'états intermédiaires entre s et s'.
Les états étant supposés numérotés de 0 à n, on commence par aucun état intermédiaire, puis seulement s0, puis s0 et s1, puis s0s1 et s2, etc.
Le logiciel automates propose une visualisation très parlante de ce processus.
La voici sur la base de l'automate "renversé minimal" que nous avons vu au cours 6.

Ex. Amer. Inv. Det

On représente les 4×4 e.r. en construction par un tableau à double entrée : la case (ligne i, colonne j) contient l'e.r. des mots qui envoient si sur sj
en passant pas les états intermédiaires autorisés par l'étape en cours. Quand la case est vide le langage l'est aussi.
  1. L'étape 0 correspond aux calculs qui ne passent par aucun état intermédiaire : c'est-à dire aux transitions elles-mêmes.

    MN0

  2. L'étape 1 correspond aux calculs qui ne passent que par l'état 0. 
    Par rapport à l'étape 0, on voit seulement apparaître l'aller-retour 1-0-1 provoqué par le mot bb.

    MN1

  3. L'étape 2 correspond aux calculs qui ne passent que par les états 0 et 1.
    On voit fleurir les (bb)* : on peut en effet tourner indéfiniment autour de 1.
    À noter que le mot vide n'est pas pris en compte, d'où (bb)+ et non (bb)* pour 1-1.

    MN2

  4. L'étape 3 correspond aux calculs qui ne passent que par les états 0, 1 et 2.
    On voit apparaître la boucle sur 2 par b, qui est aussitôt distribuée.

    En effet, d'une manière générale, on calcule l'e.r. de l'étape 3 en fonction des e.r. de l'étape 2 comme suit :
    Soit Es,s' l'e.r. décrivant les chemins de s à s' à l'étape 2, et Fs,s' l'e.r. décrivant les chemins de s à s' à l'étape 3.
    Fs,s' = Es,s' ∪ Es,2 (E2,2)*E2,s' , puisque pour aller de s à s' en ne passant que par 0, 1 et 2,
    Ce raisonnement est général et vaut pour toutes les étapes.

    MN3

  5. L'étape 4 correspond aux calculs de s à s' qui ne passent que par les états 0, 1, 2 et 3, c'est-à-dire à tous les calculs.
    Et par conséquent l'e.r. cherchée peut être affichée.

    MN4


    Comme certaines expressions sont trop longues pour s'écrire dans leurs cases - le logiciel offre une visualisation améliorée
    obtenue en cliquant dans la case que l'on veut examiner :

    MN4 + visu


  6. Et à la fin du calcul, le résultat officiel !

    E.R. finale

    Est-il évident que notre estimation précédente [fondée sur le renversement de (aa|b)*ab(bb)*]
    et ce résultat donné par la machine ont bien la même valeur ?
    C'est-à-dire, que (bb)*ba(aa|b)*  =  b(bb)*ab*|b(bb)*ab*a(ab*a)*ab* ?

    On a (bb)*ba  =  b(bb)*a, reste donc à démontrer que b(bb)*a(aa|b)* =  b(bb)*ab*|b(bb)*ab*a(ab*a)*ab*
    c'est-à-dire que (aa|b)* = b*|b*a(ab*a)*ab* :


    Doutez-vous à présent de l'intelligence des machines ?