7+propiedades+de+los++lenguajes+independientes+del+contexto

11

Click here to load reader

Upload: pedro-lopez

Post on 05-Aug-2015

122 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 7+Propiedades+de+Los++Lenguajes+Independientes+Del+Contexto

Capítulo 7: Propiedades de los lenguajes independientes del contexto. 7.1 Formas normales para las gramáticas independientes del contexto

7.1.1 Eliminación de símbolos inútiles 7.1.2 Cálculo de símbolos generadores y alcanzables 7.1.3 Eliminación de producciones-ε 7.1.4 Eliminación de las producciones unitarias 7.1.5 Forma Normal de Chomsky

7.2 El lema de bombeo para los lenguajes independientes del contexto 7.3 Propiedades de clausura de los lenguajes independientes del contexto 7.4 Propiedades de decisión de los LIC

Capítulo 7: Propiedades de los lenguajes independientes del contexto.

7.1 Formas normales para las gramáticas independientes del contexto

Todo LIC (sin ε) es generado por una GIC en la que todas las producciones son de la forma A→BC o A→a, donde A, B y C son variables y a es un símbolo terminal (forma normal de Chomsky).

Para llegar a ella, tenemos que:l. Eliminar los símbolos inútiles, aquellas variables o símbolos terminales que no aparecen en ninguna derivación de una cadena terminal que parta del símbolo inicial.2. Eliminar las producciones-ε, aquellas de la forma A→ε para alguna variable A.3. Eliminar las Producciones unitarias, aquellas de la forma A→B para A y B.

7.1.1 Eliminación de símbolos inútilesUn símbolo X es útil para una gramática G = (V, T, P, S) si existe alguna derivación de la forma , donde w

pertenece a T*. Observe que X puede ser V o T, y la forma sentencial αXβ puede ser la primera o la última en la derivación. Si X no es útil, decimos que es inútil. La omisión de los símbolos inútiles de una gramática no cambiará el lenguaje generado. El método para eliminar los símbolos inútiles identifica las dos cosas que un símbolo tiene que cumplir para resultar útil:

l. Decimos que X es generador si para alguna cadena terminal w. Todo símbolo terminal es generador, ya que w puede ser ese mismo símbolo terminal obtenido en cero pasos.2. Decimos que X es alcanzable si existe una derivación para algún α y β.

Un símbolo que es útil será generador y alcanzable. Si eliminamos los símbolos que no son generadores en primer lugar y luego eliminamos aquellos símbolos que no son alcanzables, tendremos sólo los símbolos útiles

Ejemplo 7.1. Considere la gramática: S→AB| a, A→b. Todos los símbolos excepto B son generadores; a y b se generan a sí mismos; S genera a y A genera b. Si eliminamos B, tenemos que eliminar la producción S → AB, quedando la gramática:

S→a A→bAhora comprobamos que sólo S y a son alcanzables a partir de S. Eliminando A y b sólo queda la producción S→a.

Dicha producción por sí misma es una gramática cuyo lenguaje es {a}, igual que el lenguaje de la gramática original.

Si primero comprobamos la alcanzabilidad, nos encontramos con que todos los símbolos de la gramática son alcanzables. Si luego eliminamos el símbolo B porque no es generador, obtenemos una gramática que todavía tiene símbolos inútiles, en concreto, A y b.

Teorema 7.2. Sea G = (V, T, P, S) una GIC y supongamos que L(G) ≠ Ø; es decir, G genera al menos una cadena. Sea G1 = (V1, T1, P1, S) la gramática que obtenemos mediante los siguientes pasos:

l. Primero eliminamos los símbolos no generadores y todas las producciones que impliquen a uno o más de dichos símbolos. Sea G2 = (V2, T2, P2, S) esta nueva gramática. Observe que S tiene que ser generador, ya que suponemos que L(G) tiene al menos una cadena.2. En segundo lugar, eliminamos todos los símbolos que no son alcanzables de la gramática G2.

Luego G1 no tiene ningún símbolo inútil, y L(G1) = L(G) .

7.1.2 Cálculo de símbolos generadores y alcanzables

Trataremos de saber cómo, para una gramática, calcular el conjunto de símbolos generadores y calcular el conjunto de símbolos alcanzables. Para ambos problemas, vamos a emplear el algoritmo que intenta descubrir los símbolos de dichos tipos. Si las construcciones inductivas apropiadas de estos conjuntos no consiguen descubrir un símbolo que sea generador o alcanzable, respectivamente, entonces el símbolo no es de ninguno de esos tipos.

1

Page 2: 7+Propiedades+de+Los++Lenguajes+Independientes+Del+Contexto

Sea G = (V, T, P, S) una gramática. Para calcular los símbolos generadores de G, realizamos la siguiente inducción.Base. Todo símbolo de T, es generador, ya que se genera a sí mismo.Paso inductivo. Supongamos que existe una producción A→α y que todo símbolo de α es generador. Entonces A es generador. Esta regla incluye el caso en que α = ε; todas las variables que tienen ε como cuerpo de una producción son generadoras.

Ejemplo 7.3. Considere la gramática del ejemplo 7.1. De acuerdo con el caso base, a y b son generadores. Según el paso inductivo, podemos utilizar la producción A→b para concluir que A es generador y podemos emplear la producción S→a para concluir que S es generador. El paso inductivo termina en dicho punto. No podemos utilizar la producción S→ AB, porque no se ha demostrado que B sea generador. Por tanto, el conjunto de símbolos generadores es {a, b, A, S}.

Teorema 7.4. El algoritmo anterior encuentra todos y sólo los símbolos generadores de G.

Consideremos ahora el algoritmo inductivo mediante el que determinaremos el conjunto de símbolos alcanzables para la gramática G = (V, T, P, S). De nuevo, podemos demostrar que cualquier símbolo que no añadamos al conjunto de símbolos alcanzables no es realmente alcanzable.

Ejemplo 7.5. Partimos de la gramática del ejemplo 7.1. De acuerdo con el caso base, S es alcanzable. Dado que S tiene cuerpos de producción AB y a, concluimos que A, B y a son alcanzables. B no tiene producciones, pero A tiene A→b. Por tanto, concluimos que b es alcanzable. Ahora no se puede añadir ningún símbolo más al conjunto de símbolos alcanzables, que es {S, A, B, a, b}.

Teorema 7.6. El algoritmo anterior determina todos (y sólo) los símbolos alcanzables de G.

7.1.3 Eliminación de producciones-ε

Ahora vamos a demostrar que las producciones-ε, aunque sean convenientes en muchos problemas de diseño de gramáticas, no son esenciales. Por supuesto, sin una producción que tenga un cuerpo ε, es imposible generar la cadena vacía como miembro del lenguaje. Por tanto, lo que realmente vamos a demostrar es que si el lenguaje L tiene una GIC, entonces L - {ε} tiene una GIC sin producciones-ε. Si ε no pertenece a L, entonces el propio L es L - {ε}, por lo que L tiene una GIC sin producciones-ε.

Hay que descubrir qué variables son "anulables". Una variable A es anulable si . Si A es anulable, entonces

cuando A aparece en el cuerpo de una producción, decimos que B→CAD, A puede (o no) generar ε. Construimos dos versiones de la producción, una sin A en el cuerpo (B→CD), que corresponde al caso en que A tendría que haberse empleado para generar ε, y el otro en el que A si está presente en (B→CAD). Si utilizamos la versión en la que aparece A, entonces no podemos permitir que A genere ε.

Sea G = (V, T, P, S) una GIC. Podemos encontrar todos los símbolos anulables de G mediante el siguiente algoritmo iterativo.

Base. Si A→ε es una producción de G, entonces A es anulable.Paso inductivo. Si existe una producción B→C1C2…Ck, donde cada Ci es anulable, entonces B es anulable. Observe que cada Ci tiene que ser una variable anulable, por lo que sólo hay que considerar las producciones cuyos cuerpos sean sólo variables.

Teorema 7.7. En cualquier gramática G, los únicos símbolos anulables son las variables encontradas por el algoritmo anterior.

Ahora proporcionamos la construcción de una gramática sin producciones-ε. Sea G = (V, T, P, S) una GIC. Determinamos todos los símbolos anulables de G. Construimos una nueva gramática G1 = (V, T, P1, S), cuyo conjunto de producciones P1 se determina como sigue.

Para cada producción A→X1X2…Xk de P, donde k ≥1, suponemos que m de los k Xi son símbolos anulables. La nueva gramática G1 tendrá 2m versiones de esta producción, donde los Xi anulables, en todas las posibles combinaciones están presentes o ausentes. Existe una excepción: si m = k, es decir, todos los símbolos son anulables, entonces no incluimos el caso en que todos los Xi están ausentes. Observe también que si una producción de la forma A→ε existe en P, no incluimos esta producción en P1.

Ejemplo 7.8. Considere la gramática S→AB, A→aAA| ε, B→bBB| ε. En primer lugar, determinamos los símbolos anulables. A y B son directamente anulables porque tienen producciones con ε como cuerpo. Entonces, determinamos que S

2

Page 3: 7+Propiedades+de+Los++Lenguajes+Independientes+Del+Contexto

es anulable, porque la producción S→AB tiene un cuerpo que consta sólo de símbolos anulables. Por tanto, estas tres variables son anulables.

Ahora construimos las producciones de la gramática G1. En primer lugar, consideramos S→AB. Todos los símbolos del cuerpo son anulables, por lo que existen cuatro formas en las que podemos elegir que A y B estén presentes o ausentes de forma independiente. Sin embargo, no podemos elegir que todos los símbolos estén ausentes, por lo que sólo existen tres producciones: S→AB| A| B.

A continuación consideramos la producción A→aAA. La segunda y tercera posiciones son símbolos anulables, por lo que de nuevo existen cuatro opciones de presencia o ausencia. En este caso, ninguna de las cuatro opciones es anulable, ya que el símbolo no anulable a estará presente en cualquier caso. Estas cuatro opciones dan las producciones: A→aAA| aA| aA| a.Las dos opciones intermedias generan la misma producción, ya que no importa qué A eliminemos si decidimos eliminar una de ellas. Por tanto, la gramática final G1 sólo tendrá tres producciones para A.

De forma similar, la producción B proporciona para G1: B→bBB| bB| b.

Las dos producciones-ε de G no generan nada para G1. Por tanto, G1 está constituido por las siguientes producciones: S→AB| A| B, A→aAA| aA| a, B→bBB| bB| b.

Concluimos este estudio sobre la eliminación de las producciones-ε demostrando que la construcción dada anteriormente no cambia el lenguaje, excepto porque ε ya no está presente si es que existía en el lenguaje de G.

Teorema 7.9. Si la gramática G1 se construye a partir de G mediante la construcción anterior para eliminar las producciones-ε, entonces L(Gl) = L(G) - {ε}.

7.1.4 Eliminación de las producciones unitarias

Una producción unitaria es una producción de la forma A→B, donde A y B son variables. Estas producciones pueden resultar útiles, por ejemplo, para crear una gramática no ambigua a partir de otra. La técnica que está garantizada para funcionar implica determinar en primer lugar todos aquellos pares de variables A y B tales que , utilizando sólo una secuencia de producciones unitarias.

Una vez que hayamos determinado dichos pares, podemos reemplazar cualquier secuencia de pasos de derivación en la que por una producción que utilice directamente la producción no unitaria Bn→α a partir de

A; es decir, A→α. Comenzamos viendo la construcción inductiva de los pares (A, B) tales que empleando sólo producciones unitarias. Denominamos a este tipo de pares par unitario.

Base. (A, A) es un par unitario para cualquier variable A. Es decir, en cero pasos.Paso Inductivo. Suponga que hemos determinado que (A, B) es un par unitario y que B→C es una producción, donde C es una variable. Luego (A, C) es un par unitario.

Ejemplo 7.10. Considere la gramática de la figura. El caso base nos proporciona los pares unitarios (E, E), (T, T), (F, F) y (I, I). Para el paso inductivo, podemos hacer las siguientes inferencias:

1. (E, E) y la producción E→T generan el par unitario (E, T).2. (E, T) y la producción T→F generan el par unitario (E, F).3. (E, F) y la producción F→I generan el par unitario (E, I). 4. (T, T) y la producción T→F generan el par unitario (T, F).5. (T, F) y la producción F→I generan el par unitario (T, I).6. (F, F) y la producción F→I generan el par unitario (F, I).

No pueden inferirse más pares. De hecho, estos diez pares representan todas las derivaciones que no usan nada más que producciones unitarias.

Existe una demostración sencilla de que el algoritmo propuesto proporciona todos los pares que deseamos. A continuación utilizamos dichos pares para eliminar las producciones unitarias de una gramática y demostrar que los lenguajes de ambas gramáticas son el mismo.

Teorema 7.11. El algoritmo anterior determina exactamente los pares unitarios para una GIC G.

Para eliminar las producciones unitarias, hacemos lo siguiente. Dada una GIC G = (V, T, P, S), construimos la GIC G1 = (V, T, P1, S):

l. Determinamos todos los pares unitarios de G.

3

Page 4: 7+Propiedades+de+Los++Lenguajes+Independientes+Del+Contexto

2. Para cada par unitario (A, B), añadimos a P1 todas las producciones A→α, donde B→α es una producción no unitaria de P. Observe que A = B es posible; de esa forma, P1 contiene todas las producciones no unitarias de P.

Ejemplo 7.12. Continuamos con el ejemplo 7.10, en el que se llevó a cabo el paso (l) de la construcción anterior. La figura resume el paso (2) del algoritmo, en el que hemos creado el nuevo conjunto de producciones utilizando el primer miembro de un par como la cabeza y todos los cuerpos no unitarios del segundo miembro del par como los cuerpos de la producción.

El paso final consiste en eliminar las producciones unitarias de la gramática de la figura anterior. La gramática resultante, no tiene ninguna producción unitaria, aunque genera el mismo conjunto de expresiones que la gramática original.

Teorema 7.13. Si la gramática G1 se construye a partir de la gramática G mediante el algoritmo descrito anteriormente para eliminar las producciones unitarias, entonces L(G1) = L(G).

Si Deseamos convertir cualquier GIC G en una GIC equivalente que no emplee ningún símbolo inútil, ni producciones-ε, ni producciones unitarias hay que realizar las siguientes simplificaciones, en el orden indicado:

l. Eliminar las producciones-ε.2. Eliminar las producciones unitarias.3. Eliminar los símbolos inútiles.

Teorema 7.14. Si G es una GIC que genera un lenguaje que contiene al menos una cadena distinta de ε, entonces existe otra GIC G1 tal que L(G1) = L(G) - {ε}, y G1 no tiene producciones-ε, ni producciones unitarias ni símbolos inútiles.

7.1.5 Forma normal de Chomsky

Completamos el estudio sobre las simplificaciones gramaticales demostrando que todo LIC no vacío sin ε tiene una gramática G en la que todas las producciones tienen una de las dos formas siguientes:

l. A→BC, donde A, B y C son variables, o2. A→a, donde A es una variable y a es un símbolo terminal.

Además, G no contiene símbolos inútiles. Una gramática así se dice que está en la forma normal de Chomsky, o FNC.

Para expresar una gramática en la forma normal de Chomsky, partimos de una gramática que no contenga producciones- ε, ni producciones unitarias ni símbolos inútiles. Toda producción de dicha gramática es de la forma A→a, que es una forma permitida por la FNC, o tiene un cuerpo de longitud 2 o superior. Nuestras tareas son entonces:

a) Conseguir que todos los cuerpos de longitud 2 o superior estén formados sólo por variables.b) Descomponer los cuerpos de longitud 3 o superior en una cascada de producciones, teniendo cada una de ellas un

cuerpo formado sólo por dos variables.

La construcción para (a) es la siguiente: para todo símbolo a que aparezca en un cuerpo de longitud 2 o superior, creamos una nueva variable, por ejemplo A. Esta variable sólo tiene una producción, A→a. Ahora empleamos A en lugar de a en cualquier lugar que aparezca esta última dentro de un cuerpo de longitud 2 o superior. En este punto, toda producción tendrá un cuerpo formado por un sólo símbolo terminal o por al menos dos variables y ningún símbolo terminal.

Para el paso (b), tenemos que descomponer dichas producciones A→B1B2…Bk para k ≥3, en un grupo de producciones con dos variables en cada cuerpo. Introducimos k-2 nuevas variables, C1, C2,…, Ck-2. La producción original se reemplaza por las k-1 producciones:

A→B1C1, C1→B2C2,…, Ck-3→Bk-2Ck-2, Ck-2→Bk-1 Bk

Ejemplo 7.15. Vamos a expresar la gramática del ejemplo 7.12 en su FNC. Para la parte (a), observe que existen ocho símbolos terminales, a, b, 0, 1, +, *, (, y), cada uno de los cuales aparece en un cuerpo que no está formado por un único símbolo terminal. Por tanto, tenemos que introducir ocho nuevas variables, y ocho producciones en las que la nueva variable es reemplazada por el símbolo terminal. Utilizando las iniciales obvias como las nuevas variables, introducimos:

A→a, B→b, Z→0, O→1, P→+, M→*, L→(, R→)

4

Page 5: 7+Propiedades+de+Los++Lenguajes+Independientes+Del+Contexto

Si introducimos estas producciones y reemplazamos cada uno de los símbolos terminales de un cuerpo formado por más de un símbolo terminal por la variable correspondiente, obtenemos la gramática mostrada en la figura. Ahora todas las producciones están en la forma normal de Chomsky excepto aquellas cuyos cuerpos tienen longitud 3: EPT, TMF y LER. Algunos de estos cuerpos aparecen en más de una producción, pero podemos tratarlos introduciendo una variable adicional en cada uno.

Para EPT, introducimos la nueva variable C1, y reemplazamos la producción E→EPT por E→EC1 y C1→PT. Para TMF introducimos la nueva variable C2. Las dos producciones que utilizan este cuerpo, E→TMF y T→TMF, son reemplazadas por E→T C2, T→TC2 y C2→MF. Para LER introducimos la nueva variable C3 y reemplazamos las tres producciones que utiliza, E→LER, T→LER y F→LER por E→L C3, T→L C3, F→L C3 y C3→ER. La gramática final, que está en la forma normal de Chomsky, se muestra en la figura.

Teorema 7.16. Si G es una GIC cuyo lenguaje consta de al menos una cadena distinta de ε, entonces existe una gramática G1 en la forma normal de Chomsky, tal que L(G1) = L(G) - {ε}.

7.2 El lema de bombeo para lenguajes independientes del contexto

El teorema, conocido como "lema de bombeo para lenguajes independientes del contexto", establece que en cualquier cadena lo suficientemente larga de un LIC, es posible encontrar a los sumo dos subcadenas cortas y muy próximas que pueden "bombearse" en tándem. Es decir, podemos repetir ambas cadenas i veces, para cualquier entero i, y la cadena resultante pertenecerá al lenguaje.

7.2.1 El tamaño de los árboles de derivación

Una de las aplicaciones de la FNC es transformar los árboles de derivación en árboles binarios. Estos árboles tienen propiedades interesantes y aquí vamos a aprovechar una de ellas.

Teorema 7.17. Suponga que tenemos un árbol de derivación de la gramática en forma normal de Chomsky G = (V, T, P, S) y que el resultado del árbol es una cadena terminal w. Si la longitud del camino más largo es n, entonces |w| ≤ 2n-1.

7.2.2 Enunciado del lema de bombeo

Teorema 7.18. (Lema de bombeo para los lenguajes independientes del contexto). Sea L un LIC. Entonces existe una constante n tal que si z es cualquier cadena de L tal que |z| ≥ n, entonces podemos escribir z = uvwxy, sujeta a las siguientes condiciones:

l. |vwx| ≤ n. Es decir, la parte central no es demasiado larga.2. vx ≠ ε. Puesto que v y x son las partes que se van a "bombear", esta condición establece que al menos una de las cadenas que se van a bombear no tiene que ser vacía.3. Para todo i ≥ 0, uviwxiy pertenece a L. Es decir, las dos cadenas v y x pueden "bombearse" cualquier número de veces, incluyendo cero, y la cadena resultante pertenecerá a L.

7.2.3 Aplicaciones del lema de bombeo para los LlC

El primer ejemplo demuestra que, aunque los lenguajes independientes del contexto pueden emparejar dos grupos de símbolos para establecer si son iguales o no, no pueden emparejar tres de esos grupos.

5

Page 6: 7+Propiedades+de+Los++Lenguajes+Independientes+Del+Contexto

Ejemplo 7.19. Sea L el lenguaje {0m1m2m | m ≥ 1}. Es decir, L consta de todas las cadenas de 0+1+2+ con un cantidad igual de cada símbolo; por ejemplo, 012, 001122, etc. Supongamos que L fuera independiente del contexto. Entonces existe un entero n que nos viene determinado por el lema de bombeo. Elegimos z = 0n1n2n. Descomponemos z en uvwxy, y como |vwx| ≤ n, podrá contener como máximos dos tipos de símbolos del alfabeto, ya que para contener los 3 tendría que tener longitud mayor que n. Entonces en el momento que se bombeen v y x en un número diferente a uno, el número de apariciones del tercer símbolo que se quedó fuera de vwx será distinto a los otros dos, con lo que la cadena dejaría de pertenecer al lenguaje.

Otra cosa que los LIC no pueden hacer es emparejar dos pares de números iguales de símbolos, con la condición de que los pares se entrelacen. Precisamos esta idea en el siguiente ejemplo.

Ejemplo 7.20. Sea L el lenguaje {0i1j2i3j | i ≥ 1 y j ≥ 1}. Si L es independiente del contexto, sea n la constante para L y elegimos z = 0n1n2n3n. Podemos escribir z = uvwxy sujeta a las restricciones habituales |vwx|≤ n y vx ≠ ε. Entonces vwx o está contenida en la subcadena de un símbolo o está entre dos símbolos adyacentes. Por lo tanto al bombear en un número distinto a uno, dejará de cumplirse la condición de igualdad de número de símbolos entre 0s y 2s o entre 1s y 3s.

Vamos a demostrar que los LIC no pueden emparejar dos cadenas de longitud arbitraria, si las cadenas se eligen de un alfabeto de más de un símbolo

Ejemplo 7.21. Sea L = {ww | w pertenece a {0, 1}*}. Es decir, L consta de cadenas que se repiten, tales como ε, 0101,00100010 o 110110. Si L es independiente del contexto, entonces sea n su constante del lema de bombeo. Considere la cadena z = 0n1n0n1n. Esta cadena es la cadena 0n1n repetida, por lo que z pertenece a L. Siguiendo el patrón de los ejemplos anteriores, podemos descomponer z = uvwxy, tal que |vwx|≤ n y vx ≠ ε. De nuevo vwx o está contenida en la subcadena de un símbolo o está entre dos símbolos adyacentes. Si está en un solo símbolo y bombeamos i veces, con i ≠ 1, una cadena w dejaría de ser igual a la otra; si está en dos símbolos adyacentes, pertenece a la primera w, a la segunda w o está formada por 1s de la primera y 0s de la segunda. Si pertenece a una única w y bombeamos con i ≠ 1, entonces las dos cadenas dejarían de ser iguales. Si está formada por 1s de la primera y 0s de la segunda, al bombear con i ≠ 1, el número de 1s de la primera w sería distinto del número de 1s de la segunda w, y lo mismo pasaría con los 0s.

7.3 Propiedades de clausura de los lenguajes independientes del contexto

Ahora vamos a abordar algunas de las operaciones sobre los lenguajes independientes del contexto que está garantizado que generan un LIC. Muchas se parecen a la de los lenguajes regulares, otras no. A diferencia de los lenguajes regulares, los LIC no son cerrados para la intersección y la diferencia. Sin embargo, la intersección o la diferencia de un LIC y un lenguaje regular siempre es un LIC.

7.3.1 Sustituciones

Sea Σ un alfabeto y supongamos que para todo símbolo a de Σ, elegimos un lenguaje La. Estos lenguajes que elegimos pueden emplear cualquier alfabeto, no necesariamente Σ y no necesariamente el mismo para todos. Esta elección de lenguajes define una función s (una sustitución) sobre Σ, y nos referiremos a La como s(a) para cada símbolo a.

Si w = ala2...an es una cadena de Σ*, entonces s(w) es el lenguaje de todas las cadenas x1x2…xn tal que la cadena xi

pertenece al lenguaje s(ai), para i = 1,2,…,n o dicho de otra manera, s(w) es la concatenación de los lenguajes s(a1)s(a2)…s(an). Podemos extender la definición de s para aplicarla a lenguajes: s(L) es la unión de s(w) para todas las cadenas w de L.

Teorema 7.23. Si L es un lenguaje independiente del contexto sobre el alfabeto Σ, y s es una sustitución sobre Σ tal que s(a) es un LIC para cada a de Σ, entonces s(L) es un LIC.

7.3.2 Aplicaciones del teorema de sustitución

Hay varias propiedades de clausura, que podemos demostrar para los LIC utilizando el Teorema 7.23.

Teorema 7.24. Los lenguajes independientes del contexto son cerrados para las siguientes operaciones:

1. Unión. Sean L1 y L2 lenguajes independientes del contexto. Entonces L1UL2 es el lenguaje s(L), donde L es el lenguaje {1 ,2} y s es la sustitución definida por s(1) = L1 y s(2) = L2.

2. Concatenación. De nuevo, sean L1 y L2 lenguajes independientes del contexto. Entonces L1L2 es el lenguaje s(L), donde L es el lenguaje {12} y s es la misma sustitución que en el caso (1).

3. Clausura y clausura positiva. Si L1 es un lenguaje independiente del contexto, L es el lenguaje {1}* y s es la sustitución s(l) = L1, entonces L1

* = s(L). De forma similar, si L es el lenguaje {1}+, entonces L1+ = s(L).

6

Page 7: 7+Propiedades+de+Los++Lenguajes+Independientes+Del+Contexto

4. Homomorfismo. Supongamos que L es un lenguaje independiente del contexto del alfabeto Σ y h es un homomorfismo sobre Σ. Sea s la sustitución que reemplaza cada símbolo a en Σ por el lenguaje que consta de una sola cadena que es h(a). Es decir, s(a) = {h(a)}, para todo a en Σ. Entonces, h(L) = s(L).

7.3.3 Reflexión

Los lenguajes independientes del contexto también son cerrados para la reflexión.

Teorema 7.25. Si L es un lenguaje independiente del contexto, entonces LR también lo es.

7.3.4 Intersección con un lenguaje regular

Los LIC no son cerrados para la intersección. Ejemplo: L1 = {0n1n2i | n ≥ 1, i ≥ 1}, L2 = {0i1n2n | n ≥ 1, i ≥ 1}, L3 = L1 ∩ L2

= {0n1n2n | n ≥ 1}. L1 y L2 son LIC, mientras que L3 no lo es.

Teorema 7.27. Si L es un lenguaje independiente del contexto y R es un lenguaje regular, entonces L ∩ R es un lenguaje independiente del contexto.

Puesto que sabemos que los LIC no son cerrados para la intersección, pero sí son cerrados para la intersección con un lenguaje regular, sabemos que ocurre lo mismo para las operaciones de complementación y diferencia de conjuntos.

Teorema 7.29. Las siguientes afirmaciones son verdaderas para los lenguajes independientes del contexto L, L1 y L2, y un lenguaje regular R.

1. L – R es un lenguaje independiente del contexto.2. no es necesariamente un lenguaje independiente del contexto.3. L1 - L2 no es necesariamente un lenguaje independiente del contexto.

7.3.5 Homomorfismo inverso

Si h es un homomorfismo y L es cualquier lenguaje, entonces h-1(L) es el conjunto de cadenas w tal que h(w) pertenece a L.

Teorema 7.30. Sea L un lenguaje independiente del contexto y h un homomorfismo. Luego h-1(L) es un lenguaje independiente del contexto.

7.4 Propiedades de decisión de los LlC

Una serie de cuestiones fáciles de formular acerca de las gramáticas y los LIC no tienen algoritmo y se conocen como "problemas indecidibles". Las siguientes cuestiones son indecidibles:

l. ¿Es ambigua una determinada GIC G?2. ¿Es inherentemente ambiguo un LIC dado?3. ¿Está vacía la intersección de dos LIC?4. ¿Son dos LIC iguales?5. ¿Es un LIC dado igual a Σ*, donde Σ es el alfabeto del lenguaje?

7.5 Resumen del Capítulo 7

+ Eliminación de símbolos inútiles. Una variable puede eliminarse de una GIC a menos que genere alguna cadena de terminales y que también aparezca en al menos una cadena generada a partir del símbolo inicial. Para eliminar correctamente tales símbolos inútiles, primero hay que comprobar si una variable genera una cadena de símbolos terminales, y eliminar aquéllas que no lo hacen junto con todas sus producciones. Sólo entonces eliminaremos las variables que no son derivables a partir del símbolo inicial.

+ Eliminación de producciones-ε y unitarias. Dada una GIC, podemos encontrar otra GIC que genere el mismo lenguaje, excepto la cadena ε, y que no tenga producciones-ε (aquellas con ε como cuerpo) ni producciones unitarias (aquellas con una sola variable en el cuerpo).

+ Forma normal de Chomsky. Dada una GIC que genera al menos una cadena no vacía, podemos encontrar otra GIC que genere el mismo lenguaje, excepto la cadena ε, y que está en la forma normal de Chomsky: no existen símbolos inútiles y todo cuerpo de producción consta de dos variables o de un símbolo terminal.

7

Page 8: 7+Propiedades+de+Los++Lenguajes+Independientes+Del+Contexto

+ El lema de bombeo. En cualquier LIC, es posible encontrar, dentro de cualquier cadena lo suficientemente larga del lenguaje, una subcadena corta tal que los dos extremos de dicha subcadena puedan ser "bombeados" en tándem; es decir, cada uno de ellos puede repetirse el número de veces que se desee. Las dos cadenas que van a bombearse no pueden ser ambas ε.

+ Operaciones que preservan la independencia del contexto. Los LIC son cerrados para la sustitución, la unión, la concatenación, la clausura (asterisco), la reflexión y el homomorfismo inverso. Los LIC no son cerrados para la intersección y la complementación, aunque la intersección de un LIC con un lenguaje regular siempre es un lenguaje independiente del contexto.

8