You are on page 1of 11

TEORÍA DE AUTÓMATAS Y LENGUAJES

FORMALES
Práctica 5 - Simplificación de gramáticas
incontextuales
1. Objetivos

2. Representación de los datos en Mathematica

3. Eliminación de símbolos inútiles

3.1. Símbolos generativos

3.2. Símbolos alcanzables

3.3. Símbolos inútiles

4. Eliminación de producciones vacías

5. Eliminación de producciones unitarias

6. Simplificación general de gramáticas

1. Objetivos.
La presente práctica presenta unos algoritmos que permiten obtener gramáticas
incontextuales (casi) equivalentes a una dada con determinadas propiedades
estructurales. La simplificación de gramáticas incontextuales afecta a tres aspectos
distintos pero interrelacionados :

z Los símbolos inútiles de la gramática, que no inciden en la capacidad generativa a


la misma y que, por lo tanto, pueden ser eliminados sin variar el lenguaje de la
gramática.
z Las producciones vacías, A -> λ, que como veremos, al ser eliminadas, provocan
una transformación en el resto de producciones cuyo efecto es una gramática que
define el mismo lenguaje menos λ.
z Las producciones unitarias, A→B que, al igual que en el caso anterior, su
eliminación produce una transformación en la gramática, obteniendo, en este caso,
una gramática equivalente.

Los puntos que seguiremos para abordar las transformaciones anteriores son los
siguientes :
z Formulación de los algoritmos de transformación en cada caso.
z Integración de los algoritmos anteriores para finalmente obtener gramáticas
simplificadas

2. Representación de los datos en Mathematica


En una gramática incontextual G=(N,T,P,S) adoptaremos el siguiente convenio, las letras
mayúsculas denotaran símbolos auxiliares, el resto de símbolos, excepto → y |, denotarán
símbolos terminales. De este modo, para especificar la gramática basta dar el conjunto de
producciones de la misma.

Una cadena la representaremos por la lista asociada a sus símbolos (ej. abcd se representa
por {a,b,c,d} y, en el caso de que sea la cadena vacía λ, se representará por {}). El
conjunto de A-producciones se representará por una lista con dos elementos, el primero
de ellos será el propio símbolo A y el segundo será a su vez una lista que contendrá como
elementos las listas asociadas a los consecuentes de las producciones. Veamos el
siguiente ejemplo

A → ABa | λ | abB
se representa por la lista
{A,{{A,B,a},{},{a,b,B}}}

Así , el conjunto de producciones P se representa por la lista de todas las A-


producciones. De esta forma, para la gramática

S → ab | λ | Ab
A → bba | S
se representará como
{{S,{{a,b},{},{A,b}}},{A,{{b,b,a},{S}}}}

Finalmente la gramática completamente especificada, se establece como una lista con


cuatro elementos { N, T, P, S }. Así, en el ejemplo anterior, la gramática completamente
especificada sería la lista

{ {S,A}, {a,b}, {{S,{{a,b},{},{A,b}}},{A,{{b,b,a},{S}}}}, S }

3. Eliminación de símbolos inútiles.


3.1. Símbolos generativos.

Los símbolos generativos asociados a una gramática incontextual son aquellos capaces de
generar en uno o más pasos de derivación cadenas formadas sólo por símbolos
terminales. El objetivo de este primer apartado consiste en detectar los símbolos
generativos de una gramática incontextual y eliminar de la misma aquellos símbolos que
no los sean. El siguiente algoritmo nos proporciona el esquema de cálculo de los
símbolos auxiliares generativos de una gramática incontextual.

Algoritmo 1: Cálculo de los símbolos generativos de


una gramática
Entrada: G=(N,T,P,S)
Salida: gen, una lista de los símbolos generativos de la
gramática
Método:

gen={}
gen2=T
Repetir
gen = { A ∈ N : A → x ∈ P, x ∈ gen2*}
gen = gen - gen2
gen2 = gen ∪ gen2
hasta gen = {}
gen=gen2 - T

fin_del_Método

Actividad 1
Dada una gramática incontextual {N,T,P,S} desarrollar un módulo Mathematica que
detecte los símbolos auxiliares que contienen producciones formadas únicamente por
símbolos terminales.

Actividad 2
Dada una gramática incontextual {N,T,P,S} desarrollar un módulo Mathematica que,
basándose en el Algoritmo 1, detecte los símbolos generativos de la gramática.

Algoritmo 2: Eliminación de los símbolos no


generativos
Entrada: G=(N,T,P,S) y gen una lista de los símbolos
generativos de G
Salida: G1=(N1,T,P1,S) sin símbolos no generativos,
excepto posiblemente S.
Método:

(* Construcción de G1 *)
N1 = gen ∪ { S }
P1 = { A → x ∈ P : A ∈ gen, x ∈ (gen ∪ T)*}

fin_del_Método
Actividad 3
Desarrollar un módulo Mathematica que, tomando como entrada una gramática
{N,T,P,S} y la lista de símbolos generativos de la misma gen, proporcione como salida
una gramática equivalente sin símbolos generativos de acuerdo con el Algoritmo 2.

3.2. Símbolos alcanzables.

Dada una gramática incontextual, los símbolos alcanzables de la misma son aquellos que
aparecen en cualquier derivación que se produce a partir del axioma. El objetivo de este
segundo apartado de la práctica es la detección de los símbolos alcanzables de una
gramática incontextual. El siguiente algoritmo proporciona un esquema de cálculo de los
símbolos alcanzables de una gramática incontextual

Algoritmo 3: Cálculo de los símbolos alcanzables


Entrada: G=(N,T,P,S)
Salida: alc, una lista con los símbolos auxiliares y terminales alcanzables de la
gramática
Método:

alc={S}
aux1={S}
Repetir
aux2 = { a ∈ N ∪ T : ∃ A∈ aux1, ∃ α,β ∈(N ∪ T)* : A → α a β ∈
P}
aux1 = aux2 - (alc ∪ T)
alc = alc ∪ aux2
hasta aux1 = {}

fin_del_Método

Actividad 4
Desarrollar un módulo Mathematica que, tomando como entrada una gramática
{N,T,P,S} proporcione como salida una lista alc de los símbolos alcanzables, terminales
y auxiliares, de la gramática de entrada

Algoritmo 4: Eliminación de los símbolos no


alcanzables
Entrada: G=(N,T,P,S) y alc una lista de los símbolos
alcanzables de G
Salida: G1=(N1,T1,P1,S) sin símbolos no alcanzables.
Método:

(* Construcción de G1 *)
N1 = alc ∩ N
T1 = alc ∩ T
P1 = { A → α∈ P : A ∈ N1 }

fin_del_Método

Actividad 5
Desarrollar un módulo Mathematica que, tomando como entrada una gramática
{N,T,P,S} y una lista de los símbolos alcanzables de la misma, alc, proporcione como
salida una gramática equivalente sin símbolos no alcanzables de acuerdo con el algoritmo
4.

3.2. Símbolos inútiles.

La eliminación de los símbolos inútiles de una gramática se basa en la aplicación


secuencial de los algoritmos 2 y 4 propuestos anteriormente. Nótese que la aplicación en
orden contrario no garantiza en general la completa eliminación de este tipo de símbolos.

Ejemplo 1 Sea la gramática G definida por las siguientes producciones

S → aEBC | SA | A
A → AbA | BB
B → BBb | a | CC
C → aCD | CbC
D → bDD | AaC
E → a | Ea

Resultado del Algoritmo 1

Símbolos generativos : {S,A,B,E}

Como resultado del Algoritmo 2 se obtiene la siguiente gramática

S → SA | A
A → AbA | BB
B → BBb | a
E → a | Ea

Resultado del Algoritmo 3


Símbolos alcanzables : {S,A,B,a,b}

Como resultado del Algoritmo 4 se obtiene la gramática

S → SA | A
A → AbA | BB
B → BBb | a

Actividad 6
Integrar los módulos desarrollados anteriormente para desarrollar un módulo
Mathematica que, tomando como entrada una gramática {N,T,P,S}, proporcione como
salida una gramática equivalente sin símbolos inútiles.

4. Eliminación de producciones vacías.


Las producciones vacías, A → λ, en una gramática sólo son útiles en el caso de generar
la cadena vacía. En el resto de derivaciones de una gramática incontextual, este tipo de
producciones provocan el efecto de alargar innecesariamente el número de pasos de
derivación necesarios para generar cualquier cadena distinta de la vacía. Es por eso, por
lo que interesa eliminar el conjunto de producciones vacías de una gramática sin perder
su capacidad generativa, con la excepción de la cadena vacía. Para la eliminación de las
producciones vacías se debe calcular en primer lugar el conjunto de símbolos anulables,
es decir, símbolos que, en uno o más pasos de derivación, son capaces de generar la
cadena vacía. El siguiente algoritmo, proporciona un esquema de cálculo de los símbolos
anulables de una gramática.

Algoritmo 5: Cálculo de los símbolos anulables


Entrada: G=(N,T,P,S)
Salida: Anulables, una lista con los símbolos anulables de la gramática
Método:

Anulables={}
Repetir
aux = { A ∈ N - Anulables : ∃ x ∈ Anulables*, (A → x) ∈ P }
Anulables = Anulables ∪ aux
hasta aux = {}

fin_del_Método

Actividad 7
Desarrollar un módulo Mathematica que, tomando como entrada una gramática
{N,T,P,S}, detecte aquellos símbolos auxiliares que tienen la producción vacía (A → λ).

Actividad 8
Desarrollar un módulo Mathematica que, tomando como entrada una gramática
{N,T,P,S}, detecte los símbolos anulables de la misma. Para ello, siga el esquema de
cálculo del algoritmo 5.

*
Sea la sustitución g: (N ∪ T)* → 2(N ∪ T) definida como sigue

z Si x ∈ (N ∪ T) - Anulables, g(x) = {x}

z Si x ∈ Anulables, g(x) = { x, λ }

Por ejemplo si z=AaAB y únicamente A es anulable, entonces

g(z) = g(A) g(a) g(A) g(B) = {A, λ } { a } { A, λ} { B } = { AaAB, AaB, aAB, aB }

Definimos para toda cadena z ∈ (N ∪ T)*, f(z) = g(z) - { λ }

Actividad 9
Desarrolle un módulo Mathematica que, tomando como entrada dos listas de símbolos o
cadena vacía l y m, proporcione como salida una lista con las cadenas producto de la
concatenación de l y m. Por ejemplo, si l = {A,{},B} y m = {a,B} entonces lm = {{A,a},
{A,B},{a}, {B},{B,a},{B,B}}

Algoritmo 6: Eliminación de producciones vacías


Entrada: G=(N,T,P,S) y Anulables una lista de los
símbolos anulables de G
Salida: G1=(N,T,P1,S) sin producciones vacías, con L
(G1) = L(G) - { λ }.
Método:

(* Construcción del conjunto P1 *)


P1 = { A → x : ∃ (A → z)∈ P, x ∈ f(z) }

fin_del_Método

Actividad 10
Desarrollar un módulo Mathematica que, tomando como entrada una gramática
{N,T,P,S} y una lista de los símbolos anulables de la misma Anulables, proporcione
como salida una gramática (casi) equivalente sin producciones vacías.

Ejemplo 2 Sea la gramática G definida por las siguientes producciones

S → SS | AaB
A → aAB | BB
B → aB | λ
Resultado del Algoritmo 5

Anulables = {A,B}

Resultado del Algoritmo 6

S → SS | AaB | aB | Aa | a
A → aAB | aB | aA | a | BB | B
B → aB | a

5. Eliminación de producciones unitarias.


Las producciones unitarias en las gramáticas incontextuales, A → B, provocan el efecto
de aumentar el número de pasos de derivación en la generación de las cadenas de la
misma. Es por ello que su eliminación resulta interesante. Para realizar la eliminación de
producciones unitarias, en primer lugar hay que realizar el cálculo de la alcanzabilidad de
tales producciones a partir de un símbolo auxiliar dado. El siguiente algoritmo
proporciona el esquema de cálculo de aquellos símbolos que se pueden alcanzar a partir
de un símbolo auxiliar dado, mediante la utilización de producciones unitarias.

Algoritmo 7: Cálculo de los símbolos alcanzables a partir del símbolo A


mediante producciones unitarias
Entrada: G=(N,T,P,S) y el símbolo A ∈ N
Salida: C(A), una lista con los símbolos alcanzables a partir de A mediante
producciones unitarias
Método:

C(A)={A}
aux1={A}
Repetir
aux2 = ∪B ∈ aux { C ∈ N : (B → C) ∈ P }
1
aux1 = aux2 - C(A)
C(A) = C(A) ∪ aux1
hasta aux1 = {}

fin_del_Método

Actividad 11
Desarrollar un módulo Mathematica que, tomando como entrada una gramática
{N,T,P,S} y un símbolo auxiliar A, proporcione como salida una lista que contenga el
conjunto de símbolos C(A). Aplicar en este caso el esquema de cálculo expuesto en el
algoritmo 7.
Actividad 12
Desarrollar un módulo Mathematica que, tomando como entrada una gramática
{N,T,P,S}, proporcione como salida una lista que contenga los conjunto de símbolos C
(A) para cada símbolo auxiliar A. La lista de salida debe tener el formato C(N)= {{A,C
(A)}, {B,C(B)}, ... }.

Algoritmo 8: Eliminación de producciones unitarias


Entrada: G=(N,T,P,S) y C(A) para todo símbolo A∈ N
Salida: G1=(N,T,P1,S) sin producciones unitarias, con L(G1) = L(G).
Método:

(* Definimos la función f para todo símbolo auxiliar A, de forma que f


(A) = { x : A → x ∈ P, x no es un único símbolo auxiliar} *)
Definimos la función F de modo que F(A) = ∪B ∈ C(A) f(B)
(* Construcción del conjunto P1 *)
P1 = { A → x : x ∈ F(A) }

fin_del_Método

Actividad 13
Desarrollar un módulo Mathematica que, tomando como entrada una gramática
{N,T,P,S} y la lista de símbolos alcanzables a partir de cada símbolo auxiliar C(N)=
{{A,C(A)}, {B,C(B)} ... }, proporcione como salida una gramática equivalente sin
producciones unitarias.

Ejemplo 3 Sea la gramática G definida por las siguientes producciones

S → SS | aB A
A → aAA | B
B → aB | a

Resultado del Algoritmo 7

C(S) = {S,A,B}
C(A) = {A,B}
C(B) = {B}

Resultado del Algoritmo 8

S → SS | aB | aAA | a
A → aAA | aB | a
B → aB | a
6. Simplificación general de gramáticas.
Una vez vistos distintos aspectos en cuanto a transformaciones previas de una gramática,
nos proponemos abordar un proceso conjunto que permita obtener a partir de una
gramática otra equivalente (o casi equivalente) que esté totalmente simplificada, esto es
sin símbolos inútiles ni producciones unitarias ni producciones vacías. Para ello
proponemos un orden de ejecución de los distintos algoritmos ya formulados.

Sea G la gramática de partida

1 Eliminar las producciones vacías de G según el Algoritmo 6 y obtener G1.

2 A partir de G1 aplicar el Algoritmo 8 y obtener G2 que no tendrá ni


producciones unitarias ni producciones vacías.

3 A partir de G2 aplicar los Algoritmos 2 y 4 y eliminar los símbolos inútiles de la


gramática obteniendo como resultado G3 que estará totalmente simplificada.

Ejemplo 4 Sea la gramática G definida por las siguientes producciones

S → SS | CA
A → bAA | aC | B
B → aSS | BC
C → CC | λ

Primer paso : Eliminación de producciones vacías

Anulables = {C}

La gramática resultado es

S → SS | CA | A
A → bAA | aC | a | B
B → aSS | BC | B
C → CC | C

Segundo paso : Eliminación de producciones unitarias


La gramática resultado es

S → SS | CA | bAA | aC | a | aSS | BC
A → bAA | aC | a | aSS | BC
B → aSS | BC
C → CC
Tercer paso : Eliminación de símbolos inútiles y obtención de la gramática simplificada

S → SS | bAA | a | aSS
A → bAA | a | aSS

Actividad 14
Desarrollar un módulo Mathematica que a partir de una gramática de entrada obtenga
otra (casi) equivalente totalmente simplificada. Para ello, integrar los módulos
desarrollados en actividades anteriores.