Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Capı́tulo 3
Lenguajes y gramáticas
independientes del contexto
Como se ha visto, los autómatas son dispositivos que procesan cadenas de entrada. En
capı́tulos posteriores consideraremos modelos de autómatas con mayor poder computacio-
nal que el de los modelos AFD, AFN y AFN-λ. En el presente capı́tulo estudiaremos una
noción completamente diferente, aunque relacionada, la de gramática generativa, que es
un mecanismo para generar cadenas a partir de un sı́mbolo inicial.
86
Introducción a la Teorı́a de la Computación. Capı́tulo 3 87
Aquellas cadenas que sólo tengan terminales conforman lo que se denomina el lenguaje
generado por G.
Las gramáticas se clasifican de acuerdo con el tipo de sus producciones:
Se dice que un lenguaje es de tipo i si es generado por una gramática de tipo i. Esta
clasificación de lenguajes se conoce como la jerarquı́a de Chomsky.
xAy =⇒ xvy.
Se dice que xvy se deriva directamente (o en un paso) de xAy. Si se quiere hacer referencia
a la gramática G, se escribe
G
xAy =⇒ xvy ó xAy =⇒G xvy.
u1 =⇒ u2 =⇒ u3 =⇒ · · · =⇒ un−1 =⇒ un
y se dice que es una derivación o una generación de un a partir de u1 . Para toda cadena
∗ ∗
w se asume que w =⇒ w; por lo tanto, u =⇒ v significa que v se obtiene de u utilizando
+
cero, una o más producciones de la gramática. Análogamente, u =⇒ v significa que v se
obtiene de u utilizando una o más producciones. Nótese que se utilizan flechas simples,
→, para producciones y flechas dobles, =⇒, al aplicar las producciones en derivaciones
concretas.
El lenguaje generado por una gramática G se denota por L(G) y se define como
+
L(G) := {w ∈ Σ∗ : S =⇒ w}.
Es decir, el lenguaje generado por G está formado por las cadenas de terminales que se
pueden derivar (o generar) en varios pasos a partir de la variable inicial S, aplicando en
cada paso una producción. La igualdad L(G) = L es estricta y requiere que se satisfagan
las dos contenencias L(G) ⊆ L y L ⊆ L(G); es decir, toda cadena generada por G debe
estar en L, y toda cadena de L debe ser generada por G.
Un lenguaje L sobre un alfabeto Σ se dice que es un lenguaje independiente del contexto
(LIC) o lenguaje no-contextual si existe una GIC G tal que L(G) = L. Dos GIC G1 y G2
son equivalentes si L(G1 ) = L(G2 ).
La denominación “independiente del contexto” proviene del hecho de que en una deri-
vación cada producción o regla de re-escritura A → v se aplica a la variable A indepen-
dientemente de los caracteres que la rodean, es decir, independientemente del contexto en
el que aparece A.
Introducción a la Teorı́a de la Computación. Capı́tulo 3 89
Ejemplo Sea G = (V, Σ, S, P ) una gramática dada por:
V = {S, A}
Σ = {a, b}
P = {S → aS, S → bA, S → λ, A → bA, A → b, A → λ}.
La manera más conveniente de presentar una gramática es listando sus producciones y
separando con una barra | las producciones de una misma variable. Se supone siempre que
las letras mayúsculas representan variables y las letras minúsculas representan sı́mbolos
terminales. Ası́ la gramática G del presente ejemplo se puede presentar simplemente como:
(
S → aS | bA | λ
G:
A → bA | b | λ
S =⇒ AB =⇒ B =⇒ λ.
Ejemplo La gramática
(
S → aS | aA
G:
A → bA | b
genera el lenguaje a+ b+ . Otra gramática equivalente es:
S → AB
0
G : A → aA | a
B → bB | b
Introducción a la Teorı́a de la Computación. Capı́tulo 3 90
Ejemplo La gramática
(
S → 1A | 0
A → 0A | 1A | λ
genera el lenguaje de los números naturales en numeración binaria. Nótese que la única
cadena que comienza con 0, generable con esta gramática, es la cadena 0.
∗ ∗ ∗
Ejemplo Encontrar una GIC que genere el lenguaje L 0 10 10 sobre Σ = {0, 1}, es
decir, el lenguaje de todas las cadenas con exactamente dos unos.
Solución. (
S → A1A1A
G:
A → 0A | λ
Una gramática equivalente es
S → 0S | 1A
0
G : A → 0A | 1B
B → 0B | λ
Esta última gramática G0 se puede obtener a partir de un autómata que acepte el lenguaje
L, tal como se explicará en la sección 3.3.
n n
Ejemplo Encontrar una GIC que genere el lenguaje L = {a b : n ≥ 0} sobre Σ =
{a, b}, el cual no es un lenguaje regular.
Solución.
S → aSb | λ.
Ejemplo Encontrar una GIC que genere el lenguaje de todos los palı́ndromes sobre
Σ = {a, b}, el cual no es lenguaje regular.
Solución.
S → aSa | bSb | a | b | λ.
Ejemplo Encontrar una GIC que genere el lenguaje L de todas las cadenas sobre
Σ = {a, b} que tienen un número par de sı́mbolos.
Solución. Las cadenas de longitud par (aparte de la cadena vacı́a λ) se obtienen concate-
nando los cuatro bloques aa, ab, ba y bb. Por lo tanto, para generar el lenguaje L basta
una sola variable que permita concatenar los cuatro bloques de todas las formas posibles.
Las siguientes tres gramáticas generan el lenguaje L:
n
G1 : S → aaS | abS | baS | bbS | λ
n
G2 : S → Saa | Sab | Sba | Sbb | λ
n
G3 : S → aSa | aSb | bSa | bSb | λ
Introducción a la Teorı́a de la Computación. Capı́tulo 3 91
genera ciertamente cadenas de longitud par, pero no las genera todas ya que es imposible
generar cadenas como abbabb y aaabba (y muchas otras). Se cumple que L(G4 ) ⊆ L pero
L * L(G4 ) y por ende no se tiene la igualdad L = L(G4 ).
Otra gramática que genera el lenguaje L es:
(
S → AAS | λ
G5 :
A→a|b
Ejemplo Encontrar una GIC que genere el lenguaje
L = {ak bm cn : m = k + n, k, m, n ≥ 0}
sobre el alfabeto Σ = {a, b, c}.
Solución. Las cadenas de L se pueden escribir como ak bm cn = ak bk+n cn = ak bk bn cn .
Utilizamos la variable A para generar ak bk y la variable B para generar bn cn :
S → AB
G : A → aAb | λ
B → bAc | λ
Ejemplo Encontrar una GIC que genere el lenguaje
L = {ak bm cn : m > k + n, k, n ≥ 0, m ≥ 1}
sobre el alfabeto Σ = {a, b, c}.
Solución. Para resolver este problema, utilizamos como punto de partida la gramática
G del ejemplo anterior. La condición m > k + n significa que hay estrictamente más bes
que el total k + n; el exceso deseado de bes lo podemos obtener por medio de una nueva
variable C colocada entre A y B. Obtenemos ası́ la gramática G0 ,
S → ACB
A → aAb | λ
G0 :
B → bAc | λ
C → bC | b
Introducción a la Teorı́a de la Computación. Capı́tulo 3 92
Ejercicios de la sección 3.2
À Encontrar GIC que generen los siguientes lenguajes sobre Σ = {a, b}:
(i) a∗ b ∪ a.
(ii) a∗ b ∪ b∗ a.
(iii) (ab ∪ ba)∗ .
(iv) a∗ (ab ∪ b)+ .
Á Encontrar GIC que generen los siguientes lenguajes sobre Σ = {a, b}:
 Encontrar GIC que generen los siguientes lenguajes sobre Σ = {a, b, c}:
à Encontrar GIC que generen los siguientes lenguajes sobre Σ = {a, b, c, d}:
Ä Sea Σ = {0, 1}. Encontrar una GIC que genere el lenguaje de las cadenas que tienen
igual número de ceros que de unos.
Introducción a la Teorı́a de la Computación. Capı́tulo 3 93
Autómata
Gramática regular
a
A B A → aB
C→λ
C
∗
donde δ(q, w) = p. Por hipótesis de inducción q =⇒ wp y como δ(p, a) = p0 , entonces
p =⇒ ap0 . Por lo tanto,
∗
q =⇒ wp =⇒ wap0
que era lo que se querı́a demostrar.
A continuación demostraremos el recı́proco de (1): para toda w ∈ Σ∗ , w 6= λ y para
todo p, q ∈ Q se tiene
∗
(2) Si q =⇒ wp entonces δ(q, w) = p.
∗
La demostración de (2) se hace por inducción sobre la longitud de la derivación q =⇒ wp,
∗
es decir, por el número de pasos o derivaciones directas que hay en q =⇒ wp. Si la
derivación tiene longitud 1, necesariamente q =⇒ ap lo cual significa que δ(q, a) = p. Para
∗
el paso inductivo, supóngase que q =⇒ wp tiene longitud n + 1, w = w0 a y en el último
paso se aplica la producción p0 → ap. Entonces
∗
q =⇒ w0 p0 =⇒ w0 ap = wp.
Usando razonamientos similares a los del Teorema 3.3.2, se puede demostrar que
∗
A =⇒G wB si y sólo si B ∈ ∆(A, w), para todo w ∈ Σ∗ , w 6= λ,
q0 b q1
a
b b b
q2 q3
a
Solución. Según la construcción mencionada arriba, los estados del autómata M son las
variables de la gramática G. Renombramos los estados de M con las letras mayúsculas
S, A, B y C. Toda transición de M da lugar a una producción en G; los estados de
aceptación A y B inducen las producciones A → λ y B → λ, respectivamente.
a
b
S A
S → bA | aC
A → aA | bC | λ
a G:
b b b
B → bS | aB | λ
C → bA | aB
B a C
Puesto que el autómata M es determinista, para cada cadena aceptada u existe una única
trayectoria etiquetada por los sı́mbolos de u, desde el estado inicial hasta un estado de
∗
aceptación; tal trayectoria corresponde a una única derivación S =⇒ u en la gramática
regular G. Ası́ por ejemplo, la cadena baabaa tiene una única trayectoria de aceptación,
a saber, S, A, A, A, C, B, B, la cual corresponde a una única derivación en G:
(
S → A1A1A
G:
A → 0A | λ
Esta gramática no es regular, pero por medio del AFD
0 0 0
1 1
S A B
y de la construcción del Teorema 3.3.2 se puede obtener una GIC regular G0 que genere
0∗ 10∗ 10∗ :
S → 0S | 1A
0
G : A → 0A | 1B
B → 0B | λ
Los teoremas anteriores permiten concluir que la familia de los lenguajes regulares está
estrictamente contenida en la familia de los Lenguajes Independientes del Contexto, tal
como se enuncia en el siguiente corolario.
Demostración.
2. Se sigue de la parte 1. Por otro lado, tenemos muchos ejemplos de lenguajes LIC
que no son regulares, como {an bn : n ≥ 0} y el lenguaje de los palı́ndromes sobre el
alfabeto {a, b}.
Ejercicios de la sección 3.3
À Encontrar gramáticas regulares que generen los siguientes lenguajes:
(i) ba∗ b ∪ b+ .
(ii) a+ b∗ a.
(iii) a∗ b ∪ b∗ a.
Introducción a la Teorı́a de la Computación. Capı́tulo 3 97
• •
• • • •
• • • • • • • • • • •
• • •
• • • • • •
• • • • • • • • • • •
• • • • • • • • •
• • • •
Introducción a la Teorı́a de la Computación. Capı́tulo 3 98
∗
3.4.1 Definición. Dada una GIC G = (V, Σ, S, P ), el árbol de una derivación S =⇒ w,
con w ∈ Σ∗ , es un árbol con raı́z y con nodos etiquetados, definido recursivamente de la
siguiente forma:
1. La raı́z está etiquetada con el sı́mbolo inicial S.
2. Si en la derivación se utiliza la producción A → s1 s2 · · · sk , donde si ∈ (V ∪ Σ)∗ , el
nodo A tiene k descendientes inmediatos etiquetados con s1 , s2 ,. . . , sk , escritos de
izquierda a derecha.
De esta manera, los nodos interiores están etiquetados con sı́mbolos no terminales, y las
hojas del árbol están etiquetadas con sı́mbolos terminales o con λ. Si se leen de izquierda
∗
a derecha las hojas del árbol de una derivación de S =⇒ w, se obtiene precisamente la
cadena w, con algunos λ intercalados.
Los árboles de derivaciones se suelen llamar árboles sintácticos.
Ejemplo Sea G la gramática:
S → ABA | AaB
G : A → aA | a
B → bBa | b
A• B• •A
• • B• • • •A
a b a a
• •
λ a
Las derivaciones (1), (2) y (3) tienen todas seis pasos y ellas se aplican exactamente las
mismas producciones pero en diferente orden. Las tres derivaciones tienen todas el mis-
mo árbol, exhibido arriba. Los árboles sintácticos muestran únicamente las producciones
utilizadas, no el orden en que se aplican.
Entre las posibles derivaciones de cadenas se distinguen ciertas derivaciones “estánda-
res”, las llamadas derivaciones a izquierda.
3.4.2 Definición. Una derivación se llama derivación a izquierda (o derivación más a
la izquierda) si en cada paso se aplica una producción a la variable que está más a la
izquierda.
En el ejemplo anterior, la derivación (3) es una derivación a izquierda. En general, una
derivación cualquiera se puede transformar siempre en una única derivación a izquierda
cambiando el orden en que se aplican las producciones, de tal forma que en cada paso
se aplica una producción a la variable que esté más a la izquierda. Además, existe una
correspondencia biyectiva entre derivaciones a izquierda y árboles sintácticos, tal como se
enuncia en la siguiente proposición.
3.4.3 Proposición. Toda derivación a izquierda determina un único árbol sintático.
Recı́procamente, cualquier árbol sintático corresponde a una única derivación a izquierda.
Ejemplo Encontrar la única derivación a izquierda determinada por el siguiente árbol
sintáctico proveniente de cierta gramática G con alfabeto de variables V =
{S, A, B, C} y alfabeto de terminales Σ = {a, b, c}.
S
•
• A• •B
b
C• • •A • •B
b b
• C• •A •
c λ
• • •
c a a
Solución.
Las hojas del árbol sintáctico forman la cadena generada bcbcaabλ = bcbcaab.
Ejercicios de la sección 3.4
S
•
A• S• •A
• • B• • A• •A
λ b a
• A• C• •
λ a
• •
a c
Introducción a la Teorı́a de la Computación. Capı́tulo 3 101
S =⇒ S + S =⇒ 1 + S =⇒ 1 + S ∗ S =⇒ 1 + 1 ∗ S =⇒ 1 + 1 ∗ 0.
S =⇒ S ∗ S =⇒ S + S ∗ S =⇒ 1 + S ∗ S =⇒ 1 + 1 ∗ S =⇒ 1 + 1 ∗ 0.
S• • •S S• • •S
+ ∗
• S• • •S S• • •S •
1 ∗ + 0
• • • •
1 0 1 1
S → (S + S) | (S ∗ S) | 0 | 1
En tal caso el alfabeto de terminales serı́a Σ = 0, 1, +, ∗, (, ) . Aunque la introducción
de paréntesis elimina la ambigüedad, las expresiones generadas tienen un excesivo número
Introducción a la Teorı́a de la Computación. Capı́tulo 3 102
de paréntesis lo que dificulta el análisis sintáctico (en un compilador, por ejemplo). Lo más
corriente en estas situaciones es utilizar gramáticas ambiguas como G siempre y cuando
se establezca un orden de precedencia para los operadores. Lo usual es establecer que ∗
tenga una mayor orden de precedencia que +, es decir, por convención ∗ actúa antes que
+. Por ejemplo, la expresión 1 ∗ 1 + 0 se interpreta como (1 ∗ 1) + 0 sin necesidad de usar
paréntesis.
La ambigüedad es un asunto delicado porque no existe un algoritmo o procedimiento
general que permita decidir si una GIC dada G es o no ambigua. Por consiguiente, en
cada caso concreto hay que proceder por ensayo y error, recurriendo a la definición de
gramática ambigua, para poder concluir si G es o no ambigua.
Ejemplo Demostrar que la siguiente gramática G es ambigua y encontrar una gramáti-
ca G0 no ambigua equivalente a G, es decir, tal que L(G) = L(G0 ).
(
S → aSA | λ
G:
A → bA | λ
Solución. G es ambigua porque para la cadena aab hay dos derivaciones a izquierda
diferentes:
S =⇒ aSA =⇒ aaSAA =⇒ aaAA =⇒ aaA =⇒ aabA =⇒ aab.
S =⇒ aSA =⇒ aaSAA =⇒ aaAA =⇒ aabAA =⇒ aabA =⇒ aab.
Los árboles sintácticos de estas dos derivaciones son:
S S
• •
• S• •A • S• •A
a a
• S• A• • •A • S• •A •
a b a λ
• • • • • •A
λ λ λ λ b
•
λ
a b
a b
S A B
Ejercicios de la sección 3.5
Para cada una de las siguientes gramáticas G, demostrar que G es ambigua, hallar L(G)
y encontrar una gramática no-ambigua que genere el mismo lenguaje L(G).
À G : S −→ aSb | aaSb | λ.
Á G : S −→ aSb | abS | λ.
 G : S −→ aaS | aaaS | λ
(
S −→ aaSB | b | λ
à G:
B −→ Bb | λ
S −→ ABA | b | λ
Ä G : A −→ aA | λ
B −→ bB | λ
S −→ ASB | AB
Å G : A −→ aA | a
B −→ bB | λ
Introducción a la Teorı́a de la Computación. Capı́tulo 3 104
INICIALIZAR:
ANUL := {A ∈ V : A → λ es una producción de G}
REPETIR:
ANUL := ANUL ∪ A ∈ V : ∃ una producción A → w, w ∈ (ANUL)∗
HASTA:
No se añaden nuevas variables a ANUL
3.6.2 Teorema. Dada una GIC G, se puede construir una GIC G0 equivalente a G sin
producciones λ, excepto (posiblemente) S → λ.
Demostración. Una vez que se haya encontrado el conjunto ANUL de variables anulables,
por medio del algoritmo anterior, las producciones de λ se pueden eliminar (excepto
S → λ) añadiendo nuevas producciones que simulen el efecto de las producciones λ
eliminadas. Más concretamente, por cada producción A → u de G se añaden todas las
producciones de la forma A → v obtenidas suprimiendo de la cadena u una, dos o más
variables anulables presentes, de todas las formas posibles. La gramática G0 ası́ obtenida
es equivalente a la gramática original G, es decir, L(G) = L(G0 ).
Ejemplo Eliminar las producciones λ de0 la siguiente gramática G. Más precisamen-
te, encontrar una gramática G sin producciones λ, excepto (posiblemente)
Introducción a la Teorı́a de la Computación. Capı́tulo 3 105
UNIT(A) :=
∗
{X ∈ V : existe una derivación A =⇒ X que usa únicamente producciones unitarias}.
Por definición, A ∈ UNIT(A).
Por medio del siguiente algoritmo sencillo podemos hallar UNIT(A).
Algoritmo para encontrar el conjunto unitario UNIT(A) de una variable A
INICIALIZAR:
UNIT(A):={A}
REPETIR:
UNIT(A):= UNIT(A) ∪ X ∈ V : ∃ una producción Y → X con Y ∈ UNIT(A)
HASTA:
No se añaden nuevas variables UNIT(A)
Introducción a la Teorı́a de la Computación. Capı́tulo 3 106
3.6.4 Teorema. Dada una GIC G, se puede construir una GIC G0 equivalente a G sin
producciones unitarias.
Solución. Aplicando el algoritmo para cada una de las variables de G, se tiene que:
UNIT(S) = {S}.
UNIT(A) = {A}.
UNIT(B) = {B, C}.
UNIT(C) = {C, B}.
Ejemplo Eliminar las producciones unitarias de la siguiente gramática.
S → ACA | CA | ADA | A | C | λ
A → aAa | aa | B | C
G: B → cC | D | C
C → bC
D → aA | λ
Los pasos 1 y 2 del procedimiento no se pueden invertir ya que al eliminar las producciones
λ pueden aparecer nuevas producciones unitarias. La parte 3 del procedimiento anterior
se ilustra en los dos siguientes ejemplos.
Ejemplo Simular la producción A → abBaC mediante producciones binarias y simples.
Solución. Introducimos las variables Ta y Tb , y las producciones Ta → a y Tb → b. Entonces
A → abBaC se simula con:
A → Ta Tb BTa C
Ta → a
Tb → b
Introducción a la Teorı́a de la Computación. Capı́tulo 3 108
Ejemplo Simular la producción A → BAaCbb mediante producciones binarias y sim-
ples.
Solución. El conjunto de variables anulables es ANUL = {C, A}. Al eliminar las produc-
Introducción a la Teorı́a de la Computación. Capı́tulo 3 109
3.6.6 Teorema. Dada una GIC G = (V, Σ, S, P ) se puede construir una GIC G0 =
(V 0 , Σ, S 0 , P 0 ) equivalente a G de tal manera que el sı́mbolo inicial S 0 de G0 no aparezca
en lado derecho de las producciones de G0 .
Demostración. La nueva gramática G0 tiene una variable más que G, la variable S 0 , que
actúa como la nueva variable inicial. Es decir, V 0 = V ∪ {S 0 }. El conjunto de producciones
P 0 está dado por P 0 = P ∪ {S 0 → S}. Es claro que L(G) = L(G0 ) y el sı́mbolo inicial S 0
no aparece en el cuerpo de las producciones.
Según este resultado, el papel de la variable inicial de la nueva gramática G0 es única-
mente iniciar las derivaciones.
0
Ejemplo Encontrar una GIC G equivalente a la siguiente gramática G de tal manera
que la variable inicial de G0 no sea recursiva.
S → ASB | BA
G: A → aA | a
B → bBS | λ
es 0
S →S
S → ASB | BA
G0 :
A → aA | a
B → bBS | λ
Los conjuntos unitarios son: UNIT(S 0 ) = {S 0 , S, A}, UNIT(S) = {S, A}, UNIT(A) =
{A} y UNIT(B) = {B}. Eliminando las producciones unitarias se obtiene la gramática:
0
S → ASB | AS | BA | aA | a
S → ASB | AS | BA | aA | a
G2 :
A → aA | a
B → bBS | bS
Ejercicios de la sección 3.6
Ç Para la gramática del ejercicio Æ encontrar una GIC equivalente en FNC, de tal
manera que su variable inicial no sea recursiva.
Claramente, L(G) = L1 ∪ L2 .
Una GIC G que genere L1 L2 se construye similarmente, añadiendo la producción S →
S1 S2 . Es decir,
G = V1 ∪ V2 ∪ {S}, Σ, S, P1 ∪ P2 ∪ {S → S1 S2 } .
Esquemáticamente, G es la gramática:
S → S1 S2
)
S1 → · · ·
.. .. producciones de G1
. .
)
S2 → · · ·
.. .. producciones de G2
. .
Claramente, L(G) = L1 L2 .
Para generar L∗1 se define G como
G = V1 ∪ {S}, Σ, S, P1 ∪ {S → S1 S, S → λ} .
Esquemáticamente, G es la gramática:
S → S1 S | λ
)
S1 → · · ·
.. .. producciones de G1
. .
Ejemplo Utilizar las construcciones del Teorema 3.7.1 para encontrar una GIC que
genere el lenguaje L L∗ donde L = ba+ y L = {am bn am : m ≥ 0, n ≥ 1}.
1 2 1 2
y L2 con (
S2 → aS2 a | bB
B → bB | λ
La siguiente gramática genera L∗2 :
S3 → S2 S3 | λ
S2 → aS2 a | bB
B → bB | λ
Introducción a la Teorı́a de la Computación. Capı́tulo 3 115
Demostración.
(1) La intersección de dos LIC puede ser un lenguaje que no es LIC. Considérense, como
ejemplo, los lenguajes
L1 = {am bm cn : m, n ≥ 0},
L2 = {am bn cn : m, n ≥ 0}.
Tanto L1 como L2 son LIC porque son generados por las gramáticas G1 y G2 , respec-
tivamente:
S → AB
S → AB
G1 : A → aAb | λ G2 : A → aA |
B → cB | λ B → bBc | λ
(2) Razonamos por contradicción: si el complemento de todo LIC fuera un LIC se podrı́a
concluir que la intersección de dos LIC L1 y L2 serı́a un LIC ya que L1 ∩L2 = L1 ∪ L2 .
Esto estarı́a en contradicción con la parte (1) del presente teorema.
(3) Razonamos por contradicción: si la diferencia de dos LIC cualesquiera fuera un LIC
se podrı́a concluir que el complemento de un LIC L serı́a también un LIC ya que
L = Σ∗ − L. Esto estarı́a en contradicción con la parte (2) del presente teorema.
Introducción a la Teorı́a de la Computación. Capı́tulo 3 116
Ejercicios de la sección 3.7
À Utilizar las construcciones del Teorema 3.7.1 para encontrar GIC que generen los
siguientes lenguajes:
 Demostrar que los LIC son cerrados para la operación de reflexión. Concretamente,
demostrar que si L es un LIC, también lo es el lenguaje LR = {wR : w ∈ L}.