Nuevo Myhill

This commit is contained in:
Vladimir Lemus 2022-09-24 13:04:05 -05:00
parent 677c3abf4c
commit 6d7caabb8f
6 changed files with 82 additions and 526 deletions

View File

@ -1,512 +0,0 @@
\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{hyperref}
\usepackage{graphicx}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{automata,positioning,arrows}
\renewcommand{\rmdefault}{ptm}
%\usepackage[all,cmtip]{xy}
%\usepackage{graphicx}
\author{Autómatas y Lenguajes Formales}
\title{Autómatas finitos deterministas y no deterministas}
\begin{document}
\maketitle
\section*{Autómata finito determinista}
Me iré un poco rápido en estas notas pues varios conceptos los hemos visto en clase (en caso de quien esto lea no haya asistido a la clase puede consultar la bibliografía al final del documento).
\newtheorem{defi}{Definición}
\begin{defi}
Un autómata finito determinista es la quinteta
\begin{equation*}
M = (Q,\Sigma,\delta,s,F)
\end{equation*}
\begin{itemize}
\item $Q$ el conjunto finito de estados;
\item $\Sigma$ conjunto finito, alfabeto de entrada;
\item $\delta : Q\times \Sigma \rightarrow Q$ la función de transición;
\item $s\in Q$ es el estado inicial;
\item $F\subseteq Q$, los estados de aceptación o estados finales.
\end{itemize}
\end{defi}
Veamos ejemplos para determinar que lenguaje acepta un autómata. Por ejemplo tenemos el siguiente autómata en diagrama:
\begin{figure}
\begin{center}
\begin{tikzpicture}
\node[state,initial,initial text= ] (S) {$S$};
\node[state,accepting,above right=of S] (1) {$1$};
\node[state,below right=of S] (2) {$2$};
\node[state,below right=of 1] (3) {$3$};
\path [-stealth,thick]
(S) edge [bend left] node [yshift=0.3cm]{$a$} (1)
edge node[yshift=-0.3cm]{$b$} (2)
(1) edge node [yshift=0.3cm]{$a$} (3)
edge [bend left] node[yshift=-0.3cm]{$b$} (S)
(2) edge [loop below] node{$a,b$} ()
(3) edge node[yshift=-0.3cm]{$a,b$} (2);
\end{tikzpicture}
\end{center}
\end{figure}
¿Cómo analizamos para saber qué cadenas acepta, y por lo tanto que lenguaje? Por lo regular es por pura observación, pero esa observación se reduce a probar varias cadenas y a ver cuales pegan.
Lo primero que notamos es que el alfabeto es $\{a,b\}$, el conjunto de los estados es $\{S,1,2,3\}$, el estado inicial es $S$ y sólo hay un final que es $1$. Propongo probar las cadenas: $\{a,b,ab,ba, aaa, bbb, aba, ababa\}$, a ver si podemos identificar algo. Para probar estas cadenas lo mejor es que ustedes en su pantalla o papel sigan con el dedo los estados a que lleva la lectura de cada carácter. Recuerden que lo único cercano a una memoria que tiene el autómata finito determinista son los distintos estados, así que la posición de su dedo guardará memoria de lo que ya se ha leído.
Para ejemplificar en papel ese seguimiento usaré la notación prestada de Lewis y Papadimitriou\cite{Lewis}, la entrada es leída como $(q,w)$ donde $q$ es el estado donde se encuentra y $w$ la subcadena que no se ha leído. Recuerden que la lectura se hace de izquierda a derecha, por convención. Las transiciones son marcadas por le símbolo $\vdash_A$ donde el subíndice $A$ hace referencia al autómata especificado.
De esta forma leemos la primera cadena propuesta:
\begin{align*}
(S, a) &\vdash_A (1,\epsilon)
\end{align*}
Es decir, empezamos en el estado inicial $S$ con la cadena $a$, empieza la actividad del autómata al marcar $\vdash_A$: leemos $a$ y pasamos al estado $1$. Como ya no hay más cadena la salida es marcada como $(1, \epsilon)$, ya estamos en el estado $1$, que es final, y ya no hay nada más que leer, $\epsilon$ es la cadena vacía, es decir, nada.
Para el resto de cadenas:
La cadena $b$
\begin{align*}
(S, b) &\vdash_A (2,\epsilon).
\end{align*}
Termina en el estado $2$ que no es final, es decir que la cadena no es aceptada.
La cadena $ab$
\begin{align*}
(S, ab) &\vdash_A (1,b)\\
(1, b) &\vdash_A (S,\epsilon)
\end{align*}
Termina en $S$ que no es de aceptación, la cadena no es aceptada.
Para $ba$
\begin{align*}
(S, ba) &\vdash_A (2,a)\\
(2, a) &\vdash_A (2,\epsilon)
\end{align*}
No es aceptada.
Para $aaa$
\begin{align*}
(S, aaa) &\vdash_A (1,aa)\\
(1, aa) &\vdash_A (3,a)\\
(3,a) &\vdash_A (2,\epsilon)
\end{align*}
No es aceptada, lo mismo para $bbb$
\begin{align*}
(S, bbb) &\vdash_A (2,bb)\\
(2, bb) &\vdash_A (2,b)\\
(2,b) &\vdash_A (2,\epsilon)
\end{align*}
Caso muy diferente con las últimas dos cadena, que sí son aceptadas: $aba$ y $ababa$:
\begin{align*}
(S, aba) &\vdash_A (1,ba)\\
(1, ba) &\vdash_A (S,a)\\
(S,a) &\vdash_A (1,\epsilon)
\end{align*}
\begin{align*}
(S, ababa) &\vdash_A (1,baba)\\
(1, baba) &\vdash_A (S,aba)\\
(S,aba) &\vdash_A (1,ba)\\
(1, ba) &\vdash_A (S,a)\\
(S,a) &\vdash_A (1,\epsilon)
\end{align*}
Los dos terminan en el estado $1$ que es de aceptación, ambas cadenas son aceptadas. Espero puedan ver de aquí una regularidad: se aceptan las cadenas que empiezan y terminan con $a$ pero no puede haber más de una $a$ ni una $b$ consecutiva. No es el autómata más pequeño que hace esa labor, pero así no lo dieron.
Como les había mencionado un sitio útil para probar los autómatas de manera computacional es \url{https://automaton-web.herokuapp.com/}, ya su experiencia en la programación les dirá que lo más sano es dudar de que haga todo correctamente, revisen por su cuenta y validen si lo que hace el programa es correcto.
Otra parte importante a ejercitar es diseñar el autómata a partir de la descripción del lenguaje, por ejemplo:
\begin{itemize}
\item Partiendo del alfabeto $\{a,b\}$, construye el autómata que acepte las cadenas $w$ tales que $w$ tenga un número impar de $a$'s y termine en $b$.
\end{itemize}
Los estados y las transiciones nos serán úriles para llevar cuenta de las $a$'s y de la última $b$. Como las $b$'s intermedias no nos interesan tanto ya supondrán que eso lo podemos poner como un lazo (\emph{loop} como se le llama en inglés) sobre el estado. Esto se puede ver en la figura \ref{fig:1}.
\begin{figure}
\begin{center}
\begin{tikzpicture}
\node[state] (q_n) {$q_n$};
\path [-stealth,thick]
(q_n) edge [loop above] node {$b$} ();
\end{tikzpicture}
\end{center}
\caption{Ejemplo de como aceptar en un estado cualquier cantidad de $b$'s o $b^*$. Sólo es un ejemplo, aún no está terminado el autómata.}
\label{fig:1}
\end{figure}
¿Cómo hacemos que lleve cuenta de que la cantidad de $a$'s es impar? Puede parecer complicado pues números impares hay infinitos, pero hay un método más sencillo: al leer una $a$ pasamos a un estado, el que lleva la cuenta de la imparidad, si se lee otra $a$ se regresa al estado anterior, se lee la tercera a y se regresa al estado que lleva la cuenta, como se observa en la figura \ref{fig:2}
\begin{figure}
\begin{center}
\begin{tikzpicture}
\node[state] (q_par) {$q_{par}$};
\node[state, right=of q_par] (q_impar) {$q_{impar}$};
\path [-stealth,thick]
(q_par) edge [bend left] node[yshift=0.3cm]{$a$} (q_impar)
edge [loop above] node{$b$} ()
(q_impar) edge [bend left] node[yshift=-0.3cm]{$a$} (q_par);
\end{tikzpicture}
\end{center}
\caption{Ejemplo para identificar cantidades pares o impares de caracteres, sólo es un ejemplo no es un autómata terminado.}
\label{fig:2}
\end{figure}
Con estos ejemplos podemos darnos una idea de como construir el autómata completo, sólo n0os haría falta comprobar la última $b$, me parece eso no requerirá mayor explicación, espero así sea. En la figura \ref{fig:3} se puede ver el autómata completo.
Quizá requiera una explicación extra sobre lo que pasa si ya estando en $q_2$ y se lee una $a$, como ya llevábamos la cuenta de $a$ impares, al leer una mas se tiene una cantidad par, regresamos a $q_0$ donde van las cantidades pares. Si la cadena termina ahí no es aceptada, de continuar se debe checar de nuevo que sea $a$ impar y termine con $b$.
\begin{figure}
\begin{center}
\begin{tikzpicture}
\node[state,initial,initial text= ] (q_0) {$q_0$};
\node[state, right=of q_0] (q_1) {$q_1$};
\node[state,accepting, right=of q_1] (q_2) {$q_2$};
\path [-stealth,thick]
(q_0) edge [bend left] node[yshift=0.3cm]{$a$} (q_1)
edge [loop above] node{$b$} ()
(q_1) edge [bend left] node[yshift=-0.3cm]{$a$} (q_0)
edge [bend left] node[yshift=0.3cm]{$b$} (q_2)
(q_2) edge[bend left] node[yshift=-0.3cm]{$a$} (q_0)
edge [loop above] node{$b$} ();
\end{tikzpicture}
\end{center}
\caption{Autómata completo que acepta las cadenas $w$ que contiene un número impar de $a$'s y terminan en $b$.}
\label{fig:3}
\end{figure}
\section*{Autómatas finitos no deterministas}
\begin{defi}
Un autómata finito no determinista es la quinteta
\begin{equation*}
M = (Q,\Sigma,\Delta,S,F)
\end{equation*}
\begin{itemize}
\item $Q$ el conjunto finito de estados;
\item $\Sigma$ conjunto finito, alfabeto de entrada;
\item $\Delta : Q\times \Sigma \rightarrow \mathcal{P}(Q)$ la función de transición;
\item $S\subseteq Q$ conjunto se estados iniciales;
\item $F\subseteq Q$, los estados de aceptación o estados finales.
\end{itemize}
\end{defi}
Podemos ver un ejemplo sencillo. En la figura \ref{fig:4} tenemos un autómata no determinista de dos estados, con el alfabeto $\{a,b\}$.
\begin{figure}
\begin{center}
\begin{tikzpicture}
\node[state,accepting,initial,initial text= ] (S) {$S$};
\node[state, right=of S] (q_1) {$q_1$};
\path [-stealth,thick]
(S) edge [bend left] node[yshift=0.3cm]{$a,b$} (q_1)
edge [loop above] node{$a$} ()
(q_1) edge [bend left] node[yshift=-0.3cm]{$b$} (q_0);
\end{tikzpicture}
\end{center}
\caption{Ejemplo de autómata finito no determinista con alfabeto $\{a,b\}$ y dos estados.}
\label{fig:4}
\end{figure}
De inspeccionar podemos ver que acepta las cadenas del tipo:
\begin{itemize}
\item La cadena vacía $\epsilon$ (el estado inicial es de aceptación).
\item Las cadenas que son repeticiones de a $a,aa,aaa,aaaa,...$ es decir $a^*$ si incluimos aquí a la cadena vacía.
\item Las subcadenas con un número par de caracteres siempre y cuando el seundo carácter se $b$, $ab,bb,abbb,bbbb,...$. Quizá ea más difícil de generalizar, yo lo pondría como $(ab)^+$ y $(bb)*$, líneas abajo veremos una forma más reducida de expresarlo.
\end{itemize}
¿Porqué es no determinista? Porque en es estado $S$ hay dos posibles salidas para $a$, o se queda en $S$ o pasa al estado $q_1$. Y en $q_1$ no hay transición para el carácter $a$. En este ejemplo hacen falta transiciones $\epsilon$.
Un ejemplo con transiciones $\epsilon$ se puede ver en la figura \ref{fig:5}. En este caso el autómata es no determinista porque hay estados que no tienen transición para ciertos caracteres (por ejemplo el $q_2$ que no tiene transición alguna de salida) y además hay una transición $\epsilon$ de $q_0$ a $q_1$.
\begin{figure}
\begin{center}
\begin{tikzpicture}
\node[state,accepting,initial,initial text= ] (q_0) {$q_0$};
\node[state, right=of q_0] (q_1) {$q_1$};
\node[state, right=of q_1] (q_2) {$q_2$};
\path [-stealth,thick]
(q_0) edge [bend right] node[yshift=-0.3cm]{$1$} (q_1)
edge [bend right] node[yshift=-0.3cm]{$\epsilon$} (q_2)
(q_1) edge [bend right] node[yshift=0.3cm]{$0$} (q_0)
edge [bend left] node[yshift=0.3cm]{$0,1$}(q_2);
\end{tikzpicture}
\end{center}
\caption{Ejemplo de autómata finito no determinista con alfabeto $\{0,1\}$, tres estados y una transición $\epsilon$.}
\label{fig:5}
\end{figure}
Inspeccionando el autómata podemos ver que las cadenas que acepta son:
\begin{itemize}
\item La cadena vacía $\epsilon$ ya que el estado inicial es de aceptación, pero hay un camino (la transición $\epsilon$ al estado $q_2$) en el que no se acepta.
\item todas las repeticiones ordenadas de $10$, es decir $(10)^*$ incluyendo ya la cadena vacía, pero de igual forma esto sólo sucede en un camino posible, hay otro en el que no es aceptada
\end{itemize}
El resto de cadenas no son aceptadas. Las que consideramos que son aceptadas son aquellas en las que al menos en una posibilidad llegan a un estado de aceptación, pero hay posibilidades en las que no son aceptadas. Digamos que con que sea aceptada en uno basta para decir que son cadenas del lenguaje.
No muestro ejemplos de construcción pues son muy similares a las versiones deterministas salvo con algunas facilidades extras. En la mayoría de los casos es más fácil diseñar los autómatas como no deterministas.
\section*{Equivalencia entre autómatas finitos deterministas y no deterministas}
Hemos dicho que ambos tipos de autómatas finitos son equivalentes, al menos en el lenguaje que aceptan. La manera como lo aceptan, los estados extras y donde quedan las cadenas rechazadas puede variar mucho, pero a final de cuentas lo que nos interesa es el lenguaje que aceptan. Para pasar de un autómata finito no determinista ($N(Q,\Sigma,\Delta,q_0,F)$)\footnote{Hay autómatas finitos deterministas con más de un estado inicial, en ese caso con el apoyo de un estado nuevo y transiciones $\epsilon$ se puede con relativa facilidad convertir a un autómata finito no determinista con un sólo estado inicial.} a uno determinista ($A(Q',\Sigma,\delta,F')$) podemos seguir las siguientes instrucciones:
\begin{enumerate}
\item $Q'=\mathcal{P}(Q)=2^Q$, los estados del autómata finito determinista serán los elementos del conjunto potencia del conjunto de estados del autómata no determinista original, o el conjunto de todos los subconjuntos de $Q$.
\item Para los estados del autómata determinista, $R\in Q'$ y un carácter del alfabeto $a\in\Sigma$, la transición para el determinista estará dada por
\begin{equation*}
\delta(R,a)=\{q\in Q | q\in \Delta(r,a)\text{ para alguna } r\in R\}.
\end{equation*}
Como tenemos que los nuevos estados son elementos del conjunto potencia de los estados originales, existen estados $r\in Q$ tales que son elementos de un elemento $R\in Q'$. Una transición en el autómata no determinista $N$ puede llevar a más de un estado, por ello en el autómata determinista $A$ los llevamos a la unión de todos ellos:
\begin{equation*}
\delta(R,a)=\bigcup_{r\in R} \Delta(r,a)
\end{equation*}
\item $q_0'=\{q_0\}$ por el momento dejamos el mismo estado inicial, pero no se acostumbren mucho a ello, va a cambiar un poco.
\item $F'=\{R\in Q' | R\text{ contiene un estado de aceptación de } N\}$, es decir, todos los estados del autómata determinista $A$ que incluyen al menos uno de los estados finales del no determinista $N$ son estados finales.
\end{enumerate}
Y antes de aplicarlo hay que ver que se hace con las transiciones $\epsilon$:
\begin{itemize}
\item Definimos el conjunto $E(R)$ que contiene a todos los estados a los que se puede llegar desde $R$ a través de transiciones $\epsilon$, incluido $R$
\begin{equation*}
E(R)=\{ q| q \text{ se puede llegar desde }R\text{ viajando por } 0 \text{ o más transiciones }\epsilon \}.
\end{equation*}
\item Modificamos las transiciones del autómata determinista $A$ para marcar las transiciones posibles por $\epsilon$, cambiando $\Delta(r,a)$ por $E(\Delta(r,a))$, es decir
\begin{equation*}
\delta(R,a)= \{ q\in Q| q\in E(\Delta(r,a))\text{ para algunas }r\in R \}
\end{equation*}
\item Nuestro nuevo estado inicial cambiara de $q_0'=\{q_0\}$ a $q_0'=E(q_0)$, todos los estados que pueden alcanzarse por transición $\epsilon$ dese el estado inicial original $q_0$.
\end{itemize}
Para ver esto en acción hagamos un ejemplo. Convertiremos el autómata de la figura \ref{fig:5} a su versión determinista. Vamos por partes:
\begin{enumerate}
\item Los estado originales son $Q=\{q_0,q_1,q_2\}$, por lo tanto los estados del nuevo autómata determinista serán
\begin{equation*}
Q'=\{\phi,\{q_0\},\{q_1\},\{q_2\},\{q_0,q_1\},\{q_0,q_2\},\{q_1,q_2\},\{q_0,q_1,q_2\}\}.
\end{equation*}
\item Para ir viendo las transiciones hagamos una tabla:
\begin{center}
\begin{tabular}{| c || c | c |}
\hline
Estado & $0$ & $1$ \\ \hline
$\phi$ & $\phi$ & $\phi$ \\
$q_0^*$ (F) & $\phi$ & $q_1$ \\
$q_1$ & $q_0\cup q_2$ & $q_2$ \\
$q_2$ & $\phi$ & $\phi$\\
$\{q_0,q_1\}$ (F) & $\phi \cup q_0\cup q_2=q_0\cup q_2$ & $q_1\cup q_2$ \\
$\{q_0,q_2\}$ (F) & $\phi$ & $q_1\cup \phi=q_1$ \\
$\{q_1,q_2\}$ & $q_0\cup q_2\cup \phi = q_0\cup q_2$ & $q_2\cup \phi = q_2$ \\
$\{q_0,q_1,q_2\}$ (F) & $\phi\cup q_0\cup q_2\cup \phi = q_0\cup q_2$ & $q_1\cup q_2\cup \phi = q_1\cup q_2$ \\
\hline
\end{tabular}
\end{center}
\item $q_0$ es el estado inicial marcado en la tabla como $q_0^*$. Esto puede cambiar.
\item Los estados finales son $F=\{\{q_0\},\{q_0,q_1\},\{q_0,q_2\},\{q_0,q_1,q_2\}\}$, todos los que incluyen a $q_0$. Están marcados como (F) en la tabla.
\end{enumerate}
Hasta ahí vamos bien, pero nos faltan las transiciones $\epsilon$, también las veremos por pasos como se indicó líneas arriba:
\begin{itemize}
\item Por suerte el único estado con transición $\epsilon$ es $q_0$ y sólo llega a $q_2$ (y al estado mismo), entonces
\begin{equation}
E(q_0) = \{q_0,q_2\}
\end{equation}
\item Ahora cambiamos las transiciones, todas las que llegaba al estado $q_0$ ahora llegan al estado $E(q_0)$
\begin{center}
\begin{tabular}{| c || c | c |}
\hline
Estado & $0$ & $1$ \\ \hline
$\phi$ & $\phi$ & $\phi$ \\
$q_0$ (F) & $\phi$ & $q_1$ \\
$q_1$ & $E(q_0)\cup q_2=\{q_0,q_2\}\cup q_2$ & $q_2$ \\
$q_2$ & $\phi$ & $\phi$\\
$\{q_0,q_1\}$ (F) & $E(q_0)\cup q_2= \{q_0,q_2\}\cup q_2$ & $q_1\cup q_2$ \\
$\{q_0,q_2\}^*$ (F) & $\phi$ & $q_1$ \\
$\{q_1,q_2\}$ & $E(q_0)\cup q_2= \{q_0,q_2\}\cup q_2$ & $q_2$ \\
$\{q_0,q_1,q_2\}$ (F) & $E(q_0)\cup q_2= \{q_0,q_2\}\cup q_2$ & $q_1\cup q_2$ \\
\hline
\end{tabular}
\end{center}
\item Ahora debemos ver si cambia el estado inicial, y coincide en que justo el estado inicial tiene una transición $\epsilon$. Entonces el estado inicial cambia de $q_0$ a $E(q_0)=\{q_0,q_2\}$, información ya incluida en la tabla de líneas arriba.
\end{itemize}
Y listo, tenemos nuestro autómata finito determinista $A$ equivalente al finito no determinista $N$. Con eso bastaría, pero en caso de que sean más visuales de esa tabla de transiciones podemos armar el diagrama, pero eso lo agrego después, pueden hacerlo ustedes y me pasan como queda y lo agrego.
\section*{Expresiones regulares}
\begin{defi}
Decimos que $R$ es una expresión regular si $R$ es
\begin{enumerate}
\item $a$ para alguna $a$ en el alfabeto $\Sigma$ ($\{a\}$),
\item $\epsilon$ la cadena vacía ($\{\epsilon \}$),
\item $\phi$ (el lenguaje vacío),
\item $(R_1\cup R_2)$ o $(R_1 + R_2)$, donde $R_1$ y $R_2$ son expresiones regulares (unión de lenguajes),
\item $(R_1\cdot R_2)=(R_1R_2)$ donde $R_1$ y $R_2$ son expresiones regulares (concatenación de lenguajes), o
\item $(R_1^*)$ con $R_1$ una expresión regular (estrella de Kleene del lenguaje).
\end{enumerate}
\end{defi}
De estas expresiones regulares podemos construir autómatas finitos no deterministas (por facilidad y hacerlo más directo, con un poco de análisis se puede hacer determinista), que pueden ser usados como células para armar expresiones más complicadas.
Por ejemplo para la expresión regular $a$ tenemos el autómata que se muestra en la figura \ref{fig:6}
\begin{figure}[h!]
\begin{center}
\begin{tikzpicture}
\node[state,initial,initial text= ] (q_0) {$q_0$};
\node[state,accepting,right=of q_0] (q_1) {$q_1$};
\path [-stealth,thick]
(q_0) edge node[yshift=0.3cm]{$a$} (q_1);
\end{tikzpicture}
\end{center}
\caption{Autómata que acepta el lenguaje determinado por la expresión regular $a$.}
\label{fig:6}
\end{figure}
De aquí se figurarán que para la expresión regular $\epsilon$ basta con hacer el estado inicial final y no incluir transición alguna. Para el lenguaje regular definido por $\phi$ (el lenguaje vacío) se tiene un estado inicial sin transiciones y sin ningún estado final, el lenguaje aceptado es vacío, ni la cadena vacía acepta.
Quizá más interesante sea ver como construir el autómata para la unión, concatenación y estrella de Kleene de expresiones regulares. Para la unión de expresiones realizamos la unión de los autómatas que aceptan cada expresión, por ejemplo el término $(a+b)$ o $(a\cup b)$ se puede ver en la figura \ref{fig:7}
\begin{figure}[h!]
\begin{center}
\begin{tikzpicture}
\node[state,initial,initial text= ] (q_ep) {$q_{\epsilon}$};
\node[state,above right=of q_ep] (q_0a) {$q_{0_a}$};
\node[state,accepting,right=of q_0a] (q_1a) {$q_{1_a}$};
\node[state,below right=of q_ep] (q_0b) {$q_{0_b}$};
\node[state,accepting,right=of q_0b] (q_1b) {$q_{1_b}$};
\path [-stealth,thick]
(q_ep) edge node[yshift=0.3cm]{$\epsilon$} (q_0a)
edge node[yshift=-0.3cm]{$\epsilon$} (q_0b)
(q_0a) edge node[yshift=0.3cm]{$a$} (q_1a)
(q_0b) edge node[yshift=-0.3cm]{$b$} (q_1b);
\end{tikzpicture}
\end{center}
\caption{Autómata que acepta el lenguaje determinado por la expresión regular $a+b$.}
\label{fig:7}
\end{figure}
Se crea un nuevo estado inicial que sea para ambos autómatas y se pegan a través de transiciones $\epsilon$ a los antiguos estados iniciales de ambos autómatas. Los estados finales son los mismos.
Para el caso de la concatenación se usa igual transiciones $\epsilon$ como pegamento, solo que en este caso es de izquierda a derecha. Por ejemplo para la expresión $ab$ podemos ver en la figura \ref{fig:8} como se hace el ``pegado'' de los autómatas que aceptan los lenguajes de las expresiones $a$ y $b$.
\begin{figure}[h!]
\begin{center}
\begin{tikzpicture}
\node[state,initial,initial text= ] (q_0a) {$q_{0_a}$};
\node[state,right=of q_0a] (q_1a) {$q_{1_a}$};
\node[state,right=of q_1a] (q_0b) {$q_{0_b}$};
\node[state,accepting,right=of q_0b] (q_1b) {$q_{1_b}$};
\path [-stealth,thick]
(q_0a) edge node[yshift=0.3cm]{$a$} (q_1a)
(q_1a) edge node[yshift=0.3cm]{$\epsilon$} (q_0b)
(q_0b) edge node[yshift=0.3cm]{$b$} (q_1b);
\end{tikzpicture}
\end{center}
\caption{Autómata que acepta el lenguaje determinado por la expresión regular $ab$.}
\label{fig:8}
\end{figure}
El siguiente caso por ver sería la estrella de Kleene de una expresión regular, si partimos del caso de la concatenación, por ejemplo $(ab)^*$, el autómata resultante sería el que se muestra en la figura \ref{fig:9}. Para hacer la estrella de Kleene basta con hacer una transición $\epsilon$. Para dejarlo de la forma más general, para no regresar al estado inicial se puede agregar un estado. Puede estar de más, o puede ser útil después, por si las moscas lo agregamos.
\begin{figure}[h!]
\begin{center}
\begin{tikzpicture}
\node[state,initial,initial text= ] (q_ep) {$q_{\epsilon}$};
\node[state,accepting,right=of q_ep] (q_0a) {$q_{0_a}$};
\node[state,right=of q_0a] (q_1a) {$q_{1_a}$};
\node[state,right=of q_1a] (q_0b) {$q_{0_b}$};
\node[state,accepting,right=of q_0b] (q_1b) {$q_{1_b}$};
\path [-stealth,thick]
(q_ep) edge node[yshift=0.3cm]{$\epsilon$} (q_0a)
(q_0a) edge node[yshift=0.3cm]{$a$} (q_1a)
(q_1a) edge node[yshift=0.3cm]{$\epsilon$} (q_0b)
(q_0b) edge node[yshift=0.3cm]{$b$} (q_1b)
(q_1b) edge[bend right] node[yshift=0.3cm]{$\epsilon$} (q_0a);
\end{tikzpicture}
\end{center}
\caption{Autómata que acepta el lenguaje determinado por la expresión regular $(ab)^*$.}
\label{fig:9}
\end{figure}
Para el caso $(a\cup b)^*$ cambia un poco, pero se sigue la misma idea de las transiciones $\epsilon$ para adherir y hacer la estrella de Kleene, como se muestra en la figura \ref{fig:10}.
\begin{figure}[h!]
\begin{center}
\begin{tikzpicture}
\node[state,initial,initial text= ] (q_eep) {$q_{\epsilon \epsilon}$};
\node[state,accepting,right=of q_eep] (q_ep) {$q_{\epsilon}$};
\node[state,above right=of q_ep] (q_0a) {$q_{0_a}$};
\node[state,accepting,right=of q_0a] (q_1a) {$q_{1_a}$};
\node[state,below right=of q_ep] (q_0b) {$q_{0_b}$};
\node[state,accepting,right=of q_0b] (q_1b) {$q_{1_b}$};
\path [-stealth,thick]
(q_eep) edge node[yshift=0.3cm]{$\epsilon$} (q_ep)
(q_ep) edge node[yshift=0.3cm]{$\epsilon$} (q_0a)
edge node[yshift=-0.3cm]{$\epsilon$} (q_0b)
(q_0a) edge node[yshift=0.3cm]{$a$} (q_1a)
(q_1a) edge node[yshift=-0.3cm]{$\epsilon$} (q_ep)
(q_0b) edge node[yshift=-0.3cm]{$b$} (q_1b)
(q_1b) edge node[yshift=0.3cm]{$\epsilon$} (q_ep);
\end{tikzpicture}
\end{center}
\caption{Autómata que acepta el lenguaje determinado por la expresión regular $(a\cup b)^*$.}
\label{fig:10}
\end{figure}
A partir de estas formas básicas se pueden construir los autómatas equivalentes a las expresiones regulares (equivalentes ya que aceptan el mismo lenguaje).
\begin{thebibliography}{10}
\bibitem{Kozen} Kozen, Dexter C. ``Automata and Computability'' Springer (1997)
\bibitem{Sipser} Sipser, Michael ``Introduction to the Theory of Computation'' 2a ed., Thomson Course Tecnology (2006)
\bibitem{Lewis} Lewis, Harry R. y Papadimitriou, Christos H. ``Elements of the Theory of Computation''2a ed., Prentice-Hall Inc. (1998).
\end{thebibliography}
\end{document}

1
.#bombeo.tex Symbolic link
View File

@ -0,0 +1 @@
vladimir@posh.2759:1664033250

Binary file not shown.

View File

@ -122,10 +122,10 @@ Otro ejemplo, que dejare más corto, espero ya quedara claro el anterior:
\begin{enumerate}
\item $k\geq 0$
\item $x=z=\epsilon$, $y=a^{2^k}$, ya que $xyz = a^{2^k}\in \mathbf{A}$ y $|y|=2^k\geq k$.
\item $u,v,w$ tales que $|u|=j$, $|v|=m$ y $|w|=n$, que cumplen $|m|>0$ y $j+m+n=2^k$.
\item $u,v,w$ tales que $|u|=j$, $|v|=m$ y $|w|=n$, que cumplen $|m|>0$ y $j+m+n=2^k$ y al menos $|u|\neq \epsilon$ o $|u|\neq \epsilon$.
\item Escoges cualquier $i>1$ y le ganas, ya que queda la cadena total $|xuv^iwz| = j+im+n = j+m+n+(i-1)m = 2^k + (i-1)m $ y las cadenas de esa longitud no están en el lenguaje ¿porqué?
Sabemos que $m\leq 2^k$ ya que $j+m+n=2^k$, a su vez $(i-1)m< i2^k$, por lo tanto $2^k<2^k+(i-1)m< 2^k+i2^k=(1+i)2^k$.
Sabemos que $m< 2^k$ ya que $j+m+n=2^k$, a su vez $(i-1)m< (i-1)2^k$, por lo tanto $2^k<2^k+(i-1)m< 2^k+(i-1)2^k=i2^k$. Podemos tomar el primer caso, $i=2$, entonces $2^k<2^k+(i-1)m< 2\times2^k=2^{k+1}$. Entonces la longitud de la cadena ya bombeada está entre $2^k$ y $2^{k+1}$, pero no puede ser que esa magnitud ser de la forma $2^s$ ya que no hay un natural $s$ entre $k$ y $k+1$ $\blacksquare$
\end{enumerate}
Hace falta que vean el teorema de Myhill-Nerode, pero ese lo dejo para que ustedes lo chequen, se puede también probar que un lenguaje no es regular a partir de él. Revísenlo y será bueno chequen estos ejemplos en el marco de este teorema.

Binary file not shown.

View File

@ -24,7 +24,7 @@ Supongamos que vamos a poner una tortería en una esquina de nuestra ciudad o po
Si pensamos nuestra tortería como un autómata finito determinista cada una de estas listas de combinaciones sería un estado del autómata en el que puede caerse al concatenar la cadena/ingrediente $z$ a la cadena/ingrediente $x$.
Imaginemos un conjunto de ingredientes $S$ con $k$ ingredientes que cumplen que cada par de ingredientes distintos $x,y\in S$ siempre están en listas distintas, $x\not \equiv_L y$\footnote{El subíndice $L$ hace referencia a que la comparación es hecha respecto a la función $L(x)=1$ si $x\in L(M)$ y $L(x)=0$ si $x\not\in L(M)$ para $M$ algún autómata finito determinista.}. Para tener esta tortería necesitarías como vitrina todos los ventanales de la torre mayor, por la cantidad de listas distintas que solo contienen un tipo de torta.
Imaginemos un conjunto de ingredientes $S$ con $k$ ingredientes que cumplen que cada par de ingredientes distintos $x,y\in S$ siempre están en listas distintas\footnote{El subíndice $L$ hace referencia a que la comparación es hecha respecto a la función $L(x)=1$ si $x\in L(M)$ y $L(x)=0$ si $x\not\in L(M)$ para $M$ algún autómata finito determinista.}, $x\not \equiv_L y$. Para tener esta tortería necesitarías como vitrina todos los ventanales de la torre mayor, por la cantidad de listas distintas que solo contienen un tipo de torta.
Ya se van dando cuenta que no les conviene poner esa tortería, veamos como se escribiría esto como el teorema de Myhill-Nerode.
@ -66,10 +66,11 @@ Esta relación de equivalencia además de ser reflexiva, simétrica y transitiva
&=\hat{\delta}(s,ya)
\end{align*}
\item Es un \emph{refinamiento} de $R$\footnote{El grado de refinación de la harina se da, no sé si en todos los países, por un número. El $000$ refiere al más alto grado de refinación, también se usa en clave para la cocaína. Hay un gran libro de Roberto Saviano al respecto \emph{Cero cero cero} en el que muy poco se basó la serie del mismo nombre de Amazon. El libro es un trabajo periodístico, la serie no es mala, pero muy cruda. Sólo como paréntesis informativo.}: para cualquier $x,y\in \Sigma*$,
\begin{equation*}
\item Es un \emph{refinamiento}\footnote{El grado de refinación de la harina se da, no sé si en todos los países, por un número. El $000$ refiere al más alto grado de refinación, también se usa en clave para la cocaína. Hay un gran libro de Roberto Saviano al respecto \emph{Cero cero cero} en el que muy poco se basó la serie del mismo nombre de Amazon. El libro es un trabajo periodístico, la serie no es mala, pero muy cruda. Sólo como paréntesis informativo.} de $R$: para cualquier $x,y\in \Sigma*$,
\begin{equation}
x\equiv_M y \Rightarrow (x\in R \iff y\in R).
\end{equation*}
\label{eq:ref}
\end{equation}
Ya que la relación de equivalencia nos dice que sí $x\equiv_M y$ entonces $\hat{\delta}(s,x)=\hat{\delta}(s,y)$. Sí hay equivalencia entre $x$ y $y$ deben llegar al mismo estado, sea de aceptación o rechazo, o todos los elementos están en $R$ o no están. Entonces refina a $R$ no porque lo haga más puro, si no porque nos da más detalles del conjunto, nos da el detalle \emph{fino}.
\item Es de \emph{índice finito}; es decir, tiene sólo finitamente muchas clases de equivalencia, pues hay exactamente una clase de equivalencia por estado del autómata finito determinista:
@ -135,16 +136,16 @@ Si el conjunto no cumple alguno de los tres enunciados entonces no cumple ningun
\section*{Ejemplos}
El ejemplo clásico es demostrar que el lenguaje (conjunto) $A$ dado por:
\textit{El ejemplo clásico es demostrar que el lenguaje (conjunto) $L$ dado por:}
\begin{equation}
A=\{ a^nb^n| n\geq 0 \},
L=\{ a^nb^n| n\geq 0 \},
\end{equation}
\noindent no es regular.
\noindent \textit{no es regular.}
Ver si hay clases de equivalencia que no son de Myhill-Nerode se puede hacer complicado, pues no hemos visto muchos ejemplos de esas clases, pero contar clases lo podemos hacer más o menos, a ver si alcanzan las manos. Entonces contaremos clases de equivalencia que refinan y son congruentes por la derecha ($\equiv_R$).
Partamos de dos valores $k\neq m$, los elementos de la clase de equivalencia estarán dados por la cantidad de $a$'s y $b$'s, la potencia a la que se elevan en la notación. Siendo dos longitudes distintas $k$ y $m$ podemos ver que $a^k \neg \equiv_R a^m$, no están en la misma clase de equivalencia, ya que $a^kb^k\in A$ pero no así $a^mb^k\notin A$. Esto implica que hay una clase de equivalencia para infinitos valores de la potencia $k$ distintos. En el símil de la tortería, por cada ingrediente de la torta hay un cartel de tipo de combinación. Esto ya no es de índice finito pues hay infinitas clases y por el teorema de Myhill-Nerode $A$ no es regular.
Partamos de dos valores $k\neq m$, los elementos de la clase de equivalencia estarán dados por la cantidad de $a$'s y $b$'s, la potencia a la que se elevan en la notación. Siendo dos longitudes distintas $k$ y $m$ podemos ver que $a^k \not \equiv_R a^m$, no están en la misma clase de equivalencia, ya que $a^kb^k\in L$ pero no así $a^mb^k\notin L$. Esto implica que hay una clase de equivalencia para infinitos valores de la potencia $k$ distintos. En el símil de la tortería, por cada ingrediente de la torta hay un cartel de tipo de combinación. Esto ya no es de índice finito pues hay infinitas clases y por el teorema de Myhill-Nerode $L$ no es regular.
Para darle más peso podemos dar una expresión para la cantidad de clases de equivalencia. Podemos ver que el conjunto de expresiones a las que sí se les puede agregar $b^k$ y están dentro del conjunto son:
@ -152,19 +153,19 @@ Para darle más peso podemos dar una expresión para la cantidad de clases de eq
H_k = \{ a^{n+k}b^n | 1\leq n \},\ k>0,
\end{equation*}
\noindent si se le agrega por la derecha (concatena) $b^k$ tenemos $a^{n+k}b^nb^k=a^{n+k}b^{n+k}$ y está en $A$. El conjunto que contiene a todas las clases de equivalencia, una por cada $k$:
\noindent si se le agrega por la derecha (concatena) $b^k$ tenemos $a^{n+k}b^nb^k=a^{n+k}b^{n+k}$ y está en $L$. El conjunto que contiene a todas las clases de equivalencia, una por cada $k$:
\begin{equation*}
G_k=\{ a^k\},\ k\geq 0,
\end{equation*}
\noindent por cada potencia (longitud) hay una clase de equivalencia. Para los casos en los que sí se puede concatenar la cadena mencionada y se queda dentro del conjunto $A$ esta dada por\footnote{Aquí hago una corrección al Kozen, probablemente yo soy quien no entiende bien, pero me parece que lo que buscamos es la intersección de las clases de equivalencia con el conjunto al que sí se le puede agregar la cadena $b^k$, $G_k\cap H_k$, pero no la unión, pues eso sería todas las clases de equivalencia}:
\noindent por cada potencia (longitud) hay una clase de equivalencia. Para los casos en los que sí se puede concatenar la cadena mencionada y se queda dentro del conjunto $L$ esta dada por\footnote{Aquí hago una corrección al Kozen, probablemente yo soy quien no entiende bien, pero me parece que lo que buscamos es la intersección de las clases de equivalencia con el conjunto al que sí se le puede agregar la cadena $b^k$, $G_k\cap H_k$, pero no la unión, pues eso sería todas las clases de equivalencia}:
\begin{equation*}
\bigcup_{k\geq 0} G_k \cap H_k,
\end{equation*}
\noindent es la unión de todas las intersecciones del conjunto de clases de equivalencia con el conjunto que incluye todas las cadenas a las que se les puede agregar una $b^k$ y siguen estando en $A$.
\noindent es la unión de todas las intersecciones del conjunto de clases de equivalencia con el conjunto que incluye todas las cadenas a las que se les puede agregar una $b^k$ y siguen estando en $L$.
Lo que buscamos es el inverso de esto, entonces el conjunto que no cumple esta dado por la diferencia:
@ -172,7 +173,73 @@ Lo que buscamos es el inverso de esto, entonces el conjunto que no cumple esta d
E=\Sigma^* - \bigcup_{k\geq0} G_k\cap H_k,
\end{equation*}
\noindent y este conjunto es infinito.
\noindent y este conjunto es infinito $\blacksquare$.
Vemos otro ejemplo, uno que ya se hizo en las notas del lema del bombeo pero ahora hagámoslo por Myhill-Nerode:
\textit{Muestra que $L=\{ a^p | p\text{ es primo}\}$ no es regular.}
Empezamos suponiendo que $L$ es regular y llegar a una contradicción. Si $L$ s regular entonces existe una relación de equivalencia entre dos cadenas distintas del lenguaje, $\alpha \in L$ y $\beta \in L$, es decir $\alpha = a^n$ y $\beta = a^m$ con $n$ y $m$ dos números primos distintos
\begin{equation*}
\alpha \equiv_L \beta.
\end{equation*}
También podemos suponer que $n<m$, sabemos que son distintos, en caso de que sea el contrario sólo es cuestión de intercambiar nombres.
Si es una relación de Myhill-Nerode debe ser congruente por la derecha, sea $\gamma=a^{m-n}$. ya que sabemos que $n<m$ podemos elegir esta cadena a concatenar de forma conveniente, para que al concatenar $\alpha$ con $\gamma$ obtener $\beta$. Pero en general la concatenación de $k$ veces esta cadena debe seguir cumpliendo la congruencia por la derecha. Para tener el caso más general la cadena $\gamma$ puede concatenarse cualquier cantidad de veces y seguir cumpliendo la relación de Myhill-Nerode (recuerden que seguimos suponiendo la regularidad), $\alpha \equiv_l \alpha \gamma^k$.
Veamos los casos:
\begin{itemize}
\item Cuando $k=0$ tenemos la muestra de la reflexividad de la relación de equivalencia, $\alpha \equiv_L \alpha \gamma^0 = \alpha$.
\item Cuando $k=1$, tenemos nuestra suposición de que el lenguaje es regular y la relación de equivalencia se cumple para dos cadenas distintas, $\alpha \equiv_L \alpha \gamma^1 = a^na^{m-n}=a^m=\beta$, ambos son cadenas con longitud igual a un número primo. Todo va pintado bien hasta aquí.
\item Para naturales más grandes suponemos cierto $\alpha \gamma^{k+1}$ y vemos que pasa con\footnote{Sí, esto es inducción} $k+2$. Vamos a ver si se sigue manteniendo la relación de equivalencia $\alpha \equiv_L \alpha \gamma^{k+2}$.
\begin{itemize}
\item $\alpha \gamma^{k+2}= \alpha \gamma \gamma^{k+1} = \beta \gamma^{k+1}$
\item Si la relación se cumple es congruente por la derecha y debe cumplirse que $\alpha\gamma^{k+1} \equiv_L \beta\gamma^{k+1}$, parece que las cosas aún van cuadrando. Pero aún podemos esperar algo que lo contradiga.
\item Sabemos que si se cumple nuestra hipótesis de indicción, $\alpha\equiv_L \alpha \gamma^{k+1}$, entonces por transitividad de la relación $\alpha \gamma^{k+1}\equiv_l \beta \gamma^{k+1}$, tenemos que $\alpha \equiv_L \beta \gamma^{k+1}= \alpha\gamma^{k+2}$.
\end{itemize}
\end{itemize}
Pero si recuerdan una de las condiciones para que la relación sea de Myhill-Nerode es que sea un refinamiento, como se mencione en la ecuación\ref{ec:ref}. SI tomamos $k=n$
\begin{align*}
\alpha \gamma^{n} =& a^na^{n(m-n)} \\
=& a^{n+n(m-n)} \\
=& a^{n(1+m-n)}
\end{align*}
Y esto es una contradicción, $\alpha \gamma^n \notin L$ ya que esta cadena tiene una longitud de $n(1+m-n)$, con\footnote{Si recuerdan tomamos que $m>n$, y si aparte le sumamos $1$, seguro el valor es mayor que $1$.} $(1+m-n)>1$, pero este valor por definición no es un primo, pues sus factores no son el mismo número y la unidad, entonces para cada $k$ hay una clase de equivalencia distinta y son infinitas $\blacksquare$.
Ese ejemplo estuvo medio complicado, pero veamos otro ejemplo que se resolvió por lema del bombeo y resolvámoslo por Myhill-Nerode.
\textit{Demuestra que el lenguaje $\mathbf{A} = \{ a^{2^n} | n\geq 0\}$ no es regular}.
Pues ya saben el clásico proceder con Myhill-Nerode, supongamos que es regular y que por ello hay una relación de Myhill-Nerode que se cumple para dos cadenas distintas en el lenguaje, sean esas cadenas $\alpha, \beta \in A$ tales que $\alpha=a^{2^r}$ y $\beta=a^{2^s}$, son distintas ya que $r\neq s$. Suponemos que existe
\begin{equation*}
\alpha \equiv_A \beta
\end{equation*}
Si es regular es equivalente a decir que se puede dar una relación de equivalencia para esas dos cadenas, de las finitas relaciones que podemos tener, y por ser de Myhill-Nerode, en particular, debe cumplirse la congruencia por la derecha. Tomemos la cadena $\gamma = a^{2^r}$. No es la norma tomar $\gamma = \alpha$, pero en este caso va a ser útil.
\begin{align*}
\alpha \gamma =& a^{2^r}a^{2^r} = a^{2^r+2^r} = a^{2(2^r)}=a^{2^{r+1}}\ (\alpha\gamma\in A) \\
\beta \gamma =& a^{2^s}a^{2^r}= a^{2^s+2^r}
\end{align*}
De la última parte no podemos decir que $\beta\gamma\in A$, no está claro, pero veamos los casos.
\begin{center}
\begin{tabular}{ c c }
Si $s>r $ & Si $s<r$ \\
$2^s+2^r = 2^{s-r+r}+2^r$ & $2^s+2^r = 2^s+2^{r-s+s}$\\
$2^s+2^r = 2^{s-r}2^r+2^r$ & $2^s+2^r = 2^s+2^{r-s}2^s$\\
$2^s+2^r = 2^r(2^{s-r}+1)$ & $2^s+2^r = 2^s(1+2^{r-s})$
\end{tabular}
\end{center}
Notemos que en ambos casos la longitud de la cadena es un término del tipo $2^{algo}(1+2^{\text{otro algo}})$, veámos también que $2^{w}$ siempre es un número par, es un número $2^{w-1}$ multiplicado por $2$, un número par a todo lo que da. Pero $(1+2^{algo})$ nunca es un número par, no puede ser representado como $2^w$, de tal forma $a^{2^s}a^{2^r}\neq a^{2^w}$, no está en el lenguaje, por lo tanto hay infinitas clases de equivalencia pues para cada elección de $r$ se requiere una clase de equivalencia distinta $\blacksquare$.
\begin{thebibliography}{10}
\bibitem{Regan} Regan, Kenneth, \href{http://www.cse.buffalo.edu/~regan/cse396/CSE396MNT.pdf}{``Notes on the Myhill-Nerode Theorem''} (PDF) (2010), consultadas en abril de 2022.