summaryrefslogtreecommitdiffstats
path: root/notes-inf105.tex
diff options
context:
space:
mode:
Diffstat (limited to 'notes-inf105.tex')
-rw-r--r--notes-inf105.tex403
1 files changed, 322 insertions, 81 deletions
diff --git a/notes-inf105.tex b/notes-inf105.tex
index ead466a..efb4a57 100644
--- a/notes-inf105.tex
+++ b/notes-inf105.tex
@@ -22,7 +22,7 @@
\usepackage{graphics}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{tikz}
-\usetikzlibrary{arrows,automata,positioning}
+\usetikzlibrary{arrows,automata,positioning,calc}
\usepackage[hyperindex=false]{hyperref}
%
\theoremstyle{definition}
@@ -761,7 +761,8 @@ cccc,\ldots\}$, est rationnel, et comme $\{d\}$ l'est aussi, la
concaténation $\{d\}(\{c\}^*) = \{d, dc, dcc, dccc, \ldots\}$ est
encore un langage rationnel.
-\thingy Formellement, la définition des langages rationnelles est la
+\thingy\label{stable-under-rational-operations}
+Formellement, la définition des langages rationnelles est la
suivante : un ensemble $\mathscr{C} \subseteq \mathscr{P}(\Sigma^*)$
de langages (où $\mathscr{P}(\Sigma^*)$ est l'ensemble des parties de
$\Sigma^*$, i.e., l'ensemble de tous les langages sur $\Sigma$,
@@ -2085,12 +2086,12 @@ choix.
\subsection{Stabilité des langages reconnaissables}
-\thingy On rappelle qu'on a défini un langage reconnaissable comme un
-langage $L$ pour lequel il existe un DFA $A$ tel que $L = L_A$.
-D'après \ref{completion-of-dfai}, \ref{determinization-of-nfa} et
-\ref{removal-of-epsilon-transitions}, on peut remplacer « DFA » dans
-cette définition par « DFAI », « NFA » ou « εNFA » sans changer la
-définition.
+\thingy On rappelle qu'on a défini un langage \index{reconnaissable
+ (langage)}reconnaissable comme un langage $L$ pour lequel il existe
+un DFA $A$ tel que $L = L_A$. D'après \ref{completion-of-dfai},
+\ref{determinization-of-nfa} et \ref{removal-of-epsilon-transitions},
+on peut remplacer « DFA » dans cette définition par « DFAI », « NFA »
+ou « εNFA » sans changer la définition.
Nous allons maintenant montrer que les langages reconnaissables sont
stables par différentes opérations : complémentaire, union,
@@ -2212,6 +2213,77 @@ chaque état $q$ et chaque lettre $x$, il existe une unique arête
aboutissant à $q$ et étiquetée par $x$ — sont parfois dits
« co-déterministes ».)
+\thingy Nous allons maintenant montrer que la classe des langages
+reconnaissables est stable par les opérations rationnelles (union,
+concaténation et étoile de Kleene,
+cf. \ref{stable-under-rational-operations} ; on l'a déjà vu pour la
+réunion, mais on va en donner une nouvelle démonstration, qui a un
+contenu algorithmique utile dans des circonstances différentes).
+
+Pour établir ces stabilités, on va travailler sur les NFA et utiliser
+la construction parfois appelée « de Glushkov » ou « automate
+standard ». Celle-ci travaille, en fait, sur des NFA vérifiant une
+propriété supplémentaire facile à assurer, et on va commencer par un
+lemme dans ce sens :
+
+\begin{lem}\label{standard-automaton-lemma}
+Soit $A$ un NFA. Alors il existe un NFA $A'$ (sur le même
+alphabet $\Sigma$) qui soit équivalent à $A$ et qui possède la
+propriété supplémentaire d'avoir un \emph{unique} état initial $q_0$
+et qu'aucune transition n'aboutit à $q_0$. De plus, $A'$ se déduit
+algorithmiquement de $A$ et a au plus un état de plus que $A$.
+
+(On pourra appeler \defin[standard (automate)]{standard} un NFA
+vérifiant cette propriété d'avoir un unique état initial qui n'est la
+cible d'aucune transition. L'affirmation est donc que tout NFA est
+équivalent à un NFA \emph{standard} qui s'en déduit algorithmiquement
+par l'ajout d'au plus un état.)
+\end{lem}
+\begin{proof}
+On fabrique $A'$ en reprenant le même ensemble d'états $Q$ que
+dans $A$ auquel on ajoute un unique nouvel état $q_0$ qui sera le seul
+état initial de $A'$ ; pour chaque transition partant d'un état
+initial de $A$, on ajoute dans $A'$ une transition identiquement
+étiquetée partant de $q_0$.
+
+Formellement : soit $A = (Q,I,F,\delta)$. On définit alors $A' =
+(Q',\{q_0\},F,\delta')$ de la manière suivante : $Q' = Q \uplus
+\{q_0\}$ (où $\uplus$ désigne une réunion
+disjointe\footnote{C'est-à-dire qu'on s'arrange pour que $q_0$
+ n'appartienne pas à $Q$.}), et $\delta'$ est la réunion des
+transitions $(q,x,q')$ qui étaient déjà dans $\delta$ et des
+$(q_0,x,q')$ telles qu'il existe une transition $(q,x,q') \in \delta$
+avec $q\in I$.
+
+La figure suivante illustre la transformation en question :
+\begin{center}
+\begin{tikzpicture}[>=latex,line join=bevel,automaton,baseline=(A.base)]
+\node (A) at (0bp,0bp) [draw,dotted,circle,minimum size=75bp] {$A$};
+\node (q) at (-15bp,15bp) [draw,circle,state,initial] {\footnotesize $q$};
+\node (qp) at (15bp,15bp) [draw,circle,state] {\footnotesize\vbox to0pt{\vss\hbox to0pt{$q'$\hss}}\phantom{$q$}};
+\draw [->] (A.east) -- ($(A.east)+(3ex,0)$);
+\draw [->] (q) -- node[auto] {\footnotesize $x$} (qp);
+\end{tikzpicture}
+\quad devient\quad
+\begin{tikzpicture}[>=latex,line join=bevel,automaton,baseline=(A.base)]
+\node (A) at (0bp,0bp) [draw,dotted,circle,minimum size=75bp] {\phantom{$A$}};
+\node (q) at (-15bp,15bp) [draw,circle,state] {\footnotesize $q$};
+\node (qp) at (15bp,15bp) [draw,circle,state] {\footnotesize\vbox to0pt{\vss\hbox to0pt{$q'$\hss}}\phantom{$q$}};
+\node (q0) at (-40bp,0bp) [draw,circle,state,initial,fill=white] {$q_0$};
+\draw [->] (A.east) -- ($(A.east)+(3ex,0)$);
+\draw [->] (q) -- node[auto] {\footnotesize $x$} (qp);
+\draw [->] (q0) to[out=0,in=270] node[auto,swap] {\footnotesize $x$} (qp.south);
+\end{tikzpicture}
+\end{center}
+
+(\emph{Remarque : } De façon équivalente, on peut fabriquer $A'$ en
+ajoutant d'abord un unique état initial $q_0$ et des ε-transitions de
+$q_0$ vers chacun des états initiaux de $A$, puis en éliminant les
+ε-transitions qu'on vient d'ajouter
+(cf. \ref{removal-of-epsilon-transitions}). Cela donne le même
+résultat que ce qui vient d'être dit.)
+\end{proof}
+
\thingy On a vu en \ref{dfa-union-and-intersection} une preuve, à base
de NFA, que $L_1 \cup L_2$ est reconnaissable lorsque $L_1$ et $L_2$
le sont. Donnons maintenant une autre preuve de ce fait, à base de
@@ -2220,40 +2292,99 @@ le sont. Donnons maintenant une autre preuve de ce fait, à base de
\begin{prop}\label{nfa-union}
Si $L_1,L_2$ sont des langages reconnaissables (sur un même
alphabet $\Sigma$), alors la réunion $L_1 \cup L_2$ est
-reconnaissable ; de plus, un εNFA (resp. NFA) la reconnaissant se
-déduit algorithmiquement de εNFA (resp. NFA) reconnaissant $L_1$
-et $L_2$ (c'est simplement, en un sens évident, la réunion disjointe
-des automates donnés).
+reconnaissable ; de plus, un NFA la reconnaissant se déduit
+algorithmiquement de NFA reconnaissant $L_1$ et $L_2$.
\end{prop}
\begin{proof}
-Par hypothèse, il existe des εNFA (resp. NFA) $A_1 =
-(Q_1,I_1,F_1,\delta_1)$ et $A_2 = (Q_2,I_2,F_2,\delta_2)$ tels que
-$L_1 = L_{A_1}$ et $L_2 = L_{A_2}$. Considérons l'automate $A'$ dont
-l'ensemble d'états est $Q' = Q_1 \uplus Q_2$ où $\uplus$ désigne la
-réunion disjointe\footnote{C'est-à-dire que, quitte à renommer les
- états, on remplace $Q_2$ par un ensemble en bijection avec lui de
- façon à être disjoint de $Q_1$.}, l'ensemble d'états initiaux est la
-réunion $I' = I_1 \cup I_2$, les états finaux $F' = F_1 \cup F_2$, et
-la relation de transition $\delta'$ est $\delta_1 \cup \delta_2$
-(l'ensemble des transitions existant déjà dans $A_1$ ou $A_2$).
-Symboliquement :
+Par hypothèse, il existe des NFA reconnaissant $L_1$ et $L_2$ :
+d'après \ref{standard-automaton-lemma}, on peut supposer qu'ils sont
+\emph{standards} en ce sens qu'ils ont un unique état initial qui
+n'est la cible d'aucune transition. Disons que $A_1 =
+(Q_1,\{q_1\},F_1,\delta_1)$ et $A_2 = (Q_2,\{q_2\},F_2,\delta_2)$ sont
+des NFA standards tels que $L_1 = L_{A_1}$ et $L_2 = L_{A_2}$.
+
+L'automate $A'$ s'obtient réunissant $A_1$ et $A_2$ mais en
+« fusionnant » les états initiaux $q_1$ et $q_2$ de $A_1$ et $A_2$ en
+un unique état initial $q'_0$, d'où partent les mêmes transitions que
+de l'un ou de l'autre :
\begin{center}
-\begin{tikzpicture}[>=latex,line join=bevel,automaton]
-\node (A1) at (0bp,25bp) [draw,dotted,circle,initial,final] {$A_1$};
-\node (A2) at (0bp,-25bp) [draw,dotted,circle,initial,final] {$A_2$};
+\begin{tikzpicture}[>=latex,line join=bevel,automaton,baseline=(A.base)]
+\node (A) at (0bp,0bp) [draw,dotted,circle,minimum size=60bp] {$A_1$};
+\node (q0) at (-35bp,0bp) [draw,circle,state,initial,fill=white] {$q_1$};
+\node (i1) at (-10bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (i2) at (-10bp,-20bp) [circle,inner sep=2bp,fill] {};
+\node (o1) at (15bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (o2) at (25bp,0bp) [circle,inner sep=2bp,fill] {};
+\node (o3) at (15bp,-20bp) [circle,inner sep=2bp,fill] {};
+\draw [->] (q0) -- (i1);
+\draw [->] (q0) -- (i2);
+\draw [->] (o1) -- ($(o1.east)+(3ex,0)$);
+\draw [->] (o2) -- ($(o2.east)+(3ex,0)$);
+\draw [->] (o3) -- ($(o3.east)+(3ex,0)$);
+\end{tikzpicture}
+et
+\begin{tikzpicture}[>=latex,line join=bevel,automaton,baseline=(A.base)]
+\node (A) at (0bp,0bp) [draw,dotted,circle,minimum size=60bp] {$A_2$};
+\node (q0) at (-35bp,0bp) [draw,circle,state,initial,fill=white] {$q_2$};
+\node (i1) at (-10bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (i2) at (-10bp,-20bp) [circle,inner sep=2bp,fill] {};
+\node (o1) at (15bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (o2) at (25bp,0bp) [circle,inner sep=2bp,fill] {};
+\node (o3) at (15bp,-20bp) [circle,inner sep=2bp,fill] {};
+\draw [->] (q0) -- (i1);
+\draw [->] (q0) -- (i2);
+\draw [->] (o1) -- ($(o1.east)+(3ex,0)$);
+\draw [->] (o2) -- ($(o2.east)+(3ex,0)$);
+\draw [->] (o3) -- ($(o3.east)+(3ex,0)$);
+\end{tikzpicture}
+\\deviennent\\
+\begin{tikzpicture}[>=latex,line join=bevel,automaton,baseline=(A.base)]
+\node (A1) at (0bp,0bp) [draw,dotted,circle,minimum size=60bp] {\phantom{$A_1$}};
+\node (q0) at (-35bp,0bp) [draw,circle,state,initial,fill=white] {$q'_0$};
+\node (A1) at (90bp,0bp) [draw,dotted,circle,minimum size=60bp] {\phantom{$A_2$}};
+\node (i1) at (-10bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (i2) at (-10bp,-20bp) [circle,inner sep=2bp,fill] {};
+\node (l1) at (15bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (l2) at (25bp,0bp) [circle,inner sep=2bp,fill] {};
+\node (l3) at (15bp,-20bp) [circle,inner sep=2bp,fill] {};
+\node (r1) at (80bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (r2) at (80bp,-20bp) [circle,inner sep=2bp,fill] {};
+\node (o1) at (105bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (o2) at (115bp,0bp) [circle,inner sep=2bp,fill] {};
+\node (o3) at (105bp,-20bp) [circle,inner sep=2bp,fill] {};
+\draw [->] (q0) -- (i1);
+\draw [->] (q0) -- (i2);
+\draw [->] (l1) -- ($(l1.east)+(3ex,0)$);
+\draw [->] (l2) -- ($(l2.east)+(3ex,0)$);
+\draw [->] (l3) -- ($(l3.east)+(3ex,0)$);
+\draw [->] (o1) -- ($(o1.east)+(3ex,0)$);
+\draw [->] (o2) -- ($(o2.east)+(3ex,0)$);
+\draw [->] (o3) -- ($(o3.east)+(3ex,0)$);
+\draw [->] (q0) to[out=10,in=180] (r1);
+\draw [->] (q0) to[out=350,in=180] (r2);
\end{tikzpicture}
\end{center}
-%% \begin{center}
-%% \begin{tikzpicture}[>=latex,line join=bevel,automaton]
-%% \node (q0) at (0bp,0bp) [draw,circle,state,initial] {$q_0$};
-%% \node (A1) at (50bp,30bp) [draw,dotted,circle] {$A_1$};
-%% \node (A2) at (50bp,-30bp) [draw,dotted,circle] {$A_2$};
-%% \draw [->] (q0) to node[auto] {$\varepsilon$} (A1);
-%% \draw [->] (q0) to node[auto] {$\varepsilon$} (A2);
-%% \end{tikzpicture}
-%% \end{center}
+De façon plus formelle, considérons un nouvel ensemble d'états $Q' =
+(Q_1 \uplus Q_2) \setminus \{q_1,q_2\} \uplus \{q'_0\}$ où $\uplus$
+désigne la réunion disjointe (autrement dit, on prend la réunion
+disjointe des états non-initiaux de $A_1$ et $A_2$ et on ajoute un
+nouvel état $q'_0$), et la fonction $\varphi_1\colon Q_1 \to Q'$ qui
+envoie $q_1$ sur $q'_0$ et tout autre état de $Q_1$ sur lui-même, et
+$\varphi_2\colon Q_2 \to Q'$ de même. On définit alors l'automate
+$A'$ dont l'ensemble d'états est $Q'$, l'état initial est $q'_0$, les
+états finaux $F' = \varphi_1(F_1) \cup \varphi_2(F_2)$, et la relation
+de transition $\delta'$ est formée des triplets $(\varphi_1(q),x,q')$
+où $q\in Q_1$ et $(\varphi_2(q),x,q')$ où $q\in Q_2$.
+
+(\emph{Remarque : } De façon équivalente, on peut fabriquer $A'$ en
+ajoutant d'abord un unique état initial $q'_0$ à la réunion disjointe
+de $A_1$ et $A_2$ et des ε-transitions de $q'_0$ vers $q_1$ et $q_2$,
+puis en éliminant les ε-transitions qu'on vient d'ajouter
+(cf. \ref{removal-of-epsilon-transitions}) ainsi que les états $q_1$
+et $q_2$ devenus inutiles. Cela donne le même résultat que ce qui
+vient d'être dit.)
Il est alors clair qu'un chemin de l'état initial à un état final dans
cet automate $A'$ consiste soit en un chemin d'un état initial à un
@@ -2264,69 +2395,180 @@ bien $L_{A'} = L_1 \cup L_2$.
\begin{prop}\label{nfa-concatenation}
Si $L_1,L_2$ sont des langages reconnaissables (sur un même
alphabet $\Sigma$), alors la concaténation $L_1 L_2$ est
-reconnaissable ; de plus, un εNFA la reconnaissant se déduit
-algorithmiquement de εNFA reconnaissant $L_1$ et $L_2$.
+reconnaissable ; de plus, un NFA la reconnaissant se déduit
+algorithmiquement de NFA reconnaissant $L_1$ et $L_2$.
\end{prop}
\begin{proof}
-Par hypothèse, il existe des εNFA $A_1 = (Q_1,I_1,F_1,\delta_1)$ et
-$A_2 = (Q_2,I_2,F_2,\delta_2)$ tels que $L_1 = L_{A_1}$ et $L_2 =
-L_{A_2}$. Considérons le εNFA $A'$ dont l'ensemble d'états est $Q' =
-Q_1 \uplus Q_2$ où $\uplus$ désigne la réunion disjointe, dont les
-états initiaux sont $I_1$, les états finaux sont $F_2$, et la relation
-de transition $\delta'$ est $\delta_1 \cup \delta_2$ (l'ensemble des
-transitions existant déjà dans $A_1$ ou $A_2$) à quoi on ajoute encore
-une ε-transition $(q,\varepsilon,q')$ pour chaque $q\in F_1$ et
-chaque $q'\in I_2$. Symboliquement :
+Par hypothèse, il existe des NFA reconnaissant $L_1$ et $L_2$ :
+d'après \ref{standard-automaton-lemma}, on peut supposer qu'ils sont
+\emph{standards} en ce sens qu'ils ont un unique état initial qui
+n'est la cible d'aucune transition. Disons que $A_1 =
+(Q_1,\{q_1\},F_1,\delta_1)$ et $A_2 = (Q_2,\{q_2\},F_2,\delta_2)$ sont
+des NFA standards tels que $L_1 = L_{A_1}$ et $L_2 = L_{A_2}$.
+
+L'automate $A'$ s'obtient en réunissant $A_1$ et $A_2$, en ne gardant
+que les états finaux de $A_2$, en supprimant $q_2$ et en remplaçant
+chaque transition sortant de $q_2$ par une transition identiquement
+étiquetée partant de chaque état final de $A_1$ :
\begin{center}
-\begin{tikzpicture}[>=latex,line join=bevel,automaton]
-\node (A1) at (0bp,0bp) [draw,dotted,circle,initial] {$A_1$};
-\node (A2) at (70bp,0bp) [draw,dotted,circle,final] {$A_2$};
- \draw [->] (A1) to node[auto] {$\varepsilon$} (A2);
+\begin{tikzpicture}[>=latex,line join=bevel,automaton,baseline=(A.base)]
+\node (A) at (0bp,0bp) [draw,dotted,circle,minimum size=60bp] {$A_1$};
+\node (q0) at (-35bp,0bp) [draw,circle,state,initial,fill=white] {$q_1$};
+\node (i1) at (-10bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (i2) at (-10bp,-20bp) [circle,inner sep=2bp,fill] {};
+\node (o1) at (15bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (o2) at (25bp,0bp) [circle,inner sep=2bp,fill] {};
+\node (o3) at (15bp,-20bp) [circle,inner sep=2bp,fill] {};
+\draw [->] (q0) -- (i1);
+\draw [->] (q0) -- (i2);
+\draw [->] (o1) -- ($(o1.east)+(3ex,0)$);
+\draw [->] (o2) -- ($(o2.east)+(3ex,0)$);
+\draw [->] (o3) -- ($(o3.east)+(3ex,0)$);
+\end{tikzpicture}
+et
+\begin{tikzpicture}[>=latex,line join=bevel,automaton,baseline=(A.base)]
+\node (A) at (0bp,0bp) [draw,dotted,circle,minimum size=60bp] {$A_2$};
+\node (q0) at (-35bp,0bp) [draw,circle,state,initial,fill=white] {$q_2$};
+\node (i1) at (-10bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (i2) at (-10bp,-20bp) [circle,inner sep=2bp,fill] {};
+\node (o1) at (15bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (o2) at (25bp,0bp) [circle,inner sep=2bp,fill] {};
+\node (o3) at (15bp,-20bp) [circle,inner sep=2bp,fill] {};
+\draw [->] (q0) -- (i1);
+\draw [->] (q0) -- (i2);
+\draw [->] (o1) -- ($(o1.east)+(3ex,0)$);
+\draw [->] (o2) -- ($(o2.east)+(3ex,0)$);
+\draw [->] (o3) -- ($(o3.east)+(3ex,0)$);
+\end{tikzpicture}
+\\deviennent\\
+\begin{tikzpicture}[>=latex,line join=bevel,automaton,baseline=(A.base)]
+\node (A1) at (0bp,0bp) [draw,dotted,circle,minimum size=60bp] {\phantom{$A_1$}};
+\node (q0) at (-35bp,0bp) [draw,circle,state,initial,fill=white] {$q_1$};
+\node (A1) at (90bp,0bp) [draw,dotted,circle,minimum size=60bp] {\phantom{$A_2$}};
+\node (i1) at (-10bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (i2) at (-10bp,-20bp) [circle,inner sep=2bp,fill] {};
+\node (l1) at (15bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (l2) at (25bp,0bp) [circle,inner sep=2bp,fill] {};
+\node (l3) at (15bp,-20bp) [circle,inner sep=2bp,fill] {};
+\node (r1) at (80bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (r2) at (80bp,-20bp) [circle,inner sep=2bp,fill] {};
+\node (o1) at (105bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (o2) at (115bp,0bp) [circle,inner sep=2bp,fill] {};
+\node (o3) at (105bp,-20bp) [circle,inner sep=2bp,fill] {};
+\draw [->] (q0) -- (i1);
+\draw [->] (q0) -- (i2);
+\draw [->] (l1) to[out=0,in=180] (r1);
+\draw [->] (l1) to[out=0,in=180] (r2);
+\draw [->] (l2) to[out=0,in=180] (r1);
+\draw [->] (l2) to[out=0,in=180] (r2);
+\draw [->] (l3) to[out=0,in=180] (r1);
+\draw [->] (l3) to[out=0,in=180] (r2);
+\draw [->] (o1) -- ($(o1.east)+(3ex,0)$);
+\draw [->] (o2) -- ($(o2.east)+(3ex,0)$);
+\draw [->] (o3) -- ($(o3.east)+(3ex,0)$);
\end{tikzpicture}
\end{center}
-Il est alors clair qu'un chemin d'un état initial à un état final dans
-cet automate $A'$ consiste en un chemin d'un état initial à un état
-final dans $A_1$ suivi d'une ε-transition et d'un chemin d'un état
-initial à un état final dans $A_2$. On a donc bien $L_{A'} = L_1
-L_2$.
+De façon plus formelle, considérons un nouvel ensemble d'états $Q' =
+(Q_1 \uplus Q_2) \setminus \{q_2\}$ où $\uplus$ désigne la réunion
+disjointe. On définit alors l'automate $A'$ dont l'ensemble d'états
+est $Q'$, l'état initial est $q_1$, les états finaux $F' = F_2$, et la
+relation de transition $\delta$ est la réunion de $\delta_1$, de
+l'ensemble des triplets $(q,x,q') \in \delta_2$ tels que $q\neq q_2$,
+et enfin de l'ensemble des triplets $(q,x,q')$ tels que $(q_2,x,q')
+\in \delta_2$ et que $q\in F_1$.
+
+(\emph{Remarque : } De façon équivalente, on peut fabriquer $A'$ en
+ajoutant d'abord à la réunion disjointe de $A_1$ et $A_2$ une
+ε-transition de chaque état final de $A_1$ vers $q_2$, puis en
+éliminant les ε-transitions qu'on vient d'ajouter
+(cf. \ref{removal-of-epsilon-transitions}) ainsi que l'état $q_2$
+devenu inutile. Cela donne le même résultat que ce qui vient d'être
+dit.)
+
+Il est alors clair qu'un chemin de l'état initial $q_1$ à un état
+final dans cet automate $A'$ consiste en un chemin de $q_1$ à un état
+final dans $A_1$ suivi d'un chemin de $q_2$ à un état final dans $A_2$
+(moins $q_2$ lui-même). On a donc bien $L_{A'} = L_1 L_2$.
\end{proof}
\begin{prop}\label{nfa-star}
Si $L$ est un langage reconnaissable (sur un alphabet $\Sigma$), alors
-l'étoile de Kleene $L^*$ est reconnaissable ; de plus, un εNFA la
-reconnaissant se déduit algorithmiquement de εNFA reconnaissant $L$.
+l'étoile de Kleene $L^*$ est reconnaissable ; de plus, un NFA la
+reconnaissant se déduit algorithmiquement de NFA reconnaissant $L$.
\end{prop}
\begin{proof}
-Par hypothèse, il existe un εNFA $A = (Q,I,F,\delta)$ tel que $L =
-L_A$. Considérons le εNFA $A'$ dont l'ensemble d'états est $Q' =
-\{q_0\} \uplus Q$ (où $q_0$ est un nouvel état) dont les états
-initiaux sont $I' = \{q_0\}$, les états finaux sont $F' = \{q_0\}$, et
-la relation de transition $\delta'$ est $\delta$ (l'ensemble des
-transitions existant déjà dans $A$) à quoi on ajoute encore une
-ε-transition $(q_0,\varepsilon,q)$ pour chaque $q\in I$ et une autre
-$(q,\varepsilon,q_0)$ pour chaque $q\in F$. Symboliquement :
+Par hypothèse, il existe un NFA reconnaissant $L$ :
+d'après \ref{standard-automaton-lemma}, on peut supposer qu'ils est
+\emph{standard} en ce sens qu'il a un unique état initial qui n'est la
+cible d'aucune transition. Disons que $A = (Q,\{q_0\},F,\delta)$ est
+un NFA standard tel que $L = L_A$.
+
+L'automate $A'$ s'obtient en ajoutant à $A$, pour chaque transition
+sortant de $q_0$, une transition identiquement étiquetée partant de
+chaque état final de $A$, et en rendant $q_0$ final s'il ne l'était
+pas déjà :
\begin{center}
-\begin{tikzpicture}[>=latex,line join=bevel,automaton]
-\node (q0) at (0bp,0bp) [draw,circle,state,initial,final,accepting below] {$q_0$};
-\node (A) at (70bp,0bp) [draw,dotted,circle] {$A$};
- \draw [->,out=45,in=135] (q0) to node[auto] {$\varepsilon$} (A);
- \draw [->,out=225,in=315] (A) to node[auto] {$\varepsilon$} (q0);
+\begin{tikzpicture}[>=latex,line join=bevel,automaton,baseline=(A.base)]
+\node (A) at (0bp,0bp) [draw,dotted,circle,minimum size=60bp] {$A$};
+\node (q0) at (-35bp,0bp) [draw,circle,state,initial,fill=white] {$q_0$};
+\node (i1) at (-10bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (i2) at (-10bp,-20bp) [circle,inner sep=2bp,fill] {};
+\node (o1) at (15bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (o2) at (25bp,0bp) [circle,inner sep=2bp,fill] {};
+\node (o3) at (15bp,-20bp) [circle,inner sep=2bp,fill] {};
+\draw [->] (q0) -- (i1);
+\draw [->] (q0) -- (i2);
+\draw [->] (o1) -- ($(o1.east)+(3ex,0)$);
+\draw [->] (o2) -- ($(o2.east)+(3ex,0)$);
+\draw [->] (o3) -- ($(o3.east)+(3ex,0)$);
+\end{tikzpicture}
+devient
+\begin{tikzpicture}[>=latex,line join=bevel,automaton,baseline=(A.base)]
+\node (A) at (0bp,0bp) [draw,dotted,circle,minimum size=60bp] {\phantom{$A$}};
+\node (q0) at (-35bp,0bp) [draw,circle,state,initial,accepting below,fill=white] {$q_0$};
+\node (i1) at (-10bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (i2) at (-10bp,-20bp) [circle,inner sep=2bp,fill] {};
+\node (o1) at (15bp,20bp) [circle,inner sep=2bp,fill] {};
+\node (o2) at (25bp,0bp) [circle,inner sep=2bp,fill] {};
+\node (o3) at (15bp,-20bp) [circle,inner sep=2bp,fill] {};
+\draw [->] (q0) -- (i1);
+\draw [->] (q0) -- (i2);
+\draw [->] (o1) -- ($(o1.east)+(3ex,0)$);
+\draw [->] (o2) -- ($(o2.east)+(3ex,0)$);
+\draw [->] (o3) -- ($(o3.east)+(3ex,0)$);
+\draw [->] (o1) -- (i1);
+\draw [->] (o1) -- (i2);
+\draw [->] (o2) -- (i1);
+\draw [->] (o2) -- (i2);
+\draw [->] (o3) -- (i1);
+\draw [->] (o3) -- (i2);
\end{tikzpicture}
\end{center}
-Il est alors clair qu'un chemin de l'état initial $q_0$ à l'état final
-$q_0$ dans cet automate $A'$ consiste en un nombre quelconque
+De façon plus formelle, on considère l'automate $A'$ dont l'ensemble
+d'états est $Q' := Q$, l'état initial est $q_0$, les états finaux $F'
+:= F$, et la relation de transition $\delta'$ est la réunion de
+$\delta$ et de l'ensemble des triplets $(q,x,q')$ tels que $(q_0,x,q')
+\in \delta$ et que $q \in F$.
+
+(\emph{Remarque : } De façon équivalente, on peut fabriquer $A'$ en
+ajoutant d'abord à $A$ une ε-transition de chaque état final de $A$
+vers $q_0$, puis en éliminant les ε-transitions qu'on vient d'ajouter
+(cf. \ref{removal-of-epsilon-transitions}), et enfin en marquant $q_0$
+comme final. Cela donne le même résultat que ce qui vient d'être
+dit.)
+
+Il est alors clair qu'un chemin de l'état initial $q_0$ à un état
+final dans cet automate $A'$ consiste en un nombre quelconque
(éventuellement nul) de chemins d'un état initial à un état final
-dans $A$ chacun précédé d'une ε-transition de $q_0$ vers l'état
-initial de $A$ en question et suivi d'une ε-transition de l'état final
-de $A$ en question vers $q_0$. On a donc bien $L_{A'} = L^*$.
+dans $A$. On a donc bien $L_{A'} = L^*$.
\end{proof}
\begin{cor}\label{rational-languages-are-recognizable}
-Tout langage rationnel est reconnaissable ; de plus, un εNFA le
+Tout langage rationnel est reconnaissable ; de plus, un NFA le
reconnaissant se déduit algorithmiquement d'une expression rationnelle
le dénotant. (Et en particulier, il est possible de décider
algorithmiquement si un mot vérifie une expression rationnelle.)
@@ -2340,11 +2582,10 @@ propositions \ref{nfa-union}, \ref{nfa-concatenation}
et \ref{nfa-star}.
Pour décider si un mot vérifie une expression rationnelle, on peut
-commencer par transformer cette expression rationnelle en εNFA (i.e.,
-construire un εNFA reconnaissant le langage qu'elle dénote) comme on
-vient de l'expliquer, et transformer ensuite cet automate en DFA
-quitte à éliminer les ε-transitions
-(cf. \ref{removal-of-epsilon-transitions}) et à déterminiser
+commencer par transformer cette expression rationnelle en NFA standard
+(i.e., construire un NFA standard reconnaissant le langage qu'elle
+dénote) comme on vient de l'expliquer, et transformer ensuite cet
+automate en DFA quitte déterminiser
(cf. \ref{determinization-of-nfa}), après quoi il est facile de tester
si l'automate accepte le mot.
\end{proof}