Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Guia FNC FNG
Guia FNC FNG
Este documento tiene como fin mostrar la forma de obtener la Forma Normal de Chomsky (FNC o tambin CNF) y la Forma Normal de Greibach (FNG o tambin GNF) de una gramtica dada, mediante un ejercicio explicativo. La gramtica en cuestin del ejercicio es la siguiente: S A | BCa | aDcd | EDF A aAb | c B CD | b | ECd | Ad C Cc | Bb | AaE | D aDd | Dd | E aaEB | EFG F aFd | d Durante este ejercicio, la gramtica ir sufriendo modificaciones que en algunos casos mantendr a su lenguaje intacto y en otras lo alterar.
E entre medio, la cual todava no sabemos si es generadora. Qu recursivo, eh? Pues bueno, la recursin llega hasta ah: No sabemos si E es generador y no hay ninguna otra produccin de E que nos ayude a verificar esto, as que la primera produccin no nos sirve para determinar a E como un smbolo generador, y como no podemos verificar que E es un smbolo generador, entonces lo consideramos como un smbolo NO generador. Procedemos ahora a eliminar las variables E y G de la gramtica y a todas las producciones en las que estn presentes. O sea, eliminamos S EDF , B ECd, C AaE, E aaEB y E EF. La gramtica queda como sigue: S A | BCa | aDcd A aAb | c B CD | b | Ad C Cc | Bb | D aDd | Dd | F aFd | d Puede que al lector le importe saber que no se altera el lenguaje de la gramtica cuando se eliminan los smbolos no generadores.
Eliminando Producciones
Ahora viene un paso un poco ms difcil. La eliminacin de producciones consiste principalmente en eliminar las producciones de la forma X . Cuando uno haga esto, lo que tendr que hacer es contemplar la posibilidad de que, en donde antes apareca la variable X, sta ahora podr aparecer o no aparecer, ya que en una estar jugando el papel de ser el string vaco y en la otra se estar siendo otra cosa. Ah! Ya estamos listos entonces! Bueno, no del todo: Qu pasa si una variable tiene una produccin que est compuesta de varios smbolos que pueden ser reemplazables por el string vaco? Por ejemplo, digamos que tenemos Y X1X2X3...Xn, donde todos los Xi pueden ser el string . Entonces nos quedara una cosa as: Y ..., que se puede simplificar por Y . Aqu vemos que Y tambin puede generar al string vaco. Entonces vamos a definir a los smbolos Anulables. Un smbolo anulable Y va a ser aquel que tenga entre sus producciones a la produccin Y o tambin aquel que tenga por lo menos una produccin en donde todas las variables involucradas son anulables a su vez. Viendo nuestro ejemplo, podemos identificar rpidamente a dos variables que son smbolos anulables: las variables C y D, ya que ambas tienen la produccin de la forma Y . Pero ojo, que no son las nicas variables anulables. Tambin est B que tiene la produccin B CD, la cual est compuesta enteramente por smbolos anulables. Bien, procedamos a eliminar las producciones . Cmo hacemos esto? Muy fcil: en cada produccin en la que estaban presentes uno o ms smbolos anulables, vemos todas las combinaciones en las que cada una de dichas variables pudiera estar presente o no. Por ejemplo, si tenemos la produccin
Y abX1, donde X1 es anulable, entonces se generan las producciones Y abX1 y Y ab, una en donde X1 est presente y otra en la que no. Veamos el caso para producciones con dos y tres variables anulables: Y aX1bbX2 => Y aX1bbX2 | aX1bb | abbX2 | abb Y cX1X2ddX3a => Y cX1X2ddX3a | cX1X2dda | cX1ddX3a | cX2ddX3a | cX1dda | cX2dda | cddX3a | cdda En general, si tenemos una produccin con n smbolos anulables, tendremos que reemplazar esa produccin con a lo ms 2n producciones. En nuestro caso, la gramtica quedara como sigue: S A | BCa | Ba | Ca | a | aDcd | acd A aAb | c B CD | C | D | b | Ad C Cc | c | Bb | b D aDd | ad | Dd | d Miren como de repente ha crecido nuestra querida gramtica. No han aparecido nuevas variables, pero s surgieron ms producciones. Pero esto no se detiene aqu. Ojo, que ahora s que se puede haber alterado el lenguaje. Si nuestra gramtica inicial era capaz de generar el string vaco, ahora no lo podr generar.
que tendrn una nica produccin (la produccin de dicho smbolo). En nuestro caso, hay que crear 4 nuevas variables, una para cada smbolo terminal: S A1AB1 | c | BCA1 | BA1 | CA1 | a | A1DC1D1 | A1C1D1 A A1AB1 | c B CD | CC1 | c | BB1 | b | A1DD1 | A1D1 | DD1 | d | AD1 C CC1 | c | BB1 | b D A1DD1 | A1D1 | DD1 | d A1 a B1 b C1 c D1 d Este tipo de modificaciones no altera el lenguaje de la gramtica.
Dejamos el smbolo original a la izquierda de cada lnea para que se entienda cul fue la variable enumerada que reemplaz a cada variable. Ntese que cambiamos de orden a la variable A, al ponerla por debajo de la variable D. El propsito de estas alteraciones en el orden original tienen como fin que, al proceder con la enumeracin, en las producciones resultantes quede la menor cantidad de producciones Xi Xj, en donde i sea mayor que j. 2. Eliminamos la recursin inmediata a la izquierda y la recursin a la izquierda. Qu se entiende por recursin inmediata a la izquierda? Cuando tenemos una produccin de la forma X X, decimos que X es tiene recursividad inmediara por la izquierda. Cuando tenemos por lo menos una produccin de la forma X Y, y la variable Y tiene por lo menos una produccin de la forma YX decimos que X recursividad por la izquierda. Cmo eliminamos la recursin por la izquierda? Primero reemplazamos en las producciones de X todas las apariciones de Y por aquellas producciones de Y que no sean inmediatamente recursivas a la izquierda para Y. Con esto logramos hacer que X tenga slo producciones inmediatamente recursivas por la izquierda. Luego, supongamos que X tiene las siguientes producciones: X X1 | X2 | ... | Xn | 1 | 2 | ... | m Donde las producciones j no son recursivas por la izquierda. Ahora creamos una variable auxiliar X' y realizamos las siguientes transformaciones: X 1 | 2 | ... | m | 1X' | 2X' | ... | mX' X' 1 | 2 | ... | nX' | 1X' | 2X' | ... | nX' En nuestro caso, las variables que tienen producciones inmediatamente recursivas por la izquierda son X6 , X8 y X9, debido a sus producciones X6 X6X12, X8 X8X13 y X9 X9X14. Tambin tenemos la produccin X8X6X12 que es recursiva a la izquierda para la variable X6, y las producciones X6X8X9 y X6X8X13 que son recursivas a la izquierda para la variable X8. Procedemos a dejar a ambas variables nicamente con recursividad inmediata a la izquierda: 1) Reemplazando a X8 por sus producciones no recursivas a la izquierda, las producciones X6 X8X9 | X8X13 | c | X6X12 | b | X11X7 | X11X14 | X9X14 | d | X10X14 se transforman en: X6 cX9 | X6X12X9 | bX9 | cX13 | X6X12X13 | bX13 | c | X6X12 | b | X11X7 | X11X14 | X9X14 | d | X10X14 Ntese que no reemplazamos a X8 por su produccin X8X8X13, ya que esta produccin es recursiva por la izquierda para X8.
2) Reemplazando a X6 por sus producciones no recursivas a la izquierda, las producciones X8 X8X13 | c | X6X12 | b se transforman en: X8 X8X13 | c | X8X9X12 | X8X13X12 | cX12 | bX12 | X11X7X12 | X11X14X12 | X9X14X12 | dX12 | X10X14X12 | b Aqu tampoco reemplazamos a X6 por su produccin X6 X6X12, ya que esta produccin es recursiva por la izquierda para X6. Ahora que solamente tenemos recursividad inmediata por la izquierda, procedemos a realizar las correspondientes transformaciones: 1) Las producciones X6 cX9 | X6X12X9 | bX9 | cX13 | X6X12X13 | bX13 | c | X6X12 | b | X11X7 | X11X14 | X9X14 | d | X10X14 se transforman en: X6 cX9 | bX9 | cX13 | bX13 | c | b | X11X7 | X11X14 | X9X14 | d | X10X14 | cX9X6.1 | bX9X6.1 | cX13X6.1 | bX13X6.1 | cX6.1 | bX6.1 | X11X7X6.1 | X11X14X6.1 | X9X14X6.1 | dX6.1 | X10X14X6.1 X6.1 X12X9 | X12X13 | X12 | X12X9X6.1 | X12X13X6.1 | X12X6.1 2) Las producciones X8 X8X13 | c | X8X9X12 | X8X13X12 | cX12 | bX12 | X11X7X12 | X11X14X12 | X9X14X12 | dX12 | X10X14X12 | b se transforman en: X8 c | cX12 | bX12 | X11X7X12 | X11X14X12 | X9X14X12 | dX12 | X10X14X12 | b | cX8.1 | cX12X8.1 | bX12X8.1 | X11X7X12X8.1 | X11X14X12X8.1 | X9X14X12X8.1 | dX12X8.1 | X10X14X12X8.1 | bX8.1 X8.1 X13 | X9X12 | X13X12 | X13X8.1 | X9X12X8.1 | X13X12X8.1 3) Y las producciones X9 X11X7 | X11X14 | X9X14 | d se transforman en: X9 X11X7 | X11X14 | d | X11X7X9.1 | X11X14X9.1 | dX9.1 X9.1 X14 | X14X9.1 Nuestra gramtica, libre de recursividad por la izquierda, queda como sigue: X1 X2 X3 X4 X5 X6 X11X2 | c | X6X3 | X6X11 | X8X11 | a | X11X4 | X11X5 X10X12 X8X11 X9X5 X13 X14 cX9 | bX9 | cX13 | bX13 | c | b | X11X7 | X11X14 | X9X14 | d | X10X14 | cX9X6.1 | bX9X6.1 | cX13X6.1 | bX13X6.1 | cX6.1 | bX6.1 | X11X7X6.1 | X11X14X6.1 | X9X14X6.1 | dX6.1 | X10X14X6.1 X12X9 | X12X13 | X12 | X12X9X6.1 | X12X13X6.1 | X12X6.1 X9X12 c | cX12 | bX12 | X11X7X12 | X11X14X12 | X9X14X12 | dX12 | X10X14X12 | b | cX8.1 | cX12X8.1 | bX12X8.1 | X11X7X12X8.1 | X11X14X12X8.1 | X9X14X12X8.1 | dX12X8.1 | X10X14X12X8.1 | bX8.1 X13 | X9X12 | X13X12 | X13X8.1 | X9X12X8.1 | X13X12X8.1 X11X7 | X11X14 | d | X11X7X9.1 | X11X14X9.1 | dX9.1 X14 | X14X9.1 X11X2 | c a b c d
3. En nuestro tercer paso, eliminaremos todas las producciones de la forma X i Xj, en donde i es mayor que j. Para hacer esto, reemplararemos a Xj por todas sus producciones. Si al reemplazar aparecen otras producciones de esta forma, repetimos este paso, hasta que no queden ms producciones en donde la primera variable de la produccin tenga un ndice menor al de la variable de la cabeza de la produccin. En nuestro caso, no hay ninguna produccin de este tipo, pero vamos a mostrar unas producciones de ejemplo para ilustrar el proceso: X9 X11X7 | X11X14 | d | X11X7X9.1 | X11X14X9.1 | dX9.1 X10 X11X2 | c | X9X11X6 En este ejemplo, tenemos la produccin X10 X9X11X6 en la que la variable de la izquierda de la produccin (X9) tiene un ndice menor al de la variable de la cabeza de la produccin (X 10). Reemplazando X9 por sus correspondientes producciones nos queda:
X10 X11X2 | c | X11X7X11X6 | X11X14X11X6 | dX11X6 | X11X7X9.1X11X6 | X11X14X9.1X11X6 | dX9.1X11X6 4. En el ltimo paso, reemplazamos todas las producciones en las que haya una variable al principio de la produccin (no importa el ndice que tenga) por las producciones de dicha variable que empiecen con algn smbolo terminal. Este proceso se realiza empezando por las ltimas variables de la gramtica y luego se contina el proceso de reemplazo hacia arriba hasta llegar a las producciones de la variable de inicio. En nuestra gramtica, partiramos con las producciones de la variable X10 (ya que X11, X12, X13 y X14 tienen producciones en las que slo hay involucrados smbolos terminales). La cosa nos quedara as: X10 X11X2 | c => X10 aX2 | c Luego continuaramos con X9.1: X9.1 X14 | X14X9.1 => X9.1 d | dX9.1 El proceso no presenta mayor dificultad, hasta que llegamos a X8.1, en donde aparecen las producciones X8.1 X9X12 y X8.1 X9X12X8.1, que no comienzan con X11, X12, X13 o X14. Pero no importa, ya que todas las producciones de X9 para estas alturas del proceso han sido modificadas para que empiecen con un smbolo terminal, as que reemplazamos X9 directamente con sus producciones: Esto: X8.1 X13 | X9X12 | X13X12 | X13X8.1 | X9X12X8.1 | X13X12X8.1 Queda como esto: X8.1 c | aX7X12 | aX14X12 | dX12 | aX7X9.1X12 | aX14X9.1X12 | dX9.1X12 | cX12 | cX8.1 | aX7X12X8.1 | aX14X12X8.1 | dX12X8.1 | aX7X9.1X12X8.1 | aX14X9.1X12X8.1 | dX9.1X12X8.1 | cX12X8.1 El proceso contina as sin mayores complicaciones, hasta que llegamos a la siguiente gramtica en forma normal de Greibach: X1 aX2 | c | cX9X3 | bX9X3 | cX13X3 | bX13X3 | cX3 | bX3 | aX7X3 | aX14X3 | aX7X14X3 | aX14X14X3 | dX14X3 | aX7X9.1X14X3 | aX14X9.1X14X3 | dX9.1X14X3 | dX3 | aX2X14X3 | cX14X3 | cX9X6.1X3 | bX9X6.1X3 | cX13X6.1X3 | bX13X6.1X3 | cX6.1X3 | bX6.1X3 | aX7X6.1X3 | aX14X6.1X3 | aX7X14X6.1X3 | aX14X14X6.1X3 | dX14X6.1X3 | aX7X9.1X14X6.1X3 | aX14X9.1X14X6.1X3 | dX9.1X14X6.1X3 | dX6.1X3 | aX2X14X6.1X3 | cX14X6.1X14X6.1X3 | cX9X11 | bX9X11 | cX13X11 | bX13X11 | cX11 | bX11 | aX7X11 | aX14X11 | aX7X14X11 | aX14X14X11 | dX14X11 | aX7X9.1X14X11 | aX14X9.1X14X11 | dX9.1X14X11 | dX11 | aX2X14X11 | cX14X11 | cX9X6.1X11 | bX9X6.1X11 | cX13X6.1X11 | bX13X6.1X11 | cX6.1X11 | bX6.1X11 | aX7X6.1X11 | aX14X6.1X11 | aX7X14X6.1X11 | aX14X14X6.1X11 | dX14X6.1X11 | aX7X9.1X14X6.1X11 | aX14X9.1X14X6.1X11 | dX9.1X14X6.1X11 | dX6.1X11 | aX2X14X6.1X11 | cX14X6.1X14X6.1X11 | cX11 | cX12X11 | bX12X11 | aX7X12X11 | aX14X12X11 | aX7X14X12X11 | aX14X14X12X11 | dX14X12X11 | aX7X9.1X14X12X11 | aX14X9.1X14X12X11 | dX9.1X14X12X11 | dX12X11 | aX2X14X12X11 | cX14X12X11 | bX11 | cX8.1X11 | cX12X8.1X11 | bX12X8.1X11 | aX7X12X8.1X11 | aX14X12X8.1X11 | aX14X12X8.1X11 | dX12X8.1X11 | aX2X14X12X8.1X11 | cX14X12X8.1X11 | bX8.1X11 | a | aX4 | aX5 X2 aX2X12 | cX12 X3 cX11 | cX12X11 | bX12X11 | aX7X12X11 | aX14X12X11 | aX7X14X12X11 | aX14X14X12X11 | dX14X12X11 | aX7X9.1X14X12X11 | aX14X9.1X14X12X11 | dX9.1X14X12X11 | dX12X11 | aX2X14X12X11 | cX14X12X11 | bX11 | cX8.1X11 | cX12X8.1X11 | bX12X8.1X11 | aX7X12X8.1X11 | aX14X12X8.1X11 | aX14X12X8.1X11 | dX12X8.1X11 | aX2X14X12X8.1X11 | cX14X12X8.1X11 | bX8.1X11 X4 aX7X5 | aX14X5 | dX5 | aX7X9.1X5 | aX14X9.1X5 | dX9.1X5 X5 c X14 X6 cX9 | bX9 | cX13 | bX13 | c | b | aX7 | aX14 | aX7X14 | aX14X14 | dX14 | aX7X9.1X14 | aX14X9.1X14 | dX9.1X14 | d | aX2X14 | cX14 | cX9X6.1 | bX9X6.1 | cX13X6.1 | bX13X6.1 | cX6.1 | bX6.1 | aX7X6.1 | aX14X6.1 | aX7X14X6.1 | aX14X14X6.1 | dX14X6.1 | aX7X9.1X14X6.1 | aX14X9.1X14X6.1 | dX9.1X14X6.1 | dX6.1 | aX2X14X6.1 | cX14X6.1X14X6.1 X6.1 bX9 | bX13 | b | bX9X6.1 | bX13X6.1 | bX6.1 X7 aX7X12 | aX14X12 | dX12 | aX7X9.1X12 | aX14X9.1X12 | dX9.1X12 X8 c | cX12 | bX12 | aX7X12 | aX14X12 | aX7X14X12 | aX14X14X12 | dX14X12 | aX7X9.1X14X12 | aX14X9.1X14X12 | dX9.1X14X12 | dX12 | aX2X14X12 | cX14X12 | b | cX8.1 | cX12X8.1 | bX12X8.1 | aX7X12X8.1 | aX14X12X8.1 | aX14X12X8.1 | dX12X8.1 | aX2X14X12X8.1 | cX14X12X8.1 | bX8.1 X8.1 c | aX7X12 | aX14X12 | dX12 | aX7X9.1X12 | aX14X9.1X12 | dX9.1X12 | cX12 | cX8.1 | aX7X12X8.1 | aX14X12X8.1 | dX12X8.1 | aX7X9.1X12X8.1 | aX14X9.1X12X8.1 | dX9.1X12X8.1 | cX12X8.1 X9 aX7 | aX14 | d | aX7X9.1 | aX14X9.1 | dX9.1 X9.1 d | dX9.1 X10 aX2 | c X11 a X12 b X13 c X14 d DCC/2006.04.24