Eliminación de Símbolos Inútiles Veremos cómo eliminar los sı́mbolos inútiles de una gramática. Lo haremos con dos algoritmos, que son definidos en la demostración de los siguientes lemas. Lema 1 Dada una GLC G = (V, T, P, S) con L(G) 6= ∅, se puede encontrar una GLC equivalente G0 = (V 0, T, P 0, S) tal que para todo A ∈ V 0 existe algún w ∈ T ∗ para el cual A ⇒∗ w. Demostración: Podemos usar el siguiente algoritmo para encontrar V 0: Elimina-No-Generadores(G) 1 OLDV ← ∅ 2 N EW V ← {A|A → w ∈ P, para algún w en T ∗ } 3 while OLDV 6= N EW V 4 do OLDV ← N EW V 5 N EW V ← OLDV ∪ {A|A → α para algún α en (T ∪ OLDV )∗ } 6 V 0 ← N EW V Las producciones en P 0 son las mismas que las de P , pero eliminando las que contienen variables que no están en V 0. Jorge Baier Aranda, PUC 48 Es posible demostrar por inducción en el largo de la derivación de w que se cumple el enunciado del lema. Lema 2 Dada una GLC G = (V, T, P, S) podemos encontrar una gramática equivalente G0 = (V 0, T 0, P 0, S 0) tal que para cada X en V 0 ∪ T 0 existen α y β en (V 0 ∪ T 0)∗ para los cuales S ⇒∗ αXβ. Demostración: Los conjuntos V 0 y T 0 pueden ser construidos usando el algoritmo: Elimina-Inalcanzables(G) 1 N EW V ← {S} 2 N EW T ← {} 3 repeat 4 OLDV = N EW V 5 OLDT = N EW T 6 N EW V ← OLDV ∪ { Todas las variables de α | A ∈ OLDV, 7 A → α ∈ P} 8 N EW T ← OLDT ∪ { Todos los terminales de α | A ∈ OLDV, 9 A → α ∈ P} 10 until OLDV = N EW V ∧ OLDT = N EW T 11 V 0 = N EW V ; T 0 = N EW T ; Jorge Baier Aranda, PUC 49 Claramente, la gramática G0 es equivalente a G porque sólo se han removido sı́mbolos que no participan en la derivación de alguna palabra a partir de S. Jorge Baier Aranda, PUC 50 Eliminación de Símbolos Inútiles Teorema Sea L un LLC tal que L 6= ∅. Entonces L es generado por una gramática sin sı́mbolos inútiles. Idea de demostración: Como L es un LLC, tenemos una gramática G para éste. Usando el lema 1, podemos generar una gramática equivalente G0 sin sı́mbolos que no generan palabras. Luego, aplicando el lema 2 sobre G0 podemos generar G00 que no tendrá los sı́mbolos que no pueden ser ocupados en derivaciones en G0. De esta forma G00 no tiene sı́mbolos inútiles. El procedimiento se puede esquematizar con: lema 1 lema 2 G 7−→ G0 7−→ G00 Jorge Baier Aranda, PUC 51 Demostración: Por el lema 1 sabemos que podemos construir una gramática para L, G1 = (V1, T1, P1, S) en donde, para todo X ∈ V1 existe algún w ∈ T ∗ para el cual X ⇒∗ w. Por el lema 2 sabemos que podemos definir una gramática G2 = (V2, T2, P2, S) a partir de G que genera el mismo lenguaje que G1 tal que para todo X en V2 ∪ T2 existen α y β en (V2 ∪ T2)∗ para los cuales S ⇒∗ αXβ. Supongamos que en G2 hay un sı́mbolo X inútil. Por el lema 1, sabemos que S ⇒∗G2 αXβ. Como los sı́mbolos que están en G2 también estaban en G1 se cumple también que X ⇒∗ w, para algún w ∈ T2∗. Luego, S ⇒∗ αXβ ⇒∗ w, para algún w ∈ T2∗. Esto contradice el supuesto que X es inútil. Jorge Baier Aranda, PUC 52 Eliminación de Producciones en Vacío En esta sección demostraremos que si ε 6∈ L podemos eliminar todas las producciones del tipo A → ε. Teorema Si L = L(G) para alguna GLC G = (V, T, P, S), entonces L − {ε} es L(G0) donde G0 = (V, T, P 0, S) es una GLC sin sı́mbolos inútiles ni producciones en vacı́o. Definición: Decimos que una variable A es anulable si A ⇒∗ ε. Demostración: Por el teorema anterior, sabemos que podemos generar una gramática G sin sı́mbolos inútiles. Podemos determinar los sı́mbolos anulables de G siguiendo el siguiente algoritmo iterativo: Repetir mientras se encuentran nuevos sı́mbolos anulables.: Si A → ε es una producción, entonces A es anulable. Si B → α es una producción, y todos los sı́mbolos de α son anulables, entonces B es anulable. Jorge Baier Aranda, PUC 53 El conjunto P 0 de producciones se construye de la siguiente manera: Si A → X1X2 · · · Xn ∈ P agregar todas las producciones A → α1α2 · · · αn a P 0 donde: 1. Si Xi no es anulable, entonces αi = Xi. 2. Si Xi es anulable αi es Xi o ε. 3. No todos los αi son ε. Lo que falta es demostrar que G0 es efectivamente equivalente a G. Esto se puede probar sin mucha dificultad probando que para todo A ∈ V y w ∈ T ∗ se cumple que: A ⇒∗G w si y solo si A ⇒∗G0 w La demostración se hace por inducción en el número de aplicaciones de ⇒. Jorge Baier Aranda, PUC 54 Eliminación de Producciones Unitarias El objetivo de esta sección es eliminar las producciones del tipo A → B. Teorema Cada LLC sin ε es definido por una gramática sin sı́mbolos inútiles ni producciones en vacı́o ni producciones unitarias. Demostración: Sea L un LLC sin ε y L = L(G) para alguna gramática G = (V, T, P, S). Por el teorema anterior, suponemos que no hay producciones en vacı́o. Podemos construir una gramática G0 = (V, T, P 0, S), donde P 0 se arma de la siguiente manera: 1. Agregar todas las producciones no unitarias de P a P 0. 2. Si A ⇒∗ B (con A, B ∈ V ) entonces agregar a P 0 todas las producciones A → α donde B → α es una producción no unitaria de P . Es sencillo ver ahora que si A → w ∈ P entonces A ⇒∗G0 w, con A ∈ V y w ∈ T ∗. Jorge Baier Aranda, PUC 55