1. Investigue sobre minimizaci´on de AFDs. Una posible fuente es [ASU86], desde p´agina 135. Otra es [HMU01], secci´on 4.4, desde p´agina 154.
2. Investigue sobre m´etodos alternativos a Thompson para convertir una ER en AFND. Por ejemplo, el m´etodo de Glushkov se describe en [NR02], secci´on 5.2.2, desde p´agina 105.
3. Investigue una forma alternativa de convertir AFDs en ERs, donde los estados se van eliminando y se van poniendo ERs cada vez m´as complejas en las aristas del aut´omata. Se describe por ejemplo en [HMU01], secci´on 3.2.2, desde p´agina 96.
4. Investigue sobre implementaci´on eficiente de aut´omatas. Algunas fuentes son [NR02], secci´on 5.4, desde p´agina 117; y [ASU86], secci´on 3.9, desde p´agina 134. Tambi´en puede investigar la implementaci´on de las herramientas grep de Gnu y lexde Unix. 5. Programe el ciclo completo de conversi´on ER → AFND → AFD → ER.
6. Programe un buscador eficiente de ERs en texto, de modo que reciba una ER y lea la entrada est´andar, enviando a la salida est´andar las l´ıneas que contienen una ocurrencia de la ER.
Referencias
[ASU86 ] A. Aho, R. Sethi, J. Ullman. Compilers: Principles, Techniques, and Tools. Addison-Wesley, 1986.
[HMU01] J. Hopcroft, R. Motwani, J. Ullman. Introduction to Automata Theory, Languages, and Computation. 2nd Edition. Pearson Education, 2001.
2.12. PROYECTOS 41
[LP81] H. Lewis, C. Papadimitriou. Elements of the Theory of Computation. Prentice-Hall, 1981. Existe una segunda edici´on, bastante parecida, de 1998.
[NR02 ] G. Navarro, M. Raffinot. Flexible Pattern Matching in Strings. Cambridge University Press, 2002.
Cap´ıtulo 3
Lenguajes Libres del Contexto
[LP81, cap 3]
En este cap´ıtulo estudiaremos una forma de representaci´on de lenguajes m´as potentes que los regulares. Los lenguajes libres del contexto (LC) son importantes porque sirven como mecanismo formal para expresar la gram´atica de lenguajes de programaci´on o los semiestructurados. Por ejemplo la popular “Backus-Naur form” es esencialmente una gram´atica libre del contexto. Similarmente, los DTDs usados para indicar el formato permitido en documentos XML son esencialmente gram´aticas que describen lenguajes LC. Los lenguajes LC tambi´en 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´on semiautom´atica deparsers(reconocedores) eficientes, los cuales son esenciales en la construcci´on de compiladores e int´erpretes, as´ı como para procesar textos semiestructurados. Una herramienta conocida para esta construcci´on semiautom´atica es
lex/yacc en C/Unix, y sus distintas versiones para otros ambientes. Estas herramientas reciben esencialmente una especificaci´on de un lenguaje LC y producen un programa que parsea tal lenguaje.
En t´erminos te´oricos, los lenguajes LC son interesantes porque van m´as all´a de la memoria finita sobre el pasado permitida a los regulares, pudiendo almacenar una cantidad arbitraria de informaci´on sobre el pasado, siempre que esta informaci´on se acceda en forma de pila. Es interesante ver los lenguajes que resultan de esta restricci´on.
3.1
Gram´aticas Libres del Contexto (GLCs)
[LP81, sec 3.1]Unagram´atica libre del contexto (GLC)es una serie dereglas de derivaci´on, producci´on 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 desistema de reescritura, restringida a que las reglas aplicables para reescribir un s´ımbolo son independientes de lo que tiene alrededor
en la cadena que se est´a generando (de all´ı el nombre “libre del contexto”).
Distinguiremos entre los s´ımbolos terminales (los del alfabeto Σ que formar´an la cadena final) y loss´ımbolos no terminales(los que deben reescribirse como otros y no pueden aparecer en la cadena final). Una GLC tiene un s´ımbolo inicialdel que parten todas las derivaciones, y se dice que generacualquier 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 −→ ε
dondeS 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{anbn, 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´on 3.1 Una gram´atica 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´on (conjunto finito).
Escribiremos las reglas de R comoA −→Gz o simplemente A −→z en vez de (A, z).
Ahora definiremos formalmente el lenguaje descrito por una GLC.
Definici´on 3.2 Dada una GLC G= (V,Σ, R, S), la relaci´on lleva en un paso =⇒G⊆(V ∪
Σ)∗×(V ∪Σ)∗ se define como
∀x, y, ∀A−→z ∈R, xAy =⇒G xzy.
Definici´on 3.3 Definimos la relaci´on lleva en cero o m´as 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´as pasos a una secuencia que a´un contiene no terminales. Las derivaciones que nos interesan finalmente son las que llevan del s´ımbolo inicial a secuencias de terminales.
3.1. GRAM ´ATICAS LIBRES DEL CONTEXTO (GLCS) 45
Definici´on 3.4 Dada una GLC G = (V,Σ, R, S), definimos el lenguaje generado por G,
L(G), como
L(G) = {w∈Σ∗, S =⇒∗
Gw}.
Finalmente definimos los lenguajes libres del contexto como los expresables con una GLC. Definici´on 3.5 Un lenguaje L es libre del contexto (LC) si existe una GLC G tal que
L=L(G).
Ejemplo 3.2 ¿C´omo podr´ıan describirse las secuencias de par´entesis bien balanceados? (donde nunca se han cerrado m´as par´entesis de los que se han abierto, y al final los n´umeros 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´on de la cadena (())() a partir deS 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´on 3.1 ¿Puede el lenguaje del Ej. 3.2 ser regular? No, pues entonces su intersecci´on con(∗)∗ tambi´en lo ser´ıa, pero esa intersecci´on es{(n)n, n≥0}, que ya sabemos
que no es regular.
Una herramienta muy ´util para visualizar derivaciones, y que se independiza del orden en que se aplican las reglas, es el ´arbol de derivaci´on.
Definici´on 3.6 Un ´arbol de derivaci´on para una gram´atica G = (V,Σ, R, S) es un ´arbol donde los hijos tienen orden y los nodos est´an rotulados con elementos de V ´o Σ ´o ε. La ra´ız est´a rotulada con S, y los nodos internos deben estar rotulados con elementos de V. Si los r´otulos de los hijos de un nodo interno rotulado A sona1. . . ak, k ≥1 yai ∈V ∪Σ, debe
existir una regla A −→ a1. . . ak ∈ R. Si un nodo interno rotulado A tiene un ´unico hijo
rotulado ε, debe haber una regla A −→ ε ∈ R. Diremos que el ´arbol 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 ε).
Observar que la definici´on permite que un ´arbol de derivaci´on tenga s´ımbolos no terminales en sus hojas, es decir, puede representar una derivaci´on parcial. El siguiente lema es inmediato.
Lema 3.1 Si un ´arbol de derivaci´on para G genera x ∈ (V ∪Σ)∗, entonces S =⇒∗
G x. Si S =⇒∗
G x, existe un ´arbol de derivaci´on que genera x.
Prueba: Muy f´acil por inducci´on estructural sobre el ´arbol o por inducci´on sobre la longitud de
la derivaci´on, seg´un el caso. 2
Ejemplo 3.3 El ´arbol de derivaci´on para la cadena del Ej. 3.2 es como sigue:
S
( S ) S
( S ) S ( S ) S
ε ε ε ε
y abstrae de ambos ´ordenes de derivaci´on.
Sin embargo, los distintos ´ordenes de derivaci´on no son los ´unicos responsables de que existan distintas formas de derivar una misma cadena. Es posible que una misma cadena tenga dos ´arboles de derivaci´on distintos.
Definici´on 3.7 Una GLC G es ambigua si existen dos ´arboles de derivaci´on 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´eticas correctas.
E −→ E+E N −→ D
E −→ E∗E N −→ DN
E −→ (E) D −→ 0
E −→ N D −→ . . .
3.1. GRAM ´ATICAS LIBRES DEL CONTEXTO (GLCS) 47
dondeV ={E, N, D},E es el s´ımbolo inicial, y todos los dem´as son terminales.
Por ejemplo, 2 + 3∗5 pertenece al lenguaje generado por esta GLC, pero tiene dos ´arboles de derivaci´on distintos: N D 2 E E E + E * E N D 3 N D 5 E E E E E N D 3 N D * + 2 N D 5
Dado que lo normal es asignar sem´antica a una expresi´on a partir de su ´arbol de derivaci´on, el valor en este ejemplo puede ser 25 ´o 17 seg´un qu´e arbol utilicemos para generarla.
Cuando se tiene una gram´atica 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´ecnica usada ha sido distinguir lo que son sumandos (o t´erminosT) de factores (F), de modo de forzar la precedencia∗, +. E −→ E+T N −→ D E −→ T N −→ DN T −→ T∗F D −→ 0 T −→ F D −→ . . . F −→ (E) D −→ 9 F −→ N
Ahora el lector puede verificar que 2+ 3∗5 s´olo permite la derivaci´on que queremos, pues hemos obligado a que primero se consideren los sumandos y luego los factores.