Aller au contenu principal

Non-déterminisme et déterminisation

Nous avons introduit au chapitre 1 une distinction entre automates finis déterministes et automates finis non déterministes. La notion de non-déterminisme provient de l'impossibilité de déterminer l'état courant de l'automate à partir de son état initial et des symboles lus.

Nous avons vu au chapitre 2 l'intérêt des transitions instantanées (étiquetées ε\varepsilon) pour la construction de Kleene qui construit, pour toute expression régulière, un automate fini non déterministe qui accepte le même langage. Se pose alors la question de l'expressivité du non-déterminisme : existe-t-il des langages réguliers qui sont acceptés par des AFN, mais par aucun AFD ? Nous avons en effet montré que tout problème de décision décrit par un langage régulier est décidé par un automate fini non déterministe. Existe-t-il donc des problèmes de décision "réguliers" qui ne peuvent pas être décidés par un automate fini déterministe ?

Élimination du non-déterminisme​

Considérons l'automate fini non déterministe ANA_N suivant.

Automate fini non déterministe A_N

ANA_N accepte en particulier le mot aabbaabb, notamment sur l'exécution suivante :

q0→ϵq3→aq3→aq3→bq4→ϵq3→bq4q_0 \stackrel{\epsilon}{\rightarrow} q_3 \stackrel{a}{\rightarrow} q_3 \stackrel{a}{\rightarrow} q_3 \stackrel{b}{\rightarrow} q_4 \stackrel{\epsilon}{\rightarrow} q_3 \stackrel{b}{\rightarrow} q_4

Nous remarquons que cette exécution contient deux transitions instantanées qui sont toutes les deux indispensables à ANA_N pour accepter aabbaabb (sur cette exécution) puisque, d'une part, depuis q0q_0 il n'y a aucune transition d'étiquette aa et, d'autre part, sans la transition q4→ϵq3q_4 \stackrel{\epsilon}{\rightarrow} q_3, l'exécution se terminerait en q3q_3 qui n'est pas accepteur. En toute généralité, il peut être nécessaire qu'un automate fini non déterministe franchisse une ou plusieurs transitions instantanées avant et après avoir lu chaque symbole du mot d'entrée afin de l'accepter. La figure suivante présente l'arbre des exécutions de ANA_N sur le mot aabbaabb, où nous avons donné l'occasion à ANA_N de franchir autant de transitions instantanées que possible (les symboles de aabbaabb sont séparés par des ϵ\epsilon). Nous voyons en particulier que, pour toutes les exécutions acceptantes de ANA_N sur aabbaabb, il est nécessaire de commencer par une transition instantanée : soit q0→ϵq1q_0 \stackrel{\epsilon}{\rightarrow} q_1, soit q0→ϵq3q_0 \stackrel{\epsilon}{\rightarrow} q_3. Rappelons également que ϵ\epsilon permet de boucler sur tout état (une séquence vide de transitions instantanées laisse l'automate dans son état). Nous construisons la séquence de transitions d'ensemble d'états en ensemble d'états de ANA_N en regroupant les états suivant leur distance à la racine q0q_0 dans l'arbre :

{q0}→ϵ{q0,q1,q3}→a{q1,q2,q3}→ϵ{q1,q2,q3}→a{q1,q2,q3}→ϵ{q1,q2,q3}→b{q1,q4}→ϵ{q1,q3,q4}→b{q3,q4}→ϵ{q3,q4}\{ q_0\} \stackrel{\epsilon}{\rightarrow} \{q_0, q_1, q_3\} \stackrel{a}{\rightarrow} \{q_1,q_2,q_3\} \stackrel{\epsilon}{\rightarrow} \{ q_1, q_2, q_3\} \stackrel{a}{\rightarrow} \{q_1,q_2,q_3\} \stackrel{\epsilon}{\rightarrow} \{q_1,q_2,q_3\} \stackrel{b}{\rightarrow} \{q_1,q_4\} \stackrel{\epsilon}{\rightarrow} \{q_1,q_3,q_4\} \stackrel{b}{\rightarrow} \{q_3,q_4\} \stackrel{\epsilon}{\rightarrow} \{q_3,q_4\}

Arbre des exécutions de A_N sur aabb

Dans cette séquence, la transition {q0}→ϵ{q0,q1,q3}\{q_0\} \stackrel{\epsilon}{\rightarrow} \{q_0,q_1,q_3\} signifie que, sans avoir lu aucune lettre du mot aabbaabb, ANA_N peut se déplacer de l'état q0q_0 à l'un des états q0q_0, q1q_1 ou q3q_3. Puis les deux transitions {q0,q1,q3}→a{q1,q2,q3}→ϵ{q1,q2,q3}\{q_0,q_1,q_3\} \stackrel{a}{\rightarrow} \{q_1,q_2,q_3\} \stackrel{\epsilon}{\rightarrow} \{q_1,q_2,q_3\} indiquent que, depuis un état parmi {q0,q1,q3}\{q_0,q_1,q_3\}, en lisant le symbole aa, ANA_N atteint un état parmi {q1,q2,q3}\{q_1,q_2,q_3\}, puis ANA_N peut se déplacer suivant des transitions instantanées (si possible) pour se trouver dans un état parmi {q1,q2,q3}\{q_1,q_2,q_3\}. Les transitions de la séquence peuvent donc être regroupées de la façon suivante :

{q0}→ϵ{q0,q1,q3}→a,ϵ{q1,q2,q3}→a,ϵ{q1,q2,q3}→b,ϵ{q1,q3,q4}→b,ϵ{q3,q4}\{q_0\} \stackrel{\epsilon}{\rightarrow} \{q_0,q_1,q_3\} \stackrel{a, \epsilon}{\rightarrow} \{q_1,q_2,q_3\} \stackrel{a,\epsilon}{\rightarrow} \{q_1,q_2,q_3\} \stackrel{b, \epsilon}{\rightarrow}\{q_1,q_3,q_4\} \stackrel{b, \epsilon}{\rightarrow} \{q_3,q_4\}

L'ensemble des exécutions d'un automate fini non déterministe AA sur un mot ω=ω1…ωn\omega=\omega_1 \ldots \omega_n peut donc être vu comme suit.

  1. AA débute dans l'ensemble X0={q∈Q∣∃q0∈I,q0→ϵq}X_0 = \{q \in Q \mid \exists q_0 \in I, q_0 \stackrel{\epsilon}{\rightarrow} q\} des états qq pour lesquels il existe une séquence (éventuellement vide) de transitions ϵ\epsilon d'un état initial à qq.
  2. Puis AA lit le premier symbole ω1\omega_1 et atteint l'ensemble X1={q′∈Q∣∃q∈X0,q→ω1,ϵq′}X_1 = \{q' \in Q \mid \exists q \in X_0 , q \stackrel{\omega_1, \epsilon}{\rightarrow} q'\} des états q′q' pour lesquels il existe une séquence de transitions issue d'un état q∈X0q \in X_0, débutant par ω1\omega_1 et suivie d'une séquence (éventuellement vide) de transitions ϵ\epsilon.
  3. Puis AA lit le second symbole ω2\omega_2 et atteint l'ensemble d'états X2={q′∈Q∣∃q∈X1,q→ω2,ϵq′}X_2 = \{ q' \in Q \mid \exists q \in X_1, q \stackrel{\omega_2, \epsilon}{\rightarrow} q'\}.
  4. Et ainsi de suite : ω\omega est accepté si et seulement si XnX_n contient un état accepteur.

Nous pouvons in fine éliminer les ϵ\epsilon pour obtenir la séquence de transitions qui suit :

{q0,q1,q3}→a{q1,q2,q3}→a{q1,q2,q3}→b{q1,q3,q4}→b{q3,q4}\{q_0,q_1,q_3\} \stackrel{a}{\rightarrow} \{q_1,q_2,q_3\} \stackrel{a}{\rightarrow}\{q_1,q_2,q_3\} \stackrel{b}{\rightarrow}\{q_1,q_3,q_4\} \stackrel{b}{\rightarrow} \{q_3,q_4\}

Nous présentons maintenant une construction de déterminisation des automates finis non déterministes qui généralise le principe exposé ci-dessus. Celle-ci requiert deux phases :

  1. l'élimination des transitions instantanées ;
  2. l'élimination des choix non déterministes.

Clôture instantanée​

Reprenons la séquence de transitions précédente. La première transition {q0}→ϵ{q0,q1,q3}\{q_0\} \stackrel{\epsilon}{\rightarrow} \{q_0,q_1,q_3\} définit l'ensemble des états accessibles depuis q0q_0 par des transitions instantanées.

Soient un automate fini A=(Q,Σ,δ,I,F)A=(Q,\Sigma,\delta,I,F) et qq un état de AA. La clôture instantanée de qq, notée clϵ(q)cl_{\epsilon}(q), est l'ensemble des états de AA accessibles depuis qq par une séquence (éventuellement vide) de transitions instantanées :

clϵ(q)={q′∈Q∣q→ϵq′}cl_\epsilon(q)=\{q' \in Q \mid q \stackrel{\epsilon}{\rightarrow} q'\}

La clôture instantanée se généralise à un ensemble d'états X⊆QX \subseteq Q :

clϵ(X)=⋃q∈Xclϵ(q)cl_\epsilon(X)= \bigcup \limits_{q \in X} cl_\epsilon(q)

Construction par sous-ensembles​

La seconde phase regroupe dans un même état de l'automate déterministe tous les états que l'AFN peut atteindre après la lecture d'un même préfixe, comme dans la séquence ci-dessus. À partir de A=(Q,Σ,δ,I,F)A=(Q,\Sigma,\delta,I,F), on construit l'automate déterministe AD=(QD,Σ,δD,X0,FD)A_D=(Q_D,\Sigma,\delta_D,X_0,F_D) :

  • l'état initial est X0=clϵ(I)X_0 = cl_\epsilon(I) ;
  • pour tout ensemble X∈QDX \in Q_D et tout s∈Σs \in \Sigma, δD(X,s)=clϵ({q′∈Q∣∃q∈X,(q,s,q′)∈δ})\delta_D(X,s) = cl_\epsilon(\{q' \in Q \mid \exists q \in X, (q,s,q') \in \delta\}) ;
  • QD⊆2QQ_D \subseteq 2^Q est l'ensemble des parties atteintes depuis X0X_0 par δD\delta_D ;
  • FD={X∈QD∣X∩F≠∅}F_D = \{X \in Q_D \mid X \cap F \neq \emptyset\}.

Par construction, L(AD)=L(A)\mathcal{L}(A_D) = \mathcal{L}(A) : le non-déterminisme n'augmente donc pas l'expressivité des automates finis. En revanche, l'automate déterministe obtenu peut compter jusqu'à 2card(Q)2^{card(Q)} états, et cette borne est atteinte pour certains langages.