440 likes | 748 Views
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 , G , D , s , F , z ) donde: Q es un conjunto finito de estados S es un alfabeto de entrada G es un alfabeto llamado alfabeto de la pila
E N D
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, G, D, s, F, z) donde: Q es un conjunto finito de estados S es un alfabeto de entrada G es un alfabeto llamado alfabeto de la pila D es una regla de transición sQ es el estado inicial o de partida FQ es el conjunto de los estados finales o de aceptación zG es el símbolo inicial de la pila La D se define por medio de la terna (q, s, g), donde q es el estado actual, s es un símbolo de D {e} y gG. El resultado de aplicar D 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 g.
Definición Entonces D se define como DQ (S {e}) GQ G* Se puede tener que D(q, a, b) produzca (p, e), 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 D(q, e, a) = {(p, aa)}, esto es, cambiar al estado p sin consumir ningún símbolo y apilando una a. También, si D(q, e, 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) D(q1, a, b).
Lenguaje aceptado por un ADPND Sea M = (Q, S, G, D, s, F, z) un ADPND. El lenguaje aceptado por M se denota por L(M) y es el conjunto L(M) = {wS* | (s, w, z) |–* (p, , u) para pF y u*}
Ejemplo Se al ADPND Q = {q1, q2, q3, q4}S = {a, b}G = {A, B}z = AF = {q4}s = q1 D dada por
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}S = {a, b}G = {A, B,,Z}z = ZF = {q2}s = q1 D dada por D(q1, e, Z) = {(q2, Z)} D(q1, a, Z) = {(q1, AZ)} D(q1, b, Z) = {(q1, BZ)} D(q1, a, A) = {(q1, AA)} D(q1, b, A) = {(q1, e)} D(q1, a, B) = {(q1, e)} D(q1, b, B) = {(q1, BB)}
(q1, abba, Z) |– (q1, bba, AZ) |– (q1, ba,Z) |– (q1, a,BZ) |– (q1, e,Z) |– (q2, e,Z) Procesar aaababbb
El siguiente ADPND acepta L = {wcwI | w {a, b}*} Q = {q1, q2 , q3}S = {a, b, c}G = {a, b,,z}z = zF = {q3} s = q1 D dada por:D(q1, a, z) = {(q1, az)} D(q1, c, z) = {(q2, z)} D(q1, a, a) = {(q1, aa)} D(q1, c, a) = {(q2, a)} D(q1, a, b) = {(q1, ab)} D(q1, c, b) = {(q2, b)} D(q1, b, z) = {(q1, bz)} D(q2, a, a) = {(q2, e)} D(q1, b, a) = {(q1, ba)} D(q2, b, b) = {(q2, e)} D(q1, b, b) = {(q1, bb)} D(q2, e, 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, Aw, 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, 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 NS) F = {q3} s = q1
la regla de transición está compuesta por cuatro tipos de transiciones: • D(q1, e, z) = {(q2, Sz)}, la cual se corresponde con la introducción del símbolo inicial en la pila. • D(q2, e, A) = {(q2, w) | Aw es una producción de P} para cada no terminal A de N. • D(q2, a, a) = {(q2, )} para cada símbolo terminal a de . • D(q2, e, z) = {(q3, z)}.
Ejemplo Sea G S aSa | bSb | c El ADPND es D(q1, e, z) = {(q2, Sz)} D(q2, e, S) = {(q2, aSa), (q2, bSb), (q2, c)} D(q2, a, a) = D(q2, b, b) = D(q2, c, c) = {(q2, e)} D(q2, e, z) = {(q3, e)}
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, e, z) |- (q3, e, z)
Obsérvese que si se tiene que (q2, x, Aa) |- (q2, x, ba), es posible A*b. Por tanto si w = a1a2…an es aceptada por el ADPND,debemos tener (q2, a1a2…an, Sz) |-* (q2, a1a2…an, a1b1z) |- (q2, a2…an, b1z) |-* (q2, an, anz) |- (q2, , z) |- (q3, , z) y por se obtienen las derivaciones siguientes S*a1b1*a1a2b2* … *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*A1a1a1a1*a1A2a2a1a2a2*a1a2…an Por tanto, en un ADPND derivado de la gramática, se puede tener la secuencia (q2, a1a2…an, Sz) |–* (q2, a1a2…an, a1a1z) |– (q2, a2…an, a1z) |–* (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, , e)} 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 D(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. D(q1, a, z) = {(q1, az)} D(q1, b, z) = {(q2, e)} D(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’, e) D(q, t, 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 D(q, e, g) = {(p3, g)} para todo g G. D(p3, e, g) = {(p3, e)} para todo g G – {z} D(p3, e, z) = {(p4, e)} Se hace F = {p4}
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, ) D(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) D(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.
Ejemplo sea el ADPND 1. D(q1, a, z) = {(q1, Az)} 2. D(q1, a, A) = {(q1, AA)} 3. D(q1, b, A) = {(q2, e)} 4. D(q2, b, A) = {(q2, e)} 5. D(q2, e, A) = {(q2, e)} 6. D(q2, e, z) = {(q3, e)} 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 | e [q2zq3] e
Ejemplo [q1Aq2] b [q2Aq2] b | e [q2zq3] e 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, e, e) La derivación con la gramática es [q1Aq2] a[q1Aq2] [q2zq3] aa[q1Aq2] [q2Aq2] [q2zq3] aab [q2Aq2] [q2zq3] aabb [q2zq3] aabb
1. D(q1, a, z) = {(q1, Az)} 2. D(q1, b, A) = {(q2, e)} 3. D(q4, e, z) = {(q1, Az)} 4. D(q2, e, z) = {(q3 e)} 5. D(q1, a, A) = {(q4, e)} [q1zq3] inicial,[q1Aq2] b [q1Aq4] a [q2zq3] e 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 AaBg es una producción de una gramática independiente del contexto y si Bb1 | b2 | ... | bm son las producciones que tienen a B en su lado izquierdo, entonces la producción AaBg se puede reemplazar por Aab1g | ab2g | ... | abmg sin que varíe el lenguaje generado por la gramática.
Definiciones Una producción de la forma AaA se llama recursiva por la derecha. Una producción de la forma AAa se llama recursiva por la izquierda.
Teorema. Sea G una gramática independiente del contexto y A un no terminal de G. Si AAa1 | Aa2 |... Aan son todas las producciones de A, que sonmm recursivas por la izquierda y si Ab1 | b2 | ... | bm 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 Ab1| b2 | ... | bm | b1Z| b2Z | ... | bmZ| Za1| a2 | ... | am | a1Z| a2Z | ... | anZ| Demostración En ambos caso las producciones forman el lenguaje regular {b1,b2, ... , bm} {a1,a2, ... , an}*
Ejemplo Considere la gramática SSa | Sb | cA AAa | a | e Cuando se procesa S se transforma en ScA | cAZ1 Z1a | b | aZ1| bZ1 AAa | a | e Cuando se procesa A se transforma en ScA | cAZ1 Z1a | b | aZ1| bZ1 A a | aZ2 | e | 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 Aaa, donde a es un símbolo terminal y a (S N)*.
Pasar a forma normal de Greibach. a) SaSb | ab b) SAA | a ASS | b c) SSa | Sb | cA AAa | a | e