Autómatas de Pila Teoría del Autómata.

Slides:



Advertisements
Presentaciones similares
Introducción ¿Qué es un Algoritmo?
Advertisements

GRAMATICA LIBRE DE CONTEXTO
INSTITUTO TECNOLÓGICO DE MINATITLÁN
Compiladores e intérpretes
Compiladores e intérpretes Análisis Sintáctico III
Gramáticas Libres de Contexto
Conceptos básicos Def. Un símbolo es cualquier carácter imprimible.
Autómatas de pila (Pushdown automata)
Gramáticas.
Diseño de Autómatas Finitos
Autómatas Finitos.
Diseño de AFN’s.
Máquinas de Turing (MT)
Autómata Finito Un autómata finito (AF) es un modelo de computación muy restringido, sin embargo tiene una gran aplicación en reconocimiento de patrones.
TIPOS DE GRAMATICAS JERARQUIAS DE CHOMSKY
Tema 2.- Gramáticas independientes de contexto.
Tema: Decibilidad Integrantes: Ileana Rdguez Soto
Tema 3 Propiedades de los lenguajes independientes de contexto
Programas y Máquinas de Turing
La maquina de Turing La máquina de Turing es una caja negra (tan simple como una máquina de escribir y tan compleja como un ser humano) capaz no sólo de.
Organización de Lenguajes y Compiladores 1
Unidad 3. Análisis Sintáctico
Tema 2 Autómatas finitos 1. Autómata finito determinista
Tema 1.- Lenguajes. Gramáticas
4. Máquinas de Turing 4.1. Modelo básico.
ANALISIS SINTACTICO DESCENDENTE
EJERCICIOS DE EXPRESIONES REGULARES Y AUTOMATAS
2º curso Ingeniería Técnica en Informática de Sistemas UNED
CLASIFICACION DE LAS MAQUINAS DE TURING
Universidad Autónoma San Francisco
Lenguajes Regulares Curso de Compiladores Manuel E. Bermúdez, Ph.D.
ANALISIS SINTACTICO El análisis gramatical es la tarea de determinar la sintaxis, o estructura, de un programa. Por esta razón también se le conoce como.
Representaciones de conjuntos y funciones Roberto Moriyón.
Teoría de lenguajes y compiladores
Tema 1.- Lenguajes. Gramáticas
Tema 2 Lenguajes Formales.
Introducción a la Teoría de Lenguajes Preparado por Manuel E. Bermúdez, Ph.D. Profesor Asociado University of Florida Curso de Compiladores.
Algoritmos para calcular el Conjunto Primero y el Conjunto Siguiente
Tema 2: LA ELECCIÓN RACIONAL DEL COSUMIDOR
Análisis sintáctico LR: SLR (LR simple)
Lenguajes Independientes del Contexto
ANALISIS SINTACTICO Parte I
Gramáticas Otoño2012. Importancia de las gramáticas 2 Son una herramienta muy poderosa para describir y analizar lenguajes.
ANALISIS SINTACTICO ASCENDENTE
Teoría de lenguajes y compiladores
Tema 2 Autómatas finitos 1. Autómata finito determinista
Lenguajes regulares Teoría del Autómata.
Teoría de lenguajes y compiladores Analizadores lexicográficos
Teoría de Autómatas I 2º curso Ingeniería Técnica en Informática de Sistemas UNED.
MÁQUINAS DE TURING Teoría del Autómata.
M A T R I C E S MATRICES matrices.
Matrices Conceptos generales
Compiladores e intérpretes
Teoría de lenguajes y compiladores
Tomado de Sudkamp: Languages and Machines Cap. 6.
Lenguajes Formales y Autómatas
Autómatas de Pila (Pushdown Automatón)
Gramáticas Otoño2012. Importancia de las gramáticas 2 Son una herramienta muy poderosa para describir y analizar lenguajes.
Programación de Sistemas FEI – 2008
Teoría de lenguajes y compiladores
Teoría de lenguajes y compiladores
I.- ESTUDIO DE LOS LENGUAJES DE PROGRAMACIÓN.
Unidad 3 Analizador Sintáctico
IV. GRAMÁTICAS DISTRIBUIDAS Y TABLAS DE SÍMBOLOS
REPÚBLICA BOLIVARIANA DE VENEZUELA MINISTERIO DEL PODER POPULAR PARA LA EDUCACION SUPERIOR UNIVERSIDAD VALLE DEL MOMBOY CARVAJAL EDO. TRUJILLO ENERO 2014.
República Bolivariana de Venezuela Ministerio del Poder Popular para la Educación Superior Universidad Valle del Momboy Carvajal, Trujillo Alumnas Luzmila.
Unidad 2 Lenguajes, Expresiones Regulares, Autómatas
LENGUAJES GRÁMATICAS Y AUTÓMATAS
Sintaxis y Semántica. S.Takahashi Fases en el proceso de análisis de lenguajes Lexer Parser caracteres tokensrespuesta.
Centro Universitario Valle de México Gramáticas Libres de Contexto Dra. Maricela Quintana López Elaborado por: Autómatas y Lenguajes Formales.
Transcripción de la presentación:

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 s  Q es el estado inicial o de partida F  Q es el conjunto de los estados finales o de aceptación z  G 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 g  G. 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 D  Q  (S  {e})  G  Q  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) = {w  S* | (s, w, z) |–* (p, , u) para p  F y u  *}

Q = {q1, q2, q3, q4} S = {a, b} G = {A, B} z = A F = {q4} s = q1 Ejemplo Se al ADPND Q = {q1, q2, q3, q4} S = {a, b} G = {A, B} z = A F = {q4} s = q1 D dada por D (a, A) (b, A) (e, A) (a, B) (b, B) (e, B) q1 {(q2, BA), (q4, A)} {(q4, e)} q2 {(q2, BB)} {(q3, e)} q3 {(q4, A)}

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

Q = {q1, q2} S = {a, b} G = {A, B,,Z} z = Z F = {q2} s = q1 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 = Z F = {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

Q = {q1, q2 , q3} S = {a, b, c} G = {a, b,,z} z = z F = {q3} El siguiente ADPND acepta L = {wcwI | w  {a, b}*} Q = {q1, q2 , q3} S = {a, b, c} G = {a, b,,z} z = z F = {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, 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, 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  S) 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) | A  w 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)

S * a1b1 * a1a2b2 * … * a1a2…an = w 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.

S * A1a1  a1a1 * a1A2a2  a1a2a2 * a1a2…an Similarmente, si S * a1a2…an, entonces tendremos una derivación de a1a2…an por la izquierda y de la forma S * A1a1  a1a1 * a1A2a2  a1a2a2 * 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. Transición Producción (qj, e)  D(qi, a, A) [qiAqj]  a (qj, BC)  D(qi, a, A) [qiAqm] a[qjBqn] [qnCqm] para cualquier n, m.

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 A  aBg es una producción de una gramática independiente del contexto y si B  b1 | b2 | ... | bm son las producciones que tienen a B en su lado izquierdo, entonces la producción A  aBg se puede reemplazar por A  ab1g | ab2g | ... | abmg sin que varíe el lenguaje generado por la gramática.

Definiciones Una producción de la forma A  aA se llama recursiva por la derecha. Una producción de la forma A  Aa se llama recursiva por la izquierda.

Teorema. Sea G una gramática independiente del contexto y A un no terminal de G. Si A  Aa1 | Aa2 |... Aan son todas las producciones de A, que sonmm recursivas por la izquierda y si A  b1 | 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 A  b1 | b2 | ... | bm | b1Z | b2Z | ... | bmZ | Z  a1 | 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 S  Sa | Sb | cA A  Aa | a | e Cuando se procesa S se transforma en S  cA | cAZ1 Z1  a | b | aZ1| bZ1 Cuando se procesa A se transforma en 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 A  aa, donde a es un símbolo terminal y a  (S  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 | e