Está en la página 1de 38

Autómatas de Pila

Teoría del Autómata


Definición
Un Autómata de pila no determinista (ADPND) es una 7-tupla. M = (Q, ,
, , s, F, z) donde:
Q es un conjunto finito de estados
 es un alfabeto de entrada
 es un alfabeto llamado alfabeto de la pila
 es una regla de transición
s  Q es el estado inicial o de partida
F  Q es el conjunto de los estados finales o de aceptación
z   es el símbolo inicial de la pila
La  se define por medio de la terna (q, , ), donde q es el estado actual, 
es un símbolo de   {} y   . El resultado de aplicar  a esta terna es el
par (p, w), donde p es el siguiente estado y w es la cadena que se apilará en
lugar del símbolo .
En matemáticas, una tupla es una lista
ordenada de elementos. Una n-tupla es una
secuencia de n elementos, siendo n un número
natural.
Una tupla es una secuencia de valores
agrupados.
Una tupla sirve para agrupar, como si fueran
un único valor, varios valores que, por su
naturaleza, deben ir juntos.
Definición
Entonces  se define como
  Q  (  {})    Q  
Se puede tener que (q, a, b) produzca (p, ), esto indica que
el estado siguiente es p y el símbolo b se elimina de la pila.
No es posible ningún movimiento si la pila está vacía.
Es posible también tener (q, , a) = {(p, aa)}, esto es,
cambiar al estado p sin consumir ningún símbolo y apilando
una a. También, si (q, , a) = , no es posible ningún
movimiento y el ADPND parará.
Definición
La terna (q, w, u), donde q es el estado actual, w es la cadena
de entrada restante y u el contenido de la pila (con el símbolo
de la cima en el extremo de la izquierda), se llama descripción
instantánea del autómata.
Indicaremos un movimiento de una configuración a otra
situando el símbolo  entre dos descripciones instantáneas
(q1, aw, bx) |– (q2, w, yx)

representa el movimiento que resulta de (q2, y)  (q1, a, b).


Lenguaje aceptado por un ADPND

Sea M = (Q, , , , s, F, z) un ADPND. El lenguaje


aceptado por M se denota por L(M) y es el conjunto
L(M) = {w  * | (s, w, z) |–* (p, , u) para p  F y u  *}
Ejemplo
Se al ADPND
Q = {q1, q2, q3, q4}
 = {a, b}
 = {A, B}
z=A
F = {q4}
s = q1
 dada por
 (a, A) (b, A) (, A) (a, B) (b, B) (, B)
q1 {(q2, BA), (q4, A)} {(q4, )}

q2 {(q2, BB)} {(q3, )}

q3 {(q4, A)} {(q3, )}


Explicación
El estado inicial es q1 y el de aceptación es q4.
La tabla pone en los renglones el estado actual y en las columnas
las transiciones correspondientes para cada símbolo de entrada y
cada símbolo en la pila.
El lenguaje aceptado es: anbn  a
Ejemplo
El siguiente ADPND acepta L = {w  {a, b}| w contiene el mismo número
de aes que de bes}
Q = {q1, q2}
 = {a, b}
 = {A, B,,Z}
z=Z
F = {q2}
s = q1
 dada por
(q1, , Z) = {(q2, Z)} (q1, a, Z) = {(q1, AZ)}
(q1, b, Z) = {(q1, BZ)} (q1, a, A) = {(q1, AA)}
(q1, b, A) = {(q1, )} (q1, a, B) = {(q1, )}
(q1, b, B) = {(q1, BB)}
(q1, abba, Z) |– (q1, bba, AZ)
|– (q1, ba, Z)
|– (q1, a, BZ)
|– (q1, , Z)
|– (q2, , Z)
Procesar aaababbb
El siguiente ADPND acepta L = {wcwI | w  {a, b}*}
Q = {q1, q2 , q3}
 = {a, b, c}
 = {a, b,,z}
z=z
F = {q3}
s = q1
 dada por: (q1, a, z) = {(q1, az)} (q1, c, z) = {(q2, z)}
(q1, a, a) = {(q1, aa)} (q1, c, a) = {(q2, a)}
(q1, a, b) = {(q1, ab)} (q1, c, b) = {(q2, b)}
(q1, b, z) = {(q1, bz)} (q2, a, a) = {(q2, )}
(q1, b, a) = {(q1, ba)} (q2, b, b) = {(q2, )}
(q1, b, b) = {(q1, bb)} (q2, , z) = {(q3, z)}
Autómatas de pila y lenguajes
independientes del contexto
Se construirá un ADPND que acepte el mismo lenguaje que una
gramática G.
Se construirá un ADPND que haga las derivaciones por la
izquierda para cualquier cadena del lenguaje.
Representaremos la derivación guardando en la pila los no
terminales del extremo derecho de la derivación.
La parte izquierda es idéntica a la cadena de entrada que se ha
leído.
Introducimos en la pila el símbolo inicial de G, después se
realiza una de estas actividades.
1. Si el símbolo que está en la cima de la pila es un no terminal
A, lo sustituiremos por el lado derecho de la producción para A,
A  w, o
2. Si el símbolo en la cima de la pila es un terminal y se
corresponde con el siguiente símbolo de entrada. Los
desapilaremos de la pila.
Si se agota la cadena de entrada y en la cima de la pila está el
símbolo inicial de la pila, aceptaremos la cadena.
Para construir un ADPND a partir de una gramática G = (N,
, S, P) se hace lo siguiente:
Se define un ADPND con

Q = {q1, q2, q3}

 = N    {z}, z es el símbolo inicial de la pila


(distinto de todos los símbolos de N  )
F = {q3}

s = q1
la regla de transición está compuesta por cuatro tipos de
transiciones:

1. (q1, , z) = {(q2, Sz)}, la cual se corresponde


con la introducción del símbolo inicial en la
pila.
2. (q2, , A) = {(q2, w) | A  w es una
producción de P} para cada no terminal A de N.
3. (q2, a, a) = {(q2, )} para cada símbolo
terminal a de .
4. (q2, , z) = {(q3, z)}.
Ejemplo
Sea G
S  aSa | bSb | c
El ADPND es
(q1, , z) = {(q2, Sz)}
(q2, , S) = {(q2, aSa), (q2, bSb), (q2, c)}
(q2, a, a) = (q2, b, b) = (q2, c, c) = {(q2, )}
(q2, , z) = {(q3, )}
La cadena abcba se acepta mediante la secuencia:
(q1, abcba, z) | (q2, abcba, Sz)
| (q2, abcba, aSaz)
| (q2, bcba, Saz)
| (q2, bcba, bSbaz)
| (q2, cba, Sbaz)
| (q2, cba, cbaz)
| (q2, ba, baz)
| (q2, a, az)
| (q2, , z)
| (q3, , z)
Obsérvese que si se tiene que (q2, x, A) | (q2, x, ), es posible
A * . Por tanto si w = a1a2…an es aceptada por el ADPND,
debemos tener
(q2, a1a2…an, Sz) | * (q2, a1a2…an, a11z)

| (q2, a2…an, 1z)

| * (q2, an, anz)

| (q2, , z)

| (q3, , z)
y por se obtienen las derivaciones siguientes
S * a11 * a1a22 * … * a1a2…an = w

Por consiguiente, si w es aceptada por el ADPND, entonces w


se deriva de la gramática.
Similarmente, si S * a1a2…an, entonces tendremos una
derivación de a1a2…an por la izquierda y de la forma

S * A11  a11 * a1A22  a1a22 * a1a2…an

Por tanto, en un ADPND derivado de la gramática, se puede


tener la secuencia

(q2, a1a2…an, Sz) |–* (q2, a1a2…an, a11z)

|– (q2, a2…an, 1z)

|–* (q2, , z)

|– (q3, , z)

Es decir el ADPND acepta la cadena w = a1a2…an.


Teorema
Si L es un lenguaje independiente del contexto, entonces
existirá un ADPND para el cual L = L(M).
GIC a partir de un ADPND
El lenguaje aceptado por la pila vacía de M se define como
N(M) = {w | (q1, w, z)|* (p, , )}

Sea M un ADPND. Podemos transformar M en un ADPND M’


tal que L(M) = N(M’). Resultará que M’ tendrá un único
estado final. Además se requiere que todas las transiciones
sean de la forma
(q, a, A) = {c1, c1, c1, …,cn}

donde ci = (p, ) o ci = (p, BC).


Diferencia entre L(M) y N(M)
No se cumple que el lenguaje aceptado por un autómata sea el
mismo que el aceptado con pila vacía.
(q1, a, z) = {(q1, az)}
(q1, b, z) = {(q2, )}
(q1, a, a) = {(q3, a)}

N(M) = {b}
L(M) = {a2}
Transformación L(M) = N(M’)
Si M nunca desapila z, se hará de la siguiente forma
(q’, )  (q, , z)
Se sustituyen las transiciones donde q’ no esté en F por nuevas
transiciones (p1, z).
Se sustituyen las transiciones donde q’ esté en F por nuevas
transiciones (p2, z) inclluyendo p2 en F.
Para todo q F, se añaden transiciones
(q, , ) = {(p3, )} para todo  .
(p3, , ) = {(p3, )} para todo   – {z}
(p3, , z) = {(p4, )}
Se hace F = {p }
Para poder seguir la traza de los estados por los que pasa el
autómata conforme se reconoce la gramática, usaremos no
terminales de la forma [qAp], donde interpretaremos [qAp] *
w como la acción del ADPND correspondiente, que saca A de
la pila y se mueve del estado q al p mientras consume la
cadena de entrada w.

Si (qj, )  (qi, a, A), la producción correspondiente es [qiAqj]


 a, ya que el ADPND para del estado qi al estado qj y
desapila A de la pila sobre el símbolo de entrada a.
Por otro lado si (qj, BC)  (qi, a, A), la entrada a produce que
A sea desapilado, pero entonces B y C serían rechazados.
Para eliminarlos incluiremos todas las producciones de la forma
[qiAqm]  a[qjBqn][qnCqm], donde qn y qm pueden ser cualquiera
de los estados de Q.
Finalmente, tendremos como símbolo inicial [szqf], donde s es
el estado inicial, z es el símbolo inicial de la pila y qf es el
(único) estado de aceptación de ADPND.
Obsérvese que, de la forma de construir una gramática a partir
de un ADPND que satisfaga las condiciones dadas, se obtiene
que (qi, uv, Ax) |* (qj, v, x) por medio de las operaciones que
realiza un autómata de pila, entonces en la gramática resultante
se tendrá [qiAqj] * u. Lo inverso también se cumple.
Construcción de GIC a partir de
ADPND
Los no terminales serán de la forma [pAq], donde se interpreta
[pAq]  w como la acción de sacar A de la pila mientras se va
del estado p a q y se consume la cadena w. Además el símbolo
inicial es [szqf], donde s es el estado inicial qf es el único
estado de aceptación z es el símbolo inicial de la pila.
Las transiciones del autómata se convierten a producciones de
acuerdo a la siguiente tabla.

Transición Producción

(qj, )  (qi, a, A) [qiAqj]  a


(qj, BC)  (qi, a, A) [qiAqm] a[qjBqn] [qnCqm] para cualquier n, m.
Ejemplo
sea el ADPND
1.(q1, a, z) = {(q1, Az)}

2.(q1, a, A) = {(q1, AA)}

3.(q1, b, A) = {(q2, )}

4.(q2, b, A) = {(q2,)}

.(q2, , A) = {(q2,)}

.(q2, , z) = {(q3, )}

con F = {q3} y q1 como el estado inicial.

El símbolo inicial es [q1zq3] y las transiciones 3, 4, 5 y 6 se traducen por

[q1Aq2]  b

[q2Aq2]  b | 

[q zq ]  
Ejemplo
[q1Aq2]  b

[q2Aq2]  b | 

[q2zq3]  

Las transiciones 1 y 2 se traducen por:


[q1zq1]  a[q1Aq1] [q1zq1] | a[q1Aq2] [q2zq1] | a[q1Aq3] [q3zq1]

[q1zq2]  a[q1Aq1] [q1zq2] | a[q1Aq2] [q2zq2] | a[q1Aq3] [q3zq2]

[q1zq3]  a[q1Aq1] [q1zq3] | a[q1Aq2] [q2zq3] | a[q1Aq3] [q3zq3]

[q1Aq1]  a[q1Aq1] [q1Aq1] | a[q1Aq2] [q2Aq1] | a[q1Aq3] [q3Aq1]

[q1Aq2]  a[q1Aq1] [q1Aq2] | a[q1Aq2] [q2Aq2] | a[q1Aq3] [q3Aq2]

[q1Aq3]  a[q1Aq1] [q1Aq3] | a[q1Aq2] [q2Aq3] | a[q1Aq3] [q3Aq3]


Los siguientes no terminales son inútilies
[q2zq1] , [q3zq1], [q3zq2] [q2Aq1], [q3Aq1], [q3Aq2],

[q3zq3]

Pueden ser eliminados por los algoritmos estudiados


antes.
La cadena aabb se acepta por el autómata de la siguiente
manera
(q1, aabb, z) | (q1, abb, Az)
| (q1, bb, AAz)
| (q2, b, Az)
| (q2, , )
La derivación con la gramática es
[q1Aq2]  a [q1Aq2] [q2zq3]

 aa [q1Aq2] [q2Aq2] [q2zq3]

 aab [q2Aq2] [q2zq3]

 aabb [q2zq3]
1.(q1, a, z) = {(q1, Az)}2.(q1, b, A) = {(q2, )}

3.(q4, , z) = {(q1, Az)} 4.(q2, , z) = {(q3 )}

.(q1, a, A) = {(q4,)}

[q1zq3] inicial, [q1Aq2]  b [q1Aq4]  a [q2zq3]  

Las transiciones 1 y 3 se traducen por:


[q1zq1]  a[q1Aq1] [q1zq1]|a[q1Aq2] [q2zq1]|a[q1Aq3] [q3zq1]|a[q1Aq4] [q4zq1]

[q1zq2]  a[q1Aq1] [q1zq2]|a[q1Aq2] [q2zq2]|a[q1Aq3] [q3zq2]|a[q1Aq4] [q4zq2]

[q1zq3]  a[q1Aq1] [q1zq3]|a[q1Aq2] [q2zq3]|a[q1Aq3] [q3zq3]|a[q1Aq4] [q4zq3]

[q1zq4]  a[q1Aq1] [q1zq4]|a[q1Aq2] [q2zq4]|a[q1Aq3] [q3zq4]|a[q1Aq4] [q4zq4]

[q1zq1]  [q1Aq1] [q1zq1]| [q1Aq2] [q2zq1]| [q1Aq3] [q3zq1]| [q1Aq4] [q4zq1]

[q1zq2]  [q1Aq1] [q1zq2]| [q1Aq2] [q2zq2]| [q1Aq3] [q3zq2]| [q1Aq4] [q4zq2]

[q1zq3]  [q1Aq1] [q1zq3]| [q1Aq2] [q2zq3]| [q1Aq3] [q3zq3]| [q1Aq4] [q4zq3]

[q1zq4]  [q1Aq1] [q1zq4]| [q1Aq2] [q2zq4]| [q1Aq3] [q3zq4]| [q1Aq4] [q4zq4]


Forma normal de Greibach
Teorema. Si A  B es una producción de una gramática
independiente del contexto y si B  1 | 2 | ... | m son las
producciones que tienen a B en su lado izquierdo, entonces la
producción A  B se puede reemplazar por A  1 |
2 | ... | m sin que varíe el lenguaje generado por la
gramática.
Definiciones
Una producción de la forma A   se llama recursiva por
la derecha.
Una producción de la forma A  A se llama recursiva por la
izquierda.
Teorema. Sea G una gramática independiente del contexto y
A un no terminal de G. Si A  A1 | A2 |... An son todas las
producciones de A, que sonmm recursivas por la izquierda y
si A  1 | 2 | ... | m son las restantes producciones de A,
entonces se puede construir una gramática equivalente
introduciendo un nuevo no terminal Z y reemplazando todas
las producciones precedentes por
A  1| 2 | ... | m | 1| 2Z | ... | mZ |
Z  1| 2 | ... | m | 1| 2Z | ... | nZ |
Demostración
En ambos caso las producciones forman el lenguaje regular
{1 2, ... , m} {1 2, ... , n}*
Ejemplo
Considere la gramática
S  Sa | Sb | cA
A  Aa | a | 
Cuando se procesa S se transforma en
S  cA | cAZ1

Z1  a | b | aZ1| bZ1

A  Aa | a | 
Cuando se procesa A se transforma en
S  cA | cAZ1

Z1  a | b | aZ1| bZ1

A  a | aZ2 | Z2

Z2  a | aZ2
Definición
Una gramática independiente del contexto está en forma
normal de Greeibach (FNG) si todas las producciones son de
la forma A  a, donde a es un símbolo terminal y   ( 
N)*.
Pasar a forma normal de Greibach.
a) S  aSb | ab

b) S  AA | a
A  SS | b

c) S  Sa | Sb | cA
A  Aa | a | 

También podría gustarte