Cours n° 5, 24 octobre 2013

Jean-François Perrot

Automates finis non-déterministes
Tout langage régulier est reconnaissable par un automate fini


    1. Notion d'automate non-déterministe
      1. Prologue
      2. Principe
      3. Exemple : Renverser un automate

    2. Constatation : ce modèle plus général n'est pas plus puissant que le modèle déterministe
      1. Construction
      2. Visualisation de la déterminisation dans le logiciel automate.

    3. Propriétés de fermeture de la classe des langages reconnaissables par automates finis
      1. Fermeture par passage au complémentaire
      2. Fermeture par image-miroir
      3. Fermeture par union ensembliste
      4. Fermeture par produit (concaténation) des langages
      5. Fermeture par itération (étoile)

    4. Conclusion
      1. Inclusion
      2. Lemme de l'étoile
      3. Application


Notion d'automate non-déterministe

Constatation : ce modèle plus général n'est pas plus puissant que le modèle déterministe

Pour tout langage reconnu par un automate fini non-déterministe, on sait construire un automate fini déterministe qui le reconnaît.

Soulignons que cette propriété et l'apanage des automates finis. Elle cesse d'être vraie pour les autoltates à pile, etc.

Propriétés de fermeture de la classe des langages reconnaissables par automates finis

  1. Fermeture par passage au complémentaire

    Évident : si L est reconnu par un automate déterministe [S, t, s0, T ],
    alors son complémentaire X*\L est reconnu par "le même automate",
    avec comme ensemble d'états terminaux le complémentaire de l'ensemble initial,
    à savoir l'automate [S, ts0, S\T ]
  2. Fermeture par image-miroir

    Immédiat : si L est reconnu par un automate déterministe [S, t, s0, T ],
    alors L~ est reconnu par l'automate renversé, non-déterministe [S, t~, T, {s0} ],
    qu'il suffit de rendre déterministe par la construction précédente.
    Une illustration de ce processus est donnée dans le mode d'emploi du logiciel automate, exemple 2.

  3. Fermeture par union ensembliste

    Si L' est reconnu par un automate déterministe [S', t', s'0, T' ], 
    et si L" est reconnu par un automate déterministe [S", t", s"0, T" ],
    alors L'L" est reconnu par l'automate déterministe [S'×S", tt", (s'0, s"0) , T'×S"∪S'×T" ], où
    En somme, on fait fonctionner les deux automates "en parallèle",
    et à la fin du calcul on regarde si l'un des deux états atteints est terminal.

    Corollaire : fermeture par intersection
    (en vertu de la fermeture par complémentation et des lois de de Morgan).
    On peut aussi le voir directement, par la même construction "en parallèle" que ci-dessus,
    en prenant pour ensemble terminal T'×T", l'ensemble des couples dont les deux composantes sont terminales.

  4. Fermeture par produit (concaténation) des langages

    Si L' est reconnu par un automate déterministe A' = [S', t', s'0, T' ],
    et si L" est reconnu par un automate déterministe A" = [S", t", s"0, T" ],
    (en supposant que les deux ensembles d'états sont disjoints, ce qui est toujours possible, au prix d'une duplication)
    alors L'.L" est reconnu par l'automate non-déterministe N ainsi conçu :
    Illustration avec d'une part l'exemple scolaire (non réduit), d'autre part son renversé minimal (ci-dessus),
    où on a renommé les états et mis en évidence l'état-poubelle pour avoir la même convention de représentation dans les deux cas.

    Deux automates


    Produit


    Justification :

    1. Soit uL', v∈L" et uv leur produit. Il existe un calcul de N qui accepte uv,
      composé du calcul de A' qui accepte u et se termine dans T', suivi d'une ε-transition qui arrive à s"0,
      suivi du calcul de A" qui accepte v et se termine dans T", qui est l'ensemble des états terminaux de N.

    2. Réciproquement, soit w un mot accepté par N. Alors il appartient au produit L'.L".
      En effet, le calcul de N qui l'accepte commence par s'0 (seul état initial) et se termine dans T"
      et comme les deux ensemble S' et S" sont disjoints, le calcul a dû quitter S' pour passer dans S",
      ce qui ne peut se faire que par une ε-transition entre T' et s"0.
      Soit alors u le facteur gauche de w lu avant ladite ε-transition, et v le facteur droit qui le complète :
      on a w = uv, u arrive dans T' en partant de s'0, il est donc accepté par A', d'où uL',
      et v arrive dans T" en partant de s"0, il est donc accepté par A", d'où vL", et enfin uvL'.L".
      Notons au passage que u ou v ou les deux peuvent être vides.

  5. Fermeture par itération (étoile)

    Si L est reconnu par un automate déterministe A = [S, t, s0, T ],
    alors L* est reconnu par l'automate non-déterministe N que voici :
    Illustration (suite)

    Etoile


    Justification

    1. Soit w un mot de L* ; s'il est vide, il est accepté puisque l'état initial d est aussi terminal.
      sinon, si c'est un seul mot de L, il est accepté par une ε-transition initiale vers s0
      suivie par un calcul de A conduisant à un état terminal,
      et si c'est un produit d'au moins deux mots de L, après la lecture du premier une ε-transition ramène à s0
      et ainsi de suite (si vous voulez un raisonnement en forme, procédez par écurrence sur le nombre de facteurs du mot w).

    2. Réciproquement, soit w un mot accepté par N. S'il est vide, il est dans L*.
      Sinon, c'est qu'il est accepté via un calcul conduisant à un état de T,
      puisque l'état initial d ne reçoit aucune transition.
      Ce calcul a dû commencer par une ε-transition vers s0, et se poursuivre avec un certain nombre de calculs de A
      suivis d'ε-transitions vers s0 (les seules transitions possibles en dehors de celles de A). 
      Comme ces ε-transitions ne sont possibles qu'à partir des états terminaux de A, elles réalisent une factorisation de w
      dont tous les facteurs sont acceptés par A.
      Le mot-candidat w est donc dans L*.

    Remarque : en général, afin d'accepter le mot vide on ne peut pas faire de s0 un état terminal du nouvel automate,
    et il est indispensable d'isoler un nouvel état initial ne recevant aucune transition,
    comme le montre un exemple comme L = x*y :
    l'automate "naturel" a une boucle par x sur s0, si bien qu'en faisant de s0 un état terminal, 
    on accepte du même coup tous les xxxxxx, etc...

Conclusion