Implementaciones para la simulación de autómatas finitos en su forma determinista y no determinista.
Determinismo
Un Autómata Finito determinista (AFD) es una quíntupla $(Q,\Sigma,\delta,s,F)$ donde:
- $Q$ es un conjunto finito de estados.
- $\Sigma$ es un alfabeto finito.
- $\delta : Q \times \Sigma \to Q$ es la función (total) de transición.
- $s \in Q$ es el estado inicial.
- $F \subseteq Q$ es el conjunto de estados finales (de aceptación).
Sea $M$ un AFD y $(q, w) \in Q\times\Sigma^\star$. Entonces se define la función $\hat{\delta}$ de transición generalizada que computa el estado resultante de ejecutar $M$ sobre la configuración $(q, w)$ tal que:
donde $q \in Q$, $v \in \Sigma^\star$ y $x \in \Sigma$.
Sea $M=(Q,\Sigma,\delta,s,F)$ un AFD. Entonces el lenguaje $\mathcal{L}(M)\subseteq\Sigma^\star$ aceptado por $M$ se define:
Implementación
La implementación deriva de $\hat{\delta}$ en la definición 1.2
\begin{algorithm}\caption{}\begin{algorithmic} \PROCEDURE{afd}{$w: $\uppercase{$\Sigma^\star$}} \STATE $q := q_0$ \STATE $w_i := w_0$ \WHILE{$w_i \neq \varepsilon$} \STATE $q := $ \CALL{move}{$q, w_i$} \STATE $w_i := w_{i+1}$ \ENDWHILE \IF{$q \in $ F} \PRINT \TRUE \ELSE \PRINT \FALSE \ENDIF \ENDPROCEDURE \end{algorithmic}\end{algorithm}
El costo de reconocer $w$ es $O(\len{w})$.
No determinismo
Un Autómata Finito no determinista (AFN) es una quíntupla $(Q,\Sigma,\delta,s,F)$ donde:
- $Q$ es un conjunto finito de estados.
- $\Sigma$ es un alfabeto finito.
- $\delta : Q \times \Sigma \to 2^Q$ es la función de transición.
- $s \in Q$ es el estado inicial.
- $F \subseteq Q$ es el conjunto de estados finales (de aceptación).
Sea $N$ un AFN y $(q,w)\in Q\times\Sigma^\star$. Entonces se define la función $\hat{\delta}$ de transición generalizada que computa el conjunto de los estados resultantes de ejecutar $N$ sobre la configuración $(q, w)$ tal que:
donde $q \in Q$, $v \in \Sigma^\star$ y $x \in \Sigma$.
Sea $N=(Q,\Sigma,\delta,s,F)$ un AFN. Entonces el lenguaje $\mathcal{L}(N)\subseteq\Sigma^\star$ aceptado por $N$ se define:
Implementación
Backtracking
\begin{algorithm}\caption{}\begin{algorithmic} \PROCEDURE{afn}{$w:$\uppercase{$\Sigma^\star$}} \STATE \uppercase{$R$} $:=$ \CALL{afn-rec}{$q_0$, $w_0$} \IF{\uppercase{$R \cap F \neq \emptyset$}} \PRINT \TRUE \ELSE \PRINT \FALSE \ENDIF \ENDPROCEDURE \STATE \FUNCTION{afn-rec}{$q:$\uppercase{$Q$}, $w_i:$\uppercase{$\Sigma$}} \IF{$w_i = \varepsilon$} \RETURN $\{ q \}$ \ELSE \STATE \uppercase{$R$} $:= \emptyset$ \FORALL{$r$ \textbf{in} \uppercase{$Q$}} \IF{$r \in $ \CALL{move}{$q$, $w_i$}} \STATE \uppercase{$R$} $:=$ \uppercase{$R$} $ \cup\;$\CALL{afn-rec}{$r$, $w_{i+1}$} \ENDIF \ENDFOR \RETURN \uppercase{$R$} \ENDIF \ENDFUNCTION \end{algorithmic}\end{algorithm}
Según $\hat{\delta}$
La implementación deriva de $\hat{\delta}$ en la definición 2.2.
\begin{algorithm}\caption{}\begin{algorithmic} \PROCEDURE{afn}{$w:$\uppercase{$\Sigma^\star$}} \STATE \uppercase{$R$} $:= \{ q_0 \}$ \STATE $w_i := w_0$ \WHILE{$w_i \neq \varepsilon$} \STATE \uppercase{$R$} $:=$ \CALL{move-union}{\uppercase{$R$}$, w_i$} \STATE $w_i := w_{i+1}$ \ENDWHILE \IF{\uppercase{$R \cap F \neq \emptyset$}} \PRINT \TRUE \ELSE \PRINT \FALSE \ENDIF \ENDPROCEDURE \STATE \FUNCTION{move-union}{\uppercase{$R:2^Q$}, $x:$\uppercase{$\Sigma$}} \STATE \uppercase{$R^\prime$} $:= \emptyset$ \FORALL{$r$ \textbf{in} \uppercase{$R$}} \STATE \uppercase{$R^\prime$} $:=$ \uppercase{$R^\prime$} $ \cup\;$\CALL{move}{$r, x$} \ENDFOR \RETURN \uppercase{$R^\prime$} \ENDFUNCTION \end{algorithmic}\end{algorithm}
La unión de un máximo de $\len{Q}$ conjuntos con a lo sumo $\len{Q}$ estados tiene un costo de $O(\len{Q}^2)$.
El costo de reconocer $w$ es $O(\len{w}\len{Q}^2)$.
No determinismo con $\veps$
Un Autómata Finito no determinista con transiciones $\veps$ (AFN-e) es una quíntupla $(Q,\Sigma,\delta,s,F)$ donde:
- $Q$ es un conjunto finito de estados.
- $\Sigma$ es un alfabeto finito.
- es la función de transición.
- $s \in Q$ es el estado inicial.
- $F \subseteq Q$ es el conjunto de estados finales (de aceptación).
Sea $N$ un AFN-e y $(q,w)\in Q\times\Sigma^\star$. Entonces se define la función $\hat{\delta}$ de transición generalizada que computa el conjunto de los estados resultantes de ejecutar $N$ sobre la configuración $(q, w)$ tal que:
donde:
- $q \in Q$, $v \in \Sigma^\star$ y $x \in \Sigma$.
- $C_\veps(q)$ es la clausura respecto de $\veps$ para el estado $q$, esto es el conjunto de todos los estados alcanzables desde $q$ usando únicamente transiciones $\veps$.
- Sea $Q$ un conjunto de estados, $C_\veps(Q) = \bigcup\limits_{q \; \in \; Q}^{} C_\veps(q)$
Sea $N=(Q,\Sigma,\delta,s,F)$ un AFN-e. Entonces el lenguaje $\mathcal{L}(N)\subseteq\Sigma^\star$ aceptado por $N$ se define:
Implementación
404
Bibliografía
- J. Hopcroft, R. M. & J. U. (2000). Introduction to Automata Theory, Languages, and Computation (2nd ed.). Addison Wesley.