5.6.SIMPLIFICACIÓN DE GRAMÁTICAS 89(1) OLDV := ∅;(2) NEWV := {A/A → w ∈ P con w ∈ T ∗ };(3) while OLDV ≠ NEWV do begin(4) OLDV := NEWV;(5) NEWV := OLDV ∪{A/A → w ∈ P con α ∈ (T ∪ OLDV ) ∗ }end(6) V-PRIMA := NEWVEl algoritmo anterior encuentra todas las variables A que pertenecen a V ′ . Si A es puesto en NEWVen línea (2) ó (5) es porque <strong>de</strong>riva un string <strong>de</strong> terminales. Para <strong>de</strong>mostrar que NEWV tendrá todas esasvariables, se <strong>de</strong>be probar que si A <strong>de</strong>riva un string <strong>de</strong> terminales, w, entonces A será eventualmente puestoen NEWV. La prueba es por inducción en el largo <strong>de</strong> la <strong>de</strong>rivación A ∗ ⇒w. Nótese que P ′ es el conjunto <strong>de</strong>todas las producciones cuyos símbolos están en V ′ ∪ T .Base: Si el largo <strong>de</strong> la <strong>de</strong>rivación es 1, entonces A → w es una producción y A es puesto en NEWV en lalínea (2).∗Inducción: Sea A → X 1 X 2 . . . X n⇒w una <strong>de</strong>rivación con k pasos. Entonces se pue<strong>de</strong> escribir w =∗w 1 w 2 . . . w n , en que X i⇒wi , 1 ≤ i ≤ n, por una <strong>de</strong>rivación <strong>de</strong> menos <strong>de</strong> k pasos. Por la hipótesis<strong>de</strong> inducción los X i que sean variables son eventualmente puestos en NEWV. La condición <strong>de</strong> la sentenciawhile en la línea (3), justo <strong>de</strong>spués que el último <strong>de</strong> los X i se agrega a NEWV es falsa, ya que eseX i no está en OLDV. Por lo tanto hay una iteración adicional (al menos), en la que A será agregadaa NEWV en la línea (5). Sea V ′ el conjunto calculado en línea (6) y sea P ′ el conjunto <strong>de</strong> todaslas producciones cuyos símbolos están en V ′ ∪ T . Con toda seguridad G ′ = (V ′ , T, P ′ , S) satisface lapropiedad <strong>de</strong> que si A ∈ V ′ , entonces A⇒w, ∗ para algún w ∈ T ∗ . También, como cada <strong>de</strong>rivación en G ′es una <strong>de</strong>rivación <strong>de</strong> G, se sabe que L(G ′ ) ⊆ L(G). Si hubiera algún w ∈ L(G) y no en L(G ′ ), entoncescualquier <strong>de</strong>rivación <strong>de</strong> w ∈ G <strong>de</strong>be incluir una variable en V ′ − V o una producción en P − P ′ (queimplica que se usa una variable en V − V ′ ). Pero entonces existe una variable en V − V ′ que <strong>de</strong>rivaun string <strong>de</strong> terminales, una contradicción.Lema 4 Dada una gramática libre <strong>de</strong> contexto G = (V, T, P, S), es posible encontrar efectivamente unagramática libre <strong>de</strong> contexto equivalente, G ′ = (V ′ , T ′ , P ′ , S), tal que por cada X en V ′ ∪ T ′ existen α y β en(V ′ ∪ T ′ ) ∗ tales que S ∗ ⇒ G ′αXβ.Demostración : El conjunto V ′ ∪ T ′ <strong>de</strong> símbolos que aparecen en las formas sentenciales <strong>de</strong>rivables <strong>de</strong> G sepue<strong>de</strong> construir por un algoritmo iterativo. Ponga S en V ′ . Si A está en V ′ y A → α 1 |α 2 . . . α n , entoncesagregue a V ′ todas las variables que aparezcan en α 1 , α 2 , . . . o α n , y a T ′ todos los terminales en α 1 ,α 2 , . . . , α n . P ′ es el conjunto <strong>de</strong> producciones en P que sólo tienen símbolos <strong>de</strong> V ′ ∪ T ′ .Aplicando primero el lema anterior, y a continuación este último, es posible convertir una gramática enuna equivalente sin símbolos inútiles. Es interesante notar que si se utilizan en el or<strong>de</strong>n contrario es posibleque aún que<strong>de</strong>n símbolos inútiles.Teorema 18 Todo lenguaje libre <strong>de</strong> contexto no vacío es generado por una gramática libre <strong>de</strong> contexto queno tiene símbolos inútiles.Demostración : Sea L = L(G) un lenguaje libre <strong>de</strong> contexto no vacío. Sea G 1 el resultado <strong>de</strong> usar el primerlema en G, y sea G 2 el resultado <strong>de</strong> aplicar la construcción <strong>de</strong>l segundo lema a G 1 . Suponga que G 2 tieneun símbolo inútil X. Por el último lema, hay una <strong>de</strong>rivación S⇒ ∗ G 2 αXβ. Ya que todos los símbolos <strong>de</strong> G 2son símbolos <strong>de</strong> G 1 , <strong>de</strong>l primer lema se sabe que S⇒ ∗ G 1 αXβ⇒ ∗ G 1 w para algún string <strong>de</strong> terminales w. Porlo tanto, ningún símbolo en la <strong>de</strong>rivación αXβ⇒ ∗ G 1 w es eliminado por el segundo lema. Por lo tanto, X<strong>de</strong>riva un string <strong>de</strong> terminales en G 2 y no es inútil como se suponía.✷✷
90 CHAPTER 5. ACEPTACIÓN Y GENERACIÓN DE LENGUAJES LIBRES DE CONTEXTO ✷Ejemplo 74 Consi<strong>de</strong>re la gramáticaS → AB|aA → aPor el primer lema, se nota que ningún string <strong>de</strong> terminales es <strong>de</strong>rivable <strong>de</strong> B. Por lo tanto se elimina By la producción S → AB, con lo que quedaS → aA → aAplicándole el segundo lema, sólo S y a aparecen en formas sentenciales. Por lo tanto, ({S}, {a},{S → a}, S) es una gramática equivalente sin símbolos inútiles.Si se hubiera aplicado primero el segundo lema a la gramática original, se hubiera <strong>de</strong>ducido que todos lossímbolos aparecen en formas sentenciales. Aplicando luego el primer lema, se hubiese obtenido la segundagramática, que aún tiene un símbolo inútil, A.Se verá ahora cómo eliminar producciones <strong>de</strong> la forma A → ε, llamadas producciones vacías (ε-productions).Es claro que si ε ∈ L(G), no es posible eliminar todas las producciones vacías <strong>de</strong> G, pero siε ∉ L(G), esto es posible. El método consiste en <strong>de</strong>terminar, para cada variable A, si es posible que A⇒ε,∗en cuyo caso se dice que A es anulable. Es posible reemplazar cada producción B → X 1 X 2 . . . X n por todaslas producciones que se forman al eliminar algún subconjunto <strong>de</strong> aquellos X i ’s que son anulables, pero sinincluir B → ε, aún cuando todos los X i sean anulables.Teorema 19 Si L = L(G) para alguna gramática libre <strong>de</strong> contexto G = (V, T, P, S), entonces L−ε es L(G ′ )para alguna gramática libre <strong>de</strong> contexto, G ′ , sin símbolos inútiles ni producciones vacías.Demostración : Es posible <strong>de</strong>terminar los símbolos anulables <strong>de</strong> G con el siguiente algoritmo. Si A → εes una producción, entonces A es anulable. Si B → α es una producción y todos los símbolos <strong>de</strong> α sonanulables, entonces B es anulable. Este proceso se repite hasta que ningún otro símbolo anulable pueda serencontrado.El conjunto <strong>de</strong> producciones P ′ se construye como sigue. Si A → X 1 X 2 . . . X n está en P , agregue a P ′todas las producciones A → α 1 α 2 . . . α n , don<strong>de</strong>• si X i no es anulable, entonces α i = X i• si X i es anulable, entonces α i es X i o ε• no todos los α i ’s son εSea G ′′ = (V, T, P, S). Se mostrará que para todo A ∈ V y w ∈ T ∗ , A⇒ ∗ G ′′w ssi w ∉ ε y A⇒ ∗ G w.Sea A⇒ i G w y w ∉ ε. Se prueba, por inducción en i, que A⇒ ∗ G ′w. La base, i = 1, es trivial, pues A → w<strong>de</strong>be ser una producción en P . Dado que w ∉ ε, también es una producción en P ′ . Para la inducción, seai > 1. Entonces A ⇒ i−1∗GX 1 X 2 . . . X n ⇒ G w. Sea w = w 1 w 2 . . . w n , tal que para cada j, X j⇒wj en menos <strong>de</strong> i∗pasos. Si w j ≠ ε y X j es una variable, entonces por la hipótesis <strong>de</strong> inducción se tiene X j⇒ G ′′w j . Si w j = εentonces X j es anulable. Por lo tanto, A → β 1 β 2 . . . β n es una producción en P ′ , con β j = X j si w j ≠ ε yβ j = ε si w j = ε. Como w ≠ ε no todos los β j son ε. Por lo tanto se tiene una <strong>de</strong>rivaciónA ⇒ β 1 β 2 . . . β n∗⇒w1 β 2 . . . β n∗⇒w1 w 2 . . . β n∗⇒ . . .∗⇒w1 w 2 . . . w n = wen G ′′ . Es <strong>de</strong>cir, A ∗ ⇒ G ′′w.Suponga ahora que A i ⇒ G ′′w. Con toda seguridad w ≠ ε ya que G ′′ no tiene producciones vacías. Semuestra por inducción en i que A ∗ ⇒ G w. Para la base, i = 1, observe que A → w está en P ′ . Debe haber una✷