Saltar al contenido

¿Conversión de la gramática a la forma normal de Chomsky?

Lucián, miembro de este staff, nos hizo el favor de escribir este artículo ya que controla perfectamente este tema.

Solución:

Wikipedia dice:

En informática, se dice que una gramática libre de contexto está en la forma normal de Chomsky si todas sus reglas de producción tienen la forma:

  • A -> antes de Cristo, o
  • A -> α, o
  • S -> ε

donde A, B, C son símbolos no terminales, α es un símbolo terminal, S es el símbolo de inicio y ε es el vacío string. Además, tampoco B ni C puede ser el símbolo de inicio.

Continuando con su trabajo:

S0 -> S
S -> AB | aB | B
A -> aab
B -> bbA | bb

En lugar de usar | para denotar diferentes opciones, divida una regla en varias reglas.

S0 -> S
S -> AB
S -> aB
S -> B
A -> aab
B -> bbA
B -> bb

Crea nuevas reglas Y -> a y Z -> b porque los necesitaremos pronto.

S0 -> S
S -> AB
S -> aB
S -> B
A -> aab
B -> bbA
B -> bb
Y -> a
Z -> b

S -> aB no es de la forma S -> BC porque a es una terminal. Así que cambia a en Y:

S0 -> S
S -> AB
S -> YB
S -> B
A -> aab
B -> bbA
B -> bb
Y -> a
Z -> b

Haz lo mismo con el B -> bb regla:

S0 -> S
S -> AB
S -> YB
S -> B
A -> aab
B -> bbA
B -> ZZ
Y -> a
Z -> b

Para A -> aab, crear C -> YY; por B -> bbA, crear D -> ZZ:

S0 -> S
S -> AB
S -> YB
S -> B
A -> CZ
C -> YY
B -> DA
D -> ZZ
B -> ZZ
Y -> a
Z -> b

Para S -> B, duplica la única regla donde S ocurre en el lado derecho e inserta la regla:

S0 -> B
S0 -> S
S -> AB
S -> YB
A -> CZ
C -> YY
B -> DA
D -> ZZ
B -> ZZ
Y -> a
Z -> b

Lidiar con las reglas S0 -> B y S0 -> S uniendo el lado derecho al lado izquierdo de otras reglas. Además, elimine las reglas huérfanas (donde el símbolo LHS nunca se usa en RHS):

S0 -> DA
S0 -> ZZ
S0 -> AB
S0 -> YB
A -> CZ
C -> YY
B -> DA
D -> ZZ
B -> ZZ
Y -> a
Z -> b

Y hemos terminado. ¡Uf!

Sin entrar en demasiada teoría y pruebas (puede ver esto en Wikipedia), hay algunas cosas que debe hacer al convertir una gramática libre de contexto a la forma normal de Chomsky, generalmente debe realizar cuatro transformaciones de forma normal. Primero, necesita identificar todas las variables que pueden producir el vacío string(lambda / epsilon), directa o indirectamente – (forma sin lambda). En segundo lugar, debe eliminar las producciones unitarias (forma sin unidades). En tercer lugar, debe encontrar todas las variables activas / útiles (utilidad). Cuatro, debe encontrar todos los símbolos alcanzables (Accesible). En cada paso, es posible que tenga o no una nueva gramática. Entonces, para tu problema, esto es lo que se me ocurrió …


Gramática libre de contexto

G(Variables =  A B S 
Start = S 
Alphabet =  a b lamda

Production Rules =   
A  ->   )

Eliminar lambda / épsilon

ERRASABLE(G) =  A 

G(Variables =  A S B 
Start = S
Alphabet =  a b 

Production Rules =   AB   )

Eliminar las producciones de la unidad

UNIT(A)  A 
UNIT(B)  B 
UNIT(S)  B S 
G (Variables =  A B S 
Start = S 
Alphabet =  a b 

Production Rules =   
A  ->  )

Determinar símbolos en vivo

LIVE(G) =  b A B S a 

G(Variables =  A B S 
Start = S
Alphabet =  a b 

Production Rules =  
S  ->  )

Quitar inalcanzable

REACHABLE (G) =  b A B S a 
G(Variables =  A B S 
Start = S 
Alphabet =  a b 

Production Rules =    )

Reemplaza todo mixed cadenas con no terminales sólidos

G( Variables =  A S B R I 
Start = S
Alphabet =  a b 

Production Rules =   
B  ->  )

Forma normal de Chomsky

G( Variables =  V A B S R L I Z 
Start = S 
Alphabet =  a b 

Production Rules =   
I  ->  )

Si estás de acuerdo, eres capaz de dejar una división acerca de qué te ha impresionado de este enunciado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *