commit pila

This commit is contained in:
Vladimir Lemus 2021-08-24 18:42:56 -05:00
parent d5277e998f
commit a71f4fafb1
5 changed files with 1192 additions and 0 deletions

View File

@ -0,0 +1,212 @@
\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{hyperref}
\renewcommand{\rmdefault}{ptm}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{automata,positioning,arrows}
%\tikzset{->, % makes the edges directed
% >=stealth, % makes the arrow heads bold
% node distance=3cm, % specifies the minimum distance between two nodes. Change if necessary.
% every state/.style={thick, fill=gray!10}, % sets the properties for each state node
% initial text=$ $ % sets the text that appears on the start arrow
% }
%\usetikzlibrary{arrows,automata}
%\usepackage[all,cmtip]{xy}
%\usepackage{graphicx}
\author{Autómatas y lenguajes formales}
\title{Gramáticas independientes de contexto}
\begin{document}
\maketitle
\section*{Diseño de gramáticas}
Para enfrentar el problema de diseñar una gramática a partir de ciertas condiciones van unos tips:
\begin{enumerate}
\item Puedes partir de pedazos más sencillos y luego unirlos, por ejemplo:
\{$w\in \{ a,b,c\} | w$ contenga $a$ un número par de veces\} $\cup$ \{$w\in \{ a,b,c\} | w\in b^n c^m,\ n\geq 0,\ m=2n$ \}. Tenemos para el primer ($S_1$) y segundo ($S_2$) caso:
\begin{align*}
S_1 &\rightarrow aS_1a|\epsilon \\
S_2 &\rightarrow bS_2cc|\epsilon
\end{align*}
Uniéndolos para el caso dado al inicio:
\begin{align*}
S &\rightarrow S_1|S_2 \\
S_1 &\rightarrow aS_1a|\epsilon \\
S_2 &\rightarrow bS_2cc|\epsilon
\end{align*}
\item Si se quiere pasar de un autómata finito determinista (DFA) a un lenguaje libre de contexto, se parte del DFA y se construye la gramática. Para cada estado del autómata se asigna una variable ($q_i \Rightarrow R_i$), o poniéndolo en el lenguaje apropiado:
\begin{align*}
R_i &\rightarrow a R_j \Rightarrow \exists \ \delta (q_i,a) = q_j \\
R_i &\rightarrow \epsilon \Rightarrow q_i\in F\ (estado\ final),
\end{align*}
y $R_0$ es la variable inicial, que corresponde al estado inicial $q_0$. Por ejemplo, si tenemos el DFA:
\begin{tikzpicture}%[shorten >=1pt,node distance=2cm,on grid,auto]
\node[state,initial,initial tex= ] (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 node[yshift=-0.3cm]{0} (q_1)
edge [bend left, above] node {1} (q_2)
(q_1) edge node[yshift=-0.3cm]{1} (q_2)
edge [loop below] node {0} ()
(q_2) edge[loop above] node{0,1} ();
\end{tikzpicture}
Que se traduciría a la gramática
\begin{align*}
R_0 &\rightarrow 0 R_1| 1 R_2 \\
R_1 &\rightarrow 0 R_1| 1 R_2 \\
R_2 &\rightarrow 1 R_2| 0 R_2| \epsilon.
\end{align*}
\item Para llevar la cuenta de los símbolos siempre es útil la producción $R\rightarrow uRv$. No doy ejemplo pues lo dejo para que ustedes lo apliquen.
\end{enumerate}
\section{Formas normales}
Si me permiten me saltaré la parte de paréntesis balanceados, no dejen de revisarlo por su cuenta. Me pasaré directo a las formas normales.
\subsection{Forma normal de Chomsky (CNF)}
En la forma normal de Chomsky un lenguaje libre de contexto se escribe de la forma:
\begin{align*}
A &\rightarrow BC\\
A &\rightarrow a,
\end{align*}
donde $A,B,C$ son variables y $a\in \Sigma$ (un símbolo del alfabeto). Es decir que el CFL está en forma normal de Chomsky siempre que del lado derecho de las producciones haya sólo un par de variables distintas a la inicial o sólo un símbolo terminal, incluido $\epsilon$. Esto hace que sea más sencillo definir la gramática.
Cualquier lenguaje independiente de contexto puede convertirse en forma normal de Chomsky con un análisis detallado:
\begin{enumerate}
\item Dar una nueva variable inicial (así nos aseguramos que la variable inicial no aparezca del lado derecho de las producciones).
\item Se eliminan todas las producciones de la forma $A\rightarrow \epsilon$
\item Se eliminan las reglas unitarias de la forma $A\rightarrow B$
\item Ponemos parches en las secciones que dejamos huecas por nuestro frenesí desechador
\item Ya teniendo las reglas, lo acomodamos para que quede en la forma normal de Chomsky
\end{enumerate}
Como siempre, un ejemplo. Tenemos el lenguaje libre de contexto dado por las variables $A,B$ sobre el alfabeto $\Sigma = \{0\}$:
\begin{align*}
A &\rightarrow BAB|B|\epsilon \\
B &\rightarrow 00|\epsilon
\end{align*}
Lo convertimos a la forma normal de Chomsky siguiendo nuestros pasos descritos, primero damos una nueva variable inicial que llamaremos $S$:
\begin{align*}
S &\rightarrow A \\
A &\rightarrow BAB|B|\epsilon \\
B &\rightarrow 00|\epsilon
\end{align*}
El siguiente paso es quitar todas las producciones que tienen del lado derecho $\epsilon$, para hacer las cosas bien de una vez vamos parchando los desperfectos que provocamos, cualquier variable que en una producción lleve a $\epsilon$ en sus apariciones la cambiamos por la ausencia de cadena, es decir, si hay una producción del tipo $A\rightarrow BAB|AA|a|\epsilon$ entonces se quedan las producciones que no llevan a $\epsilon$, y a continuación se escriben las producciones en la que la variable es sustituida por la cadena vacía: $A\rightarrow BAB|AA|a|\mathbf{BB}|\mathbf{A}$ (las últimas dos producciones son las primeras dos cambiando $A$ por la cadena vacía, en el caso de $AA$ tendría que sustituirse cada $A$, pero como llevan a lo mismo basta con poner una).
De manera similar, para nuestro ejemplo:
\begin{align*}
S &\rightarrow A \\
A &\rightarrow BAB|B|BB|AB|BA|A \\
B &\rightarrow 00
\end{align*}
Ahora eliminamos las reglas unitarias, como en el caso de la eliminación de $\epsilon$ hay que estar un paso adelante, si $S \rightarrow A$, nos saltamos a donde va $A$, entonces queda $S \rightarrow BAB|B|BB|AB|BA|A$, ya nos comimos una producción unitaria, pero faltan ver $A\rightarrow B$ ($A\rightarrow A$ es la producción trivial, $A$ siempre va a $A$ la podemos borrar incluso del CFL y no perdemos nada, la borramos sin más), así podemos escribir:
\begin{align*}
S &\rightarrow BAB|B|BB|AB|BA \\
A &\rightarrow BAB|B|BB|AB|BA \\
B &\rightarrow 00,
\end{align*}
luego
\begin{align*}
S &\rightarrow BAB|00|BB|AB|BA \\
A &\rightarrow BAB|00|BB|AB|BA \\
B &\rightarrow 00
\end{align*}
Este caso es un poco más sencillo, pues no aparece $B\rightarrow A$, de aparecer tendríamos que sustituir esa $A$ por toda la producción del segundo renglón, ténganlo en cuenta.
El último paso es una manita de gato para ponerlo de forma que sólo haya dos variables o un terminal del lado derecho de la producción. Cuando haya tres variables, agrupamos dos en una nueva y damos la regla de producción correspondiente, cuando haya dos terminales agregamos una variable que lleve al par de variables que van a cada símbolo terminal, entonces:
\begin{align*}
S &\rightarrow \mathbf{U}B|B_1B_1|BB|AB|BA \\
A &\rightarrow \mathbf{U}B|B_1B_1|BB|AB|BA \\
\mathbf{U} &\rightarrow BA \\
B &\rightarrow B_1B_1 \\
B_1 &\rightarrow 0
\end{align*}
Noten que en las reglas de producción de $S$ y $A$ van a la par de variables a las que lleva $U$, pero no nos conviene cambiar esa regla por $A|S\rightarrow U$ ya que no es forma normal de Chomsky.
Y ya, esa última es nuestra forma normal de Chomsky del lenguaje libre de contexto dado, cumple los requisitos. Reciban un caluroso saludo de Chomsky por ese logro en la figura \ref{fig:Chom}.
\begin{figure}[h]
\begin{center}
\includegraphics[width=0.5\linewidth]{chomsky_homeboy.jpg}
\caption{''chomskiezzz3" por xantiblingx tieme una licencia CC BY-NC 2.0 }
\label{fig:Chom}
\end{center}
\end{figure}
\subsection{Forma Normal de Greibach (GNF)}
En la forma normal de Greibach las producciones son de la forma:
\begin{equation*}
A \rightarrow aB_1 B_2...B_k,
\end{equation*}
para alguna $k>0$, $B_1$, $B_2$,...,$B_k$ son variables y $a\in \Sigma$, algún símbolo del alfabeto.
Para llegar a la forma normal de Greibach seguimos los pasos:
\begin{enumerate}
\item Pasar el lenguaje independiente de contexto a la forma normal de Chomsky.
\item Para cada variable $A$ y $a$ un símbolo del alfabeto se tiene un nuevo lenguaje:
\begin{equation*}
R_{A,a} = \{\beta \in {\Gamma}^* | A \xrightarrow[G]{L} a \beta\},
\end{equation*}
\noindent que quiere decir que la regla de producción para la variable $A$ puede obtenerse con producciones solo aplicadas al símbolo de la extrema izquierda de la forma enunciada. Si lo vemos de la forma que hemos enunciado las gramáticas independientes de contexto, partiendo de una variable inicial, que va a combinaciones de variables, y esas variables eventualmente van a símbolos terminales, es un poco caminar para atrás (normalmente armamos los términos de izquierda a derecha, para la forma normal de Greibach los armamos de derecha a izquierda).
\end{enumerate}
Veamos para nuestro ejemplo y lo ponemos en una notación más sencilla, partimos de la regla más sencilla:
\begin{align*}
B_1 &\rightarrow 0 \\
B &\rightarrow 0B_1 \\
U &\rightarrow 0B_1A \\
A &\rightarrow 0B_1AB | 0B_1 | 0B_1B| 0B_1ABB | 0B_1BB|0B_1A \\
S &\rightarrow 0B_1AB | 0B_1 | 0B_1B| 0B_1ABB | 0B_1BB|0B_1A
\end{align*}
Lo que hicimos fue sustituir el 0 a la extrema izquierda en la regla $B \rightarrow B_1B_1$ y ahí sustituir en todas las variables que llevan a un cero en la extrema izquierda, ya tenemos nuestras producciones en la forma normal de Greibach.
Quizá esto requiera más explicación, estoy al pendiente.
\subsection{Extra: Chomsky y su disco punk}
Esto no tiene que ver con el tema, es un dato curioso para que no les sea tan aburrida la lectura. Noam Chomsky es muy conocido por ser, quizá, el intelectual estado unidense más famoso en el mundo, de una ideología cercana al anarquismo es un fuerte crítico al imperialismo de su país, un defensor a ultranza de la libertad de expresión y un pacifista (seguro a estas alturas ustedes saben que aunque muchos medios y persona suelen emparentar al anarquismo con la violencia, no necesariamente van pegadas).
Ha visitado México para hablar de su trabajo en política, sus libros al respecto son famosos, y por ser un intelectual anarquista suele ser muy conocido en el ambiente punk y anarcopunk (aunque tiene sus detractores también ahí).
En 1990 la banda punk californiana Bad Religion le pidió hacer un \emph{split} con ellos. Un \emph{split} es una forma común de sacar discos en el ambiente punk, dos bandas graban un mismo disco. Cuando eran acetatos, una banda de un lado, la otra del otro, así podías descubrir dos bandas en un mismo disco. La tradición siguió al casete, al cd y ahora al disco digital.
Bad Religion es una banda aún en activo, su vocalista Greg Graffin tiene un doctorado en paleontología evolutiva y es académico en la UCLA. Aprovecha las vacaciones académicas para seguir presentándose con la banda.
Pueden oír el \emph{split} en la siguiente liga de youtube: \url{https://www.youtube.com/watch?v=-GLIdS0jZrw}.
\end{document}

BIN
lema_bombeo_pila.pdf Normal file

Binary file not shown.

490
lema_bombeo_pila.tex Normal file
View File

@ -0,0 +1,490 @@
\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{hyperref}
\usepackage{graphicx}
\usepackage{subcaption}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{automata,positioning,arrows}
%\tikzset{->, % makes the edges directed
% >=stealth, % makes the arrow heads bold
% node distance=3cm, % specifies the minimum distance between two nodes. Change if necessary.
% every state/.style={thick, fill=gray!10}, % sets the properties for each state node
% initial text=$ $ % sets the text that appears on the start arrow
% }
%\usetikzlibrary{arrows,automata}
%\usepackage[all,cmtip]{xy}
%\usepackage{graphicx}
\author{Autómatas y lenguajes formales}
\title{Lema del bombeo para lenguajes independientes de contexto y autómatas de pila}
\begin{document}
\maketitle
\section*{Lema del bombeo para lenguajes independientes de contexto}
Como vimos en nuestro capítulo anterior existe un lema del bombeo para lenguajes regulares, que nos ayuda a demostrar que un lenguaje no es regular. Para lenguajes independientes de contexto tenemos su versión que de manera similar sirve para demostrar que un lenguaje no es independiente de contexto.
Si recuerdan de su tarea todo lenguaje regular puede ser expresado como una gramática independiente de contexto (no necesariamente al revés), entonces el lema es una ampliación del anterior.
\newtheorem{lem}{Lema}
\begin{lem}
(\textbf{Lema del bombeo para CFL}) Para todo lenguaje independiente de contexto $\mathbf{A}$ existe una $k \geq 0$ tal que para toda $z \in \mathbf{A}$ de longitud al menos $k$ puede ser dividida en cinco subcadenas $z=uvwxy$ tales que $vx \notin \epsilon$, $|vwx| \leq k$, y para toda $i\geq 0$, $uv^iwx^iy\in \mathbf{A}$.
\end{lem}
Son claras las diferencias con el lema del bombeo para lenguajes regulares, pero además, para que vean de qué se trata el lema es útil verlo en la forma normal de Chomsky (de quien espero ya hayan escuchado su \emph{split} con Bad Religion). Podemos ver el árbol de generación de un lenguaje independiente de contexto.
Tenemos el lenguaje independiente de contexto, en forma normal de Chomsky, $\mathbf{A}$, siguiente:
\begin{align}
S &\rightarrow AC|AB \nonumber \\
A &\rightarrow a \nonumber \\
B &\rightarrow b \nonumber \\
C &\rightarrow SB,
\label{ec:gram}
\end{align}
\noindent que puede generar la cadena $aaaabbbb$ a partir del árbol de generación mostrado en la figura \ref{fig:tree1}.
\begin{figure}
\begin{center}
\begin{tikzpicture}
[
level 1/.style = {sibling distance = 0.7cm, level distance = 0.8cm}
]
\node {S}
child {node {A}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node {S}
child {node {A}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node {S}
child {node {A}
child {node {a}
child {node {a}
child {node {a}}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node {S}
child {node {A}
child {node {a}}
child [missing]}
child {node {B}
child [missing]
child {node {b}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node {b}}}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}}}}}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}}}}}}}}};
\end{tikzpicture}
\caption{Árbol de generación para la cadena $aaaabbbb$ con la gramática dada en la ecuación \ref{ec:gram}.}
\label{fig:tree1}
\end{center}
\end{figure}
Para mostrar como es que el lema del bombeo para CFL es cierto tomamos el paseo más largo en el árbol, que corresponde al de la primera $b$, leyendo la palabra de izquierda a derecha. La longitud de este paseo es de ocho aristas, y sólo hasta la última hoja se obtiene un símbolo terminal (en el camino intermedio hay puras variables).
Aquí me podrían decir que todos los paseos que llegan hasta las hojas miden ocho aristas, pero esto es un poco tramposo por como se dibujó el árbol, si revisan bien la primera $a$, de izquierda a derecha, se obtuvo tras sólo dos arista, así como la última $b$ (la que está más a la derecha, porque extrema derecha suena muy feo) se obtuvo a las tres aristas. Las demás aristas son sólo para tener a la misma altura la palabra ya final.
Pero entonces nos paramos en la primera $b$ de izquierda a derecha, si recorremos el árbol en dirección inversa nos detenemos en alguna variable que aparezca más de una vez, viendo de abajo hacia arriba la primera que salta a la vista es la $S$.
Además dividimos la cadena producida en subcadenas, de la forma que indica el lema, como se puede ver en la figura \ref{fig:tree2}. Tenemos $u=aa$, $v=a$, $w=ab$, $x=b$ y $y=bb$, que cumplen las condiciones del lema, ahora vamos a ver como a partir de este árbol de producción podemos generar una palabra $uv^iwx^iy$ y sigue siendo una cadena en el lenguaje independiente del contexto.
\begin{figure}
\begin{center}
\begin{subfigure}[b]{0.4\textwidth}
\begin{tikzpicture}
[
level 1/.style = {sibling distance = 0.4cm, level distance = 0.6cm},
%level 10/.style = {white, sibling distance = 0.7cm, level distance = 0.8cm}
%level 3/.style = {teal, level distance = 1cm}
]
\node {S}
child {node {A}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node (a1) {a}
child [missing]
child {node (u) {u}}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node {S}
child {node {A}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node (a2) {a}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node [circle,draw] {S}
child {node {A}
child {node {a}
child {node {a}
child {node (a3) {a}
child {node (v) {v}}}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node [circle,draw] {S}
child {node {A}
child {node (a4) {a}
child [missing]
child {node (w) {w}}}
child [missing]}
child {node {B}
child [missing]
child {node (b1) {b}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node (b2) {b}
child {node (x) {x}}}}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node (b3) {b}}}}}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node (b4) {b}
child {node (y) {y}}
child [missing]}}}}}}}};
\path (a1) -- (u) node [midway] {$\langle$};
\path (a2) -- (u) node [midway] {$\rangle$};
\path (a3) -- (v) node [midway] {$\langle \rangle$};
\path (a4) -- (w) node [midway] {$\langle$};
\path (b1) -- (w) node [midway] {$\rangle$};
\path (b2) -- (x) node [midway] {$\langle \rangle$};
\path (b3) -- (y) node [midway] {$\langle$};
\path (b4) -- (y) node [midway] {$\rangle$};
\end{tikzpicture}
\caption{Árbol de generación para la gramática dada en la ecuación \ref{ec:gram}, marcando las apariciones de la regla $S$ y la división de la cadena en subcadenas.}
\label{fig:tree2}
\end{subfigure}
\begin{subfigure}[b]{0.4\textwidth}
\begin{tikzpicture}
[
level 1/.style = {sibling distance = 0.4cm, level distance = 0.6cm}
%level 10/.style = {white, sibling distance = 0.7cm, level distance = 0.8cm}
%level 3/.style = {teal, level distance = 1cm}
]
\node {S}
child {node {A}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node (a1) {a}
child [missing]
child {node (u) {u}}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node {S}
child {node {A}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node (a2) {a}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node [circle,draw] {S}
child {node {A}
child {node {a}
child {node {a}
child {node (a3) {a}
child {node (v) {v}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node [circle,draw] {S}
child {node {A}
child {node {a}
child {node {a}
child {node (a4) {a}
child {node (vn) {v}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node [circle, draw] {S}
child {node {A}
child {node (an) {a}
child [missing]
child {node (w) {w}}}
child [missing]}
child {node {B}
child [missing]
child {node (bn) {b}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node (b1) {b}
child [missing]
child {node (xn) {x}}}}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node (b2) {b}
child [missing]
child {node (x) {x}}}}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node (b3) {b}}}}}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node (b4) {b}
child {node (y) {y}}
child [missing]}}}}}}}};
\path (a1) -- (u) node [midway] {$\langle$};
\path (a2) -- (u) node [midway] {$\rangle$};
\path (a3) -- (v) node [midway] {$\langle \rangle$};
\path (a4) -- (vn) node [midway] {$\langle \rangle$};
\path (an) -- (w) node [midway] {$\langle$};
\path (bn) -- (w) node [midway] {$\rangle$};
\path (b1) -- (xn) node [midway] {$\langle \rangle$};
\path (b2) -- (x) node [midway] {$\langle \rangle$};
\path (b3) -- (y) node [midway] {$\langle$};
\path (b4) -- (y) node [midway] {$\rangle$};
\end{tikzpicture}
\caption{Árbol donde se aplica el lema del bombeo, repitiendo las cadenas $v$ y $x$.}
\label{fig:tree3}
\end{subfigure}
\caption{Figuras de los pasos para el lema del bombeo en gramáticas libres de contexto.}
\end{center}
\end{figure}
Para repetir las cadenas $v$ y $x$ las veces que sea necesario tomamos el sub árbol derivado de la aparición superior de $S$ (la segunda marcada de abajo hacia arriba), lo copiamos y lo pegamos en la primera aparición de esa misma variable (leída de abajo hacia arriba, la otra marcada), quedando algo como se muestra en la figura \ref{fig:tree3}.
Si se repite este paso $i$ veces tendremos que $v$ y $x$ se repiten $i$ veces, y como está en el mismo árbol de generación, sin romper ninguna regla, sigue siendo parte del lenguaje independiente de contexto.
La prueba del lema va más o menos así, es la explicación a groso modo, ahora veamos una aplicación:
Demuestra que el lenguaje $\{0^n\#0^{2n}\#0^{3n}| n\geq 0\}$ no es independiente de contexto.
Para hacerlo seguimos los pasos del juego como en el lema de bombeo para lenguajes regulares:
\begin{enumerate}
\item Te dan una $k\geq 0$.
\item Tú eliges una $z\in \mathbf{A}$ tal que $|z|\geq k$, en este caso puedes elegir $z=0^k\#0^{2k}\#0^{3k}$, ya que $z\in \mathbf{A}$ y $|z|=k+2k+3k+2$, se suma un dos por los símbolos $\#$ en la palabra.
\item Ahora el contrincante (el demonio, o quien quiera que sea) divide la cadena que diste en subcadenas de forma que $z=uvwxy$ con $vx\neq \epsilon$ y $|vwx|\leq k$. No tiene que decírtelas, pero aún sin decirlas puedes ver que le vas a ganar en el siguiente paso.
\item Eliges $i\geq 0$ para ver si con las cadenas dadas en el paso anterior puedes hacer la palabra $uv^iwx^iy$ y que siga siendo parte del lenguaje libre de contexto.
\end{enumerate}
Y ahí es donde vale, pues si el demonio elige una $v$ o $x$ que contengan el símbolo (al menos uno) $\#$ ya le ganaste, pues al repetir esa cadena tendrás más de dos $\#$ en la cadena final, y ya no es parte del lenguaje.
Ahora imagina que el contrincante toma $v$ y $x$ que no contengan esos símbolos, entonces serían fracciones de las potencias, y al repetirlas ya no quedaría la regla de potencia. Por ejemplo, toma $u=0^{k-m}$, $v=0^m$, $w=\#$, $x=0^s$ y $y=0^{2k-s}\#0^{3k}$, que cumple lo que se pide: $vx = 0^m0^s\neq \epsilon$ y $|vwx| = 0^m\#0^s\leq k$ si $s+m+1\leq k$, que en parte es condición para que tenga sentido su elección de cadenas.
En este caso si construimos la nueva cadena $uv^iwx^iy = 0^{k-m}0^{im}\#0^{is}0^{2k-s}\#0^{3k}$, para cualquier $i\geq 2$ esta cadena ya no es parte del lenguaje, no es un lenguaje independiente de contexto.
Quizá la explicación fue muy escueta, espero sea clara la idea, de cualquier forma no dejen de consultarlo en su libro de preferencia.
\section*{Autómatas de pila}
Un autómata de pila no determinista es una ampliación al autómata finito determinista, se le agrega una cinta donde puede guardar, una memoria de pila del tipo \emph{Last In First Out} (LIFO, el último entra, el primero sale). Su definición formal:
\newtheorem{defi}{Definición}
\begin{defi}
\textbf{Autómata de pila no determinista}. Es una septeta
\begin{equation*}
M=(Q,\Sigma,\Gamma,\delta,s,\perp,F),
\end{equation*}
donde
\begin{itemize}
\item $Q$ es le conjunto de estados
\item $\Sigma$ es el alfabeto de salida
\item $\Gamma$ es el alfabeto e la memoria
\item $\delta \subseteq (Q\times (\Sigma \cup \{ \epsilon\})\times \Gamma)\times (Q\times \Gamma^*)$, la relación de transición.
\end{itemize}
\end{defi}
Las funciones de transición tendrán como entrada $(p,a,A)$, donde $p$ es un estado, $a$ un símbolo del alfabeto de entrada y $A$ un símbolo del alfabeto de la cinta de memoria, dando como resultado la transición a un estado $q$ y escribiendo en la memoria una cadena $B_1B_2...B_k$ ($B_k$ al inicio de la memoria y $B_1$ al final), un esquema de este autómata se puede ver en la figura \ref{fig:pila}, no necesariamente es un diagrama útil para trabajar en ellos.
\begin{figure}[h]
\begin{center}
\includegraphics[width=0.5\linewidth]{pila.jpg}
\caption{Diagrama de un autómata de pila, $p$ es el estado en que se encuentra, la cinta superior guarda la cadena de entrada y la cinta de la derecha funciona como memoria. }
\label{fig:pila}
\end{center}
\end{figure}
¿Cómo trabajar con los autómatas de pila no deterministas? Se pueden describir a partir de todas sus funciones de transición, pero como ya nos acostumbramos, queremos hacer un dibujito con bolitas y flechitas\footnote{¿Eso ayuda a nuestra comprensión de la idea? Esa es una buena pregunta que varios especialistas en enseñanza de las matemáticas se hacen, si las gráficas o diagramas son realmente esenciales para la comprensión de las ideas, o sólo es una construcción para los que ya están acostumbrados a los métodos escolarizados. Hay personas con un conocimiento matemático funcional, pero no formal,que pueden entender conceptos elaborados, pero no de la misma forma}.
Veamos un ejemplo:
El autómata de pila que acepta el lenguaje
\begin{equation*}
\{ a^i b^j c^k | i,j,k \geq 0, i=j \lor i=k\}
\end{equation*}
Lo que hará será guardar las $a$'s en la memoria y luego checar si las $b$'s o $c$'s están en la cadena en el mismo número ¿cómo sabe el autómata si checa las $b$'s o $c$'s? Ahí entra el no determinismo, supondremos que de avanzada el autómata puede prever.
\begin{tikzpicture}
\node[state,initial,initial text= ] (q_0) {$q_0$};
\node[state,below right=of q_0] (q_1) {$q_1$};
\node[state,above right=of q_1] (q_2) {$q_2$};
\node[state,right=of q_1] (q_4) {$q_4$};
\node[state,accepting,right=of q_2] (q_3) {$q_3$};
\node[state,right=of q_4] (q_5) {$q_5$};
\node[state,accepting,right=of q_5] (q_6) {$q_6$};
\path [-stealth,thick]
(q_0) edge node[yshift=0.3cm]{$\epsilon,\epsilon \rightarrow \$ $} (q_1)
(q_1) edge node{$\epsilon,\epsilon \rightarrow \epsilon $} (q_2)
edge node[yshift=0.3cm]{$\epsilon,\epsilon \rightarrow \epsilon $} (q_4)
edge [loop below] node{$a,\epsilon \rightarrow a $} ()
(q_2) edge [loop above] node{$b,a\rightarrow \epsilon$} ()
edge node [yshift=0.3cm]{$\epsilon,\$ \rightarrow \epsilon$} (q_3)
(q_3) edge [loop above] node{$c,\epsilon \rightarrow \epsilon$} ()
(q_4) edge [loop below] node{$b,\epsilon \rightarrow \epsilon$} ()
edge node [yshift=0.3cm]{$\epsilon,\epsilon \rightarrow \epsilon$} (q_5)
(q_5) edge [loop below] node{$c,a \rightarrow \epsilon$} ()
edge node[yshift=0.3cm]{$\epsilon,\$ \rightarrow \epsilon$} (q_6);
\end{tikzpicture}
Empezamos en el estado $q_0$, aún no recorre la cinta de entrada y la de memoria está en blanco. Como el autómata es no determinista puede irse por dos caminos, uno en el que checa las $b$'s y otro donde checa las $c$'s (en esta construcción no puede checar los dos a la vez). Entonces sin tener nada en la entrada, en la cinta, se pasa al estado $q_1$ y marca la cinta de salida con un $\$ $ como para decir ``empezamos a contar''.
Ya en el estado $q_1$ empezamos a recibir las $a$'s, todas las que lleguen son marcadas en la memoria y se sigue en el mismo estado, de ahí no nos movemos hasta que llegue una $b$ o una $c$, paso que hace de forma no determinista (sin que lea nada en la cadena de entrada se pasa a los estados correspondientes, $q_2$ hace el conteo de $b$'s, y $q_5$ el de $c$'s).
Vamos a la rama para contar $b$'s, sin que se lea nada en la cadena/cinta de entrada, sin leer nada en la memoria y sin escribir nada en ella el autómata ``adivina'' que debe contar $b$'s y se pasa al estado $q_2$. Ya ahí, por cada $b$ que se lea en la cinta de entrada se lee una $a$, se mueve en ambas cintas a leer el siguiente caracter y no escribe nada. Si no lee nada en la cinta de entrada y lee un símbolo $\$ $ en la cinta de memoria se mueve al estado $q_3$ que ya es de aceptación. Si llegan cualquier número de $c$'s, ya no importa, ya se contaron las $b$'s, se aceptan y se queda como aceptado.
Si lo que va a contar son $c$'s el autómata, sin leer nada de entrada, leer nada en memoria y sin escribir nada pasa al estado $q_4$. En ese estado lo que sigue, si la cadena está en el lenguaje, es leer las $b$'s, pero como estas no se van a contar, se leen sin leer nada en memoria y sin escribir nada en memoria, hasta que llega una $c$.
Antes de leer la $c$ el autómata ``adivina'' que ya vienen, y sin leer ni escribir nada se pasa al estado $q_5$ y aquí cuenta las $c$'s, por cada $c$ de entrada lee una $a$ en memoria y no escribe nada, las compara.
Si ya no lee nada de entrada y en la memoria hay un símbolo $\$ $ se pasa al estado de aceptación $q_6$ y se queda ahí (ya no hay nada por leer, ya se leyeron las $b$'s).
No dejen de revisar más ejemplos, por el momento ahí lo dejo, y vamos a la parte extra.
\section*{Extra}
Ahora no tengo discos de punk relacionados, les tengo un programa de radio sobre el antecedente latinoamericano y socialista del internet.
En Chile durante el gobierno de la Unidad Popular, encabezado por Salvador Allende, se trabajó en un plan para interconectar a las empresas estatales por medio de una red. Así se podrían atender emergencias en producción, transporte, comunicación, además de que todo sería transparente para la ciudadanía.
Si quieren saber más de esta historia, enterarse de como fue que se inició y porque no llegó a buen término no dejen de escuchar el programa dedicado, en radio ambulante: \url{https://radioambulante.org/audio/la-sala-que-era-un-cerebro}.
Si en esa liga no pueden descargar el podcast, bájenlo de acá: \url{https://play.podtrac.com/npr-510315/edge1.pod.npr.org/anon.npr-mp3/npr/ambul/2019/09/20190917_ambul_la_sala_que_era_un_cerebro.mp3}
\end{document}

490
lema_bombeo_pila.tex~ Normal file
View File

@ -0,0 +1,490 @@
\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{hyperref}
\usepackage{graphicx}
\usepackage{subcaption}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{automata,positioning,arrows}
%\tikzset{->, % makes the edges directed
% >=stealth, % makes the arrow heads bold
% node distance=3cm, % specifies the minimum distance between two nodes. Change if necessary.
% every state/.style={thick, fill=gray!10}, % sets the properties for each state node
% initial text=$ $ % sets the text that appears on the start arrow
% }
%\usetikzlibrary{arrows,automata}
%\usepackage[all,cmtip]{xy}
%\usepackage{graphicx}
\author{Autómatas y lenguajes formales}
\title{Lema del bombeo para lenguajes independientes de contexto y autómatas de pila}
\begin{document}
\maketitle
\section*{Lema del bombeo para lenguajes independientes de contexto}
Como vimos en nuestro capítulo anterior existe un lema del bombeo para lenguajes regulares, que nos ayuda a demostrar que un lenguaje no es regular. Para lenguajes independientes de contexto tenemos su versión que de manera similar sirve para demostrar que un lenguaje no es independiente de contexto.
Si recuerdan de su tarea todo lenguaje regular puede ser expresado como una gramática independiente de contexto (no necesariamente al revés), entonces el lema es una ampliación del anterior.
\newtheorem{lem}{Lema}
\begin{lem}
(\textbf{Lema del bombeo para CFL}) Para todo lenguaje independiente de contexto $\mathbf{A}$ existe una $k \geq 0$ tal que para toda $z \in \mathbf{A}$ de longitud al menos $k$ puede ser dividida en cinco subcadenas $z=uvwxy$ tales que $vx \notin \epsilon$, $|vwx| \leq k$, y para toda $i\geq 0$, $uv^iwx^iy\in \mathbf{A}$.
\end{lem}
Son claras las diferencias con el lema del bombeo para lenguajes regulares, pero además, para que vean de qué se trata el lema es útil verlo en la forma normal de Chomsky (de quien espero ya hayan escuchado su \emph{split} con Bad Religion). Podemos ver el árbol de generación de un lenguaje independiente de contexto.
Tenemos el lenguaje independiente de contexto, en forma normal de Chomsky, $\mathbf{A}$, siguiente:
\begin{align}
S &\rightarrow AC|AB \nonumber \\
A &\rightarrow a \nonumber \\
B &\rightarrow b \nonumber \\
C &\rightarrow SB,
\label{ec:gram}
\end{align}
\noindent que puede generar la cadena $aaaabbbb$ a partir del árbol de generación mostrado en la figura \ref{fig:tree1}.
\begin{figure}
\begin{center}
\begin{tikzpicture}
[
level 1/.style = {sibling distance = 0.7cm, level distance = 0.8cm}
]
\node {S}
child {node {A}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node {S}
child {node {A}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node {S}
child {node {A}
child {node {a}
child {node {a}
child {node {a}}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node {S}
child {node {A}
child {node {a}}
child [missing]}
child {node {B}
child [missing]
child {node {b}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node {b}}}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}}}}}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}}}}}}}}};
\end{tikzpicture}
\caption{Árbol de generación para la cadena $aaaabbbb$ con la gramática dada en la ecuación \ref{ec:gram}.}
\label{fig:tree1}
\end{center}
\end{figure}
Para mostrar como es que el lema del bombeo para CFL es cierto tomamos el paseo más largo en el árbol, que corresponde al de la primera $b$, leyendo la palabra de izquierda a derecha. La longitud de este paseo es de ocho aristas, y sólo hasta la última hoja se obtiene un símbolo terminal (en el camino intermedio hay puras variables).
Aquí me podrían decir que todos los paseos que llegan hasta las hojas miden ocho aristas, pero esto es un poco tramposo por como se dibujó el árbol, si revisan bien la primera $a$, de izquierda a derecha, se obtuvo tras sólo dos arista, así como la última $b$ (la que está más a la derecha, porque extrema derecha suena muy feo) se obtuvo a las tres aristas. Las demás aristas son sólo para tener a la misma altura la palabra ya final.
Pero entonces nos paramos en la primera $b$ de izquierda a derecha, si recorremos el árbol en dirección inversa nos detenemos en alguna variable que aparezca más de una vez, viendo de abajo hacia arriba la primera que salta a la vista es la $S$.
Además dividimos la cadena producida en subcadenas, de la forma que indica el lema, como se puede ver en la figura \ref{fig:tree2}. Tenemos $u=aa$, $v=a$, $w=ab$, $x=b$ y $y=bb$, que cumplen las condiciones del lema, ahora vamos a ver como a partir de este árbol de producción podemos generar una palabra $uv^iwx^iy$ y sigue siendo una cadena en el lenguaje independiente del contexto.
\begin{figure}
\begin{center}
\begin{subfigure}[b]{0.4\textwidth}
\begin{tikzpicture}
[
level 1/.style = {sibling distance = 0.4cm, level distance = 0.6cm},
%level 10/.style = {white, sibling distance = 0.7cm, level distance = 0.8cm}
%level 3/.style = {teal, level distance = 1cm}
]
\node {S}
child {node {A}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node (a1) {a}
child [missing]
child {node (u) {u}}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node {S}
child {node {A}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node (a2) {a}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node [circle,draw] {S}
child {node {A}
child {node {a}
child {node {a}
child {node (a3) {a}
child {node (v) {v}}}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node [circle,draw] {S}
child {node {A}
child {node (a4) {a}
child [missing]
child {node (w) {w}}}
child [missing]}
child {node {B}
child [missing]
child {node (b1) {b}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node (b2) {b}
child {node (x) {x}}}}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node (b3) {b}}}}}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node (b4) {b}
child {node (y) {y}}
child [missing]}}}}}}}};
\path (a1) -- (u) node [midway] {$\langle$};
\path (a2) -- (u) node [midway] {$\rangle$};
\path (a3) -- (v) node [midway] {$\langle \rangle$};
\path (a4) -- (w) node [midway] {$\langle$};
\path (b1) -- (w) node [midway] {$\rangle$};
\path (b2) -- (x) node [midway] {$\langle \rangle$};
\path (b3) -- (y) node [midway] {$\langle$};
\path (b4) -- (y) node [midway] {$\rangle$};
\end{tikzpicture}
\caption{Árbol de generación para la gramática dada en la ecuación \ref{ec:gram}, marcando las apariciones de la regla $S$ y la división de la cadena en subcadenas.}
\label{fig:tree2}
\end{subfigure}
\begin{subfigure}[b]{0.4\textwidth}
\begin{tikzpicture}
[
level 1/.style = {sibling distance = 0.4cm, level distance = 0.6cm}
%level 10/.style = {white, sibling distance = 0.7cm, level distance = 0.8cm}
%level 3/.style = {teal, level distance = 1cm}
]
\node {S}
child {node {A}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node (a1) {a}
child [missing]
child {node (u) {u}}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node {S}
child {node {A}
child {node {a}
child {node {a}
child {node {a}
child {node {a}
child {node (a2) {a}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node [circle,draw] {S}
child {node {A}
child {node {a}
child {node {a}
child {node (a3) {a}
child {node (v) {v}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node [circle,draw] {S}
child {node {A}
child {node {a}
child {node {a}
child {node (a4) {a}
child {node (vn) {v}}
child [missing]}
child [missing]}
child [missing]}
child [missing]}
child {node {C}
child {node [circle, draw] {S}
child {node {A}
child {node (an) {a}
child [missing]
child {node (w) {w}}}
child [missing]}
child {node {B}
child [missing]
child {node (bn) {b}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node (b1) {b}
child [missing]
child {node (xn) {x}}}}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node (b2) {b}
child [missing]
child {node (x) {x}}}}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node (b3) {b}}}}}}}}
child {node {B}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node {b}
child [missing]
child {node (b4) {b}
child {node (y) {y}}
child [missing]}}}}}}}};
\path (a1) -- (u) node [midway] {$\langle$};
\path (a2) -- (u) node [midway] {$\rangle$};
\path (a3) -- (v) node [midway] {$\langle \rangle$};
\path (a4) -- (vn) node [midway] {$\langle \rangle$};
\path (an) -- (w) node [midway] {$\langle$};
\path (bn) -- (w) node [midway] {$\rangle$};
\path (b1) -- (xn) node [midway] {$\langle \rangle$};
\path (b2) -- (x) node [midway] {$\langle \rangle$};
\path (b3) -- (y) node [midway] {$\langle$};
\path (b4) -- (y) node [midway] {$\rangle$};
\end{tikzpicture}
\caption{Árbol donde se aplica el lema del bombeo, repitiendo las cadenas $v$ y $x$.}
\label{fig:tree3}
\end{subfigure}
\caption{Figuras de los pasos para el lema del bombeo en gramáticas libres de contexto.}
\end{center}
\end{figure}
Para repetir las cadenas $v$ y $x$ las veces que sea necesario tomamos el sub árbol derivado de la aparición superior de $S$ (la segunda marcada de abajo hacia arriba), lo copiamos y lo pegamos en la primera aparición de esa misma variable (leída de abajo hacia arriba, la otra marcada), quedando algo como se muestra en la figura \ref{fig:tree3}.
Si se repite este paso $i$ veces tendremos que $v$ y $x$ se repiten $i$ veces, y como está en el mismo árbol de generación, sin romper ninguna regla, sigue siendo parte del lenguaje independiente de contexto.
La prueba del lema va más o menos así, es la explicación a groso modo, ahora veamos una aplicación:
Demuestra que el lenguaje $\{0^n\#0^{2n}\#0^{3n}| n\geq 0\}$ no es independiente de contexto.
Para hacerlo seguimos los pasos del juego como en el lema de bombeo para lenguajes regulares:
\begin{enumerate}
\item Te dan una $k\geq 0$.
\item Tú eliges una $z\in \mathbf{A}$ tal que $|z|\geq k$, en este caso puedes elegir $z=0^k\#0^{2k}\#0^{3k}$, ya que $z\in \mathbf{A}$ y $|z|=k+2k+3k+2$, se suma un dos por los símbolos $\#$ en la palabra.
\item Ahora el contrincante (el demonio, o quien quiera que sea) divide la cadena que diste en subcadenas de forma que $z=uvwxy$ con $vx\neq \epsilon$ y $|vwx|\leq k$. No tiene que decírtelas, pero aún sin decirlas puedes ver que le vas a ganar en el siguiente paso.
\item Eliges $i\geq 0$ para ver si con las cadenas dadas en el paso anterior puedes hacer la palabra $uv^iwx^iy$ y que siga siendo parte del lenguaje libre de contexto.
\end{enumerate}
Y ahí es donde vale, pues si el demonio elige una $v$ o $x$ que contengan el símbolo (al menos uno) $\#$ ya le ganaste, pues al repetir esa cadena tendrás más de dos $\#$ en la cadena final, y ya no es parte del lenguaje.
Ahora imagina que el contrincante toma $v$ y $x$ que no contengan esos símbolos, entonces serían fracciones de las potencias, y al repetirlas ya no quedaría la regla de potencia. Por ejemplo, toma $u=0^{k-m}$, $v=0^m$, $w=\#$, $x=0^s$ y $y=0^{2k-s}\#0^{3k}$, que cumple lo que se pide: $vx = 0^m0^s\neq \epsilon$ y $|vwx| = 0^m\#0^s\leq k$ si $s+m+1\leq k$, que en parte es condición para que tenga sentido su elección de cadenas.
En este caso si construimos la nueva cadena $uv^iwx^iy = 0^{k-m}0^{im}\#0^{is}0^{2k-s}\#0^{3k}$, para cualquier $i\geq 2$ esta cadena ya no es parte del lenguaje, no es un lenguaje independiente de contexto.
Quizá la explicación fue muy escueta, espero sea clara la idea, de cualquier forma no dejen de consultarlo en su libro de preferencia.
\section*{Autómatas de pila}
Un autómata de pila no determinista es una ampliación al autómata finito determinista, se le agrega una cinta donde puede guardar, una memoria de pila del tipo \emph{Last In First Out} (LIFO, el último entra, el primero sale). Su definición formal:
\newtheorem{defi}{Definición}
\begin{defi}
\textbf{Autómata de pila no determinista}. Es una septeta
\begin{equation*}
M=(Q,\Sigma,\Gamma,\delta,s,\perp,F),
\end{equation*}
donde
\begin{itemize}
\item $Q$ es le conjunto de estados
\item $\Sigma$ es el alfabeto de salida
\item $\Gamma$ es el alfabeto e la memoria
\item $\delta \subseteq (Q\times (\Sigma \cup \{ \epsilon\})\times \Gamma)\times (Q\times \Gamma^*)$, la relación de transición.
\end{itemize}
\end{defi}
Las funciones de transición tendrán como entrada $(p,a,A)$, donde $p$ es un estado, $a$ un símbolo del alfabeto de entrada y $A$ un símbolo del alfabeto de la cinta de memoria, dando como resultado la transición a un estado $q$ y escribiendo en la memoria una cadena $B_1B_2...B_k$ ($B_k$ al inicio de la memoria y $B_1$ al final), un esquema de este autómata se puede ver en la siguiente, no necesariamente es un diagrama útil para trabajar en ellos.
\begin{tikzpicture}
\node {parent}
child [red] {node {child 1}}
child {node [red] {child 2}};
\end{tikzpicture}
¿Cómo trabajar con los autómatas de pila no deterministas? Se pueden describir a partir de todas sus funciones de transición, pero como ya nos acostumbramos, queremos hacer un dibujito con bolitas y flechitas\footnote{¿Eso ayuda a nuestra comprensión de la idea? Esa es una buena pregunta que varios especialistas en enseñanza de las matemáticas se hacen, si las gráficas o diagramas son realmente esenciales para la comprensión de las ideas, o sólo es una construcción para los que ya están acostumbrados a los métodos escolarizados. Hay personas con un conocimiento matemático funcional, pero no formal,que pueden entender conceptos elaborados, pero no de la misma forma}.
Veamos un ejemplo:
El autómata de pila que acepta el lenguaje
\begin{equation*}
\{ a^i b^j c^k | i,j,k \geq 0, i=j \lor i=k\}
\end{equation*}
Lo que hará será guardar las $a$'s en la memoria y luego checar si las $b$'s o $c$'s están en la cadena en el mismo número ¿cómo sabe el autómata si checa las $b$'s o $c$'s? Ahí entra el no determinismo, supondremos que de avanzada el autómata puede prever.
\begin{tikzpicture}
\node[state,initial] (q_0) {$q_0$};
\node[state,below right=of q_0] (q_1) {$q_1$};
\node[state,above right=of q_1] (q_2) {$q_2$};
\node[state,right=of q_1] (q_4) {$q_4$};
\node[state,accepting,right=of q_2] (q_3) {$q_3$};
\node[state,right=of q_4] (q_5) {$q_5$};
\node[state,accepting,right=of q_5] (q_6) {$q_6$};
\draw (q_0) edge node{$\epsilon,\epsilon \rightarrow \$ $} (q_1)
(q_1) edge node{$\epsilon,\epsilon \rightarrow \epsilon $} (q_2)
edge node[yshift=0.3cm]{$\epsilon,\epsilon \rightarrow \epsilon $} (q_4)
edge [loop below] node{$a,\epsilon \rightarrow a $} ()
(q_2) edge [loop above] node{$b,a\rightarrow \epsilon$} ()
edge node [yshift=0.3cm]{$\epsilon,\$ \rightarrow \epsilon$} (q_3)
(q_3) edge [loop above] node{$c,\epsilon \rightarrow \epsilon$} ()
(q_4) edge [loop below] node{$b,\epsilon \rightarrow \epsilon$} ()
edge node [yshift=0.3cm]{$\epsilon,\epsilon \rightarrow \epsilon$} (q_5)
(q_5) edge [loop below] node{$c,a \rightarrow \epsilon$} ()
edge node[yshift=0.3cm]{$\epsilon,\$ \rightarrow \epsilon$} (q_6);
\end{tikzpicture}
Empezamos en el estado $q_0$, aún no recorre la cinta de entrada y la de memoria está en blanco. Como el autómata es no determinista puede irse por dos caminos, uno en el que checa las $b$'s y otro donde checa las $c$'s (en esta construcción no puede checar los dos a la vez). Entonces sin tener nada en la entrada, en la cinta, se pasa al estado $q_1$ y marca la cinta de salida con un $\$ $ como para decir "empezamos a contar".
Ya en el estado $q_1$ empezamos a recibir las $a$'s, todas las que lleguen son marcadas en la memoria y se sigue en el mismo estado, de ahí no nos movemos hasta que llegue una $b$ o una $c$, paso que hace de forma no determinista (sin que lea nada en la cadena de entrada se pasa a los estados correspondientes, $q_2$ hace el conteo de $b$'s, y $q_5$ el de $c$'s).
Vamos a la rama para contar $b$'s, sin que se lea nada en la cadena/cinta de entrada, sin leer nada en la memoria y sin escribir nada en ella el autómata ``adivina'' que debe contar $b$'s y se pasa al estado $q_2$. Ya ahí, por cada $b$ que se lea en la cinta de entrada se lee una $a$, se mueve en ambas cintas a leer el siguiente caracter y no escribe nada. Si no lee nada en la cinta de entrada y lee un símbolo $\$ $ en la cinta de memoria se mueve al estado $q_3$ que ya es de aceptación. Si llegan cualquier número de $c$'s, ya no importa, ya se contaron las $b$'s, se aceptan y se queda como aceptado.
Si lo que va a contar son $c$'s el autómata, sin leer nada de entrada, leer nada en memoria y sin escribir nada pasa al estado $q_4$. En ese estado lo que sigue, si la cadena está en el lenguaje, es leer las $b$'s, pero como estas no se van a contar, se leen sin leer nada en memoria y sin escribir nada en memoria, hasta que llega una $c$.
Antes de leer la $c$ el autómata ``adivina'' que ya vienen, y sin leer ni escribir nada se pasa al estado $q_5$ y aquí cuenta las $c$'s, por cada $c$ de entrada lee una $a$ en memoria y no escribe nada, las compara.
Si ya no lee nada de entrada y en la memoria hay un símbolo $\$ $ se pasa al estado de aceptación $q_6$ y se queda ahí (ya no hay nada por leer, ya se leyeron las $b$'s).
No dejen de revisar más ejemplos, por el momento ahí lo dejo, y vamos a la parte extra.
\section*{Extra}
Ahora no tengo discos de punk relacionados, les tengo un programa de radio sobre el antecedente latinoamericano y socialista del internet.
En Chile durante el gobierno de la Unidad Popular, encabezado por Salvador Allende, se trabajó en un plan para interconectar a las empresas estatales por medio de una red. Así se podrían atender emergencias en producción, transporte, comunicación, además de que todo sería transparente para la ciudadanía.
Si quieren saber más de esta historia, enterarse de como fue que se inició y porque no llegó a buen término no dejen de escuchar el programa dedicado, en radio ambulante: \url{https://radioambulante.org/audio/la-sala-que-era-un-cerebro}.
Si en esa liga no pueden descargar el podcast, bájenlo de acá: \url{https://play.podtrac.com/npr-510315/edge1.pod.npr.org/anon.npr-mp3/npr/ambul/2019/09/20190917_ambul_la_sala_que_era_un_cerebro.mp3}
\end{document}

BIN
pila.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB