diff options
-rw-r--r-- | figs/example4det.dot | 8 | ||||
-rw-r--r-- | figs/example5.dot | 13 | ||||
-rw-r--r-- | notes-inf105.tex | 139 |
3 files changed, 144 insertions, 16 deletions
diff --git a/figs/example4det.dot b/figs/example4det.dot index 2d88a37..7121690 100644 --- a/figs/example4det.dot +++ b/figs/example4det.dot @@ -1,10 +1,10 @@ digraph example4det { rankdir="LR"; node [texmode="math",shape="circle",style="state"]; - q0 [style="state,initial",label="\{0\}"]; - q01 [style="state",label="\{0,1\}"]; - q02 [style="state,final",label="\{0,2\}"]; - q012 [style="state,final",label="\{0,1,2\}"]; + q0 [style="state,initial",label="0",texlbl="$\{0\}$"]; + q01 [style="state",label="01",texlbl="$\{0,1\}$"]; + q02 [style="state,final",label="02",texlbl="$\{0,2\}$"]; + q012 [style="state,final",label="012",texlbl="$\{0,1,2\}$"]; edge [texmode="math",lblstyle="auto"]; q0 -> q0 [label="b",topath="loop above"]; q0 -> q01 [label="a"]; diff --git a/figs/example5.dot b/figs/example5.dot new file mode 100644 index 0000000..7c5e403 --- /dev/null +++ b/figs/example5.dot @@ -0,0 +1,13 @@ +digraph example5 { + rankdir="LR"; + node [texmode="math",shape="circle",style="state"]; + q0 [style="state,initial",label="0"]; + q1 [style="state",label="1"]; + q2 [style="state,final",label="2"]; + edge [texmode="math",lblstyle="auto"]; + q0 -> q0 [label="a",topath="loop above"]; + q0 -> q1 [label="e",texlbl="$\varepsilon$"]; + q1 -> q1 [label="b",topath="loop above"]; + q1 -> q2 [label="e",texlbl="$\varepsilon$"]; + q2 -> q2 [label="c",topath="loop above"]; +} diff --git a/notes-inf105.tex b/notes-inf105.tex index f46a27a..ae1f0e1 100644 --- a/notes-inf105.tex +++ b/notes-inf105.tex @@ -37,6 +37,7 @@ \newcommand{\liff}{\mathrel{\Longleftrightarrow}\relax} % \DeclareUnicodeCharacter{00A0}{~} +\DeclareUnicodeCharacter{03B5}{$\varepsilon$} % \DeclareMathSymbol{\tiret}{\mathord}{operators}{"7C} \DeclareMathSymbol{\traitdunion}{\mathord}{operators}{"2D} @@ -1136,8 +1137,9 @@ $(q_{i-1},x_i,q_i) \in \delta$ pour chaque $1\leq i\leq n$ ; ou, ce qui revient au même (par récurrence sur la longueur de $w$) : \begin{itemize} \item $(q,\varepsilon,q') \in \delta^*$ si et seulement si $q'=q$, -\item $(q,wx,q') \in \delta^*$ si et seulement si il existe $q_1$ tel - que $(q,w,q_1) \in \delta^*$ et $(q_1,x,q') \in \delta$. +\item $(q,wx,q') \in \delta^*$ si et seulement si il existe $q^\sharp$ + tel que $(q,w,q^\sharp) \in \delta^*$ et $(q^\sharp,x,q') \in + \delta$. \end{itemize} Enfin, l'automate $A$ accepte un mot $w$ lorsqu'il existe $q_0\in I$ @@ -1285,19 +1287,19 @@ procédant ainsi, on constuit l'automate à $4$ états qui suit : \pgfsetstrokecolor{strokecol} \definecolor{fillcol}{rgb}{1.0,1.0,1.0}; \pgfsetfillcolor{fillcol} - \filldraw (0bp,0bp) -- (0bp,204bp) -- (274bp,204bp) -- (274bp,0bp) -- cycle; + \filldraw (0bp,0bp) -- (0bp,155bp) -- (212bp,155bp) -- (212bp,0bp) -- cycle; \end{scope} - \node (q02) at (236bp,30bp) [draw,circle,state,final] {$\{0,2\}$}; - \node (q0) at (24bp,54bp) [draw,circle,state,initial] {$\{0\}$}; - \node (q01) at (123bp,94bp) [draw,circle,state] {$\{0,1\}$}; - \node (q012) at (236bp,134bp) [draw,circle,state,final] {$\{0,1,2\}$}; - \draw [->] (q01) ..controls (164.77bp,70.495bp) and (183.92bp,59.452bp) .. node[auto] {$b$} (q02); - \draw [->] (q0) ..controls (57.935bp,67.582bp) and (72.263bp,73.49bp) .. node[auto] {$a$} (q01); + \node (q02) at (188bp,19bp) [draw,circle,state,final] {$\{0,2\}$}; + \node (q0) at (18bp,40bp) [draw,circle,state,initial] {$\{0\}$}; + \node (q01) at (100bp,71bp) [draw,circle,state] {$\{0,1\}$}; + \node (q012) at (188bp,98bp) [draw,circle,state,final] {$\{0,1,2\}$}; + \draw [->] (q01) ..controls (129.79bp,53.593bp) and (147.53bp,42.867bp) .. node[auto] {$b$} (q02); + \draw [->] (q0) ..controls (45.781bp,50.378bp) and (59.874bp,55.839bp) .. node[auto] {$a$} (q01); \draw [->] (q0) to[loop above] node[auto] {$b$} (q0); - \draw [->] (q01) ..controls (163.68bp,108.3bp) and (177.52bp,113.29bp) .. node[auto] {$a$} (q012); + \draw [->] (q01) ..controls (129.27bp,79.877bp) and (142.8bp,84.122bp) .. node[auto] {$a$} (q012); \draw [->] (q012) to[loop above] node[auto] {$a$} (q012); - \draw [->] (q02) ..controls (176.26bp,31.326bp) and (130.91bp,33.455bp) .. (92bp,39bp) .. controls (80.643bp,40.618bp) and (68.355bp,43.14bp) .. node[auto] {$a,b$} (q0); - \draw [->] (q012) ..controls (236bp,87.978bp) and (236bp,79.013bp) .. node[auto] {$b$} (q02); + \draw [->] (q02) ..controls (146.97bp,21.169bp) and (110.83bp,23.684bp) .. (80bp,28bp) .. controls (68.696bp,29.582bp) and (56.322bp,31.905bp) .. node[auto] {$a,b$} (q0); + \draw [->] (q012) ..controls (188bp,65.926bp) and (188bp,56.965bp) .. node[auto] {$b$} (q02); % \end{tikzpicture} @@ -1317,6 +1319,119 @@ $\{0,1,2\}$ mémorise « les deux dernières lettres étaient des $a$ », et l'état $\{0,2\}$ mémorise « la dernière lettre était un $b$, mais la précédente était un $a$ ». + +\subsection{Automates finis non-déterministes à transitions spontanées (=εNFA)} + +\thingy Un \textbf{automate fini non-déterministe à transitions + spontanées} ou \textbf{...à $\varepsilon$-transitions}, en abrégé +\textbf{εNFA}, sur un alphabet $\Sigma$ est la donnée +\begin{itemize} +\item d'un ensemble fini $Q$ d'états, +\item d'un ensemble $I \subseteq Q$ d'états dits initiaux, +\item d'un ensemble $F \subseteq Q$ d'états dits finaux, +\item d'une relation de transition $\delta \subseteq Q \times + (\Sigma\cup\{\varepsilon\}) \times Q$. +\end{itemize} +Autrement dit, on autorise maintenant des transitions étiquetées par +le mot vide $\varepsilon$ plutôt que par une lettre $x \in\Sigma$ : +ces transitions sont dites spontanées, ou $\varepsilon$-transitions. + +Soulignons qu'on ne définit les $\varepsilon$-transitions \emph{que} +pour les automates non-déterministes : ou, pour dire les choses +autrement, \emph{un automate qui possède des $\varepsilon$-transitions + est par nature même non-déterministe}. + +La représentation graphique des εNFA est évidente (on utilisera le +symbole « $\varepsilon$ » pour étiqueter les transitions spontanées). + +\thingy Un εNFA accepte un mot $w$ lorsqu'il existe un chemin +conduisant d'un état initial à un état final et dont les arêtes sont +étiquetées par les lettres de $w$ ou bien des $\varepsilon$ insérés à +n'importe quel endroit et en n'importe quel nombre. Autrement dit, +$w$ est accepté lorsqu'\emph{il existe} $q_0,\ldots,q_n \in Q$ et +$t_1,\ldots,t_n \in (\Sigma\cup\{\varepsilon\})$ tels que $q_0 \in I$ +et $q_n\in F$ et $(q_{i-1},t_i,q_i) \in \delta$ pour chaque $1\leq +i\leq n$ et $w = t_1\cdots t_n$ (\emph{attention} : dans cette +écriture, $t_1,\ldots,t_n$ ne sont pas forcément les lettres de $w$, +certains des $t_i$ peuvent être le symbole $\varepsilon$, les lettres +de $w$ sont obtenues en ignorant ces symboles). + +De façon plus intuitive, cela signifie que l'automate a la possibilité +de passer spontanément, c'est-à-dire sans consommer de lettre, d'un +état $q$ à un état $q'$, lorsque ces états sont reliés par une +ε-transition. + +\thingy Voici une formalisation possible : si $A = (Q,I,F,\delta)$ est +un εNFA sur l'alphabet $\Sigma$, on définit une relation $\delta^* +\subseteq Q \times \Sigma^* \times Q$ par $(q,w,q') \in \delta^*$ +lorsqu'il existe $q_0,\ldots,q_n \in Q$ et $t_1,\ldots,t_n \in +(\Sigma\cup\{\varepsilon\})$ tels que $q_0 = q$ et $q_n = q'$ et +$(q_{i-1},t_i,q_i) \in\delta$ pour chaque $1\leq i\leq n$, et enfin $w += t_1\cdots t_n$. + +Si on préfère, on peut définir par récurrence sur $n \geq 0$ une +relation $\delta^{(n)} \subseteq Q \times \Sigma^* \times Q$ de la +manière suivante : +\begin{itemize} +\item $(q,w,q') \in \delta^{(0)}$ si et seulement si $q'=q$ et + $v=\varepsilon$, +\item $\delta^{(1)} = \delta \subseteq Q \times + (\Sigma\cup\{\varepsilon\})$ (faisant partie de la donnée de $A$), +\item $(q,v,q') \in \delta^{(n+1)}$ si et seulement si il existe + $q^\sharp \in Q$ et $t \in \Sigma\cup\{\varepsilon\}$ tels que + $(q,w,q^\sharp) \in \delta^{(n)}$ et $(q^\sharp,t,q') \in \delta$ et + $v = wt$ (ce qui signifie que : soit $t=\varepsilon$ et $v=w$, soit + $t\in\Sigma$ est la dernière lettre de $w$ et $v$ est le préfixe + correspondant) ; +\end{itemize} +et on définit $\delta^* = \bigcup_{n=1}^{+\infty} \delta^{(n)}$, +autrement dit $(q,w,q') \in \delta^*$ lorsqu'il existe $n$ tel que +$(q,w,q') \in \delta^{(n)}$. + +Concrètement, $(q,w,q') \in \delta^{(n)}$ signifie que le εNFA peut +passer de l'état $q$ à l'état $q'$ en effectuant (exactement) $n$ +transitions ($q_0\to q_1 \to \cdots \to q_n$ étiquetées par +$t_1,\ldots,t_n \in (\Sigma\cup\{\varepsilon\})$) et en consommant le +mot $w$ (soit $w = t_1\cdots t_n$) ; et $(q,w,q') \in \delta^*$ +signifie la même chose mais sans contrainte sur le nombre de +transitions. La différence avec les NFA est que le nombre $n$ de +transitions n'est plus forcément égal à la longueur de $w$. + +Enfin, l'automate $A$ accepte un mot $w$ lorsqu'il existe $q_0\in I$ +et $q_\infty\in F$ tels que $(q_0,w,q_\infty) \in \delta^*$. Le +langage accepté $L_A$ et l'équivalence de deux automates sont définis +de façon analogue aux DFA +(cf. \ref{definition-recognizable-language}). + +\thingy Voici un exemple de εNFA particulièrement simple sur $\Sigma = +\{a,b,c\}$: + +\begin{center} +%%% begin example5 %%% + +\begin{tikzpicture}[>=latex,line join=bevel,automaton] +%% +\node (q1) at (98bp,18bp) [draw,circle,state] {$1$}; + \node (q0) at (18bp,18bp) [draw,circle,state,initial] {$0$}; + \node (q2) at (178bp,18bp) [draw,circle,state,final] {$2$}; + \draw [->] (q0) ..controls (46.106bp,18bp) and (58.578bp,18bp) .. node[auto] {$\varepsilon$} (q1); + \draw [->] (q1) to[loop above] node[auto] {$b$} (q1); + \draw [->] (q1) ..controls (126.11bp,18bp) and (138.58bp,18bp) .. node[auto] {$\varepsilon$} (q2); + \draw [->] (q0) to[loop above] node[auto] {$a$} (q0); + \draw [->] (q2) to[loop above] node[auto] {$c$} (q2); +% +\end{tikzpicture} + +%%% end example5 %%% +\end{center} + +En considérant les différents chemins possibles entre $0$ et $2$ sur +ce graphe, on comprend que le langage qu'il reconnaît est celui des +mots sur $\{a,b,c\}$ formés d'un nombre quelconque de $a$ suivi d'un +nombre quelconque de $b$ suivi d'un nombre quelconque de $c$, ou, si +on préfère, le langage désigné par l'expression rationnelle +$a{*}b{*}c{*}$. + % % % |