Las gramáticas indexadas son una generalización de las gramáticas libres de contexto en las que los no terminales están equipados con listas de indicadores o símbolos de índice . El lenguaje producido por una gramática indexada se denomina lenguaje indexado .
En publicaciones contemporáneas posteriores a Hopcroft y Ullman (1979), [2] una gramática indexada se define formalmente como una 5-tupla G = ⟨ N , T , F , P , S ⟩ donde
En producciones así como en derivaciones de gramáticas indexadas, una cadena ("pila") σ ∈ F * de símbolos de índice se adjunta a cada símbolo no terminal A ∈ N , denotado por A [ σ ]. [nota 1] Los símbolos terminales no pueden ser seguidos por pilas de índice. Para una pila de índice σ ∈ F * y una cadena α ∈ ( N ∪ T ) * de símbolos no terminales y terminales, α [ σ ] denota el resultado de adjuntar [ σ ] a cada no terminal en α ; por ejemplo, si α es igual a un B C d E con un terminal a , d ∈ T y B , C , E ∈ N símbolos no terminales, entonces α [ σ ] denota un B [ σ ] C [ σ ] d E [ σ ]. Usando esta notación, cada producción en P tiene que ser de la forma
donde A , B ∈ N son símbolos no terminales, f ∈ F es un índice, σ ∈ F * es una cadena de símbolos de índice y α ∈ ( N ∪ T ) * es una cadena de símbolos no terminales y terminales. Algunos autores escriben ".." en lugar de " σ " para la pila de índices en las reglas de producción; la regla de tipo 1, 2 y 3 entonces se lee A [..]→ α [..], A [..]→ B [ f ..] y A [ f ..]→ α [..] , respectivamente.
Las derivaciones son similares a las de una gramática libre de contexto, excepto por la pila de índices adjunta a cada símbolo no terminal. Cuando se aplica una producción como, por ejemplo, A [ σ ] → B [ σ ] C [ σ ], la pila de índices de A se copia tanto en B como en C. Además, una regla puede insertar un símbolo de índice en la pila o hacer que su símbolo de índice "superior" (es decir, el más a la izquierda) aparezca.
Formalmente, la relación ⇒ ("derivación directa") se define en el conjunto ( N [ F * ]∪ T ) * de "formas oracionales" de la siguiente manera:
Como es habitual, la relación de derivaciónse define como el cierre transitivo reflexivo de la derivación directa ⇒. El lenguaje L ( G ) = { w ∈ T * : S w } es el conjunto de todas las cadenas de símbolos terminales derivables del símbolo inicial.
Históricamente, el concepto de gramáticas indexadas fue introducido por primera vez por Alfred Aho (1968) [3] utilizando un formalismo diferente. Aho definió una gramática indexada como una 5-tupla ( N , T , F , P , S ) donde
Las derivaciones directas fueron las siguientes:
Este formalismo lo utiliza, por ejemplo, Hayashi (1973, págs. 65-66). [4]
En la práctica, las pilas de índices pueden contar y recordar qué reglas se aplicaron y en qué orden. Por ejemplo, las gramáticas indexadas pueden describir el lenguaje sensible al contexto de tripletas de palabras { www : w ∈ { a , b } * }:
Una derivación de abbabbabb es entonces
Como otro ejemplo, la gramática G = ⟨ { S , T , A , B , C }, { a , b , c }, { f , g }, P , S ⟩ produce el lenguaje { a n b n c n : n ≥ 1 }, donde el conjunto de producción P consiste en
Un ejemplo de derivación es
Ambos lenguajes de ejemplo no están libres de contexto según el lema de bombeo .
Hopcroft y Ullman tienden a considerar los lenguajes indexados como una clase "natural", ya que son generados por varios formalismos distintos de las gramáticas indexadas, a saber: [5]
Hayashi [4] generalizó el lema de bombeo a las gramáticas indexadas. Por el contrario, Gilman [10] [11] ofrece un "lema de contracción" para los lenguajes indexados.
Gerald Gazdar ha definido una segunda clase, las gramáticas indexadas lineales ( LIG ), [14] al requerir que, como máximo, se especifique un no terminal en cada producción como receptor de la pila, [nota 2] mientras que en una gramática indexada ordinaria, todos los no terminales reciben copias de la pila. Formalmente, una gramática indexada lineal se define de manera similar a una gramática indexada ordinaria, pero los requisitos de forma de la producción se modifican para:
donde A , B , f , σ , α se utilizan como antes, y β ∈ ( N ∪ T ) * es una cadena de símbolos no terminales y terminales como α . [nota 3] Además, la relación de derivación directa ⇒ se define de forma similar a la anterior. Esta nueva clase de gramáticas define una clase estrictamente más pequeña de lenguajes, [15] que pertenece a las clases ligeramente sensibles al contexto .
El lenguaje { www : w ∈ { a , b } * } es generable por una gramática indexada, pero no por una gramática indexada lineal, mientras que tanto { ww : w ∈ { a , b } * } como { a n b n c n : n ≥ 1 } son generables por una gramática indexada lineal.
Si se admiten tanto las reglas de producción originales como las modificadas, la clase de idioma sigue siendo la de los idiomas indexados. [16]
Si σ denota una secuencia arbitraria de símbolos de pila, podemos definir una gramática para el lenguaje L = { a n b n c n | n ≥ 1 } [nota 4] como
Para derivar la cadena abc tenemos los pasos:
Similarmente:
Los lenguajes indexados linealmente son un subconjunto de los lenguajes indexados, y por lo tanto todos los LIG pueden ser recodificados como IG, haciendo que los LIG sean estrictamente menos poderosos que los IG. Una conversión de un LIG a un IG es relativamente simple. [17] Las reglas LIG en general se ven aproximadamente como , módulo la parte push/pop de una regla de reescritura. Los símbolos y representan cadenas de símbolos terminales y/o no terminales, y cualquier símbolo no terminal en cualquiera de ellos debe tener una pila vacía, por la definición de un LIG. Esto, por supuesto, es contrario a cómo se definen los IG: en un IG, los no terminales cuyas pilas no se están empujando o de las que no se está sacando deben tener exactamente la misma pila que el no terminal reescrito. Por lo tanto, de alguna manera, necesitamos tener no terminales en y que, a pesar de tener pilas no vacías, se comporten como si tuvieran pilas vacías.
Considere la regla como un caso de ejemplo. Al convertir esto en un IG, el reemplazo de debe ser algo que se comporte exactamente como independientemente de lo que sea. Para lograr esto, simplemente podemos tener un par de reglas que tomen cualquier donde no esté vacío y extraigan símbolos de la pila. Luego, cuando la pila esté vacía, se puede reescribir como .
Podemos aplicar esto en general para derivar un IG a partir de un LIG. Por ejemplo, si el LIG para el lenguaje es el siguiente:
La regla oracional aquí no es una regla IG, pero al usar el algoritmo de conversión anterior, podemos definir nuevas reglas para , cambiando la gramática a:
Cada regla se ajusta ahora a la definición de un IG, en el que todos los no terminales en el lado derecho de una regla de reescritura reciben una copia de la pila del símbolo reescrito. Por lo tanto, las gramáticas indexadas pueden describir todos los idiomas que las gramáticas indexadas linealmente pueden describir.
Vijay-Shanker y Weir (1994) [18] demuestran que las gramáticas lineales indexadas, las gramáticas categóricas combinatorias , las gramáticas de contigüidad de árboles y las gramáticas de núcleo definen la misma clase de lenguajes de cadenas. Su definición formal de gramáticas lineales indexadas [19] difiere de la anterior. [ Aclaración necesaria ]
Los LIG (y sus equivalentes débiles ) son estrictamente menos expresivos (lo que significa que generan un subconjunto adecuado) que los lenguajes generados por otra familia de formalismo débilmente equivalente, que incluyen: LCFRS , MCTAG, MCFG y gramáticas minimalistas (MG). La última familia puede (también) analizarse en tiempo polinomial . [20]
Otra forma de gramáticas indexadas, introducida por Staudacher (1993), [12] es la clase de gramáticas de índice distribuido (DIG). Lo que distingue a las DIG de las gramáticas indexadas de Aho es la propagación de índices. A diferencia de las IG de Aho, que distribuyen toda la pila de símbolos a todos los no terminales durante una operación de reescritura, las DIG dividen la pila en subpilas y distribuyen estas subpilas a los no terminales seleccionados.
El esquema de regla general para una regla de distribución binaria de DIG es la forma
Donde α, β y γ son cadenas terminales arbitrarias. Para una cadena con distribución ternaria:
Y así sucesivamente para un mayor número de no terminales en el lado derecho de la regla de reescritura. En general, si hay m no terminales en el lado derecho de una regla de reescritura, la pila se particiona de m maneras y se distribuye entre los nuevos no terminales. Observe que hay un caso especial en el que una partición está vacía, lo que efectivamente convierte a la regla en una regla LIG. Por lo tanto, los lenguajes de índice distribuido son un superconjunto de los lenguajes de índice lineal.
{{cite journal}}
: CS1 maint: numeric names: authors list (link)