lenguajes libres de contexto

Anuncio
Capı́tulo 3
Lenguajes Libres del Contexto
[LP81, cap 3]
En este capı́tulo estudiaremos una forma de representación de lenguajes más potentes
que los regulares. Los lenguajes libres del contexto (LC) son importantes porque sirven
como mecanismo formal para expresar la gramática de lenguajes de programación o los
semiestructurados. Por ejemplo la popular “Backus-Naur form” es esencialmente una
gramática libre del contexto. Similarmente, los DTDs usados para indicar el formato
permitido en documentos XML son esencialmente gramáticas que describen lenguajes LC.
Los lenguajes LC también se usan en biologı́a computacional para modelar las propiedades
que se buscan en secuencias de ADN o proteı́nas. El estudio de este tipo de lenguajes
deriva en la construcción semiautomática de parsers (reconocedores) eficientes, los cuales son
esenciales en la construcción de compiladores e intérpretes, ası́ como para procesar textos
semiestructurados. Una herramienta conocida para esta construcción semiautomática es
lex/yacc en C/Unix, y sus distintas versiones para otros ambientes. Estas herramientas
reciben esencialmente una especificación de un lenguaje LC y producen un programa que
parsea tal lenguaje.
En términos teóricos, los lenguajes LC son interesantes porque van más allá de la memoria
finita sobre el pasado permitida a los regulares, pudiendo almacenar una cantidad arbitraria
de información sobre el pasado, siempre que esta información se acceda en forma de pila. Es
interesante ver los lenguajes que resultan de esta restricción.
3.1
Gramáticas Libres del Contexto (GLCs)
[LP81, sec 3.1]
Una gramática libre del contexto (GLC) es una serie de reglas de derivación, producción o
reescritura que indican que un cierto sı́mbolo puede convertirse en (o reescribirse como) una
secuencia de otros sı́mbolos, los cuales a su vez pueden convertirse en otros, hasta obtener
una cadena del lenguaje. Es una forma particular de sistema de reescritura, restringida a que
las reglas aplicables para reescribir un sı́mbolo son independientes de lo que tiene alrededor
43
44
CAPÍTULO 3. LENGUAJES LIBRES DEL CONTEXTO
en la cadena que se está generando (de allı́ el nombre “libre del contexto”).
Distinguiremos entre los sı́mbolos terminales (los del alfabeto Σ que formarán la cadena
final) y los sı́mbolos no terminales (los que deben reescribirse como otros y no pueden aparecer
en la cadena final). Una GLC tiene un sı́mbolo inicial del que parten todas las derivaciones,
y se dice que genera cualquier secuencia de sı́mbolos terminales que se puedan obtener desde
el inicial mediante reescrituras.
Ejemplo 3.1 Consideremos las siguientes reglas de reescritura:
S −→ aSb
S −→ ε
donde S es el sı́mbolo (no terminal) inicial, y {a, b} son los sı́mbolos terminales. Las cadenas que
se pueden generar con esta GLC forman precisamente el conjunto {an bn , n ≥ 0}, que en el Ej. 2.22
vimos que no era regular. De modo que este mecanismo permite expresar lenguajes no regulares.
Formalicemos ahora lo que es una GLC y el lenguaje que describe.
Definición 3.1 Una gramática libre del contexto (GLC) es una tupla G = (V, Σ, R, S),
donde
1. V es un conjunto finito de sı́mbolos no terminales.
2. Σ es un conjunto finito de sı́mbolos terminales, V ∩ Σ = ∅.
3. S ∈ V es el sı́mbolo inicial.
4. R ⊂F V × (V ∪ Σ)∗ son las reglas de derivación (conjunto finito).
Escribiremos las reglas de R como A −→G z o simplemente A −→ z en vez de (A, z).
Ahora definiremos formalmente el lenguaje descrito por una GLC.
Definición 3.2 Dada una GLC G = (V, Σ, R, S), la relación lleva en un paso =⇒G ⊆ (V ∪
Σ)∗ × (V ∪ Σ)∗ se define como
∀x, y, ∀A −→ z ∈ R, xAy =⇒G xzy.
Definición 3.3 Definimos la relación lleva en cero o más pasos, =⇒∗G , como la clausura
reflexiva y transitiva de =⇒G .
Escribiremos simplemente =⇒ y =⇒∗ cuando G sea evidente.
Notamos que se puede llevar en cero o más pasos a una secuencia que aún contiene no
terminales. Las derivaciones que nos interesan finalmente son las que llevan del sı́mbolo
inicial a secuencias de terminales.
3.1. GRAMÁTICAS LIBRES DEL CONTEXTO (GLCS)
45
Definición 3.4 Dada una GLC G = (V, Σ, R, S), definimos el lenguaje generado por G,
L(G), como
L(G) = {w ∈ Σ∗ , S =⇒∗G w}.
Finalmente definimos los lenguajes libres del contexto como los expresables con una GLC.
Definición 3.5 Un lenguaje L es libre del contexto (LC) si existe una GLC G tal que
L = L(G).
Ejemplo 3.2 ¿Cómo podrı́an describirse las secuencias de paréntesis bien balanceados? (donde
nunca se han cerrado más paréntesis de los que se han abierto, y al final los números coinciden).
Una GLC que lo describa es sumamente simple:
S −→ (S)S
S −→ ε
la que formalmente se escribe como V = {S}, Σ = {(, )}, R = {(S, (S)S), (S, ε)}. Una derivación
de la cadena (())() a partir de S podrı́a ser como sigue:
S =⇒ (S)S =⇒ ((S)S)S =⇒ (()S)S =⇒ (())S =⇒ (())(S)S =⇒ (())()S =⇒ (())(),
y otra podrı́a ser como sigue:
S =⇒ (S)S =⇒ (S)(S)S =⇒ (S)()S =⇒ (S)() =⇒ ((S)S)() =⇒ (()S)() =⇒ (())().
Esto ilustra un hecho interesante: existen distintas derivaciones para una misma cadena,
producto de aplicar las reglas en distinto orden.
Observación 3.1 ¿Puede el lenguaje del Ej. 3.2 ser regular? No, pues entonces su
intersección con (∗ )∗ también lo serı́a, pero esa intersección es {(n )n , n ≥ 0}, que ya sabemos
que no es regular.
Una herramienta muy útil para visualizar derivaciones, y que se independiza del orden
en que se aplican las reglas, es el árbol de derivación.
Definición 3.6 Un árbol de derivación para una gramática G = (V, Σ, R, S) es un árbol
donde los hijos tienen orden y los nodos están rotulados con elementos de V ó Σ ó ε. La
raı́z está rotulada con S, y los nodos internos deben estar rotulados con elementos de V . Si
los rótulos de los hijos de un nodo interno rotulado A son a1 . . . ak , k ≥ 1 y ai ∈ V ∪ Σ, debe
existir una regla A −→ a1 . . . ak ∈ R. Si un nodo interno rotulado A tiene un único hijo
rotulado ε, debe haber una regla A −→ ε ∈ R. Diremos que el árbol genera la cadena que
resulta de concatenar todos los sı́mbolos de sus hojas, de izquierda a derecha, vistos como
cadenas de largo 1 (o cero para ε).
46
CAPÍTULO 3. LENGUAJES LIBRES DEL CONTEXTO
Observar que la definición permite que un árbol de derivación tenga sı́mbolos no
terminales en sus hojas, es decir, puede representar una derivación parcial. El siguiente
lema es inmediato.
Lema 3.1 Si un árbol de derivación para G genera x ∈ (V ∪ Σ)∗ , entonces S =⇒∗G x. Si
S =⇒∗G x, existe un árbol de derivación que genera x.
Prueba: Muy fácil por inducción estructural sobre el árbol o por inducción sobre la longitud de
la derivación, según el caso.
2
Ejemplo 3.3 El árbol de derivación para la cadena del Ej. 3.2 es como sigue:
S
(
)
S
(
S
)
ε
S
S
(
S
ε
)
ε
S
ε
y abstrae de ambos órdenes de derivación.
Sin embargo, los distintos órdenes de derivación no son los únicos responsables de que
existan distintas formas de derivar una misma cadena. Es posible que una misma cadena
tenga dos árboles de derivación distintos.
Definición 3.7 Una GLC G es ambigua si existen dos árboles de derivación distintos para
G que generan una misma cadena w ∈ L(G).
Generalmente ser ambigua es una propiedad indeseable para una GLC. Veamos un
ejemplo de una GLC ambigua.
Ejemplo 3.4 La siguiente GLC describe un subconjunto de expresiones aritméticas correctas.
E
E
E
E
−→
−→
−→
−→
E +E
E ∗E
(E)
N
N
N
D
D
D
−→
−→
−→
−→
−→
D
DN
0
...
9
3.1. GRAMÁTICAS LIBRES DEL CONTEXTO (GLCS)
47
donde V = {E, N, D}, E es el sı́mbolo inicial, y todos los demás son terminales.
Por ejemplo, 2 + 3 ∗ 5 pertenece al lenguaje generado por esta GLC, pero tiene dos árboles de
derivación distintos:
E
E
E
+
E
N
E
D
2
E
E
E
N
N
D
3
*
+
*
E
E
N
N
N
D
D
D
D
5
5
2
3
Dado que lo normal es asignar semántica a una expresión a partir de su árbol de derivación, el
valor en este ejemplo puede ser 25 ó 17 según qué arbol utilicemos para generarla.
Cuando se tiene una gramática ambigua, podemos intentar desambiguarla, mediante
escribir otra que genere el mismo lenguaje pero que no sea ambigua.
Ejemplo 3.5 La siguiente GLC genera el mismo lenguaje que la del Ej. 3.4, pero no es ambigua.
La técnica usada ha sido distinguir lo que son sumandos (o términos T ) de factores (F ), de modo
de forzar la precedencia ∗, +.
E
E
T
T
F
F
−→
−→
−→
−→
−→
−→
E+T
T
T ∗F
F
(E)
N
N
N
D
D
D
−→
−→
−→
−→
−→
D
DN
0
...
9
Ahora el lector puede verificar que 2+ 3∗5 sólo permite la derivación que queremos, pues hemos
obligado a que primero se consideren los sumandos y luego los factores.
48
CAPÍTULO 3. LENGUAJES LIBRES DEL CONTEXTO
3.2
Todo Lenguaje Regular es Libre del Contexto
[LP81, sec 3.2]
Hemos ya mostrado (Ej. 3.1) que existen lenguajes LC que no son regulares. Vamos
ahora a completar esta observación con algo más profundo: el conjunto de los lenguajes LC
incluye al de los regulares.
Teorema 3.1 Si L ⊆ Σ∗ es un lenguaje regular, entonces L es LC.
Prueba: Lo demostramos por inducción estructural sobre la ER que genera L. Serı́a más fácil
usando autómatas finitos y de pila (que veremos enseguida), pero esta demostración ilustra otros
hechos útiles para más adelante.
1. Si L = ∅, la GLC G = ({S}, Σ, ∅, S) genera L. ¡Esta es una GLC sin reglas!
2. Si L = {a}, la GLC G = ({S}, Σ, {S −→ a}, S) genera L.
3. Si L = L1 ∪ L2 y tenemos (por hipótesis inductiva) GLCs G1 = (V1 , Σ, R1 , S1 ) y G2 =
(V2 , Σ, R2 , S2 ) que generan L1 y L2 respectivamente, entonces la GLC G = (V1 ∪ V2 ∪
{S}, Σ, R1 ∪ R2 ∪ {S −→ S1 , S −→ S2 }, S) genera L.
4. Si L = L1 ◦ L2 y tenemos GLCs G1 = (V1 , Σ, R1 , S1 ) y G2 = (V2 , Σ, R2 , S2 ) que generan L1
y L2 respectivamente, entonces la GLC G = (V1 ∪ V2 ∪ {S}, Σ, R1 ∪ R2 ∪ {S −→ S1 S2 }, S)
genera L.
5. Si L = L∗1 y tenemos una GLC G1 = (V1 , Σ, R1 , S1 ) que genera L1 , entonces la GLC G =
(V1 ∪ {S}, Σ, R1 ∪ {S −→ S1 S, S −→ ε}, S) genera L.
2
Ejemplo 3.6 Si derivamos una GLC para (a ⋆ | b) ⋆ a obtendremos
S
S1
S1
S3
S3
−→
−→
−→
−→
−→
S1 S2
S3 S1
ε
S4
S5
S4
S4
S6
S5
S2
−→
−→
−→
−→
−→
S6 S4
ε
a
b
a
El Teo. 3.1 nos muestra cómo convertir cualquier ER en una GLC. Con esto a mano, nos
permitiremos escribir ERs en los lados derechos de las reglas de una GLC.
Ejemplo 3.7 La GLC del Ej. 3.5 se puede escribir de la siguiente forma.
E −→ E + T | T
T
−→ T ∗ F | F
F
−→ (E) | DD ⋆
D −→ 0 | . . . | 9
si bien, para cualquier propósito formal, deberemos antes convertirla a la forma básica.
Descargar