You are on page 1of 278

LENGUAJES FORMALES

(Gramticas y Autmatas en Informtica)

Lucio Torrico
A ti: me basta con saber que te reconoces.
TABLA DE CONTENIDO
PREFACIO
CAPTULO 1. LIMINAR .......................................................................................................... 1
Alfabeto o Vocabulario ....................................................................................................... 1
Smbolo ............................................................................................................................... 1
Cadena o Hilera o Palabra ................................................................................................... 1
Lenguaje .............................................................................................................................. 2
Operaciones con cadenas..................................................................................................... 2
Operaciones con lenguajes .................................................................................................. 4
CAPTULO 2. GRAMTICAS REGULARES ........................................................................ 8
GRAMTICAS REGULARES LINEALES DERECHAS ................................................ 8
Mecanismo de funcionamiento de las GRLDs................................................................. 11
Ms de un paso de derivacin: el concepto de derivacin a secas .................................... 13
Cadenas generables por la GRLD G ................................................................................. 13
L(G) lenguaje generado por una GRLD ............................................................................ 14
Dado un lenguaje escribir las producciones ...................................................................... 17
Dudas comunes.................................................................................................................. 18
Errores comunes ................................................................................................................ 18
GRAMTICAS REGULARES LINEALES IZQUIERDAS ........................................... 20
NOTACIN, CONVENCIONES Y TOMA DE POSICIN: el caso de la cadena vaca 23
Problemas varios ............................................................................................................... 25
Lenguaje regular ................................................................................................................ 26
L(G) lenguaje generado por G versus L lenguaje que creemos genera G L=L(G)? ........ 26
CAPTULO 3. AUTMATAS FINITOS ................................................................................ 33
AUTMATAS FINITOS DETERMINSTICOS (AFDs) .............................................. 33
Funcin total y determinismo ............................................................................................ 34
Errores comunes ................................................................................................................ 35
Otras formas de representacin de los AFDs ................................................................... 35
AFDs: mecanismo de funcionamiento ............................................................................. 38
Descripciones instantneas en AFDs ............................................................................... 38
Movimiento(s) en un AFD ................................................................................................ 38
Transiciones = muchos movimientos ................................................................................ 39
T(A): lenguaje aceptado por un AFD ................................................................................ 40
La funcin *: otra notacin frecuente .............................................................................. 41
El lema de bombeo ............................................................................................................ 43
El teorema de Myhill-Nerode ............................................................................................ 45
AUTMATAS FINITOS NO DETERMINSTICOS (AFNS) ....................................... 48
No determinismo, aceptacin de una cadena y T(A) en un AFN ...................................... 49
La funcin d* ..................................................................................................................... 51
AUTMATAS FINITOS NO DETERMINSTICOS CON TRANSICIONES VACAS52
(-AFNS) ......................................................................................................................... 52
-cierre .............................................................................................................................. 53
La funcin d*..................................................................................................................... 58
CAPTULO 4. EXPRESIONES REGULARES ...................................................................... 62
DERIVADAS DE EXPRESIONES REGULARES ......................................................... 65
ECUACIONES CON EXPRESIONES REGULARES .................................................... 75
CAPTULO 5. CONVERSIONES GENRICAS: El caso regular .......................................... 77
Construccin de una GRLD cuyo smbolo raz no aparezca en ninguna parte derecha de
las producciones ................................................................................................................ 77
Construccin de una GRLIzquierda a partir de una GRLDerecha .................................... 78
Construccin de una GRLD a partir de un AFD A ........................................................... 81
Construccin de una GRLD a partir de un AFN A ........................................................... 83
Construccin de un AFN A a partir de una GRLD G ....................................................... 85
Construccin de un AFD A no reinicializable a partir de un AFD A reinicializable ....... 87
Construccin de un AFN A a partir de un AFD A ........................................................... 89
Construccin de un AFD A a partir de un AFN A ........................................................... 90
Construccin de un AFD A con el alfabeto extendido a partir de un AFD A.................. 93
Construccin de un AFN A a partir de un -AFN A ....................................................... 94
Construccin de un autmata a partir de una e.r. (el Teorema de Kleene parte I) .......... 100
Construccin de una e.r. a partir de un autmata A (el Teorema de Kleene parte II) ..... 111
Construccin de un AFD accesible a partir de un AFD cualquiera................................ 117
Construccin de un AFD con el menor nmero posible de estados a partir de un AFD
cualquiera (minimizacin de AFDs) .............................................................................. 118
CAPTULO 6. CERRADURA: El caso regular ..................................................................... 128
Unin ............................................................................................................................... 128
Concatenacin ................................................................................................................. 131
Diferencia ........................................................................................................................ 133
Complemento .................................................................................................................. 134
Interseccin ..................................................................................................................... 134
Estrella de Kleene............................................................................................................ 135
CAPTULO 7. PROBLEMAS DE DECISIN ...................................................................... 141
Pertenencia de una cadena a un lenguaje regular (el Algoritmo de Earley) .................... 141
Lenguaje aceptado por un AFD: vaco o no .................................................................... 143
Infinitud (finitud) del lenguaje aceptado por un AFD ..................................................... 144
Inclusin del lenguaje aceptado por una AFD respecto de otro AFD ............................. 144
l-equivalencia de AFDs (el algoritmo de Moore) .......................................................... 145
Equivalencia de e.r .......................................................................................................... 145
Lenguajes no regulares .................................................................................................... 149
CAPTULO 8. GRAMTICAS LIBRES DE CONTEXTO.................................................. 152
rboles de derivacin ...................................................................................................... 154
Operacin de reemplazo en rboles ................................................................................. 156
Derivacin ms a la izquierda (derecha) ......................................................................... 158
Ambigedad .................................................................................................................... 158
GLC limpias, reducidas o higienizadas ........................................................................... 161
Formas normales ............................................................................................................. 162
Camino ms largo de un rbol de derivacin en una GLC en FNCH ............................. 163
Poda y expansin ............................................................................................................. 164
Cabeza de la parte derecha (de una produccin) ............................................................. 165
No Terminales recursivos por izquierda de primer orden y de orden mayor .................. 165
Lema de bombeo ............................................................................................................. 165
El lema de Ogden ............................................................................................................ 167
CAPTULO 9. AUTMATAS DE PILA (AP)...................................................................... 169
AUTMATAS DE PILA POR PILA VACA (AP) ..................................................... 169
Descripciones instantneas para AP ................................................................................ 169
Movimientos.................................................................................................................... 170
Funcionamiento de un AP ............................................................................................... 171
T(A) lenguaje aceptado por un AP ................................................................................ 172
Representacin grfica .................................................................................................... 173
Toma de posicin, necesidades y errores comunes ......................................................... 174
AUTMATAS DE PILA POR ESTADO FINAL (APe.f.) ............................................ 175
T(A) lenguaje aceptado por un APe.f. ............................................................................. 175
No Determinismo ............................................................................................................ 176
CAPTULO 10. CONVERSIONES GENRICAS: el caso libre de contexto ....................... 180
Construccin de una GLC limpia a partir de otra GLC cualquiera: limpieza de GLCs . 180
Construccin de una GLC en FNCH a partir de otra GLC G.......................................... 186
Eliminacin de la recursividad por izquierda de primer orden ....................................... 189
Construccin de una GLC en FNG a partir de otra GLC arbitraria................................. 191
Construccin de una GLC G en 2FNG............................................................................ 198
Construccin de un AP a partir de un APe.f. ................................................................ 199
Construccin de APe.f. a partir de un AP ..................................................................... 201
Construccin de AP a partir de una GLC ...................................................................... 202
Cuasi-gramticas Libres de Contexto y eliminacin de producciones borradoras .......... 204
Construccin de una GLC a partir de un AP ................................................................. 206
Construccin de un APe.f. determinstico a partir de un AP determinstico ................. 209
Construccin de un APe.f. determinstico en forma normal a partir de otro APe.f.
determinstico .................................................................................................................. 211
CAPTULO 11. CERRADURA: el caso libre de contexto .................................................... 215
Unin ............................................................................................................................... 215
Concatenacin ................................................................................................................. 216
Cruz de Kleene ................................................................................................................ 219
Interseccin, diferencia y complemento .......................................................................... 222
Interseccin y diferencia entre un lenguaje libre de contexto y uno regular ................... 223
Interseccin, complemento y diferencia entre lenguajes libres de contexto determinsticos
......................................................................................................................................... 226
CAPTULO 12. PROBLEMAS DE DECISIN .................................................................... 233
Pertenencia de una cadena a un lenguaje libre de contexto (el algoritmo CYK) ............ 233
Lenguaje aceptado por una GLC: vaco o no .................................................................. 235
Infinitud (finitud) del lenguaje aceptado por una GLC ................................................... 236
Lenguajes no libres de contexto ...................................................................................... 236
Gramticas LL y LR ........................................................................................................ 239
CAPTULO 13. LENGUAJES SENSIBLES AL CONTEXTO ............................................ 241
GRAMTICAS SENSIBLES AL CONTEXTO (GSC) ................................................ 241
Forma normal de Kuroda (FNK) ..................................................................................... 242
AUTMATAS LIMITADOS LINEALMENTE (ALL) ................................................ 242
Descripciones instantneas y lenguaje aceptado T(A) .................................................... 244
CONVERSIONES GENRICAS Y CERRADURA: El caso sensible al contexto........ 245
Construccin de una GSC con slo No Terminales en la parte izquierda de sus
producciones.................................................................................................................... 245
Construccin de una GSC en forma normal a partir de otra ........................................... 246
Construccin de una GSC en FNK a partir de otra ......................................................... 248
Construccin de un ALL a partir de una GSC ................................................................ 249
Construccin de una GSC a partir de un ALL ................................................................ 252
Unin ............................................................................................................................... 255
Concatenacin ................................................................................................................. 256
Cruz de Kleene ................................................................................................................ 256
Interseccin ..................................................................................................................... 257
Complemento .................................................................................................................. 259
PROBLEMAS DE DECISIN ....................................................................................... 261
Pertenencia de una cadena a un lenguaje sensible al contexto ........................................ 261
Algunos otros problemas de decisin .............................................................................. 261
Lenguajes no sensibles al contexto.................................................................................. 261
CAPTULO 14. RELACIONES Y CONVERSIONES ENTRE NIVELES DE LA
JERARQUA DE CHOMSKY ............................................................................................... 263
Todos los lenguajes regulares son libres de contexto ...................................................... 263
Todos los lenguajes libres de contexto son sensibles al contexto ................................... 263
Jerarqua de Chomsky ..................................................................................................... 263
Construccin de una Gramtica de tipo 1,2 3 cuyo smbolo raz no aparezca en ninguna
parte derecha de las producciones ................................................................................... 264
L(G) es recursivo para G una gramtica de tipo 1, 2 3 ................................................. 264
Variantes.......................................................................................................................... 264
BIBLIOGRAFA.....................................................................................................................267
NDICE ................................................................................................................................... 268
PREFACIO

Este trabajo tiene la pretensin de presentar a los lenguajes formales -a sus gramticas y
autmatas asociados- en s mismos, tratando de reflejar su elegancia y su riqueza inherente, no
como un medio til lo que es un gran logro y un importantsimo punto a favor, por ejemplo
en compilacin- sino como uno de los captulos ms hermosos de la informtica terica:
con valor propio.
Como es imaginable, no se ha podido abarcar todo el espectro posible, hubo la necesidad de
tomar posiciones y hacer elecciones; tambin hay una cierta paridad entre el rigor la
demostracin- y la descripcin esquemtica y ejemplificada.
Se cubren los lenguajes regulares y los lenguajes libres de contexto con alguna amplitud,
menos ambiciosa es la parte dedicada a los lenguajes sensibles.

Resta agradecer a la Universidad Mayor de San Andrs, a la Facultad de Ciencias Puras y


Naturales, a la Carrera de Informtica y al I.I.I., es decir, a las personas de estas instituciones
quienes han hecho que este esfuerzo sea posible; asimismo a tod@s quienes han trabajado y
trabajan en el campo de los lenguajes formales desde su perspectiva terica o aplicada- sin
cuya labor previa nada de esto existira. En particular gracias a Grover Copa.

Los desaciertos son mi responsabilidad: me adelanto en agradecer a quienes hagan notarlos,


tanto en los errores de transcripcin valga el eufemismo-, como en los otros que merecern
doble disculpa y doble agradecimiento.

Lucio Torrico
luciotorrico@gmail.com
CAPTULO 1. LIMINAR

Para leer los restantes captulos es imprescindible un buen manejo de diversos conceptos y
operaciones con cadenas y lenguajes, principalmente de los siguientes.

Alfabeto o Vocabulario
Un alfabeto es un conjunto finito, no vaco, de smbolos indivisibles u objetos atmicos.
Ejemplos:
Alfabeto de dgitos decimales T={0,1,2,3,4,5,6,7,8,9}
Alfabeto de las letras L={a,b,,z,A,,Z}

Smbolo
Un smbolo es un componente elemental del alfabeto. Por componente elemental
entenderemos cualquier elemento u objeto atmico considerado como indivisible.
En los ejemplos de arriba el 3 o la z son elementos y son los casos ms usuales, sin embargo,
tambin consideraremos como indivisible y como un nico elemento, es decir, como un
smbolo de un alfabeto a objetos tales como pares ordenados u otros.
Por ejemplo, aunque no son usuales, no debe extraarnos encontrar alfabetos as:
T={a1, a2, a3, a4, a5} de cinco smbolos, uno de ellos es a3.
N={(A,B), (A,A), (B,A)} de tres smbolos, uno de ellos es (A,B).
V={cadenaquefungecomosmbolo1, cadenaquefungecomosmbolo2} de dos smbolos, uno de
ellos es cadenaquefungecomosmbolo2.

Cadena o Hilera o Palabra


Una cadena u es una secuencia ordenada de longitud finita de smbolos de un alfabeto T. Se
dice que la cadena est formada sobre T y a menudo el alfabeto no se indica pues se
sobreentiende.
Se representa como u=a1a2an donde a1,a2,...,an T
El smbolo ai 1 i n, ocurre en la posicin i de la cadena leda de izquierda a derecha.
La cadena vaca, la cual se denota por el smbolo (lambda), es una palabra sobre cualquier
alfabeto y se define como una secuencia vaca de smbolos.
Otros autores prefieren denotar la cadena vaca con un cero (0) y otros con el smbolo
psilon), lo que nosotros no haremos.

Ejemplos:
Las siguientes son cadenas sobre el alfabeto T={a,b}
u1 = abab
u2 = bbbb
u3 = abbbaaa
u4 =

1
Por razones estrictamente tericas, en otros contextos se maneja la nocin de cadenas
infinitas, es decir, secuencias infinitas de smbolos de un alfabeto T.
Tambin puede ser til definir las cadenas como tuplas, por ejemplo u3 = (a,b,b,b,a,a,a)

Lenguaje
Un lenguaje es un conjunto de cadenas definidas sobre un alfabeto.
Al ser un conjunto, un lenguaje puede ser infinito o finito (incluso vaco).

Ejemplos:
Los siguientes son lenguajes sobre T={0,1}
L1 = = {} Denominado lenguaje vaco y denotado a menudo por L
L2 = {} Lenguaje que incluye slo la cadena vaca, denotado a menudo por L
L3 ={0, 1, 01, 10}
L4 = {0, 00, 000, 0000, }

Operaciones con cadenas


Sean tres cadenas sobre el alfabeto T
u=c1c2ck , w=a1a2an y z=b1b2bm

Longitud:
La longitud de w se denota mediante el smbolo |w| y se define como el nmero de smbolos
que tiene la cadena: |w|=n
La cadena vaca es una secuencia de 0 smbolos.

Ejemplos:
Si w=0101, |w|= 0101| = 4
Si w=, |w| = | = 0

Igualdad de cadenas:
Se dice que w es igual a z, si tienen la misma longitud y los mismos smbolos en idnticas
posiciones. Se denota mediante w=z.
w=z si se cumple que |w| = |z| y (i: 1 i n: ai= bi )

Inversa o Reversa o Transpuesta:


~
La inversa de una cadena w, es la imagen refleja de w. Para denotar la inversa de w se usa w
~
y se define as: w = ana2a1
Si w=, w ~ =w
~
~ =w
Tambin, la inversa de la inversa de una cadena es la cadena original: w

Ejemplos:
~ = 1010
Si w=0101, w
~
Si w=111, w = 111

2
~ = 00111
Si w=11100, w

Concatenacin de cadenas:
La concatenacin de w con z es la cadena que se obtiene al aadir a la derecha de la cadena w
la cadena z, y se denota por wz (o w.z, aunque a menudo el punto se omite). Es decir, consiste
de todos los smbolos de w seguidos por los smbolos de z.
wz =a1a2anb1b2bm

Propiedades de la concatenacin:
1) wzes una cadena sobre T
2 ww=w
3) |wz| |w| + |z|
4) uwz = (uw)z = u(wz)
5) En general no es conmutativa, es decir, comnmente wz zw

Ejemplos:
Si w = 0101 y z=1111
wz = 01011111
zw = 11110101
zz = 11111111

Potencia ensima de una cadena


Para n N se define
w0=
wn= w n-1.w
Se dice que wn es la potencia ensima de w.
wndenota la concatenacin de w consigo misma n veces.

Por la propiedad 3 de la concatenacin, |wn| = n|w|, la longitud de la potencia n de w es n


veces la longitud de w.

Ejemplos:
Si w = 0101 y z=1111
z3 = z2z = z1zz = z0zzz = zzz = zzz = 111111111111
w4 = w3w = w2ww = w1www = w0wwww = wwww = wwww = 0101010101010101
|w4| = 4|w| = 16

Prefijo:
Sean u, w y z tres cadenas sobre el alfabeto T.
Se dice que la cadena z es prefijo de w, si para alguna cadena u se obtiene w = zu.
La cadena vaca es prefijo de cualquier palabra.
Toda palabra puede considerarse prefijo de s misma.

3
El prefijo z de la cadena w se denomina prefijo propio si z w.

Sufijo:
Sean u, w y z tres cadenas sobre el alfabeto T
Se dice que la cadena z es sufijo de w, si para alguna cadena u se obtiene w = uz.
La cadena vaca es sufijo de cualquier palabra.
Toda palabra puede considerarse sufijo de s misma.
El sufijo z de la cadena w se denomina sufijo propio si z w.

Subcadena:
Sean u, v, w y z cuatro cadenas sobre el alfabeto T.
Una cadena z es una subcadena de otra cadena w si existen la cadenas u y v para las cuales,
w=uzv.

Nmero de ocurrencias de un smbolo dado:


Suele ser til contar el nmero de ocurrencias de cierto smbolo dentro de una cadena.
Sea b dicho smbolo, se denota mediante Nb(w) al nmero de veces que ocurre el smbolo b en
la cadena w.

Ejemplos:
Si w=abbaab, Nb(w)=3
Si w=aaa, Nb(w)=0

Operaciones con lenguajes


Existen diversas operaciones con los lenguajes que devuelven otro lenguaje. Al ser ellos
conjuntos de cadenas, varias de estas operaciones son simples y conocidas operaciones con
conjuntos (la unin de lenguajes, la interseccin de lenguajes, etc.). Otras son ms particulares
y requieren alguna ampliacin.

Sean L1, L2 y L3 tres lenguajes sobre sus respectivos alfabetos, digamos T1, T2 y T3.

Unin:
L1 L2 = { u / (u L1 ) (u L2 ) }

Interseccin:
L1 L2 = { u / (u L1 ) y (u L2 ) }

Concatenacin:
L1. L2 = { uv / ( u L1 ) y ( v L2 ) }
(a menudo el punto que denota la operacin se omite)

4
Propiedades de la concatenacin:
1) L1.=.L1=
2) (L1.L2).L3 = L1.(L2.L3) asociatividad
3) En general no es conmutativa, es decir, comnmente L1.L2 L2.L1
4) L1.( L2 L3) = L1.L2 L1.L3 distributividad con respecto a la unin
5) En general no es distributiva con respecto a la interseccin [L1.( L2L3) L1.L2 L1.L3]

Inverso:
~ R
L1 ( L ) denota el inverso de L1
~
LR= L1 = { u~ / uL1 }

Potencia:
L10= {
L11= L1
L12= L1.L1

L1k= L1k-1.L1

Estrella o clausura de Kleene:


L1* = {} L1 (L1. L1) (L1. L1. L1) ...
O bien L1* = {} L1 L12 L13 ... = L1i
i 0

O bien L1 = { u1...ui / i0, uj L1 j=1,...,i }


*

Lenguaje Universal sobre el alfabeto T :


El conjunto de todas las posibles cadenas sobre un alfabeto T, se denota por T*.
Se trata de la estrella de Kleene tomando como lenguaje al propio alfabeto, es decir, L1=T
As T* = {} T T2 T3 ... = Ti
i 0

Esto es importante porque a menudo un lenguaje L sobre el alfabeto T se define tambin como
cualquier subconjunto de T*, es decir, L T*.

Ejemplos:
Para T={0,1}
T0 ={
T1={0,1
T2={00,01,10,11
T3={000,001,010,011,100,101,110,111}

Luego

5
T*=T0 T1 T2 T3 ... = {0,1,00,01,10,11,000,001,010,011,100,101,110,111,}

Para T={a,b}
T*={ todas las cadenas que se pueden formar con los smbolos a b
en cualquier orden y de cualquier longitud}
T*={ a, b, aa, ab, ba, bb, aaa, ... }

Para T={a}
T*={ a, aa, aaa, ... }
Tambin podemos referirnos a este mismo lenguaje as: {a}*

Para T={b,c,d}
T*={ b, c, d, bb, bc, bd, cb, cc, cd, db, dc, dd, bbb, ... }
Tambin podemos referirnos a este mismo lenguaje as: {b,c,d}*

Diferencia:
Sean L1 y L2 definidos sobre T, L1 T* y L2 T*, es decir, se toma a T* como conjunto
universo.
L1 - L2 = { uT* / uL1 y uL2 }

Complemento:
* *
L1 = { uT / uL1 } = T - L1
En este caso se toma a T como conjunto universo. Tambin se denota por (L1)c.
*

Cruz de Kleene:
L+ = L*- {}
Hay algunos conceptos ms que no son tan usuales pero que supondremos se manejan; el
primero es tambin una operacin sobre lenguajes y los otros corresponden a la matemtica
discreta.

Cociente de un lenguaje (por una palabra y entre lenguajes):


Como la definicin de cociente derecho es anloga a la de cociente izquierdo, slo
presentaremos esta ltima.
Sean T un alfabeto, a T, u T* y L T*
El cociente izquierdo de L entre u, denotado por L/u, es el conjunto de todos los (buenos)
finales de las cadenas de L cuyo prefijo es u.
L/u = { w / uw L }

Propiedades de L/u:
1) Si L1 L2 entonces L1/u L2/u
2) (L1 L2)/u = L1/u L2/u

6
3) (L1 L2)/u = L1/u L2/u
4) (L1L2)/a = (L1/a)L2 si L1
(L1L2)/a = (L1/a)L2 L2/a en otro caso
5) L*/a = (L/a)L*
6) L/uw = (L/u)/w
El cociente izquierdo de L1 entre L2, denotado por L1/L2 es:
L1/L2 = { w / uw L1, u L2 }

Relacin de equivalencia y particin de un conjunto:


Sea R una relacin definida sobre un conjunto B, si R es reflexiva, simtrica y transitiva se
dice que R es una relacin de equivalencia.
El conjunto formado por las clases de equivalencia de R es una particin de B.
El nmero de clases de equivalencia de R se denomina ndice.

Ejemplos:
Sea R definida sobre T+={a,b}+ as:
x,yT+ xRy si y slo si x termina en el mismo smbolo de y
Es claro que la particin formada por las clases de equivalencia de R es
={[a]R,[b]R} cuyo ndice es 2 y donde [a]R={ua / u *} y [b]R={ub / u *}

Sea R definida sobre T+={a,b}+ as:


x,yT+ xRy si y slo si |x|=|y|
Es claro que la particin formada por las clases de equivalencia de R es
={[a]R,[aa]R,[aaa]R,...} cuyo ndice es infinito

Clausura reflexiva transitiva de una relacin:


Sea R una relacin definida sobre un conjunto B y denotemos por la composicin de
relaciones. Se sabe que la composicin de R consigo misma puede repetirse varias veces
dejando la idea de potencia de una relacin:
R0 = IB (la relacin de identidad sobre B)
R = R R (n 0)
n+1 n

La potencia de una relacin ofrece una alternativa para definir la clausura transitiva de una
relacin denotada por R+- as:
R+ =
i>0
Ri

Finalmente la clausura reflexiva transitiva de R denotada por R* se define as:


R* = R+ IB

7
CAPTULO 2. GRAMTICAS REGULARES

Para el caso de gramticas, utilizaremos dos alfabetos frecuentemente:


El primero denominado alfabeto de No Terminales y denotado por N.
El segundo denominado alfabeto de Terminales y denotado por T.

Los siguientes son ejemplos de alfabetos (para diferenciarlos utilizamos subndices):


N1={S,X,Y,Z}
N2={S}

T1={a, b,c}
T2={a}
T3={1,2,3}
T4={1,a,2,b,3}

Ntese que -por convencin- generalmente utilizaremos minsculas o nmeros para los
elementos del alfabeto de Terminales y maysculas para los elementos del alfabeto de No
Terminales.

Las Gramticas Regulares son de dos tipos: Gramticas Regulares Lineales Derechas y
Gramticas Regulares Lineales Izquierdas.
Cuando se habla de Gramticas Regulares alguna literatura slo hace mencin de las
Gramticas Regulares Lineales Derechas, y en varios casos confunden estos trminos, es
decir, hablan de Gramticas Regulares Lineales Derechas como si fueran las nicas
Gramticas Regulares.
En estricto rigor es mejor conservar "el apellido", pues como dijimos- existen Gramticas
Regulares Lineales Izquierdas y Lineales Derechas.

GRAMTICAS REGULARES LINEALES DERECHAS


Una Gramtica Regular Lineal Derecha (GRLD), denotada por G, es una cudrupla:
G=(N, T, P, S) donde
N es un alfabeto de No Terminales o Variables
T es un alfabeto de Terminales
N y T son disjuntos (Nun smbolo no puede ser Terminal y No Terminal a la vez.
S es un smbolo de N, es decir, S N, y se llama el smbolo raz de la GRLD.
P es un conjunto finito, no vaco, de producciones.

Una produccin de una GRLD es un par ordenado (,).


Al primer elemento lo denominaremos parte izquierda de la produccin y consiste de un
smbolo No Terminal cualquiera, N.

8
Al segundo elemento lo denominaremos parte derecha de la produccin y puede ser de dos
tipos: bien un smbolo Terminal; o bien un smbolo Terminal seguido de un smbolo No
Terminal, T o (T.N).
En vez de un par ordenado, es muy comn representar una produccin separando las partes
derecha e izquierda por un smbolo de flecha as: --> .

Ejemplo:
La siguiente es una Gramtica Regular Lineal Derecha (GRLD) G:
G=(N, T, P, S)
N={S}
T={a,b}
P={ (S,aS), (S,b) }
Como dijimos es usual describir el conjunto de producciones as: P={ S --> aS, S --> b }
Igual de frecuente es describir P a manera de un listado como a continuacin mostramos.
P:
S --> aS
S --> b
Nosotros daremos las producciones en forma de listado a menudo.
La parte izquierda es un smbolo No Terminal que generalmente es una mayscula.
La parte derecha es un smbolo Terminal, generalmente una minscula o un nmero, que
puede estar solo o seguido de un smbolo No Terminal - generalmente una mayscula-.
Pueden existir una, dos, tres, etc. producciones, siempre que sea un nmero finito.

Ms ejemplos:
La siguiente es una Gramtica Regular Lineal Derecha (GRLD) G:
G=(N, T, P, S)
N={S,X,Y}
T={a,b,c}
P:
S --> aX
X --> bY
Y --> c

La siguiente es una Gramtica Regular Lineal Derecha (GRLD) G:


G=(N, T, P, S)
N={S,X,Y}
T={a}
P:
S --> aX
X --> a
Ntese que en este ejemplo no se utiliza el No Terminal Y. No hay problema, la
definicin de GRLD permite este tipo de casos.

9
La siguiente es una Gramtica Regular Lineal Derecha (GRLD) G:
G=(N, T, P, S)
N={S,X}
T={a,b}
P:
S --> aS
S --> a
Ntese que en el ejemplo no se utilizan el No Terminal X ni el Terminal b. No hay
problema, la definicin de GRLD permite este tipo de casos.

El siguiente es un mal ejemplo de Gramtica Regular Lineal Derecha (GRLD) G:


G=(N, T, P, S)
N={Y,X}
T={a,b}
P:
S --> aS
S --> a
Ntese que S no est en N, por lo tanto no es una GRLD.

El siguiente es un mal ejemplo de Gramtica Regular Lineal Derecha (GRLD) G:


G=(N, T, P, S)
N={S,Y,X}
T={a,b}
P:
S --> aX
X --> Ya
Y --> b
Ntese que la segunda produccin no obedece el formato indicado en lo que
concierne a la parte derecha (Terminal solo, Terminal seguido de No Terminal), en este caso
est al revs, no sigue la definicin y por lo tanto no es una GRLD.

El siguiente es un mal ejemplo de Gramtica Regular Lineal Derecha (GRLD) G:


G=(N, T, P, S)
N={S,Y,X}
T={a,b}
P:
S --> aX
X --> aY
aY --> b
Ntese que la tercera produccin no obedece el formato indicado en lo que
concierne a la parte izquierda (slo un No Terminal), en este caso tiene dos smbolos, no sigue
la definicin y por lo tanto no es una GRLD.

10
El siguiente es un mal ejemplo de Gramtica Regular Lineal Derecha(GRLD) G:
G=(N, T, P, S)
N={S,Y,X}
T={a,b}
P:
S --> aX
X --> aY
a --> b
Ntese que la tercera produccin no obedece el formato indicado en lo que concierne
a la parte izquierda (slo un No Terminal), en este caso tiene un Terminal, no sigue la
definicin y por lo tanto no es una GRLD.

La siguiente es una Gramtica Regular Lineal Derecha (GRLD) G:


G=(N, T, P, S)
N={S}
T={0,1,2,3,4,5,6,7,8,9}
P:
S --> 1S
S --> 2S
S --> 3S
S --> 4S
S --> 5S
S --> 6S
S --> 7S
S --> 8S
S --> 9S
S --> 0S
S --> 0
S --> 2
S --> 4
S --> 6
S --> 8

Es comn agrupar varias producciones que tienen la misma parte izquierda separando las
partes derechas con una barra. De este modo el conjunto de producciones del ltimo ejemplo
puede presentarse tambin como mostramos en seguida.
P:
S --> 1S | 2S | 3S | 4S | 5S | 6S | 7S | 8S | 9S | 0S
S --> 0 | 2 | 4 | 6 | 8

Mecanismo de funcionamiento de las GRLDs


En principio vamos a definir el concepto de un paso de derivacin en GRLDs:

11
Se dice que en G damos un paso de derivacin de la cadena u hacia la cadena v, lo que se
denota por u => v
si u = wXz y v = waz y X --> a P
o si u = wXz y v = waBz y X --> aB P
donde
u, v, w, z son cadenas que pueden formarse con los smbolos de (N T).
w, z pueden ser incluso la cadena vaca.
X, B son No Terminales
a es un Terminal

Ejemplos:
Sea la GRLD G=(N, T, P, S)
N={S,X,Y}
T={a,b,c}
P:
S --> aX
X --> bY
X --> bX
Y --> c
En los siguientes casos se da un paso de derivacin de la cadena u hacia v, es lo mismo -y es
usual- decir que v deriva de u en un paso de derivacin:

1) aaaXbbb => aaabXbbb pues


u = aaaXbbb v = aaabXbbb
en este caso w = aaa z = bbb y X --> bX P (es la tercera produccin)

2) abXba => abbYba pues


u = abXba v = abbYba
en este caso w = ab z = ba y X --> bY P (es la segunda produccin)

3) YaScYbS => YaSccbS pues


u = YaScYbS v = YaSccbS
en este caso w = YaSc z = bS y Y --> c P (es la cuarta produccin)

4) Sba => aXba pues


u = Sba v = aXba
en este caso w = z = ba y S --> aX P (es la primera produccin)
Ntese que cuando la cadena vaca no est sola, simplemente no la escribimos

5) Y => c pues
u=Y v=c
en este caso w = z = y Y --> c P (es la cuarta produccin)

12
Ms de un paso de derivacin: el concepto de derivacin a secas
Luego de un paso de derivacin de una primera cadena hacia una segunda cadena, puede
generalizarse el concepto dando un segundo paso de derivacin de la segunda cadena hacia
una tercera, y luego un tercer paso de derivacin, y luego un cuarto, etc.
As por ejemplo en la GRLD G vista arriba es posible escribir lo siguiente:
Sba => aXba => abXba
Donde para el primer paso de derivacin se ha utilizado la primera produccin (el subrayado
ayuda a ver esto), y para el segundo paso de derivacin se ha utilizado la tercera produccin
(las letras en negrita ayudan a ver esto).
Cuando escribimos ms de un paso de derivacin lcitamente, es posible resumir estos varios
pasos de derivacin escribiendo un asterisco sobre la doble flecha.
De este modo en vez de Sba => aXba => abXba podemos escribir Sba =>* abXba y decir
que abXba deriva de Sba.

En la misma GRLD G es evidente que aXa => abXa => abbXa => abbbXa => abbbbXa
donde se ha usado varias veces la tercera produccin, esto mismo puede escribirse/resumirse
as aXa =>* abbbbXa, lo que indica que abbbbXa deriva de aXa.
Una forma ms amigable de mostrar una derivacin paso a paso, por ejemplo de S =>* abc, es
as:

S => aX utilizando la primera produccin


=> abY utilizando la segunda produccin
=> abc utilizando la cuarta produccin

Como convencin ntese que usamos doble flecha => (con o sin asterisco) en las
derivaciones, y que utilizamos flecha simple --> en las producciones.

En rigor, lo que llamamos un paso de derivacin no es sino el establecimiento de una relacin


(de derivacin) entre cadenas denotada por =>; y lo que estamos llamando resumen no es otra
cosa que la clausura reflexiva transitiva de dicha relacin, lo que se denota por =>*; por este
motivo debido a la identidad de la clausura reflexiva transitiva- siempre es posible escribir
que u =>* u para cualquier cadena u.

Cadenas generables por la GRLD G


Aunque en teora en una GRLD podemos comenzar una derivacin con cualquier cadena en
(N T)+, es importante considerar las derivaciones que comienzan por el smbolo raz S, es
decir, con la cadena u = S.

En el ejemplo de la GRLD G de arriba podemos escribir lo siguiente:


S => aX utilizando la primera produccin
=> abX utilizando la tercera produccin

13
=> abbX utilizando la tercera produccin
=> abbbX utilizando la tercera produccin
=> abbbbY utilizando la segunda produccin
=> abbbbc utilizando la cuarta produccin
lo que es lo mismo S =>* abbbbc
Y tambin
S => aX utilizando la primera produccin
=> abY utilizando la segunda produccin
lo que es lo mismo S =>* abY
En el primer caso decimos que abbbbc deriva de S; y en el segundo que abY deriva de S.

Una cadena que pueda formarse con los smbolos de (N T), es generable -o se puede
generar- en la GRLD G (tambin denominada forma sentencial) si dicha cadena deriva de S.

Hemos llegado a uno de los problemas centrales de las GRLDs: dada una cadena decir si la
misma deriva o no deriva del smbolo raz S, es decir, si es una forma sentencial.

Con la GRLD que estamos viendo, la cadena abY si se puede generar en G pues S =>* abY, y
el ejemplo de arriba muestra cmo sera esta derivacin paso a paso.
En cambio la cadena aY no se puede generar en G Intente escribir una derivacin paso a paso
que comience en S y termine en aY! simplemente es imposible.

Por ahora, para indicar que una cadena si se puede generar en una GRLD basta la derivacin
paso a paso, misma que puede seguirse en detalle para ver si las producciones se han utilizado
correctamente. Sin embargo, para indicar que una cadena no se puede generar en una GRLD
slo tenemos como ayuda el trabajo mental que podamos hacer con las producciones, ms
tarde buscaremos otros recursos.

L(G) lenguaje generado por una GRLD


El lenguaje generado por una GRLD G denotado por L(G) se define as:
L(G) = { conjunto de todas las cadenas de slo Terminales que se pueden generar en G }
Exactamente lo mismo lo anotaremos de manera formal as:
L(G) = { cadenas v de slo Terminales / S =>* v }
L(G) = { v T* / S =>* v }

Llegamos as a otro problema central en GRLDs:


Decidir si una cadena pertenece o no a L(G) para una GRLD G dada, es decir, si tal cadena de
slo Terminales se deriva o no de S en la gramtica.

Ejemplo:
Con la GRLD G de arriba, es claro que abbbbc L(G) pues ya mostramos con todo detalle
que S =>* abbbbc.

14
Es tambin posible evidenciar, por inspeccin de las producciones, que bbb L(G) pues toda
cadena generable en la GRLD debe empezar su derivacin utilizando la primera produccin
las otras producciones no tienen a S como parte izquierda-, sin embargo, esta primera
produccin convierte S en aX, de manera que las cadenas generables tendrn una a como
primer smbolo Terminal condicin que no cumple bbb.

Ya dijimos que, para mostrar que una cadena no se puede generar en una GRLD slo tenemos
como ayuda la a veces no tan simple inspeccin de las producciones. Cuando la GRLD
tiene pocos Terminales y No Terminales y cuando el nmero de sus producciones es menor,
este anlisis tiende a simplificarse, empero, cuando esto no es cierto, hacen falta recursos
tericos adicionales y una alta dosis de prctica.

Ejemplos de L(G):
Fjese que la definicin de L(G) dice todas: no una, ni algunas, ni casi todas. Dice todas las
cadenas de Terminales que se puedan derivar de S. Es decir, hay que imaginar cada una de las
posibles derivaciones.

Sea la GRLD G=({S,X}, {a,b}, P, S)


P:
S --> aX
X --> a
Ntese la manera en que se presentan N y T, forma tambin vlida.
L(G)={aa} nicamente la cadena "aa" es de slo Terminales y derivable desde S

Sea la GRLD G=({S,X,Y}, {a,b}, P, S)


P:
S --> aX
X --> bY
Y --> a
L(G)={aba} nicamente la cadena "aba" es de slo Terminales y se deriva de S

Sea la GRLD G=({S,X,Y}, {a,b}, P, S)


P:
S --> aX
X --> bS
L(G) = { } No hay siquiera una cadena de slo Terminales que se pueda derivar de S

Sea la GRLD G=({S}, {a}, P, S)


P:
S --> aS
S --> a

15
Este es un buen ejemplo para ir comprendiendo las GRLDs. Ahora no debera ser difcil
confirmar que las siguientes derivaciones son lcitas:
En vez de por la segunda produccin, escribiremos simplemente por 2.
i) S =>* a Pues S => a por 2
ii) S =>* aa Pues S => aS por 1
=> aa por 2
iii) S =>* aaa Pues S => aS por 1
=> aaS por 1
=> aaa por 2
iv) S =>* aaaa Pues S => aS por 1
=> aaS por 1
=> aaaS por 1
=> aaaa por 2
Si analizamos mentalmente el comportamiento de la GRLD entonces podemos inducir que
tambin lo siguiente es vlido: S =>* aaaaa, S =>* aaaaaa, etc. As
L(G)={ secuencias de as: una a, dos as, tres as, etc.} = {a, aa, aaa, aaaa, aaaaa, ...}

Este ejemplo nos muestra la necesidad de tener una forma de describir los lenguajes cuando
son conjuntos infinitos (o finitos muy grandes). Utilizaremos para ello y de manera libre las
operaciones y notaciones generalmente utilizadas con cadenas y/o lenguajes: la inversa,
concatenaciones, el uso de los parntesis, potencias de cadenas, longitudes, etc.
As para este caso tenemos L(G) = {ak / k > 0 } pues
L(G) = {ak / k > 0 } = {a1, a2, a3, ...} = {a, aa, aaa, ...}

Sea la GRLD G=({S,X}, {a,b}, P, S)


P:
S --> aX
X --> bX
X --> b
L(G)={abk / k > 0}, es decir, una a seguida de una, dos o ms bs.

Sea la GRLD G=({S,X,Y}, {a,b,c}, P, S)


P:
S --> aX
X --> bS
X --> bY
Y --> c
Veamos algunas derivaciones para visualizar el comportamiento de esta GRLD.
i) S=>aX=>abY=>abc
ii) S=>aX=>abS=>abaX=>ababY=>ababc
iii) S=>aX=>abS=>abaX=>ababS=>ababaX=>abababY=>abababc
Esto nos sugiere L(G)={(ab)kc / k > 0}

16
Sea la GRLD G=({S,X,A}, {0,1,2,3,4,5,6,7,8}, P, S)
P:
S-->0X
S-->8
X-->3S
Hay algunos terminales que no se usan y A tampoco se usa en las producciones pero ello no
est prohibido por nuestra definicin. Es un buen ejemplo cuyo L(G)={ (03)k8 / k 0 }.

Sea la GRLD G=({S,X,Y}, {a,b,c}, P, S)


P:
S-->aX
X-->bY
X-->bX
Y-->c
L(G) = {abkc / k > 0 }

Sea la GRLD G=({S,X}, {a,b}, P, S)


P:
S-->aX
X-->bS
S-->b
L(G)={ (ab)kb / k 0 }

Dado un lenguaje escribir las producciones


Un aspecto complementario consiste en escribir la GRLD G cuando nos dan un conjunto dado
de cadenas de slo Terminales, es decir un lenguaje propuesto que denotaremos por L.

Ejemplos:
Construya una GRLD G para el lenguaje L={ akbi / k > 0, i > 0 }
Podemos escribir la siguiente GRLD slo incluimos las producciones-:
P:
S --> aS
S --> aB
B --> bB
B --> b

Construya una GRLD G que genere L={aub / u {a,b}*}


La siguiente GRLD hace ello slo incluimos las producciones-:
P:
S-->aX X-->aX
X-->bX X-->b

17
Dudas comunes
Cuando se intenta derivar una cadena a partir de S -o de cualquier otra cadena- el orden y el
nmero de veces que se utilicen las producciones no importa. Existen derivaciones donde se
utiliza una; otras en que se utilizan dos, tres o ms. Tampoco es necesario un orden dado. Se
puede utilizar slo la ltima; slo la penltima; la tercera luego la primera; etc., etc., etc.

En las producciones es posible que no se utilicen algunos Terminales o algunos No


Terminales; tambin es posible que existan producciones que no intervengan en el lenguaje
derivado, no hay problema siempre que respeten el formato, por ejemplo la siguiente GRLD,
de la que slo presentamos P:
S-->aS
S-->a
Z-->aS
Y-->b
genera L(G)={ak / k>0}, pero ni la tercera ni la cuarta produccin intervienen en la generacin
de cadenas de slo Terminales a partir de S. No hay problema toda ella es una muy buena
GRLD.

Cuntos No Terminales/Terminales deben tener la gramticas? Desde 1 hasta n (finito)


depende del lenguaje que estemos considerando.
Cuntas producciones del tipo X --> a deben tener las gramticas? Desde cero hasta todo P,
depende del lenguaje que estemos considerando.
Cuntas producciones deben tener las gramticas y de qu forma? Desde 1 hasta n (finito),
depende -sobre todo la forma de las producciones- del lenguaje que estemos considerando.

Errores comunes
Sea la GRLD G=({S,X}, {a,b}, P, S)
P:
S --> aX
X --> bS
S --> b
Un primer error es de notacin:
Si queremos describir que S =>* abb, ello puede hacerse as:
S => aX por 1
=> abS por 2
=> abb por 3
Pero no as:
S => aX por 1
S => abS por 2
S => abb por 3
Pues aqu la "S" que est a la izquierda de la segunda lnea y de la tercera hace que esta
descripcin sea errnea. En vez de decir lo que queremos, pareciera describir tres ejemplos de
derivacin que obviamente no son lcitos en los dos ltimos casos.

18
Un segundo error es no percibir que hay una diferencia fuerte entre una cadena derivable a
partir de otra cadena y una cadena en L(G), en este ltimo caso se exige que la derivacin
empiece en S. Las cadenas en L(G) son cadenas de slo terminales cuya derivacin comienza
en S (no en X, no en bS, no en SS, sino en S sola).
Por ejemplo cuando con alguna GRLD indicamos que bababb est en L(G) pues
X=>bS=>baX=>babS=>babaX=>bababS=>bababb en esa gramtica, ello no es correcto pues
esta argumentacin incluye una derivacin que no comienza en S.
Igual de errado sera indicar que S=>*abb porque sabemos que aX=>abS =>abb.
Un tercer error comn es esperar que las gramticas se comporten slo como quisiramos,
olvidando otras posibles derivaciones. Por ejemplo, cuando se desea escribir una GRLD G
que genere L(G)={(ab) k / k>0}, hay quienes presentan falsas soluciones de este tipo, slo
incluimos P:
S --> aS
S --> bS
S --> b
Bajo el siguiente razonamiento: esta derivacin es posible S=>aS=>ab (por 1 y luego3);
tambin S=>aS=>abS=>abaS=>abab (por 1, 2, 1 y 3); y tambin S=>*ababab, S=>*abababab;
etc., luego L(G)= {(ab) k / k>0}.
Todas estas derivaciones son correctas, pero y aqu est lo errado del razonamiento- no son
las nicas posibles. En esta GRLD tambin se puede derivar S=>*bbb, S=>*bab, etc.
En estricto rigor para este caso {(ab) k / k>0} L(G) y, ms precisamente, L(G)={a,b}*.{b}.

Ntese que para denotar L(G) hemos apelado a una notacin que va ms all de las potencias
de cadenas. Un cuarto error comn es encerrarse en algn tipo de notacin, por ejemplo
potencias, subutilizando otras posibilidades.
En este ejemplo tambin podemos escribir L(G)={ub / u T*} con T={a,b}.

El tercer error que estamos comentando es muy usual, presentaremos ms casos.


Construya una GRLD G que genere L={ oruro }
P errneo:
S-->oX
X-->rY
Y-->uX
Y-->o

Segundo P errneo:
S-->oS
S-->rU
U-->uR
R-->rO
O-->o

19
Recordemos que G debe generar oruro y slo oruro.
Pero en el primer caso es claro que S=>oX=>orY=>oro, tambin se puede derivar orururo,
orururururo, etc. Este es un tpico ejemplo de casi est bien, que en rigor significa: est mal.
En el segundo caso es claro que se puede derivar oruro, ruro, oooooooooruro, ooooruro, etc.

Construya una GRLD G que genere L={aub / u {a,b}* }


P errneo:
S-->aX
X-->aY
Y-->bX
X-->bY Esta GRLD no puede generar "ababbb" que est en L. No es solucin.
Y-->b
Otro P errneo:
S-->aS
S-->bS
S-->a Genera a, b, bba, etc. Que no estn en L. No es solucin.
S-->b
Otro P errneo:
S-->aX
X-->bY
X-->aY
X-->bS
X-->aS
Y-->aX No logra generar abbbb, abbbbbb, etc. No es solucin
Y-->b

GRAMTICAS REGULARES LINEALES IZQUIERDAS


La idea de Gramtica Regular Lineal Izquierda es semejante a la idea de GRLD. Lo nico que
vara es el formato de las partes derechas de las producciones.
Una Gramtica Regular Lineal Izquierda (GRLI), denotada por G, es una cudrupla:
G=(N, T, P, S) donde
N es un alfabeto de No Terminales
T es un alfabeto de Terminales
N y T son disjuntos (Nun smbolo no puede ser Terminal y No Terminal a la vez.
S es un smbolo de N, es decir, S N, y se llama el smbolo raz de la GRLI.
P es un conjunto finito, no vaco, de producciones.

Una produccin de una GRLI es un par ordenado (,).


Al primer elemento lo denominaremos parte izquierda de la produccin y consiste de un
smbolo No Terminal cualquiera, N.

20
Al segundo elemento lo denominaremos parte derecha de la produccin y puede ser de dos
tipos: bien un smbolo Terminal; o bien un smbolo No Terminal seguido de un smbolo
Terminal, T o (N.T).
En vez de un par ordenado, es muy comn representar una produccin separando las partes
derecha e izquierda por un smbolo de flecha as: --> . Luego, las producciones en una
GRLI son o bien del tipo A-->a o bien del tipo A-->Ba (donde A,B N y a T).

Ejemplos:
Sea la siguiente Gramtica Regular Lineal Izquierda (GRLI) G=({S}, {a,b}, P, S)
P:
S --> Sa
S --> b

Sea la siguiente Gramtica Regular Lineal Izquierda G=({S,X,Y}, {a,b,c}, P, S)


P:
S --> Xc
X --> Yb
Y --> a

Sea la siguiente Gramtica Regular Lineal Izquierda G=({S,X,Y}, {a,b}, P, S)


P:
S --> Xa
X --> a

Todas las otras ideas que existen para GRLDs se aplican a GRLIs: derivacin, L(G), dado
un lenguaje escribir las producciones, etc., etc., etc.

La siguiente GRLI de la que slo mostramos P genera L(G)={oruro}


P:
S --> Ro
R --> Ur
U --> Zu
Z --> Or
O --> o

La derivacin de la cadena oruro sera as:

S => Ro por 1
=> Uro por 2
=> Zuro por 3
=> Oruro por 4
=> oruro por 5

21
Es interesante cmo las GRLIs generan los smbolos de derecha a izquierda, al revs que las
GRLDs.

Una gramtica regular o bien es una GRLI o bien es una GRLD, no puede ser ambas cosas a
la vez. Por ejemplo el siguiente conjunto de producciones P:
S --> Sa
S --> aS
S --> Xa
S --> aY
Y --> a no corresponde ni a una GRLI ni a una GRLD. Por ahora no tiene sentido,
X --> b aunque ms adelante diremos que es una gramtica libre de contexto.

Ms ejemplos:
Presentamos a continuacin ejemplos de gramticas tanto lineales izquierdas como derechas,
se puede aprender mucho de ellos. Aqu estn:

Sea la GRLD G=({S}, {a}, P, S)


P:
S --> aS
L(G)={ }

Sea la GRLI G=({S,X,Y}, {a,b}, P, S)


P:
S --> Sb | Xb
X --> Xa | a
L(G)={ akbi / k > 0, i > 0 }

Sea la GRLD G=({S,X,Y}, {a,b}, P, S)


P:
S --> aX
X --> aX | b | bY
Y --> bY | b
L(G)={ akbi / k > 0, i > 0 }
Es el mismo lenguaje que el del anterior ejemplo, lo que muestra que puede existir ms de una
gramtica regular que genere el mismo lenguaje.

Sea la GRLI G=({S,Y}, {0,1}, P, S)


P:
S --> 1 | S1| Y1
Y --> Y0 | 0
L(G)={ 0k1i / k 0, i > 0 }

22
Queremos enfatizar que k 0 no es lo mismo que k > 0. En general, al escribir L(G) debemos
ser precisa y rigurosamente exactos, basta que haya una cadena dems o una cadena de
menos para hacer errneo el resultado.

Sea la GRLD G=({S}, {0,1,2,3,4,5,6,7,8,9}, P, S)


P:
S --> 1S | 2S | 3S | 4S | 5S | 6S | 7S | 8S | 9S | 0S
S --> 0 | 2 | 4 | 6 | 8
L(G)={ uv / ( u T* ) y ( v=0 v=2 v=4 v=6 v=8 )}
Interpretadas las cadenas de slo Terminales como nmeros enteros no negativos, podramos
describir L(G) tambin as L(G)={ nmeros pares }.
Fjese que es probable que se describa as L(G)={2k / k0}, sin embargo, conviene aclarar
esta ltima notacin. Como estamos trabajando con cadenas, diera la impresin que
L(G)={20,21,22,23,24,......} -si se interpreta 2k como dos concatenado con k-; cuando lo que
significa 2k es la usual representacin de los nmeros pares. Por ello es mejor anclarse en el
mundo de las cadenas y los lenguajes (y los superndices como en la aritmtica usual),
aclarar la notacin si esta es pasible a ms de una interpretacin.

Sea la GRLI G=({S,X,Y}, {a,b}, P, S)


P:
S --> Xa | Xb
X --> Ya | Yb
Y --> Ya | Yb | a | b
L(G)={ u / ( u {a,b}* ) y ( |u| 3 ) }

Sea la GRLD G=({S,X}, {a,b,2}, P, S)


P:
S-->aX
S-->b
X-->2S
L(G)={ (a2)kb / k 0}

NOTACIN, CONVENCIONES Y TOMA DE POSICIN: el caso de la cadena vaca


Ya hicimos notar que, segn sea la literatura que se revise, existen varias diferencias de
notacin. Es tpico por ejemplo que muchos textos denoten a la cadena vaca con la letra
griega lambda (), mientras que otros la denotan con la letra griega psilon (), e incluso con
un cero (0); otros se refieren al alfabeto T con el smbolo , o con VT para el alfabeto de
Terminales y VN para el de No Terminales; en algunos lugares utilizan R para el smbolo raz;
otros prefieren no hacer diferencia de notacin entre --> y =>; etctera.
Eso no debiera ser un problema, basta hacer un convenio, es decir, llegar a un acuerdo para
elegir alguna notacin y trabajar con ella. Se sobreentiende que si leemos un documento con

23
otra notacin debiramos hacer un breve ejercicio mental -si fuera necesario- para traducir
dicho documento a nuestra notacin; o bien manejar personalmente ms de una notacin.

Hay asuntos ms complejos que van ms all de la simple notacin, se trata de la divisin que
existe entre los autores acerca de cuestiones, no de matiz, sino de fondo.
Por ejemplo est el caso terico de si P (el conjunto de producciones) puede ser vaco o no,
algunos tericos aceptan que P pueda tener cero producciones; y otros exigen que P sea no
vaco; en el tratamiento de autmatas finitos captulo que veremos ms adelante- ciertos
autores aceptan F vaco y otros exigen F no vaco; y como estas hay otras divergencias de
fondo.

Una por ahora es central en la materia que estamos viendo:


Hay autores que aceptan una GRLD G=({S}, {b}, P, S) as:
P:
S --> bS
S -->
Para indicar una GRLD G que genere L(G)={ bk / k 0 } Se sabe aqu que b0 =
Es decir que la parte derecha de una produccin no slo sea del tipo que presentamos en
nuestra definicin, sino que tambin se aceptan partes derechas con la cadena vaca , en
cambio otros niegan tal posibilidad, y otros aceptan una nica produccin de este tipo con S
como parte izquierda. Lo mismo sucede para las GRLIs.

Ntese que si aceptamos como parte derecha la siguiente GRLD: G=({S}, {b}, P, S)
P:
S -->
Genera L(G)={}
En cambio si no aceptamos como parte derecha, es decir, siguiendo nuestra definicin de
gramtica regular, dichas gramticas nunca podrn generar la cadena vaca.

Cuando se presentan este tipo de diferencias fuertes, no queda sino tomar posicin, mejor si es
en base a argumentos razonablemente plausibles. Nosotros iremos tomando posicin explcita
o implcitamente segn se presenten los dilemas.
Para el caso que nos ocupa conservaremos nuestra definicin y no aceptaremos como parte
derecha de ninguna produccin en una GR.

Una justificacin de ello es que si empezamos una derivacin en la cadena S entonces, por la
forma de las producciones, la segunda cadena -obtenida al dar el primer paso de derivacin-
ser de longitud mayor o igual que |S|; a partir de esta segunda se puede obtener una tercera
en un siguiente paso de derivacin que, por lo mismo, ser de longitud mayor o igual que la
segunda, etc. Es decir, si tenemos la siguiente derivacin genrica:
S => u2 => u3 => ... => un
Con nuestra toma de posicin se tiene que: |S| |u2| |u3| ... |un|

24
Que denominaremos propiedad de no decrecimiento y que permite disear algunas
demostraciones tericas sobre gramticas en general regulares y otras- que no tendran xito
si aceptamos como parte derecha, es decir, si la longitud de las cadenas en una derivacin
crece, decrece o se mantiene arbitrariamente.
Estas demostraciones sealan propiedades que a nuestro juicio- son ms trascendentales que
la facilidad de incluir como parte derecha o la posibilidad importante de generar la cadena
vaca.

Problemas varios
A continuacin presentamos problemas propuestos junto a sus soluciones. Sin embargo, es
importante que intente solucionarlos y -ms tarde- comparar las respuestas que se dan con sus
respuestas. Es claro que las soluciones que se muestran a continuacin no son nicas
necesariamente, es decir, no quiere decir que son estas a las que se debe llegar.
Pero sean cuales fueren sus soluciones, es claro tambin que deben ser correctas.

Problema 1
Escriba una GRLD G que genere cadenas en {a,b}* de longitud par y que terminen en a, es
decir, G debe ser tal que L(G)={ua / u {a,b}* y |u|=2i+1 i }
Solucin, slo escribimos P:
P={ S-->aA, S--> bA, A--> aB, A-->bB, B-->aA, B-->bA, A-->a }

Problema 2
Escriba una GRLD G que genere cadenas en {0,1,...,8,9}* que interpretadas como nmeros
naturales denoten nmeros divisibles por 3.
Solucin, slo escribimos P:
S --> 0S
S --> 1U U --> 0U D --> 0D
S --> 2D U --> 1D D --> 1S
S --> 3S U --> 2S D --> 2U
S --> 4U U --> 3U D --> 3D
S --> 5D U --> 4D D --> 4S
S --> 6S U --> 5S D --> 5U
S --> 7U U --> 6U D --> 6D
S --> 8D U --> 7D D --> 7S
S --> 9S U --> 8S D --> 8U
S --> 0 U --> 9U D --> 9D
S --> 3 U --> 2 D --> 1
S --> 6 U --> 5 D --> 4
S --> 9 U --> 8 D --> 7

Problema 3
Escriba una GRLD G que genere cadenas en {0,1,...,8,9}* que interpretadas como nmeros

25
naturales denoten nmeros impares.
Solucin, slo escribimos P:
S --> 1S | 2S | 3S | 4S | 5S | 6S | 7S | 8S | 9S | 0S
S --> 1 | 3 | 5 | 7 | 9

Problema 4
Escriba una GRLD G que genere cadenas en {0,1,...,8,9}* que interpretadas como nmeros
naturales denoten nmeros divisibles por 6.
Solucin, slo escribimos P:
S --> 0S | 1X | 2Y | 3S | 4X | 5Y | 6S | 7X | 8Y | 9S | 0 | 6
X --> 0X | 1Y | 2S | 3X | 4Y | 5S | 6X | 7Y | 8S | 9X | 2 | 8
Y --> 0Y | 1S | 2X | 3Y | 4S | 5X | 6Y | 7S | 8X | 9Y | 4

Problema 5
Escriba una GRLI G tal que L(G)={ uabaa / u {a,b}* }
Solucin, slo escribimos P:
P={S-->Aa, A-->Ba, B-->Zb, Z-->Xa, X-->Xa, X-->Xb, Z-->a, X-->a, X-->b}

Lenguaje regular
Un lenguaje cualquiera L se dice que es un lenguaje regular si existe una GRLD o una GRLI
que genera dicho lenguaje (que eso nos baste por ahora, en realidad hay ms casos en los que
a un lenguaje cualquiera se le puede decir regular).
Por ejemplo, a la pregunta si L={a} es o no un lenguaje regular podemos indicar que s
describiendo la GRLD que genera este lenguaje: G=({S}, {a}, P, S) P: S-->a

A la pregunta si L={ ak / k 0 } es o no un lenguaje regular podemos indicar que no. Nuestra


definicin de gramtica regular no permite a las gramticas regulares generar la cadena vaca,
y este lenguaje cuando k=0 incluye la cadena vaca.

Cuando se pregunta si un L dado es regular o no. Al responder que s debemos describir la


gramtica regular que lo genera.
Es un poco ms complicado responder que no, no basta que no podamos escribir una
gramtica, debemos mostrar que nadie puede ni podr hacerlo, veremos eso luego.

L(G) lenguaje generado por G versus L lenguaje que creemos genera G L=L(G)?
Hasta ahora hemos dejado de lado un hecho importante. En los ejemplos vistos no se ha
acompaado una razn, salvo la experiencia del autor, para evidenciar los lenguajes L(G) que
se han anotado.

Es claro que en gramticas sencillas, tales como P={S --> b}, basta la simple inspeccin para
escribir o concordar con L(G). Sin embargo, en otras gramticas ms largas y/o ms

26
complejas no suele ser claro el lenguaje generado, y por tanto debe exigirse una
argumentacin adems de la explicitacin de L(G).

Lamentablemente otro error comn es confundir una prueba del lenguaje generado por una
gramtica con la descripcin de algunas derivaciones. Para P={S --> aS, S --> a}, por
ejemplo, es un abuso escribir L(G)={ ak / k 0 } indicando que ... en efecto vase la
siguiente derivacin: S=>aS=>aaS=>aaa y quizs algunas otras derivaciones. Es una audacia
subtitular esto bajo el epgrafe de prueba. En rigor, una, dos o varias derivaciones no prueban
nada.

Ello es ms visible cuando se pide escribir una gramtica que genere L={algn lenguaje}; no
basta explicitar las producciones, de manera de confiar en el autor de las mismas, debiera
acompaarse una argumentacin o una demostracin de que el lenguaje L(G) generado por la
gramtica a travs de dichas producciones, coincide con el lenguaje L.

Expliquemos la diferencia fuerte que existe entre L y L(G) a travs de un ejemplo corto.
Suponga que tenemos el siguiente conjunto de producciones P={S --> bA, A --> a } y se nos
pide indicar el lenguaje que genera esta gramtica, suponga que escribimos L(G)={a}.
Evidentemente debido a la sencillez de la GRLD- ello no es cierto. Debido a esto, aunque la
literatura en general utiliza L(G) directamente, es ms prudente indicar el lenguaje que genera
esta gramtica a travs de L el nombre de un lenguaje-, as por ejemplo para esta gramtica
alguien podra indicar que la misma genera el siguiente lenguaje L1={ab}; e incluso un tercero
podra sugerir que no, que lo que genera esta gramtica es L2={b}.
Para cada L sugerido (L1, L2, etc. ) cada proponente tiene adems la tarea de demostrar que
L=L(G).

Lo mismo sucede cuando se pide construir las producciones para un L dado. Digamos que se
pide construir una GRLI para L={(ab)i / i > 0} y se propone P={S --> Sa, S --> Sb, S --> a};
no basta este conjunto, debe adems comprobarse que L=L(G) si ello es posible-.

Si se tiene
a) una gramtica y se sugiere un lenguaje L como el lenguaje que genera la gramtica; o
b) un lenguaje L y se construye el conjunto de producciones pensadas para generar L
y el observador cae en cuenta de que existe una clara equivocacin, es decir que L L(G), es
decir que esas producciones no generan el lenguaje que se indica en L, entonces en este caso
bastar la derivacin de una cadena que no est en L a travs de las producciones, a manera de
contraejemplo. Para P={ S --> Sa, S --> Sb, S --> a} y L={(ab)i / i > 0} basta con la
derivacin S => a (por 3) para mostrar una cadena que s est en L(G) y que no est en L pues
para ningn i sucede que a=(ab)i, esto es suficiente para comprobar que L L(G), en otras
palabras
a) si las producciones estaban dadas y se peda indicar el lenguaje que generan, dicho L est
errado; o

27
b) si L estaba dado y se peda construir las producciones de una GRLI, tales producciones no
generan L.

Sin embargo, si parece que en efecto el lenguaje que genera la gramtica L(G) es el mismo
que el lenguaje L, entonces dicho parecer debe transformarse en seguridad a travs de una
demostracin.

La demostracin o prueba de que L=L(G) tiene dos partes:


i) L L(G), las cadenas del tipo indicado en L s se pueden generar en G, esto se hace con
frecuencia por induccin sobre la longitud de las cadenas en L; y
ii) L(G) L, las cadenas que genera G son del tipo indicado en L, esto se hace con frecuencia
por induccin sobre el nmero de pasos de derivacin en G.

Si bien esta es una salida genrica, las demostraciones son comnmente ridas.

Ejemplos:
Sea la GRLI G=({S}, {a}, P, S)
P:
S --> Sa
S --> a
Sugerimos que el lenguaje que genera G es L={ai / i > 0}
Y demostraremos que L=L(G)

i) L L(G)
Sea u L entonces -debemos demostrar que- u L(G).
Para las cadenas que tienen la forma sugerida en L, debemos demostrar que dichas cadenas se
derivan a partir de S en G.
Por induccin sobre la longitud de las cadenas en L.
Es claro que las cadenas en L tienen, genricamente, una longitud |u|=i, i > 0.
Caso base:
La cadena ms pequea en L tiene longitud |u|=1, cuando dicha cadena es u=a, para i=1.
La derivacin S => a (por 2), es lcita y muestra que u L(G)
Hiptesis inductiva:
Toda cadena u L de longitud |u|=i dicha cadena no es otra que u=ai-, s se puede derivar de
S en G (S=>*u), es decir, tambin est en L(G), o lo que es lo mismo u L(G).
Paso inductivo:
Sea una cadena w L de longitud |w|=i+1, es decir w=ai+1=ua donde |u|=i, u=ai
La siguiente derivacin es lcita.
S => Sa por 1
=>* ua por hiptesis inductiva pues S=>*u, cuando u=ai, es decir, cuando u L y |u|=i
Luego S=>*w, lo que muestra que w L(G).

28
Por el caso base, la hiptesis inductiva y el paso inductivo: L L(G)

ii) L(G) L
Sea u L(G) entonces -debemos demostrar que- u L.
Para las cadenas que se derivan a partir de S en G, debemos demostrar que dichas cadenas
tienen la forma indicada en L.
Por induccin sobre el nmero de pasos de derivacin de una cadena en L(G).
Caso base:
Sea u L(G) que se deriva en el menor nmero de pasos de derivacin, es decir un paso. La
nica cadena que se puede derivar de S en un solo paso, con la derivacin S => a (por 2), es
u=a.
Ahora u=a=a1=ai con i=1, que obviamente obedece el formato de L, es decir, u L.
Hiptesis inductiva:
Toda cadena u L(G) que se deriva de S en k pasos o menos tambin est en L, o lo que es lo
mismo u L.
Paso inductivo:
Sea w L(G) que se deriva de S en k+1 pasos.
Para dar k+1 pasos de derivacin primero damos un paso de derivacin y luego los restantes
k pasos, desglosemos pues de este modo los k+1 pasos de derivacin de w.
S => cadenauno aqu est el primer paso de derivacin
=>* w a partir de cadenauno se dan otros k pasos de derivacin para obtener w
haciendo un total de k+1 pasos de derivacin

Ahora bien por la forma de las producciones de G, en el primer paso de derivacin a partir de
S, la cadena resultante (cadenauno) no puede ser otra que Sa utilizando la primera produccin
(pues la otra alternativa es utilizar la produccin 2 que nos devuelve al caso base y que deja
los restantes k pasos iguales a cero).
Luego la derivacin de w a partir de S en k+1 pasos no debe ser otra que
S => Sa por 1, primer paso de derivacin
=>* w w se obtiene de Sa con los siguientes k pasos de derivacin

Pero entonces, por el mecanismo de funcionamiento de las GRLIs, w es de la forma w=ua


donde S=>*u en k pasos, es decir,
S => Sa por 1
=>*ua(=w) w=ua se obtiene de Sa, con la derivacin S=>*u en k pasos

Pero entonces, por hiptesis inductiva u L, puesto que se deriva de S en k pasos, es decir,
u=ai (i>0), de donde w=aia. Es decir, w=ai+1, o lo que es lo mismo w=aj, con j=i+1 (j > 0).
Luego, w L.

Por el caso base, la hiptesis inductiva y el paso inductivo: L(G) L

29
Por i) L L(G) y ii) L(G) L, concluimos que L=L(G).

Sea la GRLI G=({S1,S}, {a,b}, P, S1)


P:
S1 --> Sb
S --> Sa
S --> a
Ntese que aqu S es un No Terminal cualquiera y que el smbolo raz es S1
Sugerimos que el lenguaje que genera G es L={aib / i > 0}

Podemos reutilizar la demostracin de arriba donde se vio que


S=>*u si y solo s u=ai con i > 0
Por tanto, por el mecanismo de funcionamiento de las GRLIs,
S1 => Sb por la primera produccin
=>*ub con u=ai con i > 0 por la demostracin de arriba
Luego
S1=>*ub si y solo s u=ai con i > 0, es decir
S1=>*w si y solo s w=aib con i > 0, es decir L=L(G)

Sea la GRLD G=({S,B}, {a,b}, P, S)


P:
S --> aB
B --> bS
B --> b
Sugerimos que el lenguaje que genera G es L={(ab)i / i > 0}
Y demostraremos que L=L(G)

i) L L(G)
Sea u L entonces -debemos demostrar que- u L(G).
Para las cadenas que tienen la forma sugerida en L, debemos demostrar que dichas cadenas se
derivan a partir de S en G.
Por induccin sobre la longitud de las cadenas en L.
Es claro que las cadenas en L tienen, genricamente, una longitud |u|=2i, i > 0.
Caso base:
La cadena ms pequea en L tiene longitud |u|=2, cuando dicha cadena es u=ab, para i=1
La derivacin
S => aB por 1
=> ab por 3
es lcita y muestra que u L(G)
Hiptesis inductiva:
Toda cadena u L de longitud |u|=2i dicha cadena no es otra que u=(ab)i-, s se puede
derivar de S en G (S=>*u), es decir, tambin est en L(G), o lo que es lo mismo u L(G).

30
Paso inductivo:
Sea wL de longitud |w|=2(i+1)=2i+2, es decir w = (ab)i+1 = abu donde |u|=2i, u=(ab)i
La siguiente derivacin es lcita.
S => aB por 1
=> abS por 2
=>*abu por hiptesis inductiva
pues S=>*u, cuando u=(ab)i, esto es, cuando u L y |u|=2i, que es el caso
Luego S=> w, lo que muestra que w L(G)
*

Por el caso base, la hiptesis inductiva y el paso inductivo: L L(G).

ii) L(G) L
Sea u L(G) entonces -debemos demostrar que- u L.
Para las cadenas que se derivan a partir de S en G, debemos demostrar que dichas cadenas
tienen la forma indicada en L.
Por induccin sobre el nmero de pasos de derivacin de una cadena en L(G).
Caso base:
Sea u L(G) que se deriva en el menor nmero de pasos de derivacin, en el caso que nos
ocupa dos pasos. La nica cadena que se puede derivar de S en dos pasos, con la derivacin
S=>aB=>ab -por 1 y 3 respectivamente- es u=ab.
Ahora u=ab=(ab)1=(ab)i con i=1, que obviamente obedece el formato de L, es decir, u L.
Hiptesis inductiva:
Toda cadena u L(G) que se deriva de S en menos de k pasos tambin est en L, o lo que es
lo mismo u L.
Paso inductivo:
Sea w L(G) que se deriva de S en k pasos.
Vamos a desglosar estos k pasos de derivacin de la siguiente manera, notando que para el
primer paso de derivacin la nica produccin utilizable es la primera.
S => aB aqu est el primer paso de derivacin, por 1
=> abS por 2
la otra alternativa para este segundo paso de derivacin es usar la produccin 3
lo que nos devuelve al caso base ya visto
=>*abu los restantes pasos (del total de k pasos) para obtener w

De manera que w es de la forma w=abu.


Ms an u deriva de S, S=>*u, en menos de k pasos (k-2 si queremos ser precisos), pero
entonces por hiptesis inductiva u L, es decir, u=(ab)i (i>0).
De donde w=ab(ab)i, es decir, w=(ab)i+1, o lo que es lo mismo w=(ab)j, con j=i+1 (j > 0).
Luego, w L.
Por el caso base, la hiptesis inductiva y el paso inductivo: L(G) L.

Por i) L L(G) y ii) L(G) L, concluimos que L=L(G).

31
Aunque la literatura rara vez demuestre la comprobacin del lenguaje generado para una
gramtica completa, es importante comprender la significacin del razonamiento expuesto: la
comprobacin de que un conjunto dado de producciones genera un lenguaje determinado;
pues de lo contrario la teora tendra poco que ofrecer y nosotros mucho que confiar a ciegas-
en lo que los proponentes de Ls o de producciones hagan.
Las ideas aqu presentadas no slo sirven para gramticas regulares sino que pueden aplicarse
a otro tipo de gramticas.

32
CAPTULO 3. AUTMATAS FINITOS

As como hay gramticas regulares lineales izquierdas y derechas que son diferentes pero que
en el fondo hacen lo mismo, tambin hay varios tipos de Autmatas Finitos (AFs). Es usual
considerar principalmente los determinsticos y los no determinsticos pero no son los nicos.

AUTMATAS FINITOS DETERMINSTICOS (AFDs)


Un Autmata Finito Determinstico (AFD) es una quntupla A = ( K, , , q1, F ) donde
K : conjunto finito no vaco de estados
: alfabeto de entrada
: funcin de transicin (formalmente se define as : K X ---> K debe ser total)
q1 : estado inicial del AFD q1 K (es decir, q1 debe estar en K)
F : conjunto de estados finales F K

Ya advertimos que a menudo debemos tomar posicin respecto a varias cosas: en otros
lugares suelen usar q0 como estado inicial, nosotros haremos uso generalmente de q1.
Tampoco permitimos el conjunto vaco como conjunto de estados.
En cambio F s puede ser vaco en nuestro caso.

Ejemplo:
El siguiente es un Autmata Finito Determinstico (AFD) A:
A = ( K, , , q1, F )
={q1,q2,q3}
={a,b}
F={q2,q3}
:
(q1,a)=q2
(q1,b)=q3
(q2,a)=q3
(q2,b)=q1
(q3,a)=q1
(q3,b)=q3

Esta es la apariencia de un AFD descrito formalmente. Fjese que respecto al captulo


anterior- es parecido a T y que as como S debe estar en la cudrupla que define a una
gramtica -y en N-, tambin q1 debe estar en K y en la quntupla que define al AFD A.

As como a los elementos de P se les llama producciones en una gramtica, a los elementos de
se les llama reglas de transicin.
Nuestro ejemplo tiene 6 reglas de transicin, la penltima regla de transicin es (q3,a)=q1

33
Funcin total y determinismo
Sea (qi,a)=qj una regla de transicin genrica.
qi se denomina estado de partida de la regla de transicin.
qj se denomina estado de llegada de la regla de transicin.
Cuntas reglas de transicin debe tener A? Esta es una pregunta importante en AFDs.
La definicin formal de indica que esta es una funcin total, entonces, cuando ya tenemos
definido qu es K, qu es y cuntos elementos tienen, es obligatorio colocar |K| * || reglas
de transicin. |K| denota el nmero de estados, |denota el nmero de smbolos del alfabeto
de entrada, y * denota la multiplicacin usual.
En el ejemplo 1 tenemos 3 estados y 2 smbolos en el alfabeto de entrada luego deben existir 6
reglas de transicin.

Como es una funcin total y su dominio es (K X ), entonces debe haber una regla de
transicin y solo una para todos y cada uno de los pares del tipo (qi,ak). Cul estado de
llegada depende del lenguaje que estemos considerando, dejaremos de lado ello por ahora,
basta que sea un elemento de K.

Otros ejemplos:
El siguiente es un Autmata Finito Determinstico (AFD) A:
A = ( K, , , q1, F )
={q1,q2}
={a,b}
F={q1}
: tenemos |K|=2 y ||=2 luego deben haber 4 reglas de transicin
(q1,a)=q2
(q1,b)=q2
(q2,a)=q1
(q2,b)=q1

El siguiente es un Autmata Finito Determinstico (AFD) A:


A = ( K, , , q1, F )
={q1}
={a,b}
F={ }
:
(q1,a)=q1
(q1,b)=q1
Fjese que F es vaco, todo est correcto, nuestra definicin de AFD permite esto.

El siguiente es un Autmata Finito Determinstico (AFD):

34
A = ( K, , , q1, F )
={q1,q2}
={1}
F={q1}
:
(q1,1)=q2
(q2,1)=q1
Como con T, convendremos que generalmente constar de letras minsculas y/o dgitos.

Errores comunes
Sea A = ( K, , , q1, F )
={q1,q2}
={a,b}
F={q1}
: tenemos |K|=2 y ||=2 luego deben haber 4 reglas de transicin
Fjese que la siguiente funcin de transicin es mala:
(q1,a)=q2
(q1,a)=q1
(q2,a)=q3
(q2,b)=q1
Porque el par (q1,a) tiene dos reglas -no es funcin, no respeta eso de una y slo una regla de
transicin; adems el par (q1,b) no tiene una regla de transicin asociada, no tiene estado de
llegada, no respeta eso de que haya una regla para todos y cada uno de los pares; finalmente
q3 no es un estado en K.

Tambin sera errneo escribir este conjunto , dados los conjuntos K y de arriba:
(q1,a)=q2
(q1,b)=q1
(q2,b)=q2
El par (q2,a) no tiene una regla asociada.

Resumiendo una funcin de transicin lcita es aquella en la que hay una y solo una regla de
transicin por cada par (qi,ak) y una regla de transicin para todos los pares, esto quiere decir
que sea total.

Otras formas de representacin de los AFDs


Los AFDs se representan de varias maneras: listar cada uno de los elementos de la quntupla
como en los ejemplos anteriores es un modo habitual.

Tambin se usan tablas de dos entradas para describir la funcin

35
As por ejemplo el AFD A = ( {q1,q2}, {a,b}, , q1, {q1} )
: (q1,a)=q2(q1,b)=q2 (q2,a)=q1 (q2,b)=q1

Se representar as: A = ({q1,q2}, {a,b}, , q1, {q1} )


a b
q1 q2 q2
q2 q1 q1

Una representacin ms popular y ms esttica apela a los grafos, dibujando lo que se llama
la red o diagrama de transiciones o de estados.
Dicha grfica puede ayudar a visualizar mejor un AFD tanto l mismo como su
funcionamiento- y por eso es una herramienta importante, sin embargo, no es obligatorio
graficar un AFD.
Como dijimos bsicamente se trata de pintar un grafo donde los nodos son los estados y las
etiquetas son los smbolos de .
A cada estado de un AFD le corresponde un crculo simple. Si el estado en cuestin es adems
un estado final entonces le corresponde un crculo doble. El estado inicial se identifica
fcilmente pues es el estado q1 (otros lo sealan con una flecha cortita).
Si tenemos la regla de transicin (qi,ak)=qj entonces dibujamos un arco con etiqueta ak desde
el nodo qi hasta el nodo qj

El ejemplo que estamos siguiendo se ve as:

Ntese que salvo excepciones que veremos luego- basta el diagrama de transicin para
deducir F (los crculos dobles), K (todos los nodos), (las etiquetas de los arcos) y las
transiciones (el sentido de los arcos), es decir, que podemos presentar un AFD A mostrando
slo su grfica.

Mostraremos otros dos ejemplos con estas tres representaciones.

Ejemplos:
Sea el AFD A = ( {q1,q2}, {1}, q1{q1} )
i): (q1,1)=q2 (q2,1)=q1

36
ii)
1
q1 q2
q2 q1
iii)

Sea el AFD A = ( {q1}, {a,b}, q1{ } )


i) : (q1,a)=q1 (q1,b)=q1
ii)
a b
q1 q1 q1
iii)

Al dibujar el diagrama de transicin, en casos como este, es decir, ms de un arco yendo de un


mismo nodo de partida a un mismo nodo de llegada, es usual utilizar un solo arco y poner
todas las etiquetas que correspondan separadas por una barra (o por comas o por algn otro
separador). Luego es ms usual este tipo de diagrama (como ya vimos en el primer ejemplo):

37
AFDs: mecanismo de funcionamiento
As como en una gramtica se tiene la idea de derivacin de cadenas usando producciones
para cada paso de derivacin, en un AFD se tiene la idea de transiciones usando reglas de
transicin para cada movimiento:

En una gramtica En un AFD


se tiene la idea de Derivaciones Transiciones
y se usan Producciones Reglas de transicin
para dar pasos de derivacin Movimientos

Una gramtica regular genera cadenas, en cambio un AFD acepta o reconoce cadenas. Para
describir cul el mecanismo de funcionamiento para este reconocimiento necesitamos algunos
conceptos previos.

Descripciones instantneas en AFDs


Una descripcin instantnea en un AFD -que se abrevia d.i.- es un par ordenado donde el
primer elemento es un estado del AFD y el segundo elemento es una cadena, por ejemplo
(q2,abba).

Movimiento(s) en un AFD
As como usbamos => para denotar un paso de derivacin usaremos |-- para denotar un
movimiento en un AFD.
Con un movimiento pasamos de una d.i. a otra d.i.
Ejemplo:
Si tenemos la regla de transicin (q1,b)=q2
podemos dar el siguiente movimiento (q1,bab) |-- (q2,ab)

Es importante fijarse que el movimiento se puede dar slo si:


a) el primer smbolo de la cadena en la d.i. actual (en negrita) es igual al smbolo de la regla
de transicin que queremos usar (en nuestro ejemplo b).
b) el estado en la d.i. actual (en negrita) es igual al estado de partida de la regla de
transicin que queremos usar (en nuestro ejemplo q1).

Luego de un movimiento la d.i. actual cambia a otra d.i. (en nuestro ejemplo (q2,ab) ) que se
obtiene as:
a) el estado de esta nueva d.i. es el estado de llegada de la regla de transicin que hemos
usado.
b) la cadena de esta nueva d.i. es semejante a la cadena de la d.i. actual (en negrita) excepto
su primer smbolo que se omite.

38
Cuando el AFD da un movimiento diremos que ha ledo o consumido un smbolo de la cadena
de entrada.
Formalmente (qi,bu) |-- (qj,u) slo si (qi,b)=qj est en (donde bu)

Otros ejemplos:
Si tenemos la regla de transicin (q1,b)=q2
podemos dar el siguiente movimiento (q1,bb) |-- (q2,b)

Si tenemos la regla de transicin (q2,a)=q2


podemos dar el siguiente movimiento (q2,aaaba) |-- (q2,aaba)

Si tenemos la regla de transicin (q3,1)=q1


podemos dar el siguiente movimiento (q3,1111) |-- (q1,111)

Si tenemos la regla de transicin (q1,a)=q1


podemos dar el siguiente movimiento (q1,aba) |-- (q1,ba)

Transiciones = muchos movimientos


As como resumimos muchos pasos de derivacin con =>* tambin podemos resumir muchos
movimientos con |--*, en realidad |-- es una relacin entre descripciones instantneas y |--* es
su clausura reflexiva transitiva.
Tericamente un AFD puede empezar su trabajo con cualquier descripcin instantnea
(cualquier estado en K, cualquier cadena en ).
As, trabajando con el AFD A = ( {q1,q2}, {a,b}, , q1, {q1} )
:
(q1,a)=q2
(q1,b)=q2
(q2,a)=q1
(q2,b)=q1

Un ejemplo de muchos movimientos (un ejemplo de transiciones) es:


(q2,bbab) |-- (q1,bab) por la cuarta regla de transicin
|-- (q2,ab) por la segunda regla de transicin
|-- (q1,b) por la tercera regla de transicin
Resumiendo (q2,bbab) |--* (q1,b)

39
Otro ejemplo de muchos movimientos:
(q2,aaa) |-- (q1,aa) por la tercera regla de transicin
|-- (q2,a) por la primera regla de transicin
|-- (q1,) por la tercera regla de transicin
Resumiendo (q2,aaa) |--* (q1,)

Ntese que cuando ya no quedan smbolos que leer o cunsumir en la cadena de entrada, ese
hecho se denota por y el AFD ya no puede dar ms movimientos.

T(A): lenguaje aceptado por un AFD


Aunque en teora una serie de movimientos puede empezar en cualquier estado y detenerse en
cualquier momento, para decidir si una cadena cualquiera es aceptada o no por el AFD es
necesario:
i) empezar el trabajo del AFD con dicha cadena- en el estado inicial
ii) analizar y consumir todos los smbolos de la cadena de entrada
Si i) y ii) se cumplen, finalmente debe observarse en qu estado quedamos (cul es el estado
de la ltima d.i.), si es un estado final se dice que la cadena de entrada es aceptada por el
AFD, en otro caso se dice que no es aceptada (o lo que es lo mismo, que es rechazada).

Formalmente una cadena u es aceptada por el AFD si y solo si (q1,u) |--* (qi,) y qi F

Ejemplos:
Con el mismo AFD de arriba:
(q1,aa) |-- (q2,a) por la primera regla de transicin
|-- (q1,) por la tercera regla de transicin
Es decir, (q1,aa) |--* (q1,) , y como q1 es un estado final concluimos que u=aa es aceptada por
el AFD.

(q1,abb) |-- (q2,bb) por la primera regla de transicin


|-- (q1,b) por la cuarta regla de transicin
|-- (q2,) por la segunda regla de transicin
Es decir, (q1,abb) |--* (q2,) , y como q2 no es un estado final concluimos que u=abb es
rechazada por el AFD.

Mucha gente opina que con una cadena cualquiera (y el estado q1 o cualquier otro estado) es
muy fcil ir consumiendo la cadena de entrada siguiendo con el dedo el diagrama de
transiciones (la grfica) y ver en qu estado se acaba. Es ilustrativo hacerlo.

El lenguaje aceptado por un AFD lo denotaremos por T(A) y se define as:


T(A)={todas las cadenas que son aceptadas por el AFD} o ms formalmente
T(A)={ u / (q1,u) |--* (qi,) y qi F}
T(A) tambin es denominado Conjunto Regular.

40
As, un conjunto regular es un conjunto de cadenas (un lenguaje) que es aceptado por un
autmata finito.

Slo falta indicar un caso especial: qu pasa si la cadena de entrada es la cadena vaca ?
En este caso el AFD no puede ir ms all de su d.i. inicial pero est permitido anotar lo
siguiente: (q1,) |--* (q1,), por la reflexividad de |--*. Efectivamente el AFD termina en la d.i.
en la que ha empezado (ya est ah!), de manera que si el estado inicial es un estado final
entonces se dice que la cadena vaca es aceptada por el AFD (a diferencia de las gramticas
regulares que no pueden generar ).

Regla prctica: cuando q1 F

La funcin *: otra notacin frecuente


Otra notacin muy popular -y muy til para asuntos tericos- que se usa para indicar cul es el
ltimo estado al que llega un AFD despus de consumir toda la cadena de entrada partiendo
de un estado cualquiera es as:
*(qi,u)=qj
Para indicar que partiendo del estado qi y consumiendo toda la cadena u se llega
-finalmente- al estado qj.

Ejemplos:
Se puede escribir (q2,aaa) |--* (q1,) y/o tambin *(q2,aaa)=q1

Se puede escribir (q1,aa) |--* (q1,) y/o tambin *(q1,aa)=q1

Se puede escribir (q1,abb) |--* (q2,) y/o tambin *(q1,abb)=q2

En realidad * es una funcin, *: K X *---> K, cuya definicin recursiva es


*(qi,) = qi
*(qi,ua) = (*(qi,u),a) donde u*a

Ejemplos de uso:
Para el AFD A cuyo diagrama es el siguiente:

41
i) Es claro de la definicin que: *(q1,) = q1

ii) *(q1,b) = (*(q1,),b) por definicin tomando u =


= (q1,b) por i)
= q2 por la funcin de transicin para este ejemplo

iii)*(q1,ba) = (*(q1,b),a) por definicin, u = b


= (q2,a) por ii)
= q3 por

iv)*(q1,bab) = (*(q1,ba),b) por definicin, u = ba


= (q3,b) por iii)
= q2 por

v)*(q1,baba) = (*(q1,bab),a) por definicin, u = bab


= (q2,a) por iv)
= q3 por
Cuando se requiere el valor de *(q1,baba) debe calcularse v) y para eso ser necesario
calcular iv), etc.

* ofrece una forma ms elegante de definir un Conjunto Regular as:


T(A)={ u / * (q1,u)=qi y qi F }={ u / * (q1,u)F }

A semejanza de lo que sucede con gramticas existen dos problemas bsicos: dado un AFD A
decir qu es T(A); y dado un lenguaje L construir un AFD que acepte dicho lenguaje.
Presentaremos algunos ejemplos sobre ambos aspectos.

Ejemplos:
Para el AFD A = ( {q1,q2}, {1}, , q1, {q1} )
: (q1,1)=q2 (q2,1)=q1
T(A)={12i / i 0}, o bien -lo que es lo mismo- T(A)={ (11)i / i }

Para el AFD A = ( {q1}, {a,b}, q1{ } )


: (q1,a)=q1 (q1,b)=q1
T(A)={ }
Sea cual fuere la cadena u con la que trabajemos ninguna de ellas llegar a un estado
final porque no hay estados finales ( F={ } ).

Para el AFD A = ( {q1,q2}, {a,b}, , q1, {q1} )


: (q1,a)=q2 (q1,b)=q2 (q2,a)=q1 (q2,b)=q1
T(A)={ u a,b/ |u| =2i i 0}

42
Se solicita construir un AFD A que acepte L={a,b}
Una solucin es A = ( {q1}, {a,b}, q1{q1} )
: (q1,a)=q1 (q1,b)=q1

Se solicita construir un AFD A que acepte L={a,b}


Una solucin es A = ( {q1,q2}, {a,b}, q1{q2} )
: (q1,a)=q2 (q1,b)=q2 (q2,a)=q2 (q2,b)=q2

De manera anloga a lo que sucede con las gramticas regulares, el nmero de smbolos y de
estados en un AFD y de stos cules deben/pueden ser finales, depende del lenguaje que
estemos considerando.

Mostraremos ahora dos importantes resultados tericos para AFDs que requieren el siguiente
resultado previo.
Sea A un AFD, entonces *(*(qi,u),v)=*(qi,uv)
Demostracin:
Por induccin sobre |v|
Caso base:
|v|=0, es decir, v=
*(*(qi,u),v)=*(*(qi,u),) pues v=
=*(qi,u) por definicin de * caso , recuerde que *(qi,u) es un estado
=*(qi,uv) pues v= y u=u
Hiptesis inductiva:
Supondremos vlido el enunciado para cadenas de longitud |w|=k
Paso inductivo:
Sea v una cadena tal que |v|=k+1, entonces lcitamente podemos reescribirla as v=wa con
|w|=k. Por claridad, recordemos que *(qi,u) es un estado digamos p, es decir, sea *(qi,u)=p.
*(*(qi,u),v)=*(p,v) trabajando con *(qi,u)=p
*
= (p,wa) pues v=wa
*
=( (p,w),a) por definicin de *
=(*(*(qi,u),w),a) trabajando con *(qi,u)=p
*
=( (qi,uw),a) por hiptesis inductiva pues |w|=k
*
= (qi,uwa) por definicin de *
=*(qi,uv) pues v=wa

Lo que demuestra el enunciado.

El lema de bombeo
Se basa en la observacin de que en un grafo de transicin con n nodos, cualquier camino de
longitud n o mayor debe tener un nodo repetido, es decir, dicho camino contiene un ciclo, su
enunciado es como sigue:

43
Si L=T(A) y u T(A) -A un AFD con |K|=n y |u| n-, entonces
a) u = xyz (puede reescribirse o dividirse u en tres subcadenas)
b) |xy| n
c) y la subcadena y no es vaca
d) i0 xyiz T(A)
Demostracin:
Sabemos que si se presenta u como entrada al AFD, u=a1a2...am con m n, este termina en un
estado final. Graficaremos la lista de estados que visita el AFD al consumir u empezando en
el estado inicial as:

Esta grfica no es el diagrama de transicin del AFD sino un dibujo de los estados por los que
vamos transitando al consumir la cadena u, para hacer notar la diferencia ms an hemos
dibujado los estados en cuadrados en vez de crculos.
Por ejemplo para el AFD A=({q1q2},{b},,q1,{q2}) con : q1b)=q2 q2b)=q1 con la
cadena u=bbbbb la lista de estados que visita el AFD -incluyendo el estado inicial- al
consumir u es q1,q2,q1,q2,q1,q2, grficamente ello se ve as:

Donde se evidencia que por lo menos un estado se visita ms de una vez -cuando menos dos
veces- adicionalmente ntese que con 5 smbolos se visitan 6 estados.
Volviendo al caso general, dado que u consiste de por lo menos n smbolos podemos
reescribir esta cadena as u=a1a2...anan+1...am con m n, o lo que es lo mismo u=a1a2...anz con z
la subcadena final; al transitar -desde el estado inicial- a travs de los estados del AFD
consumiendo los smbolos de u (los primeros n smbolos y luego los smbolos de z) la lista de
estados que visita el AFD tendr por lo menos n+1 estados. Sabiendo esto se deduce que no
es posible que en esta lista de estados que se visita todos estos estados sean distintos, puesto
que slo existen n estados diferentes. Luego debe existir por lo menos un estado que se visita
ms de una vez.
Visto de otro modo -en la grfica de la lista de estados que se visita por lo menos algn j es
necesariamente igual a algn k, este hecho suele mostrarse as evidenciando el ciclo:

44
Es decir, con la cadena u la lista de estados que se visita es q1,qi1,qi2,...,qr,...,qr,...qf, donde el
estado que se repite es qr (que es igual a qj y a qk)
Podemos escribir esto as:
q1,x)=qr donde x contiene los primeros smbolos de u que me permiten llegar a qr
qr,y)=qr donde y contiene los siguientes smbolos de u que me permiten revisitar qr
qr,z)=qf donde z contiene los ltimos smbolos de u con los que llegamos a qf
y pues hemos admitido que hay por lo menos un estado que se visita por lo menos dos
veces, con y= no habra tal re-visita.
Ntese que la subcadena y est en un ciclo que puede repetirse 0, 1, 2 o ms veces con la
propiedad siguiente qr,yi)=qr; de este modo si luego de la subcadena x, y luego de una o
ms ys est la subcadena z, toda la cadena resultante sigue llegando finalmente a qf, es decir,
las cadenas del tipo xyiz T(A) para todo i 0.
Ya vimos que u puede reescribirse as u=a1a2...anz, y que a1a2...an puede agruparse en dos
subcadenas xy; es decir, efectivamente u puede reescribirse as u=xyz. Sin embargo, la parte
vital del lema es que por lo menos un estado se visite cuando menos dos veces, ello sucede
inevitablemente si xy=a1a2...an pues como se argument- con n smbolos se visitan n+1
estados. Es claro que esta vital revista puede suceder con menos smbolos an como lo
muestra el siguiente ejemplo: sea A=({q1q2q3q4q5},{a,b},,q1,{q1}) n=|K|=5
: q1a)=q1 q1b)=q2 q5a)=q5b)=q1 qja)=qjb)=qj+1 j=2,3,4
Sea u=aaaaaa, la lista de estados que se visita es: q1,q1,q1,q1,q1,q1,q1 donde la revisita es
evidente. Aqu x=a, y=a, z=aaaa lo que es vlido, ntese que |xy|=2<5; pero tambin puede ser
x=aa, y=a, z=aaa lo que es igualmente vlido, ntese que |xy|=3<5; o bien x=, y=aaa, z=aaa
lo que es igualmente vlido, ntese que |xy|=3<5. En todos estos casos |xy|n, es decir, u
puede reescribirse as u=xyz con |xy|n.

El teorema de Myhill-Nerode
Veamos algunos elementos previos.
Una relacin R sobre se dice que es invariante por derecha con respecto a la concatenacin
si z: xRy => xzRyz
Sea L un lenguaje, es decir, L*.
Y sea RL la siguiente relacin definida sobre e inducida por L: x,y
xRLy si y slo si w xw L yw L
Es evidente que RL es una relacin de equivalencia puesto que
a) w xw L xw L, es decir xRLx, es decir es reflexiva
b) w xw L yw L => w yw L xw L
es decir xRLy => yRLx, es decir es simtrica
c) w xw L yw L y w yw L zw L
=> w xw L zw L, es decir [xRLy yRLz] => xRLz, es decir es transitiva
Por lo tanto el conjunto formado por las clases de equivalencia de RL es una particin de .
La relacin RL es adems invariante por la derecha. En efecto, sea que xRLy, es decir,
v xv L yv L; debemos mostrar que z xzRLyz, es decir, que

45
z,w xzw L yzw L; hagamos v=zw, luego debemos mostrar que
z,w (v=zw) xv L yv L, pero eso es precisamente lo que significa xRLy.
El teorema dice que los tres enunciados siguientes son equivalentes:
1) L=T(A), donde A es un AFD
2) L es la unin de algunas clases de equivalencia de alguna relacin de equivalencia R
definida sobre , invariante por derecha y de ndice finito.
3) RL es de ndice finito.
Demostracin:

i) Sea A un AFD tal que T(A)=L, entonces vamos a mostrar que hay una relacin de
equivalencia definida sobre , invariante por derecha y de ndice finito.
Definamos pues la relacin a la que llamaremos RA:
xRAy si y slo si q1,x)=q1,y)
Es evidente que RA es de equivalencia pues:
a) q1,x)=q1,x), es decir RA es reflexiva
b) q1,x)=q1,y) => q1,y)=q1,x), es decir RA es simtrica
c) [q1,x)=q1,y) q1,y)=q1,z)]=> q1,x)=q1,z), es decir RA es transitiva
Tambin RA es invariante por derecha pues:
Si xRAy se sabe que q1,x)=q1,y).
Adems z q1,xz)=*(*(q1,x),z) por un resultado previo
=*(*(q1,y),z) pues q1,x)=q1,y)
=q1,yz) por el resultado previo
Es decir, z q1,xz)=q1,yz), que no es otra cosa que decir que xzRAyz
Asimismo RA es de ndice finito:
Cuntas clases tiene el conjunto de clases de equivalencia de RA?
Que xRAy nos dice simplemente que con la cadena x y con la cadena y el AFD termina en el
mismo estado. Dada una cadena x en supongamos que al consumirla el AFD partiendo de
q1 acaba en q1, la clase [x] est formada por todas las cadenas con las que el AFD -partiendo
de q1- llega finalmente a q1; habr posiblemente- otra clase [w] con todas las cadenas con las
que el AFD -partiendo de q1- llega finalmente a, digamos, q2; etc. As tendremos a lo ms-
tantas clases como estados tenga el AFD, es decir, un nmero finito de clases, es decir, RA es
de ndice finito.
Finalmente queda por mostrar que L es la unin de algunas clases de RA:
Es evidente que L es la unin de las clases de RA que han sido formadas de manera tal que sus
cadenas llegan a los estados finales del AFD.

ii) Sea L la unin de algunas clases de alguna relacin de equivalencia R definida sobre ,
invariante por derecha y de ndice finito, entonces vamos a mostrar que RL tambin es de
ndice finito.
En efecto, sean x,y tales que

46
xRy, es decir, (x,y)R, es decir, x e y estn relacionadas y estn en la misma clase de
equivalencia digamos [x]R, pero entonces
z xzRyz pues R es invariante por derecha, adems

z xzL si y slo si yzL pues L es la unin de algunas clases de R, es decir,
si (xz,yz)R, o lo que es lo mismo, si estn en la
misma clase y dicha clase aporta a conformar L,
ambas cadenas xz y yz estn en L, en otro caso no;
pero entonces
xRLy pues la expresin xzL si y slo si yzL, no es sino la definicin de RL, es
decir, (x,y)RLes decir, x y y estn relacionados por RL y estn en la misma clase
de equivalencia digamos [x]RL.
As, hemos mostrado tomando de a dos los elementos- que si hay cadenas que estn en una
misma clase en R, esas cadenas tambin estn en una misma clase en RL, es decir, [x]R[x]RL,
otra manera de decirlo es que cada clase de equivalencia de R est contenida en alguna de RL
(en estos casos se dice que R refina a RL), es claro a partir de ello que R tiene ms clases o las
mismas- que RL, es decir, R tiene un ndice mayor o igual que el ndice de RL y como el ndice
de R es finito, RL tambin tiene un ndice finito.

iii) Sea RL -de ndice finito-, entonces vamos a mostrar que hay un AFD A tal que T(A)=L
En efecto, construimos as el AFD A=(K,,,q1,F)
K es el conjunto de clases de equivalencia de RL
K={[x]RL / x}
q1=[]RL el estado inicial es la clase de equivalencia de (que incluye a) la cadena vaca
F={[x]RL / xL}
: ([x]RL,a)=[xa]RL
Slo resta mostrar dos cosas: a) que tanto el conjunto de estados como la regla de transicin
son consistentes, es decir, que estn acordes a la definicin de un AFD y no traen problemas;
y b) que este AFD acepta L.
a) K es finito pues RL es de ndice finito.
En la clase de equivalencia de la cadena x, [x]RL, hay posiblemente otras cadenas por ejemplo
y, dado que estn en la misma clase xRLy, y tambin [x]RL=[y]RL. Segn nuestra regla de
transicin ([y]RL,a)=[ya]RL, sera inconsistente que [xa]RL[ya]RL, afortunadamente eso no
sucede [xa]RL[ya]RL, pues RL es invariante por la derecha, es decir, z por ejemplo z=a,
si xRLy entonces xaRLya, es decir, xa y ya estn en la misma clase de equivalencia, es decir,
[xa]RL[ya]RL.
b) Utilizaremos el hecho de que (q1,x)=[x]RL
En efecto cuando x= tenemos que (q1,x)=(q1,)=q1=[]RL=[x]RL
Y cuando x=ya tenemos que (q1,x)=(q1,ya)=((q1,y),a)=([y]RL,a)=[ya]RL=[x]RL
Finalmente, xT(A) si y slo si (q1,x)F si y slo si [x]RLF si y slo si xL, es decir el
AFD acepta L.

47
AUTMATAS FINITOS NO DETERMINSTICOS (AFNS)
Un Autmata Finito No determinstico (AFN) es una quntupla A = ( K, , d, q1, F ) donde
K: conjunto finito, no vaco, de estados
: alfabeto de entrada
d: funcin de transicin (se define as d: K X ---> 2K, 2K denota el conjunto potencia de K)
q1: estado inicial del AFN q1 K (es decir, q1 debe estar en K)
F: conjunto de estados finales F K

Ejemplo:
Sea el Autmata Finito No Determinstico (AFN) A = ( K, , d, q1, F )
={q1,q2}
={a,b}
F={q2}
d:
d(q1,a)={q1,q2}
d(q2,b)={q2}

Esta es la apariencia de un AFN descrito formalmente y en diagrama.

Hay varias semejanzas entre los AFDs y los AFNs: el uso de diagramas de transicin, el uso
de descripciones instantneas, la aceptacin o rechazo de cadenas, para mencionar algunas.
Pero tienen tambin importantes diferencias, veamos las principales:

En los AFDs: de un par (estado, smbolo) se llega a un estado (escrito suelto, sin llaves)
En los AFNs de un par (estado, smbolo) se llega a un conjunto de estados (obviamente
escrito entre llaves).

En los AFDs al estar situados en un estado y al consumir un smbolo de una cadena de


entrada el siguiente estado est determinado irremediablemente (por eso se llaman
Determinsticos).
En los AFNs al estar situados en un estado y al consumir un smbolo de una cadena de
entrada -a veces- se puede ir a uno u otro (u otro, etc.) estado, segn como est definida la
regla de transicin. En el ejemplo de arriba estando en q1 y consumiendo el smbolo a,
podemos pasar ya sea al propio q1 o a q2.

48
Una forma que adoptamos para diferenciar AFDs de AFNs es utilizar d para la funcin de
transicin en AFNs y en AFDs.

El conjunto de estados de llegada ( por ejemplo {q1,q2} en la regla de transicin


d(q1,a)={q1,q2} ) es por definicin precisamente un conjunto (formalmente un elemento del
conjunto de partes de K), y por lo tanto puede ser vaco, unitario, de dos elementos, tres,
cuatro o todo K.
En estricto rigor d tambin es total, pero cuando el conjunto de estados de llegada es vaco
simplemente ni lo graficamos ni lo listamos.

Ejemplo (para el AFN de arriba):


d:
d(q1,a)={q1,q2}
d(q1,b)={ }
d(q2,a)={ }
d(q2,b)={q2}
En adelante preferimos -por convencin- no anotar las reglas donde el
conjunto de estados de llegada es vaco.

No determinismo, aceptacin de una cadena y T(A) en un AFN


En un AFD dada una d.i. la siguiente d.i. si existe- luego de dar un movimiento lcito es
nica y bien determinada.
En cambio en un AFN dada una d.i. si es posible dar un movimiento lcito- es probable que
exista no una sino varias d.i.s siguientes de acuerdo al no determinismo implcito en las
reglas de transicin.

Ejemplos:
En el AFN de arriba para la d.i. (q2,bb) el nico movimiento que puede darse utilizar la regla
de transicin d(q2,b)={q2}, luego de lo cual la siguiente d.i. ser (q2,b) hecho que hemos
estado representado as: (q2,bb) |-- (q2,b).
En cambio para la d.i. (q1,aa) el AFN puede dar cualquiera de los siguientes dos movimientos
lcitos utilizando la regla de transicin d(q1,a)={q1,q2}
i) (q1,aa) |-- (q1,a)
ii) (q1,aa) |-- (q2,a)
Puede ser til representar estas varias alternativas a travs de un rbol de transiciones que para
nuestro ejemplo sera as:
|-- (q1,a)
/
(q1,aa)
\
|-- (q2,a)

49
Representaremos a travs de estos rboles de transiciones- un caso ms largo, con el mismo
AFN, partiendo de la misma d.i. (q1,aa)
|--1 (q1,)
/
|--1 (q1,a)
/ \
(q1,aa) |--2 (q2,)
\
|--2 (q2,a)

Donde hemos anotado con un subndice el nmero de regla de transicin que se utiliza para
dar un movimiento lcito. Este rbol muestra que todas las siguientes transiciones son
legtimas:
a) (q1,aa) |--* (q1,)
b) (q1,aa) |--* (q2,)
c) (q1,aa) |--* (q2,a)
El inciso b) muestra que partiendo del estado inicial con la cadena aa podemos llegar a un d.i.
que evidencia que se ha consumido toda la cadena y que se ha arribado a un estado final, q2
en nuestro caso. Es decir, la cadena aa es aceptada por el AFN.
Para descubrir esto no basta con hacer alguna serie de movimientos lcitos por ejemplo slo
los del inciso a)-, deben escudriarse todas las posibilidades dibujando todo el rbol de
transiciones (cuando menos mentalmente).

Tambin ntese, como muestra el inciso c), que dado un AFN siguiendo cierto camino del
rbol de transiciones el autmata ya no puede dar ningn movimiento, no puede ir a ningn
otro estado, ni consumir ningn smbolo ms de la cadena. El caso extremo de esto es que un
AFN no pueda dar ni siquiera un movimiento, como sucede con nuestro AFN si partiera de la
d.i. (q1,bbb), en situaciones como esta lo nico que podemos escribir es lo siguiente:
(q1,bbb) |--* (q1,bbb).

Una cadena de entrada es aceptada en un AFN si partiendo del estado inicial q1 es posible
llegar a un estado final con alguna serie de movimientos consumiendo toda la cadena. Fjese
que para decidir si una cadena es aceptada o no debemos analizar todas, absolutamente todas
las transiciones posibles del rbol de transiciones.

Formalmente para un AFN A:


T(A)={ u / (q1,u) |--* (qi,) y qi F}
Sin embargo esta definicin no enfatiza lo suficiente que en un AFN partiendo de un estado
con una cadena de entrada, consumiendo todos los smbolos de dicha cadena de entrada, es
posible llegar a
i) Ningn estado, simplemente porque no se pueden consumir todos los smbolos.

50
ii) Uno, dos o ms estados, como en los incisos a) y b) del ejemplo que muestran que se puede
llegar ya sea al estado q1 o al estado q2.
Es decir, es posible llegar no a un estado como suceda en los AFDs sino a un conjunto de
estados, posiblemente vaco.

La funcin d*
Otra notacin igual de popular y til para asuntos tericos, usada para indicar mejor que en un
AFN se puede llegar a un conjunto de estados, partiendo de un estado y con una cadena u de
entrada es as:
d*(qi,u)={conjunto de todos los estados a los que se puede llegar partiendo de qi
consumiendo todos los smbolos de u}

Ejemplos:
d*(q1,aa)={q1,q2}

d*(q1,bbb)={ }

En realidad d* es una funcin, d*: K X *---> 2K, cuya definicin recursiva es


d*(qi,) = {qi}
d*(qi,ua) = d(p,a)
p d*( q i ,u )

Ejemplos de uso (en el AFN de arriba):


i) d*(q1,) = {q1} por definicin
ii) d*(q1,a) =
d(p,a)
p d*( q1 , )
por definicin, u =

=
p {q1}
d(p,a) por i)

= d(q1,a) desarrollando la unin


= {q1,q2} por la funcin d

iii) d*(q1,ab) =
p d *( q1 ,a )
d(p, b) por definicin, u = a

= d(p, b)
p {q1 ,q 2 }
por ii)

= d(q1,b) d(q2,b) desarrollando la unin


= { } {q2} por la funcin d
= {q2} desarrollando la unin

d* ofrece una que forma ms elegante de definir T(A) para un AFN

51
T(A)={ u / (d*(q1,u)F) }
Recuerde que en esta definicin d*(q1,u) representa un conjunto de estados.

En el AFN que estamos tomando como ejemplo T(A)={ aibj / i 1, j 0 }

Ms ejemplos de AFNs y T(A):


Sea el AFN A = ({q1,q2}, {a,b}, d, q1, {q2} )
d:
d(q1,a)={q1,q2} T(A)={ua / u {a,b}*}
d(q1,b)={q1}

Sea el AFN A = ({q1,q2,q3}, {a,b}, d, q1, {q3} )


d:
d(q1,a)={q2}
d(q2,b)={q3} T(A)={ab}

Como siempre los problemas bsicos son dos: dado un AFN A indicar qu es T(A); y dado un
lenguaje L construir un AFN A que acepte L.

AUTMATAS FINITOS NO DETERMINSTICOS CON TRANSICIONES VACAS


(-AFNS)
Un Autmata Finito No determinstico con transiciones vacas (o con lambda transiciones, o
con -transiciones) es una quntupla A = ( K, , d, q1, F ) donde
K: conjunto finito, no vaco, de estados
: alfabeto de entrada
d: funcin de transicin ( se define as d: K X ( {}) --> 2K )
q1: estado inicial del AFN q1 K (es decir, q1 debe estar en K)
F: conjunto de estados finales F K

Ejemplo:
Sea el AFN A = ( {q1,q2,q3}, b,c}, d, q1, {q1,q2,q3})

52
d:
d(q1,)={q2,q3}
d(q2,b)={q2}
d(q3,c)={q3}

De este modo los -AFNs son prcticamente lo mismo que los AFNs slo que permiten la
flexibilidad de incluir etiquetas en sus arcos -si queremos apoyarnos en los diagramas de
estado-, ms concretamente, pueden haber reglas de transicin del tipo d(q3,)={q3}, o
cualquier otro conjunto de llegada. En este caso no es un smbolo de y la cadena de
entrada permanece tal cual cuando usamos estas -transiciones, es decir, no se consume
ningn smbolo al transitar por etiquetas .
Los otros formalismos y notaciones (d*, |--, etc.) se siguen usando y tienen significados
anlogos.

-cierre
La inclusin de transiciones vacas, que en el caso de los diagramas se representa con
etiquetas , adiciona cierta complejidad a los clculos. Por ejemplo si nos encontramos en el
estado qi y consumimos un smbolo ak, el conjunto de estados a los que podemos arribar debe
contemplar la posibilidad de ir de un estado a otro -y an a otros- sin consumir smbolos, slo
consumiendo la cadena , antes o despus de consumir ak.
As pues debemos poder calcular a qu otros estados se llega partiendo de un estado y
utilizando slo -transiciones (consumiendo la cadena ). En el -AFN de arriba por
ejemplo partiendo de q1 podemos llegar, utilizando slo -transiciones sin consumir smbolos
de entrada, a q2 y a q3, y tambin debido a que ya estamos ah podemos llegar al propio q1
consumiendo , denotaremos esto as:
-cierre({q1}) = {q1,q2,q3}
Que nos dice -repetimos- que estando en q1 podemos llegar, sin consumir smbolos de entrada,
a q1, a q2 y a q3; es importante enfatizar que de un estado cualquiera qi siempre es posible
llegar a s mismo sin consumir smbolos de entrada simplemente porque ya estamos ah (ya
hemos llegado), por eso q1 pertenece al -cierre({q1})

Podemos extender esta idea para calcular el -cierre(C) donde C es un conjunto de estados:

53
-cierre({}) = {}
-cierre({q}) = { conjunto de todos los estados a los que podemos arribar, incluido q,
utilizando slo -transiciones sin consumir smbolos de entrada partiendo
de q } Es decir,
-cierre({q}) = {q} { p / partiendo de q se arriba a p utilizando slo -transiciones }
-cierre(C) = -cierre({q})
q C

Sea A un -AFN cuyo conjunto de estados es K; sea CK. En rigor, la definicin estndar del
-cierre(C) es recursiva y es como sigue:
i) qC: q-cierre(C)
ii) q-cierre(C) pd(q,): p-cierre(C)
iii) Son elementos del -cierre(C) slo aquellos sealados en i y ii

Una manera ms operacional de calcular el -cierre(C) es as:


-cierre(C) = Bn
donde
B0 = C
Bi+1 = Bi {p / qj Bi y p d(qj,)}
Si Bi+1 = Bi entonces Bn = Bi

Y an una manera adicional de tipo matricial la tenemos a continuacin.


Podemos construir una matriz de |K| X |K| representando la relacin R K X K que relaciona
el estado qi con el estado qj si existe una -transicin explcita de qi a qj.
Donde cada fila y cada columna corresponde a un estado, un 0 indica que los estados no estn
relacionados y un 1 que si.
Para el -AFN de arriba la matriz R ser:
0 1 1
R = 0 0 0
0 0 0
R+, la clausura transitiva de R, relaciona los estados que son accesibles desde otro con slo -
transiciones:
(qi,qj) R+ si desde qi puede arribarse a qj con slo -transiciones.
Ntese que R+ no relaciona qi consigo mismo a no ser que haya una -transicin explcita de
qi a qi. Sin embargo para el clculo del -cierre(C) necesitamos incluir cada estado de C
aunque no hayan -transiciones explcitas de qi a qi, porque el -cierre(C) calcula los estados
que son alcanzables desde cualquier estado de C con la cadena , en cambio R+ relaciona los
estados que son alcanzables desde otro con -transiciones explcitas. Nosotros obtendremos el
-cierre(C) a partir de R+.

El clculo de R+ se operacionaliza a travs de matrices as:

54
R1 = R
Ri+1 = Ri + (Ri * Ri)
Si Ri+1 = Ri entonces R+ = Ri
donde + y * representan la suma boolena y producto booleano de matrices.
R* = R+ + IK donde + representa la suma boolena de matrices.
El -cierre(C) se obtiene as:
Para cada estado qi en C se observa la fila i-sima de R* y se incluyen al -cierre(C) los
estados correspondientes a las columnas -de dicha fila- con un 1.

Ejemplos:
Mostraremos el clculo del -cierre(C) tanto para el -AFN de arriba como para otro -AFN
que presentaremos luego.
En el caso del primer -AFN:
Se desea obtener el -cierre({q1})
De acuerdo a la primera forma tenemos:
B0 = {q1}
B1 = B0 {p / qj B0 y p d(qj,)}
= {q1} {p / qj {q1} y p d(qj,)}
= {q1} {p / p d(q1,)}
= {q1} {p / p {q2,q3}}
= {q1} {q2,q3} = {q1,q2,q3}
B2 = B1 {p / qj B1 y p d(qj,)}
= {q1,q2,q3} {p / qj {q1,q2,q3} y p d(qj,)}
= {q1,q2,q3} { p / p d(q1,)} { p / p d(q2,)} { p / p d(q3,)}
= {q1,q2,q3} {q2,q3} {} {} = {q1,q2,q3}
Como B2 = B1 entonces Bn = B1 y por lo tanto -cierre({q1}) = B1 Es decir
-cierre({q1}) = {q1,q2,q3}

Por el modo matricial tenemos:


0 1 1
R = R = 0 0 0
1

0 0 0
R2 = R1 + (R1 * R1)
0 1 1 0 1 1 0 1 1 0 1 1 0 0 0 0 1 1
0 0 0 0 0 0 0 0 0 0 0 0
= + ( * 0 0 0 ) = + = 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Como R2 = R1 entonces R+ = R1

55
0 1 1 1 0 0 1 1 1
R = R + IK = 0 0 0 + 0 1 0 = 0 1 0
* +
0 0 0 0 0 1 0 0 1
El -cierre({q1}) = {q1,q2,q3}
Pues la fila 1 de R* tiene un 1 en las columnas 1, 2 y 3.
El clculo de R* nos facilita otros clculos, siguiendo el mismo procedimiento tenemos:
El -cierre({q2}) = {q2}
El -cierre({q3}) = {q3}
El -cierre({q2,q3}) = {q2,q3}

El segundo -AFN con el que trabajaremos tiene este diagrama:

Se desea obtener el -cierre({q2})


De acuerdo a la primera forma tenemos:
B0 = {q2}
B1 = B0 {p / qj B0 y p d(qj,)}
= {q2} {p / qj {q2} y p d(qj,)}
= {q2} {p / p d(q2,)}
= {q2} {p / p {q4}}
= {q2} {q4} = {q2,q4}
B2 = B1 {p / qj B1 y p d(qj,)}
= {q2,q4} {p / qj {q2,q4} y p d(qj,)}
= {q2,q4} { p / p d(q2,)} { p / p d(q4,)}
= {q2,q4} {q4} {q3} = {q2,q3,q4}
B3 = B2 {p / qj B2 y p d(qj,)}
= {q2,q3,q4} {p / qj {q2,q3,q4} y p d(qj,)}
= {q2,q3,q4} { p / p d(q2,)} { p / p d(q3,)} { p / p d(q4,)}
= {q2,q3,q4} {q4} {q3,q4} {q3} = {q2,q3,q4}
Como B3 = B2 entonces Bn = B2 y por lo tanto -cierre({q2}) = B2. Es decir,
-cierre({q2}) = {q2,q3,q4}

56
Por el modo matricial tenemos:
0 0 0 0
0 0 0 1
R1 = R =
0 0 1 1

0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0
1 0 0 0 1 0 0 0 1
R2 = R1 + (R1 * R1) = + ( * )
0 0 1 1 0 0 1 1 0 0 1 1

0 0 1 0 0 0 1 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 1
0 0 0 1 1
= + =
0 0 1 1 0 0 1 1 0 0 1 1

0 0 1 0 0 0 1 1 0 0 1 1
0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 1
R3 = R2 + (R2 * R2) = + ( 0 0 1 1
*
0 1
)
0 0 1 1 0 0 1 1 0 0 1 1

0 0 1 1 0 0 1 1 0 0 1 1
0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 0 1 1 0 0 1 1
= + =
0 0 1 1 0 0 1 1 0 0 1 1

0 0 1 1 0 0 1 1 0 0 1 1
Como R3 = R2 entonces R+ = R2
0 0 0 0 1 0 0 0 1 0 0 0
0 0 1
1 0 1 0
0 0 1 1 1
R* = R+ + IK = + =
0 0 1 1 0 0 1 0 0 0 1 1

0 0 1 1 0 0 0 1 0 0 1 1
El -cierre({q2}) = {q2,q3,q4}
Pues la fila 2 de R* tiene un 1 en las columnas 2, 3 y 4.
El clculo de R* nos facilita otros clculos, siguiendo el mismo procedimiento tenemos:
El -cierre({q1}) = {q1}
El -cierre({q3}) = {q3,q4}
El -cierre({q4}) = {q3,q4}
El -cierre({q3,q4}) = {q3,q4}
Quedan pendientes algunas cuestiones.

El algoritmo para calcular el -cierre(C) puede reescribirse equivalentemente as:

57
B0 = C
Bi+1 = Bi d(q,
q Bi
i=0,1,... (*)

Si Bi+1 = Bi entonces para todo n>0 Bi = Bi+n y -cierre(C) = Bi

Que este algoritmo sea finito es evidente: a partir de C pueden aadirse uno o ms estados de
manera que algn Bi+1 sea K en el extremo, a partir de ah Bi+2 y los siguientes deben ser
iguales al anterior pues ya no hay ms estados que aadir.
Cuando Bi+1 = Bi, no es muy obvio que para todo n>0 Bi = Bi+n, y este resultado es el que
queremos probar a continuacin.
Por induccin sobre n:
Caso base.
n=1
Si Bi+1 = Bi entonces Bi = Bi+1 es verdadero inmediatamente.
Hiptesis inductiva.
n=k
Si Bi+1 = Bi entonces Bi = Bi+k es cierto.
Paso inductivo.
n=k+1
Sea Bi+1 = Bi (**)
Luego,
Bi = Bi+1 por (**)
= Bi
d(q,
q Bi
por la forma de calcular cada Bi+1 en el clculo del -cierre(C) (*)

= Bi+k d(q,
q Bi+k
por hiptesis inductiva

= Bi+k+1 por la forma de calcular cada Bi+1 en el clculo del -cierre(C) (*)
Por los tres casos el enunciado que queramos se mantiene.

La funcin d*
d*(qi,u)={conjunto de todos los estados a los que se puede llegar partiendo de qi
consumiendo todos los smbolos de u}
Ntese que ahora deben considerarse las -transiciones.
d* es una funcin, d*: K X *---> 2K, cuya definicin recursiva es

d*(qi,) = -cierre({qi})

d*(qi,ua) = -cierre d(p,a)

p d*( q i ,u)
Ejemplos de uso:
En el caso del primer -AFN:

58
d*(q1,) = -cierre({q1}) = {q1,q2,q3}

d*(q1,b) = -cierre d(p, b) = -cierre d(p, b)

p d*( q1 , ) p {q1 ,q 2 ,q 3}
= -cierre(d(q1,b) d(q2,b) d(q3,b)) = -cierre({} {q2} {}) = -cierre({q2})
= {q2}

d*(q1,bc) = -cierre d(p,c) = -cierre
d(p,c) = -cierre(d(q2,c))

p d*( q1 ,b) p {q 2 }
= -cierre({}) = {}

d*(q1,bcb) = -cierre d(p, b) = -cierre
d(p, b) = -cierre({}) = {}

p d*( q1 ,bc) p {}
Por otro lado:

d*(q1,c) = -cierre d(p,c) = -cierre
d(p,c)

p d*( q1 , ) p {q1 ,q 2 ,q 3}
= -cierre(d(q1,c) d(q2,c) d(q3,c)) = -cierre({} { } {q3}) = -cierre({q3})
= {q3}

d*(q1,cc) = -cierre d(p,c) = -cierre
d(p,c) = -cierre(d(q3,c))

p d*( q1 ,c) p {q 3}
-cierre({q3}) = {q3}

En el caso del segundo -AFN:


d*(q1,) = -cierre({q1}) = {q1}

d*(q1,a) = -cierre d(p,a) = -cierre

d(p,a) = -cierre(d(q1,a))

p d*( q1 , ) p {q1}
= -cierre({q2}) = {q2,q3,q4}

d*(q1,ab) = -cierre d(p, b) = -cierre
d(p, b)

p d*( q1 ,a) p {q 2 ,q 3 ,q 4 }
= -cierre(d(q2,b) d(q3,b) d(q4,b)) = -cierre({q1,q3} {q1,q4} {})
= -cierre({q1,q3,q4})
= -cierre({p}) = -cierre({q1}) -cierre({q3}) -cierre({q4})
p {q1 ,q 3 ,q 4 }

= {q1} {q3,q4} {q3,q4} = {q1,q3,q4}

59
d* ofrece una forma elegante de definir la aceptacin de una cadena en un -AFN y en
consecuencia tambin de T(A):
La cadena u es aceptada si (d*(q1,u)F)
T(A)={ u / (d*(q1,u)F) }

As en nuestro primer ejemplo como d*(q1,bcb) = {}, tenemos que d*(q1,bcb)F =, luego
la cadena bcb es rechazada por el -AFN. Tambin como d*(q1,cc) = {q3}, tenemos que
(d*(q1,cc)F), luego la cadena cc es aceptada por el -AFN.
En nuestro segundo ejemplo, es claro que (d*(q1,ab)F){q1,q3,q4} {q1,q4}{q1,q4},
luego (d*(q1,ab)F) y por lo tanto la cadena ab es aceptada por este segundo -AFN.

Como siempre los problemas bsicos son dos: dado un -AFN A indicar qu es T(A); y dado
un lenguaje L construir un -AFN A que acepte L. Por ejemplo la simple inspeccin nos dice
que T(A) = {b}* {c}* en el caso de nuestro primer -AFN.

Hasta ahora hemos visto algunos ejemplos de autmatas (-AFNs, AFNs o AFDs) y, en
algunos casos, hemos indicado T(A) sin argumentacin. Cuando la simple inspeccin no es
suficiente, puede pensarse una demostracin de L=T(A) semejante a L=L(G), con induccin
sobre la longitud de las cadenas y sobre la longitud de las transiciones, afortunadamente hay
otro mecanismo ms formal e interesante mostrado ms adelante pero que requiere algunos
conceptos que recin veremos.

Terminaremos este captulo con algunos resultados interesantes.


i) En los -AFNs, d*(qi,a) d(qi,a)
En efecto, en el segundo -AFN que tenemos de ejemplo, obtuvimos d*(q1,a)={q2,q3,q4}, en
cambio de la grfica del -AFN se desprende que d(q1,a)={q2}

ii) Demostraremos que, en los AFDs, *(qi,a) = (qi,a)


En efecto:
*(qi,a) = (*(qi,),a) por definicin recursiva de *
= (qi,apor definicin recursiva de * (caso u=

iii) Demostraremos que, en los AFNs, d*(qi,a) = d(qi,a)


En efecto:
d*(qi,a) =
d(p,a) por definicin recursiva de d*
p d*( q i , )

=
p {q i }
d(p,a) por definicin recursiva de d* ( es decir, d*(qi,)={qi} )

= d(qi, a)desarrollando la unin

60
iv) Dado un diagrama de transicin solamente, por ejemplo

sin ms datos, resulta ambiguo indicar si dicho diagrama corresponde a un -AFN, a un AFN
o a un AFD, por ello cuando un diagrama no sea suficientemente claro es exigible indicar la
funcin o explicitar de qu tipo de autmata finito se trata.

61
CAPTULO 4. EXPRESIONES REGULARES

Las expresiones regulares (e.r.) tienen un importante desarrollo terico, constituyen adems
otro medio para denotar lenguajes y conjuntos regulares.

Las e.r. de un alfabeto y los lenguajes que denotan se definen como sigue:
es una e.r.
es una e.r.
Para cada a , a es una e.r.
Si r y s son e.r. entonces (r+s), (r.s) y (r*) son tambin e.r.

En la concatenacin r.s el punto suele omitirse quedando rs.


A menudo los parntesis se omiten tambin cuando se toma en cuenta la prioridad de las
operaciones (*, . y + en ese orden) y no hay lugar a confusin.

De este modo la apariencia de la expresiones regulares es la siguiente:


(ab+c+b)*abc
(a+b+)*
(0+1+...+9)*(0+1+...+9)*

Cada expresin regular r de un alfabeto denota un lenguaje, es decir un conjunto de


cadenas, mismo que representaremos por L(r).
La e.r. denota al lenguaje {}, es decir, L()={}
La e.r. denota al lenguaje {}, es decir, L()={}
Para cada a , la e.r. a denota al lenguaje {a}, es decir, L(a)={a}
Si r y s son e.r. entonces:
la e.r. (r+s) denota al lenguaje L(r) L(s), es decir, L(r+s)=L(r) L(s)
la e.r. (rs) denota al lenguaje L(r)L(s), es decir, L(rs)=L(r)L(s)
la e.r. (r*) denota al lenguaje [L(r)]*, es decir, L(r*)=[L(r)]*

Se puede indicar un lenguaje utilizando -como hasta ahora- notacin en potencias, con
operaciones entre lenguajes, etc.; pero tambin podemos utilizar e.r., por ejemplo:

Estilo sin e.r. Con e.r.


L={1u / u {0,1}* } L=L(r) donde r es la e.r. 1(0+1)*
L={aibj / i > 0, j > 0 } L=L(r) donde r es la e.r. aa*bb*
L={aibj / i 0, j 0 } L=L(r) donde r es la e.r. a*b*
L={a}{a,b,c}*{c} L=L(r) donde r es la e.r. a(a+b+c)*c

Un problema tpico es escribir una e.r. que denote un lenguaje descrito literalmente y que
tiene ciertas restricciones.

62
Ejemplos:
Escriba una e.r. que denote el conjunto de cadenas en {a,b}* donde inmediatamente luego de
toda b aparece una a: (a+ba)*

Escriba una e.r. que denote el conjunto de cadenas en {a,b}* que contengan la subcadena bb
por lo menos una vez: (a+b)*bb(a+b)*

Escriba una e.r. que denote el conjunto de cadenas en {a,b}* que contengan la subcadena
bb exactamente una vez: (ba+a)*bb(a+ab)*

Escriba una e.r. que denote el conjunto de cadenas en {a,b}* que no contengan la subcadena
bb: (a+ba)*(b+)

Escriba una e.r. que denote el conjunto de cadenas en {0,1}* tal que si una cadena incluye la
subcadena 00 no debe contener la subcadena 11: (1+01)*(0+) + (0+10)*(1+)

Dos e.r. pueden denotar al mismo lenguaje, por ejemplo


r = a(a+) s = aa+a
denotan el mismo lenguaje:
L(r)=L(a(a+))=L(a)L((a+))=L(a)[L(a) L()]={a}[{a} {}]={a}[{a,}]={aa,a}
L(s)=L(aa+a)=L(aa) L(a)=[L(a)L(a) L(a)]=[{a}{a} {a}]={aa} {a}={aa,a}
Se dice que dos e.r. r y s son equivalentes, lo que representaremos as r s, si y solo si
denotan al mismo lenguaje, es decir, L(r)=L(s).

Existen varias equivalencias muy conocidas:


Grupo I Grupo II Grupo III
(r+s) (s+r) r r r r(s+t) rs+rt
(r+s)+t r+(s+t) r r (s+t)r sr+tr
r+s+t (rs)t r(st) rst
r+ +r r
r+r r
Grupo IV Grupo V Grupo VI
r* r*r* (r+s)* (r*+s*)*
(r*)* r* +rr* (r*s*)* (r*s)*r*
(+r)* r*(sr*)*

* * pero
(r+s)* r*+s*
Grupo VII Grupo VIII Grupo IX
r*r rr* (r s)* +(r+s)*s
*
r sr+t ssi r s*t
r(sr)* (rs)*r (rs*)* +r(r+s)* r rs+t ssi r ts*

63
Estas equivalencias se utilizan para, a partir de una e.r., obtener otra e.r. equivalente, es decir,
que denote al mismo lenguaje pero que a juicio de quien realiza la tarea- sea ms til o ms
simple, esto ltimo se denomina tambin simplificacin de e.r.

Ejemplo de verificacin de la equivalencia de dos e.r. o de simplificacin:


En efecto el mismo problema puede plantearse as
i) Mostrar que las e.r. (10 + 1)*1 y 1(01 + 1)* son equivalentes; o as
ii) Simplificar la e.r. (10 + 1)*1
En este ejemplo subrayamos la parte de la e.r. que es tomada en cuenta para aplicar una de las
equivalencias conocidas.
(10+1)*1 (1+10)*1 Grupo I: (r+s)(s+r) donde r=10
(1*10)*1*1 Grupo VI: (r+s)*(r*s)*r* donde r=1
((1 1)0) 1 1
* * *
Grupo II: rst(rs)t donde r=1*
((1 1)0) (1 1)
* * *
Grupo II: rstr(st) donde r=((1*1)0)*
(1*1)(0(1*1))* Grupo VII: (rs)*rr(sr)* donde r=(1*1)
(11 )(0(1 1))
* * *
Grupo VII: r*rrr* donde r=1
(11*)(0(11*))* Grupo VII: r*rrr* donde r=1
(11 )(011 )
* * *
Grupo II: r(st)rst donde r=0
11 (011 )
* * *
Grupo II: (rs)trst donde t=(011*)*
1(1*(011*)*) Grupo II: rstr(st) donde t=(011*)*
1(1+01) *
Grupo VI: r*(sr*)*(r+s)* donde r=1
1(01+1) *
Grupo I: (r+s)(s+r) donde r=1

En todo caso la idea de simplificacin suele partir de una e.r. larga y tratar de obtener una e.r.
mucho ms corta.

Sin apelar a autmatas, los grupos de equivalencias utilizadas pueden demostrarse de dos
formas:
i) Las ms complejas a partir de las ms simples.
Ejemplo (donde subrayamos la parte de la e.r. tomada en cuenta al aplicar una equivalencia):
Si r s*t demostrar que r sr+t
r s*t Por hiptesis
(+ss*)t Grupo V: r*+rr*
t+ss*t Grupo III: (s+t)rsr+tr
t+ss t
*
Grupo II: rr
t+sr Por hiptesis s*tr
sr+t Grupo I: (r+s)(s+r)
ii) Las ms simples a travs de lo que se llama reasociacin y/o el trabajo con lenguajes.
Ejemplos:
ii.a: Demostrar que r(sr)* (rs)*r
Es decir, demostrar que L(r(sr)*) = L((rs)*r)

64
Como es habitual en conjuntos, se hace en dos partes:
L(r(sr)*) L((rs)*r)
Sea w L(r(sr)*), entonces w es de la forma w=r0(s1r1)(s2r2)...(snrn) para algn n0 -cada ri y
cada sj es una (sub)cadena-, pero esta cadena w puede reagruparse o reasociarse por la
asociatividad de la concatenacin de cadenas- de esta forma: w=(r0s1)(r1s2)(r2s3)...(rn-1sn-1)rn,
por lo tanto, w L((rs)*r)
L((rs)*r) L(r(sr)*)
Sea w L((rs)*r), entonces w es de la forma w=(r0s0)(r1s1)(r2s2)...(rn-1sn-1)rn para algn n0
cada ri y cada sj es una (sub)cadena-, pero esta cadena w puede reagruparse o reasociarse
por la asociatividad de la concatenacin de cadenas- de esta forma: w=r0(s0r1)(s1r2)...(sn-1rn),
por lo tanto, w L(r(sr)*).
ii.b: Demostrar que r* (r*)*
Es decir, demostrar que L(r*) = L((r*)*)
Sea L(r)=L, entonces lo que hay que demostrar es L* = (L*)*
Por definicin de la operacin * con lenguajes (L*)* = {} L* ... etc., es decir, L* (L*)*
Nos resta probar que (L*)* L*
Sea w (L*)*, es decir, por definicin de la operacin *, existe n tal que w (L*)n, luego w se
puede reescribir as w=w1w2...wn donde cada wi L*, adems y otra vez por definicin de la
operacin *, para cada i existe mi tal que wi Lmi de manera que wi= wi1wi2...wi(mi) donde
cada wij L, pero entonces w Lm1+...+mn, es decir, w L*.
ii.c: Demostrar que (r+s)* (r*s*)*
Es decir, demostrar que L((r+s)*) = L((r*s*)*)
Por un lado sabemos que
L((r+s)*) = {} L(r+s) (L(r+s))2 ... = {} L(r+s) L(r+s)L(r+s) ...
= {} L(r) L(s) (L(r))2 (L(s))2 L(r)L(s) L(s)L(r) ...
Por otro lado tambin sabemos que
L((r*s*)*) = {} L((r*s*)) (L((r*s*)))2 ... = {} L((r*s*)) L((r*s*))L((r*s*)) ...
= {} L(r*)L(s*) L(r*)L(s*)L(r*)L(s*) ...
= {} L(r) L(s) (L(r))2 (L(s))2 L(r)L(s) L(s)L(r) ...
Que son iguales.

DERIVADAS DE EXPRESIONES REGULARES


Sabemos que la e.r. r denota al lenguaje L(r), podemos efectuar la operacin cociente
izquierdo a L(r) por una cadena.
Por ejemplo sea r=baa+bac+aa, L(r)={baa,bac,aa} y efectuemos la operacin cociente
izquierdo con la cadena u=b, el resultado es L(r)/u={aa,ac}, este nuevo lenguaje puede
denotarse con la expresin regular aa+ac.
Se define como la derivada izquierda- de la e.r. r respecto de la cadena u a la e.r. que denota
al lenguaje L(r)/u; representaremos esta derivada as Du(r) que leeremos derivada -izquierda-
de r respecto de u (tambin es usual la notacin u-1r). Como la derivada izquierda es ms

65
generalmente estudiada omitiremos la palabra izquierda dndola por supuesta. En nuestro
ejemplo, Db(baa+bac+aa)=aa+ac
Esta definicin planteada inicialmente por Brzozowski permite establecer las siguientes reglas
para la derivacin respecto de un smbolo:
Da()=
Da()=
Da(a)=
Db(a)= ab
Da(r+s)=Da(r) + Da(s)
Estructuralmente nos falta considerar dos casos en la derivada respecto de un smbolo, la
concatenacin de dos e.r. y la estrella de Kleene de una e.r.
La e.r rs tiene una consideracin importante: si el lenguaje que denota r incluye o no a la
cadena vaca. Si no incluye la cadena vaca entonces la derivada de esta e.r. debe denotar las
cadenas L(rs)/a, es decir cadenas en rs que empiecen con el prefijo a mismo que se les quita,
pero dado que r no incluye a la cadena vaca, dichas cadenas son aquellas en r -que empiecen
con el prefijo a- a las que se les quita dicho prefijo, seguidas de las cadenas en s, es decir,
Da(rs)=Da(r)s si L(r)
En cambio si r incluye a la cadena vaca hay que considerar tambin quitar el prefijo a de las
cadenas en s que empiecen con este prefijo, es decir,
Da(rs)=Da(r)s + Da(s) si L(r)
Es comn reunir ambas reglas en una as:
Da(rs)=Da(r)s + (r)Da(s)
donde (r)= si L(r)
(r)= si L(r)

El ltimo caso de la derivada respecto de un smbolo es para la e.r. r*.


Sea L=L(r), se sabe que L(r*)=[L(r)]*=L*={} L L2 L3 ...
={} L LL LLL ...
La derivada Da(r ) no es otra cosa que la e.r. que denota al lenguaje L*/a, que no es otra cosa
*

que el conjunto de cadenas en L* que empiezan con el prefijo a y a las que se les quita dicho
prefijo.
Suprimamos pues dicho smbolo a estas cadenas, volvemos a considerar dos casos.
Cuando L(r) y sabiendo que {}/a={}, el resultado es
L*/a = {} L/a (L/a)L (L/a)LL ... = (L/a) ({} L LL ...)
= (L/a)(L*)
que puede ser denotado por Da(r)r*
Cuando L(r) y sabiendo que {}/a={}, el resultado es
L*/a = {} L/a (LL)/a (LLL)/a ...
= {} L/a (L/a)L (L/a) (L/a)LL (LL/a) (L/a) ... donde se subraya
= {} L/a (L/a)L (L/a) (L/a)LL (L/a)L (L/a) ... las partes aadidas
= (L/a) ({} L LL ...) por efecto de que L

66
= (L/a) (L*)
que puede ser denotado tambin por Da(r)r*
Es decir,
Da(r*)=Da(r)r*

Algunos denominan derivada de orden superior cuando la derivacin de una e.r. se extiende a
ms de un smbolo y se hace respecto de una cadena, cuya interpretacin ya dimos.

Ejemplo:
Dc(c)=
Da(ac)=Da(a)c=c=c
Db(bac)=Db(b)ac=ac=ac
Dbac(bac)=Dc(Da(Db(bac)))=Dc(Da(ac))=Dc(c)=
As cuando u=bac, Du(bac)=
Fjese que para calcular Du(r) la secuencia de las derivadas respecto de un smbolo
corresponde a los smbolos de u ledos de izquierda a derecha.
Si definimos D(r)=r, una definicin recursiva para la derivada respecto de una cadena es:
D(r)=r
Dwa(r)=Da(Dw(r))
Reuniendo nuevamente todo tenemos:
Da()=
Da()=
Da(a)=
Db(a)= ab
Da(r+s)=Da(r) + Da(s)
Da(rs)=Da(r)s si L(r) o bien Da(rs)=Da(r)s + (r)Da(s) con (r)= si L(r)
Da(rs)=Da(r)s + Da(s) si L(r) (r)= si L(r)
Da(r*)=Da(r)r*
D(r)=r
Dwa(r)=Da(Dw(r))

Ejemplo:
Sea r=b(ab)*+bb*aa*, calcular Dbaa(r)
Dbaa(r)=Dbaa(b(ab)*+bb*aa*)=Da(Da(Db(b(ab)*+bb*aa*)))
Necesitamos calcular Db(b(ab)*+bb*aa*)=Db(b(ab)*) + Db(bb*aa*)
Db(b(ab)*)=Db(b)(ab)* pues L(b) no incluye a
=(ab)*=(ab)*
Db(bb aa )=Db(b)b*aa* pues L(b) no incluye a
* *

=b*aa*=b*aa*
As pues Db(b(ab)*+bb*aa*)=(ab)*+b*aa*

67
Luego requerimos calcular
Da(Db(b(ab)*+bb*aa*))=Da((ab)*+b*aa*)=Da((ab)*)+Da(b*aa*)
Da((ab)*)=Da((ab))(ab)*
=Da(ab)(ab)*
=Da(a)b(ab)* pues L(a) no incluye a
=b(ab)*=b(ab)*
Da(b aa )=Da(b*)aa*+Da(aa*)
* *
pues L(b*) incluye a
= Da(b)b aa +Da(a)a pues L(a) no incluye a
* * *

=b*aa*+a*=a*
As pues Da(Db(b(ab)*+bb*aa*))=b(ab)*+a*
Finalmente
Da(Da(Db(b(ab)*+bb*aa*)))=Da(b(ab)*+a*)
=Da(b(ab)*)+Da(a*)
=Da(b)(ab)*+Da(a)a*
=(ab)* +a*
=a*
As, Dbaa(b(ab) +bb aa )=a*
* * *

Mostraremos ahora algunos resultados previos a uno que ser decisivo para ms adelante.
I. Probaremos por induccin sobre |w| que si |w|>0
Dw(s+t)=Dw(s) + Dw(t)
Caso base:
|w|=1, es decir, w=a lo que se reduce a la regla ya presentada.
Hiptesis inductiva:
El resultado sigue para cadenas w de longitud |w|=k.
Paso inductivo:
Sea w una cadena tal que |w|=k+1, es decir, podemos reescribir w as: w=ua con |u|=k. Luego,
Dw(s+t)=Dua(s+t) pues w=ua
=Da(Du(s+t)) por la regla para cadenas
=Da(Du(s) + Du(t)) por hiptesis inductiva
=Da(Du(s)) + Da(Du(t)) por la regla + ya vista, dado que Du(t) y Du(s) son e.r.
=Dua(s) + Dua(t) por la regla para cadenas
=Dw(s) + Dw(t) pues w=ua

II. Probaremos por induccin sobre |v| que Duv(r) = Dv(Du(r))


Caso base:
|v|=0, es decir, v=
Duv(r)=Du(r) pues v=
=D(Du(r)) por la regla para cadenas
=Dv(Du(r)) pues v=
Hiptesis inductiva:
El resultado sigue para cadenas v de longitud |v|=k.

68
Paso inductivo:
Sea v una cadena tal que |v|=k+1, es decir, podemos reescribir v as: v=wa con |w|=k. Luego,
Duv(r)=Duwa(r) pues v= wa
=Da[Duw(r)] por la regla para cadenas
=Da[Dw(Du(r))] por hiptesis inductiva
=Dwa(Du(r)) por la regla para cadenas dado que Du(r) es una e.r.
=Dv(Du(r)) pues v= wa

III. Sea la funcin definida en la regla para la derivacin de dos e.r. concatenadas, entonces
Dv[(s)Dw(t)] = (s)Dv[Dw(t)]
En efecto, sabemos que (s)= o bien (s)=, luego por las propiedades de las e.r.:
En el primer caso Dv[(s)Dw(t)]=Dv[Dw(t)]=Dv[]==Dv[Dw(t)]=(s)Dv[Dw(t)]
Y en el segundo Dv[(s)Dw(t)]=Dv[Dw(t)]=Dv[Dw(t)]=Dv[Dw(t)]=(s)Dv[Dw(t)]
Adicionalmente mostraremos por induccin sobre el nmero n de sumandos que
Dv{[(Du1(t))+...+(Dun(t))] Dw(t)} = [(Du1(t))+...+(Dun(t))] Dv[Dw(t)]
Caso base:
n=1, Dv{(Du1(t))Dw(t)} se reduce al resultado anterior con s=Du1(t)
Hiptesis inductiva:
El resultado sigue para k sumandos.
Paso inductivo:
Dv{[(Du1(t))+... +(Duk(t))+(Duk+1(t))]Dw(t)}
=Dv{[(Du1(t))+...+(Duk(t))]Dw(t) + (Duk+1(t))Dw(t)} distribuyendo Dw(t)
=Dv{[(Du1(t))+...+(Duk(t))]Dw(t)} + Dv{(Duk+1(t))Dw(t)} por I
=Dv{[(Du1(t))+...+(Duk(t))]Dw(t)} + (Duk+1(t))Dv[Dw(t)] por el caso base
=[(Du1(t))+...+(Duk(t))]Dv[Dw(t)] + (Duk+1(t))Dv[Dw(t)] por hiptesis inductiva
={[(Du1(t))+...+(Duk(t))] + (Duk+1(t))} Dv[Dw(t)] por la regla de distribucin (grupo III)

IV. Mostraremos ahora por induccin sobre |w| que si |w|>0, w=a1a2an
n
Dw(st) = Dw(s)t +
i 2
[Da1...a(i-1)(s)) Dai...an(t)] + (s)Dw(t)

Caso base:
|w|=1, se reduce a la regla ya presentada con la sumatoria ignorada por vacuidad.
Slo por claridad haremos el caso cuando |w|=2, es decir, w=a1a2 (n=2).
Dw(st)=Da1a2(st) pues w=a1a2
=Da2(Da1(st)) por la regla para cadenas
=Da2(Da1(s)t+(s)Da1(t)) por la regla para concatenacin
=Da2(Da1(s)t) + Da2((s)Da1(t)) por la regla + ya vista
=Da2(Da1(s))t+[Da1(s)] Da2(t) + Da2((s)Da1(t)) por la regla para concatenacin
=Da2(Da1(s))t+[Da1(s)] Da2(t) + (s)Da2(Da1(t)) por III
=Da1a2(s)t+[Da1(s)] Da2(t)+(s)Da1a2(t) por la regla para cadenas
=Dw(s)t+(Da1(s)) Da2(t)+(s)Dw(t) pues w=a1a2

69
n
=Dw(s)t+
i 2
[Da1...a(i-1)(s)) Dai...an(t)]+(s)Dw(t) reescribiendo

Hiptesis inductiva:
El resultado sigue para cadenas w de longitud |w|=k.
Paso inductivo:
Sea w una cadena tal que |w|=k+1, es decir, podemos reescribir w as: w=uak+1 con |u|=k,
u=a1a2ak. Luego,
Dw(st)=Dua(k+1)(st) pues w=uak+1
=Da(k+1)[Du(st)] por la regla para cadenas
k
=Da(k+1)[Du(s)t +
i 2
[Da1...a(i-1)(s)) Dai...ak(t)] + (s)Du(t)] por hiptesis inductiva

k
=Da(k+1)[Du(s)t] + Da(k+1)[ i 2
[Da1...a(i-1)(s)) Dai...ak(t)]] + Da(k+1)[(s)Du(t)] regla +

Ahora bien
Da(k+1)[Du(s)t]
=Da(k+1)[Du(s)]t+(Du(s))Da(k+1)(t)
=Dua(k+1)(s)t+(Du(s))Da(k+1)(t)
=Dw(s)t+(Du(s))Da(k+1)(t)
por la regla para la concatenacin, la regla para cadenas y dado que w=uak+1
Tambin
Da(k+1)[(s)Du(t)]
=(s)Da(k+1)[Du(t)]
=(s)Dua(k+1)(t)
=(s)Dw(t) por III, la regla para cadenas y dado que w=uak+1.
Y tambin
k
Da(k+1)[
i 2
[Da1...a(i-1)(s)) Dai...ak(t)]]

k
=
i 2
[Da1...a(i-1)(s)) Da(k+1)[Dai...ak(t)]]

k
=
i 2
[Da1...a(i-1)(s)) Dai...aka(k+1)(t)] por la regla para +, III y la regla para cadenas.

Es decir,
Dw(st)
k
=Dw(s)t+(Du(s))Da(k+1)(t) +
i 2
[Da1...a(i-1)(s)) Dai...aka(k+1)(t)]+(s)Dw(t)

70
k
=Dw(s)t+(Da1...ak(s))Da(k+1)(t) + i 2
[Da1...a(i-1)(s)) Dai...aka(k+1)(t)]+(s)Dw(t) pues u=a1a2ak

k 1
=Dw(s)t+
i 2
[Da1...a(i-1)(s)) Dai...aka(k+1)(t)]+(s)Dw(t)

V. Probaremos por induccin sobre |w| que si |w|>0, w=a1a2an




n
*
Dw(t )={ Dw(t) +



[ D u1 ( t)]... [ D u m ( t)] D a i ...a n ( t)
i 2 1 m i 1 u1 ,..., u mu j & a1 ...a i1 u1 ...u m
}t*


Caso base:
|w|=1, se reduce a la regla ya presentada con la sumatoria ignorada por vacuidad.
Slo por claridad haremos el caso cuando |w|=2, es decir, w=a1a2 (n=2).
Dw(t*)=Da1a2(t*) pues w=a1a2
=Da2(Da1(t*)) por la regla para cadenas
=Da2(Da1(t) t*) por la regla para *
=Da2[Da1(t)] t + [Da1(t)] Da2(t )
* *
por la regla para la concatenacin
=Da1a2(t) t* + [Da1(t)] Da2(t*) por la regla para cadenas
=Da1a2(t) t + [Da1(t)] Da2(t) t
* *
por la regla para *
={Dw(t) + [Da1(t)] Da2(t)} t* por distribucin y w=a1a2
que tiene la forma de nuestro enunciado con n=2
Hiptesis inductiva:
El resultado sigue para cadenas w de longitud |w|=k.
Paso inductivo:
Sea w una cadena tal que |w|=k+1, es decir, podemos reescribir w as: w=uak+1 con |u|=k,
u=a1a2ak. Luego,
Dw(t*)
=Dua(k+1)(t*) pues w=uak+1
=Da(k+1)[Du(t*)] por la regla para cadenas


k
=Da(k+1)[{ Du(t) +



[ D u1 ( t)]... [ D u m ( t)] D a i ...a k ( t)
i 2 1 m i 1 u1 ,..., u mu j & a1 ...a i1 u1 ...u m
}t*]


por hiptesis inductiva con u=a1a2ak


k
*
= Da(k+1)[ Du(t)t +



[ D u1 ( t)]... [ D u m ( t)] D a i ...a k ( t) t* ]
i 2 1 m i 1 u1 ,..., u mu j & a1 ...a i1 u1 ...u m

distribuyendo t*
ahora aplicaremos la regla para + y derivaremos
cada miembro respecto de ak+1; para el segundo miembro
aplicaremos adems I y III

71


k
=Da(k+1)[Du(t)t ] +
*



[ D u1 ( t)]... [ D u m ( t)] Da k1 [ D a i ...a k ( t) t*]
i 2 1 m i 1 u1 ,..., u mu j & a1 ...a i1 u1 ...u m

ahora aplicaremos la regla para la concatenacin en ambos casos
=Da(k+1)[Du(t)]t*+[Du(t)]Da(k+1)(t*)


k
+
[ D u1 ( t )]... [ D
i 2 1 m i 1 u1 ,..., u mu j & a1 ...a i1 u1 ...u m
um ( t )]

D D
a k1 a i ...a k ( t ) t* D a i ...a k ( t ) D a k 1 ( t*)


ahora aplicaremos la regla para cadenas y la regla para *
=Dua(k+1)(t) t* + [Du(t)]Da(k+1)(t) t*
+


k



[ D u1 ( t)]... [ D u m ( t)] D a i ...a k a k1 ( t) t* D a i ...a k ( t) D a k1 ( t) t * ]
i 2 1 m i 1 u1 ,..., u mu j & a1 ...a i1 u1 ...u m



ahora distribuiremos las sumatorias y haremos uak+1=w
= Dw(t) t* + [Du(t)]Da(k+1)(t) t*


k
+
[ D u1 ( t )]... [ D
i 2 1 m i 1 u1 ,..., u mu j & a1 ...a i1 u1 ...u m
um ( t )]

D
a i ...a k a k1 ( t ) t* ]


k

+

[ D u1 ( t)]... [ D u m ( t)] D a i ...a k ( t) D a k1 ( t) t* ]
i 2 1 m i 1 u1 ,..., u mu j & a1 ...a i1 u1 ...u m

ahora aplicaremos la regla de distribucin factorizando t*
y colocaremos el segundo trmino al final haciendo u=a1a2ak
={ Dw(t)


k
+

[ D u1 ( t)]... [ D u m ( t)] D a i ...a k a k1 ( t) ]
i 2 1 m i 1 u1 ,..., u mu j & a1 ...a i1 u1 ...u m

k

+

[ D u1 ( t)]... [ D u m ( t)] D a i ...a k ( t) D a k1 ( t) ]
i 2 1 m i 1 u1 ,..., u mu j & a1 ...a i1 u1 ...u m

+ [Da1...ak(t)]Da(k+1)(t)
} t*
(la sumatoria interna del segundo trmino slo llega hasta a1ai-1,
y como i puede ser a lo ms k se tiene a1a2ak-1, fjese como la funcin
ms interna del tercer trmino junto al ltimo trmino cubren el
caso a1ak)
ntese que con las dos sumatorias junto a [Da1...ak(t)]Da(k+1)(t)
se obtiene la siguiente igualdad:

72
k 1
={ Dw(t) +




[ D u1 ( t)]... [ D u m ( t)] D a i ...a k1 ( t)
i 2 1 m i 1 u1 ,..., u mu j & a1 ...a i1 u1 ...u m
}t*


El importante resultado anunciado es que el nmero de derivadas distintas que se pueden
obtener a partir de una e.r. es finito, es decir, sea el alfabeto sobre el que se forman las e.r. y
sea r una e.r., el conjunto {Dw(r) / w*} es finito.
Demostracin:
Por induccin sobre la longitud de la e.r. r
Caso base:
Sea r una e.r. de longitud |r|=1, es decir r= o r= o r=a (a )
i. Cuando r= es fcil ver de nuestras reglas que Dw()= para todo w, es decir hay una
derivada, no infinitas derivadas distintas.
ii. Cuando r= las reglas permiten evidenciar que Dw()= para w=, Dw()= para w, es
decir hay dos derivadas diferentes, no infinitas derivadas distintas.
ii. Cuando r=a es fcil ver que segn nuestras reglas Dw(a)=a para w=, Dw(a)= para w=a y
Dw(a)= para (w y wa), es decir hay tres derivadas diferentes, no infinitas derivadas
distintas.
Hiptesis inductiva:
Una e.r. r de longitud |r|<k tiene un nmero finito de derivadas distintas que se pueden
obtener a partir de ella.
Paso inductivo:
Sea r una e.r. de longitud |r|=k
Entonces, de acuerdo a la estructura de las e.r., r=s+t o r=st o r=t*
i.Cuando r=s+t, Dw(s+t)=Dw(s) + Dw(t), y de ah por hiptesis inductiva cada miembro de esta
e.r. tiene un nmero finito de derivadas distintas, luego r tiene un nmero finito de derivadas
distintas.
n
ii.Cuando r=st, Dw(st)=Dw(s)t + i 2
[Da1...ai-1(s)) Dai...an(t)] + (s)Dw(t), y de ah por

hiptesis inductiva cada miembro de esta e.r. tiene un nmero finito de derivadas distintas,
luego r tiene un nmero finito de derivadas distintas.

iii.Cuando r= t*,


n
Dw(t*)={ Dw(t) +
[ D u1 ( t )]... [ D
i 2 1 m i 1 u1 ,..., u mu j & a1 ...a i1 u1 ...u m
um ( t )]

D a i ...a n ( t)
}t*,


y de ah por hiptesis inductiva esta larga e.r. tiene un nmero finito de derivadas distintas,
luego r tiene un nmero finito de derivadas distintas.

Un resultado ms ambicioso es el siguiente que busca un nmero lmite superior de


derivadas distintas-:

73
Sea ds = | {Dz(s) / z *} |
dt = | {Dz(t) / z *} |

a) Sea r=s+t, entonces como Dw(s+t)=Dw(s) + Dw(t)


{Dz(s+t) / z *}={ Dz(s)+Dz(t) / z *}
luego si hacemos dr=|{Dz(s+t) / z *}| entonces la combinatoria nos dice que dr = dsdt

b) Sea r=t*, y sea w= a1a2an entonces como




n
*
Dw(t )={ Dw(t) +
[
D u1 ( t )]... [ D
i 2 1 m i 1 u1 ,..., u mu j & a1 ...a i1 u1 ...u m
um ( t )]

D a i ...a n ( t)
}t*


y como estamos buscando un nmero lmite superior,
dicho caso extremo sucede cuando todas las funciones son iguales a ,
la expresin en este caso extremo- se convierte en

D
n
Dw(t*)={ a i ...a n ( t) }t
*

i 1
={Da1...an(t)+Da2...an(t)...+Da(n-1)an(t)+Dan(t)}t*

Luego
{Dz(t*) / z *} = {[Da1...a|z|(t)+Da2...a|z|(t)+...+Da|z|(t)] t* / z *}
cuntas e.r. distintas [Da1...a|z|(t)+Da2...a|z|(t)...+Da|z|(t)] para z * pueden haber sabiendo
que dt = | {Dz(t) / z *} | ?
Es posible, para cadenas z dadas, que alguna de estas e.r. distintas sea un elemento
de {Dz(t) / z *}, o la suma en trminos de e.r.- de dos elementos cualesquiera
de dicho conjunto, o de todos sus elementos (siempre tomando en cuenta que r+s=s+r y
que r+r=r) eso no es otra cosa que el conjunto de partes de {Dz(t) / z *} excepto el
conjunto vaco, es decir, si hacemos dr=| {Dz(t*) / z *} | entonces dr 2dt - 1

c) Sea r=st, entonces como


n
Dw(st)=Dw(s)t + i 2
[Da1...ai-1(s)) Dai...an(t)] + (s)Dw(t)

y como estamos buscando un nmero lmite superior,


dicho caso extremo sucede cuando todas las funciones son iguales a ,
la expresin en este caso extremo- se convierte en
n
Dw(st)=Dw(s)t + i 2
[Dai...an(t)] + Dw(t), es decir,

n
Dw(st)=Dw(s)t + i 1
Dai...an(t)

74
Dw(st)=Dw(s)t + Da1...an(t) + Da2...an(t) + ... + Da(n-1)an(t) + Dan(t)

Por un razonamiento semejante al anterior inciso, pero considerando que


ahora tenemos que tomar en cuenta Dw(s) tambin, tenemos que
si hacemos dr=| {Dz(st) / z *} | entonces dr ds 2dt.

ECUACIONES CON EXPRESIONES REGULARES


Una idea interesantsima es pensar en ecuaciones donde las incgnitas sean e.r. denotadas por
x o xi.
Por ejemplo, sea la ecuacin (a+b)x, qu e.r. x es tal que esta identidad se cumple?, es
posible que existan muchas soluciones y no una, en nuestro caso x=, o x=ba, satisfacen la
identidad.
Para la ecuacin (a+b)x+ac+bca+b+bc+ac una posible solucin es x=+c

Esta idea de una ecuacin puede extenderse a varias ecuaciones, es decir, un sistema de
ecuaciones. Por ejemplo:
1) x1(a+b)x2
2) x2a*+x3
3) x3b+c*
Asimismo la idea de sustitucin se aplica naturalmente, por ejemplo sustituyendo 3) en 2):
x2a* + b+c*

Una ecuacin particularmente productiva es la siguiente xrx+s, donde r y s son expresiones


regulares dadas. La solucin a esta ecuacin es bien conocida y recibe el nombre del Lema de
Arden debido a su autor:
Si L(r) entonces la ecuacin tiene infinitas soluciones xr*(s+t), donde t representa
cualquier e.r.
Si L(r) entonces la ecuacin tiene una nica solucin xr*s.
Demostracin:
i) Si L(r) entonces la ecuacin tiene una nica solucin xr*s
Que r*s sea solucin se comprueba sustituyendo este valor en la ecuacin. En efecto,
x r*s (r*)s (rr*+)s (rr*s+s) rr*s+s r(r*s)+s r(x)+s rx+s
Probaremos ahora, por reduccin al absurdo, que esta solucin es nica.
Supongamos pues que hay otra solucin con cadenas diferentes adicionales a las que denota
r*s, es decir supongamos que xr*s+p, donde p es una e.r., es solucin tambin y que
L(p) L(r*s)=, para que esta sea una otra solucin es claro que L(p).
Si r*s+p es solucin como estamos suponiendo- satisface la ecuacin, es decir,
r*s+pr(r*s+p)+s
pero r(r*s+p)+srr*s+rp+srr*s+s+rp(rr*s+s)+rp(rr*+)s+rpr*s+rp
Luego,
r*s+pr*s+rp

75
Es decir, L(r*s+p)=L(r*s+rp), o lo que es lo mismo L(r*s) L(p)=L(r*s) L(rp)
Como esta igualdad se cumple podemos intersectar ambos miembros de ella con otro conjunto
y la igualdad debiera persitir, haremos la interseccin con L(p):
Lado izquierdo: [L(r*s) L(p)]L(p)=[L(r*s) L(p)] [L(p)L(p)]= L(p)=L(p)
Derecho: [L(r*s) L(rp)] L(p)=[ L(r*s) L(p)] [L(rp)L(p)]=L(rp)L(p)
Como la igualdad se cumple resulta
L(p)=L(rp)L(p)
Sea w la cadena ms pequea de L(p) existe pues el supuesto es que L(p)-; a partir de la
ltima igualdad es claro que tambin w L(rp)L(p), es decir, tambin w L(rp), es
decir, tambin w L(r).L(p), por lo tanto w=uv con u L(r), v L(p), sabemos que u
pues L(r), y por lo tanto que |u|>0, lo que quiere decir que |v|<|w| con v L(p), pero esto
es absurdo pues w es la cadena ms pequea de L(p).
Este absurdo muestra que nuestro supuesto est equivocado y que no hay otra solucin
adems de xr*s.
ii) Si L(r) entonces la ecuacin tiene infinitas soluciones xr*(s+t), donde t representa
cualquier e.r.
Que r*(s+t) sea solucin, para cualquier e.r. t, se comprueba sustituyendo este valor en la
ecuacin como lo haremos enseguida.
Conviene establecer un hecho previo, si L(r) entonces de acuerdo a la definicin de e.r. y
el lenguaje que denota: r* rr*
En efecto, sea L=L(r), como L, podemos reescribir L as L=({} L). Luego,
L(rr*)=L(r).L(r*)=L(r).[ L(r)]*=L.[L]*=L.L*
=L.[{} L L.L L.L.L ...]
=L.{} L.L L.L.L L.L.L.L ...
= L L.L L.L.L L.L.L.L ...
=({} L) L.L L.L.L L.L.L.L ...
=({} {} L) L.L L.L.L L.L.L.L ...
={} ({} L) L.L L.L.L L.L.L.L ...
={} L L.L L.L.L L.L.L.L ...
*
=L
=L(r*)
Hagamos la sustitucin ahora, todo es evidente a partir de las equivalencias conocidas y del
anterior resultado cuyo uso hemos subrayado:
x r*(s+t) r*s+r*t r*s+rr*t (r*)s+rr*t (rr*+)s+rr*t (rr*s+s)+rr*t
(rr*s+s)+rr*t rr*s+s+rr*t rr*s+rr*t+s r[r*s+r*t]+s r[r*(s+t)]+s r[x]+s rx+s

76
CAPTULO 5. CONVERSIONES GENRICAS: El caso regular

A continuacin presentamos algunas conversiones genricas conocidas. Por conversin


entenderemos la construccin de una abstraccin a partir de alguna otra de manera que el
lenguaje subyacente sea el mismo.

Construccin de una GRLD cuyo smbolo raz no aparezca en ninguna parte derecha de
las producciones
Por ejemplo G=({S},{a},{S-->aS,S-->a},S) incluye a su smbolo raz S en la parte derecha de
la primera de sus producciones, G=({S,A},{a},{S-->aA,A-->aA,S-->a,A-->a},S) en
cambio no incluye a su smbolo raz S en la parte derecha de ninguna de sus producciones, y
ambas gramticas generan el mismo lenguaje.
Sea G=(N, T, P, S) tal que L(G)=L y G incluye a su smbolo raz S en la parte derecha de
alguna(s) de sus producciones, entonces podemos construir una GRLD G tal que G no
incluya a su smbolo raz en la parte derecha de ninguna de sus producciones y L(G)=L(G).
Demostracin:
Construimos G as: G=(N { S }, T, P, S) S es un nuevo No Terminal, S N
P = P { S --> / S --> P }
Es obvio que S no aparecer en ninguna parte derecha porque S no es un smbolo de G (es
nuevo), es decir, no est en ningn .
i) Sea u L, entonces u L(G) pues L=L(G), es decir, S=>* u con las producciones de P.
Podemos desglosar esta derivacin en su primer paso y el resto de los pasos:
S=>=>* u donde los pasos de derivacin se dan utilizando producciones de P
denota la cadena que se deriva de S en el primer paso de derivacin
que ha debido utilizar la produccin S--> P
Por la forma de nuestra construccin, entonces S--> P, por lo tanto
S=> donde en este primer paso se utiliza una produccin de P
=>*u con producciones de P, en realidad las mismas producciones de P que en la
derivacin S=>=>* u, es claro que estas producciones tambin estn en P.
Es decir, S=>* u, es decir, u L(G). Lo que prueba que L(G) L(G).
ii) Inversamente sea u L(G), es decir, S=>* u con producciones de P
Podemos desglosar esta derivacin en su primer paso y el resto de los pasos:
S=>=>* u donde los pasos de derivacin se dan utilizando producciones de P
denota la cadena que se deriva de S en el primer paso de derivacin
que ha debido utilizar la produccin S--> P
Por la forma de nuestra construccin, el nico modo de que exista la produccin S--> en P
es que provenga de la existencia de la produccin S--> P.
Precisamente por ello, ya hicimos notar que es evidente que no incluye a S, por lo tanto el
resto de los pasos de derivacin (=>* u) que se dieron utilizando producciones de P, han
debido darse con las producciones de P que son parte de P y son las nicas que quedan en P
de acuerdo a nuestra construccin.

77
Es decir, es posible que S=>=>* u con slo producciones de P, es decir, u L(G), lo que
prueba que L(G) L.
Es decir, L(G)=L(G), y G no incluye a S su smbolo raz- en ninguna parte derecha de sus
producciones.

Ejemplo:
Sea la GRLD G=({S,B},{a,b},P,S)
P:
S-->aS
S-->bB
B-->bS
S-->a
Construimos as la GRLD G=({S,B,S},{a,b},P,S)
P:
S-->aS
S-->bB
S-->a
S-->aS
S-->bB
B-->bS
S-->a
Que no tiene a S en ninguna de sus partes derechas y genera el mismo lenguaje que G.

Construccin de una GRLIzquierda a partir de una GRLDerecha


Sea G una GRLD que genera L={aub / u {a,b}*} (slo mostramos P):
P:
S --> aX
X --> aX
X --> bX
X --> b
Para escribir una GRLI que genere L es una psima idea -que a menudo se tiene- simplemente
invertir las partes derechas as:
P:
S --> Xa
X --> Xa
X --> Xb
X --> b
Fjese que esta GRLI genera cadenas que terminan en "a", nada que ver con L. No sirve
invertir.

Sea G=(N, T, P, S) una GRLD tal que L(G)=L, entonces podemos construir una GRLI G tal
que L(G)=L(G)

78
Demostracin:
Sin prdida de generalidad -por la anterior conversin- podemos suponer que G es tal que sus
producciones no incluyen a su smbolo raz en la parte derecha de ninguna de sus
producciones. Entonces construimos as G=(N, T, P, S)
P:
Y --> Xa si ( X --> aY P ) y X S
S --> Xa si ( X --> a P ) y X S
S --> a si ( S --> a P )
Y --> a si ( S --> aY P )
Es claro que las producciones de P respetan el formato de las GRLIs.
i) Sea uL(G) , es decir, S=>* u con las producciones de P.
Si dicha derivacin se hace en un paso S=>u, entonces S-->u P, y por lo tanto tercera lnea
de la construccin de P- S-->u P, as S=>*u con una produccin de P, es decir, uL(G).
Si la derivacin S=>* u con producciones de P se hace en ms de un paso, podemos desglosar
esta derivacin, suponiendo lcitamente que u=bi1bi2...bikbik+1 con bij T, as:
S=>bi1Vj1 donde se ha utilizado la produccin S-->bi1Vj1 P
=>bi1bi2Vj2 donde se ha utilizado la produccin Vj1-->bi2Vj2 P
...
=>bi1bi2... bikVjk donde se ha utilizado la produccin Vjk-1-->bikVjk P
=>bi1bi2... bikbk+1 donde se ha utilizado la produccin Vjk-->bik+1 P
Ningn Vjh es S, pues G no incluye al smbolo raz en la parte derecha de sus producciones.
Luego, por la forma de nuestra construccin, las siguientes producciones deben estar en P:
Vj1-->bi1
Vj2-->Vj1bi2
...
Vjk-->Vjk-1bik
S-->Vjkbik+1
Luego, la siguiente derivacin es posible en G:
S=>Vjkbik+1=>Vjk-1bikbik+1=>...=>Vj2bi3...bikbik+1=>Vj1bi2bi3...bikbik+1=>bi1bi2bi3...bikbik+1
Es decir, S=>*u en G, es decir u L(G). Lo que prueba que L(G) L(G).
ii) Inversamente, sea u L(G):
Si S=>u en un paso, ello sucede utilizando la produccin S-->u P, pero por construccin,
tercera lnea- esta produccin est en P slo cuando S-->u P, as S=>u tambin en G.
Si S=>*u en G dando ms de un paso, podemos desglosar esta derivacin, suponiendo
lcitamente que u=bi1bi2...bikbik+1 con bij T, as:
S=>Vjkbik+1 donde se ha debido utilizar la produccin S-->Vjkbik+1 P
=>Vjk-1bikbik+1 donde se ha debido utilizar la produccin Vjk-->Vjk-1bik P
...
=>Vj2bi3...bikbik+1 donde se ha debido utilizar la produccin Vj3-->Vj2bi3 P
=>Vj1bi2bi3...bikbik+1 donde se ha debido utilizar la produccin Vj2-->Vj1bi2 P
=>bi1bi2... bikbk+1 donde se ha debido utilizar la produccin Vj1-->bi1 P

79
Estas producciones estn en P fruto de nuestra construccin y les haremos un anlisis tanto
para mostrar que ningn Vjh es S como para indicar qu producciones estn en P.
La inclusin de S-->Vjkbik+1 a P ha utilizado necesariamente la segunda lnea de nuestra
construccin a partir de Vjk-->bik+1 en P, con VjkS.
La inclusin de Vjk-->Vjk-1bik a P ha utilizado la primera lnea de nuestra construccin a partir
de Vjk-1-->bikVjk en P, con Vjk-1S. No ha podido usarse la segunda lnea pues en ese caso
Vjk=S lo que ya est descartado.
Podemos seguir desarrollando un razonamiento anlogo recurrente para indicar que:
La inclusin de Vj3-->Vj2bi3 a P ha utilizado la primera lnea de nuestra construccin a partir
de Vj2-->bi3Vj3 en P, con Vj2S. No ha podido usarse la segunda lnea pues en ese caso Vj3=S
lo que ya est descartado.
La inclusin de Vj2-->Vj1bi2 a P ha utilizado la primera lnea de nuestra construccin a partir
de Vj1-->bi2Vj2 en P, con Vj1S. No ha podido usarse la segunda lnea pues en ese caso Vj2=S
lo que ya est descartado.
La inclusin de Vj1-->bi1 a P ha utilizado la cuarta lnea de nuestra construccin a partir de
S-->bi1Vj1 en P. No ha podido usarse la tercera lnea pues en ese caso Vj1=S lo que ya est
descartado.
As pues, tenemos en P las producciones:
Vjk-->bik+1
Vjk-1-->bikVjk
...
Vj2-->bi3Vj3
Vj1-->bi2Vj2
S-->bi1Vj1
Donde ningn Vjh es S.
Luego, la siguiente derivacin es posible en G:
S=>bi1Vj1=>bi1bi2Vj2=>bi1bi2bi3Vj3=>...=>bi1bi2bi3...bikVjk=>bi1bi2bi3...bikbik+1
Es decir, u L(G). Lo que prueba que L(G) L(G).
Ambas inclusiones demuestran que L(G)=L(G), y es claro que G es una GRLI.

Ejemplo:
A partir de la GRLD G (slo mostramos P):
P:
S --> aX
X --> aX ntese que G no incluye a su smbolo raz en
X --> bX la parte derecha de ninguna de sus producciones
X --> b
escriba una GRLI G que genere el mismo lenguaje que G.

Construimos as G=({S,X},{a,b},P,S)

80
P:
X --> a
X --> Xa
X --> Xb
S --> Xb

Construccin de una GRLD a partir de un AFD A


En esta construccin es claro que si el AFD acepta la cadena vaca, la GRLD no podr generar
dicha cadena de acuerdo a nuestras convenciones. Esta salvedad debe notarse en nuestro
enunciado como se muestra a continuacin.
Sea el AFD A=(K, , , q1, F) tal que T(A)=L, entonces podemos construir una GRLD G tal
que L(G) = T(A) {}.
Demostracin:
Construimos G as: G=(K, , P, q1)
P = { qi-->aqj / (qi,a)=qj } { qi-->a / (qi,a)=qj y qj F}
Es exactamente lo mismo si escribimos P = { qi-->aqj / (qi,a)=qj } { qi-->a / (qi,a) F}
Ntese que en este caso los No Terminales no son letras maysculas usuales sino smbolos del
tipo q1,q2, etc., y que el smbolo raz de la GRLD no es S sino q1.
i) Sea u T(A) (u), es decir, *(q1,u) F.
Si la transicin desde q1 hacia un estado final consumiendo la cadena u se hace en un
movimiento entonces la cadena u es de un smbolo y *(q1,u)=qj con qj F; se sabe que
*(q1,u)=(q1,u) cuando u es de un smbolo, luego (q1,u)=qj con qj F, o lo que es lo mismo,
(q1,u) F; por lo tanto, por la construccin de P, q1-->u P, as q1=>*u con una produccin
de P, es decir, la cadena u L(G), pues q1 es el smbolo raz de G.
Si la transicin desde q1 hacia un estado final consumiendo la cadena u se hace en ms de un
movimiento, podemos desglosar esta transicin, suponiendo lcitamente que u=bi1bi2...bikbik+1
con bij T, as:
(q1,bi1bi2...bikbik+1)|--(q j1,bi2bi3...bikbik+1) utilizando la regla (q1,bi1)=qj1
|--(q j2,bi3...bikbik+1) utilizando la regla (q j1,bi2)=qj2
...
|--(q jk-1,bikbik+1) utilizando la regla (q jk-2,bik-1)=qjk-1
|--(q jk,bik+1) utilizando la regla (q jk-1,bik)=qjk
|--(q j,) utilizando la regla (q jk,bik+1)=qj con qj F
Por nuestra construccin, a partir de dichas reglas de transicin, debemos tener las siguientes
producciones en P:
q1-->bi1qj1
q j1-->bi2qj2
...
q jk-2-->bik-1qjk-1
q jk-1-->bikqjk
q jk-->bik+1

81
Y por lo tanto la siguiente derivacin es posible en G:
q1=>bi1qj1=>bi1bi2qj2 =>...=>bi1bi2...bik-2q jk-2=>bi1bi2...bik-2bik-1qjk-1
=>bi1bi2...bik-2bik-1bikqjk=>bi1bi2...bik-2bik-1bikbik+1
Es decir, q1=>*bi1bi2...bik-2bik-1bikbik+1, es decir, u L(G).
Lo que prueba que T(A)-{} L(G).
ii) Inversamente, sea u L(G):
Si q1=>u en un paso de derivacin, ello sucede utilizando la produccin q1-->u P, pero por
construccin esta produccin est en P slo cuando en A tenemos la regla (q1,u)=qj (qj F),
as *(q1,u) F, es decir, u T(A).
Si q1=>*u en G dando ms de un paso, podemos desglosar esta derivacin, suponiendo
lcitamente que u=bi1bi2...bikbik+1 con bij T, as:
q1=>bi1qj1 donde se ha debido utilizar la produccin q1-->bi1qj1 P
=>bi1bi2qj2 donde se ha debido utilizar la produccin qj1-->bi2qj2 P
...
=>bi1bi2...bik-2q jk-2 donde se ha debido utilizar la produccin qjk-3-->bik-2qjk-2 P
=>bi1bi2...bik-2bik-1qjk-1 donde se ha debido utilizar la produccin qjk-2-->bik-1qjk-1 P
=>bi1bi2...bik-2bik-1bikqjk donde se ha debido utilizar la produccin qjk-1-->bikqjk P
=>bi1bi2...bik-2bik-1bikbik+1 donde se ha debido utilizar la produccin qjk-->bik+1 P
Estas producciones estn en P fruto de nuestra construccin y su presencia se debe solamente
a que en A existen las siguientes reglas de transicin:
(q1,bi1)=qj1
(q j1,bi2)=qj2
...
(q jk-3,bik-2)=qjk-2
(q jk-2,bik-1)=qjk-1
(q jk-1,bik)=qjk
(q jk,bik+1)=qj con qj F
A partir de estas reglas es fcil describir una serie de transiciones as:
(q1,bi1bi2...bikbik+1)|--(q j1,bi2bi3...bikbik+1) utilizando la regla (q1,bi1)=qj1
|--(q j2,bi3...bikbik+1) utilizando la regla (q j1,bi2)=qj2
...
|--(q jk-1,bikbik+1) utilizando la regla (q jk-2,bik-1)=qjk-1
|--(q jk,bik+1) utilizando la regla (q jk-1,bik)=qjk
|--(q j,) utilizando la regla (q jk,bik+1)=qj con qj F
Es decir, (q1,bi1bi2...bikbik+1)|-- *(q j,) con qj F, es decir, u T(A).
Lo que prueba que L(G) T(A).
Recurdese que en la demostracin de T(A)-{} L(G) se descarta el caso u=.
Ambas inclusiones junto al ltimo comentario demuestran que L(G)=T(A)-{}, y es claro que
G es una GRLD.

82
Ejemplo:
Sea A=({q1,q2}, {a}, , q1, {q1})
:
(q1,a)=q2
(q2,a)=q1

Construimos as la GRLD G=({q1,q2}, {a}, P, q1)


P:
q1-->aq2
q2-->aq1
q2-->a pues en la regla (q2,a)=q1, q1 F
Ntese que A acepta , pero G no genera .

Construccin de una GRLD a partir de un AFN A


En esta construccin es claro que si el AFN acepta la cadena vaca, la GRLD no podr generar
dicha cadena de acuerdo a nuestras convenciones. Esta salvedad debe notarse en nuestro
enunciado.
Sea el AFN A=(K, , d, q1, F) tal que T(A)=L entonces podemos construir una GRLD G tal
que L(G)=T(A) - {}.
Demostracin:
Construimos G=(K, , P, q1) as:
P = { qi-->aqj / qj d(qi,a) } { qi-->a / qj d(qi,a) y qj F}
Ntese que en este caso los No Terminales no son letras maysculas usuales sino smbolos del
tipo q1,q2, etc., y que el smbolo raz de la GRLD no es S sino q1.
i) Sea u T(A) (u), es decir, d*(q1,u) F .
Si la transicin desde q1 hacia algn estado final consumiendo la cadena u se hace en un
movimiento entonces la cadena u es de un smbolo y qj d*(q1,u) con qj F; se sabe que
d*(q1,u)=d(q1,u) cuando u es de un smbolo, luego qj d(q1,u) con qj F; por lo tanto, por la
construccin de P, q1-->u P, as q1=>*u con una produccin de P, luego u L(G), pues q1
es el smbolo raz de G.
Si la transicin desde q1 hacia algn estado final consumiendo la cadena u se hace en ms de
un movimiento, podemos desglosar estas transiciones, suponiendo lcitamente que
u=bi1bi2...bikbik+1 con bij T, de la siguiente manera, donde debe tenerse en cuenta que esta es
una de las transiciones posibles la que nos lleva de q1 a un estado final qj- pues por el no
determinismo el rbol de transiciones puede tener muchas ramas ms:
(q1,bi1bi2...bikbik+1)|--(q j1,bi2bi3...bikbik+1) utilizando una regla donde qj1 d(q1,bi1)
|--(q j2,bi3...bikbik+1) utilizando una regla donde qj2 d(q j1,bi2)
...
|--(q jk-1,bikbik+1) utilizando una regla donde qjk-1 d(q jk-2,bik-1)
|--(q jk,bik+1) utilizando una regla donde qjk d(q jk-1,bik)
|--(q j,) utilizando una regla donde qj d(q jk,bik+1) con qj F

83
Por nuestra construccin, a partir de dichas reglas de transicin, debemos tener las siguientes
producciones en P:
q1-->bi1qj1
q j1-->bi2qj2
...
q jk-2-->bik-1qjk-1
q jk-1-->bikqjk
q jk-->bik+1
Y por lo tanto la siguiente derivacin es posible en G:
q1=>bi1qj1=>bi1bi2qj2 =>...=>bi1bi2...bik-2q jk-2=>bi1bi2...bik-2bik-1qjk-1
=>bi1bi2...bik-2bik-1bikqjk=>bi1bi2...bik-2bik-1bikbik+1
Es decir, q1=> bi1bi2...bik-2bik-1bikbik+1, es decir, u L(G).
*

Lo que prueba que T(A)-{} L(G).


ii) Inversamente, sea u L(G):
Si q1=>u en un paso de derivacin, ello sucede utilizando la produccin q1-->u P, pero por
construccin esta produccin est en P slo cuando en A tenemos una regla de transicin
d(q1,u) tal que qj d(q1,u) con qj F; por un resultado ya visto se sabe que d(q1,u)=d*(q1,u)
cuando u es de un smbolo, entonces qj d*(q1,u) con qj F, luego d*(q1,u) F , es
decir, u T(A).
Si q1=>*u en G dando ms de un paso, podemos desglosar esta derivacin, suponiendo
lcitamente que u=bi1bi2...bikbik+1 con bij T, as:
q1=>bi1qj1 donde se ha debido utilizar la produccin q1-->bi1qj1 P
=>bi1bi2qj2 donde se ha debido utilizar la produccin qj1-->bi2qj2 P
...
=>bi1bi2...bik-2q jk-2 donde se ha debido utilizar la produccin qjk-3-->bik-2qjk-2 P
=>bi1bi2...bik-2bik-1qjk-1 donde se ha debido utilizar la produccin qjk-2-->bik-1qjk-1 P
=>bi1bi2...bik-2bik-1bikqjk donde se ha debido utilizar la produccin qjk-1-->bikqjk P
=>bi1bi2...bik-2bik-1bikbik+1 donde se ha debido utilizar la produccin qjk-->bik+1 P
Estas producciones estn en P fruto de nuestra construccin y su presencia se debe solamente
a que en A existen reglas de transicin as:
d(q1,bi1) con qj1d(q1,bi1)
d(q j1,bi2) con qj2 d(q j1,bi2)
...
d(q jk-3,bik-2) con qjk-2 d(q jk-3,bik-2)
d(q jk-2,bik-1) con qjk-1 d(q jk-2,bik-1)
d(q jk-1,bik) con qjk d(q jk-1,bik)
d(q jk,bik+1) con qj d(q jk,bik+1) y qj F
A partir de estas reglas es fcil describir una serie de transiciones as aunque por el no
determinismo es posible que existan otras ramas en el rbol de transiciones-:
(q1,bi1bi2...bikbik+1)|--(q j1,bi2bi3...bikbik+1)
|--(q j2,bi3...bikbik+1)|-- ... |--(q jk-1,bikbik+1)|--(q jk,bik+1)|--(q j,)

84
Es decir, una de las ramas del rbol de transiciones es tal que podemos escribir
(q1,bi1bi2...bikbik+1)|-- *(q j,) con qj F, es decir, u T(A).
Lo que prueba que L(G) T(A).
Recurdese que en la demostracin de T(A)-{} L(G) se descarta el caso u=.
Ambas inclusiones junto al ltimo comentario demuestran que L(G)=T(A)-{}, y es claro que
G es una GRLD.

Ejemplo:
Sea A=({q1,q2,q3}, {a,b,c}, d, q1, {q1,q2,q3})
d:
d(q1,a)={q2,q3}
d(q2,b)={q2}
d(q3,c)={q3}

Construimos as la GRLD G=({q1,q2,q3}, {a,b,c}, P, q1)


P:
q1-->aq2 que viene de la regla de transicin 1
q1-->aq3 que viene de la regla de transicin 1
q2-->bq2 que viene de la regla de transicin 2
q3-->cq3 que viene de la regla de transicin 3
q1-->a que viene de la regla de transicin 1
q2-->b que viene de la regla de transicin 2
q3-->c que viene de la regla de transicin 3
Ntese que A acepta , pero G no genera .

Construccin de un AFN A a partir de una GRLD G


Ntese que en esta construccin los estados del AFN no son como siempre q1, q2, etc.
-excepto el nuevo estado qf- sino elementos de N (es decir, S, X, etc.) y que el estado inicial
no es q1 sino S.
Sea G=(N, T, P, S) -qf N- una GRLD tal que L(G)=L entonces podemos construir un AFN
A tal que T(A)=L(G).
Demostracin:
Construimos el AFN A as:
A=(N {qf}, T, d, S, {qf})
qf es un nuevo elemento y es el nico estado final
d:
Y d(X,a) si X-->aY P
qf d(X,a) si X-->a P
i) Sea u T(A), es decir, d*(S,u) F .
Si la transicin desde S hacia algn estado final consumiendo la cadena u se hace en un
movimiento entonces la cadena u es de un smbolo y qf d*(S,u) con qf F; se sabe que
d*(S,u)=d(S,u) cuando u es de un smbolo, luego qf d(S,u) con qf F; por la construccin

85
de A esta regla de transicin est en A solamente cuando S-->u P, as S=>*u con una
produccin de P, luego u L(G).
Si la transicin desde S hacia algn estado final consumiendo la cadena u se hace en ms de
un movimiento, podemos desglosar estas transiciones, suponiendo lcitamente que
u=bi1bi2...bikbik+1 con bij T, de la siguiente manera, donde debe tenerse en cuenta que esta es
una de las transiciones posibles la que nos lleva de S hacia el nico estado final qf- pues por
el no determinismo el rbol de transiciones puede tener muchas ramas ms:
(S,bi1bi2...bikbik+1)|--(X j1,bi2bi3...bikbik+1) utilizando una regla donde Xj1 d(S,bi1)
|--(X j2,bi3...bikbik+1) utilizando una regla donde Xj2 d(X j1,bi2)
...
|--(X jk-1,bikbik+1) utilizando una regla donde Xjk-1 d(X jk-2,bik-1)
|--(X jk,bik+1) utilizando una regla donde Xjk d(X jk-1,bik)
|--(qf,) utilizando una regla donde qf d(X jk,bik+1) con qf F
Por la construccin de A estas regla de transicin estn en A solamente cuando las siguientes
producciones estn en P:
S-->bi1Xj1
X j1-->bi2Xj2
...
X jk-2-->bik-1Xjk-1
X jk-1-->bikXjk
X jk-->bik+1
Y por lo tanto la siguiente derivacin es posible en G:
S=>bi1Xj1=>bi1bi2Xj2 =>...=>bi1bi2...bik-2X jk-2=>bi1bi2...bik-2bik-1Xjk-1
=>bi1bi2...bik-2bik-1bikXjk=>bi1bi2...bik-2bik-1bikbik+1
Es decir, S=> bi1bi2...bik-2bik-1bikbik+1, es decir, u L(G).
*

Lo que prueba que T(A) L(G).


ii) Inversamente, sea u L(G).
Si S=>u en un paso de derivacin, ello sucede utilizando la produccin S-->u P, entonces
por construccin en A incluimos la regla d(S,u) tal que qf d(S,u) con qf F; por un
resultado ya visto se sabe que d(S,u)=d*(S,u) cuando u es de un smbolo, luego qf d*(S,u)
con qf F, as d*(S,u) F , es decir, u T(A).
Si S=>*u en G dando ms de un paso, podemos desglosar esta derivacin, suponiendo
lcitamente que u=bi1bi2...bikbik+1 con bij T, as:
S=>bi1Xj1 donde se ha debido utilizar la produccin S-->bi1Xj1 P
=>bi1bi2Xj2 donde se ha debido utilizar la produccin Xj1-->bi2Xj2 P
...
=>bi1bi2...bik-2bik-1Xjk-1 donde se ha debido utilizar la produccin Xjk-2-->bik-1Xjk-1 P
=>bi1bi2...bik-2bik-1bikXjk donde se ha debido utilizar la produccin Xjk-1-->bikXjk P
=>bi1bi2...bik-2bik-1bikbik+1 donde se ha debido utilizar la produccin Xjk-->bik+1 P

Por construccin, en A incluimos las siguientes reglas:

86
d(S,bi1) con X j1 d(S,bi1)
d(X j1,bi2) con Xj2 d(X j1,bi2)
...
d(X jk-2,bik-1) con Xjk-1 d(X jk-2,bik-1)
d(X jk-1,bik) con Xjk d(X jk-1,bik)
d(X jk,bik+1) con {qf} d(X jk,bik+1)
A partir de estas reglas es fcil describir una serie transiciones as aunque por el no
determinismo es posible que existan otras ramas en el rbol de transiciones-:
(S,bi1bi2...bikbik+1)|--(X j1,bi2bi3...bikbik+1)
|--(X j2,bi3...bikbik+1)|-- ... |--(X jk-1,bikbik+1)|--(X jk,bik+1)|--(q f,)
Es decir, una de las ramas del rbol de transiciones permite escribir lo siguiente
(S,bi1bi2...bikbik+1)|-- *(q f,) con qf F, es decir, u T(A).
Lo que prueba que L(G) T(A).
Ambas inclusiones demuestran que L(G)=T(A), y es claro que A es un AFN.

Ejemplo:
Sea G=({S,B}, {a,b}, P, S)
P:
S-->aB
B-->bS
B-->b

Construimos as el AFN A=({S,B,qf }, {a,b}, d, S, {qf})


d:
d(S,a)={B} que viene de la primera produccin
d(B,b)={S,qf} que viene de la segunda y tercera producciones

Construccin de un AFD A no reinicializable a partir de un AFD A reinicializable


Se dice que un AFD es no reinicializable si no hay ninguna transicin as (qi,a)=q1, es decir
desde el punto de vista del diagrama de transiciones, si no llega ningn arco al estado inicial,
en caso contrario el AFD se dice reinicializable.
Sea A=(K, , , q1, F) q0 K- un AFD tal que T(A)=L, entonces podemos construir un
AFD A tal que T(A)=T(A) y A es no reinicializable.
Demostracin:
Construimos el AFN A as:
A=(K {q0}, , , q0, F)
F = F si q1 F
= F {q0} si q1 F
:
(q0,a) = (q1,a)
(qi,a) = (qi,a) qi K

87
A partir de esta construccin es claro que (la segunda lnea de dice prcticamente
que copiemos ), por lo tanto es obvio que si qi K entonces *(qi,w)=*(qi,w).
Tambin es claro que ninguna regla de transicin tiene a q0 como imagen, es decir, ningn
arco llega a q0 que es el estado inicial.
Sea u= T(A), eso ocurre si y slo si *(q1,)=q1 y q1 F, lo cual ocurre si y slo si en A
F=F {q0}, es decir, si y slo si *(q0,)=q0 y q0 F, es decir, si y slo si u= T(A).
Sea u T(A) con u=bw, es decir, *(q1,u) F, si y slo si
(q1,bw)|--(qh,w) utilizando la regla (q1,b)=qh
|--*(q j,) donde *(q h,w)=qj con qj F
Por nuestra construccin eso ocurre si y slo si en A tenemos la regla (q0,b)=qh[=(q1,b)],
y si y slo si *(q h,w)=*(q h,w)=qj con qj F (pues F F), es decir,
si y slo si en A es posible la siguiente serie de transiciones:
(q0,bw)|--(qh,w) utilizando la regla (q0,b)=qh
|--*(q j,) pues *(q h,w)=*(q h,w)=qj con qj F (pues F F)
es decir si y slo si *(q0,u) F, o lo que es lo mismo, u T(A).

Una construccin alternativa es:


A=(K {qf}, , , q1, F)
F = F si q1 F
= F {qf} si q1 F
:
(qi,a) = (qi,a) si (qi,a)q1
= qf en otro caso
(qf,a) = (q1,a)

Ejemplo:
Sea el AFD A=({q1,q2}, {a,b}, , q1, {q1})
:
(q1,a)=q1
(q1,b)=q2
(q2,a)=q1
(q2,b)=q2
Construimos as el AFD A=({q1,q2,q0}, , , q0, {q1,q0})
:
(q0,a)=q1
(q0,b)=q2
(q1,a)=q1
(q1,b)=q2
(q2,a)=q1
(q2,b)=q2

88
La construccin alternativa obtiene el siguiente AFD A=({q1,q2,qf}, {a,b}, , q1, {q1,qf})
:
(q1,a)=qf
(q1,b)=q2
(q2,a)=qf
(q2,b)=q2
(qf,a)=qf
(qf,b)=q2

Construccin de un AFN A a partir de un AFD A


Sea A=(K, , , q1, F) un AFD tal que T(A)=L entonces podemos construir un AFN A tal
que T(A)=T(A).
Demostracin:
Construimos el AFN A as:
A=(K, , d, q1, F)
d:
d(qi,a)={(qi,a)}
Sea u T(A) si u= entonces q1 F en el AFD si y slo si q1 F tambin en el AFN y por
tanto, como d*(q1,)={q1}, d*(q1,) F , es decir, u T(A).
Sea u T(A), suponiendo lcitamente que u=bi1bi2...bik con bij T podemos desglosar la
aceptacin (q1,bi1bi2...bik)|--*(q j,) con qj F as:
(q1,bi1bi2...bik)|--(q j1,bi2bi3...bik) utilizando la regla (q1,bi1)=qj1
|--(q j2,bi3...bik) utilizando la regla (q j1,bi2)=qj2
...
|--(q jk-1,bik) utilizando la regla (q jk-2,bik-1)=qjk-1
|--(q j,) utilizando la regla (q jk-1,bik)=qj con qj F en el AFD A
lo que ocurre si y slo si en el AFN A tenemos por construccin- las siguientes reglas y de
ah la siguiente transicin:
(q1,bi1bi2...bik)|--(q j1,bi2bi3...bik) utilizando la regla d(q1,bi1)={qj1}
|--(q j2,bi3...bik) utilizando la regla d(q j1,bi2)={qj2}
...
|--(q jk-1,bik) utilizando la regla d(q jk-2,bik-1)={qjk-1}
|--(q j,) utilizando la regla d(q jk-1,bik)={qj} con qj F en el AFN A.
Y por tanto u T(A).
Es decir, T(A)=T(A)

Ejemplo:
Sea el AFD A=({q1,q2}, {a,b}, q1{q2})
:
(q1,a)=q2 (q1,b)=q2
(q2,a)=q2 (q2,b)=q2

89
Construimos as el AFN A=({q1,q2}, {a,b}, dq1{q2})
d:
d(q1,a)={q2}
d(q1,b)={q2}
d(q2,a)={q2}
d(q2,b)={q2}
Ntese la importantsima diferencia formal de que las reglas tengan como imagen estados en
el caso del AFD y conjuntos de estados en el caso del AFN.

Construccin de un AFD A a partir de un AFN A


Sea A=(K, , d, q1, F) un AFN tal que T(A)=L entonces podemos construir un AFD A tal
que T(A)=T(A).
Demostracin:
Construimos el AFD A as:
A=(K, , , Q1, F)
K = 2K es decir, el conjunto de estados del nuevo AFD se construye armando el conjunto de
partes de K.
Por ejemplo si K={q1,q2} entonces K={ {q1}, {q2}, {q1,q2}, {} } = {Q1, Q2, Q3, Q4}; aunque
los conjuntos no tienen orden, ntese que nosotros siempre escribiremos el conjunto vaco
(elemento del conjunto de partes) al final y los elementos de K en forma organizada tal como
el ejemplo sugiere (de a uno, de a dos, de a tres, etc., todos y el vaco); tambin los nombres
de los estados de A vendrn en maysculas referenciando a cada elemento de 2K.
Q1 es el estado inicial del nuevo AFD y se define as Q1={q1}.
F = { Qi / Qi K y (Qi F) {} }
:
(Qi,a) =
p Qi
d(p,a)

Recuerde que debe ser total.

Antes de continuar con la demostracin presentaremos un ejemplo:


Sea el AFN A=({q1,q2}, {a,b}, d, q1, {q1,q2})
d:
d(q1,a)={q1}
d(q1,b)={q2}
d(q2,a)={q1,q2}
sabemos que si no se escribe d(q2,b)={}

90
Construimos el AFD A as:
A=(K, {a,b}, , Q1, F)
K={ {q1}, {q2}, {q1,q2}, {} } = {Q1, Q2, Q3, Q4}
Para construir F debemos averiguar cules Qi entran a este conjunto:
as:
Para Q1: Q1 F={q1} {q1,q2}={q1} y por tanto (Q1 F) {}, luego Q1 entra a F
Para Q2: Q2 F={q2} {q1,q2}={q2} y por tanto (Q2 F) {}, luego Q2 entra a F
Para Q3: Q3 F={q1,q2} {q1,q2}={q1,q2} y por tanto (Q3 F) {}, luego Q3 entra a F
Para Q4: Q4 F={} {q1,q2}={} y por tanto (Q4 F) ={}, luego Q4 no entra a F
Luego, F={Q1, Q2, Q3}
:
(Q1,a) = d(p,a) =
p Q1

d(p,a) = d(q1,a) = {q1} = Q1
p {q1}

(Q1,b) =
p Q1
d(p, b) =
p {q1}
d(p, b) = d(q1,b) = {q2} = Q2

(Q2,a) =
p Q2
d(p,a) =
p {q 2 }
d(p,a) = d(q2,a) = {q1,q2} = Q3

(Q2,b) =
p Q2
d(p, b) =
p {q 2 }
d(p, b) = d(q2,b) = {} = Q4

(Q3,a) =
p Q3
d(p,a) =
p {q1 ,q 2 }
d(p,a) = d(q1,a) d(q2,a) = {q1} {q1,q2} ={q1,q2}= Q3

(Q3,b) =
p Q3
d(p, b) =
p {q1 ,q 2 }
d(p, b) = d(q1,b) d(q2,b) = {q2} {} = {q2} = Q2

(Q4,a) =
p Q4
d(p,a) =
p {}
d(p,a) = {} = Q4

(Q4,b) =
p Q4
d(p, b) =
p {}
d(p, b) = {} = Q4

Resumiendo, el AFD A=({Q1, Q2, Q3, Q4}, {a,b}, , Q1, {Q1, Q2, Q3})
:
(Q1,a) = Q1
(Q1,b) = Q2
(Q2,a) = Q3
(Q2,b) = Q4
(Q3,a) = Q3
(Q3,b) = Q2
(Q4,a) = Q4
(Q4,b) = Q4

91
Cuya grfica es:

Retomemos la demostracin, probaremos que (Q1,u)=d(q1,u), esto se hace por induccin


sobre la longitud de u.
Caso base:
|u|=0, es decir u=
(Q1,u) = (Q1,) pues u=
= Q1 por definicin de
= {q1} por definicin de Q1
= d (q1,) por definicin de d

= d(q1,u) pues u=
Hiptesis inductiva:
El enunciado es cierto para cadenas u de longitud |u|=k.
Paso inductivo:
Sea u una cadena tal que su longitud es |u|=k+1. Luego, lcitamente se puede reescribir u as
u=va, donde v es una cadena de longitud |v|=k.
(Q1,u) = (Q1,va) pues u=va

= ( (Q1,v),a) por definicin de
= (d(q1,v),a) por hiptesis inductiva
= d(p, a)
p d*( q1 , v )
por la forma de construir ,

recuerde que d(q1,v) es un conjunto de estados



= d (q1,va) por definicin de d
= d(q1,u) pues u=va
Ahora bien, ya sabemos que (Q1,u)=d(q1,u), lo que permite decir lo siguiente:
u T(A) si y slo si (d(q1,u) F) {}
es decir, si y slo si ((Q1,u) F) {}
lo que sucede por construccin- si y slo si (Q1,u) F
es decir, si y slo si u T(A).
Lo que demuestra que T(A)=T(A), y es claro que A es un AFD.
Las ltimas dos construcciones muestran que siempre que un lenguaje es aceptado por un
AFN tambin es aceptado por un AFD (y viceversa), es decir, L es aceptado por un AFN si y
slo si L es aceptado por un AFD, lo que algunos denominan equivalencia entre AFNs y
AFDs.

92
Sorprendentemente los AFNs aunque parecen- no son ms poderosos que los AFDs.

Hay ciertos casos en los que la construccin de un AFD a partir de un AFN se simplifica
(puede retomarse la misma idea tambin con -AFNs); considere por ejemplo el siguiente
AFN A=({q1,q2}, {a,b}, d, q1, {q2}) d: d(q1,a)=d(q1,b)=d(q2,a)={q2}
No es que haya no determinismo -al contrario, dado un estado y un smbolo el siguiente
estado est bien determinado salvo para el estado q2 y el smbolo b- sino que nicamente hay
ausencia de algunas reglas de transicin, falta(n) algn(os) par(es) estado/smbolo que
llegue(n) a -o cuya imagen sea- un nico estado; cierta literatura denomina a este tipo de
autmatas AFDs incompletos (siguiendo esta lnea se define el determinismo cuando
|d(qi,cj)|1); nosotros los seguiremos llamando AFNs, y su conversin a AFD requiere
simplemente la inclusin de las reglas de transicin que faltan, como indicamos ahora.
Dado un AFN A=(K, , d, q1, F) del tipo descrito con |K|=n, se construye as el AFD
A=(K {qn+1}, , , q1, F) tal que T(A)=T(A)
:
(qn+1,a) = qn+1 a
(qi,a) = qj si d(qi,a)={qj}
= qn+1 si d(qi,a)={}
qn+1 se denomina estado muerto o estado trampa y tambin suele denotarse con qm.

Ejemplo:
Sea el AFN A=({q1,q2}, {a,b}, d, q1, {q2}) d: d(q1,a)=d(q1,b)=d(q2,a)={q2}

Construimos as el AFD A=({q1,q2,qm}, {a,b}, , q1, {q2})


:
(qm,a)=(qm,b)=qm
(q1,a)=(q1,b)=(q2,a)=q2
(q2,b)=qm

En esta y en la siguiente conversin es evidente que los autmatas construidos aceptan el


mismo lenguaje que el autmata de origen.

Construccin de un AFD A con el alfabeto extendido a partir de un AFD A


En la misma lnea que la anterior conversin puede ser til, dado un AFD A, construir un
AFD A que acepte el mismo lenguaje pero cuyo alfabeto de entrada sea ms grande.
Dado el AFD A=(K, , , q1, F) construimos el AFD A tal que T(A)=T(A) as:
A=(K {qm}, , , q1, F) donde
:
(qi,a) = (qi,a) qi K, a
(qi,a) = qm qi K, a -
(qm,a) = qm a

93
Ejemplo:
Dado el AFD A=({q1,q2}, {a,b}, , q1, {q2})
:
(q1,a)=(q1,b)=(q2,a)=(q2,b)=q2
Construimos as el AFD A=({q1,q2,qm}, {a,b,c}, , q1, {q2}) ntese el alfabeto {a,b,c}
:
(q1,a)=(q1,b)=(q2,a)=(q2,b)=q2
(q1,c)=(q2,c)=qm
(qm,a)=(qm,b)=(qm,c)=qm

Este resultado se puede utilizar para hacer iguales los alfabetos de entrada de dos AFDs
distintos A1 y A2, con alfabetos 1 y 2 respectivamente (1 2), podemos construir los
autmatas A1 y A2, con el alfabeto extendido =(1 2), de manera que A1 y A2
trabajan con el mismo alfabeto.

Construccin de un AFN A a partir de un -AFN A


Sea A=(K, , d, q1, F) un -AFN tal que T(A)=L entonces podemos construir un AFN A tal
que T(A)=T(A).
Demostracin:
Construimos el AFN A as:
A=(K, , d, q1, F)
F {q1} si cierre({q1}) F
F=
F en otro caso
d:
d(qi,a) = d(qi,a)

Si recordamos la definicin de d para -AFNs tenemos que:



d(qi,a) = -cierre d(p,a) = -cierre
d(p,a)

p d*( q i , ) p cierr e({q i })
Antes de continuar con la demostracin presentaremos un ejemplo:
Sea el AFN A = ({q1,q2,q3}, b,c}, d, q1, {q1,q2,q3})
d: d(q1,)={q2,q3} d(q2,b)={q2} d(q3,c)={q3}

94
Construimos el AFN A as:
A=({q1,q2,q3}, b,c}, d, q1, F)
F={q1,q2,q3} pues el cierre({q1})={q1,q2,q3} y por tanto (cierre({q1}) F)
d:

d(q1,b) = -cierre d(p, b) = -cierre
d(p, b)

p cierr e({q1}) p {q1 ,q 2 ,q 3}
= -cierre(d(q1,b) d(q2,b) d(q3,b))
= -cierre( {q2} ) =-cierre({q2}) = {q2}

d(q1,c) = -cierre d(p,c) = -cierre
d(p,c)

p cierr e({q1}) p {q1 ,q 2 ,q 3}
= -cierre(d(q1,c) d(q2,c) d(q3,c))
= -cierre( {q3}) =-cierre({q3}) = {q3}

d(q2,b) = -cierre d(p, b) = -cierre
d(p, b)

p cierr e({q 2 }) p {q 2 }
= -cierre(d(q2,b))
= -cierre({q2}) = {q2}

d(q2,c) = -cierre d(p,c) = -cierre
d(p,c)

p cierr e({q 2 }) p {q 2 }
= -cierre(d(q2,c))
= -cierre() = {}

d(q3,b) = -cierre d(p, b) = -cierre
d(p, b)

p cierr e({q 3}) p {q 3}
= -cierre(d(q3,b))
= -cierre() = {}

d(q3,c) = -cierre d(p,c) = -cierre
d(p,c)

p cierr e({q 3}) p {q 3}
= -cierre(d(q3,c))
= -cierre({q3}) = {q3}
Resumiendo no anotamos las reglas de transicin cuya imagen es el conjunto vaco-:
A=({q1,q2,q3}, b,c}, d, q1, {q1,q2,q3})
d:
d(q1,b)={q2} d(q1,c)={q3}
d(q2,b)={q2} d(q3,c)={q3}

95
Cuya grfica es:

Ntese la particularidad de que


i) En el AFN A, d(q1,)=cierre({q1})={q1,q2,q3}
ii) En el AFN A, d(q1,)={q1}
Es decir, como muestra este ejemplo para la cadena u=, no siempre d(q1,)=d(q1,)

Resta probar que T(A)=T(A)


Dividiremos ello en dos partes el caso de la cadena u= y el resto de los casos.
Cuando u= y u T(A) entonces
d(q1,)F, pero d(q1,)=cierre({q1}), entonces
cierre({q1}) F y por lo tanto, por construccin,
F=F {q1}, es decir
q1 F, y por lo tanto -dado que d(q1,)={q1}- tenemos que
d(q1,) F, es decir,
u T(A).
Inversamente si u= y u T(A), entonces
d(q1,) F, es decir dado que por definicin d(q1,)={q1}
{q1} F, lo que indica que q1 F, ello significa por construccin- que
cierre({q1}) F (ntese que si q1 F esto tambin es cierto),
pero entonces, dado que d(q1,)=cierre({q1}),

d (q1,) F, es decir,
u T(A).

El caso |u|>0 requiere algunos interesantes y no muy simples resultados previos. Veamos.
Probaremos primero que -cierre(-cierre(C))=-cierre(C).
Para ello debemos recordar la definicin recursiva del -cierre(C) y utilizaremos lo que se
denomina una prueba por induccin estructural.
De la definicin (inciso i) es claro que -cierre(C)-cierre(-cierre(C)).
Mostraremos ahora que si q-cierre(-cierre(C)) entonces q-cierre(C).
Caso base: Debemos mostrar (trabajando el inciso i) que si q-cierre(C) entonces
q-cierre(C), lo que es obvio.
Hiptesis inductiva: Si q-cierre(-cierre(C)) entonces q-cierre(C)

96
Paso inductivo: (Trabajaremos el inciso ii) Sea p-cierre(-cierre(C)), ello debe suceder
porque pd(q,) con q-cierre(-cierre(C)). Pero entonces, por hiptesis inductiva,
q-cierre(C) y como pd(q,), precisamente por el inciso ii, p-cierre(C).
Esto nos ayuda a utilizar un resultado valioso, en los -AFNs: -cierre(d(qi,w))= d(qi,w)
Ello es evidente pues si w=, tenemos que
-cierre(d(qi,)) = -cierre(-cierre({qi})) por definicin de d
= -cierre({qi}) por el resultado que se acaba de probar

= d (qi,) por definicin de d
Si w=ua, tenemos que
-cierre(d(qi,w)) = -cierre(d(qi,ua))

= -cierre(-cierre d(p,a) ) por definicin de d

p d*( q i ,u)

= -cierre d(p,a) por el resultado que se acaba de probar

p d*( q i ,u)
= d(qi,ua) = d(qi,w)
Ahora probaremos que si CQ, entonces -cierre(C)-cierre(Q), es decir, dado que CQ
mostraremos que si q-cierre(C) entonces q-cierre(Q).
Caso base: Es claro, de la definicin (inciso i), que Q-cierre(Q); como tenemos que CQ,
resulta que C-cierre(Q), es decir, que si qC entonces q-cierre(Q).
Hiptesis inductiva: Si q-cierre(C) entonces q-cierre(Q)
Paso inductivo: (Trabajaremos el inciso ii) Sea p-cierre(C), ello debe suceder porque
pd(q,) con q-cierre(C). Pero entonces, por hiptesis inductiva, q-cierre(Q) y como
pd(q,), precisamente por el inciso ii, p-cierre(Q).
Seguidamente probaremos que -cierre(C Q) = -cierre(C) -cierre(Q).
Es claro que tanto C(CQ) como Q(CQ), por el anterior resultado entonces
-cierre(C)-cierre(CQ) y -cierre(Q)-cierre(CQ), de donde
-cierre(C) -cierre(Q)-cierre(CQ).
Resta probar que-cierre(CQ) -cierre(C) -cierre(Q), es decir, que
si q-cierre(CQ) entonces q[-cierre(C) -cierre(Q)].
Caso base: Si q(CQ), entonces [qC qQ], luego (inciso i de la definicin de -cierre)
[q-cierre(C) q-cierre(Q)], es decir, q[-cierre(C) -cierre(Q)].
Hiptesis inductiva: Si q-cierre(CQ) entonces q[-cierre(C) -cierre(Q)].
Paso inductivo: (Trabajaremos el inciso ii de la definicin de -cierre).
Sea p-cierre(CQ), ello debe suceder porque pd(q,) con q-cierre(CQ). Pero
entonces, por hiptesis inductiva, q[-cierre(C) -cierre(Q)] y como pd(q,),
precisamente por el inciso ii, p[-cierre(C) -cierre(Q)].
Estbamos queriendo demostrar que en la construccin del AFN A a partir del -AFN A
T(A)=T(A) y restaba demostrar que esto es as en el caso |u|>0.

97
Ello se simplifica si evidenciamos que d(q1,u) = d(q1,u), lo que haremos por induccin
sobre |u|.
Caso base.
|u|=1, es decir, u=a
d(q1,a) = d(q1,a) por un resultado ya conocido
= d(q1,a) por la forma de construir d
Hiptesis inductiva.
El resultado se mantiene para |u|=k
Paso inductivo.
Sea |u|=k+1, podemos suponer lcitamente que u=wa con |w|=k, luego
d(q1,wa) = d'(p,a) por definicin de d

p d '*( q1 , w )

= d'(p,a) por hiptesis inductiva


p d *( q1 , w )

= d*(p,a) por la forma de construir d


p d *( q1 , w )

supongamos ahora -lcitamente- que d(q1,w)={qj1,..., qjn}


= d(qj1,a) ... d(qjn,a)


= -cierre d(p,a) ... -cierre d(p,a) por definicin de d
p d*( q , ) p d*( q , )
j1 jn


= -cierre d(p,a)
p cierre({q })
... -cierre d(p,a) por definicin de d
p cierre({q })
j1 jn
ntese que tenemos lo siguiente: -cierre(conjunto) unin -cierre(conjunto), etc.
podemos utilizar -cierre(C Q)=-cierre(C) -cierre(Q), ya demostrado (**)


= -cierre
d(p,a) ...
p cierre({q })

d(p,a)
p cierre ({q jn })
j1


= -cierre d(p,a)
p cierre({q }) ... cierre({q })
operando sobre conjuntos
j1 jn



= -cierre
d(p,a) utilizando otra vez (**)
p cierre({q } ... {q })
j1 jn

dado que d(q1,w)={qj1,..., qjn}={qj1}...{qjn}

98

= -cierre d(p,a)

p cierre( d*( q1 ,w ))

= -cierre d(p,a)

pues ya demostramos que -cierre(d(q1,w))=d(q1,w)
p d*( q1 ,w )
= d*(q1,wa) por definicin de d*
Los tres casos confirman que d (q1,u) = d(q1,u) para |u|>0.

Ahora bien, sea u T(A), es decir d(q1,u) F, pero entonces d(q1,u) F y como
F F, entonces d(q1,u) F, es decir, u T(A).
Inversamente, sea u T(A), es decir d(q1,u) F, pero entonces d(q1,u) F y
como F=F (trataremos enseguida el caso F=F {q1}) entonces d(q1,u) F, es decir,
uT(A).
Cuando F=F {q1} y la interseccin d(q1,u) F cae slo en elementos de F el argumento
es el mismo.
En el ltimo caso de anlisis supongamos que F=F {q1} y q1 F (cuando q1 F, F=F lo
que nos remite a algo ya tratado). q1 se incluye a F porque cierre({q1}) F, en este
caso hay un(os) estado(s) en cierre({q1}) y en F diferente(s) de q1, vamos a mostrar que
el(ellos) est(n) en d(q1,u), de este modo d(q1,u) F, y por lo tanto u T(A).
En efecto, sabemos que d(q1,u) F, es decir, d(q1,u) F, supongamos tambin
que la intersecin se da (tambin) en q1 (en otro caso la interseccin se da slo con elementos
de F lo cual ya fue tratado), es decir q1 d(q1,u), o sea podemos escribir lo siguiente:
d(q1,u)={q1} {elrestoded(q1,u)}. Sabemos que -cierre(d(q1,u))=d(q1,u), de ah es lcito
escribir d(q1,u)=-cierre(d(q1,u))=-cierre({q1} {elrestoded(q1,u)})
=-cierre({q1}) -cierre({elrestoded(q1,u)})
El ltimo paso se dio por un resultado ya visto. Pero -cierre({q1}) Fy q1 F, es decir
que en d(q1,u) hay elementos de F que no son q1- que es lo que queramos probar.
As T(A)=T(A).

Un modo alterno de construir el AFN A que utiliza la matriz R+ es como sigue.


A partir del -AFN A=(K, , d, q1, F) construimos el AFN A as:
A=(K, , d, q1, F)
F=F {qi / (qi,qf) R+ ; qf F}
Es decir, a los estados de F se aaden los estados correspondientes a las filas de R+ tales
que su interseccin con alguna columna f (correspondiente al estado qf F) tenga el
valor 1.
d:
d(qi,a) = d(qi,a) d(q j ,a)
( q i ,q j ) R

99
Ejemplo:
Con el mismo AFN A = ({q1,q2,q3}, b,c}, d, q1, {q1,q2,q3})
d:
d(q1,)={q2,q3}
d(q2,b)={q2}
d(q3,c)={q3}
El AFN A=({q1,q2,q3}, b,c}, d, q1, F)
0 1 1
Tenemos ya calculado R = 0 0 0 y por tanto
+

0 0 0
F={q1,q2,q3}
d:
d(q1,b) = d(q1,b) d(q j , b) = d(q1,b) d(q2,b) d(q3,b)
( q1 ,q j ) R

hemos marcado en negrita lo que viene fruto de la expresin (qi,qj) R+


= {q2} = {q2}
En idntica forma se construyen las otras reglas de transicin mismas que pasamos a
resumir:
d(q1,b) = {q2}
d(q1,c) = {q3}
d(q2,b) = {q2}
d(q3,c) = {q3}
No anotamos las reglas d(q2,c)=, d(q3,b)= porque la imagen es el conjunto vaco; en
las ltimas dos reglas (d(q2,b) y d(q3,c)) la parte de la unin en la construccin de d se
hace vaca pues las filas correspondientes a q2 y q3 en R+ son de ceros.
Es interesante remarcar que ambas formas de proceder (matricial y con el cierre) no
siempre construyen el mismo AFN A como puede comprobarse con el siguiente AFN A:

sin embargo ambos mtodos devuelven AFNs equivalentes al AFN de partida.


Hay una equivalencia entre AFNs y -AFNs (y por tanto tambin entre AFDs), lo que
muestra de manera an ms sorprendente que los -AFNs no son ms poderosos que los
AFNs ni que los AFDs.

Construccin de un autmata a partir de una e.r. (el Teorema de Kleene parte I)


Por estar fuera del alcance de este trabajo prescindiremos de las demostraciones en algunas
partes, como en la que sigue, y nos centraremos en la descripcin del proceso de obtencin
del autmata.

100
Podemos construir un AFN A (denominado autmata de posicin, autmata Glushkov o
autmata de McNaughton-Yamada debido a sus descubridores) a partir de una e.r. asignando
posiciones a los smbolos de dicha expresin regular. Por ejemplo sea r=a(ba) una e.r.,
designaremos las posiciones con subndices de izquierda a derecha as: r=a1(b2a3)
El conjunto de smbolos subindizados denominado conjunto de posiciones- de una e.r. r,
donde los subndices indican la posicin que ocupa el smbolo en la e.r. leda de izquierda a
derecha, lo denominaremos pos(r), en nuestro ejemplo pos(r)={a1,b2,a3}. Al construir pos(r)
no colocaremos subndices a ni a , si estn presentes en r.
Cuando una e.r. no es elemental (r=ts r=t+s) denotaremos con
posr(t) al subconjunto de posiciones de t que son posiciones de r; y con
posr(s) al subconjunto de posiciones de s que son posiciones de r.
Por supuesto esta idea es recurrente si a su vez t o s son e.r. no elementales, en nuestro
ejemplo r=ts con t=a1 y s=(b2a3), de este modo posr(s)={b2,a3}; a su vez s=(b2a3) es otra vez
de la forma no elemental pues s=ts con s=a3, cuyo conjunto de posiciones es {a3}, etc.
La idea ahora es asignar a cada smbolo subindizado un estado del autmata y dirigir un arco
de un estado a otro segn el smbolo denotado en el estado de llegada siga o no al smbolo
denotado en el estado de partida en las cadenas en L(r). Los ndices cuentan y sirven para este
propsito, en el ejemplo que tenemos una a1 nunca seguir a una b2 pero si una a3, ntese
cmo los ndices hacen cambiar el significado de estas frases pues sin ndices es claro que una
a sigue a una b en la(s) cadena(s) de L(r).
La construccin del AFN exige construir los siguientes conjuntos para la e.r r lo cual,
insistimos, requiere de la vital subindizacin de las posiciones-:
primer(r)={todos los primeros smbolos de cadenas en L(r)}
Para nuestro ejemplo primer(r)={a1}
ltimo(r)={todos los ltimos smbolos de cadenas en L(r)}
Para nuestro ejemplo ltimo(r)={a3}
siguiente(r,ci)={todos los smbolos que siguen al smbolo ci en cadenas en L(r)}
Para nuestro ejemplo siguiente(r,a1)={b2}; siguiente(r,b2)={a3}; siguiente(r,a3)={}
Es claro que si la e.r. es ms compleja los conjuntos a construirse requieren de ms
herramientas que la simple inspeccin, por ejemplo en r=a*b*a*, es decir, en r=a1*b2*a3*
no es muy inmediato ver que b2 pertenece a ltimo(r).
Las siguientes definiciones recurrentes que son bastante intuitivas- permiten hallar estos
conjuntos mecnicamente, en ellas ci es un smbolo subindizado de la e.r.

r=: primer() = {}
r=: primer() = {}
r=a: primer(a) = {a}
r=t+s: primer(t+s) = primer(t) primer(s)
r=t*: primer(t*) = primer(t)
r=ts: primer(ts) = primer(t) primer(s) si L(t)
= primer(t) si L(t)

101
r=: ltimo() = {}
r=: ltimo () = {}
r=a: ltimo(a) = {a}
r=t+s: ltimo(t+s) = ltimo(t) ltimo(s)
r=t*: ltimo(t*) = ltimo(t)
r=ts: ltimo(ts) = ltimo(t) ltimo(s) si L(s)
= ltimo(s) si L(s)

r=: siguiente(,ci) = {}
r=: siguiente(,ci) = {}
r=a: siguiente(a,ci) = {}
r=t+s: siguiente(t+s,ci) = siguiente(t,ci) si ci posr(t)
= siguiente(s,ci) si ci posr(s)
r=t*: siguiente(t*,ci) = siguiente(t,ci) si ci posr(t)-ltimo(t)
= siguiente(t,ci) primer(t) si ci ltimo(t)
r=ts: siguiente(ts,ci) = siguiente(t,ci) si ci posr(t)-ltimo(t)
= siguiente(t,ci) primer(s) si ci ltimo(t)
= siguiente(s,ci) si ci posr(s)

Cuando la e.r. r no es elemental los conjuntos primer(t), primer(s), ltimo(t) y ltimo(s)


toman sus subndices tomando como referencia los subndices de r (una notacin que
reflejara esto sera por ejemplo primerr(t) o ltimor(s), nosotros preferimos usar la notacin
original), es claro que la idea se aplica recurrentemente si t o s a su vez no son elementales.
Es fcil determinar si L(r) o no con una ligera modificacin de la funcin ya vista en las
derivadas de e.r. que puede calcularse as donde V significa verdadero y F falso-:
() = F
() = V
(a) = F
(t+s) = (t) (s)
(t*) = V
(ts) = (t) (s)
Finalmente introduciremos la funcin que transforma un smbolo subindizado en un smbolo
sin subndice, por ejemplo [a3]=a.

Una vez que para la e.r. r se tienen los conjuntos pos(r), primer(r), ltimo(r) y siguiente(r,ci)
para cada ci que aparece en r se construye el AFN A as:
A=( pos(r) {q0}, , d, q0, F)
={ a / ci pos(r) y [ci]=a } o bien es el alfabeto sobre el cual se construy r
F = ltimo(r) {q0} si L(r)
ltimo(r) si L(r)

102
d:
d(q0,a)={ cj / cj primer(r) y [cj]=a }
d(ci,a)={ cj / cj siguiente(r,ci) y [cj]=a }

Una cualidad de esta construccin es que el autmata obtenido no tiene -transiciones.

Ejemplo:
Sea r=(ab+ac)d*
Construimos as el AFN A tal que T(A)=L(r)
r=(a1b2+a3c4)d5*
pos(r)={a1,b2,a3,c4,d5}
Ahora construimos los tres conjuntos detallando slo algunas de las partes de la construccin,
en todo caso simplemente aplicaremos lo descrito antes.

Como r=ts con t=(a1b2+a3c4) y s=d5*


Y como aplicando la funcin modificada -
(t)=(a1b2+a3c4)=(a1b2) (a3c4)=[(a1) (b2)] [(a3) (c4)]=[F F] [F F]=F
Es decir, como L(t), aplicando la definicin recurrente tenemos que
primer(r)=primer(t)=primer(a1b2+a3c4)
=primer(a1b2) primer(a3c4)
=primer(a1) primer(a3c4) pues L(a1)
=primer(a1) primer(a3) pues L(a3)
={a1} {a3}={a1,a3}

Como r=ts con t=(a1b2+a3c4) y s=d5*


Y como (s)=(d5*)=V, es decir, como L(s)
ltimo(r)=ltimo(t) ltimo(s)=ltimo(a1b2+a3c4) ltimo(d5*)
=[ltimo(a1b2) ltimo(a3c4)] [ltimo(d5)]
=[ltimo(b2) ltimo(a3c4)] [ltimo(d5)] pues L(b2)
=[ltimo(b2) ltimo(c4)] [ltimo(d5)] pues L(c4)
=[{b2} {c4}] {d5}={b2,c4,d5}

Como r=ts con t=(a1b2+a3c4) y s=d5*


Y como
pos(t)={a1,b2,a3,c4}
ltimo(t)=ltimo(a1b2) ltimo(a3c4)
=ltimo(b2) ltimo(a3c4) pues L(b2)
=ltimo(b2) ltimo(c4) pues L(c4)
={b2} {c4}={b2,c4}
Es claro pues que a1 pos(t)-ltimo(t), luego

103
siguiente(r,a1)=siguiente(t,a1)=siguiente(a1b2+a3c4,a1)
=siguiente(a1b2,a1) pues a1 pos(a1b2)
=siguiente(a1,a1) primer(b2) pues a1 ltimo(a1)={a1}
={} {b2}={b2}

Como r=ts con t=(a1b2+a3c4) y s=d5*


Y como d5 pos(s)={d5}
siguiente(r,d5)=siguiente(s,d5)=siguiente(d5*,d5)
=siguiente(d5,d5) primer(d5) pues d5 ltimo(d5)={d5}
={} primer(d5)
={} {d5}={d5}
Todos los otros conjuntos se construyen de manera similar y aqu estn reunidos en una lista:
r=(ab+ac)d*
pos(r)={a1,b2,a3,c4,d5}
primer(r)={a1,a3}
ltimo(r)={b2,c4,d5}
siguiente(r,a1)={b2}
siguiente(r,b2)={d5}
siguiente(r,a3)={c4}
siguiente(r,c4)={d5}
siguiente(r,d5)={d5}
Ahora construimos el autmata dos de cuyas reglas detallamos a continuacin:
d(b2,b)={ cj / cj siguiente(r,b2) y [cj]=b }
={ cj / cj {d5} y [cj]=b }
={} pues [d5]=d y obviamente db
Recordemos que las reglas con imagen {} no se anotan.
d(b2,d)={ cj / cj siguiente(r,b2) y [cj]=d }
={ cj / cj {d5} y [cj]=d }
={d5} pues d5 {d5}, [d5]=d y obviamente d=d
El resto est aqu integrado:
A=( {q0,a1,b2,a3,c4,d5}, {a,b,c,d}, d, q0, {b2,c4,d5} )
d:
d(q0,a)={a1,a3}
d(a1,b)={b2}
d(b2,d)={d5}
d(a3,c)={c4}
d(c4,d)={d5}
d(d5,d)={d5}

Otra idea muy popular debida a Thompson construye -AFNs con la propiedad de tener un
nico estado final del que no salen arcos y un estado inicial al que no llegan arcos.

104
A la e.r. a le corresponde el siguiente -AFN:

A la e.r. le corresponde el siguiente -AFN:

A la e.r. le corresponde el siguiente -AFN:

Toda e.r. es una combinacin de estas e.r. bsicas, utilizando los operadores +, . y *.
En la tabla siguiente At denota el -AFN para la e.r. t, As denota el -AFN para la e.r. s, se
supone que ya se tienen construidos ambos -AFNs y por ello se los grafica dentro de un
recuadro, a la e.r. de la izquierda le corresponde el -AFN de la derecha
r=ts:
El estado final de At es solapado por el
estado inicial de As.

r=t+s:
La lnea punteada indica un estado que
era final en el autmata original
(At o As) pero que ya no lo es en la
construccin que se plantea.

r=t*:
La lnea punteada indica el estado final
del autmata At pero que ya no lo es en
la construccin que se plantea.

105
Ejemplo:
Sea r=(ab+ac)d*
Construimos as el -AFN A tal que T(A)=L(r), es claro que los subndices de los estados
deben adecuarse a la construccin, as lo haremos renombrando si es necesario.
Para la e.r. a (de manera semejante para b, c y d) el -AFN es:

Para la e.r. ab (de manera semejante para ac) el -AFN es:

Para la e.r. ab+ac el -AFN es:

Para la e.r. d* el -AFN es:

Finalmente el -AFN para r=(ab+ac)d* es:

Otra alternativa es utilizar lo que se denomina grafo de transicin generalizado.


Un grafo de transicin generalizado gtg es semejante a un diagrama de transicin con la nica
y notable diferencia que admite que sus arcos sean etiquetados con e.r.
Si admitimos por un lado que un diagrama de transicin de un autmata puede verse como un
gtg simplemente considerando las etiquetas de los arcos como e.r.; y por otro lado si dado un
gtg sustituimos cada e.r. de sus arcos por autmatas utilizando el modo de Thompson,
entonces admitiremos que los gtgs y los autmatas son equivalentes en relacin a los
lenguajes que aceptan.
La alternativa que estamos describiendo difiere del modo de Thompson en el tratamiento de
los arcos con e.r.

106
Se construye un gtg con la e.r. r as A=({q1,qf},{r},d,q1,{qf}) donde d: d(q1,r)={qf}, y a partir
de dicho gtg se van construyendo nuevos gtgs descomponiendo r en sus partes elementales
segn se indica a continuacin de manera grfica.
El punteado indica que si qi ( qj) es un estado final, este preserva dicha cualidad.
Si i=j el reemplazo es equivalente, aunque la grfica vara obviamente.
qk es un nuevo estado que se aade al gtg
Si una parte del gtg incluye la se la reemplaza por
transicin
r=ts:

r=t+s:

r=t*:

Ejemplo:
Sea r=(ab+ac)d*
Construimos as el -AFN A tal que T(A)=L(r)
El gtg inicial es:

Es claro que t=ab+ac y s=d*


Luego aplicamos el reemplazo correspondiente aadiendo un nuevo estado q2, resultando:

En el arco de q1 a q2 la e.r. se descompone en t=ab y s=ac, resultando:

107
Las e.r. ab y ac se tratan de manera semejante a lo que hicimos inicialmente, lo interesante es
observar cmo funciona el reemplazo para d*, todo ello resulta en:

Cuando i=j el tratamiento es el mismo como muestra el siguiente ejemplo del cual no
mostramos todos los detalles.
Sea r=(a*+b)*
Luego de trabajar la * ms externa tenemos:

Ahora trabajamos el reemplazo para +, resultando:

Finalmente la ltima * nos devuelve el siguiente resultado final:

Otra alternativa debida a Brzozowski es utilizar las derivadas de la e.r. r para construir el
AFD. Esta idea procede de dos maneras, una manera obtiene un AFD con el menor nmero
posible de estados y la otra un AFD cualquiera posiblemente con muchos estados, explicamos
ambas a continuacin.

108
Sea r una e.r. construida sobre , construimos el AFD A con el menor nmero posible de
estados tal que T(A)=L(r) as:
A=(K, , , r, F)
K={Dw(r) / w*} recuerde que este conjunto es finito, note que los estados son e.r.
F={ Dw(r) / L(Dw(r))}
: ( Dw(r),a) = Dwa(r)
Una forma ms grfica de ver esta construccin es como sigue.
Construimos un rbol de e.r. con r como nodo raz.
Se deriva el rbol por niveles -desde el nodo raz- respecto a cada smbolo de , cada una de
estas derivadas es un nuevo nodo y el arco que enlaza una e.r. y su derivada se etiqueta con el
smbolo utilizado para la derivacin:
- la derivada se compara con todas las e.r. de los nodos existentes hasta el momento y si es
equivalente a alguna e.r. previa entonces el nombre del nodo resultante la derivada- se
reemplaza por dicha e.r. previa.
- si es equivalente a el nombre del nodo resultante es precisamente .
Se cierra una rama del rbol si el nombre del nodo es idntico a algn otro nodo ya existente
en el rbol o si es .
Cuando todas las ramas del rbol estn cerradas (lo que se garantiza por la finitud de las
derivadas de una e.r.), se construye el AFD as:
Los estados son los nombres de los nodos del rbol. De acuerdo a lo descrito puede haber ms
de un nodo con el mismo nombre a los que les corresponde un nico estado.
Son estados finales los nodos cuyo lenguaje asociado a su e.r. incluya la cadena vaca.
De cada nodo padre a un nodo hijo hay una regla de transicin con el smbolo que etiqueta el
arco que los une. Si el rbol incluye un nodo con nombre , este estado es el equivalente al
estado muerto o trampa y de ah hay reglas a s mismo con todos los smbolos de .

Ejemplo:
Sea r=(ab+ac)d*
Construimos as el AFD A tal que T(A)=L(r)
Primero construimos el rbol de derivadas a partir de nodo raz con etiqueta (ab+ac)d*.
Derivamos esta e.r. respecto de a, b, c y d. Cada resultado es un nuevo nodo.

109
Es vital comparar cada nuevo nodo con los existentes previamente para ver si son e.r.
equivalentes y hacer lo que indica el procedimiento.
Note por ejemplo que con la e.r. (b+c)d* la derivada respecto de b -Db[(b+c)d*]- es d* que es
inexistente en el segundo nivel y que obviamente no es equivalente a Da[(b+c)d*]=. En
cambio Dc[(b+c)d*] es tambin d* y por lo tanto esta rama se cierra pues esta e.r. ya existe.
Hemos representado con una x pequea el hecho de que una rama se cierre.
A=(K,,,r=q1,F)
K={(ab+ac)d*, (b+c)d*, d*, } que pueden renombrarse como K={q1,q2,q3,qm }
={a,b,c,d}
Es claro que d* pero no a las otras e.r. de K, es decir F={q3}
:
(q1,a)=q2 (q1,b)=qm (q1,c)=qm (q1,d)=qm
(q2,a)=qm (q2,b)=q3 (q2,c)=q3 (q2,d)=qm
(q3,a)=qm (q3,b)=qm (q3,c)=qm (q3,d)=q3
(qm,a)=qm (qm,b)=qm (qm,c)=qm (qm,d)=qm

Uno de los obstculos de esta alternativa es tener que averiguar la equivalencia entre e.r. que
puede no ser un trabajo elemental ni rpido; por ejemplo si el nodo raz fuese r=(a*+ba*+b*)*
y derivamos r respecto de a y b se tiene:
Da(a*+ba*+b*)*=a*(a*+ba*+b*)* que es equivalente a r!
Db(a*+ba*+b*)*=(a*+b*)(a*+ba*+b*)* que es equivalente a r!
Por lo tanto los nombres de los nodos de las derivadas se reemplazan por la e.r. previa
existente en el rbol que no es otra que r. As el rbol para esta e.r. -que no contiene a - es:

Es claro que F=K={q1}; ={a,b} y que (q1,a)=(q1,b)=q1


La equivalencia de e.r. es en realidad otro problema complejo dentro de los lenguajes
regulares y que ha merecido especial atencin para disear un procedimiento que sea eficiente
computacionalmente en tiempo y espacio.

Una variante de esta forma de proceder requiere la definicin siguiente:


Dos e.r. se dicen similares si una puede transformarse en la otra utilizando solamente las
equivalencias r+rr, r+ss+r, (r+s)+tr+(s+t), rrr, rr y r++rr.
Brzozowski plantea un procedimiento muy semejante al anterior con la diferencia que ahora
se compara la derivada el nombre del nodo- no para ver si es equivalente sino simplemente si

110
es similar a alguno de los nodos existentes hasta el momento en el rbol (el conjunto de
derivadas similares de una e.r. es tambin finito); el resto del procedimiento es exactamente
igual. El AFD resultante aqu no es necesariamente uno con el menor nmero posible de
estados.

Ejemplo:
Para el caso r=(a*+ba*+b*)* el rbol de derivadas considerando solamente similaridad es el
que se muestra enseguida; todas las ramas estn cerradas aunque no hemos colocado las x- y
el autmata correspondiente con cuatro estados se construye como indica el procedimiento
descrito.

Hay otras alternativas que simplemente mencionamos como las derivadas parciales de e.r.
propuesta de Antimirov que devuelve un AFN o el llamado Follow Automaton.

Construccin de una e.r. a partir de un autmata A (el Teorema de Kleene parte II)
Sea A un AFD entonces puede denotarse T(A) en trminos de e.r.
Demostracin:
Sea A=(K, , , q1, F) con K={q1,...,qn}
Definiremos las siguientes expresiones regulares:
ri,jn es una e.r. que denota al siguiente conjunto de cadenas:
L(ri,jn ) = { u / (qi,u)=qj
y
el AFD no pasa por ningn estado qm con m > n al consumir u
excepto posiblemente el primer estado y el ltimo estado }
Es decir, ri,jn denota todas las cadenas u que me llevan de qi a qj pero que son tales que al ir
de qi a qj no pisamos, no atravesamos, no pasamos por ningn estado qm cuyo subndice m
sea mayor que n. Esta restriccin de que m no sea mayor que n no incluye al estado de partida
ni al estado de llegada.

111
Otra forma equivalente de indicar el conjunto de cadenas que denota esta expresin regular es
as:
L(ri,jn ) = { es el conjunto de cadenas u=a1a2...apap+1 tales que
(qi,a1)=qj1
(qj1,a2)=qj2
...
(qjp-1,ap)=qjp
(qjp,ap+1)=qj
donde j1,j2,...,jp n }
Fjese que la restriccin j1,j2,...,jp n no afecta al estado de partida qi ni al de llegada qj
Cada L(ri,jn) puede obtenerse de lenguajes -conjuntos de cadenas- finitos a travs de un
nmero finito de aplicaciones de las operaciones , * y . (unin, estrella de Kleene y
concatenacin ) permitidas sobre lenguajes.
La prueba del enunciado se hace por induccin sobre n:
Caso base:
Para n=0 el resultado es evidente puesto que L(ri,j0) es un conjunto finito de cadenas.
L(ri,j0) = { a / (qi,a)=qj } si i j.
L(ri,i0) = { a / (qi,a)=qi } {} si i = j
Puesto que cualquier cadena de longitud mayor a 1 atravesar por algn estado cuyo subndice
es mayor que 0 (recuerde que nuestros subndices empiezan en 1).
Es claro que estos son conjuntos finitos de cadenas.
Hiptesis inductiva:
Asumimos que el enunciado es cierto para n=k
Paso inductivo:
Para n=k+1 tenemos esta ingeniosa relacin que prueba lo deseado y que se autoexplica:
L(ri,jk+1) = L(ri,jk ) { L(ri,k+1k) . (L(rk+1,k+1k))*. L(rk+1,jk) }
Finalmente el broche de oro est cuando notamos que
T(A) =
q j F
L(r1,jn)

Slo nos resta probar que para cada L(ri,jn) existe una e.r.
Para n=0
ri,j0 = aj1 + ... + ajm si i j y (qi,ajh)=qj
ri,i0 = aj1 + ... + ajm + si i = j y (qi,ajh)=qi
Y asumiendo que para n=k el enunciado es cierto se tiene
para n=k+1
ri,jk+1 = { ri,jk } + { [ri,k+1k] . (rk+1,k+1k)*. [rk+1,jk] }
donde hemos usado llaves, parntesis y corchetes slo con fines de claridad.
La e.r s para T(A)=L(s) sera as: s = r1,j1n + ... + r1,jhn para todo qji F
La anterior prueba no es otra cosa que un instrumento para hallar T(A) de manera mecnica,
en trminos de expresiones regulares, sin embargo se advierte que la e.r. resultante puede ser
muy larga y se recomienda su simplificacin haciendo uso de las equivalencias ya conocidas.

112
Ejemplo:
Sea el AFD A=({q1,q2}, {a,b}, , q1, {q1})
:
(q1,a)=q1
(q1,b)=q2
(q2,a)=q1
(q2,b)=q2
T(A)=L(s) donde la e.r. s = r1,12
Cuando se pueda es mejor simplificar las e.r. resultantes a travs de las equivalencias
conocidas.
r1,10 = a+
r1,11 = r1,10 + [r1,10].(r1,10)*.[r1,10]
= a+ + [a+](a+)*[a+] = a+{(a+)*[ a+]} = (a+)(a+)* = (a+)* = a*
0
r1,2 = b
r1,21 = r1,20 + [r1,10].(r1,10)*.[r1,20]
= b + [a+](a+)*[b] = {[a+](a+)*}b = {(a+)*}b = a*b
0
r2,1 = a
r2,11 = r2,10 + [r2,10].(r1,10)*.[r1,10]
= a + [a](a+)*[a+] = a{(a+)*[ a+]} = a(a+)* = aa*
0
r2,2 = b+
r2,21 = r2,20 + [r2,10].(r1,10)*.[r1,20]
= b+ + [a](a+)*[b] = +b + a(a+)*b = + [ + a(a+)*]b = + [+aa*]b = +a*b
r1,12 = r1,11 + [r1,21].(r2,21)*.[r2,11]
= a* + [a*b](+a*b)*[aa*] = a* + [a*b](a*b)*[aa*]
= a* + [a*b](a*b)*[ a*a] = a* + a*b (a*b)*a* a = a* + a*b (a+b)* a = a*[+ b(a+b)*a]

Una alternativa interesante es construir la e.r. solucionando un sistema de ecuaciones por


medio de sustituciones y del Lema de Arden, dicho sistema se obtiene a partir del autmata
(generalmente se ha considerado un -AFN aunque como se ver puede reutilizarse la idea
para AFNs y AFDs tambin).
Conceptualmente lo que se hace es asociar a cada estado del autmata un conjunto de cadenas
que parten de dicho estado y llegan a algn estado final, ello puede hacerse apelando a los
conjuntos de cadenas de los otros estados representados por incgnitas en nuestro sistema de
ecuaciones, como se indica a continuacin.
A cada estado qi en el -AFN se asocia una incgnita xi cuya ecuacin xi ... se escribe as:
xi c xj +
qj d ( qi ,c)
si qi F

cx
qj d ( qi ,c )
j en otro caso

Es decir, en la parte derecha se aade -suma en trminos de e.r.- cxj si qj d(qi,c) con
c({}), si qi F entonces tambin se aade .

113
Una vez que tenemos para cada uno de los n estados una incgnita y su ecuacin asociada
estamos en la presencia de un sistema de n ecuaciones con n incgnitas, donde es claro que
podemos utilizar las equivalencias r+rr, r+ss+r, (r+s)+tr+(s+t), rrr, rr y
r++rr.
Ahora aplicamos recurrentemente el Lema de Arden a travs del siguiente procedimiento que
elimina una incgnita y una ecuacin a la vez y que lo aplicaremos sistemticamente desde xn
hasta x1 (es claro que este orden puede cambiarse).
Podemos considerar cada ecuacin de la forma genrica
xi ci1x1+ ... +cinxn+t (t= o t= dependiendo si qi es final o no)
Y reordenarla de manera que la incgnita est tambin al principio en la parte derecha as:
xi ciixi+ci2x2+ ... +cinxn+t
Es interesante notar que esta ecuacin puede lcitamente verse tambin as:
xi ciixi+r donde r=ci2x2+ ... +cinx+t, r no incluye a xi
Ya vimos la demostracin de Arden que xi=cii*r es solucin de esta ecuacin.
As pues podemos aplicar dicha reordenacin para cada ecuacin y donde sea posible
reemplazar las soluciones que vayamos encontrando para las incgnitas. Al final tendremos
una ecuacin con una incgnita que tambin se soluciona con el Lema de Arden obteniendo la
e.r. requerida en la solucin para x1 que representa al estado inicial q1.

Ejemplo:
Sea el AFD A=({q1,q2}, {a,b}, , q1, {q1})
:
(q1,a)=q1
(q1,b)=q2
(q2,a)=q1
(q2,b)=q2
Construimos la e.r. s tal que T(A)=L(s) as:
x1 ax1+bx2+
x2 bx2+ax1
Para x2: x2bx2+[ax1] con r=ax1, luego x2=b*ax1
Para x1: x1ax1+bx2+ haciendo el reemplazo para x2 tenemos:
x1ax1+bb*ax1+ que reordenando resulta en:
x1(a+bb*a)x1+con r=, luego x1=(a+bb*a)*

Una otra alternativa elimina estados del gtg correspondiente al -AFN haciendo que en los
arcos queden e.r. cada vez ms cercanas a T(A).
Sin prdida de generalidad exigiremos que al estado inicial no lleguen arcos y que haya un
nico estado final del que no salen arcos. Es decir, dado el -AFN A=(K, , d, q1, F)
construimos as el -AFN A=(K, , d, q0, F)
Con K = K {q0,qf}
F = {qf}

114
d:
d(q0,) = {q1}
d(qi,cj) = d(qi,cj) si qi K-F, cj {} si qi F, cj
d(qi,cj) {qf } si qi F, cj =
Lo que se hace luego es transformar el gtg correspondiente al -AFN en otro gtg que no tenga
varios arcos y etiquetas que vayan de un mismo estado de partida a un mismo estado de
llegada, por ejemplo d(qi,)={qj}, d(qi,a)={qj}, d(qi,b)={qj},..., d(qi,z)={qj}, que se ve as:


Sustituyendo esas etiquetas y/o arcos con una nica e.r. as:

Se hace una sustitucin similar cuando el arco de partida y el de llegada son el mismo.
Este nuevo gtg tiene una sola etiqueta por arco y un slo arco entre un estado de partida y un
estado de llegada.
A continuacin, bsicamente se trata de eliminar los estados uno a uno hasta que queden slo
los dos nuevos estados aadidos q0 y qf. Al eliminar estados, las etiquetas de los arcos que
queden deben simular a travs de e.r. los caminos que pasaban por el estado eliminado, ello se
hace a travs del siguiente procedimiento:
Mientras el nmero de estado del gtg resultante sea > 2:
Elegir un estado qi K-{q0,qf}
Eliminar el estado qi
Es obvio que en algn momento tendremos un gtg con dos estados (q0 y qf), la e.r. que une
ambos estados que denominaremos s es tal que L(s)=T(A).
Aqu supondremos que siempre que se pueda acudiremos a estas equivalencias conocidas:
r+rr, r+ss+r, (r+s)+tr+(s+t), rrr, rr y r++rr, es claro que pueden
utilizarse las otras equivalencias tambin.

La eliminacin del estado qi se hace as:

115
Construir el conjunto de estados desde los cuales se llega a qi (excepto el propio qi), es decir,
los estados predecesores de qi: pre(qi)={ qh / qh K-{qi } y qi d(qh,r), r es una e.r.}.
Construir el conjunto de estados hasta los cuales se llega desde qi (excepto el propio qi), es
decir, los estados sucesores de qi: suc(qi)={ qj / qj K-{qi } y qj d(qi, r), r es una e.r.}.
Eliminar qi y todos sus arcos de salida o llegada.
Para todo par (qh,qj) pre(qi) X suc(qi)], incluidos los pares tales que qh=qj, incluir la
siguiente transicin:
qj d(qh,pt*s)
donde
qi d(qh,p) p es la etiqueta del arco que va de qh a qi
qj d(qi,s) s es la etiqueta del arco que va de qi a qj
qi d(qi,t) t es la etiqueta del arco que va de qi a qi si existe, en otro caso t=
Si es necesario se transforman los gtgs resultantes en otros gtgs que no tenga varios arcos o
varias etiquetas que vayan de un mismo estado de partida a un mismo estado de llegada como
se indic atrs.

Ejemplo:
Sea el siguiente -AFN A=({q1,q2}, {a,b}, d, q1, {q1})
d:
d(q1,a)={q1}
d(q1,b)={q2}
d(q2,a)={q1}
d(q2,b)={q2}
El nuevo -AFN es A=({q0,q1,q2,qf}, {a,b}, d, q0, {qf}):
d:
d(q0,)={q1}
d(q1,a)={q1}
d(q1,b)={q2}
d(q2,a)={q1}
d(q2,b)={q2}
d(q1,)={qf}
El gtg es bsicamente el mismo salvo que las etiquetas de los arcos sern consideradas e.r.
Eliminamos el estado q1:
pre(q1)={q0,q2}
suc(q1)={q2,qf}
pre(q1) X suc(q1)={(q0,q2),(q0,qf),(q2,q2),(q2,qf)}
Para el par (q0,q2): q2 d(q0,a*b)
Para el par (q0,qf): qf d(q0,a*)
Para el par (q2,q2): q2 d(q2,aa*b)
Para el par (q2,qf): qf d(q2,aa*)

Luego de la integracin de varias etiquetas el resultante gtg tiene los estados {q0,q2,qf} con

116
d:
d(q0,a*b)={q2}
d(q0,a*)={qf}
d(q2,aa*b+b)={q2}
d(q2,aa*)={qf}
Eliminamos el estado q2:
pre(q2)={q0}
suc(q2)={qf}
pre(q2) X suc(q2)={(q0,qf)}
Para el par (q0,qf): qf d(q0,a*b[aa*b+b]*aa*)
Luego de la integracin de varias etiquetas el resultante gtg tiene los estados {q0,qf} con
d:
d(q0,a*b[aa*b+b]*aa*+a*)={qf}
Que tiene slo los dos estados aadidos, de donde la e.r. buscada es s=a*b[aa*b+b]*aa*+a*

Construccin de un AFD accesible a partir de un AFD cualquiera


Un AFD A=(K,,,q1,F) se dice accesible si qiK u (q1,u)=qi
Sea A=(K,,,q1,F), construimos as el AFD accesible A=(K,,,q1,F)
K={ qj K / u (q1,u)=qj }
F=F K
: (qj,a) = (qj,a) qjK
La construccin del conjunto de estados K a los que se puede accesar desde q1 la hacemos as:
B0 = {q1}
Bi+1 = Bi { (qj,a) / qj Bi , a }
Si Bi=Bi+1 entonces alcanzablesdesdeq1=Bi
K=alcanzablesdesdeq1
Es evidente que T(A)=T(A) pues el autmata resultante es esencialmente el mismo, slo le
quitamos los estados inaccesibles mismos que no intervienen en el lenguaje aceptado.

Ejemplo:
Sea A=({q1,q2,q3,q4},{a},,q1,{q2,q3})
: (q1,a)=q2 (q2,a)=(q3,a)=(q4,a)=q1
Construimos as el AFD accesible A=(K,{a},,q1,F):
B0={q1}
B1={q1} {q2} pues q1B0 y (q1,a)=q2
B2={q1,q2}
Como B1=B2, entonces K=alcanzablesdesdeq1=B1={q1,q2}
F={q2,q3} {q1,q2}={q2}
: (q1,a)=q2 (q2,a)=q1

117
Construccin de un AFD con el menor nmero posible de estados a partir de un AFD
cualquiera (minimizacin de AFDs)
Lo primero que debemos hacer es i) mostrar que para cualquier lenguaje regular existe un
AFD mnimo, es decir, un AFD con el menor nmero posible de estados; ii) averiguar si este
es nico; y iii) indicar una manera algortmica de obtenerlo.
Para ello debemos recordar el teorema de Myhill-Nerode puesto que se utiliza.
i) Sea L un lenguaje regular, entonces existe un AFD A tal que L=T(A) y A tiene el menor
nmero de estados posible (A es mnimo).
Demostracin:
Es claro que si L es regular debe haber un AFD A cualquiera que lo acepte.
Sin embargo recurdese que el teorema de Myhill-Nerode dice que, si L es regular entonces la
relacin RL es de ndice finito, y si ello es as entonces la tercera parte del teorema muestra
cmo construir una AFD A tal que T(A)=L a partir de RL.
El AFD A=(K,,,q1,F), construido como se indica en dicho teorema con |K|=n el ndice de
RL es n-, tiene el menor nmero de estados posible.
En efecto, sea A=(K,,,p1,F) cualquier otro AFD tal que T(A)=L con |K|=m,
mostraremos que mn.
Recordemos que en K cada estado es una clase de equivalencia de RL y que hay un nmero
finito n de clases de equivalencia.
Tambin sabemos que dentro de cada clase los elementos estn relacionados entre si, es decir,
si las cadenas x,y pertenecen a una clase es porque xRy, es decir, wxwLywL,
otra manera de decir ello es que w ambas cadenas xw,yw estn en L o ambas no lo
estn, en este caso se dice que las cadenas x,y son indistinguibles.
Por el contrario si la cadena u est en una clase, y la cadena v est en otra clase entonces las
cadenas u,v se dice que son distinguibles, es decir, w tal que de las dos cadenas uw,vw
slo una de ellas est en L, es decir, w [(uwL vwL) (uwL vwL)], ello es
obvio puesto que si w uwLvwL las dos cadena u,v estaran relacionadas y en la
misma clase.
A partir de K podemos formar el siguiente conjunto:
S = {x1,...,xn} donde cada xi es un representante de la clase [xi]RL, es decir, tomamos un
elemento cualquiera de cada una de las n clases de K para formar S.
Es evidente que los n elementos de S son distinguibles entre s.
Mostraremos que cualquier AFD que acepte L en particular A- debe tener por lo menos n
estados, es decir, mn:
Sean xi,xj (ij) dos elementos cualesquiera de S, mismos que son como dijimos- distinguibles
entre s, es decir w tal que slo una de las cadenas xiw,xjw est en L, como T(A)=L se
tiene que la cadena w es tal que slo una de las cadenas xiw,xjw llega a un estado final de A
[((p1,xiw)F (p1,xjw)F) ((p1,xiw)F (p1,xjw)F)], es decir,
(p1,xiw)(p1,xjw), una de las cadenas xiw,xjw llega partiendo de p1- a un estado que es
final y la otra cadena llega a un estado que no es final y por lo tanto diferente.
Sabemos tambin que (p1,xiw)=((p1,xi),w) y que (p1,xjw)=((p1,xj),w)

118
De donde tenemos que ((p1,xi),w)((p1,xj),w).
Permtasenos hacer (p1,xi)=ph y (p1,xj)=pg, luego, (ph,w)(pg,w).
Es evidente que si ph=pg entonces (ph,w)=(pg,w), la contrarrecproca nos dice que
Si (ph,w)(pg,w) entonces phpg.
Es decir, que para cualesquier par de cadenas xi,xj (ij) de S se tiene que (p1,xi)(p1,xj),
es decir, el AFD A llega a estados diferentes con dos cualesquier elementos de S; como S
tiene n elementos entonces el AFD A llegar a n estados diferentes, ello slo puede suceder si
el AFD A tiene por lo menos n estados, es decir, mn.
ii) Existir otro AFD con n estados que acepte L pero que sea diferente de A? La respuesta es
negativa: el AFD mnimo A es nico salvo isomorfismos, es decir, salvo que los estados se
renombren.
Demostracin:
Sea A=(K,,,[]RL,F) el AFD mnimo que se construye en la tercera parte del teorema de
Nerode, y sea A=(K,,,p1,F) otro AFD, tales que T(A)=T(A)=L y |K|=|K|=n.
Para mostrar que A es isomorfo a A, es decir, que los estados de A son simplemente un
renombramiento de los de A, identificaremos cada estado de K con algn estado de K, tal
identificacin supone que el estado de A y el correspondiente estado identificado de A se
comportan igual:
Recordemos que el estado inicial de A es []RL y que K={[x]RL / x}
Sea piK, es obvio que A es accesible, luego u (p1,u)=pi.
Con la misma cadena u en el AFD A llegamos a ([]RL,u)=[u]RL.
Identificaremos a pi con [u]RL.
Supongamos que hay otra cadena v tal que (p1,v)=pi, es claro que en la relacin RA
definida en la primera parte del teorema de Myhill-Nerode uRAv pues (p1,u)=(p1,v), de
acuerdo a la segunda parte del mencionado teorema tambin uRLv, es decir, las cadenas u,v
estn en la misma clase de equivalencia en RL; de este hecho y dado que ([]RL,u)=[u]RL y
([]RL,v)=[v]RL, se deduce que la clase de equivalencia de u es la misma que la clase de
equivalencia de v, es decir, ([]RL,u)=([]RL,v).
As pues, con cualquier cadena que llegue a pi en el AFD Apartiendo de su estado inicial-,
tambin el AFD A llegar partiendo de su estado inicial- a [u]RL, es decir, la identificacin de
pi con [u]RL es buena pues ambos estados son bsicamente el mismo estado slo que con
diferente nombre en uno y otro autmata pues su comportamiento es idntico: en efecto,
supongamos que los estados pi y pj de A se identifican con los estados [u]RL y [w]RL de A,
ya vimos que cualquier cadena que partiendo del estado inicial de A llegue a pi, llegar
tambin sistemticamente partiendo del estado inicial de A- a [u]RL; en A cualquier cadena z
que pase por pi y de ah llegue a pj, se puede subdividir en dos subcadenas z=xy, con la
subcadena x se llega a pi y con la subcadena y se llega de pi a pj ntese como pi interviene en
esta transicin-, anlogamente ocurrir en A, con la cadena z llegaremos a [w]RL,
primeramente con x llegaremos a [u]RL y, de ah, llegaremos a [w]RL ntese cmo la
intervencin de [u]RL es la misma que de pi-.

119
Finalmente resta argumentar que la identificacin de los estados de A se hace con estados
diferentes, uno a uno, de A; si no fuera as A tendra estados dems y, por lo tanto, no sera
mnimo lo cual era un supuesto de partida.
iii) Se sabe que dado un lenguaje regular tenemos un AFD A tal que T(A)=L. El problema es
ahora, dado L y/o dado A, cmo construir el AFD mnimo.
Es obvio que dado el AFD A podemos hallar primero L(=T(A)) -o bien tenemos L
directamente-, a partir de ste podemos hallar la relacin RL y apelar a la tercera parte del
teorema de Myhill-Nerode para construir el AFD mnimo A.

Ejemplo:
Sea el lenguaje regular L={ u{a,b} / Na(u)=2i Nb(u)=2j; i,j0 }
Las cadenas de L son aquellas que tienen un nmero par tanto de as como de bs.
Construyamos la particin de inducida por la relacin RL, recordando que dos cadenas x,y
estn en una misma clase si y slo s w{a,b} xw,yw estn ambas en L o no lo estn.
Cadenas que tienen un nmero impar de as y par de bs:
[a]RL={ u{a,b} / Na(u)=2i+1 Nb(u)=2j; i,j0 }
Cadenas que tienen un nmero par de as e impar de bs:
[b]RL={ u{a,b} / Na(u)=2i Nb(u)=2j+1; i,j0 }
Cadenas que tienen un nmero impar de as e impar de bs:
[ab]RL={ u{a,b} / Na(u)=2i+1 Nb(u)=2j+1; i,j0 }
Cadenas que tienen un nmero par de as y bs:
[]RL={ u{a,b} / Na(u)=2i Nb(u)=2j; i,j0 }
La tercera parte del teorema de Myhil-Nerode nos dice que:
A=(K,{a,b},,q1,F)
K={[]RL, [a]RL , [b]RL, [ab]RL}={q1,q2,q3,q4}
F={[]RL}={q1}
:
([]RL,a)=[a]RL, es decir,(q1,a)=q2
([]RL,b)=[b]RL, es decir,(q1,b)=q3
([a]RL,a)=[aa]RL, es decir,(q2,a)=q1 ntese que [aa]RL=[]RL
([a]RL,b)=[ab]RL, es decir,(q2,b)=q4
([b]RL,a)=[ba]RL, es decir,(q3,a)=q4 ntese que [ba]RL=[ab]RL
([b]RL,b)=[bb]RL, es decir,(q3,b)=q1 ntese que [bb]RL=[]RL
([ab]RL,a)=[aba]RL, es decir,(q4,a)=q3 ntese que [aba]RL=[b]RL
([ab]RL,b)=[abb]RL, es decir,(q4,b)=q2 ntese que [abb]RL =[a]RL

Sin embargo, en esta construccin la identificacin de las clases puede ser rida y nos interesa
particularmente otra idea, la de construir al AFD A a partir del AFD A -L=T(A)- sin hallar
RL.
Sea el AFD accesible A=(K,,,p1,F) tal que T(A)=L, ya dijimos cmo construir un AFD
accesible a partir de uno que no lo es.

120
Sobre K definiremos la relacin E as:
piEpj si y slo si w (pi,w)F(pj,w)F
Que evidentemente es de equivalencia y se denominada relacin de equivalencia entre
estados.
Construiremos as el AFD A=(K, , , [p1]E, F) a partir de A:
K={[pi]E / piK}, la particin en clases de equivalencia de K inducida por la relacin E
[p1]E el estado inicial de A es la clase de equivalencia que contiene al estado inicial p1 de A
F={[pi]E / piF}
: ([pi]E,a)=[(pi,a)]E
Luego mostraremos que T(A)=L y que es el AFD mnimo.
Lo que debemos mostrar ahora es cmo construir K:
Para ello definiremos la relacin de m-equivalencia Em as:
piEmpj si y slo si w |w|m (pi,w)F(pj,w)F
Mostraremos ahora resultados que nos permitirn construir fcilmente la particin de K.
1) piEm+1pj => piEmpj
Demostracin:
Que piEm+1pj significa que w |w|m+1 (pi,w)F(pj,w)F, si esto es cierto
para |w|m+1, obviamente tambin es cierto para |w|m, es decir,
w |w|m (pi,w)F(pj,w)F, es decir, piEmpj
2) piEm+1pj piEmpj a (pi,a)Em(pj,a)
Demostracin:
=>) Es claro por 1- que piEm+1pj => piEmpj
Si mostramos que piEm+1pj => a (pi,a)Em(pj,a), de ambas implicaciones sigue
que piEm+1pj => piEmpj a (pi,a)Em(pj,a).
Si piEm+1pj, entonces w |w|m+1 (pi,w)F(pj,w)F, si ello es cierto para
|w|m+1, en particular es cierto para 0<|w|m+1, es decir,
w 0<|w|m+1 (pi,w)F(pj,w)F, aprovechando las propiedades de la
concatenacin ello puede reescribirse as, con w=au:
a u |u|m (pi,au)F(pj,au)F, que por propiedades de puede
reescribirse as: a u |u|m ((pi,a),u)F((pj,a),u)F, que es lo
mismo que a u |u|m ((pi,a),u)F((pj,a),u)F, es decir,
a(pi,a)Em(pj,a); as pues piEm+1pj => a (pi,a)Em(pj,a)
<=) Si piEmpj a (pi,a)Em(pj,a), ello significa que
w |w|m (pi,w)F(pj,w)F, y que
a w |w|m ((pi,a),w)F((pj,a),w)F, esto ltimo es lo mismo que
a w |w|m ((pi,a),w)F((pj,a),w)F, que es lo mismo que
a w |w|m (pi,aw)F(pj,aw)F, que por concatenacin de cadenas con
u=aw, es lo mismo que u 0<|u|m+1 (pi,u)F(pj,u)F, como el caso de la
cadena vacia est cubierto por el hecho de que piEmpj, resulta que piEm+1pj.

121
3) Denominaremos Pm a la particin en clases de equivalencia de K inducida por Em.
Si Pm=Pm+1 entonces i0 Pm=Pm+i
Demostracin:
Por induccin sobre i. Es obvio que el enunciado es cierto para i=0 (y para i=1); supongamos
que es cierto para i=k, mostraremos que es cierto para i=k+1, es decir, mostraremos que
Pm=Pm+k+1. En efecto, sean dos estados tales que piEm+k+1pj, por 1 sabemos que piEm+kpj y por
hiptesis inductiva se tiene que piEmpj; inversamente sean dos estados tales que piEmpj, por el
supuesto de partida (Pm=Pm+1) tenemos que piEm+1pj, por 2 se deduce que
piEmpj a (pi,a)Em(pj,a), por hiptesis inductiva resulta que
piEm+kpj a (pi,a)Em+k(pj,a), y otra vez por 2 finalmente tenemos que piEm+k+1pj.
4) Si Pm=Pm+1 entonces Pm=K
Si piEpj, entonces w (pi,w)F(pj,w)F, como es cierto w en particular
es cierto w |w|m, luego w |w|m(pi,w)F(pj,w)F, es decir, piEmpj.
Inversamente, si piEmpj entonces w |w|m(pi,w)F(pj,w)F, adems como
Pm=Pm+1 por 3 tenemos que k0 piEm+kpj, es decir,
k0 w |w|m+k (pi,w)F(pj,w)F, que se puede expresar tambin as
w(pi,w)F(pj,w)F, es decir, piEpj.
Estos resultados permiten disear el siguiente procedimiento para calcular K:
P0 = { [pj / pjF], [pj / pj(K-F)] }, es decir finales por un lado y no finales por otro
Pi+1 se construye as: dos estados ph,pj estn en la misma clase en Pi+1 si estn en una misma
clase en Pi y a los estados (ph,a),(pj,a) tambin estn en una misma clase.
Si Pi=Pi+1 entonces Pi=K.
Slo resta argumentar que algn momento la condicin Pi=Pi+1 se cumple, ello es as puesto
que cada refinamiento, es decir cada particin, dividir las primeras clases a lo ms hasta tener
por cada estado una clase, luego no es posible hacer ms divisiones o refinamientos.
El caso extremo en el que P0 tiene una sola clase (cuando F=K o cuando F={}), se maneja
igual aunque es inmediato que en este caso P0 ser igual a P1 y las reglas de transicin van del
nico estado a s mismo con todos los smbolos del alfabeto .
Para construir Pi+1 a partir de Pi lo que hay que ver es si las clases se subdividen, ello puede
hacerse en un cierto modo sistemtico as:
Tomando un estado ph de alguna clase en Pi como una especie de pivote y ver si los dems
estados que lo acompaan (en Pi) por ejemplo pj- siguen acompandolo en Pi+1 (verificando
si a los estados (ph,a),(pj,a) estn en una misma clase en Pi aunque no es necesario
que sea la misma clase en la que estn ph y pj).
Los estados que estn junto a ph en una misma clase en Pi y que, fruto de la verificacin, lo
acompaen en Pi+1, se ponen todos en una misma clase precisamente en Pi+1 y se los
considerar como marcados en Pi; los estados que estn junto a ph en una misma clase en Pi y
que, fruto de la verificacin, no lo acompaen ya en Pi+1, se los considera como no marcados y
de entre ellos se toma un nuevo pivote (en la clase en Pi) y se procede nuevamente a ver
cules de los no marcados lo acompaan del modo sistemtico que indicamos.

122
Se hace lo mismo para cada clase en Pi.
Es obvio que si una clase de Pi tiene un solo estado, esta clase ya no se refinar y se repetir
tal cual en Pi+1.

Ejemplo:
Sea el siguiente AFD accesible A=({p1,p2,p3,p4,p5},{a,b},,p1,{p1,p4,p5})
:
(p1,a)=p2
(p1,b)=p3
(p2,b)=p4
(p2,a)=(p3,a)=(p4,a)=(p5,a)=p1
(p3,b)=(p4,b)=(p5,b)=p5

P0={ [p1,p4,p5], [p2,p3] }


Detallaremos slo la primera subdivisin de la clase [p1,p4,p5] al construir P1 a partir de P0.
Tomamos a p1 como pivote:
Le acompaa p4? Debemos verificar que (p1,a),(p4,a) estn en una misma clase en P0, es
decir que p2,p1 estn en una misma clase en P0, es claro que no, luego p4 no acompaa a p1.
Le acompaa p5? Debemos verificar que (p1,a),(p5,a) estn en una misma clase en P0, es
decir que p2,p1 estn en una misma clase en P0, es claro que no, luego p5 no acompaa a p1.
Es decir, como no hay ms estados en esta clase de P0, el estado p1 va slo a la nueva particin
P1.
P0 (y P1 an en etapa de construccin) se veran as hasta el momento, donde hemos puesto en
negrita el estado marcado p1:
P0={ [p1,p4,p5], [p2,p3] }
P1={ [p1], ... }
Ahora hay que ver qu pasa con los estados no marcados de la clase [p1,p4,p5] de P0.
Tomamos a p4 como pivote:
Le acompaa p5? Debemos verificar que (p4,a),(p5,a) estn en una misma clase en P0, es
decir que p1,p1 estn en una misma clase en P0, es claro que si; pero ello no basta, tenemos
ms smbolos en . Debemos verificar adems que (p4,b),(p5,b) estn en una misma clase
en P0, es decir que p5,p5 estn en una misma clase en P0, es claro que si, luego p5 si acompaa
a p4. Y, como no hay ms estados no marcados en esta clase de P0, P0 (y P1 aun en etapa de
construccin) se veran as hasta el momento, donde hemos puesto en negrita los estados
marcados:
P0={ [p1,p4,p5], [p2,p3] }
P1={ [p1], [p4,p5], ... }
Falta ver qu pasa con la otra clase, resumimos todo el trabajo as:
P0={ [p1,p4,p5], [p2,p3] }
P1={ [p1], [p4,p5], [p2,p3] }
P2={ [p1], [p4,p5], [p2,p3] }
Como P1=P2, K=PE={ [p1], [p4,p5], [p2,p3] }= {q1,q2,q3}, que tambin puede denotarse as:

123
K={ [p1]E, [p4]E, [p2]E }={ [p1]E, [p5]E, [p3]E }
La clase que contiene al estado inicial de A es q1=[p1]E que es el estado inicial de A.
F={ [p1]E, [p4]E }={q1,q2}
Slo resta construir , por ejemplo ([p4]E,b)=[(p4,b)]E=[p5]E, es decir,(q2,b)=q2
El resto est aqu
:
(q1,a)=(q1,b)=q3
(q2,a)=(q3,a)=q1
(q2,b)=(q3,b)=q2

Mostraremos ahora que T(A)=L:


Previamente probaremos por induccin sobre |u| que ([pi]E,u)=[(pi,u)]E
Caso base:|u|=0, es decir, u=. ([pi]E,)=[pi]E=[(pi,)]E, donde en ambas igualdades se
utiliza la definicin de y respectivamente para el caso de la cadena vacia.
Hiptesis inductiva: supondremos cierto el enunciado para |u|=k.
Paso inductivo: Sea |v|=k+1, entonces podemos reescribir dicha cadena as v=ua con |u|=k.
([pi]E,v)=([pi]E,ua)=(([pi]E,u),a) por definicin de

=([ (pi,u)]E,a) por hiptesis inductiva

=[( (pi,u),a)]E por definicin de
=[(pi,ua)]E por definicin de

=[ (pi,v)]E
Ahora uT(A) si y slo si ([p1]E,u)F
si y slo si [(p1,u)]EF (aqu se utiliza el resultado previo )

si y slo si (p1,u)F (pues F se define as)
si y slo si uT(A) si y slo si uL (pues T(A)=L)
Slo resta mostrar que |K|=n donde n es el ndice de la relacin RL. Es decir, que A no tiene
ms estados y es idntico o isomorfo al AFD mnimo A que se construye en el teorema de
Myhill-Nerode y de ah es el AFD mnimo buscado. Haremos esto por reduccin al absurdo:
Supongamos que A tiene en K- ms estados que A, el cual tiene |K|=n estados. Es decir
supongamos que A tiene por lo menos n+1 estados.
Vase el esquema de la siguiente pgina como ayuda.
As pues las cadenas xi1,...,xin,xin+1 nos permiten llegar desde p1 a pi1,...,pin,pin+1
respectivamente.
Ahora bien, todas estas cadenas xi1,...,xin,xin+1 no pueden estar en diferentes clases de
equivalencia en la particin de que induce RL, pues solamente tenemos n clases de
equivalencia, as pues dos de estas cadenas estn en una misma clase de equivalencia en la
particin de que induce RL (en la columna izquierda de nuestra tabla-esquema).
Sean xij,xih dichas cadenas, es decir, xijRLxih.

124
El AFD A El AFD A
construido segn el teorema de Construido segn se indica arriba
Myhill-Nerode tiene n estados Tiene por nuestro supuesto- ms de n
los cuales podran llamarse: estados, digamos n+1 estados, los cuales
representaremos as:
q1 correspondiente a la clase []RL [pi1]E xi1
... ... cada pij es un estado de K ...
qj correspondiente a otra clase de RL [pij]E y para cada uno de ellos xij
... ... xij (p1,xij)=pij ...
qn correspondiente a la ltima clase de RL [pin]E pues A es accesible, xin
[pin+1]E anotemos estas cadenas xin+1
aqu la derecha
Adems estas cadenas son tales que (p1,xij)=pij y (p1,xih)=pih, con [pij]E y [pih]E dos clases
de equivalencia en la particin de K que induce E, es decir, [pij]E y [pih]E son dos estados de
K y [pij]E [pih]E, que es lo mismo que decir que pij y pih no estn relacionados (bajo E).
Pero entonces de acuerdo a la definicin de E-:
no es cierto que w (pij,w)F(pih,w)F,
en esta expresin podemos reemplazar pij con (p1,xij) y pih con (p1,xih), luego,
no es cierto que w ((p1,xij),w)F((p1,xih),w)F, por propiedades de
resulta lo siguiente: no es cierto que w (p1,xijw)F(p1,xihw)F,
como A acepta L, deducimos esto: no es cierto que w xijwLxihwL,
-ntese la definicin de RL-, as pues tenemos que xij no est relacionada con xih (bajo RL).
Lneas arriba concluimos que xijRLxih y ahora concluimos que ello no es cierto, esta
contradiccin prueba el enunciado de que A no tiene ms estados que A, es decir, es el AFD
mnimo.

Hay una alternativa muy popular aunque exigente en tiempo computacional para calcular las
clases de equivalencia de la particin de K inducida por E, en vez de refinar las clases a partir
de P0, lo que hace es averiguar poco a poco cules pares de estados son distinguibles, es decir
no equivalentes, para finalmente agruparlos en clases. Se basa en los siguientes resultados:
i) Es obvio que si slo uno de los dos estados pi,pj est en F, con w=:
w [{(pi,w)F (pj,w)F} {(pi,w)F (pj,w)F}], es decir,
pi,pj no son equivalentes (bajo E). Esto nos permite identificar los primeros pares de estados
distinguibles, son aquellos en los que uno es final y el otro no.
ii) Si (pi,a)=ph y (pj,a)=pg y ph,pg son distinguibles entonces pi,pj son distinguibles.
Ello es inmediato puesto que ph,pg sean distinguibles no es otra cosa que
w [{(ph,w)F (pg,w)F} {(ph,w)F (pg,w)F}]; sea la cadena
u=aw, dado que (pi,aw)=((pi,a),w)=(ph,w) y (pj,aw)=((pj,a),w)=(pg,w),
resulta que u [{(pi,u)F (pj,u)F} {(pi,u)F (pj,u)F}] es decir,

125
pi,pj no son equivalentes (bajo E) o lo que es lo mismo son distinguibles. Esto nos permite
identificar pares de estados distinguibles a partir de otros que ya son distinguibles.
La idea se integra en el siguiente procedimiento que construye una matriz de pares de estados
distinguibles, las filas corresponden a estados y las columnas tambin la matriz triangular
superior se omite por simetra y porque la diagonal comparara un estado consigo mismo lo
que no tiene sentido pues siempre un estado es indistinguible de s mismo-:
. Construimos la matriz B marcando toda celda B(i,j) correspondiente al par de estados pi,pj
en el que slo uno de ellos est en F.
. Se hace lo siguiente
Se revisan una a una las celdas B(i,j) no marcadas,
a se obtiene ph=(pi,a) y pg= (pj,a)
si la celda B(h,g) est marcada, entonces se marca B(i,j)
hasta que no se aadan marcas en B.
Una vez que se tiene el B final, las celdas marcadas corresponden a los pares de estados
distinguibles; y las celdas no marcadas corresponden a los pares de estados indistinguibles, es
decir, equivalentes, basta reunir estos estados en clases de equivalencia para obtener K.
Si algn estado es tal que toda su fila y toda su columna est marcada o se omite- este estado
constituye una clase por s mismo.

Ejemplo:
Sea el mismo AFD A de arriba.
En el primer paso se obtiene la siguiente matriz donde hemos rayado la parte omitida y la
marca utilizada es una x, cada fila corresponde a un estado y cada columna tambin, as la
primera fila corresponde a p1, etc.:

x
B= x
x x
x x
Como siguiente paso se observa cada celda no marcada -por ejemplo B(4,1) correspondiente
al par p4,p1- y obtenemos (p4,a)=p1 y (p1,a)=p2, B(1,2)=B(2,1) si est marcado y por tanto
procedemos a marcar tambin B(4,1); slo por diferenciar haremos las marcas en este paso
con una X mayscula. Es claro que si B(2,1) no estuviera marcado debemos seguir probando
con todos los smbolos de . El resultado es:

x
B= x
X x x
X x x
Otra vez observamos cada celda no marcada, y ahora ya no se aaden marcas.

126
Las celdas no marcadas corresponden a pares de estados indistinguibles o equivalentes
mismos que pasamos a agrupar, as [p3,p2] estn en una clase y [p5,p4] estn en otra clase.
Es claro tambin que p1 constituye una clase por s misma: [p1].

127
CAPTULO 6. CERRADURA: El caso regular

La idea de cerradura, cierre o clausura es la siguiente:


Sean L1 y L2 dos lenguajes/conjuntos regulares arbitrarios.
Sea L el resultado de alguna operacin con ellos, ya sea sobre L1 (complemento, reversa, etc.)
o sobre L1 y L2 (unin, interseccin, etc.)
Ser L un lenguaje/conjunto regular tambin ?
Si es cierto, se dice que los lenguajes/conjuntos regulares son cerrados respecto a la operacin
aplicada.
Hasta ahora hemos utilizado los conceptos de lenguaje regular para gramticas y de conjunto
regular para autmatas, simplificaremos las cosas indicando que, salvo la excepcin de la
cadena vaca -cosa que precisaremos cuando sea necesario- un lenguaje es regular si hay una
gramtica regular que lo genera (lineal izquierda o derecha), una e.r. que lo represente o un
autmata finito que lo acepte (determinstico, no determinstico o con transiciones vacas).

La propia definicin de e.r. muestra que los lenguajes regulares son cerrados respecto de la
unin, concatenacin y estrella de Kleene; adems, a partir de las conversiones genricas, para
e.r. dadas podemos construir autmatas y a partir de ellos gramticas correspondientes.
Junto a la verificacin de la cerradura respecto de otras operaciones, sin embargo, es usual
considerar estos problemas tambin de manera directa por ejemplo trabajar exclusivamente
con GRLIs- sin apelar a las conversiones en uno u otro sentido. Intentaremos mostrar ello
aunque no seremos exhaustivos.

Unin
Los lenguajes regulares son cerrados respecto de la operacin unin.
Sean G1=(N1,T1,P1,S1) tal que L(G1)=L1 y G2=(N2,T2,P2,S2) tal que L(G2)=L2 dos GRLDs con
(N1 2 S N1 y S N2, entonces podemos construir una GRLD G tal que
L(G)=L1L2.
Demostracin:
Construimos as la GRLD G=(N,T,P,S)
N = N1 N2 { S }
T = T 1 T2
P = { S --> / ( S1 --> P1 ) ( S2 --> P2 ) } P1 P2
Los subndices de esta construccin deben seguirse bien; representa cualquier parte derecha
(de un smbolo o de dos).

i) Sea u L(G), es decir, S=>*u con las producciones de P.


Podemos desglosar esta derivacin en su primer paso y el resto de los pasos:
S=>=>* u donde los pasos de derivacin se dan utilizando producciones de P
denota la cadena que se deriva de S en el primer paso de derivacin
que ha debido utilizar la produccin S--> P
Por la forma de nuestra construccin, en P1 tenemos la produccin S1-->, en P2 S2-->.

128
Adems, como contiene solo smbolos de N1 N2 y -precisamente por esto- como ningn
smbolo o produccin de P1 aparece en P2 (y viceversa), entonces la derivacin =>* u se ha
debido realizar slo con producciones de P1 de P2 (que estn en P) por lo tanto, la derivacin
que estamos desglosando puede descomponerse as:
S1=>=>*u con producciones de P1, utilizando en el primer paso S1-->
S2=>=>*u con producciones de P2, utilizando en el primer paso S2-->
es decir, u L(G1) u L(G2).
ii) Inversamente sea u L(G1) u L(G2), es decir,
S1=>=>*u con producciones de P1
S2=>=>*u con producciones de P2,
Por la forma de nuestra construccin dado que P1 P y P2 P- la derivacin =>*u puede
hacerse con producciones de P.
Adems, por la forma de nuestra construccin, S--> est en P. Luego, es posible que
S=>=>* u con slo producciones de P, es decir, u L(G).

Ejemplo:
Sea el lenguaje regular L1={ak / k > 0} generado por la GRLD G1=(N1,T1,P1,S1)
N1={S1}
T1={a}
P1:
S1-->aS1
S1-->a
Sea el lenguaje regular L2={bi / i > 0} generado por la GRLD G2=(N2,T2,P2,S2)
N2={S2}
T2={b}
P2:
S2-->bS2
S2-->b
Construimos as la GRLD G=(N,T,P,S) tal que L(G)=L1 L2={ak / k > 0} {bi / i > 0}
N={S,S1,S2}
T={a,b}
P:
S --> a
S --> b
S --> aS1
S --> bS2
S1 --> aS1
S1 --> a
S2 --> bS2
S2 --> b

Mostraremos la construccin con AFDs.

129
Sean A1=(K1,1, 1, q1, F1) tal que T(A1)=L1 y A2=(K2,2, 2, p1, F2) tal que T(A2)=L2 dos
AFDs con (K1 2 entonces podemos construir un AFD A tal que T(A)= L1 L2 as:
Por un resultado anterior es posible suponer sin prdida de generalidad que 1=2=.
A=(K1 X K2, , , [q1,p1], F)
F={ qi,pj] / qi F1 pj F2}
: qi,pj],a)=[1qi,a),2pj,a)]
Mostraremos por induccin sobre |u| que qi,pj],u)=[1qi,u),2pj,u)]
Caso base:
|u|=0, es decir u=
qi,pj],u)=qi,pj],) pues u=
=qi,pj] por definicin de caso
=1qi,),2pj,)] por definicin de 1 y 2 caso

=1 qi,u),2 pj,u)] pues u=
Hiptesis inductiva:El enunciado es cierto para cadenas de longitud k.
Paso inductivo:
Sea w una cadena de longitud k+1, es decir, w=ua con |u|=k.
qi,pj],w)=qi,pj],ua) pues w=ua
=(qi,pj],u),a) por definicin de
=([1qi,u),2pj,u)],a) por hiptesis inductiva
=[1(1qi,u),a),2(2pj,u),a)] por construccin de
=[1qi,ua),2pj,ua)] por definicin de
=[1qi,w),2pj,w)] pues w=ua

Ahora bien,
u T(A) si y slo si q1,p1],u) F -y por la reciente induccin-
si y slo si [1q1,u),2p1,u)] F y por construccin de F-
si y slo si 1q1,u) F1 2p1,u) F2
si y slo si u T(A1) u T(A2)

Ejemplo:
Sean los AFDs
A1=({q1}, {a,b}, 1, q1, {q1})
1:1q1,a)=1q1,b)=q1 y
A2=({p1,p2}, {a,b}, 2, p1, {p2})
2:2p1,a)=2p1,b)=p2
2p2,a)=2p2,b)=p1
Construimos as el AFD A=({[q1,p1],[q1,p2]}, {a,b}, , [q1,p1], {[q1,p1],[q1,p2]})
:
q1,p1],a)=q1,p1],b)=[q1,p2]
q1,p2],a)=q1,p2],b)=[q1,p1]

130
Concatenacin
Los lenguajes regulares son cerrados respecto de la operacin concatenacin.
Sean G1=(N1,T1,P1,S1) tal que L(G1)=L1 y G2=(N2,T2,P2,S2) tal que L(G2)=L2 dos GRLDs con
(N1 2 entonces podemos construir una GRLD G tal que L(G)=L1.L2.
Demostracin:
Construimos as la GRLD G=(N,T,P,S1)
N = N1 N2
T = T 1 T2
P = [ P1 - { X --> a / X --> aP1 } ] { X --> aS2 / ( X --> aP1 ) } P2
Fjese que a diferencia de lo que hacamos en la unin el smbolo raz de G1 es ahora el
smbolo raz de G y no se aumentan nuevos No Terminales.

i) Sea u L(G), u=vw


Por la forma de P es posible desglosar esta derivacin as:
S1=>*X=>aS2=>*vw
los primeros pasos de derivacin de v que se han debido dar con producciones de P1 del tipo
Y-->bZ que son parte de P, el ltimo paso de derivacin de v donde se ha debido utilizar la
produccin X-->aS2 P y el resto de los pasos de derivacin de w que se han debido dar con
producciones de P2 que son parte de P
Por la forma de nuestra construccin X-->aS2 P slo porque X-->a P1, luego se deduce
que las siguientes derivaciones son posibles:
S1=>*X=>a con producciones de P1
S2=>*w con producciones de P2
es decir, v L(G1) y w L(G2).

ii) Inversamente sea u=vw, v L(G1) y w L(G2), es decir,


S1=>*v con producciones de P1
S2=>*w con producciones de P2,
La derivacin de v puede desglosarse en su ltimo paso y el resto de los primeros pasos:
S1=>*X=>v donde v=a, X N1, T1* y X-->aP1
Por la forma de nuestra construccin X-->a ya no est en P pero si X-->aS2
Luego en la gramtica G puede hacerse la siguiente derivacin:
S1=>*X=>aS2=>*vw
Es decir, u L(G).

Ejemplo:
Sea el lenguaje regular L1={ak / k > 0} generado por G1=({S1},{a},P1,S1)
P1:
S1-->aS1
S1-->a
Sea el lenguaje regular L2={bi / i > 0 } generado por G2=({S2},{b},P2,S2)

131
P2:
S2-->bS2
S2-->b
Construimos as la GRLD G=(N,T,P,S1) tal que L(G)= L1.L2 = {akbi / k > 0 , i > 0}
N={S1,S2}
T={a,b}
P:
S1 --> aS1
S1 --> aS2
S2 --> bS2
S2 --> b

Veamos cmo es la construccin para GRLIzquierdas.


Sean G1=(N1,T1,P1,S1) tal que L(G1)=L1 y G2=(N2,T2,P2,S2) tal que L(G2)=L2 dos GRLIs con
(N1 2, entonces se construye as una nueva GRLI G tal que genera L(G)=L1.L2:
G=(N,T,P,S2)
N = N1 N2
T = T 1 T2
P = [ P2 - { X --> a / X --> a P2 } ] { X --> S1a / ( X --> a P2 ) } P1

Ejemplo:
Sean G1=({S1},{a},{S1-->S1a,S1-->a},S1) y G2=({S2},{b},{S2-->S2b,S2-->b},S2) dos GRLIs,
construimos as la GRLI G=({S1,S2},{a,b},P,S2)
P:
S2-->S2b
S2-->S1b
S1-->S1a
S1-->a

La construccin con -AFNs es muy sencilla:


Sean A1=(K1,1, d1, q1, F1) tal que T(A1)=L1 y A2=(K2,2, d2, p1, F2) tal que T(A2)=L2 dos
-AFNs con (K1 2 entonces se construye as un -AFN A tal que T(A)=L1.L2:
A=(K1 K2, 1 2, d, q1, F2)
d:
d(pi,a) = d1(pi,a) si pi K1, a 1
d1(pi,) si pi K1-F1, a=
d1(pi,) {p1} si pi F1, a=
d2(pi,a) si pi K2, a 2 {}

Ejemplo:
Sean A1=({q1,q2}, {a}, d1, q1, {q2}) y A2=({p1,p2}, {b}, d2, p1, {p2}) los -AFNs con
d1: d1(q1,a)={q2} y d2: d2(p1,b)={p2}

132
Construimos as el -AFN A=({q1,q2,p1,p2}}, {a,b}, d, q1, {p2})
d: d(q1,a)={q2} d(q2,)={p1} d(p1,b)={p2}

Presentamos dos variantes para la construccin con AFNs:


i) De un estado final de A1 -adems de a donde se llegaba- debe llegarse donde nos lleva el
estado inicial de A2, con el mismo smbolo.
A=(K1 K2, 1 2, d, q1, F)
d: d(pi,a) = d1(pi,a) si pi K1-F1 F = F2 si L2
d1(pi,a) d2(p1,a) si pi F1 F2 F1 si L2
d2(pi,a) si pi K2

Ejemplo:
Sean A1=({q1,q2}, {a}, d1, q1, {q2}) y A2=({p1,p2}, {b}, d2, p1, {p1,p2}) los AFNs con
d1: d1(q1,a)={q2} y d2: d2(p1,b)={p2}
Construimos as el AFN A=({q1,q2,p1,p2}}, {a,b}, d, q1, {q2,p1,p2})
d: d(q1,a)={q2} d(q2,b)={p2} d(p1,b)={p2}

ii) Si de un estado cualquiera en A1 llego a un estado final (en A1) adems debe llegarse al
estado inicial de A2, con el mismo smbolo.
A=(K1 K2, 1 2, d, q1, F)
d: d(pi,a) = d1(pi,a) {p1} si pi K1, [d1(pi,a) F1] F = F2 si L2
d1(pi,a) si pi K1, [d1(pi,a) F1]= F2 F1 si L2
d2(pi,a) si pi K2
Si q1 F1, es decir si L1, la construccin debe complementarse en el caso de q1 as:
d(q1,a) = d(q1,a) d2(p1,a) a (1 2)

Ejemplo:
Sean A1=({q1,q2}, {a}, d1, q1, {q1,q2}) y A2=({p1,p2}, {b}, d2, p1, {p1,p2}) los -AFNs con
d1: d1(q1,a)={q2} y d2: d2(p1,b)={p2}
Construimos as el AFN A=({q1,q2,p1,p2}}, {a,b}, d, q1, {q1,q2,p1,p2})
d: [inicialmente d(q1,b)={ }] d(q1,a)={q2,p1} d(p1,b)={p2} complementando d(q1,b)={p2}

Diferencia
Los lenguajes regulares son cerrados respecto de la operacin diferencia de conjuntos.
Sean A1=(K1,1, 1, q1, F1) tal que T(A1)=L1 y A2=(K2,2, 2, p1, F2) tal que T(A2)=L2 dos
AFDs con (K1 2 entonces podemos construir un AFD A tal que T(A)= L1-L2.
Demostracin:
Por un resultado anterior es posible suponer sin prdida de generalidad que 1=2=.
Se construye as el AFD A=(K1 X K2, , , [q1,p1], F)
F={ qi,pj] / qi F1 y pj F2 }
: qi,pj],a)=[1qi,a),2pj,a)]

133
Ya demostramos que qi,pj],u)=[1qi,u),2pj,u)], luego
u T(A) si y slo si q1,p1],u) F
si y slo si [1q1,u),2p1,u)] F
si y slo si 1q1,u) F1 y 2p1,u) F2 -por construccin de F-
si y slo si u T(A1) y u T(A2)
si y slo si u [T(A1)-T(A2)]

Ejemplo:
Con los mismos AFDs que para la unin lo nico que vara es F que es as:
F={[q1,p1]}

Complemento
Los lenguajes regulares son cerrados respecto del complemento (con * como universo).
Sea A=(K,, , q1, F) tal que T(A)=L un AFD entonces podemos construir otro AFD A tal
que T(A)=*-L.
Demostracin:
Se construye as el AFD A=(K, , , q1, K-F)
u T(A) si y slo si q1,u) K-F
si y slo si q1,u) F
si y slo si u T(A)
Ejemplo:
Sea el AFD A1=({q1}, {a,b}, 1, q1, {q1})
1:1q1,a)=1q1,b)=q1
Construimos as el AFD A=({q1}, {a,b}, 1, q1, )

Una alternativa es la siguiente:


A1=({q1}, , , q1, {q1})
: (q1,a)=q1 a
es claramente un AFD que acepta *. Si tenemos el AFD que acepta L, y dado que los
lenguajes regulares son cerrados respecto de la diferencia de conjuntos, es claro que hay un
AFD para *-L, luego la cerradura vale tambin para el complemento.

Interseccin
Los lenguajes regulares son cerrados respecto de la operacin interseccin.
Sean A1=(K1,1, 1, q1, F1) tal que T(A1)=L1 y A2=(K2,2, 2, p1, F2) tal que T(A2)=L2 dos
AFDs con (K1 2 entonces podemos construir un AFD A tal que T(A)= L1 L2.
Demostracin:
Por un resultado anterior es posible suponer sin prdida de generalidad que 1=2=.
Construimos as el AFD A=(K1 X K2, , , [q1,p1], F)
F= F1 X F2
: qi,pj],a)=[1qi,a),2pj,a)]

134
Ya demostramos que qi,pj],u)=[1qi,u),2pj,u)], luego
u T(A) si y slo si q1,p1],u) F
si y slo si [1q1,u),2p1,u)] F
si y slo si 1q1,u) F1 y 2p1,u) F2 -por construccin de F-
si y slo si u T(A1) y u T(A2)
si y slo si u [T(A1) T(A2)]

Ejemplo:
Con los mismos AFDs que para la unin lo nico que vara es F que es as:
F={[q1,p2]}

La construccin con GRLDs es as:


Sean G1=(N1,T1,P1,S1) tal que L(G1)=L1 y G2=(N2,T2,P2,S2) tal que L(G2)=L2 dos GRLDs con
(N1 2 entonces podemos construir as una GRLD G tal que L(G)= L1 L2.
G=( N,T,P,[S1,S2] )
N = N1 X N2
T = T 1 T2
(servira T1 T2 pero tal interseccin puede ser vaca, violentando la definicin de alfabeto)
P = { (A,X) --> a(B,Y) / ( A --> aBP1 ) y ( X --> aYP2 ) }
{ (A, X) --> a/ ( A --> aP1 ) y ( X --> aP2 ) }
Note que el Terminal debe ser el mismo.

Ejemplo:
Sean las GRLDs G1=({S1,Y},{a,b},{S1-->aS1,S1-->aY,Y-->b},S1) y
G2=({S2,Z},{a,b},{S2-->aZ, Z-->bZ,Z-->b },S2), construimos as la GRLD G=(N,T,P,[S1,S2])
N={[S1,S2],[S1,Z],[Y,S2],[Y,Z]}
T={a,b}
P:
[S1,S2]-->a[S1,Z]
[S1,S2]-->a[Y,Z]
[Y,Z]-->b

Una alternativa de demostracin interesante es como sigue:


Se sabe que los lenguajes regulares son cerrados respecto de la diferencia y la unin, adems
suponiendo sin prdida de generalidad que L1* y L2*se sabe que
L1 L2 = * - [ (*-L1) (*-L2) ]
Lo que demuestra que los lenguajes regulares son cerrados tambin respecto de la
interseccin.

Estrella de Kleene
Los lenguajes regulares son cerrados respecto de la operacin estrella de Kleene.

135
Mostraremos la construccin con GRLDs, en cuyo caso por la excepcin de la cadena vaca
hablamos de la operacin cruz de Kleene.
Sea la GRLD G=(N,T,P,S) L(G)=L entonces podemos construir otra GRLD G tal que
L(G)=L*.
Demostracin:
Se construye as la GRLD G=( N,T,P,S)
P= P {X-->aS / X-->a P }
i) Sea u L+, es decir, existe un i tal que u Li , es decir, u=u1...ui con uj L=L(G), es
decir, para cada uj S=>*uj, es posible desglosar cada una de estas derivaciones as:
S=>*jXj=>jaj
Donde se ha evidenciado el ltimo paso de derivacin de uj=jaj que ha debido utilizar la
produccin Xj-->aj P.
Por la forma de nuestra construccin Xj-->ajS P, luego se deduce que la siguiente
derivacin es posible:
S=>*1X1=>1a1S=>...=>*1a1...iXi=>1a1...iai
Es decir, u L(G).
ii) Inversamente sea u L(G), es decir, S=>*u.
P tiene las mismas producciones de P junto al conjunto {X-->aS / X-->a P }, de ah que
Esta derivacin puede desglosarse as, utilizando las producciones de P y en vez de utilizar
una produccin que finalice la derivacin de terminales reiniciar el trabajo de las
producciones de P utilizando una del tipo X-->aS que si est en P tantas i veces como se
quiera as:
S=>*1X1=>1a1S=>...=>*1a1...iXi=>1a1...iai
Pero entonces u es una cadena con la siguiente forma u=u1...ui con uj L(G)=L, es decir,
u L+.

Ejemplo:
Sea la GRLD G=({S,Y},{a,b},{S-->aS,S-->aY,Y-->b},S), construimos as la GRLD
G=({S,Y},{a,b},{S-->aS,S-->aY,Y-->b,Y-->bS},S)

Mostraremos la construccin con AFNs.


Sea el AFN A=(K,, d, q1, F) tal que T(A)=L entonces podemos construir un AFN A tal que
T(A)=L* as: A=(K, , d, q1, F)
F = {q1}
d:
d(qi,a)=d(qi,a) si [d(qi,a) F]=
d(qi,a)=d(qi,a) {q1} si [d(qi,a) F]

Ejemplo:
Sea el AFN A=({q1,q2}, {a}, d1, q1, {q2}) con
d1: d1(q1,a)={q2}

136
Construimos as el AFN A=({q1,q2}, {a}, d, q1, {q1})
d: d(q1,a)={q2,q1}

Es usual presentar en esta parte los siguientes resultados.


Sea L un lenguaje regular, entonces LR es tambin un lenguaje regular.
En efecto, sea G=(N, T, P, S) S N- una GRLD tal que L(G)=L, entonces podemos
construir otra GRLD G tal que L(G)=LR.
Demostracin:
Sin prdida de generalidad podemos suponer que G es tal que sus producciones no incluyen a
su smbolo raz en la parte derecha de ninguna de sus producciones. Entonces construimos as
G=(N {S},T,P,S)
P:
Y --> aX si ( X --> aY P ) y X S
S --> aX si ( X --> a P ) y X S
S --> a si ( S --> a P )
Y --> a si ( S --> aY P )

i) Sea u L(G) , es decir, S=>* u con las producciones de P.


Si dicha derivacin se hace en un paso S=>u, entonces la cadena u es de un smbolo y uR=u,
tambin S-->u P, y por lo tanto tercera lnea de la construccin de P- S-->u P, as
S=>*u con una produccin de P, es decir, la cadena uR L(G).
Si la derivacin S=>* u con producciones de P se hace en ms de un paso, podemos desglosar
esta derivacin, suponiendo lcitamente que u=bi1bi2...bikbik+1 con bij T, as:
S=>bi1Vj1 donde se ha utilizado la produccin S-->bi1Vj1 P
=>bi1bi2Vj2 donde se ha utilizado la produccin Vj1-->bi2Vj2 P
...
=>bi1bi2... bikVjk donde se ha utilizado la produccin Vjk-1-->bikVjk P
=>bi1bi2... bikbk+1 donde se ha utilizado la produccin Vjk-->bik+1 P
Ningn Vjh es S, pues G no incluye al smbolo raz en la parte derecha de sus producciones.
Luego, por la forma de nuestra construccin, las siguientes producciones deben estar en P:
Vj1-->bi1
Vj2-->bi2Vj1
...
Vjk-->bikVjk-1
S-->bik+1Vjk
Luego, la siguiente derivacin es posible en G:
S=>bik+1Vjk=>bik+1bikVjk-1=>...=>bik+1bik...bi3Vj2=>bik+1bik...bi3bi2Vj1=>bik+1bik...bi3bi2bi1
Es decir, S=>*uR en G, es decir uR L(G).

ii) Inversamente, sea u L(G):

137
Si S=>u en un paso, ello sucede utilizando la produccin S-->u P, tambin es claro que
uR=u, pero por construccin, tercera lnea- esta produccin est en P slo si S-->u P, as
S=>u tambin en G.
Si S=>*u en G dando ms de un paso, podemos desglosar esta derivacin, suponiendo
lcitamente que u=bik+1bik...bi1bi2 con bij T, as:
S=>bik+1Vjk donde se ha debido utilizar la produccin S-->bik+1Vjk P
=>bik+1bikVjk-1 donde se ha debido utilizar la produccin Vjk-->bikVjk-1 P
...
=>bik+1bik...bi3Vj2 donde se ha debido utilizar la produccin Vj3-->bi3Vj2 P
=>bik+1bik...bi3bi2Vj1 donde se ha debido utilizar la produccin Vj2-->bi2Vj1 P
=>bik+1bik...bi3bi2bi1 donde se ha debido utilizar la produccin Vj1-->bi1 P
Estas producciones estn en P fruto de nuestra construccin y les haremos un anlisis tanto
para mostrar que ningn Vjh es S como para indicar qu producciones estn en P.
La inclusin de S-->bik+1Vjk a P ha utilizado necesariamente la segunda lnea de nuestra
construccin a partir de Vjk-->bik+1 en P, con VjkS.
La inclusin de Vjk-->bikVjk-1 a P ha utilizado la primera lnea de nuestra construccin a partir
de Vjk-1-->bikVjk en P, con Vjk-1S. No ha podido usarse la segunda lnea pues en ese caso
Vjk=S lo que ya est descartado.
Podemos seguir desarrollando un razonamiento anlogo recurrente para indicar que:
La inclusin de Vj3-->bi3Vj2 a P ha utilizado la primera lnea de nuestra construccin a partir
de Vj2-->bi3Vj3 en P, con Vj2S. No ha podido usarse la segunda lnea pues en ese caso Vj3=S
lo que ya est descartado.
La inclusin de Vj2-->bi2Vj1 a P ha utilizado la primera lnea de nuestra construccin a partir
de Vj1-->bi2Vj2 en P, con Vj1S. No ha podido usarse la segunda lnea pues en ese caso Vj2=S
lo que ya est descartado.
La inclusin de Vj1-->bi1 a P ha utilizado la cuarta lnea de nuestra construccin a partir de
S-->bi1Vj1 en P. No ha podido usarse la tercera lnea pues en ese caso Vj1=S lo que ya est
descartado.
As pues, tenemos en P las producciones:
Vjk-->bik+1
Vjk-1-->bikVjk
...
Vj2-->bi3Vj3
Vj1-->bi2Vj2
S-->bi1Vj1
Donde ningn Vjh es S.
Luego, la siguiente derivacin es posible en G:
S=>bi1Vj1=>bi1bi2Vj2=>bi1bi2bi3Vj3=>...=>bi1bi2bi3...bikVjk=>bi1bi2bi3...bikbik+1
Es decir, uR L(G).

138
Ejemplo:
A partir de la GRLD G=({S,X},{a,b},P,S):
P:
S --> aX
X --> aX ntese que G no incluye a su smbolo raz en
X --> bX la parte derecha de ninguna de sus producciones
X --> b
Construimos as G=({S,S,X},{a,b},P,S)
P:
X --> a
X --> aX
X --> bX
S --> bX

Mostraremos el resultado con e.r. Si L es regular debe haber una e.r. r que la representa, es
decir, L(r)=L . El siguiente procedimiento parte de la e.r. r y construye la e.r. rR tal que
L(rR)=LR:
cuando r=: rR =
cuando r=: rR=
cuando r=a: rR=a
cuando r=t+s: rR=tR+sR
cuando r=t*: rR=(tR)*
cuando r=ts: rR=sRtR

Una induccin sobre la longitud de r muestra que rR es tal que L(rR)=LR.


Caso base:
|r|=1
Cuando r=, es claro que L=L(r)={}, y que LR={}=L(rR), con rR= como indica nuestra
construccin.
Cuando r=, es claro que L=L(r)={}, y que LR={}=L(rR), con rR= como indica nuestra
construccin.
Cuando r=a, es claro que L=L(r)={a}, y que LR={a}=L(rR), con rR=a como indica nuestra
construccin.
Hiptesis inductiva:
El enunciado es cierto para |r|<k
Paso inductivo:
Sea r una e.r. tal que |r|=k
Por la estructura de las e.r. r slo puede ser de una de tres formas:
r=t+s: en este caso L=L(r)=L(t) L(s), y de ah LR=[L(t)]R [L(s)]R. Por nuestra
construccin rR=tR+sR, donde L(rR)=L(tR) L(sR), por hiptesis inductiva L(tR)=[L(t)]R y
L(sR)=[L(s)]R, es decir, L(rR)=[L(t)]R [L(s)]R.

139
r=ts: en este caso L=L(r)=L(t).L(s), y de ah por definicin de reversa LR=[L(s)]R.[L(t)]R. Por
nuestra construccin rR=sRtR, donde L(rR)=L(sR).L(tR), por hiptesis inductiva L(tR)=[L(t)]R
y L(sR)=[L(s)]R, es decir, L(rR)=[L(s)]R[L(t)]R.
r=t*: en este caso L=L(r)=[L(t)]* , y de ah por definicin de reversa LR=([L(t)]R)*. Por
nuestra construccin rR=[tR]*, donde L(rR)=[L(tR)]*, por hiptesis inductiva L(tR)=[L(t)]R, es
decir, L(rR)=([L(t)]R)*.

Ejemplo:
Sea L=L(r) con r=a(a+b)*b
rR=b(a+b)*a

Sea L un conjunto finito de cadenas, entonces L es regular.


Demostracin:
i)L=
La GRLI=({S},{a},{S-->Sa},S) claramente es tal que L(G)=.
Es evidente tambin que T(A)= para el AFD A=({q1}, {a}, , q1, )
: (q1,a)=q1
Por otro lado la e.r. r= es tal que L(r)= por definicin.
ii)L={}
Es claro que T(A)={} para el AFD A=({q1,q2}, {a}, , q1, {q1})
: (q1,a)=q2 (q2,a)=q2
Por otro lado la e.r. r= es tal que L(r)={} por definicin.
iii)L={w}
El caso w= se acaba de ver. Sea w=a1...am.
Es claro que T(A)={w} para el AFN A=({q1,...,qm,qm+1}, {a1,...,am}, d, q1, {qm+1})
d: d(qi,ai)={qi+1} i=1,...,m
Es evidente tambin que L(G)={w} para la GRLI G=({S1,...,Sm},{a1,...,am},P,Sm)
P:
Si-->Si-1ai i=m,...,2
S1-->a1
Por otro lado la e.r. r=a1. ... .am es tal que L(r)={w}
iv)L={w1,...,wk}
Dado que L puede reescribirse como L={w1} ... {wk}, que L={w} es un lenguaje regular y
que la unin de lenguajes regulares es tambin regular, se sigue que L es regular.

140
CAPTULO 7. PROBLEMAS DE DECISIN

Siempre es posible describir un problema de manera que su respuesta sea una decisin por un
s o por un no, estos problemas denominados de decisin pueden ser muchsimos aunque
usualmente se consideran nicamente aquellos catalogados como generales e importantes.
En este contexto, se dice que un problema es decidible si su respuesta correcta siempre puede
obtenerse siguiendo un algoritmo ya sea explcito o implcito en algn resultado terico; es
imprescindible mencionar que hay problemas que no son decidibles, es decir, que para
dichos problemas- no hay un algoritmo que nos permita decir siempre un s o un no como
respuesta.
La seleccin de problemas no siempre es coincidente, nosotros veremos algunos de los ms
comunes. Ntese que si resolvemos un problema para una de las abstracciones autmatas
finitos, gramticas o expresiones regulares- el mismo tambin es resoluble para las otras pues
podemos apelar a la respuesta inicial a travs de las conversiones que conocemos.

Pertenencia de una cadena a un lenguaje regular (el Algoritmo de Earley)


El problema siguiente es decidible: pertenece la cadena u a L(G) donde G es una GRLD?
Es claro como anticipamos- que si L est representado por una e.r. o si L es el lenguaje
subyacente a un AFN, a un AFN o a una gramtica regular, podemos construir por
conversin el AFD correspondiente y luego testear dicho AFD con u para ver si *(q1,u) F o
no. Sin embargo, a menudo interesa resolver el problema directamente, sin conversiones
previas, ya sea por simple elegancia o inters terico, o bien por algn asunto de eficiencia.
Aprovecharemos el problema que estamos considerando para presentar el Algoritmo de
Earley que responder si una cadena de entrada es generada o no por una GR lineal derecha o
izquierda. Casi siempre se presenta este algoritmo para otro tipo de gramticas en lo que se
denomina parsing, pero funciona tambin para las regulares y haremos su presentacin
general aqu en lo que hace al reconocimiento (sin involucrarnos en los rboles parsing).
Bsicamente lo que propone Earley es operar con las producciones de manera que sean reglas
de produccin activas parcial o completamente reconocidas: se intenta una derivacin,
llamada ms a la izquierda, prediciendo las producciones que sirvan para derivar la cadena u,
smbolo a smbolo, y colocando un punto en la parte derecha de las producciones que indica
cunto de esa parte derecha se ha reconocido hasta ahora a travs del escaneo de la entrada.
Para ello se construyen conjuntos de temes Ij; un tem en forma genrica tiene una produccin
A--> ( representa la parte derecha de la produccin) marcada con un punto y seguida de
un nmero: [A-->, i].
El algoritmo, que se supone trabaja con la GR=(N,T,P,S) y la cadena u=a1...an tiene estos tres
subprocedimientos:

Procedimiento PREDECIR (se supone que se trabaja con Ij):


Para cada [A-->B,i] Ij A-->B P; , (N T)*
aadir para cada B--> P (N T)*
[B-->,j] a Ij

141
Procedimiento COMPLETAR (se supone que se trabaja con Ij):
Para cada [A-->,k] Ij A--> P; (N T)*
aadir para cada [B-->A,i] Ik B-->A P; , (N T)*
[B-->A,i] a Ij

Procedimiento ESCANEAR (se supone que se trabaja con Ij):


Para cada [A-->a,i] Ij-1 con a=aj A-->a P; , (N T)*
aadir [A-->a,i] a Ij

Y el procedimiento principal es este:

Construir el conjunto I0 as:


Aadir [S-->, 0] a I0 S--> P, es cualquier parte derecha
Ejecutar los procedimientos
PREDECIR con I0 y/o COMPLETAR con I0
hasta que no se aadan nuevo temes a I0
Construir los conjuntos I1,...,Ij,...,In as:
Ejecutar los procedimientos
ESCANEAR con Ij, PREDECIR con Ij y/o COMPLETAR con Ij
hasta que no se aadan nuevo temes a Ij
Testear In as: si [S-->,0] In, entonces u pertenece a L(G), en otro caso no.

Ejemplo:
Sea la cadena de entrada u=a1a2a3=abc, y la GRLD G=({S,A,B,C,D},{a,b,c,d},P,S)
P:
S-->aB
B-->bC
C-->c
C-->cD
D-->d
I0: [S-->aB,0]
Ni PREDECIR ni COMPLETAR aaden nuevos temes
Ahora j=1 y a1=a, I1:
[S-->aB,0] aadido en ESCANEAR a partir de [S-->aB,0]
[B-->bC,1] aadido en PREDECIR a partir de [S-->aB,0] y B-->bC
No se pueden aadir ms temes
Ahora j=2 y a2=b, I2:
[B-->bC,1] aadido en ESCANEAR a partir de [B-->bC,1]
[C-->c,2] aadido en PREDECIR a partir de [B-->bC,1] y C-->c
[C-->cD,2] aadido en PREDECIR a partir de [B-->bC,1] y C-->cD
No se pueden aadir ms temes

142
Ahora j=3 y a3=c, I3:
[C-->c,2] aadido en ESCANEAR a partir de [C-->c,2]
[C-->cD,2] aadido en ESCANEAR a partir de [C-->cD,2]
[D-->d,3] aadido en PREDECIR a partir de [C-->cD,2] y D-->d
[B-->bC,1] aadido en COMPLETAR a partir de [C-->c,2] y [B-->bC,1] I2
[S-->aB,0] aadido en COMPLETAR a partir de [B-->bC,1] y [S-->aB,0] I1
No se pueden aadir ms temes
Testear I3: como [S-->aB,0] I3 entonces la cadena u=abc est en L(G).

Intuitivamente, que [A-->,i] Ij significa que la produccin A--> puede aplicarse en la


derivacin tal que el prefijo a1...ai ya ha sido reconocido, y que la subcadena ai+1...aj puede
derivarse a partir de . La parte es la parte que falta derivar, misma que se predice.
Es necesario remarcar que al construir Ij, los procedimientos escanear, predecir y completar
pueden efectuarse repetidamente y en cualquier orden una y otra y otra vez hasta que no se
aadan nuevos temes.

Lenguaje aceptado por un AFD: vaco o no


El problema siguiente es decidible: el lenguaje aceptado por un AFD es vaco?
En efecto, sea el AFD A=(K,, , q1, F), construimos primero el conjunto de estados
alcanzablesdesdeq1 como ya se indic antes, si alguno de ellos es final es claro que T(A) no es
vaco:
Si [alcanzablesdesdeq1 F]= entonces T(A) si es vaco, en otro caso T(A) no es vaco.

Una alternativa es construir el conjunto de estados desde los cuales se llega a un estado final,
incluidos los propios estados finales.
B0 = F
Bi+1 = Bi { qj / (qj,a) Bi , a }
Si Bi=Bi+1 entonces E=Bi

Si q1E entonces T(A) no es vaco, en otro caso T(A) s es vaco.

Otra alternativa es ir probando cadenas para ver si el AFD acepta cuando menos una de ellas.
Para hacer ms sistemtica la prueba se escogen las cadenas en orden lxico, es decir, primero
luego a1 luego a2 ... luego an, luego a1a1, etc.
Si hay una cadena que es aceptada T(A) no es vaco, en otro caso T(A) si es vaco.
Lo central en esta alternativa es tener un nmero finito de cadenas de prueba, de lo contrario
podramos estar intentando con las infinitas cadenas de * lo que es una psima idea.
Este conjunto finito de cadenas de prueba lo ofrece el lema de bombeo. En efecto, sea A un
AFD con |K|=n: T(A) u |u|<n (p1,u)F
Es obvio que si hay una cadena que llega a un estado final entonces T(A).

143
Inversamente, supongamos que T(A), probaremos que u |u|<n (p1,u)F por
reduccin al absurdo.
Supongamos que la cadena ms pequea en longitud- de T(A) es u, con |u|n-, por el lema
de bombeo podemos reescribirla as u=xyz con y, as pues xz no est en T(A), pues xz es
ms pequea que u y el supuesto es que u es la cadena ms pequea de T(A).
Por el lema de bombeo sabemos que i0 xyiz T(A) , de ah es claro que xz est en T(A)
y, dado que |xz|<|xyz|, xz es aun ms pequea que u. Esta contradiccin prueba el enunciado
que nos da el conjunto finito de cadenas de prueba buscado: debemos probar solamente las
cadenas de longitud menor que |K| si alguna de ellas, es aceptada es obvio que T(A), en
otro caso T(A)=.

Infinitud (finitud) del lenguaje aceptado por un AFD


El problema siguiente es decidible: el lenguaje aceptado por un AFD es infinito?
Sea A un AFD con |K|=n, nuevamente el lema de bombeo nos ayudar a demostrar que
T(A) es infinito u n|u|<2n uT(A).
Es claro, por dicho lema, que si u n|u|<2n uT(A), es decir, si u |u|n uT(A),
podemos reescribir esta cadena as u=xyz con xyiz T(A) para todo i, luego T(A) es infinito.
Inversamente, sea T(A) infinito, mostraremos que hay una cadena en T(A) de longitud entre n
y 2n. Como T(A) es infinito, tiene infinitas cadenas de longitud mayor o igual a n. Sea w la
ms pequea en longitud- de esas cadenas, es decir, wT(A) y |w|n. Entonces, podemos
reescribir w as w=uv con |u|=n, |v|n. Usando el razonamiento del lema de bombeo, la
primera subcadena puede reescribirse as u=xyz -con y- de manera que toda la cadena w
puede reescribirse as w=xyzv; por dicho lema tanto xyzvT(A) como xzvT(A); dado que
|xzv||v| y |v|n, es claro que |xzv|n, adems |xzv|<|xyzv|=|uv|=|w|, es decir, |xzv|<|w|, como
w fue elegida siendo la cadena en T(A) ms pequea que tenga longitud mayor o igual a 2n,
es claro que xzvT(A) es de longitud |xzv|<2n; as pues tenemos n|xzv|<2n y xzv es la
cadena buscada.
Por tanto, probamos con las cadenas de longitud mayor o igual a |K|=n pero menor que 2n, si
el AFD acepta alguna T(A) es infinito, en otro caso no.

Inclusin del lenguaje aceptado por un AFD respecto de otro AFD


El problema siguiente es decidible: el lenguaje aceptado por el AFD A1 es subconjunto del
lenguaje aceptado por el AFD A2?
Sean L1=T(A1) y L2=T(A2) con L1,L2.
Se sabe que L1-L2={u / uL1 y uL2}={ u / uL1 y u L2 }=L1 L2
Y se sabe que los lenguajes regulares son cerrados respecto de la diferencia como de la
interseccin.
Adems L1L2 L1-L2= L1 L2 =
Luego, para determinar si T(A1)T(A2) basta con construir el AFD A que acepte L1-L2 (o bien
que acepte L1 L2 ) y testear si T(A) es vaco o no, lo que vimos que es decidible.

144
l-equivalencia de AFDs (el algoritmo de Moore)
El problema siguiente es decidible: son iguales los lenguajes aceptados por A1 y A2?
En efecto, sean A1 y A2 dos AFDs tales que L1=T(A1) y L2=T(A2), basta con testear los
siguiente que sabemos que si es decidible: L1L2 y L2L1, puesto que
L1=L2 L1L2 L2L1

Una alternativa es efectuar lo que se denomina la suma directa de AFDs denotada por .
Sin prdida de generalidad supondremos que el alfabeto de entrada es el mismo para A1 y A2.
A1A2=A=(K1K2, , , q1 - p1-, F1F2)
: (ri,a) =i(ri,a) riKi
Luego, construimos la particin en clases de equivalencia de K=K1K2 inducida por la
relacin E (como en la construccin del autmata mnimo), y vemos si los estados iniciales de
A1 y A2 estn en la misma clase de equivalencia, si es as T(A1)=T(A2), en otro caso no.

Equivalencia de e.r
El problema siguiente es decidible: son equivalentes las e.r. r1 y r2?
Sean L(r1), L(r2).
Construimos los AFDs mnimos A1 y A2 tales que L(r1)=T(A1) y L(r2)=T(A2) ya vimos que
ello es posible. Luego basta con verificar que A1 y A2 son isomorfos.
O bien construimos los AFDs A1 y A2 tales que L(r1)=T(A1) y L(r2)=T(A2), ya vimos que
ello es posible. Luego verificamos la l-equivalencia de estos AFDs, es decir, si T(A1)=T(A2)
cosa que ya la sabemos decidible.

Una otra posibilidad es aplicar el procedimiento de Ginzburg.


Para ello se requiere construir diagramas de transicin tanto para r1 como para r2, por ejemplo
aplicando el teorema de Kleene, aunque la versin original de Ginzburg trabaja con grafos de
transicin ms flexibles puesto que se permiten, adems de -transiciones, varios estados
iniciales sealados con un signo - junto al nodo en cuestin.
Es obvio que con un slo estado inicial funciona tambin.
Lo que se hace es simular sistemas de ecuaciones en derivadas de e.r. con matrices.
Sea B la matriz a construirse para cada e.r. cuyos encabezamientos son como sigue:
Su primera columna se denomina de entradas, es decir, en cada fila hay cadenas en
dispuestas en orden lxico.
La ltima columna se denomina incluye y precisamente testea este hecho.
La penltima columna se denomina igual a y verifica si una fila es igual a una anterior.
Las columnas intermedias corresponden a los nodos del diagrama (o grafo) de transicin que a
su vez corresponden a los estados del autmata, una columna por estado; los estados finales se
anotan con un signo ms (+) a su lado.
Se aaden filas segn se indica a continuacin.
El procedimiento de llenado de la matriz B termina cuando todas las filas estn cerradas.

145
Para las marcas usaremos un * e indicaremos una fila cerrada con el subndice x a la
izquierda de su entrada, tanto el marcado como el cierre de filas debe hacerse en orden,
primero la fila uno, luego la dos, etc.
Para cualquier fila, si alguna marca corresponde a una columna +, es decir, a un estado final,
en su ltima columna se anota si (incluye ).
La primera fila tiene la entrada y se marcan todas las columnas correspondientes a los
estados iniciales, y luego todas las columnas correspondientes a los estados a los que se llegue
desde algn estado inicial con slo -transiciones.
Si hay una fila no cerrada digamos la fila i- con entrada w se aaden a filas con
entrada wa y se procede a cerrar la fila i.
Para una fila aadida que slo tiene un dato en su columna entrada, se aaden marcas en todas
las columnas correspondientes a los estados a los que se llegue desde algn estado inicial con
su cadena de entrada incluyendo el uso de -transiciones (ello puede facilitarse observando
que la fila i, que ha dado lugar a esta fila aadida, ya tiene marcas con su cadena de entrada:
slo resta ver a qu estados llegamos -con el smbolo a- de los estados correspondientes a
dichas marcas, incluyendo el uso de -transiciones, y marcarlos en la fila aadida).
Si una fila nueva -digamos la fila i- es exactamente igual a otra fila anterior -digamos la fila j-
en las columnas correspondientes a los estados (tiene las mismas marcas o ninguna- en las
mismas posiciones), se cierra y se coloca la cadena de entrada de la fila j en la columna igual
a de la fila i (si la igualdad es con ms de una fila anterior, se elige la primera).
Una vez que se termina de construir B para las e.r. r1 y r2, se comparan las filas de ambas
matrices correspondientes a las mismas entradas, pero slo aquellas que tengan la columna
igual a en blanco: para cada una de estas filas, si en ambas matrices sus columnas incluye
estn en blanco -o contienen si- ambas, las e.r. r1 y r2 son equivalentes, en otro caso no.
Es posible que las matrices B para r1 y r2 no tengan todas sus entradas en comn, es decir, en
una matriz puede existir una entrada digamos w con la columna igual a en blanco- y dicha
entrada puede no estar presente en la otra matriz (porque ya se cerraron todas sus filas), en
este caso se aade en la matriz incompleta una fila con la entrada w faltante y cuyas otras
celdas se llenan copiando sus datos de una fila anterior segn el siguiente criterio: con
seguridad hay otra(s) fila(s) que tiene(n) en su entrada una cadena que es prefijo de la entrada
w que falta, si hay ms de una se elige la que tenga el prefijo ms largo en longitud, esta fila
con este prefijo ms largo, digamos u tal que w=uv- debe tener su columna igual a no en
blanco sino con una cadena, a esta cadena se le concatena v, la fila que hay que copiar es la
que tiene en su entrada esta concatenacin.

Ejemplos:
Sean las e.r. r1=(ab*)* y r2=+a(a+b)* son equivalentes r1 y r2?

Trabajaremos con los siguientes diagramas de transicin para r1 y r2:

146
r1 : r2:

Luego construimos las matrices B para ambas e.r.


Para r1:
entrada q1 + q2 igual a incluye
x * si
x a * * si
x b
x aa * * a si
x ab * * a si
x ba b
x bb b
Las primera fila es inmediata; como es no cerrada y su entrada es w=, aadimos las
siguientes dos filas con entradas a y b respectivamente, para luego cerrar esta fila uno.
Las marcas de estas filas aadidas son inmediatas, comentando simplemente que con la
cadena b, partiendo de q1, no se llega a ningn estado y por ello no hay marcas en su fila.
Como la segunda fila es no cerrada y su entrada es w=a, aadimos otras dos filas con
entradas aa y ab respectivamente, para luego cerrar esta segunda fila.
Ocurre algo semejante con la tercera fila.
La cuarta fila con entrada w=aa se trabaja as: debemos marcar todos los estados a los que se
llega partiendo de q1- con la cadena aa incluyendo -transiciones, ellos son q1 y q2; como
hay una marca en la columna q1 que es final colocamos si en la columna incluye ; y como
las marcas son exactamente iguales a la segunda fila (que tiene en su entrada la cadena a)
entonces colocamos en la cuarta fila dicha cadena a en la columna igual a y cerramos esta
cuarta fila. Decamos que puede facilitarse la tarea observando que la segunda fila que es la
que ha dado lugar a esta cuarta fila- ya tiene marcas en q1 y q2, as en esta cuarta fila debemos
marcar todos los estados a los que se llega con el smbolo a partiendo de los estados
marcados de la fila que ha dado lugar a esta, es decir, de la segunda.
Esto facilita mucho la tarea cuando las entradas son de longitud mayor.
Ocurre algo semejante con la quinta fila.
Y algo similar con la ltimas dos filas con la observacin que en las celdas correspondientes
a las columnas de los estados- son iguales a la tercera fila cuya entrada es b, pues tienen
ninguna marca en las mismas posiciones.

No anotamos los detalles para r2 cuya tabla completa est a continuacin:

147
entrada p1 p2 p3 + igual a incluye
x * * si
x a * * si
x b
x aa * * a si
x ab * * a si
x ba b
x bb b
Ahora nos resta ver de las filas que tienen en blanco la celda de la columna igual a, que son
aquellas con entrada , a y b- si coinciden en la celdas incluye , en efecto es as pues
estas celdas para dichas entradas- tienen los valores si, si y en blanco respectivamente en
ambas matrices. Luego, r1 y r2 si son equivalentes.

Uno de los ejemplos clsicos de Ginzburg ofrece estas dos matrices. Para r1:
entrada p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 + igual a incluye
x *
x 0 *
x 1 * * * si
x 00 * 0
x 01 * *
x 10 *
x 11 * 0
x 010 * 0
x 011 * * * * si
x 0110 * * 01
x 0111 * 0
Para r2 (ntese que no tiene una entrada w=011):
entrada q1 q2 q3 q4 q5 + igual a incluye
x *
x 0 *
x 1 * * * si
x 00 * 0
x 01 *
x 10 *
x 11 * 0
Aadimos una fila con la entrada faltante cuyos dems datos se copian segn lo indicado, en
este caso de la fila con entrada 1; ello es as pues w=011=01.1=u.v, es decir, u=01 es el
prefijo ms largo de w, prefijo que es entrada de la quinta fila y que tiene en su columna igual
a la cadena , misma que concatenada con v=1 nos devuelve .1=1, como dijimos la fila que
se copia es la que tiene en su entrada esta concatenacin, es decir, la fila con entrada 1:
x 011 * * * si

148
Ntese tambin que la tabla para r1 en la entrada 01 tiene la celda igual a en blanco (aunque
no ocurre esto en la tabla para r2) en este caso tambin hay que comparar esta fila.
Todo el proceso de comparacin indica que r1 y r2 si son equivalentes.

Para finalizar indicaremos brevemente que este procedimiento se basa en el hecho siguiente,
supongamos que el alfabeto sobre el que se conforman las e.r. es {a1,...,an}:
r = a1.Da1(r) + ... + an.Dan(r) + (r)
es la funcin ya conocida- que testea si L(r), y r es cualquier e.r. incluso una derivada.
Como puede hacerse lo mismo para otra e.r., es imaginable construir un sistema compuesto de
ecuaciones en e.r. como se simula con las matrices. Es claro que esta no es una descripcin
completa de cmo trabaja y demuestra Ginzburg su procedimiento cosa que escapa al alcance
de este trabajo.

Lenguajes no regulares
El siguiente es un problema complejo: es L un lenguaje regular?
En efecto, hay lenguajes que no son regulares, es decir, lenguajes para los cuales no es posible
escribir una gramtica regular que los genere ni un autmata finito que los acepte.
El ejemplo tpico es L={ajbj / j>0}, es imposible escribir una gramtica que genere L o un
autmata que acepte L.
Conviene pues tener instrumentos que nos ayuden en la tarea de decidir si un lenguaje es o no
es regular y, slo si es regular, empezar la tarea de escribir una gramtica o un autmata para
ese lenguaje.
Sabemos que los conjuntos de cadenas- finitos son regulares.
Dado un conjunto infinito de cadenas, el lema de bombeo puede ser til para mostrar que no
es regular.

Ejemplos:
Mostraremos que L={ajbj / j>0} no es regular por reduccin al absurdo.
Supongamos que s lo es, es decir, hay un AFD A tal que T(A)=L, con |K|=n.
Es claro que L es infinito, luego hay una cadena uT(A) tal que |u|n, por ejemplo para j=n la
cadena u=anbn es tal que |u|=2nn, por el lema de bombeo u puede reescribirse as u=xyz, con
|xy|n, por lo tanto como y, la subcadena y=ak con 1kn, pues los primeros n smbolos de
u son as y la subcadena y est entre estos primeros n smbolos; por el mismo lema sabemos
que i0 xyizT(A), es decir, i0 xyiz est en L; pero por simple inspeccin es claro que
las cadenas xyiz con i=2,3,4,etc., no estn en L, puesto que tendrn ms as que bs. Esta
contradiccin indica que nuestro supuesto es falso y que L no es regular.
A menudo este mismo hecho suele mostrarse as: es claro que L es infinito, luego hay una
cadena uT(A), tal que |u|n.
Por el lema de bombeo u puede reescribirse as u=xyz
Cmo son las cadenas x,y,z? Abarcaremos genricamente- todas las posibilidades:
1) x=aj, y=bj, z=
Por el lema de bombeo con i=2,3,4,etc., las cadenas xyiz estn en T(A), es decir, en L.

149
Por simple inspeccin es claro que las cadenas xyiz i=2,3,4,etc., no estn en L, puesto que
tendrn ms bs que as.
2) x= , y=aj, z=bj
Por el lema de bombeo con i=2,3,4,etc., las cadenas xyiz estn en T(A), es decir, en L.
Por simple inspeccin es claro que las cadenas xyiz i=2,3,4,etc., no estn en L, puesto que
tendrn ms as que bs.
3) x=aj-h, y=ahbk, z=bj-k
Por el lema de bombeo con i=2,3,4,etc., las cadenas xyiz estn en T(A), es decir, en L.
Por simple inspeccin es claro que las cadenas xyiz i=2,3,4,etc., no estn en L, puesto que al
incrementar i ello es muy claro ya con i=2- obtenemos cadenas del tipo xahbk...ahbkz es decir
con as y bs mezcladas.
Cualquier otra posibilidad ser semejante a las ya vistas y su razonamiento es anlogo.
Estas contradicciones -agotadas todas las posiblidades para x,y,z- muestran que nuestro
supuesto es falso y que L no es regular.

Mostraremos que L={aj / j un nmero primo} no es regular ntese que las longitudes de las
cadenas de L son nmeros primos-.
Supongamos que si lo es, es decir, hay un AFD A tal que T(A)=L, con |K|=n.
Se sabe que L es infinito, luego hay una cadena uT(A) -digamos u=aj- tal que |u|=jn, con j
un nmero primo, segn el lema u puede reescribirse as u=xyz.
Es claro que, por la propiedad asociativa y conmutativa de la suma de longitudes,
|u| = |xyz| = |x|+|y|+|z| = |xz|+|y| = j, con j primo. Sea |y|=m (m>0 pues y).
Por el lema de bombeo sabemos que i0 xyizT(A), es decir, i0 xyiz est en L, es decir,
|xyiz| = |xz|+|yi| = |xz| + i |y| = |xz| + im es un nmero primo i0.
En particular, cuando i=0, |xz|=p es un nmero primo (es decir, p>1).
Por lo ya dicho, |xz| + im = p + im es un nmero primo i0, segn el lema de bombeo.
Pero por simple inspeccin es claro que cuando i=p dicho nmero (p + pm) no es primo
puesto que es divisible por p (p1 y pp+pm, esto ltimo porque p>1 y m>0).
Esta contradiccin muestra que nuestro supuesto est equivocado y L no es regular.
2
Mostraremos que L={ a j / j2 un cuadrado perfecto} no es regular ntese que las longitudes
de las cadenas de L son cuadrados perfectos-.
Supongamos que si lo es, es decir, hay un AFD A tal que T(A)=L, con |K|=n.
Es claro que L es infinito, luego hay una cadena uT(A) tal que |u|n, por ejemplo para j=n la
cadena u = a n es tal que |u|=n2n, por el lema de bombeo u puede reescribirse as u=xyz; por
2

el mismo lema i0 xyizT(A), en particular con i=2, xyyz est en L, es decir,


|xyyz| es un cuadrado perfecto. Adems:
|u|=|xyz|=n2
Como |y||xy|, y como |xy|n por el lema-, resulta que |y|n.
Como |xyyz|=|xyz|+|y|, como |xyz|=n2, y como |y|n, resulta que |xyyz|n2n
Como n2nn2n<n2n+1 y como n2n+1=(n+1)2, resulta que |xyyz|<(n+1)2

150
Como n2=|xyz|, y como |xyz|<|xyyz| -ya que |y|>0, pues y-, resulta que n2<|xyyz|.
De ah, n2<|xyyz|<(n+1)2, es decir, xyyz es una cadena cuya longitud est entre dos cuadrados
perfectos consecutivos, es decir, su longitud no es un cuadrado perfecto, luego por simple
inspeccin xyyz no est en L.
Esta contradiccin muestra que nuestro supuesto est equivocado y que L no es regular.

El teorema de Myhill-Nerode tambin puede usarse para mostrar que ciertos lenguajes no son
regulares. En efecto, dicho teorema dice que L es regular si y slo si la relacin RL tiene
ndice finito. As, mostrar que la relacin RL tiene ndice infinito es decir tiene infinitas
clases de equivalencia- para un L dado, es lo mismo que mostrar que L no es regular.
Recuerde que dos cadenas x,y estn en una misma clase de equivalencia en RL cuando
w xw L yw L.
Por lo mismo dos cadenas x,y no estn relacionadas, es decir, estn en diferentes clases de
equivalencia cuando w tal que slo una de las cadenas xw,yw est en L y la otra no.
Este es el criterio que se utiliza: mostrar cadenas -infinitas- que sean distinguibles entre s, es
decir, que estn en diferentes -infinitas- clases de equivalencia.

Ejemplos:
Mostraremos que L={ajbj / j>0} no es regular.
Sea [a]RL una clase de RL.
Obviamente aa[a]RL, pues con w=bb, abbL pero aabbL.
Sea [aa]RL otra clase de RL. Por razones semejantes aaa[a]RL y aaa[aa]RL, w=bbb sirve para
ver esto, sea [aaa]RL otra clase de RL.
Podemos extender el razonamiento recurrentemente e indicar la presencia de las siguientes
clases [a]RL, [aa]RL, [aaa]RL, [aaaa]RL, [aaaaa]RL, etc., es decir, RL tiene infinitas clases de
equivalencia, luego L no puede ser regular.

Mostraremos que L={ u{a,b}* / u es palndrome } no es regular.


Sea [ab]RL una clase de RL.
Obviamente aab[ab]RL, pues con w=aa, abaaL pero aabaaL.Sea [aab]RL otra clase de RL.
Por razones semejantes aaab[ab]RL y aaab[aab]RL, w=aaa sirve para ver esto, sea [aaab]RL
otra clase de RL.
Podemos extender el razonamiento recurrentemente e indicar la presencia de las siguientes
clases [ab]RL, [aab]RL, [aaab]RL, [aaaab]RL, [aaaaab]RL, etc., es decir, RL tiene infinitas clases de
equivalencia, luego L no puede ser regular.

Otros resultados pueden utilizarse para mostrar que un lenguaje dado no es regular. El hecho
de que los lenguajes regulares sean cerrados respecto de la interseccin por ejemplo.
Mostraremos que L1={ u{a,b} / Na(u)=Nb(u) } no es regular.
Supongamos que s lo es. Sabemos tambin que L2={a}*.{b}* es regular.
Luego, por la cerradura indicada L=L1L2 tambin es regular. Pero L={ajbj / j>0} y ya
sabemos que L no es regular. Esta contradiccin prueba el enunciado.

151
CAPTULO 8. GRAMTICAS LIBRES DE CONTEXTO

Una Gramtica Libre de Contexto (GLC) es una cudrupla G=(N,T,P,S) donde


N es un alfabeto de No Terminales
T es un alfabeto de Terminales
SN se llama el smbolo raz de la GLC
P es un conjunto -finito y no vaco- de producciones del siguiente tipo:
A --> AN, (N T)+
Es decir, a diferencia de las gramticas regulares, la parte derecha de una produccin en una
GLC puede ser cualquier cadena de Terminales o No Terminales, en cualquier orden, de
cualquier longitud, excepto la cadena vaca .

Ejemplos:
Esta es la apariencia de una GLC G=({S,A,B},{a,b},P,S)
P:
S --> A
S --> ABBB
A --> aba
A --> aBBAaaA
B --> b

Sea la GLC G=({S},{a,b},P,S)


P:
S --> aSb
S --> ab
Sea L={ajbj / j>0}, probaremos que L=L(G).

LL(G): Por induccin sobre la longitud de las cadenas en L (que genricamente es 2j).
Caso Base: uL, |u|=2 con j=1, es decir, u=ab, por la segunda produccin es claro que S=>ab,
es decir, uL(G).
Hiptesis Inductiva: sea uL con |u|=2k, entonces uL(G), es decir, S=>*u
Paso Inductivo: sea uL con |u|=2(k+1), es decir, |u|=2k+2, como u est en L, debe ser de la
forma all indicada, es decir, podemos reescribir lcitamente esta cadena as u=aa kbkb=awb,
con |w|=2k adems que wL. Por hiptesis inductiva S=>*w. Por otra parte, utilizando la
primera produccin S=>aSb. Luego S=>aSb=>*awb, es decir, S=>*u, entonces uL(G).

L(G)L: Por induccin sobre el nmero de pasos de derivacin.


Caso Base: uL(G) y se deriva en un paso, es decir, S=>u, ello slo puede suceder si se
utiliza la segunda produccin y u=ab, pero entonces uL (con j=1).
Hiptesis Inductiva: sea uL(G) generada en menos de k pasos de derivacin, entonces uL.

152
Paso Inductivo: Sea uL(G) generada en k pasos de derivacin. Por la forma de las
producciones podemos desglosar dicha derivacin en su primer paso y el resto de los pasos:
S=>aSb=>*awb=u, pero entonces w deriva de S en menos de k pasos, por hiptesis inductiva
wL, luego es de la forma aibi (i>0) de donde u=aaibib=ajbj, con j=i+1 (j>0), luego uL.

Sea la GLC G=({S},{a,b},P,S)


P:
S --> SS
S --> aSb S --> abS S --> Sab
S --> bSa S --> baS S --> Sba
S --> ab
S --> ba

Sea L={u{a,b}+ / Na(u)=Nb(u)}, probaremos que L=L(G).

LL(G): Por induccin sobre la longitud de las cadenas en L (que es un nmero par).
Caso Base: uL, |u|=2, es decir, u=ab u=ba, por la produccin S --> ab es claro que S=>ab,
o bien por la produccin S --> ba es claro que S=>ba, es decir, uL(G).
Hiptesis Inductiva: Sea uL con |u|<k, entonces uL(G), es decir, S=>*u
Paso Inductivo: Sea uL con |u|=k, como u est en L, debe ser de la forma all indicada, es
decir, Na(u)=Nb(u); podemos reescribir lcitamente esta cadena de diversas formas: u=awb,
u=bwa, u=abw, u=baw, u=wab u=wba, en todas estas posibilidades |w|<k adems que
Na(w)=Nb(w), es decir, wL, luego por hiptesis inductiva S=>*w. Pero entonces,
S=>aSb=>*awb, utilizando la produccin S --> aSb en el primer paso, es decir, S=>*u; o bien
S=>bSa=>*bwa, utilizando la produccin S --> bSa en el primer paso, es decir, S=>*u; o bien
S=>abS=>*abw, utilizando la produccin S --> abS en el primer paso, es decir, S=>*u; o bien
S=>baS=>*baw, utilizando la produccin S --> baS en el primer paso, es decir, S=>*u; o bien
S=>Sab=>*wab, utilizando la produccin S --> Sab en el primer paso, es decir, S=>*u; o bien
S=>Sba=>*wba, utilizando la produccin S --> Sba en el primer paso, es decir, S=>*u
Est claro que en todos estos casos S=>*u, luego uL(G).
Las otras formas de u (por ejemplo cuando empieza y termina con el mismo smbolo) pueden
reescribirse as u=vw con vL, wL y |v|<k, |w|<k, por hiptesis inductiva S=>*v, as como
S=>*w, pero entonces S=>SS=>*vS=>*vw, utilizando la produccin S --> SS en el primer
paso, es decir, S=>*u, luego uL(G).

L(G)L: Por induccin sobre el nmero de pasos de derivacin.


Caso Base: uL(G) y se deriva en un paso, es decir, S=>u, ello slo sucede si se utiliza la
produccin S --> ab S --> ba con u=ab o u=ba, pero entonces uL con Na(u)=Nb(u)=1.
Hiptesis Inductiva: Sea uL(G) generada en menos de k pasos de derivacin, entonces uL.

153
Paso Inductivo: Sea uL(G) generada en k pasos de derivacin. Por la forma de las
producciones podemos desglosar dicha derivacin en su primer paso y el resto de los pasos
as:
S=>aSb=>*awb=u, si utilizamos S --> aSb en el primer paso; o bien
S=>bSa=>*bwa=u, si utilizamos S --> bSa en el primer paso; o bien
S=>abS=>*abw=u, si utilizamos S --> abS en el primer paso; o bien
S=>baS=>*baw=u, si utilizamos S --> baS en el primer paso; o bien
S=>Sab=>*wab=u, si utilizamos S --> Sab en el primer paso; o bien
S=>Sba=>*wba=u, si utilizamos S --> Sba en el primer paso;
pero en todos estos casos w deriva de S en menos de k pasos, luego por hiptesis inductiva
wL, es decir Na(w)=Nb(w), de donde Na(u)=Na(w)+1=Nb(w)+1=Nb(u), es decir, uL.
Si el primer paso se da utilizando S --> SS tenemos: S=>SS=>*wS=>*wv=u; pero aqu tanto w
como v derivan de S en menos de k pasos, luego por hiptesis inductiva w,vL, es decir
Na(w)=Nb(w) y Na(v)=Nb(v), de donde Na(u)=Na(w)+Na(v)= Nb(w)+Nb(v)=Nb(u), es decir,
uL.

La siguiente GLC G=({S},{a,b},P,S) es tal que L(G)={aibk / i>k, k>0}


P:
S --> aSb S --> aS S --> aab

La siguiente GLC G=({S},{a,b},P,S) es tal que L(G)={aibk / k>i, i>0}


P:
S --> aSb S --> Sb S --> abb

La siguiente GLC G=({S,Z},{a,b,c,d},P,S) es tal que L(G)={aibkckdi / i>0, k>0}


P:
S --> aSd
S --> aZd
Z --> bZc
Z --> bc

La siguiente GLC G=({S,X,Z},{a,b,c,d},P,S) es tal que L(G)={aibickdk / i>0, k>0}


P:
S --> XZ
X --> aXb
X --> ab
Z --> cZd
Z --> cd

rboles de derivacin
Adems de la (relacin de) derivacin que conocemos denotada por =>, podemos realizar el
grfico de una derivacin utilizando rboles en lo que se denomina rboles de derivacin.

154
Sea G una GLC, un rbol de derivacin A es aquel donde:
i) Cada nodo o vrtice tiene una etiqueta en (N T).
ii) Si un nodo no es hoja entonces su etiqueta est en N y lo denominaremos nodo interior
(salvo el caso del rbol con un solo nodo etiquetado con S).
iii) Si el nodo ni con etiqueta X tiene como hijos a los nodos nj1,..., njm de izquierda a
derecha- con etiquetas ej1,...,ejm respectivamente, entonces X-->ej1...ejm P.
Si la etiqueta del nodo raz es X, podemos referirnos al rbol A como rbol X.
A la cadena conformada por las etiquetas de los nodos hoja del rbol A, ledas de izquierda a
derecha, la llamaremos producto del rbol de derivacin.
Un rbol de derivacin con su nodo raz etiquetado con S (smbolo raz de G) y con producto
wT+, se dice que es un rbol de derivacin completo (conocido tambin como parse tree).

Ejemplo:
Sea G=({A,B},{a,b},P,S)
P:
S-->AB A-->aA B-->bB
A-->a B--> b
La cadena aabbb tiene la siguiente derivacin:
S=>AB=>AbB=>AbbB=>Abbb=>aAbbb=>aabbb
Y el rbol de derivacin correspondiente A es:

Cuyos nodos interiores estn todos etiquetados con No Terminales.


Sea n un nodo cualquiera con etiqueta Y de un rbol de derivacin A, se denomina subrbol
de derivacin (determinado por n) a dicho nodo del rbol junto a todos sus descendientes
(arcos y etiquetas incluidos); este subrbol es en s mismo un rbol de derivacin con su nodo
raz etiquetado con Y, podemos denotarlo por A n (otros se refieren a l como rbol Y, aunque
esto puede no ser del todo claro si la etiqueta se repite en otros nodos).

Ejemplo:
Si en el rbol de derivacin A de arriba denominamos los nodos por niveles de arriba a abajo y
de izquierda a derecha as: n1,n2,...,n11, la etiqueta del nodo n7 es B, y el subrbol A n7 es:

155
cuyo producto es bb.

Operacin de reemplazo en rboles


Para una GLC G:
Sea A un rbol de derivacin uno de cuyos nodos (n) tiene la etiqueta No Terminal X.
Sea B otro rbol de derivacin cuya raz tambin tiene la etiqueta X.
Reemplazar B en el nodo n de A es reemplazar el subrbol A n del rbol A por el rbol B, es
decir, borrar en el rbol A el nodo n junto a todos sus descendientes (etiquetas y arcos
incluidos) y en su lugar colocar el rbol B.
Es claro de la definicin de rbol de derivacin- que el resultado de reemplazar B en (el nodo
n de) A es un rbol de derivacin tambin.

Ejemplo:
Con la GLC de arriba tenemos el siguiente rbol de derivacin B:
B

b
Si reemplazamos B en el nodo n7 de A el resultado es el siguiente nuevo y legtimo rbol de
derivacin que podramos llamar C:

Sea G una GLC y sea A=>*u entonces hay un rbol de derivacin A con producto u y cuya
raz tiene la etiqueta A (un ejemplo de ello es el rbol de derivacin A de arriba).
Demostracin:
Por induccin sobre el nmero de pasos derivacin.
Caso base: La derivacin A=>*u se efecta en un paso, es decir, A=>u. Pero entonces, la
produccin A-->u est en P. Sea u=ej1...ejm, entonces el siguiente es un rbol de derivacin
lcito con producto u y cuya raz tiene la etiqueta A:

156
Alguna literatura se aprovecha de la reflexividad de la clausura reflexiva transitiva de =>, y
trabaja con cero pasos como el caso ms pequeo de A=>*u, es decir, u=A y la derivacin es
A=>*A, es claro que un rbol con un slo nodo etiquetado con A es ciertamente un rbol de
derivacin que representa la derivacin indicada.
Hiptesis inductiva: El enunciado es cierto para derivaciones de menos de k pasos.
Paso inductivo: La derivacin A=>*u se efecta en k pasos. Podemos desglosar lcitamente
esta derivacin en su ltimo paso y el resto, es decir, A=> *w=>u. Para el ltimo paso de
derivacin debe suceder que w=yXz adems que u=yej1...ejmz, donde X-->ej1...ejmP.
Dado que la derivacin A=>*w toma menos de k pasos por hiptesis inductiva hay un rbol de
derivacin A con producto w y cuya raz tiene la etiqueta A.
Adems, dado que X-->ej1...ejmP, el siguiente rbol de derivacin B tambin es lcito:

Como dijimos el producto de A es w=yXz, luego si reemplazamos B en A (justamente en el


nodo hoja con etiqueta X) obtendremos un nuevo y legtimo rbol de derivacin cuya raz
tiene la etiqueta A y cuyo producto es yej1...ejmz=u. Lo que prueba el enunciado.
Por otro lado: Sea A un rbol de derivacin con etiqueta A en su raz y con producto u,
entonces hay (por lo menos) una derivacin A=>*u.
En efecto, si partimos de un rbol A dado, por ejemplo el primero que graficamos, dicho rbol
puede estar asociado no slo a una derivacin sino a varias, en el caso que estamos
mencionando:
S=>AB=>AbB=>AbbB=>Abbb=>aAbbb=>aabbb
S=>AB=>aAB=>aaB=>aabB=>aabbB=>aabbb
S=>AB=>aAB=>aAbB=>aAbbB=>aAbbb=>aabbb
Demostracin:
Por induccin sobre el nmero de nodos interiores de A.
Caso base: Hay slo un nodo interior en A. Es decir, A es as:

El producto es u=ej1...ejm, luego por definicin de rbol de derivacin- A-->uP, es decir, es


posible escribir la siguiente derivacin, A=>u, y por ello A=> *u.
Hiptesis inductiva: El enunciado es cierto para rboles con menos de k nodos interiores.

157
Paso inductivo: Sea A un rbol de derivacin, con etiqueta A en su raz y con producto u, que
tiene k nodos interiores. Supongamos que la raz tiene m nodos hijo cuyas etiquetas de
izquierda a derecha son ej1,...,ejm respectivamente, luego A-->ej1...ejmP con eji(N T).
Adems, cuando el nodo hijo de la raz cuya etiqueta eji es un No Terminal entonces dicho
nodo con dicha etiqueta eji es la raz de un subrbol de A que, como se dijo, es tambin un
rbol de derivacin que tiene la particularidad, en este caso, de tener menos de k nodos
interiores y a cuyo producto denominaremos wi. Luego por hiptesis inductiva, eji=>*wi.
Si la etiqueta eji del nodo hijo de la raz es un Terminal entonces, por la reflexividad de =>*,
podemos hacer eji=wi y escribir lcitamente eji=>*wi.
Es claro de aqu que u=w1...wm
Pero entonces se puede escribir la siguiente derivacin:
A=>ej1...ejm puesto que A-->ej1...ejmP
=>w1ej2...ejm puesto que, como ya se argument, eji=>*wi
...
=>w1...wm por lo mismo recurrentemente
Es decir A=>*w1...wm, es decir, la derivacin A=>*u existe y es lcita.
Conviene recalcar que esta es una de tal vez- muchas derivaciones posibles para el rbol
dado A.
Sin embargo, si introducimos el concepto de derivacin ms a la izquierda (derecha) que
limita la forma de derivar, dado un rbol de derivacin A con etiqueta A en su raz y con
producto u, la derivacin A=>*u es nica y la demostracin de ello es prcticamente la que se
acaba de dar (o bien anloga para la derivacin ms a la derecha) bastando que eji=>*wi se
haga a travs de una derivacin ms a la izquierda.

Derivacin ms a la izquierda (derecha)


Se dice que en una GLC cualquiera efectuamos una derivacin ms a la izquierda si, como su
nombre lo indica, siempre reemplazamos (siempre utilizamos, o siempre derivamos a partir
de) el No Terminal que est lo ms a la izquierda posible en la derivacin en curso.
Por ejemplo, con la primera GLC de arriba:
S=>ABBB=>abaBBB=>ababBB=>ababbB
Es una derivacin ms a la izquierda, donde hemos puesto en negrita el No Terminal ms a la
izquierda en cada paso de derivacin. Ntese que no es necesario que una derivacin ms a la
izquierda termine en cadenas de slo Terminales.
Formalmente, una derivacin u=>*w es una derivacin ms a la izquierda si cada paso de
derivacin es ms a la izquierda. Un paso de derivacin u=>w es ms a la izquierda si u=yXz,
w=yz, X-->P, z(N T)*, yT*.
La derivacin ms a la derecha se define de manera anloga.

Ambigedad
Hay otro concepto muy utilizado sobre todo en compilacin y reconocimiento de cadenas.
Ya vimos que varias derivaciones distintas (no necesariamente ms a la izquierda) A=>*u
pueden tener el mismo rbol de derivacin como grfica.

158
Tambin dijimos que a un rbol de derivacin A con producto u y cuya raz tiene la etiqueta
A, se asocia una nica derivacin ms a la izquierda A=> *u.
Ahora queremos hacer notar que en una GLC G para una misma cadena u si empezamos a
hacer no rboles sino derivaciones -e incluso si slo efectuamos derivaciones ms a la
izquierda- podemos obtener dos o ms derivaciones que tienen rboles de derivacin distintos
(dos o ms).

Ejemplos:
Sea G=({S},{a,b,c,},P={S-->SbS, S-->ScS, S-->a},S)
La derivacin S=>*abaca puede hacerse as:
Ntese que en este ejemplo no son derivaciones ms a la izquierda todas.
S=>SbS=>SbScS=>SbSca=>Sbaca=>abaca
S=>ScS=>SbScS=>abScS=>abacS=>abaca
Los correspondientes rboles de derivacin son.

En este caso, para una misma cadena, se obtuvieron rboles de derivacin distintos.

Sea G=({S,A},{a},P={S-->AA,A-->aSa,A-->a},S)
Se obtienen estos dos rboles de derivacin para la cadena aaaaa:

159
Un clsico ejemplo es con G=({S,I,E},{a,b,c,:=,(,*,),+},P,S)
P:
S --> I := E
E --> E+E
E --> E*E
E --> (E)
E --> I
I --> a | b | c

Podemos obtener dos rboles de derivacin para la cadena a:=b+c*a:

El valor del resultado de la expresin a la derecha del operador de asignacin (:=) tiene,
ambiguamente, dos interpretaciones posibles: b+(c*a) (b+c)*a.
Se dice que una GLC G es ambigua cuando hay dos o ms rboles de derivacin distintos para
una misma cadena.
El ltimo ejemplo muestra que la ambigedad no es una caracterstica deseable en una GLC.
A veces es posible -para una GLC ambigua- encontrar otra GLC equivalente pero que no sea
ambigua.

Ejemplos:
Sea la GLC G=({S,A,B},{a},{S-->A,S--> B,A-->a,B-->a},S)
Es ambigua porque tiene rboles de derivacin distintos para la cadena a (el segundo nodo a
partir de la raz tiene etiquetas distintas).
Una gramtica equivalente, ms simple y claramente no ambigua es G=({S},{a},{S-->a},S).

Sea la GLC G=({S,A},{a},{S-->AA,A-->aSa,A-->a},S) una gramtica equivalente que no es


ambigua es G=({S,A},{a},{S-->aaaS,S-->aa},S).

160
En una GLC G no ambigua para una cadena en L(G) hay slo un rbol de derivacin.
En cambio si todas las GLCs para un lenguaje L dado son ambiguas, se dice que L es
inherentemente ambiguo. Hay lenguajes (por ejemplo L={aibicj / i,j>0}{aibjcj / i,j>0}) que
son inherentemente ambiguos pero la demostracin de ello suele ser bastante extensa;
finalmente existen pruebas (por ejemplo utilizando el denominado Teorema De Greibach, que
no exponemos) de que el problema de determinar si un lenguaje libre de contexto es
inherentemente ambiguo o no es indecidible.

GLC limpias, reducidas o higienizadas


Hay algunas caractersticas incluso en otras gramticas adems de las libres de contexto- que
impiden seguir ciertos procedimientos interesantes. Se suele decir que estas caractersticas son
aspectos "indeseables" de las gramticas y que por ello debemos limpiar dichas gramticas
para obtener otras que no tengan estas caractersticas indeseables. Es obvio que lo de
indeseable lo admitimos por convencin, es posible que siguiendo otros criterios estas
caractersticas tengan ventajas y signos positivos.
Una caracterstica indeseable es que una GLC tenga una o ms producciones del tipo A-->B,
que se conocen como producciones renombradoras (o unitarias).
Otra caracterstica indeseable es que una GLC tenga No Terminales inaccesibles, es decir,
No Terminales inalcanzables a partir de S, esto es que nunca estn presentes en una derivacin
que empiece en el smbolo raz S. Formalmente el No Terminal X es inaccesible si es
imposible que S=>*yXz con y,z(N T)*.
Otra caracterstica indeseable es que una GLC tenga No Terminales intiles, es decir, No
Terminales de los que no se puedan derivar slo Terminales. Lo mismo se puede indicar as:
sea G una GLC y sea X un No Terminal de G, X es intil si L(GX)=, donde GX es una
GLC con las mismas producciones que G pero con smbolo raz X (en lugar de S).
Hay otra caracterstica indeseable que es cuando se tienen producciones borradoras (o
nulas) del tipo A-->, nosotros hemos prohibido estas producciones, sin embargo, una
circunstancia especial puede permitirnos manejar temporalmente estas producciones y
limpiarlas luego, veremos esto despus.
Una misma GLC G puede tener todas, algunas o ninguna de estas caractersticas indeseables.

Ejemplos:
En la GLC G=({S,X},{a},{S-->a,X-->b},S) el No Terminal X es inaccesible.
En la GLC G=({S,X},{a,b},{S-->a,S-->X,X-->Xa},S) el No Terminal X es intil.
Una misma GLC G puede tener No Terminales tiles e intiles, No Terminales accesibles e
inaccesibles, etc., lo que se puede ver en el siguiente caso:
Sea la GLC G=({S,X,Y,W,Z},{a,b},P,S)
P:
S --> aS S --> Y S --> bbZ
Y --> a Z --> bZ
X --> Xa X --> b
W --> WaW

161
S es til; Y es accesible y til; X es til pero inaccesible; Z es accesible pero intil; W es
inaccesible e intil; la produccin S-->Y es renombradora.

Una GLC G libre de caractersticas indeseables se dice que est limpia.

Formas normales
Es posible que una GLC no slo cumpla la definicin sino que adems posea otras
restricciones en sus partes derechas, as por ejemplo una GLC se dice que es lineal (derecha)
si todas sus producciones son de la forma A-->wX, con A,XN y wT*. Otras restricciones
han dado paso a lo que se llaman formas normales.
1) Forma normal de Chomsky (FNCH)
Una GLC G se dice que est en FNCH si todas sus producciones son de la forma:
A-->BC A,B,CN A-->d AN, dT
Es decir las partes derechas deben tener o un Terminal o dos No Terminales.
2) Forma normal de Greibach (FNG)
Una GLC G se dice que est en FNG si todas sus producciones son de la siguiente forma :
A-->a AN, a, N*
Es decir las partes derechas son de un Terminal seguido de 0, 1 o ms No Terminales
3) Forma normal cuadrtica de Greibach (2FNG)
Se dice que una GLC G est en 2FNG si todas sus producciones son de la forma:
A-->a AN, a, N*, || < 3
Exactamente lo mismo es decir que todas sus producciones son de la forma:
A-->a A-->aB A-->aBC A,B,CN, a

Ejemplos:
La GLC G=({S,A,B,X},{a,b},P,S) est en FNCH
P:
S --> AX
X --> SB
S --> AB
A --> a
B --> b

La GLC G=({S,A,B,X},{a,b},P,S) est en 2FNG y tambin en FNG


P:
S --> aSB
S --> aB
B --> b

Es claro que toda GLC G que est en 2FNG est en FNG. La inversa no es cierta, por ejemplo
la GLC G=({S},{a},{S-->aSSSS,S-->a},S) est en FNG pero no en 2FNG.

162
Camino ms largo de un rbol de derivacin en una GLC en FNCH
Sean G una GLC y A un rbol para la derivacin A=>*w.
Un camino de A es una secuencia de nodos nj1,...,njm, tales que nj(i+1) es un nodo hijo de nji.
Ntese que si la GLC G est en FNCH, sus rboles de derivacin son rboles binarios.
Por ejemplo para P={S-->AX, X-->SA, S-->a, A-->a} y para la cadena aaaaa, su rbol de
derivacin es:
Donde la lnea jaspeada indica un camino en el rbol, desde el nodo
raz etiquetado con S hasta un nodo hoja que tiene la etiqueta
Terminal a.
Este camino se lo puede representar as: S-X-S-X-S-a, el cual
evidentemente tiene 6 nodos.
Hay otros caminos, por ejemplo S-A-a, que tiene 3 nodos.
Sin embargo, el camino jaspeado es el camino ms largo, es decir el
que tiene ms nodos, en este rbol de derivacin.
En un rbol de derivacin, no hay necesariamente un nico camino
ms largo. Por ejemplo en este rbol otro camino ms largo es:
S-X-S-X-A-a, que tambin tiene 6 nodos.
En todo caso el(o los) camino(s) ms largo(s) de este rbol tiene(n)
6 nodos.
En particular tambin se puede decir que en este camino ms largo
el jaspeado- la etiqueta X se repite dos veces, y la etiqueta S se
repite tres veces.
Sea G una GLC en FNCH, y A un rbol de derivacin para la derivacin A=>*w, con wT+.
Si A tiene k nodos en su camino ms largo, entonces |w|2k-2.
Demostracin:
Por induccin sobre el nmero de nodos del camino ms largo en A.
Caso base: No puede haber un camino ms largo con slo un nodo que corresponda a una
cadena en T+. As, en el caso base, si el camino ms largo tiene k=2 nodos, eso corresponder
a una derivacin del tipo A=>b, utilizando alguna produccin A-->b. Es claro que |b|22-2=20,
es decir, es cierto que |b|1.
Hiptesis inductiva: El enunciado sigue para k nodos o menos en el camino ms largo de A.
Paso inductivo: Supongamos que A es un rbol de derivacin para A=>*w con k+1 nodos en
su camino ms largo. Como G est en FNCH, el smbolo raz A debe tener dos hijos cuyas
etiquetas denominaremos D y E, que son, a su vez, races de dos subrboles D y E
respectivamente, lo cual podemos graficar en abstracto as:

163
Si denominamos u y v a los productos de D y E es claro que D=>*u, E=>*v, w=uv.
Uno de los (sub)rboles digamos el de u- tiene k nodos en su camino ms largo (pues el
rbol para w tiene k+1 nodos en su camino ms largo), luego -por hiptesis inductiva- |u|2k-2;
el otro (sub)rbol tiene k nodos en su camino ms largo con kk, luego |v|2k-22k-2. Es
decir, |w|=|u||v| 2k-2 +2k-2=2k-1=2(k+1)-2, es decir, |w|2(k+1)-2, que demuestra lo indicado.
Cuando la GLC G no est en FNCH una forma anloga de trabajar es considerar al rbol
como m-ario, donde m es el mximo de nmero de hijos de los nodos.

Poda y expansin
Sea G una GLC y A un rbol de derivacin para A=>*w.
Si A tiene algn camino en el que dos nodos de dicho camino llammosles ni y nj con i<j, es
decir, con nj descendiente de ni- tienen la misma etiqueta X, entonces los subrboles con
nodos raz ni y nj respectivamente son, como ya se sabe, rboles de derivacin en s mismos a
los que denominaremos Ai y Aj.
La operacin de poda consiste en reemplazar Aj en el nodo ni de A.
La operacin de expansin consiste en reemplazar Ai en el nodo nj de A.
El rbol A en abstracto, Poda de A Expansin de A
se han sealado los nodos
n i y nj

Recordemos que w es el producto de A, llamemos t y x a los productos de Ai y Aj, como X es


la etiqueta de sus races, entonces X=>*t y X=>*x; adems como nj es descendiente de ni,
resulta que:
i) t=uxv con u,v(N T)*; u es la subcadena (a la izquierda del producto de Aj) que es la
primera parte del producto de Ai; v es la subcadena (a la derecha del producto de Aj) que es la
ltima parte del producto de Ai; la parte central es obviamente x.

164
ii) w=ytz con y,z(N T)*; y es la subcadena (a la izquierda del producto de Ai) que es la
primera parte del producto de A; z es la subcadena (a la derecha del producto de Ai) que es la
ltima parte del producto de A; la parte central es obviamente t.
iii) w=yuxvz.
El producto del rbol podado es yxz; el producto del rbol expandido es yuuxvvz.
Ntese que si la GLC G est limpia, entonces no hay producciones renombradoras y por tanto
u,v no pueden ser ambas la cadena vaca y por lo tanto |yxz|<|yuxvz|.
Pero si ni es el nodo raz de A entonces y,z son ambas la cadena vaca pues A=Ai y w=t.

Cabeza de la parte derecha (de una produccin)


Denominaremos cabeza de la parte derecha de una produccin en una GLC G al primer
smbolo de dicha parte derecha, por ejemplo en la produccin Z-->BcA la cabeza de la parte
derecha es B.

No Terminales recursivos por izquierda de primer orden y de orden mayor


En una GLC G se dice que el No Terminal X es recursivo por izquierda de primer orden si
existen producciones del tipo X-->X , es decir, que el No Terminal est en la parte izquierda
y sea cabeza de la parte derecha.
Si X es recursivo por izquierda entonces en G es posible dar este paso de derivacin X=>X.
Por ejemplo en el conjunto de producciones P={S-->ZaY,Y-->a,Z-->ZbZZb,Z-->b} la tercera
produccin nos permite decir que Z es un No terminal recursivo por izquierda de primer
orden. En efecto, si empezamos una derivacin en Z obtendremos: Z=>ZbZZb, es decir, en un
paso de derivacin -a partir de Z- este No Terminal reaparece recursivamente como el
primer smbolo de la cadena que emerge (en nuestro caso ZbZZb).
En una GLC G se dice que el No Terminal X es recursivo por izquierda de orden mayor si
existen producciones tales que si realizamos una derivacin ms a la izquierda que empiece en
X, entonces, en dos, tres o ms pasos de derivacin, se deriva una cadena que incluye a X
como primer smbolo.
Por ejemplo con P={S-->XaZ, Z-->b, X-->ZZY, Z-->YbY, Y-->a, Y-->SbbS} se deriva:
S=>XaZ=>ZZYaZ=>YbYZYaZ=>SbbSbYZYaZ
Hemos puesto en negrita lo que nos interesa, que a partir de S en esta derivacin ms a la
izquierda, se obtiene una cadena (SbbSbYZYaZ) cuyo primer smbolo es tambin S. Es decir,
S es un No Terminal recursivo por izquierda de orden mayor.
Lo mismo hubiramos dicho de X por lo siguiente, si empezamos una derivacin en X:
X=>ZZY=>YbYZY=>SbbSbYZY=>XaZbbSbYZY
Con ms detalle, el orden es el (menor) nmero de pasos que se necesitan para que el No
Terminal reaparezca como primer smbolo de una cadena derivada, as X en el ltimo ejemplo
es recursivo por izquierda de cuarto orden.

Lema de bombeo
Sea G una GLC, con |N|=n, limpia y en FNCH. Si wL(G) con |w|2n entonces
i) w = yuxvz w puede descomponerse en cinco subcadenas

165
ii) |uv| > 0 u y v no son simultneamente la cadena vaca
iii) |uxv| 2n
iv) yuixviz L(G) para todo i0
Demostracin:
Sea wL(G) con |w|2n, entonces el rbol de derivacin A para S=>*w tiene en su camino ms
largo n+2 nodos ms. En efecto, si dicho rbol tuviera n+1 nodos (o menos) en su camino
ms largo, entonces por el resultado de arriba con k=n+1 (o menos), |w|2n+1-2, es decir,
|w|2n-1 lo que no coincide con nuestro supuesto de que |w|2n.
As pues, A tiene en su camino ms largo por lo menos n+2 nodos. Lo que quiere decir que:
a) El ltimo nodo de ese camino ms largo es una hoja y tiene como etiqueta un Terminal.
b) Hay n+1 nodos (o ms) -antes del ltimo nodo en ese camino ms largo- etiquetados con
No Terminales. Pero como slo hay n No Terminales entonces alguna etiqueta X se repite.
Recogiendo los resultados vistos en poda y expansin (con A=S):
i) La cadena w puede reescribirse como w=yuxvz, una secuencia de 5 subcadenas (y,u,x,v,z).
ii) Como G est limpia, entonces u,v no pueden ser ambas la cadena vaca, es decir |uv|>0.
iii) Podemos suponer sin prdida de generalidad que el subrbol que empieza en la primera
aparicin de X (con producto t=uxv) tiene los ltimos n+2 nodos del camino ms largo de A,
esto es suficiente para que exista la repeticin de la etiqueta X pues sin contar el nodo hoja-
slo hay |N|=n No Terminales para los n+1 nodos restantes; este supuesto es posible porque el
rbol A tiene -en su camino ms largo- n+2 nodos o ms: luego, por el resultado para la
longitud del producto en un camino ms largo, |uxv|2(n+2)-2, es decir, |uxv|2n.
iv) La derivacin de w=yuxvz a partir de S se puede representar legtimamente as:
S=>*yXz=>*yuXvz=>*yuxvz
Donde se han usado las dos derivaciones lcitas:
a) X=>*t que la hemos desglosado como X=>*uXv=>*uxv
b) X=>*x
Pero entonces tambin es posible derivar S=>*yXz=>*yxz (es decir, la poda de A).
Y tambin, S=>*yXz=>*yuXvz=>*yuuXvvz=>*yuuxvvz (es decir, la expansin de A).
Pero se puede expandir la expansin de A, es decir:
S=>*yXz=>*yuXvz=>*yuuXvvz=>*yuuuXvvvz=>yuuuxvvvz tambin se puede derivar.
Y as sucesivamente muchas veces, de manera que se puede derivar en general:
S=>*yuiXviz=>yuixviz, es decir, yuixviz L(G) para todo i0.
Algunas veces este lema se enuncia as:
Sea la GLC G, con |N|=n y limpia. Existe un entero e tal que si wL(G) con |w|e entonces
i) w = yuxvz w puede descomponerse en cinco subcadenas
ii) |uv| > 0 u y v no son simultneamente la cadena vaca
iii) |uxv| e
iv) yuixviz L(G) para todo i0
La demostracin es la misma suponiendo sin prdida de generalidad- que G est en FNCH y
haciendo e=2n.

166
El lema de Ogden
Es una versin ms fuerte que el lema de bombeo; en vez de trabajar con toda la cadena w,
limita nuestro foco de atencin a alguna porcin que marcamos de w (por ejemplo en la
cadena w=aaabbccdd la parte marcada est en negrita).
Sea la GLC G, con |N|=n y limpia. Existe un entero e tal que si wL(G) y marcamos por lo
menos e smbolos de w entonces
i) w = yuxvz w puede descomponerse en cinco subcadenas
ii) x contiene algn smbolo marcado
iii) u y v no son simultneamente libres de smbolos marcados (u.v tiene por lo menos uno)
iv) uxv tiene a lo mse smbolos marcados
v) yuixviz L(G) para todo i0
Demostracin:
Supongamos sin prdida de generalidad- que G est en FNCH, hagamos e=2n+1 y para
wL(G) marquemos e smbolos de w. Sea A el rbol de derivacin para S=>*w.
Basaremos todo en la nocin de nodo-r. Un nodo-r (nodo de ramificacin) es aquel cuyos dos
hijos tienen smbolos marcados en sus productos.
Construiremos un camino-r (es decir, un camino donde se sealan los nodos-r) empezando
con un nodo interior cualquiera as:
Sea n el ltimo nodo aadido al camino-r.
Proceso:
Si n es hoja, terminamos.
Si n tiene dos hijos ni,nj los cuales tienen ambos- smbolos marcados en sus productos,
selese a n como nodo-r y adase al camino-r el hijo con el mayor nmero de smbolos
marcados en su producto digamos nj-. Reptase el proceso con nj.
Si n tiene dos hijos ni,nj de los cuales slo uno de ellos tiene por lo menos un smbolo
marcado en su producto -digamos ni-, adase ni al camino (ntese que no se seala a ni como
nodo-r). Reptase el proceso con ni.
Denotaremos a un camino-r poniendo en secuencia sus nodos as ni1-...-nih., donde se suponen
sealados los nodos-r.
Como resultado trabajaremos con caminos-r que incluyen nodos-r y probaremos que si un
camino-r construido como se indica arriba contiene q nodos-r entonces ni1 tiene a lo ms 2q
smbolos marcados en su producto.
Demostracin:
Por induccin sobre el nmero de nodos-r del camino-r.
Caso base: El camino-r tiene (q=)1 nodo-r. Llamemos nk a dicho nodo-r. Es claro que todos
los descendientes (hijos, nietos, etc.) de nk no son nodos-r.
Para ser un nodo-r, los dos hijos de nk tienen por lo menos un smbolo marcado en sus
productos, es decir, hay por lo menos 2=21=2q smbolo marcados.
No pueden haber ms smbolo marcados, si ello sucediera uno de los hijos de nk tendra no
uno sino por los menos dos smbolos marcados en su producto, estos dos smbolos marcados
tendran que estar en dos nodos hoja, como el rbol es binario estos dos nodos hoja deben
tener un ascendiente (padre, abuelo, etc.) en comn (descendiente de nk), que por lo tanto

167
debera ser un nodo-r, pero slo hay un nodo-r que es nk. Luego, hay a lo ms 2q smbolos
marcados.
Hiptesis inductiva: El enunciado es cierto cuando el camino-r tiene q nodos-r.
Paso inductivo: Sea que el camino-r ni1-ni2-...-nih tiene q+1 nodos-r. Hay dos posibilidades,
que ni1 sea un nodo-r o no lo sea.
a) Si ni1 es un nodo-r, entonces hay q nodos-r en el camino ni2-...-nih, por hiptesis inductiva el
producto del subrbol con raz en ni2 tiene a los ms 2q smbolo marcados. Pero ni2 fue elegido
(al sealar ni1 como nodo-r) porque tiene el mayor nmero de smbolos marcados en su
producto; ni2 es uno de los dos hijos de ni1, por lo tanto el otro hijo de ni1 tiene igualmente- a
lo ms 2q smbolo marcados en su producto. Luego ni1 tiene a lo ms 2q+2q=2q+1 smbolos
marcados en su producto.
b) Si ni1 no es un nodo-r, entonces trabajamos con ni2, ntese que el otro hijo de ni1 no tiene
de acuerdo a nuestra construccin- smbolos marcados en su producto; si ni2 no es un nodo-r,
entonces trabajamos con ni3, etc., hasta tener un nodo-r nij, luego realizamos un razonamiento
anlogo al inciso b, con ni(j+1) en lugar de ni2.
Lo que prueba el resultado previo. Continuemos con el lema de Ogden:
Recuerde que A es el rbol de derivacin para S=>*w y que se marcan e=2n+1 smbolos de w.
Si construimos un camino-r cuyo primer nodo es el nodo raz etiquetado con S hasta un nodo
hoja en A y denotamos a dicho camino por ni1-ni2-...-nih, dicho camino-r debe tener por lo
menos n+1 nodos-r, pues si tuviera n nodos-r o menos, por el resultado anterior, el producto w
de ni1 tendra a lo ms 2n smbolos marcados, lo que no coincide con nuestro supuesto.
As pues en ese camino-r con n+1 nodos-r y con slo |N|=n No Terminales alguna etiqueta X
se repite.
Elijamos exactamente n+1 nodos-r (de dicho camino) lo ms abajo posible, por ejemplo de
una hoja marcada hacia arriba. Sea ni el nodo-r con la primera aparicin de X, y sea nj el
nodo-r con la segunda aparicin de X, luego todo el tratamiento visto en el lema de bombeo
puede repetirse aqu bsicamente. Es decir,
i) w = yuxvz w puede descomponerse en cinco subcadenas
El producto de nj es x. El producto de ni es uxv.
ii) Dado que nj es un nodo-r, su producto x contiene algn smbolo marcado.
iii) Sabemos que ni es un nodo-r, que nj es un nodo-r descendiente de ni y que el producto de
ni es uxv. Como ni es un nodo-r sus dos hijos tienen smbolos marcados en sus productos,
digamos que su hijo izquierdo ha sido elegido para ser parte del camino-r, en este caso su hijo
derecho tiene un producto que es parte de v, que por lo dicho- tiene smbolos marcados. Si su
hijo derecho es el elegido entonces u tiene smbolos marcados. Luego,
u y v no son simultneamente libres de smbolos marcados.
iv) Hemos elegido los n+1 nodos-r lo ms abajo posible, luego el camino-r que empieza en ni
(cuyo producto es uxv) que tiene n+1 nodos-r, por el resultado previo, tiene a lo ms 2n+1
smbolos marcados. Es decir, uxv tiene a lo mse smbolos marcados.
v) La derivacin de w=yuxvz a partir de S se puede representar legtimamente as:
S=>*yXz=>*yuXvz=>*yuxvz, donde se han usado las dos derivaciones lcitas:
a) X=>*uXv=>*uxv, b) X=>*x , luego yuixviz L(G) para todo i0.

168
CAPTULO 9. AUTMATAS DE PILA (AP)

Adems de los estados K y los alfabetos N y T, los APs aaden una estructura de datos que
servir como memoria: la pila. Hay una variedad de ellos, los ms conocidos son los
Autmatas de Pila por pila vaca (AP) y los Autmatas de Pila por estado final (APe.f.)

AUTMATAS DE PILA POR PILA VACA (AP)


Formalmente un Autmata de Pila (AP) se define as:
A = ( K, , , q0, Z, F ) donde
K : conjunto finito no vaco de estados
: alfabeto de entrada
: alfabeto de la pila
: funcin de transicin, se define as : K X ( {}) X ---> 2(K X )
q0 : estado inicial del AP q0K
Z: smbolo inicial de la pila Z
F : conjunto de estados finales, genricamente FK, pero en un AP F=

Ejemplo:
La apariencia del AP A=({q0,q1},{a,b},{Z,X},,q0, Z,{}) es as.

(q0,a,Z)={(q0,XZ)}
(q0,a,X)={(q0,XX)}
(q0,b,X)={(q1,)}
(q1,b,X)={(q1,)}
(q1,,Z)={(q2,)}

Entre las llaves es posible que hayan varios pares en vez de uno (por ejemplo podra haber
otro AP con una regla de transicin as (q0,a,X) = {(q0,XX), (q1,XZ), (q2,)) o ninguno (las
reglas de transicin que lleguen al conjunto vaco no se escriben).
Nosotros usaremos a veces q0 para el estado inicial, a veces q1 y a veces cualquier otro
nombre, esto no debe causar confusin siempre que se indique cul es el estado inicial.

Descripciones instantneas para AP


Los AP tienen sus descripciones instantneas de las cuales nos valdremos para mostrar el
mecanismo de funcionamiento.
Una descripcin instantnea (d.i.) para un AP es una tripleta (qi,u,), donde
. qi es el estado actual
. u es una cadena (el sufijo de la cadena de entrada que an no se ha ledo/consumido)
. es el contenido de toda la pila, es decir, es una cadena que leda de izquierda a derecha nos
describe lo que est en la pila del AP de arriba hacia abajo.

169
Un AP siempre empieza su funcionamiento en el estado inicial y con la pila conteniendo
nicamente su smbolo inicial, de manera que si alimentamos al AP con la entrada u al
principio la d.i. inicial ser (q0,u,), fjese como el tercer componente describe la pila
conteniendo slo Z, por ejemplo si u=aaabbb, la d.i. inicial es (q0,aaabbb,).

Movimientos
Indicaremos con el smbolo |-- el hecho de que un AP d un movimiento, que es con el que
pasamos de una d.i. a otra d.i. (|-- no es sino el nombre de una relacin entre d.i.s).
En los APs hay una especie de control avanzado sobre la cinta de entrada de manera que no
es necesario consumir un smbolo de entrada para dar un movimiento. El cambio de estado -y
lo que le sucede a la pila- depende (adems del estado actual y, tal vez, del smbolo que
estamos leyendo en la entrada) del contenido de la pila, especficamente del smbolo en el
tope de la pila.
Los movimientos son bsicamente de dos tipos:
i) Movimiento tipo 1
Sean (qi,aw,X) y (qj,w,) dos d.i. con *, X a w*, qi,qjK; escribiremos
(qi,aw,X) |-- (qj,w,) si (qj,)(qi,a,X)
Y diremos que hemos dado un movimiento tipo 1 (aquel donde se usa una regla de transicin
con un smbolo diferente de como segundo elemento de la preimagen, que hemos resaltado
en negrita), por ejemplo (q0,a,X)={(q0,XX)} (q1,a,X)={(q1,)}.
Para realizar un movimiento utilizando esta regla de transicin es necesario que el estado
actual sea qi, estar analizando/leyendo una a en la cadena de entrada y tener en el tope de la
pila una X. Cuando el AP da un movimiento tipo 1 pasa lo siguiente:
Consume el smbolo a de la entrada y la cabeza lectora avanza un smbolo a la derecha en la
cinta de entrada (es claro que si hay ms de un par de imgenes entre llaves se tiene que hacer
una eleccin de qu par utilizar, genricamente se elige (qj,)); el estado actual cambia a qj; y
el tope de la pila X se reemplaza por (hay quien explica esto diciendo que el AP saca X de la
pila colocando en su lugar).
Por ejemplo, con la transicin (q1,a,X)={(q2,YY)} y la d.i. (q1,abbab,XZ), el siguiente
movimiento tipo 1 es posible: (q1,abbab,XZ)|--(q2,bbab,YYZ).
Fjese que el estado actual cambia de q1 a q2; que se ha consumido a de manera que lo que
queda por analizar de la cadena de entrada es bbab; que en la pila el tope X se reemplaza por
YY; y lo que estaba debajo del tope (Z en nuestro caso) se mantiene tal cual.
ii) Movimiento tipo 2 -movimiento
Sean (qi,w,X) y (qj,w,) dos d.i. con *, X w*, qi,qjK; escribiremos
(qi,w,X) |-- (qj,w,) si (qj,)(qi,,X)
Y diremos que hemos dado un movimiento tipo 2 o un -movimiento (aquel donde se usa una
regla de transicin con como segundo elemento de la preimagen, que hemos resaltado en
negrita), por ejemplo (q0,,X)={(q0,XX)} (q1,,X)={(q1,)}.
Para realizar un movimiento utilizando esta regla de transicin es necesario que el estado
actual sea qi y tener en el tope de la pila una X.

170
Ntese que no interesa qu se est analizando/leyendo en la cinta de entrada. Cuando el AP da
un movimiento tipo 2 pasa lo siguiente:
No se consume ningn smbolo en la entrada, es como si el AP ni siquiera se fijara la cinta de
entrada y la cabeza lectora se queda esttica donde estaba (es claro que si hay ms de un par
de imgenes entre llaves se tiene que hacer una eleccin de qu par utilizar, genricamente se
elige (qj,)); el estado actual cambia a qj; y el tope de la pila X se reemplaza por .
Por ejemplo, con la transicin (q2,,X)={(q2,YX)} y la d.i. (q2,abbaa,XXZ), el siguiente
movimiento tipo 2 es posible: (q2,abbaa,XXZ) |-- (q2,abbaa,YXXZ).
Fjese que el estado actual cambia de q2 a q2; que se consume nada en la cadena de entrada;
que en la pila el tope X se reemplaza por YX; y lo que estaba debajo del tope (XZ en nuestro
caso) se mantiene tal cual.
Este movimiento de tipo 2 permite que el AP manipule la pila sin leer smbolos de entrada.
En cualquiera de los dos tipos de movimiento, es posible que utilicemos alguna imagen
donde =, en este caso se sustituye el tope X por , que en realidad significa que extraemos
el tope X de la pila sin introducir nada en su lugar (denominada a veces operacin pop).
Por ejemplo, con la transicin (q2,,X)={(q2, )} y la d.i. (q2,abb,XYZ) el siguiente
movimiento tipo 2 es posible: (q2,abb,XYZ)|--(q2,abb,YZ).
Fjese que el estado actual cambia de q2 a q2; que se no se consume nada en la cadena de
entrada; que en la pila el tope X se extrae; y lo que estaba debajo del tope (YZ en nuestro
caso) se mantiene tal cual.
|--* no es otra cosa que la clausura reflexiva transitiva de |--.

Funcionamiento de un AP
Un AP empieza su trabajo en la d.i. inicial y empieza a dar movimientos.
Cuando ocurra que un AP termine de consumir toda su cadena de entrada, ello se denota con
como segundo elemento de una d.i. -genricamente (qi,,)- en especial si la cadena de
entrada es la cadena vaca ello ocurre desde la d.i. inicial.
Cuando ocurra que un AP vace su pila, ello se denota con como tercer elemento de una d.i.
-genricamente (qi,w,.
Es posible que ambas cosas ocurran a la vez, consumir toda la entrada y vaciar la pila, lo que
se denotar as (qi,,.

Ejemplo:
Recordemos -y enumeremos- las reglas de transicin de nuestro ejemplo
(q0,a,Z)={(q0,XZ)}
2) (q0,a,X)={(q0,XX)}
3) (q0,b,X)={(q1,)}
4) (q1,b,X)={(q1,)}
5) (q1,,Z)={(q2,)}
Empecemos a describir el funcionamiento de este AP con la cadena de entrada
w=aaabbb:

171
(q0,aaabbb,) d.i. inicial
|--(q0,aabbb,X) movimiento tipo 1, por la regla 1
|--(q0,abbb,XX) movimiento tipo 1, por la regla 2
|--(q0,bbb,XXX) movimiento tipo 1, por la regla 2
|--(q1,bb,XX) movimiento tipo 1, por la regla 3
|--(q1,b,X) movimiento tipo 1, por la regla 4
|--(q1,,) movimiento tipo 1, por la regla 4 (se ha consumido toda la entrada)
|--(q2,,) movimiento tipo 2, por la regla 5 (se ha vaciado la pila)
Como sabemos, ello puede resumirse as: (q0,aaabbb,)|--*(q2,,).

T(A) lenguaje aceptado por un AP


En un APse dice que una cadena de entrada w ha sido aceptada si a partir de la d.i. inicial
podemos llegar a una d.i. del tipo (qj,,) con qjK, es decir, si (q0,w,)|--*(qj,,), en nuestro
ejemplo la cadena aaabbb s es aceptada.
Si hay ms de un movimiento posible en una d.i. dada entonces debemos agotar todas,
absolutamente todas, las transiciones posibles para averiguar si la cadena de entrada es o no
aceptada, es decir, para decidir si una cadena es aceptada o no debemos analizar todos los
caminos posibles del rbol de movimientos dibujado para la cadena de entrada -mental o
explcitamente-.
Por ejemplo, con la regla de transicin (q0,a,Z)={(q0,Z),(q1,) y con la d.i. q0,a,el AP
puede dar:
--q0,, movimiento tipo 1, por el primer par de la regla (camino 1)

q0,a,
\
-- q1, movimiento tipo 1, por el segundo par de la regla (camino 2)
Este corto ejemplo es ms bien simple, podemos imaginar APs con muchas reglas de
transicin tales que para una cadena de entrada tengan muchos caminos de movimientos
alternativos.
El conjunto de todas las cadenas aceptadas por el AP se denota por T(A) y es el lenguaje
aceptado por el AP. Formalmente T(A)={uq0,u,|--*(qj,,) qjK}.
En los AP no siempre se vaca la pila para la cadena de entrada, ni tampoco se consume
siempre toda la cadena pues, siguiendo cierto camino del rbol de movimientos, es posible
que el autmata ya no puede dar ninguno, el caso extremo de esto es que el AP no pueda dar
siquiera un movimiento, en estos casos hay quienes utilizan la expresin el autmata est
bloqueado o el autmata se tranca; tambin es posible que el autmata d movimientos
repetitivos sin llegar a ninguna parte.
Por ejemplo en el AP de arriba q0,abb,--q0,bb,X--q1,b,--q2,b,de modo que la
entrada abb no se acepta pues el APya no puede dar ms movimientos.
Como otro ejemplo aqu est un AP que puede girar en ciclos infinitos sin aceptar nada:
A=({q0,q1},{a},{Z,X},,q0, Z,{})

172

(q0,,Z)={(q1,XZ)}
(q1,,X)={(q0,)}
Donde es posible (q0,a,--q1,a,X--q0,a,--q1,a,X--q0,a,--q1,a,X--

Representacin grfica
Aunque es menos frecuente hay quienes utilizan la siguiente representacin grfica para APs:
Cada estado es un nodo.
Si el par (qj,)(qi,c,X) con c({}), se dibuja un arco de qi a qj etiquetado con [c,X; ]

Ms ejemplos de APs:
El siguiente AP acepta T(A)={aibi / i>0}
A=({q0,q1,q2},{a,b},{Z,X},,q0,Z,{})
(q0,a,Z)={(q0,XZ)}
(q0,a,X)={(q0,XX)}
(q0,b,X)={(q1,)}
(q1,b,X)={(q1,)}
(q1,,Z)={(q2,)}

El siguiente AP acepta tambin T(A)={aibi / i>0}


Fjese como Z slo sirve para empezar a trabajar con el AP y luego desaparece de escena:
A=({q0,q1},{a,b},{Z,X},,q0,Z,{})
(q0,a,Z)={(q0,X)}
(q0,a,X)={(q0,XX)}
(q0,b,X)={(q1,)}
(q1,b,X)={(q1,)}

El siguiente AP acepta tambin T(A)={aibi / i>0}


Fjese como trabajan los dos pares de la ltima regla en este AP, para i>1 si elegimos una el
AP puede bloquearse sin aceptar cadenas -ya no se mueve de q2- y si elegimos la otra las
cadenas en T(A) se aceptan:
A=({q0,q1,q2},{a,b},{Z,X},,q0,Z,{})
(q0,a,Z)={(q0,X)}
(q0,a,X)={(q0,XX)}
(q0,b,X)={(q1,)}
(q1,b,X)={(q1,),(q2,)}

173
El siguiente AP acepta T(A)={aibib / i0}
Fjese como Z puede usarse incluso en el centro y el tope de la pila.
A=({q0,q1},{a,b},{Z},,q0,Z,{})
(q0,a,Z)={(q0,ZZ)}
(q0,b,Z)={(q1,)}
(q1,b,Z)={(q1,)}

El siguiente AP -un clsico- acepta T(A)={ wcwR / w{a,b}* }


A=({q0,q1},{a,b,c},{Z,A,B},,q0,Z,{})
(q0,c,Z)={(q0,)}
(q0,a,Z)={(q0,A)}
(q0,b,Z)={(q0,B)}
(q0,a,A)={(q0,AA)}
(q0,b,B)={(q0,BB)}
(q0,a,B)={(q0,AB)}
(q0,b,A)={(q0,BA)}
(q0,c,A)={(q1,A)}
(q0,c,B)={(q1,B)}
(q1,a,A)={(q1,)}
(q1,b,B)={(q1,)}

Toma de posicin, necesidades y errores comunes


Ya advertimos que en ciertos casos hay que tomar posicin. Algunos elementos que aqu
presentamos como errores pueden ser aceptados por otras definiciones de APs o por variantes
ms flexibles, sin embargo, nuestra definicin es muy comn.
Utilizar la regla (q0,a,XZ)={(q0,Z) para que se de un movimiento si la pila tiene XZ en el
tope, o peor, si el contenido de la pila es XZ no est de acuerdo con nuestra definicin que
slo acepta preguntar por un smbolo en el tope y por lo tanto es un error.
Utilizar la regla (q0,a,X)={(q0,) para que se extraigan tres elementos de la pila no est
de acuerdo con nuestra definicin que slo permite extraer un smbolo de la pila, el del tope.
Utilizar la regla (q0,a,)={(q0,Z) para que se de un movimiento independientemente de lo
que tenga la pila en el tope, o para preguntar si la pila est vaca es un error pues nuestra
definicin exige preguntar por el tope de la pila.
Ms que un error es un exagerado respeto a Z el smbolo inicial de la pila, si bien un AP
empieza con slo este smbolo en su pila, no hay ninguna razn para cambiarlo en el primer
movimiento, o para que aparezca -ms tarde- al centro o en el tope de la pila, inclusive varias
veces, por ejemplo la siguiente regla de transicin es buena (q0,a,Z)={(q0,ZXXZZYY).
Aunque no lo subrayamos trabajaremos con el hecho de que ()=, otra literatura no hace
esta distincin; de igual manera hay quienes aceptan preguntar por un smbolo especial que
denota pila vaca, que no es otra cosa que consultar si la pila est vaca o notaciones
particulares tales como (qi,,)={(qj,)} en vez de X (qi,,X)={(qj,X)}.

174
En este como en otros casos, sin embargo, es posible con nuestra definicin- escribir APs de
manera que satisfagan las necesidades que se tengan, utilizando por ejemplo Z como marca de
pila vaca, o bien recurriendo a varios estados y/o reglas auxiliares para efectuar ciertos
movimientos complejos:
Por ejemplo, una necesidad comn es, dado un smbolo b en la cinta (o bien para ignorar la
cinta) y otro X en el tope de la pila, pasar de un estado qi a otro qj extrayendo no slo X sino
otros smbolos digamos dos en total, no es difcil generalizar ello-. Podemos hacerlo as,
donde qa denota un estado auxiliar:
(qi,b,X)={(qa,)}
(qa,,Y)={(qj,)} si Y es el segundo smbolo a extraer, o bien
Y(qa,,Y)={(qj,)} o bien otra expresiones del tipo Y-{X}, etc.
As las reglas (qi,b,X)={(qa,)} y (qa,,X)={(qj,)} permiten extraer dos Xs por cada b.
Otra necesidad comn es extraer una X del tope de la pila por cada dos bs, lo hacemos con
(qi,b,X)={(qa,X)} y (qa,b,X)={(qj,)}.
Otra necesidad comn es aadir una X al tope de la pila por cada dos bs, lo hacemos con
(qi,b,Y)={(qa,Y)} y (qa,b,Y)={(qj,XY}.
Otra necesidad comn es aadir dos Xs al tope de la pila por cada b, lo hacemos con
(qi,b,Y)={(qa,XY)} y (qa,,X)={(qj,XX}.
Insistimos en que se trabajan dos smbolos por simplicidad y espacio, las mismas reglas dan
idea de cmo generalizar ello a ms smbolos.

AUTMATAS DE PILA POR ESTADO FINAL (APe.f.)


La definicin de los APe.f. es anloga a la de los AP, as como la idea de movimientos,
descripciones instantneas, etc.
La diferencia est en que el conjunto de estados finales F no es vaco y en las condiciones
bajo las cuales una cadena es aceptada.

T(A) lenguaje aceptado por un APe.f.


En un APe.f.una cadena de entrada w es aceptada si q0,w,|--*(qj,,) qjF, .
El conjunto de todas las cadenas aceptadas por el APe.f. A se denota por T(A), el lenguaje
aceptado por A, formalmente T(A)={ wq0,w,|--*(qj,,) qjF, }.
Ntese que no es necesario que la pila est vaca puede estar vaca o no-, representa el
contenido de la pila, sea cual fuere.

Ejemplo:
El siguiente APe.f. A=({q0,q1,q2},{a,b},{Z,X},,q0,Z,{q2}) acepta T(A)={aibi / i>0}
(q0,a,Z)={(q0,XZ)}
(q0,a,X)={(q0,XX)}
(q0,b,X)={(q1,)}
(q1,b,X)={(q1,)}
(q1,,Z)={(q2,XXX)}

175
Ntese que cuando este APe.f. acepta las cadenas de entrada, la pila no se vacia.

El siguiente APe.f. acepta tambin T(A)={aibi / i>0}


A=({q0,q1,q2},{a,b},{Z,X},,q0,Z,{q2})
(q0,a,Z)={(q0,XZ)}
(q0,a,X)={(q0,XX)}
(q0,b,X)={(q1,)}
(q1,b,X)={(q1,)}
(q1,,Z)={(q2,)}
Ntese que cuando este APe.f. acepta las cadenas de entrada, la pila se vacia.

No Determinismo
El siguiente AP acepta T(A)={ wwR / w{a,b}* }
A=({q0,q1},{a,b},{Z,A,B},,q0,Z,{})
(q0,a,Z)={(q0,A)}
(q0,b,Z) ={(q0,B)}
(q0,a,A)={(q0,AA),(q1,)}
(q0,b,B)={(q0,BB),(q1,)}
(q0,a,B)={(q0,AB)}
(q0,b,A)={(q0,BA)}
(q1,a,A)={(q1,)}
(q1,b,B)={(q1,)}

El siguiente AP acepta T(A)={ w{a,b}* / w es palndrome}


A=({q0,q1},{a,b},{Z,A,B},,q0,Z,{})
(q0,,Z) ={(q1,)}
(q0,a,Z)={(q0,A),(q1,)}
(q0,b,Z) ={(q0,B),(q1,)}
(q0,a,A)={(q0,AA),(q1,A),(q1,)}
(q0,b,B)={(q0,BB),(q1,B),(q1,)}
(q0,a,B)={(q0,AB),(q1,B)}
(q0,b,A)={(q0,BA),(q1,A)}
(q1,a,A)={(q1,)}
(q1,b,B)={(q1,)}

En el segundo AP |(q0,a,Z)+(q0,,Z)|3. Ms genricamente los ejemplos anteriores son


tales que, por lo menos para algn qi y para algn X, |(qi,a,X)+(qi,,X)|>1. Es decir, en
algn momento para una d.i. dada es posible dar ms de un movimiento. A los APs de este
tipo (por estado final o por pila vaca) se les llama No Determinsticos. Inversamente si un AP
(por estado final o por pila vaca) es tal que a lo ms un movimiento es posible para cada d.i.,
es decir, |(qi,a,X)+(qi,,X)|1, se denomina Determinstico.

176
A los lenguajes aceptados por APs (por estado final o por pila vaca) los denominaremos
tambin lenguajes libres de contexto. Un lenguaje aceptado por un AP Determinstico se
denomina lenguaje libre de contexto determinstico.

Ejemplos:
Para L={ w{a,b}* / Na(w)>Nb(w) }
Los siguientes APe.f aceptan L
APe.f No Determinstico APe.f Determinstico
A=({q0,q1,q2,qf},{a,b},{Z,A,B},,q0,Z,{qf}) A=({q0,qf},{a,b},{Z,A,B},,q0,Z,{qf})

(q0,a,Z)={(q1,AZ)} (q0,a,Z)={(qf,Z)}
(q1,a,A)={(q1,AA)} (qf,a,Z)={(qf,AZ)}
(q1,b,A)={(q1,)} (qf,a,A)={(qf,AA)}
(q1,b,Z)={(q2,BZ)} (qf,b,A)={(qf,)}
(q1,a,Z)={(q1,AZ)} (qf,b,Z)={(q0,Z)}
(q0,b,Z)={(q2,BZ)} (q0,b,Z)={(q0,BZ)}
(q2,b,B)={(q2,BB)} (q0,b,B)={(q0,BB)}
(q2,a,B)={(q2,)} (q0,a,B)={(q0,)}
(q2,a,Z)={(q1,AZ)}
(q2,b,Z)={(q2,BZ)}
(q1,,A)={(qf,)}
Sin embargo, a diferencia de lo que sucede con los AFs los APs No Determinsticos no son
equivalentes a los Determinsticos, es decir, hay lenguajes que son aceptados por AP No
Determinsticos para los cuales no existe ningn AP Determinstico que los acepte.

Ejemplo:
El siguiente AP No Determinstico acepta L=T(A)={aibi / i>0} {aib2i / i>0}
A=({q0},{a,b},{Z,Y,W,B},,q0,Z,{})

(q0,a,Z)={(q0,WB),(q0,B),(q0,BB),(q0,YBB)}
(q0,a,W)={(q0,WB),(q0,B)}
(q0,a,Y)={(q0,YBB),(q0,BB)}
(q0,b,B)={(q0,)}

Sin embargo, probaremos que no existe ningn APe.f. Determinstico que acepte L.
Demostracin:
Supongamos que s existe un APe.f. Determinstico A1=(K1,{a,b},,1,q0,Z,F1) tal que
T(A1)=L con K1={q0,...,qm}.
Construimos otro APe.f. A2=(K2,{a,b},,2,p0,Z,F2) tal que T(A2)=L con K2={p0,...,pm}.
La idea es que A2 sea un clon de A1 difiriendo solamente en los nombres de los estados.
A partir de A1 y A2 construiremos otro APe.f. A as.

177
El conjunto de estados de A es (K1K2).
El estado inicial de A es q0.
El conjunto de estados finales de A es F2.
El alfabeto de A es {a,b,c}.
Es claro que tanto en 1 como en 2 cada regla tiene a lo ms un par de llegada, pues A1 y A2
son determinsticos.
Las reglas de transicin de A prcticamente se copian de 1 y 2 obviamente quitando el
subndice- con los siguientes cambios:
i) Si 1(qi,d,X)={(qj,)} est en 1 -con qiF1, d{a,b,}, X- se elimina (qj,) y en su
lugar colocamos(pj,), es decir, aadimos (qi,d,X)={(pj,)} a .
ii) Si 2(pi,b,X)={(pj,)} est en 2 -con piK2, X- en lugar de dicha regla aadimos
(pi,c,X)= {(pj,)}, es decir, las reglas con b de A2 se copian colocando en lugar de b el
smbolo c.
iii) Todas las otras reglas de 1 y 2 se copian.
Una vez que tenemos las reglas de efectuamos en - el siguiente cambio:
iv) Si (ri,b,X)={(pj,)} est en -con ri(K1K2), pjK2, X- se elimina dicha regla y en
su lugar colocamos (ri,c,X)={(pj,)}. Ntese que primero debe seguirse el inciso i, mismo
que influye en este inciso iv.
Analicemos qu hace este nuevo APe.f. A:
Se sabe que A1 acepta {aibi / i>0}{aib2i / i>0}, en particular acepta cadenas en {aibi / i>0}.
Al aceptar una cadena del tipo aibi, A1 siempre acaba en el mismo estado final, pues es
determinista.
Se sabe que A2 acepta {aibi / i>0}{aib2i / i>0}, en particular acepta cadenas en {aib2i / i>0}.
Si en la cinta de entrada de A est una cadena w=aibici, en principio se comportar como A1 y
luego de consumir la subcadena aibi de w (est en negrita para que se note) el autmata A
estar en un estado qi que era de aceptacin en A1 (qiF1) pues A1 acepta cadenas del tipo aibi;
a partir de ah, por el inciso i primero y por el inciso iv luego, con la primera c el autmata A
ir a un estado que era de A2, luego se comportar como A2 con la novedad que las bs ahora
estn cambiadas por cs- y, como A2 acepta cadenas del tipo aib2i, terminar consumiendo las
ltimas cs de w y aceptando esta cadena.
Por otro lado, A no puede aceptar otras cadenas que no sean del tipo aibici pues para ir de la
parte que era A1 a la parte que es A2 (que tiene los estados finales) debemos situarnos en un
estado que era final en A1, eso slo sucede si contamos con una subcadena inicial tipo aibi;
luego por el inciso i- necesariamente vamos a la parte que era A2, pero eso sucede slo con el
smbolo b cambiado por c por el inciso iv, una vez ah, para aceptar alguna cadena la parte
que era A2 requiere tantas cs como sean necesarias para alcanzar un tipo de cadena semejante
a aibici, pues A2 es clon de A1, es decir acepta cadenas del tipo aib2i=aibibi que con las bs
cambiadas por cs resultan en aibici.
Es decir, A es tal que T(A)={aibici / i>0}, luego este lenguaje es libre de contexto. Pero al final
del subsiguiente captulo probaremos que este lenguaje no es libre de contexto. Esta
contradiccin muestra que nuestro supuesto est equivocado y que no hay ningn APe.f.
Determinstico que acepte L={aibi / i>0}{aib2i / i>0}.

178
En el siguiente captulo veremos que si no hay un APe.f. Determinstico que acepte L,
entonces tampoco hay un AP Determinstico que acepte L.

Para el prximo ejemplo tmese en cuenta que en el siguiente captulo probaremos que:
i) Dada una GLC G es posible construir un AP A (generalmente No Determinstico, como es
el caso de la GLC del ejemplo) tal que L(G)=T(A).
ii) Los lenguajes libres de contexto determinsticos son cerrados respecto de la operacin de
complemento.
iii) La interseccin de un lenguaje libre de contexto con un lenguaje regular es un lenguaje
libre de contexto.
La siguiente GLC G y el AP No Determinstico A construido a partir de ella, son tales que
L1=L(G)=T(A)={aibjck / ij ik}.
G=({S,S1,S2,Z1,Z2,A,B,C,Z,},{a,b,c},P,S)
P:
S-->S1 S-->S2
S1-->Z S2-->aS2c
S1-->ZC S2-->A
Z-->aZb S2-->AB
Z-->A S2-->C
Z-->B S2-->BC
A-->aA C-->cC
A-->a C-->c
B-->Bb
B-->b
Sin embargo, probaremos que no existe ningn APe.f. Determinstico que acepte L1.
Demostracin:
Supongamos que s existe un APe.f. Determinstico A1=(K1,{a,b,c},,1,q0,Z,F1) tal que
T(A1)=L1.
Denominaremos L2 al complemento de L1, luego L2 es libre de contexto determinstico.
Se sabe que L3={aibjck / i,j,k0 } es regular (la e.r. r=aa*bb*cc* es tal que L(r)=L3).
Luego, L=(L2 L3) es un lenguaje libre de contexto.
Pero qu es L. El complemento de L1 puede caracterizarse as,
L2 = {aibjck / i=j i=k}R = {aibici / i0}R, donde R contiene el resto de las cadenas de L2,
por ejemplo las que empiecen con c, etc.
L=(L3 L2)={aibjck / i,j,k0} ({aibici / i0}R)={aibici / i>0} que como dijimos resulta libre
de contexto. Pero al final del subsiguiente captulo probaremos que este lenguaje no es libre
de contexto. Esta contradiccin muestra que nuestro supuesto est equivocado y que no hay
ningn APe.f. Determinstico que acepte {aibjck / ij ik}.
Ya dijimos que si no hay un APe.f. Determinstico que acepte L1, entonces tampoco hay un
AP Determinstico que acepte L1.

179
CAPTULO 10. CONVERSIONES GENRICAS: el caso libre de contexto

Construccin de una GLC limpia a partir de otra GLC cualquiera: limpieza de GLCs
Si se trabaja con la GLC G tal que L(G)= -cosa que se puede decidir como veremos en el
prximo captulo-, entonces el resultado de limpiar G ser una especial GLC cannica
G={{S},{a},{S-->aS},S} que es tal que L(G)=. Si bien S es intil en esta GLC,
recurriremos a esta convencin.
i) Eliminacin de producciones renombradoras (A-->B):
Sea G una GLC tal que L(G), entonces es posible construir otra GLC G tal que G no
tenga producciones renombradoras y L(G)=L(G).
Demostracin:
Sea la GLC G=(N,T,P,S) cuyos |N|=n No Terminales representaremos por V1,...,Vn.
A partir de G hacemos lo siguiente para construir la GLC G=(N,T,P,S) (no tomamos en
cuenta producciones del tipo B-->B que se eliminan directamente):
a) P0={ Vi-->/ Vi-->P y N }
Inicialmente incluimos en P0 todas las producciones de P que no son renombradoras.
b) Para i=1,...,n
DerivadeVi = { VjN / VjVi y Vi=>*Vj en P}
Pi = Pi-1 { Vi-->/ VjDerivadeVi y Vj-->Pi-1 }
c) P = Pn
Es claro que las producciones en Pno son producciones renombradoras.
Sea wL(G), es decir, S=>*w con producciones de P, sea 1Vi2=>12 un paso
cualquiera de esta derivacin dado con la produccin Vi--> de P, 1,2(NT)*.
Por un lado, si esta produccin se ha aadido a P en el inciso a) es que est en P, es decir, se
puede dar este paso en G.
Por otro lado, si esta produccin se ha aadido a P en el inciso b) es que Vi=>*Vj en P y
Vj-->Pi-1 para algn i, es decir 1Vi2=>*1Vj2=>12, salvo posiblemente el ltimo
paso todos los dems pueden hacerse en P, si Vj--> ha sido aadido en el inciso b) este
razonamiento se repite recurrentemente de manera que 1Vi2=>*12 puede hacerse en P.
Es decir cada paso de S=>*w en P, puede hacerse o simularse en P, es decir, S=>*w tambin
en P, luego wL(G).
Sea wL(G) y sea A el rbol de derivacin con etiqueta S en su raz y con producto w,
sabemos que si efectuamos una derivacin ms a la izquierda entonces la derivacin S=>*w es
nica. Desglosemos esta derivacin ms a la izquierda en su ltimo paso y el resto de ellos
S=>*yViz=>yz=w, con Vi-->P, z(N T)*, yT*, sin prdida de generalidad
supondremos que el ltimo paso no utiliza una produccin renombradora (puesto que wT*).
Un derivacin ms la izquierda -efectuada con producciones de P- que empiece en S y derive
una cadena u(N T)* -no necesariamente de slo Terminales, pero tambin stas- cuyo
ltimo paso no utilice una produccin renombradora se puede hacer o simular con
producciones de P: en efecto, ello puede mostrarse por induccin sobre el nmero de pasos
de la derivacin.

180
Caso base: Un paso de derivacin, es decir S=>u donde se ha utlizado S-->uP que no es
renombradora, pero entonces esta produccin se aade a P en P0, luego S=>u tambin en P.
Hiptesis inductiva: El enunciado es cierto para derivaciones de menos de k pasos.
Paso inductivo: Sea S=>*u una derivacin ms a la izquierda con producciones de P efectuada
en k pasos, misma que puede desglosarse as S=>*yViz=>yz=u, con Vi-->P, z(N T)*,
yT*, el ltimo paso no utiliza una produccin renombradora.
Qu pasa con la primera parte de esta derivacin, es decir, con S=>*yViz.
Una posibilidad es que todos sus pasos se hayan dado utilizando producciones renombradoras,
en cuyo caso y=z=, u= lo que hace que esta parte de la derivacin sea as
S=>*Vi y toda la derivacin de la cadena u sea as S=>*Vi=>, recordemos que el ltimo paso
utiliza Vi-->P no renombradora y por tanto aadida a P en P0, pero entonces como
ViDerivadeS, S-->Ph para algn h, es decir, S-->P, luego S=>u en P.
Otra posibilidad es que la derivacin ms a la izquierda S=>*yViz incluya pasos de derivacin
(pueden ser muchos, todos o slo uno) que utilicen producciones no renombradoras.
Consideremos el ltimo paso de derivacin que utiliza una produccin no renombradora en
S=>*yViz, dicho paso de derivacin obtiene la cadena yVjz, es decir, S=>*yVjz=>*yViz,
puesto que yVjz aparece en el ltimo paso de derivacin que utiliza una produccin no
renombradora, el resto de los pasos (de yVjz=>*yViz) utiliza slo producciones
renombradoras.
Por hiptesis inductiva S=>*yVjz puede hacerse o simularse en P.
Si Vj=Vi, como Vi-->P es no renombradora y por tanto aadida a P en P0, entonces
S=>*yViz=>yz puede hacerse o simularse en P.
Si VjVi, es claro que ViDerivadeVj, como Vi-->P es no renombradora, entonces por el
inciso b), Vj-->Ph para algn h, es decir Vj-->P, luego S=>*yVjz=>yz puede hacerse o
simularse en P.
Todo ello muestra que S=>*w puede hacerse o simularse en P, es decir, wL(G).
Puede obtenerse el conjunto DerivadeVi a travs de un grafo de dependencias en una GLC que
es una forma de ver las conexiones entre los No Terminales, para construirlo se forman tantos
nodos como No Terminales haya, y se grafica un arco sin etiqueta- del nodo Vi al nodo Vj si
y slo si hay una produccin de la forma Vi-->uVjv, donde u y v son cualquier cadena en
(N T)*. Una variante til a nuestro propsito es dibujar el grafo de dependencias que resulte
de tomar en cuenta slo las producciones renombradoras. Con ayuda de este ltimo grafo de
dependencias, Vi=>*Vj si en el grafo hay un camino de Vi a Vj.
Otra alternativa ms explcita es la siguiente:
B0 = { Vj / Vi-->VjP y VjVi }
Bk+1 = Bk { Vj / VhBk, Vh-->VjP y VjVi }
Si Bk=Bk+1 entonces DerivadeVi=Bk

Ejemplo:
Sea la GLC G=({S,A,B,C},{a,b},P,S)

181
P:
S-->A B-->aBb
A-->B C-->ab
B-->C
C-->S
El grafo de dependencias considerando slo las producciones renombradoras es as:

Hacemos -para estar a tono con la demostracin- N={S,A,B,C}={V1,V2,V3,V4}


Detallaremos slo el clculo de DerivadeV1(=DerivadeS) escribiendo el resto sin detalle.
B0={A}
B1={A} { B}={A,B}
B2={A,B} {B,C}={A,B,C}
B3={A,B,C} {B,C}={A,B,C}
Como B2=B3 entonces DerivadeV1=DerivadeS={A,B,C}
DerivadeV2=DerivadeA={B,C,S}
DerivadeV3=DerivadeB={C,S,A}
DerivadeV4=DerivadeC={S,A,B}
Las producciones de la GLC G=({S,A,B,C},{a,b},P,S) se construyen as:
P0={B-->aBb,C-->ab}
P1={B-->aBb,C-->ab} {S-->aBb,S-->ab}={B-->aBb,C-->ab,S-->aBb,S-->ab}
P2={B-->aBb,C-->ab,S-->aBb,S-->ab} {A-->aBb,A-->ab}
P3={B-->aBb,C-->ab,S-->aBb,S-->ab,A-->aBb,A-->ab} {B-->ab}
P4={B-->aBb,C-->ab,S-->aBb,S-->ab,A-->aBb,A-->ab,B-->ab} {C-->aBb}
Luego P4=P:
S-->aBb
S-->ab
B-->aBb
B-->ab
A-->aBb
A-->ab
C-->aBb
C-->ab

ii) Eliminacin de No Terminales intiles:


Sea G una GLC tal que L(G), entonces es posible construir otra GLC G tal que G carezca
de No Terminales intiles y L(G)=L(G).
Demostracin:
Sea la GLC G=(N,T,P,S), identificaremos todos sus No terminales tiles -y por lo tanto sus
intiles- as:
0 = T

182
UTIL0 = {}
UTILi+1 = UTILi {X / X -->P y i*} (para i=0,1,...)
i+1 = i UTILi+1 (fjese bien los subndices)
Si UTILi=UTILi+1 entonces UTILES=UTILi, INUTILES=(N-UTILES).
0 es de slo Terminales pero los restantes 1, 2, etc., incluyen -posiblemente- Terminales y
No Terminales. Hay quienes en vez de exigir que i* piden que todos los No Terminales de
estn en UTILi, para el efecto es lo mismo. Es claro que algn momento se cumple la
condicin -incluso aadiendo un No Terminal a la vez- pues N es finito.
A partir de G hacemos lo siguiente para construir la GLC G=(N=UTILES,T,P,S).
Se construye P eliminando de P todas las producciones en las que aparezcan -donde fuere-
los No Terminales intiles.
Debemos mostrar que A=>*w con wT* si y slo si AUTILES.
Mostramos que si A=>*w entonces AUTILES por induccin sobre el nmero de pasos de
derivacin (es obvio que si A est en algn UTILi est en UTILES).
Caso base: A=>w con wT* en un paso, es decir, A-->wP con wT*=0*, luego A est en
UTIL1, es decir, AUTILES.
Hiptesis inductiva: El enunciado es cierto para derivaciones de menos de k pasos.
Paso inductivo: Sea que A=>*w con wT* en k pasos de derivacin. Podemos desglosar esta
derivacin as A=>ej1...ejm=>*w1...wm donde A-->ej1...ejmP, eji=>*wi, w=w1...wm.
Si eji es un Terminal entonces eji=wi (y eji=>*wi es cierto por la reflexividad de =>*).
Si eji es un No Terminal entonces eji=>*wi se hace en menos de k pasos, por hiptesis
inductiva ejiUTILES, pero entonces todos estos No Terminales estn en algn h, luego
ej1...ejmh* y por tanto A est en UTILh+1, es decir, AUTILES.
El hecho de que si AUTILES entonces A=>*w sigue de la forma indicada de construir este
conjunto (aunque puede pensarse una induccin sobre i para UTILi pues UTILES no es ms
que la reunin de todos estos conjuntos UTILi).
Resta mostrar que L(G)=L(G).
Recordemos que P=P-{producciones eliminadas por incluir No Terminales intiles}, es decir,
PP, luego es claro que si wL(G), es decir, S=>*w con producciones de P, lo mismo
puede hacerse en G con las mismas producciones, es decir, wL(G).
Si wL(G) entonces wL(G): Supongamos que no, que una cadena en L(G) no est en
L(G). Es decir, S=>*w con producciones de P donde se ha utilizado una produccin -que
incluye un No Terminal, digamos X- de G que no est en G, pero entonces por un lado
XN, y por otro X deriva una cadena de slo Terminales, es decir, XN(=UTILES), esta
contradiccin prueba el enunciado.

Ejemplo:
Sea la GLC G=({S,B,C},{a},P,S)
P:
S-->aBa S-->BC
B-->a C-->aC

183
0={a}
UTIL0={}
UTIL1={} {B}={B}
1={a,B}
UTIL2={B} {S,B}={B,S}
2={a,B,S}
UTIL3={B,S} {S,B}={B,S}
3={a,B,S}
Como UTIL2=UTIL3 entonces N=UTILES={B,S }, INUTILES={C}
Se construye as la GLC G=({S,B},{a},{S-->aBa,B-->a},S)

ii) Eliminacin de No Terminales inaccesibles:


Sea G una GLC tal que L(G), entonces es posible construir otra GLC G tal que G carezca
de No Terminales inaccesibles y L(G)=L(G).
Demostracin:
Sea la GLC G=(N,T,P,S), identificaremos todos sus No terminales accesibles -y por lo tanto
sus inaccesibles- as:
B0 = { S }
Bi+1 = Bi { Y / X -->P y Xi y =uYw u,w(N T)*}
Es decir, Y debe estar en algn lugar en la parte derecha de X-->.
Si Bi=Bi+1 entonces ACCESIBLES=Bi, INACCESIBLES=N-ACCESIBLES.
A partir de G hacemos lo siguiente para construir la GLC G=(N,T,P,S).
Se construye P eliminando de P todas las producciones en las que aparezcan -donde fuere-
los No Terminales inaccesibles.
T=T. N=ACCESIBLES.
Una interesante generalizacin es identificar y eliminar los smbolos inaccesibles sean
Terminales o No Terminales:
Z0 = { S }
Zi+1 = Zi { ej / X -->P y Xi y =uejw u,w(N T)*}
Si Zi=Zi+1 entonces ACCESIBLES={XZi / XN}, INACCESIBLES=N-ACCESIBLES,
T={cZi / cT}.
Se construye P eliminando de P todas las producciones en las que aparezcan -donde fuere-
los No Terminales inaccesibles.
N=ACCESIBLES.
Es claro que algn momento se cumple la condicin -incluso aadiendo un smbolo a la vez-
pues N y T son finitos.
Mostramos que si S=>*yejz con y,z(N T)*, ejentonces ejACCESIBLES por
induccin sobre el nmero de pasos de derivacin (es obvio que si ej est en algn Zi est en
ACCESIBLES).
Caso base: S=>*yejz en un paso, es decir, S--> yejzP, luego ej est en Z1, es decir,
ejACCESIBLES.

184
Hiptesis inductiva: El enunciado es cierto para derivaciones de menos de k pasos.
Paso inductivo: Sea que S=>*yejz en k pasos de derivacin. Podemos desglosar esta
derivacin as S=>*uAw=>uyejzw donde y=uy, z=zw, u,w,y,z(N T)*, A-->yejzP.
Como S=>*uAw se hace en menos de k pasos, por hiptesis inductiva A est en est en algn
Zh (AACCESIBLES, as como todos los smbolos de u,w), adems como A-->yejzP,
resulta que ej est en Zh+1, es decir, ejACCESIBLES (as como todos los smbolos de y,z).
El hecho de que si ejACCESIBLES entonces S=>*yejz sigue de la forma indicada de
construir este conjunto (aunque puede pensarse una induccin sobre i para Zi pues los
Terminales accesibles y los No Terminales ACCESIBLES no son sino la reunin de todos
estos conjuntos Zi).
Resta mostrar que L(G)=L(G).
Recordemos que P es P-{producciones eliminadas por incluir No Terminales inaccesibles},
es decir, PP, luego es claro que si wL(G), es decir, S=>*w con producciones de P, lo
mismo puede hacerse en G con las mismas producciones, es decir, wL(G).
Si wL(G) entonces wL(G): Supongamos que no, que una cadena en L(G) no est en
L(G). Es decir, S=>*w con producciones de P donde se ha utilizado una produccin -que
incluye un No Terminal, digamos X- de G que no est en G, pero entonces por un lado xN,
es decir, es imposible que S=>*yXz, por otro lado como la derivacin S=>*w que incluye a X
no significa otra cosa que S deriva una cadena que incluye a X (que luego deriva en w), es
decir, XN(=ACCESIBLES), esta contradiccin prueba el enunciado.

Ejemplo:
Sea la GLC G=({S,B,C},{a,b},P,S)
P:
S-->aBa
B-->a
C-->ab
Z0={S}
Z1={S} {a,B}={S,a,B}
Z2={S,a,B} {a,B}={S,a,B}
Como Z1=Z2 entonces ACCESIBLES={S,B}, INACCESIBLES={C}, T={a}.
P:
S-->aBa
B-->a

Dada una GLC G tal que L(G), para construir una GLC G limpia tal que L(G)=L(G),
eliminamos en orden- las producciones renombradoras, los No Terminales intiles y los No
Terminales inaccesibles. El orden es relevante.

Ejemplo:
Con la GLC G=({S,X,A,B},{a},P,S)

185
P:
S-->X
X-->AB
S-->aa
X-->a A-->a
Si eliminamos primero los No Terminales inaccesibles (ninguno, todos son accesibles), luego
las producciones renombradoras obteniendo {S-->AB,S-->a,X-->AB,S-->aa,X-->a,A-->a} y
finalmente los No Terminales intiles {B}- queda el siguiente conjunto de producciones
{ S-->a,S-->aa,X-->a,A-->a } que evidentemente no es de una GLC limpia pues X y A son
inaccesibles.

Construccin de una GLC en FNCH a partir de otra GLC G


Sea G una GLC sin producciones renombradoras, es posible construir otra GLC G en FNCH
tal que L(G)=L(G).
Demostracin:
Dada la cadena w denotaremos el reemplazo del smbolo a por el smbolo b en w por w[a/b],
por ejemplo abYbaY[a/b]=bbYbbY, por convencin (w)[a/b]=w[a/b].
Denotaremos mltiples reemplazos a la vez por w[a1/b1,...,a2/b2], por ejemplo
(abYba)[a/X,b/Z]=XZYZX.
Si la cadena w no incluye los smbolos de el o los reemplazos queda igual, por ejemplo
YbbY[a/X]=YbbY.
Sea G=(N,T,P,S) con T={a1,...,am}, construimos as la GLC G1=(N1,T,P1,S)
P1 = { (A-->)[a1/Xa1,...,am/Xam] / A-->P, T }
{ Xai-->ai / aiT } { A-->ai / A-->aiP, aiT }
Es decir, hacemos que todas las partes derechas excepto las que son de un slo Terminal-
sean cadenas de No Terminales, adems XaiN.
N1=N {Xai / aiT}
Como P no tiene producciones renombradoras, entonces si Y-->P1 con T, resulta que
||2.
L(G)=L(G1). En efecto, para mostrar que si wL(G1) entonces wL(G), probaremos por
induccin sobre el nmero de pasos de derivacin el enunciado ms general siguiente:
Si X=>*w -XN, wT*- con producciones de P1 entonces X=>*w con producciones de P.
Caso base: X=>*w en un paso de derivacin, es decir, X=>w con X-->wP1, esta produccin
est en P1 slo porque X-->wP, por la ltima parte de la construccin de P1, recordemos que
XN, entonces X=>*w con producciones de P.
Hiptesis inductiva: El enunciado es cierto para derivaciones de menos de k pasos.
Paso inductivo: Sea que X=>*w en k pasos de derivacin que pueden desglosarse as:
X=>Z1..Zi..Zm con m2, pues las producciones de P1 que no tienen un Terminal en
*
=> w1...wm=w su parte derecha , tienen ||2.
Adems Zi=>*wi, es claro que wiT*: Por un lado si ZiN, dado que esta derivacin toma
menos de k pasos, resulta que, por hiptesis inductiva, la misma puede hacerse con

186
producciones de P. Por otro lado, si ZiN, entonces Zi=Xaj, y la derivacin Xaj=>*wi debe
hacerse en un paso con wi=aj, pues por la forma de construccin de P1 slo la produccin
Xaj-->aj tiene a Xaj como parte izquierda; adems el primer paso de derivacin X=>Z1..Zi..Zm
se da porque X-->Z1..Zi..ZmP1, o lo que es lo mismo X-->Z1..Xaj..ZmP1, entonces por la
forma de construccin de P1, la produccin X-->Z1..wi..ZmP, recuerde que wi=aj y ntese que
hemos simplificado el razonamiento a un slo Zi, si ms de un ZiN, el razonamiento es
semejante, luego como cada uno de los otros Zj=>*wj con producciones de P, resulta que
X=>Z1..wi..Zm=>*w con producciones de P.
Resta mostrar que si wL(G) entonces wL(G1), tambin probaremos por induccin sobre el
nmero de pasos de derivacin el enunciado ms general siguiente:
Si X=>*w -wT*- con producciones de P entonces X=>*w con producciones de P1.
Caso base: X=>*w en un paso de derivacin, es decir, X=>w con X-->wP. Sea w=ej1...ejm,
si m=1 entonces por la forma de construir P1- X-->wP1, luego X=>*w con producciones de
P1; si m>1, entonces por la forma de construir P1- las siguientes producciones estn en P1:
(X-->ej1...ejm)[a1/Xa1,...,am/Xam] junto a {Xai-->ai / aiT}, es decir,
X-->Xj1...Xjm junto a {Xai-->ai / aiT}, de donde se desprende que Xji-->eji est en P1, es decir,
Xji=>eji. Luego, con producciones de P1 es posible X=>Xj1...Xjm=>*ej1...ejm.
Hiptesis inductiva: El enunciado es cierto para derivaciones de menos de k pasos.
Paso inductivo: Sea que X=>*w en k pasos de derivacin que pueden desglosarse as:
X=>ej1...ejm con m2, pues P no tiene producciones renombradoras
=>*w1...wm=w
Donde eji=>*wi -es claro que wiT*- en menos de k pasos, es decir, por hiptesis inductiva,
eji=>*wi puede hacerse con producciones de P1.
El primer paso ha debido utilizar la produccin X-->ej1...ejmP, entonces por la forma de
construir P1- las siguientes producciones estn en P1:
(X-->ej1...ejm)[a1/Xa1,...,am/Xam] junto a {Xai-->ai / aiT}, es decir,
X-->Xj1...Xjm junto a {Xai-->ai / aiT}, de donde se desprende que Xji-->eji est en P1, es decir,
Xji=>eji. Luego, con producciones de P1 es posible X=>Xj1...Xjm=>*ej1...ejm=>*w1...wm. Es
decir, wL(G1).
Sea la GLC G1=(N1,T,P1,S) como se indica arriba, construimos as la GLC G=(N,T,P,S).
P:
Y --> X1Zj1
Zj1 --> X2Zj2 si Y-->X1...XmP1 con m3
... los ZjiN1, son nuevos No Terminales
Zj(m-2) --> Xm-1Xm
A --> Si A-->P1 con |2
N = N1 { Zji / Zji es un nuevo No Terminal aadido en la construccin de P}
L(G1)=L(G). En efecto, mostraremos que si wL(G1) entonces wL(G), es decir, si S=>*w
con producciones de P1 entonces S=>*w con producciones de P.
Sea yAz=>yz un paso de derivacin cualquiera (de S=>*w) dado con la produccin A--> de
P1, la misma puede simularse en P: si A-->P1 es tal que |2, por construccin de P, esta

187
produccin est -precisamente- en P; por otro lado A-->P1 es tal que |2, entonces debe
ser del tipo A-->X1...Xm, otra vez por construccin de P, las siguientes producciones estn en
P: A-->X1Zj1, Zj1-->X2Zj2,..., Zj(m-2)-->Xm-1Xm, luego en P es posible la siguiente derivacin
yAz=>yX1Zj1z=>yX1X2Zj2z=>...=>yX1...Xm-2Zj(m-2)z=>yX1...Xmz, es decir, yAz=>*yz con
producciones de P. Luego, cada paso en S=>*w con producciones de P1 puede simularse con
producciones de P, es decir, S=>*w con producciones de P.
Inversamente, para mostrar que si wL(G) entonces wL(G1), probaremos por induccin
sobre el nmero de pasos de derivacin el enunciado ms general siguiente:
Si Y=>*w -YN1, wT*- con producciones de P entonces Y=>*w con producciones de P1.
Caso base: Y=>*w en un paso de derivacin, es decir, Y=>w con Y-->wP, por la forma de
las producciones de P w=a. Observando la construccin de P, esta produccin est presente
porque Y-->wP1, luego Y=>*w con producciones de P1.
Hiptesis inductiva: El enunciado es cierto para derivaciones de menos de k pasos.
Paso inductivo: Sea que Y=>*w en k pasos de derivacin, con producciones de P.
Desglosaremos esta derivacin en sus formas genricas posibles as:
a) Si el primer paso de derivacin es as Y=>X1X2 con X1,X2N1, donde se ha utilizado la
produccin Y-->X1X2P, por la forma de construir P debe suceder que Y-->X1X2P1.
Luego la derivacin es Y=>X1X2=>*w1w2 con w=w1w2, X1=>*w1 y X2=>*w2, estas dos
ltimas derivaciones se hacen en menos de k pasos, as -por hiptesis de induccin- pueden
hacerse con producciones de P1, es decir, Y=>*w con producciones de P1.
b) Si el primer paso de derivacin es as Y=>X1X2, por la la forma de construir P no es
posible que X1N1, es decir, X1N1.
c) Si el primer paso de derivacin es as Y=>X1Zj1 con X1N1 y Zj1N1 (es un nuevo No
Terminal), donde se ha utilizado la produccin Y-->X1Zj1 de P, entonces por la forma de
construir P, tambin deben estar presentes las producciones Zj1-->X2Zj2,...,Zj(m-2)-->Xm-1Xm,
de manera que la derivacin es Y=>X1Zj1=>X1X2Zj2=>...=>X1...Xm=>*w1...wm donde
w=w1...wm, X1=>*w1, ... , Xm=>*wm, cada XjN1, estas derivaciones se hacen en menos de k
pasos, luego -por hiptesis de induccin- cada derivacin Xj=>*wj puede hacerse con
producciones de P1. Adems, las producciones mencionadas estn en P porque
Y-->X1...XmP1, es decir, es posible derivar Y=>X1...Xm =>*w con producciones de P1.

Ejemplo:
Sea la GLC G=({S,X,Y},{a,b,c},P,S)
P:
S --> Sabcc
S --> XX
X --> XYa
Y --> XSSX
X --> abb
Y --> a

Construimos as la GLC G1=(N1,{a,b,c},P1,S)

188
P1: Es decir P1:
(S --> Sabcc)[a/Xa,b/Xb,c/Xc] S --> SXaXbXcXc
(S --> XX)[a/Xa,b/Xb,c/Xc] S --> XX
(X --> XYa)[a/Xa,b/Xb,c/Xc] X --> XYXa
(Y --> XSSX)[a/Xa,b/Xb,c/Xc] Y --> XSSX
(X --> abb)[a/Xa,b/Xb,c/Xc] X --> XaXbXb
Xa --> a Xa --> a
Xb --> b Xb --> b
Xc --> c Xc --> c
Y --> a Y --> a
N1={S,X,Y,Xa,Xb,Xc}
A partir de G1 construimos as la GLC G=(N,{a,b,c},P,S)
P:
De S-->SXaXbXcXc vienen S --> SZ1
Z1 --> XaZ2
Z2 --> XbZ3
Z3 --> XcXc
De X --> XYXa vienen X --> XZ4
Z4 --> YXa
De Y --> XSSX vienen Y --> XZ5
Z5 --> SZ6
Z6 --> SX

De X --> XaXbXb vienen X --> XaZ7


Z7 --> XbXb
Las restantes producciones S --> XX
se copian tal cual Y --> a
pues tienen |2 Xa --> a
Xb --> b
Xc --> c
N={S,X,Y,Xa,Xb,Xc,Z1,Z2,Z3,Z4,Z5,Z6,Z7}
Que evidentemente ya est en FNCH y que genera el mismo lenguaje que G.

Eliminacin de la recursividad por izquierda de primer orden


Sea G=(N,T,P,S) una GLC limpia, entonces es posible construir otra GLC G tal que G
carece de No Terminales recursivos por izquierda de primer orden y L(G)=L(G).
Demostracin:
Sea X un No Terminal recursivo por izquierda de primer orden en G y llamemos Q al
conjunto de todas las producciones de P con parte izquierda X (QP).
Podemos dividir Q en dos subconjuntos, ya que X es til:
{X -->X,...,X-->Xk} que hacen que X sea recursivo por izquierda de primer orden; y
{X -->,...,X--> m} ( i no tiene a X como cabeza).

189
Construimos la GLC G=(N,T,P,S) como sigue.
P = P ({ X-->X,...,X-->Xk })
{ Zjq-->Zjq,...,Zjq-->kZjq }
{ Zjq-->, ... , Zjq-->k }
{ X-->Zjq,...,X--> mZjq }
N = N { Zjq / Zjq es un nuevo No Terminal aadido en la construccin de P}
Ntese que ninguna de las nuevas producciones hace recursiva por izquierda de primer orden
a X. Tambin es claro que Zjq no puede ser recursiva por izquierda de primer orden porque los
i no contienen a Zjq ya que este No Terminal es nuevo. Es decir, se ha eliminado la
recursividad por izquierda de primer orden de X.
L(G)=L(G). En efecto, cualquier derivacin que involucre al No Terminal X se realiza con
producciones de P si y slo si se realiza con producciones de P (obviamente las derivaciones
que no involucren a X pueden hacerse idnticamente en P y en P). Analicemos slo la parte
concerniente a este No Terminal: seguramente tendremos una (sub)derivacin de una de estas
dos formas:
a) X=>j con la produccin X-->jP si y slo si X=>j con la produccin X--> jP, pues
dicha produccin se copia de P a P.
b) X=>Xi=>Xii=> ... =>Xim...ii=>jim...ii (m1) en P, cuyo ltimo paso
utiliza la produccin X-->jP y los restantes producciones X-->ihP, si y slo si
-observando la forma de construir P- X--> jZjqP, Zjq-->ihZjqP y Zjq-->ihP, es decir,
si y slo si X=>jZjq=>jinZjq=> ... =>jim...i2Zjq=>jim...ii en P.
Hacemos lo mismo para cada No Terminal recursivo por izquierda de primer orden, si es que
hay varios.
En rigor para este resultado, no es necesario que G sea una GLC limpia, es suficiente que
adems de las producciones X -->X,...,X-->Xk que hacen que X sea recursivo por
izquierda de primer orden, existan las producciones X -->,...,X--> m ( i no tiene a X como
cabeza).

Ejemplo:
Sea la GLC G=({S,X,B},{a,b},P,S)
P:
S-->aX 1=aX
S-->SaSaX 1=aSaX
X-->Xa
X-->XXX
X-->aBa
X-->ab
B-->aXB
B-->b
Es evidente que tanto X como S son No Terminales recursivos por izquierda de primer orden.

190
Trabajaremos primero con S, ya hemos anotado arriba los i y losj. Todo el conjunto de
producciones resultantes se anota a continuacin, donde adems se destacan los i y losj
para el No Terminal X, obviamente Z1 es un Nuevo No Terminal.
S-->aX
Z1-->aSaXZ1
Z1-->aSaX
S-->aXZ1
X-->Xa 1=a
X-->XXX 2=XX
X-->aBa 1=aBa
X-->ab 2=ab
B-->aXB
B-->b
Trabajando ahora con X, finalmente la GLC G=(N,{a,b},P,S) es como sigue, Z2 es nuevo.
P:
S-->aX
Z1-->aSaX
Z1-->aSaXZ1
S-->aXZ1
Z2-->aZ2
Z2-->XXZ2
Z2-->a
Z2-->XX
X-->aBaZ2
X-->abZ2
X-->aBa
X-->ab
B-->aXB
B-->b
N={S,X,B,Z1,Z2}

Construccin de una GLC en FNG a partir de otra GLC arbitraria


Previamente necesitamos el siguiente resultado imprescindible.
Sea G=(N,T,P,S) una GLC, sean X,YN con XY, sea X-->YP con ,(NT) *, y sea
{Y-->,...,Y--> m}P el conjunto de todas las producciones de P con parte izquierda Y
entonces la GLC G=(N,T,P,S) donde P= (P {X-->Y}) {X-->,...,X--> m} es
tal que L(G)=L(G).
Demostracin:
Mostraremos que cualquier derivacin en P que involucre el uso de alguna produccin
X-->j puede hacerse en P (obviamente las derivaciones que no involucren esta produccin
pueden hacerse idnticamente en P y en P). Analicemos slo la parte concerniente a esta
produccin: seguramente tendremos una (sub)derivacin del tipo X=>j, pero la

191
produccin X--> jP porque Y,Y-->jP, es decir, en P puede hacerse la derivacin
X=>Y=> j.
Inversamente, mostraremos que cualquier derivacin en P que involucre el uso de la
produccin X-->Y puede hacerse o simularse en P (obviamente las derivaciones que no
involucren esta produccin pueden hacerse idnticamente en P y en P). Analicemos slo la
parte concerniente a esta produccin: seguramente tendremos una (sub)derivacin del tipo
X=>Y, el No Terminal Y debe dar paso en la derivacin- a una otra subcadena, para ello
en P hemos de utilizar alguna produccin Y-->j, un caso -genrico- posible es que la
(sub)derivacin sea X=>Y=>j, pero ambos pasos de derivacin pueden simularse en P
as X=>j utilizando la produccin X--> j que est presente en la construccin de este
conjunto de producciones (el caso mencionado es genrico en el sentido que si Y se reemplaza
en un paso de derivacin posterior al paso X=>Yello no afecta nuestro razonamiento ms
que en la descripcin de la derivacin pues finalmente Y se convertir en j).
Al construir P a partir de P, es posible que algn(os) No Terminal(es) se haga(n) recursivo(s)
por izquierda de primer orden.

Ejemplo:
Sea la GLC Trabajaremos con la produccin S-->YaZ, obviamente S
G=({S,X,B},{a,b},P,S) juega el papel de X en el enunciado, = y =aZ.
P: {Y-->aZY,Y-->SaS,Y-->b} es el conjunto de todas las
S-->YaZ producciones de P con parte izquierda Y.
Z-->aSa Construimos as la GLC G=({S,X,B},{a,b},P,S)
Z-->a P:
Y-->aZY S-->aZYaZ
Y-->SaS S-->SaSaZ
Y-->b S-->baZ
Z-->aSa
Z-->a
Y-->aZY
Y-->SaS
Y-->b
Cuando este resultado previo se utilice con producciones X-->Y, que como en el ejemplo
tienen =, es decir, con producciones X-->Y, nos referiremos al hecho de reemplazar
X-->Y por X--> ,...,X--> m -donde{Y-->,...,Y--> m} es el conjunto de todas las
producciones de P con parte izquierda Y- bajo el nombre de reemplazar la cabeza Y (en la
produccin X-->Y por la parte derecha de todas las producciones donde Y es parte
izquierda).
Cuando vimos la FNCH hicimos que todas las partes derechas excepto las que son de un slo
Terminal- sean cadenas de No Terminales, de manera muy semejante si a partir de una GLC
con producciones P, construimos otra GLC G1 con producciones

192
P = {A-->b / A-->bP, bT, =[a1/Xa1,...,am/Xam]} { Xai-->ai / aiT }
XaiN, N1 = N {Xai / aiT}. Nos referiremos a esta construccin bajo el nombre de
Mayusculizar P (sus partes derechas, excepto sus cabezas).
La demostracin de que L(G)=L(G1) es bsicamente la misma que antes.
Ahora s presentamos el enunciado buscado.
Sea G=(N,T,P,S) una GLC limpia, entonces es posible construir otra GLC G en FNG tal que
L(G)=L(G).
Demostracin:
Establecimiento de un orden en N cambiando de nombre a los No Terminales:
Sin prdida de generalidad podemos cambiar de nombre a los No Terminales por V1,V2, etc.,
estableceremos un orden a partir de los subndices, as V1<V2<V3 etc.
Por ejemplo si N={S,A,B,C}, lo cambiamos por N={V1,V2,V3,V4}.
Hay que cambiar tambin los nombres de los No Terminales en el conjunto de producciones.
Se supone que tenemos |N|=n (es decir, n No Terminales)
Procedimiento para construir la GLC G en FNG.

Paso 1 de 5:
Establecer un orden en N, cambiando de nombre a los No Terminales en caso de ser
necesario. Tomaremos a P como conjunto de trabajo, todas las condiciones sobre
producciones en lo que sigue se refieren a producciones de P.
Paso 2 de 5:
Para k := 1,..., n
Inicio (para k)
Para j:= 2,..., k-1
Inicio (para j)
Si hay una produccin Vk-->Vjfjese que la condicin es que k>j
Entonces Reemplazar la cabeza Vj
Fin (para j)
Si aparece o existe recursividad por izquierda de primer orden para Vk
Entonces eliminarla
Fin (para k)
Paso 3 de 5:
Para i := n-1,..., 1
Inicio (para i)
Si hay una produccin Vi-->Vjcon i<j
Entonces Reemplazar la cabeza Vj
Fin (para i)
Para k := 1,..., n
Inicio (para k)
Si hay una produccin Zj-->Vk (Zj es un nuevo No Terminal)
Entonces Reemplazar la cabeza Vk
Fin (para k)

193
Paso 4 de 5:
Mayusculizar P
Paso 5 de 5:
Si es necesario re-nombrar los No Terminales (excepto los nuevos) a como estaban antes.

Aunque esta ltima GLC ya est en FNG es posible que algunos No Terminales sean
inaccesibles, no es necesario pero es recomendable hacer una nuevo proceso de limpieza.
El procedimiento visto lo que persigue es:
En el paso 2 tener las producciones de la forma Vi-->Vj con i<j
En el paso 3 tener las producciones de la forma Vi-->a con N T)*
En el paso 4 tener las producciones de la forma Vi-->a con N*
P es el conjunto de producciones que se obtiene finalmente.
N es el conjunto de No Terminales que resulta finalmente, incluye todos los nuevos No
Terminales.
La primera parte del paso 3 tambin puede ser:
Para i := n,..., 2
Inicio (para i)
Si hay una produccin Vj-->Vi con j<i
Entonces Reemplazar la cabeza Vi
Fin (para i)
Dado que los cambios que se hacen en el conjunto de producciones de trabajo resultan de la
eliminacin de la recursividad por izquierda de un No Terminal o del reemplazo de una
produccin por otras, es claro que -segn los resultados previos- L(G)=L(G).

Ejemplo:
Sea la GLC G2=({S,A,B,X},{a,b},P2,S)
P2:
S-->A A-->BaX B-->aXB
X-->aAa B-->AaA
X-->a B-->b
Luego del proceso de limpieza se obtiene la siguiente GLC limpia G=({S,A,B,X},{a,b},P,S).
P:
S-->BaX
A-->BaX
X-->a
B-->aXB
X-->aAa
B-->AaA
B-->b
A partir de G construimos as la GLC G=(N,P,{a,b},S)
Haremos N={S,A,B,X}={V1,V2,V3,V4}, con |N|=n=4 No Terminales.

194
Y tomaremos a P como conjunto de trabajo.
Paso 1:
V1-->V3aV4
V2-->V3aV4
V4-->a
V3-->aV4V3
V4-->aV2a
V3-->V2aV2
V3-->b
Paso 2: Con k=1 y k=2 no hay problema; con k=3 si.
En V3-->V2aV2 es evidente que k>j ( 3 > 2), reemplazamos la cabeza V2 as:
Con este reemplazo todas las producciones
son ahora:
V3-->V2aV2
V1-->V3aV4
V2-->V3aV4
se reemplaza por
V4-->a
V3-->aV4V3
V3-->V3aV4aV2
V4-->aV2a
V3-->V3aV4aV2
V3-->b

Es claro que surgi recursividad por izquierda para V3, la eliminamos:


Sabiendo que estn las
Se reemplaza por estas:
producciones:
V3-->aV4V3Z
V3-->aV4V3
V3-->bZ
V3-->b
Z-->aV4aV2Z
La produccin:
Z-->aV4aV2
V3-->V3aV4aV2
De donde todo el conjunto de producciones es ahora as, Z es un nuevo No Terminal:
V1-->V3aV4
V2-->V3aV4
V4-->a
V4-->aV2a
V3-->aV4V3
V3-->b
V3-->aV4V3Z
V3-->bZ
Z-->aV4aV2Z
Z-->aV4aV2
Terminamos los ciclos del paso 2 y para k=4 no hay problema.

195
Paso 3:
Primer ciclo (fjese que va de mayor a menor, en nuestro caso de 3 a 1): Para i=3 no hay
problema; para i=2 si.
En V2-->V3aV4 es evidente que i<j (2<3), reemplazamos la cabeza V3 as:
Con este reemplazo el nuevo grupo de
todas las producciones es:
V1-->V3aV4
V2-->V3aV4 V4-->a
V4-->aV2a
se reemplaza por V3-->aV4V3
V3-->b
V2-->aV4V3aV4 V3-->aV4V3Z
V2-->baV4 V3-->bZ
V2-->aV4V3ZaV4 Z-->aV4aV2Z
V2-->bZaV4 Z-->aV4aV2
V2-->aV4V3aV4
V2-->baV4
V2-->aV4V3ZaV4
V2-->bZaV4
Siempre en el primer ciclo del paso 3, tambin hay problemas con i=1.
En V1-->V3aV4 es evidente que i<j (1< 3), reemplazamos la cabeza V3 as:
Con este reemplazo el nuevo grupo de
todas las producciones es:
V1-->aV4V3aV4
V1-->baV4
V1-->aV4V3ZaV4
V1-->V3aV4 V1-->bZaV4
V4-->a
se reemplaza por V4-->aV2a
V3-->aV4V3
V1-->aV4V3aV4 V3-->b
V1-->baV4 V3-->aV4V3Z
V1-->aV4V3ZaV4 V3-->bZ
V1-->bZaV4 Z-->aV4aV2Z
Z-->aV4aV2
V2-->aV4V3aV4
V2-->baV4
V2-->aV4V3ZaV4
V2-->bZaV4
Segundo Ciclo: no hay problema.

196
Paso 4: Mayusculizando las producciones el resultado es como sigue (con Xa en vez de a).
V1-->aV4V3XaV4
V1-->bXaV4
V1-->aV4V3ZXaV4
V1-->bZXaV4
V4-->a
V4-->aV2Xa
V3-->aV4V3
V3-->b
V3-->aV4V3Z
V3-->bZ
Z-->aV4XaV2Z
Z-->aV4XaV2
V2-->aV4V3XaV4
V2-->bXaV4
V2-->aV4V3ZXaV4
V2-->bZXaV4
Xa-->a

Podemos dejar ah el ejemplo o dar el


Paso 5: re-nombrando los No Terminales tenemos G=(N,{a,b},P,S)
P:
S-->aXBXaX
S-->bXaX
S-->aXBZXaX
S-->bZXaX
X-->a
X-->aAXa
B-->aXB
B-->b
B-->aXBZ
B-->bZ
Z-->aXXaAZ
Z-->aXXaA
A-->aXBXaX
A-->bXaX
A-->aXBZXaX
A-->bZXaX
Xa-->a
N={S,A,B,X,Z,Xa}
Que ya est en FNG y es adems una GLC limpia.

197
Construccin de una GLC G en 2FNG
Sea G una GLC G limpia, entonces es posible construir otra GLC G en 2FNG tal que
L(G)=L(G).
Demostracin:
1) A partir de G construimos otra GLC G1=(N1,T,P1,S) en FNG misma que tendr todas sus
producciones del tipo A-->a, donde AN1, a, N1*
2) A partir de G1 efectuamos un proceso de particin prcticamente idntico al que se hizo en
la FNCH y construimos as la GLC G2=(N2,T,P2,S)
P2:
Y --> aZj1
Zj1 --> X1Zj2 si Y-->aX1...XmP1 con m2
... los ZjiN1, son nuevos No Terminales.
Zj(m-1) --> Xm-1Xm Fjese que se aplica incluso a las
producciones del tipo A-->aBC
A --> Si A-->P1 con |2
N2 = N1 { Zji / Zji es un nuevo No Terminal aadido en la construccin de P2}
La demostracin de que L(G1)=L(G2) es bsicamente la misma que antes.
Ntese que ahora todas las producciones son del tipo:
A-->a que hemos copiados con AN1,
A-->aB que hemos copiado con A,BN1,
A-->aZk que resultan del proceso de particin con AN1, Zk un nuevo No Terminal,
Zj-->XiZk que resultan del proceso de particin con XiN1 y Zj,Zk nuevos No Terminales
Fjese que para todos los No Terminales en N1: si son parte izquierda de una produccin,
entonces la parte derecha de dicha produccin empieza con un Terminal.
Finalmente para construir la GLC G=(N,T,P,S) a partir de G2, no hacemos ms que
reemplazar la cabeza Xi (en la produccin Zj-->XiZkP2 donde XiN1- por la parte derecha
de todas las producciones donde Xi es parte izquierda).
Es evidente que en este reemplazo, la subcadena que se reemplace -en vez de la cabeza Xi-
ser del tipo a, aB aZk que darn lugar a la GLC en 2FNG que estamos buscando.
Ya demostramos que al reemplazar la cabeza W el lenguaje resultante de la nueva gramtica
es l-equivalente a la gramtica original, es decir, L(G2)=L(G).

Ejemplo:
Partiremos de una GLC limpia y en FNG, nos resta dar el segundo paso del procedimiento.
Sea la GLC G1=({S,B,X,Y},{a,b},P1,S) en FNG
P1:
S-->aBBXX Y-->aB
X-->aSB B-->aXB
B-->bSYS
B-->b
X-->a

198
Construimos as la GLC G2=(N2,{a,b},P2,S)
P2:
De S-->aBBXX vienen S-->aZ1
Z1-->BZ2
Z2-->BZ3
Z3-->XX
Y-->aB se copia Y-->aB
De X-->aSB vienen X-->aZ4
Z4-->SB
De B-->aXB vienen B-->aZ5
Z5-->XB
De B-->bSYS vienen B-->bZ6
Z6-->SZ7
Z7-->YS
B-->b se copia B-->b
X-->a se copia X-->a
N2={S,B,X,Y,Z1,Z2,Z3,Z4,Z5,Z6,Z7}
Finalmente construimos G=({S,B,X,Y,Z1,Z2,Z3,Z4,Z5,Z6,Z7},{a,b},P,S) as.
P:
S-->aZ1 Z1-->aZ5Z2
Y-->aB Z1-->bZ6Z2
B-->aZ5 Z1-->bZ2
B-->bZ6 Z2-->aZ5Z3
B-->b Z2-->bZ6Z3
X-->aZ4 Z2-->bZ3
X-->a Z3-->aZ4X
Z3-->aX
Z4-->aZ1B
Z5-->aZ4B
Z5-->aB
Z6-->aZ1Z7
Z7-->aBS
Que est en 2FNG.

Construccin de un AP a partir de un APe.f.


Sea A un APe.f., entonces es posible construir un AP A tal que T(A)=T(A).
Demostracin:
La idea es vaciar la pila una vez que estamos en un estado final utilizando un nuevo estado (si
la cadena de entrada no ha sido totalmente analizada seguir en esa situacin).
Sea A=(K,,,,q0,Z,F) el APe.f. Z; q0,qeK -, construimos as el AP
A=(K{q0,qe}, , {Z}, , q0, Z, {})

199
:
1) (q0,,Z) = {(q0,ZZ)}
2) (qi,c,X) = (qi,c,X) qiK, c( {}), X
3) (qj,,X) = {(qe,X)} qjF, X{Z}
4) (qe,,X) = {(qe,)} X{Z}
Ntese que el inciso 2 nos dice que copiemos .
T(A)=T(A). En efecto, mostraremos inicialmente que si wT(A) entonces wT(A), es
decir, si q0,w,|--*(qj,,) en A con las reglas (qjF) entonces q0,w,Z|--*(qe,,) en A.
Veamos qu sucede en A con la cadena w:
q0,w,Z|-- q0,w,ZZ) por 1
|--*(qj,,Z) por hiptesis y por 2, qjF
|-- (qe,,Z) por 3
|--*(qe,,) por 4
Es decir, q0,w,Z|-- (qe,,) en A.
*

Inversamente, si q0,w,Z|--*(qe,,) en A entonces q0,w,|--*(qj,,) en A (qjF).


Analicemos cundo sucede que q0,w,Z|--*(qe,,) en A:
A partir deq0,w,Z) el nico movimiento que se puede dar en A es utilizando la regla 1
pues ninguna otra regla tiene a q0 como estado de partida : q0,w,Z|-- q0,w,ZZ), a partir de
aqu, por la forma de construir , la nica forma de consumir toda la cadena w es
consumindola con las reglas de 2 (pues las reglas 3 y 4 no consumen smbolos de entrada), la
nica forma de llegar al estado qe es partiendo de un estado que era final en F -sin importar el
contenido de la pila- lo que slo hacen las reglas de 3, y la nica forma de vaciar la pila es,
estando en qe, con las reglas 4. Si juntamos estos datos resulta que estando en q0,w,ZZ) para
llegar a (qe,,), debe ocurrir que: q0,w,ZZ)|--*(qj,,Z) con la reglas de 2 y qjF. Luego
(qj,,Z)|--* (qe,,) con las reglas de 3 y 4.
Pero entonces, como q0,w,ZZ)|--*(qj,, Z) con la reglas de 2 y qjF, y como Z, es
decir, ninguna regla de 2 incluye a Z, debe ser posible que q0,w,Z)|--*(qj,,) con la reglas de
2 y qjF, pero las reglas de 2 no son otras que las reglas de , es decir, q0,w,Z|--*(qj,,) en
A.

Ejemplo:
Sea el APe.f. A=({q0,q1},{a,b},,,q0,Z,F)
={Z}
F={q1}
:
(q0,a,Z)={(q0,Z),(q1,Z)}
(q1,b,Z)={(q0,Z),(q1,Z)}

Construimos as el AP A=({q0,q1,q0},{a,b},{Z,Z},,q0,Z,{})

200
:
(q0,,Z) = {(q0,ZZ)}
(q0,a,Z)={(q0,Z),(q1,Z)}
(q1,b,Z)={(q0,Z),(q1,Z)}
(q1,,Z)={(qe,)}
(q1,,Z)={(qe, Z)}
(qe,,Z)= {(qe,)}
(qe,,Z)= {(qe,)}

Construccin de APe.f. a partir de un AP


Sea A un AP, entonces es posible construir un APe.f. A tal que T(A)=T(A).
Demostracin:
La idea es simular una pila vaca utilizando un nuevo smbolo inicial de la pila llamado Z.
Cuando estemos en tal situacin, es decir cuando tengamos una pila vaca simulada (la pila no
est realmente vaca) transitamos hacia el estado final qf.
Sea A=(K,,,,q0,Z,{}) el AP Z; q0,qfK-, construimos as el APe.f.
A=(K{q0,qf}, , Z}, , q0, Z, {qf})
:
1) (q0,,Z) = {(q0,ZZ)}
2) (qi,c,X) = (qi,c,X) qiK, c( {}), X
3) (qi,,Z) = {(qf,Z)} qiK
Ntese que el inciso 2 nos dice que copiemos .
T(A)=T(A). En efecto, mostraremos inicialmente que si wT(A) entonces wT(A), es
decir, si q0,w,|--*(qi,,) en A entonces q0,w,Z|--*(qf,,Z) en A.
Veamos qu sucede en A con la cadena w:
q0,w,Z|-- q0,w,ZZ) por 1
|--*(qi,,Z) por hiptesis y por 2
|-- (qf,,Z) por 3
Es decir, q0,w,Z|--*(qf,,Z) en A.
Inversamente, si q0,w,Z|--*(qf,,Z) en A entonces q0,w,|-- *(qi,,) en A.
Analicemos cundo sucede que q0,w,Z|--*(qf,,Z) en A:
A partir deq0,w,Z) el nico movimiento que se puede dar en A es utilizando la regla 1
pues ninguna otra regla tiene a q0 como estado de partida : q0,w,Z|-- q0,w,ZZ), a partir de
aqu, por la forma de construir , la nica forma de consumir toda la cadena w es
consumindola con las reglas de 2 (pues las reglas de 3 no consumen smbolos de entrada), y
la nica forma de llegar al estado qf es partiendo de un estado en K con el contenido de la pila
siendo Z, lo que slo hace 3.
Si juntamos estos datos resulta que estando en q0,w,ZZ) para llegar a (qf,,Z), debe ocurrir
que: q0,w,ZZ)|--*(qi,,Z) con la reglas de 2. Luego (qi,,Z)|--* (qf,,Z) con 3. Pero
entonces, como q0,w,ZZ)|--*(qi,,Z) con la reglas de 2 y como Z, es decir, ninguna regla

201
de 2 incluye a Z, debe ser posible que q0,w,Z)|--*(qi,,) con la reglas de 2, pero las reglas de
2 no son otras que las reglas de , es decir, q0,w,Z|--*(qi,,) en A.

Ejemplo:
Sea el AP A=({q0,q1,qe},{a,b},{Z},,q0,Z,{})
(q0,a,Z)= {(q0,Z),(q1,Z)}
(q1,b,Z)= {(q0,Z),(q1,Z)}
(q1,,Z)= {(qe,)}
(qe,,Z)= {(qe,)}
Construimos as el APe.f. A=({q0,q1,q0, qe , qf },{a,b},{Z,Z},,q0,Z,{qf})
(q0,,Z) = {(q0,ZZ)}
(q0,a,Z)= {(q0,Z),(q1,Z)}
(q1,b,Z)= {(q0,Z),(q1,Z)}
(q1,,Z)= {(qe,)}
(qe,,Z)= {(qe,)}
(q0,,Z) = {(qf,Z)}
(q1,,Z) = {(qf,Z)}
(qe,,Z) = {(qf,Z)}

Construccin de AP a partir de una GLC


Sea G una GLC en FNG entonces es posible construir un AP A tal que L(G)=T(A).
Demostracin:
Sea G=(N,T,P,S) una GLC en FNG, construimos as el AP A=({q0},,N,,q0,S,{}).
Ntese que el smbolo inicial de la pila es S y no Z y que tenemos un nico estado q0.
: (q0,) (q0,a,X) si X-->a P
L(G)=T(A). En efecto, primero mostraremos que si S=>*w entonces q0,w,S|--*(q0,,) por
induccin sobre el nmero de pasos de derivacin.
Caso base: S=>*w en un paso, es decir, S=>w lo que slo puede hacerse si S-->wP,
pero entonces por construccin de A (q0,)(q0,w,S), luego en A es posible el siguiente
movimiento q0,w,S|--(q0,,), es decir, q0,w,S|--*(q0,,).
Hiptesis inductiva: El enunciado es cierto para derivaciones de menos de k pasos.
Paso inductivo: Supongamos que S=>*w es una derivacin ms a la izquierda que toma k
pasos. Desglosemos esta derivacin ms a la izquierda as: S=>*uX=>ua donde w=ua,
= y X-->aP. Es claro que S=>*u -con =X- en menos de k pasos, luego por
hiptesis inductiva q0,u,S|--*(q0,,), es decir, q0,w,S|--*(q0,a,X). Adems, por
construccin de A, como X-->aP, tenemos que (q0,)(q0,a,X), luego es posible dar el
siguiente movimiento (q0,a,X)|--*(q0,,), es decir, en A es posible q0,w,S|--*(q0,,) pues
=.
Inversamente mostraremos que si q0,w,S|--*(q0,,) entonces S=>*w por induccin sobre el
nmero de movimientos.

202
Caso base: q0,w,S|--*(q0,,) en un paso, es decir, q0,w,S|--(q0,,), ello slo puede
suceder porque (q0,)(q0,w,S), lo cual slo sucede si S-->wP, pero entonces es posible
S=>*w.
Hiptesis inductiva: El enunciado es cierto para menos de k movimientos.
Paso inductivo: Supongamos que q0,w,S|--*(q0,,) en k movimientos. Desglosemos estos
movimientos en su ltimo movimiento y el resto, para ello es bueno recordar que por la forma
de construir , las reglas de transicin slo permiten movimientos tipo 1, es decir el ltimo
movimiento de nuestro desglose debe consumir un smbolo y debe preguntar por un tope de
pila que puede tener o no smbolos debajo de l, de manera que podemos suponer que w=ua,
= en este desglose: q0,ua,S|--*q0,a,X|--(q0,,), donde los primeros movimientos
toman menos de k pasos y pueden dar lugar legtimamente a lo siguiente q0,u,S|--*q0,,X;
pero entonces por hiptesis inductiva S=>*uX. El ltimo movimiento q0,a,X|--(q0,,)
ha debido utilizar una regla donde (q0,)(q0,a,X), que est en A slo porque X-->aP.
Luego, en G es posible S=>*uX=>ua, es decir, S=>*w pues = y w=ua.
Por los anteriores resultados tenemos que S=>*w si y slo si q0,w,S|--*(q0,,), haciendo
= resulta que S=>*w si y slo si q0,w,S|--*(q0,,), es decir, L(G)=T(A).

Ejemplo:
Sea la GLC en FNG G=({S,B},{a,b},{S-->aSB,S-->aB,B-->b},S)
Construimos as el AP A=({q0},{a,b},{S,B},,q0,S,{})
:
(q0,a,S)={(q0,SB),(q0,B)}
(q0,b,B)= {(q0,)}

Alguna literatura sugiere otro procedimiento de construccin del APA, el mismo es ms


simple y no condiciona a la GLC G -es decir, no es necesario que G est en forma normal
alguna-, lamentablemente no respeta nuestra convencin de que N y T sean disjuntos. A pesar
de ello lo describimos a continuacin.
Sea G=(N,T,P,S) una GLC construimos as el APA=({q0},,(NT),,q0,S,{})
Ntese que la pila incluye los smbolos de T.
:
1) (q0,) (q0,,X) si X--> P
2) (q0,a,a) = {(q0,)} aT
Para el ejemplo de arriba, construimos as el AP A=({q0},{a,b},{S,B,a,b},,q0,S,{})
:
(q0,,S)={(q0,aSB),(q0,aB)}
(q0,,B)={(q0,b)}
(q0,a,a) = {(q0,)}
(q0,b,b) = {(q0,)}

203
Cuasi-gramticas Libres de Contexto y eliminacin de producciones borradoras
Dada nuestra restriccin de prohibir producciones borradoras, es decir, producciones del tipo
A--> en una GLC, denominaremos cuasi gramtica libre de contexto (cuasi-GLC) a una
cudrupla G=(N,T,P,S) cuyo comportamiento es semejante a las GLCs y cuyo conjunto de
producciones siguen la definicin de las producciones de una GLC excepto por la presencia de
producciones borradoras.
Por ejemplo G=({S},{a},{S-->aSa, S-->},S) es una cuasi-GLC.
Las introducimos aqu por ser necesarias para un resultado posterior.
Sea G una cuasi-GLC entonces es posible construir un GLC G tal que L(G)=L(G)-{}.
Demostracin:
Hacemos notar previamente que una cuasi-GLC no necesariamente genera la cadena vaca,
por ejemplo la cuasi-GLC G=({S,B},{a},{S-->aB,B-->},S) es tal que L(G)={a}.
Sea G=(N,T,P,S) una cuasi-GLC.
Sea ANULABLES = { AN / A=>* }
Identificaremos los No Terminales ANULABLES as:
B0 = {A / A--> P}
Bi+1 = Bi {A / A-->Bi+}
Si Bi=Bi+1 entonces Bi=ANULABLES
Construimos as la GLC G=(N,T,P,S).
P = { A--> / A-->P, } (*)
{ A-->e1e2...em / A-->0e11e2...em mP,
m , | 0e11e2...em m| 2
ei(NT), jANULABLES*} (**)
Es decir:
(*) Copiamos todas las producciones de P que no sean borradoras; y
(**) Aadimos las producciones que resulten de hacer lo siguiente:
En todas y cada una de las producciones de las producciones de (*) cuya parte derecha
tenga por lo menos dos smbolos, reemplazar uno o ms smbolos ANULABLES de la
parte derecha por es decir, borrar las subcadenas que estn en ANULABLES*).
Excepto si resultare una produccin borradora (que por supuesto no se aade).
Mostramos que si A=>* entonces AANULABLES por induccin sobre el nmero de pasos
de derivacin (es obvio que si A est en algn Bi est en ANULABLES).
Caso base: A=> en un paso, es decir, A-->P, luego A est en B0, es decir,
AANULABLES.
Hiptesis inductiva: El enunciado es cierto para derivaciones de menos de k pasos.
Paso inductivo: Sea que A=>* en k pasos de derivacin. Podemos desglosar esta derivacin
en su primer paso y los restantes as: A=>ej1...ejm=>* donde A-->ej1...ejmP, eji=>*.
Es claro que cada eji es un No Terminal pues los Terminales no pueden derivar ; como
eji=>* toma menos de k pasos, por hiptesis inductiva ejiANULABLES, pero entonces
ej1,...,ejm estn en algn Bh, luego la cadena ej1...ejmBh+ y por tanto A est en Bh+1, es decir,
AANULABLES.

204
El hecho de que si AANULABLES entonces A=>* sigue de la forma indicada de construir
este conjunto (aunque puede pensarse una induccin sobre i para Bi pues ANULABLES no es
ms que la reunin de todos estos conjuntos Bi).
Resta mostrar que L(G)=L(G)-{}. En efecto, mostraremos por induccin sobre el nmero
de pasos de derivacin el enunciado general siguiente:
Si A=>*w (w) en G, entonces A=>*w en G.
Caso base: A=>w en un paso de derivacin en G con A-->wP (w), es claro por (*) que
esta produccin est en P, luego A=>*w en G.
Hiptesis inductiva: El enunciado es cierto para derivaciones de menos de k pasos.
Paso inductivo: Sea que A=>*w en k pasos de derivacin con producciones de P (w).
Desglosaremos esta derivacin en su primer paso y los restantes as:
A=>w0X1w1X2w2...Xmwm=>*w0v1w1v2w2...vmwm as pues w=w0v1w1v2w2...vmwm, donde en el
primer paso se ha utilizado A-->w0X1w1X2w2...XmwmP con m XiN, wjT* y donde
Xj=>*vj en menos de k pasos con producciones de P. Si vj por hiptesis inductiva Xj=>*vj
con producciones de P, en cambio si vj= es claro que XjANULABLES.
Sea Yj=Xj si vj, Yj= en otro caso: por (**) es claro que A-->w0Y1w1Y2w2...Ymwm est en
P. Luego, A=>w0Y1w1Y2w2...Ymwm=>*w0v1w1v2w2...vmwm puede hacerse en G.
Inversamente, mostraremos que si A=>*w en G entonces A=>*w en G.
Cuando la derivacin A=>*w en G utiliza slo producciones que estaban en P, es obvio que
puede hacerse en G. Supongamos que un paso cualquiera de la derivacin A=>*w en G se
hace utilizando una produccin (nueva) de P que no estaba en P: sea A=>e1e2...em
dicho paso de derivacin efectuado con la produccin A-->e1e2...emP, por la forma de
construir P dicha produccin est presente porque A-->0e11e2...em mP con
jANULABLES*, es decir, j=>*. Pero entonces en G es posible la derivacin
A=>0e11e2...em m=>*e1e2...em, es decir,A=>*e1e2...em, luego el paso de
derivacin A=>e1e2...em con una produccin de P puede simularse en P.

Ejemplo:
Sea la cuasi-GLC G=({S,A,B,F},{a,b},P,S)
P:
S -->aSb
S -->BaA
S -->abF
S-->ABA
S-->A
F-->ASA
A-->
B-->
Primero calculamos ANULABLES:
B0={A,B}
B1=B0 {A / A-->uuB0+}={A,B} {S}={A,B,S}

205
B2=B1 {A / A-->u,uB1+}={A,B,S} {S,F}={A,B,S,F}
B3=B2 {A / A-->u,uB2+}={A,B,S,F} {S,F}={A,B,S,F}
Como B2=B3 entonces B2=ANULABLES={A,B,S,F}
Luego G=({S,A,B,F},{a,b},P,S)
P:
De (*) De (**) vienen
vienen
S -->ab borrando S en S -->aSb
S -->aSb S -->Ba borrando A en S-->BaA
S -->BaA S -->aA borrando B en S-->BaA
S -->abF S -->a borrando A,B en S-->BaA
S-->ABA S-->BA borrando A en S-->ABA (la primera A)
S-->A S-->AB borrando A en S-->ABA (la segunda A)
F-->ASA S-->AA borrando B en S-->ABA
S-->B borrando A en S-->ABA (ambas)
S-->A borrando A,B ( B,A) en S-->ABA
F-->SA borrando A en F-->ASA (la primera A)
F-->AS borrando A en F-->ASA (la segunda A)
F-->AA borrando S en F-->ASA
F-->S borrando A en F-->ASA (ambas)
F-->A borrando A,S ( S,A) en F-->ASA

Construccin de una GLC a partir de un AP


Inicialmente, sea A un AP entonces es posible construir una cuasi-GLC G tal que
L(G)=T(A).
Demostracin:
Sea el AP A=(K,,,,q0,Z,{}), construimos as la cuasi-GLC G=(N,,P,S)
N = {S} {[qi,X,qj]} qi,qjK, X
Ntese que los No Terminales son tripletas, salvo S.
P:
1) [qi,X,qkm]-->c[qj,Y1,qk1][qk1,Y2,qk2][qk2,Y3,qk3]...[qk(m-2),Ym-1,qk(m-1)][qk(m-1),Ym,qkm]
c {}), Yj, qkiK si (qj,Y1Y2...Ym)(qi,c,X)
2) [qi,X,qj]-->c c {}) si (qj,)(qi,c,X)
3) S-->[q0,Z,qi] qiK
En 1, fjese muy atentamente las coincidencias de los qki. Por ejemplo el qkm de la parte
izquierda es el mismo que el qkm de la ltima terna de la parte derecha.
L(G)=T(A).
En efecto, mostraremos por induccin sobre el nmero de pasos de derivacin que si
[qi,X,qj]=> *w entonces qi,w,X|--*(qj,,).

206
Caso base: [qi,X,qj]=>w en un paso de derivacin con [qi,X,qj]-->wP, por la forma de
construir P esta produccin est presente porque (qj,)(qi,w,X), luego (qi,w,X)|--*(qj,,) es
posible en A, sea que w=o que w es un smbolo de .
Hiptesis inductiva: El enunciado es cierto para derivaciones de menos de k pasos.
Paso inductivo: Sea que [qi,X,qj]=>*w en k pasos de derivacin con producciones de P.
Desglosaremos esta derivacin en su primer paso y los restantes as:
[qi,X,qj]=>c[qh,Y1,qk1][qk1,Y2,qk2][qk2,Y3,qk3]...[qk(m-2),Ym-1,qk(m-1)][qk(m-1),Ym,qj]=>*cw1...wm,
as pues w=cw1...wm, con c{}) y donde en el primer paso se ha utilizado
[qi,X,qj]-->c[qh,Y1,qk1][qk1,Y2,qk2][qk2,Y3,qk3]...[qk(m-2),Ym-1,qk(m-1)][qk(m-1),Ym,qj]P, por la
forma de construir P dicha produccin est presente porque (qh,Y1Y2...Ym)(qi,c,X).
Adems [qh,Y1,qk1]=>*w1, [qk(m-1),Ym,qj]=>*wm y [qk(n-1),Yn,qkn]=>*wn para n=2,...,m-1 en
menos de k pasos, por hiptesis inductiva qh,w1,Y1|--*(qk1,,), qk(m-1),wm,Ym|--*(qj,,) y
qk(n-1),wn,Yn|--*(qkn,,) para n=2,...,m-1. Luego, en A es posible:
qi, cw1...wm,X|--(qh,w1...wm,Y1Y2...Ym)|--*(qk1,w2...wm,Y2...Ym)|--*(qk(m-1),wm,Ym)|--*(qj,,).
Es decir, qi,w,X|--*(qj,,) pues w=cw1...wm.
Inversamente, mostraremos por induccin sobre el nmero de movimientos que
si qi,w,X|--*(qj,,) entonces [qi,X,qj]=>*w.
Caso base: qi,w,X|--(qj,,) en un movimiento, lo cual sucede cuando (qj,)(qi,w,X), pero
entonces por construccin de P [qi,X,qj]-->w est presente, luego [qi,X,qj]=>w, es decir,
[qi,X,qj]=>*w.
Hiptesis inductiva: El enunciado es cierto para menos de k movimientos.
Paso inductivo: Sea que qi,w,X|--*(qj,,) en k movimientos. Desglosmoslos en el primer
movimiento y los restantes haciendo w=cw1...wm, c{}), as:
qi,cw1...wm,X|--qh,w1...wm,Y1Y2...Ym|--*(qj,,)
Donde el primero movimiento ha utilizado la regla (qh,Y1Y2...Ym)(qi,c,X), por la forma de
construir P [qi,X,qj]-->c[qh,Y1,qk1][qk1,Y2,qk2][qk2,Y3,qk3]...[qk(m-2),Ym-1,qk(m-1)][qk(m-1),Ym,qj]
est presente.
Y donde qh,w1,Y1)|--*(qk1,,), qk(m-1),wm,Ym|--*(qj,,) y qk(n-1),wn,Yn|--*(qkn,,) para
n=2,...,m-1 en menos de k movimientos. Por hiptesis inductiva [qh,Y1,qk1]=>*w1,
[qk(m-1),Ym,qj]=>*wm y [qk(n-1),Yn,qkn]=>*wn para n=2,...,m-1 son posibles en P. Luego en G es
posible la derivacin
[qi,X,qj]=>c[qh,Y1,qk1][qk1,Y2,qk2][qk2,Y3,qk3]...[qk(m-2),Ym-1,qk(m-1)][qk(m-1),Ym,qj]
=>*cw1[qk1,Y2,qk2][qk2,Y3,qk3]...[qk(m-2),Ym-1,qk(m-1)][qk(m-1),Ym,qj]
=>*cw1...wm-1[qk(m-1),Ym,qj]
=>*cw1...wm-1wm
Es decir, [qi,X,qj]=>*w pues w=cw1...wm.

Con X=Z y qi=q0 los resultados anteriores dicen que q0,w,Z|--*(qj,,) si y slo si
[q0,Z,qj]=>*w, adems S=>*[q0,Z,qj] por 3), luego q0,w,Z|--*(qj,,) si y slo si S=>*w, es
decir, L(G)=T(A).

207
Ejemplo:
Sea el siguiente APA=(K,,,,q0,Z,{})
K{q0,q1{a,b ={Z,B}

(q0,a,Z)= {(q0,ZB)}
(q0,,Z) = {(q1,)}
(q1,b,B)= {(q1,)}
Que acepta T(A)={ aibi / i0 }
Construimos as la cuasi-GLC G=(N,{a,b},P,S)
N={S,[q0,Z,q0],[q0,Z,q1],[q1,Z,q0],[q1,Z,q1],[q0,B,q0],[q0,B,q1],[q1,B,q0],[q1,B,q1]}
P:
1) [q0,Z,qk2]-->a[q0,Z,qk1][qk1,B,qk2] qk1,qk2K que viene de (q0,ZB)(q0,a,Z)
Es decir,
[q0,Z,q0]-->a[q0,Z,q0][q0,B,q0]
[q0,Z,q0]-->a[q0,Z,q1][q1,B,q0]
[q0,Z,q1]-->a[q0,Z,q0][q0,B,q1]
[q0,Z,q1]-->a[q0,Z,q1][q1,B,q1]
2) [q0,Z,q1]--> que viene de (q1,)(q0,,Z) (ntese que la produccin es borradora)
[q1,B,q1]-->b que viene de (q1,)(q1,b,B)
3) S-->[q0,Z,q0]
S-->[q0,Z,q1]
No es necesario pero por claridad haremos un cambio de nombre en los No Terminales as:
Reemplazaremos [q0,Z,q1] por A, [q0,Z,q0] por B, [q0,B,q0] por C, [q0,B,q1] por D, [q1,B,q0]
por E y [q1,B,q1] por F.
De donde las producciones de la cuasi-GLC son P:
S-->B
S-->A
A-->
F-->b
B-->aBC
B-->aAE
A-->aBD
A-->aAF

Ahora s, consideramos el enunciado buscado, sea A un AP entonces es posible construir una


GLC G tal que L(G)=T(A)-{}.
Demostracin:
Sea el AP A=(K,,,,q0,Z,{})
Partiendo de A construimos la cuasi-GLC G tal que L(G)=T(A) como se indica arriba.

208
Y a partir de la cuasi-GLC G construimos la GLC G tal que L(G)=L(G)-{} como se indic
antes, es decir, eliminando las producciones borradoras de G. Dado que L(G)=T(A), entonces
L(G)=T(A)-{}. No es necesario pero recomendamos limpiar la GLC G.

Ejemplo:
Vamos a continuar el ejemplo de la cuasi-GLC G de antes.
Para eliminar las producciones borradoras de esta cuasi-GLC y construir as la GLC G
primero calculamos ANULABLES:
B0={A}
B1=B0 {A / A-->uuB0+}={A} {S}={A,S}
B2=B1 {A / A-->u,uB1+}={A,S}
Como B1=B2 entonces B1=ANULABLES={A,S}
Luego G=({S,A,B,C,D,E,F},{a,b},P,S)
P:
S-->B
S-->A
F-->b
B-->aBC
B-->aAE
A-->aBD
A-->aAF
B-->aE borrando A en B-->aAE
A-->aF borrando A en A-->aAF
Ntese que no podemos aadir S--> (borrando A en S-->A pues resulta una produccin
borradora).
Si queremos podemos continuar la limpieza de la gramtica para obtener finalmente
G=({S,A,F},{a,b},P,S)
P:
S --> aF
S --> aAF
A --> aAF
A --> aF
F --> b
Ntese que esta GLC G genera L(G)={ aibi / i>0 }=T(A)-{}.

Construccin de un APe.f. determinstico a partir de un AP determinstico


Sea A un AP determinstico entonces es posible construir un APe.f determinstico A tal que
T(A)=T(A).
Demostracin:
Sea el AP A=(K,,,,q0,Z,{}) Z; q0,qfK-, construimos as el APe.f
A=(K{q0,qf}, , Z}, , q0, Z, {qf})

209
:
1) (q0,,Z) = {(q0,ZZ)}
2) (qi,c,X) = (qi,c,X) qiK, c( {}), X
3) (qi,,Z) = {(qf,Z)} qiK
Ntese que el inciso 2 nos dice que copiemos .
La demostracin de que T(A)=T(A) es semejante a la que se hizo con APs arbitrarios.
Ninguna regla de los incisos 2 y 3 incluye a q0, luego para cualquier smbolo W
|(q0,a,W)+(q0,,W)|1, en realidad |(q0,,Z)|1 por el inciso 1.
Todas las reglas del inciso 2 preservan la propiedad |(qi,a,X)+(qi,,X)|1 pues A es
determinstico y ninguna incluye a q0 ni a Z usadas en las reglas de 1 y 3.
Finalmente la regla del inciso 3 pregunta por el tope Z y desde un estado en K, ninguna del
inciso 2 lo hace porque Z, adems aunque la regla del inciso 1 pregunta por el tope Z lo
hace desde q0 y q0K, es decir, |(qi,a,Z)+(qi,,Z)|1 con qiK, en realidad
|(qi,,Z)|1 con qiK.
Luego el APe.f A es determinstico.
Una forma alternativa de enunciar este resultado es as: Si existe un AP determinstico que
acepte L entonces existe un APe.f. determinstico que acepte L. Cuya contrarrecproca es:
Si no existe un APe.f. determinstico que acepte L entonces no existe un AP determinstico
que acepte L.

Sin embargo el otro enunciado: Si existe un APe.f. determinstico que acepte L entonces
existe un AP determinstico que acepte L, es falso.
Para probar ello mostraremos un lenguaje que sea aceptado por un APe.f. determinstico pero
que no sea aceptado por ningn AP determinstico.
Es claro que el siguiente APe.f. determinstico A es tal que T(A)={a,aa}
A=({q0,qf},{a},Z,X,Y},,q0,Z,{qf})
:
(q0,a,Z)={(qf,X)}
(qf,a,X)={(qf,Y)}

Ahora mostraremos que si un lenguaje L incluye dos cadenas u,w (uw) tales que u es prefijo
de w (w=uv), ningn AP determinstico acepta L:
Supongamos que el AP A=(K,,,,q0,Z,{}) es tal que T(A)=L, en particular acepta tanto u
como w, entonces q0,u,Z|--*(qh,,) con qhK. Veamos qu pasa con w=uv:
q0,uv,Z|--*(qh,v,) pues A es determinstico, pero entonces w no ser aceptada nunca pues la
pila ya est vaca.
El lenguaje L={a,aa} cumple las condiciones del enunciado y por lo tanto ningn AP
determinstico acepta L.

210
Construccin de un APe.f. determinstico en forma normal a partir de otro APe.f.
determinstico
Diremos que el APe.f. determinstico A est en forma normal 1 si todas sus reglas de
transicin son del tipo (q,c,Y)={(p,)} c({}) con ||2.
Diremos que el APe.f. determinstico A est en forma normal 2 si todas sus reglas de
transicin son del tipo (q,c,Y)={(p,)} c({}) con =, =Y =XY.
Sea A=(K,,,,q0,Z,F) un APe.f. determinstico entonces construimos as un APe.f
determinstico A en forma normal 1 tal que T(A)=T(A):
A=(K,, ,,q0,Z,F)
:
1) Si (q,c,Y)={(p,)} -c({})- con ||2
(q,c,Y) =(q,c,Y)
2) Si (q,c,Y)={(p,)} -c({})- con ||>2
Sea =Y1...Yn, n>2
(q,c,Y) = {(p1,Yn-1Yn)}
(pi,,Yn-i) = {(pi+1,Yn-i-1Yn-i)} i=1,...,n-3
(pn-2,,Y2) = {(p,Y1Y2)}
donde los pj son nuevos estados (no finales).
K = K {todos los nuevos estados aadidos}

Sea A=(K,,,,q0,Z,F) un APe.f. determinstico en forma normal 1 entonces construimos as


un APe.f determinstico A en forma normal 2 tal que T(A)=T(A):
A=(K,, {Z0}, ,q0,Z0,F)
:
1) (q0,,Z0) = {(q0,ZZ0)}
2) Si (q,c,Y)={(p,)} -c({})- con =, =Y =XY
(q,c,Y) =(q,c,Y)
3) Si (q,c,Y)={(p,X)} -c({})-
(q,c,Y) = {(pj,)}
(pj,,W) = {(p,XW)} W({Z0})
donde pj es un nuevo estado (no final)
4) Si (q,c,Y)={(p,XU)} -c({})-
(q,c,Y) = {(pj,)}
(pj,,W) = {(ph,UW)} W({Z0})
(ph,,U) = {(p,XU)}
donde pj,ph son nuevos estados (no finales)
K = K {q0} {todos los nuevos estados aadidos}

Ejemplo:
Sea el APe.f A1=({q0,q1,q2},{a,b,c,d,e},{Z,B,C,D,E},1,q0,Z,{q2})

211
1:
1(q0,a,Z)={(q1,BDE)}
1(q1,b,B)={(q1,C)}
1(q1,c,C)={(q1,)}
1(q1,d,D)={(q1,)}
1(q1,e,E)={(q2,ZZZZ)}
Construimos as el APe.f A=(K,{a,b,c,d,e},{Z,B,C,D,E},,q0,Z,{q2}) en forma normal 1.
K={q0,q1,q2,p1,p2,p3}
:
De Viene
1(q0,a,Z)={(q1,BDE)} (q0,a,Z)={(p1,DE)}
(p1,,D) = {(q1,BD)}

1(q1,b,B)={(q1,C)} (q1,b,B)={(q1,C)}
1(q1,c,C)={(q1,)} (q1,c,C)={(q1,)}
1(q1,d,D)={(q1,)} (q1,d,D)={(q1,)}

1(q1,e,E)={(q2,ZZZZ)} (q1,e,E)={(p2,ZZ)}
(p2,,Z) = {(p3,ZZ)}
(p3,,Z) = {(q2,ZZ)}

Construimos as el APe.f. en forma normal 2


A=(K,{a,b,c,d,e},{Z,B,C,D,E,Z0},,q0,Z0,{q2}).
:
De Viene
(q0,,Z0) = {(q0,ZZ0)}

(q0,a,Z)={(p1,DE)} (q0,a,Z) = {(p4,)}
(p4,,Z) = {(p5,EZ)}
(p4,,B) = {(p5,EB)}
(p4,,C) = {(p5,EC)}
(p4,,D) = {(p5,ED)}
(p4,,E) = {(p5,EE)}
(p4,,Z0) = {(p5,EZ0)}
(p5,,E) = {(p1,DE)}

(p1,,D) = {(q1,BD)} (p1,,D) = {(q1,BD)}

212
(q1,b,B)={(q1,C)} (q1,b,B) = {(p6,)}
(p6,,Z) = {(q1,CZ)}
(p6,,B) = {(q1,CB)}
(p6,,C) = {(q1,CC)}
(p6,,D) = {(q1,CD)}
(p6,,E) = {(q1,CE)}
(p6,,Z0) = {(q1,CZ0)}

(q1,c,C)={(q1,)} (q1,c,C)={(q1,)}
(q1,d,D)={(q1,)} (q1,d,D)={(q1,)}
(q1,e,E)={(p2,ZZ)} (q1,e,E) = {(p7,)}
(p7,,Z) = {(p8,ZZ)}
(p7,,B) = {(p8,ZB)}
(p7,,C) = {(p8,ZC)}
(p7,,D) = {(p8,ZD)}
(p7,,E) = {(p8,ZE)}
(p7,,Z0) = {(p8,ZZ0)}
(p8,,Z) = {(p2,ZZ)}

(p2,,Z) = {(p3,ZZ)} (p2,,Z) = {(p3,ZZ)}
(p3,,Z) = {(q2,ZZ)} (p3,,Z) = {(q2,ZZ)}
Vamos a terminar este captulo con el siguiente resultado:
Sea A un APe.f. A con |F| > 1, es decir con ms de un estado final, entonces es posible
construir un otro APe.f. A tal que |F| = 1 y T(A)=T(A).
Demostracin:
A partir de A construimos un AP A como se indic antes.
A partir de A construimos un APe.f. A como se indic antes.
Es obvio que A tiene F={qf} un solo estado final, las demostraciones anteriores prueban que
T(A)=T(A).
Ofrecemos la siguiente alternativa.
Sea el APe.f. A=(K,,,,q0,Z,F) -Z; q0,qfK -, construimos as el APe.f.
A=(K{q0,qf},,{Z},,q0, Z,F)
F = {qf }
:
1)(q0,,Z) = {(q0,ZZ)}
2) (qi,c,X) = (qi,c,X) qiK, c( {}), X
3) (qj,,X) = {(qf,)} qjF, X{Z}
Ntese que el inciso 2 nos dice que copiemos .

213
Ejemplo:
Sea el APe.f A=({q0,q1,q2,q3},{a,b,c},{Z},,q0,Z,{q2,q3})
:
(q0,a,Z)={(q1,Z)}
(q1,b,Z)={(q2,Z)}
(q2,c,Z)={(q3,Z)}
Construimos as el APe.f A=({q0,q1,q2,q3,q0,qf},{a,b,c},{Z,Z},,q0,Z,{qf})
:
(q0,,Z)={(q0,ZZ)}
(q0,a,Z)={(q1,Z)}
(q1,b,Z)={(q2,Z)}
(q2,c,Z)={(q3,Z)}
(q2,,Z) = {(qf,)}
(q2,,Z) = {(qf,)}
(q3,,Z) = {(qf,)}
(q3,,Z) = {(qf,)}

214
CAPTULO 11. CERRADURA: el caso libre de contexto

Unin
Los lenguajes libres de contexto son cerrados respecto de la operacin unin.
Sean G1=(N1,T1,P1,S1) y G2=(N2,T2,P2,S2) dos GLCs tales que L(G1)=L1 y L(G2)=L2 con
(N12 S(N1N2), entonces podemos construir una GLC G tal que L(G)=L1L2.
Demostracin:
Construimos as la GLC G=(N1N2{S},T1T2,P,S)
P = {S-->S1} (1)
{S-->S2} (2)
P1 P2 (3)
L(G)=L1L2. En efecto, sea wL1L2, es decir, S1=>*w en P1 S2=>*w en P2. Es claro que
S=>S1=>*w por 1 para el primer paso; por hiptesis y P1P -por 3- para el resto.
S=>S2=> w *
por 2 para el primer paso; por hiptesis y P2P -por 3- para el resto.
Es decir, S=>*w en G, es decir, wL(G).
Inversamente, sea wL(G), es decir, S=>*w en G. Ninguna produccin de 3 incluye a S, luego
el primer paso de dicha derivacin es S=>S1 S=>S2 (por 1 2), adems dado que
(N1N2)={}, no es posible que el uso de producciones se mezcle y por tanto el resto de la
derivacin se hace o slo con P1 o slo con P2. Es decir, la derivacin es S=>S1=>*w
utilizando slo producciones de P1 excepto el primer paso- lo que muestra que es posible
S1=>*w en G1, es decir, wL1; S=>S2=>*w utilizando slo producciones de P2 excepto el
primer paso- lo que muestra que es posible S2=>*w en G2, es decir, wL2. Es decir, wL1
wL2, es decir, w(L1L2).

Ejemplo:
Sea el lenguaje libre de contexto L1=L(G1)={aibj / i>j0} donde G1=({S1},{a,b},P1,S1)
P1:
S1-->aS1b
S1-->aS1
S1-->a
Sea el lenguaje libre de contexto L2=L(G2)={aibj / 0i<j} donde G2=({S2},{a,b},P2,S2)
P2:
S2-->aS2b
S2-->S2b
S2-->b
Construimos as la GLC G=({S,S1,S2},{a,b},P,S)
P:
S-->S1
S-->S2
S1-->aS1b

215
S1-->aS1
S1-->a
S2-->aS2b
S2-->S2b
S2-->b
G es tal que L(G)=L1L2={aibj / i>j0}{aibj / 0i<j}. Ntese que si tenemos el lenguaje
L={ aibj / ij, i+j>0 }, este puede caracterizarse como L={aibj / i>j0}{aibj / 0i<j}, que en
otros trminos podramos anotar as L={aibj / i>j}{aibj / i<j} as L={aibj / ij}.

Mostraremos la construccin con APe.f.s:


Sean A1=(K1,1,1,1,q0,Z1,F1) y A2=(K2,2,2,2,p0,Z2,F2) -(K1K2)={}, Z(12),
r0(K1K2) dos APe.f tales que T(A1)=L1 y T(A2)=L2, construimos as el APe.f.
A=(K1K2{r0}, 12, 12{Z}, , r0, Z, F1F2)
:
1)(r0,,Z) = { (q0,Z1), (p0,Z2) }
2) (qi,c,X) = 1(qi,c,X) qiK1, c(1 {}), X1
3) (pj,c,Y) = 2(pj,c,Y) pjK2, c(2 {}), Y2
Ntese que el inciso 2 nos dice que copiemos 1.
Ntese que el inciso 3 nos dice que copiemos 2. Adems,
w[L1L2] si y slo si w[T(A1)T(A2)] si y slo si
(q0,w,Z1)|--*(qf,,) qfF1 (p0,w,Z2)|--*(ph,,) phF2 si y slo si por 1y2 1y3
r0,w,Z|--(q0,w,Z1)|--*(qf,,) qfF1 r0,w,Z|--(p0,w,Z2)|--*(ph,,) phF2 en A si y slo si
r0,w,Z|--*(rj,,) rjF si y slo si
wT(A)
La construccin y la demostracin con APs es prcticamente idntica con ===.

Ejemplo:
Sea A1=({q0,q1},{a},{Z1},1,q0,Z1,{q1})
1: 1(q0,a,Z1)={(q1,Z1)}
Sea A2=({p0,p1},{b},{Z2},2,p0,Z2,{p1})
2: 2(p0,b,Z2)={(p1,Z2)}
Construimos as el APe.f. A=({q0,q1,p0,p1,r0},{a,b},{Z1,Z2,Z},,r0,Z,{q1,p1})
:
(r0,,Z)={(q0,Z1),(p0,Z2)}
(q0,a,Z1)={(q1,Z1)}
(p0,b,Z2)={(p1,Z2)}

Concatenacin
Los lenguajes libres de contexto son cerrados respecto de la operacin concatenacin.
Sean G1=(N1,T1,P1,S1) y G2=(N2,T2,P2,S2) dos GLCs tales que L(G1)=L1 y L(G2)=L2 con
(N12 S(N1N2), entonces podemos construir una GLC G tal que L(G)=L1.L2.

216
Demostracin:
Construimos as la GLC G=(N1N2{S},T1T2,P,S)
P = { S -->S1S2 } (1)
P1 P2 (2)
L(G)=L1.L2.
En efecto, sea wL1.L2 -w=uv-, es decir, S1=>*u en P1, S2=>*v en P2. Es claro que
S=>S1S2 por 1
*
=> uS2 por hiptesis y P1P -por 2-
=>*uv por hiptesis y P2P -por 2-
Es decir, S=>*w en G pues w=uv, es decir, wL(G).
Inversamente, sea wL(G), es decir, S=>*w en G. Ninguna produccin de 2 incluye a S, luego
el primer paso de dicha derivacin es S=>S1S2 -por 1-, adems dado que (N1N2)={}, no es
posible que el uso de producciones se mezcle y por tanto efectuando una derivacin ms a
la izquierda S1S2=>*uS2 se hace slo con P1, es decir S1=>*u en P1; y a partir de ah uS2=>*uv
se hace slo con P2, es decir S2=>*v en P2. Resulta pues que si S=>*uv=w, uL1 y vL2, es
decir, wL1.L2.

Ejemplo:
Sea el lenguaje libre de contexto L1=L(G1)={aibj / i>j0} donde G1=({S1},{a,b},P1,S1)
P1:
S1-->aS1b
S1-->aS1
S1-->a
Sea el lenguaje libre de contexto L2=L(G2)={aibj / 0i<j} donde G2=({S2},{a,b},P2,S2)
P2:
S2-->aS2b
S2-->S2b
S2-->b
Construimos as la GLC G=({S,S1,S2},{a,b},P,S)
P:
S-->S1S2
S1-->aS1b
S1-->aS1
S1-->a
S2-->aS2b
S2-->S2b
S2-->b

Mostraremos la construccin con APe.f.:


Sean A1=(K1,1,1,1,q0,Z1,F1) y A2=(K2,2,2,2,p0,Z2,F2) -(K1K2)={}, (12)={},
Z(12), r0(K1K2) dos APe.f tales que T(A1)=L1 y T(A2)=L2, construimos as el APe.f.
A=(K1K2{r0}, 12, 12{Z}, , r0, Z, F2)

217
:
1)(r0,,Z) = { (q0,Z1Z) }
2) (qi,c,X) = 1(qi,c,X) qiK1, c(1{}), X1
3) (qi,,X) = { (p0,Z2X) } qiF1, X(1{Z})
4) (pj,c,Y) = 2(pj,c,Y) pjK2, c(2{}), Y2
Ntese que el inciso 2 nos dice que copiemos 1 y que el inciso 4 nos dice que copiemos 2.
Adems, trabajando con w=uv,
uv[L1.L2] si y slo si uv[T(A1).T(A2)] si y slo si
(q0,u,Z1)|--*(qf,,) qfF1 y (p0,v,Z2)|--*(ph,,) phF2 si y slo si
r0,uv,Z|--(q0,uv,Z1Z)|--*(qf,v,Z) qfF1 por 1,2; y
(qf,v,Z)|--(p0,v,Z2Z)|--*(ph,,Z) phF2 por 3,4 si y slo si en A
r0,uv,Z|-- (rj,,) rjF si y slo si
*

uvT(A)

Ejemplo:
Sea A1=({q0,q1},{a},{Z1},1,q0,Z1,{q1})
1: 1(q0,a,Z1)={(q1,Z1)}
Sea A2=({p0,p1},{b},{Z2},2,p0,Z2,{p1})
2: 2(p0,b,Z2)={(p1,Z2)}
Construimos as el APe.f. A=({q0,q1,p0,p1,r0},{a,b},{Z1,Z2,Z},,r0,Z,{p1})
:
(r0,,Z)={(q0,Z1Z)}
(q0,a,Z1)={(q1,Z1)}
(q1,,Z1)={(p0,Z2Z1)}
(q1,,Z)={(p0,Z2Z)}
(p0,b,Z2)={(p1,Z2)}

La construccin con APs es as:


Sean A1=(K1,1,1,1,q0,Z1,{}) y A2=(K2,2,2,2,p0,Z2,{}) -(K1K2)={}, Z(12),
r0(K1K2) dos APs tales que T(A1)=L1 y T(A2)=L2, construimos as el AP
A=(K1K2{r0}, 12, 12{Z}, , r0, Z, {})
:
1)(r0,,Z) = { (q0,Z1Z) }
2) (qi,c,X) = 1(qi,c,X) qiK1, c(1{}), X1
3) (qi,,Z) = { (p0,Z2) } qiK1
4) (pj,c,Y) = 2(pj,c,Y) pjK2, c(2{}), Y2
Ntese que el inciso 2 nos dice que copiemos 1.
Ntese que el inciso 4 nos dice que copiemos 2.
Adems, trabajando con w=uv,
uv[L1.L2] si y slo si uv[T(A1).T(A2)] si y slo si

218
(q0,u,Z1)|--*(qi,,) qiK1 y (p0,v,Z2)|--*(pj,,) pjK2 si y slo si
r0,uv,Z|--(q0,uv,Z1Z)|--*(qi,v,Z) qiK1 por 1,2; y
(qi,v,Z)|--(p0,v,Z2)|-- (pj,,) pjK2
*
por 3,4 en A si y slo si
r0,uv,Z|--*(rj,,) rjK si y slo si
uvT(A)

Ejemplo:
Sea A1=({q0,q1},{a},{Z1},1,q0,Z1,{q1})
1: 1(q0,a,Z1)={(q1,)}
Sea A2=({p0,p1},{b},{Z2},2,p0,Z2,{p1})
2: 2(p0,b,Z2)={(p1,)}
Construimos as el APe.f. A=({q0,q1,p0,p1,r0},{a,b},{Z1,Z2,Z},,r0,Z,{p1})
:
(r0,,Z)={(q0,Z1Z)}
(q0,a,Z1)={(q1,)}
(q0,,Z) = {(p0,Z2)}
(q1,,Z) = {(p0,Z2)}
(p0,b,Z2)={(p1,)}

Cruz de Kleene
Los lenguajes libres de contexto son cerrados respecto de la operacin cruz de Kleene.
Sea G1=(N1,T1,P1,S1) una GLC tal que L(G1)=L con SN1, entonces podemos construir una
GLC G tal que L(G)=L+.
Demostracin:
Construimos as la GLC G=(N1{S},T1,P,S)
P = { S --> S1S } (1)
{ S --> S1 } (2)
P1 (3)
L(G)=L . En efecto, sea wL , es decir, w=w1...wm con m>0, S1=>*wi. Es claro que
+ +

S=>*S1...S1 por 1 y 2, S deriva una cadena de m (m>0) smbolos S1


=>*w1S1...S1 por hiptesis y P1P -por 3- iniciando una derivacin ms a la izquierda
=>*w1...wm por hiptesis y P1P -por 3-
Luego, wL(G).
Inversamente, sea wL(G), es decir, S=>*w en G. La forma en que se construye P indica que
esta derivacin debe ser de la forma S=>*S1...S1S=>*S1...S1=>*w1...wm
Donde cada wi se deriva de S1, es decir, cada wiL. Luego, si S=>*w en G, w=w1...wm, con
wiL, es decir, wL+.

Ejemplo:
Sea el lenguaje libre de contexto L1=L(G1)={aibj / i>j0} donde G1=({S1},{a,b},P1,S1)

219
P1:
S1-->aS1b
S1-->aS1
S1-->a
Construimos as la GLC G=({S,S1},{a,b},P,S)
P:
S-->S1S
S-->S1
S1-->aS1b
S1-->aS1
S1-->a

Mostraremos la construccin con APe.f. -incluyendo la cadena vaca-:


Sea A1=(K1,1,1,1,q0,Z1,F1) - Z1, r0K1 un APe.f tal que T(A1)=L, construimos as el
APe.f. A tal que T(A)=L*: A=(K1{r0,r1}, 1, 1{Z}, , r0, Z, {r0})
:
1)(r0,,Z) = { (q0,Z1Z) }
2) (qi,c,X) = 1(qi,c,X) qiK1, c(1{}), X1
3) (qi,,X) = { (r1,X) } qiF1, X(1{Z})
4) (r1,,X) = { (r1,) } X1
5) (r1,,Z) = { (r0,Z) }
Ntese que el inciso 2 nos dice que copiemos 1. Adems
wL+ si y slo si
w=w1...wm con m0 wiT(A1) si y slo si
(q0,wi,Z1)|--*(qi,,j) qiF1 si y slo si en A
r0,wi,Z|--(q0,wi,Z1Z) por 1
|--*(qi,,jZ) por hiptesis y 2, qiF1
|--(r1,,jZ) por 3
|--*(r1,,Z) por 4
|--(r0,,Z) por 5 si y slo si
r0,w1...wm,Z|--*(r0,,Z) con m0, r0F si y slo si
wT(A) w=w1...wm
Por otro lado es claro que (r0,,Z)|--*(r0,,Z) con r0F por la reflexividad de la clausura
reflexiva transitiva de |--, es decir, T(A).

Una construccin alternativa es A=(K1{r0}, 1, 1{Z}, , r0, Z, {r0})


:
1)(r0,,Z) = { (q0,Z1Z) }
2) (qi,c,X) = 1(qi,c,X) qiK1, c(1{}), X1
3) (qi,,X) = { (r0,ZX) } qiF1, X(1{Z})

220
Ejemplo:
Sea A1=({q0,q1},{a},{Z1},1,q0,Z1,{q1})
1: 1(q0,a,Z1)={(q1,Z1)}
Construimos as el APe.f. A=({q0,q1,r0,r1},{a},{Z1,Z},,r0,Z,{r0})
:
(r0,,Z) = {(q0,Z1Z)}
(q0,a,Z1)={(q1,Z1)}
(q1,,Z1)={(r1,Z1)}
(q1,,Z)={(r1,Z)}
(r1,,Z1)={(r1,)}
(r1,,Z)={(r0,Z)}

La construccin alternativa da A=({q0,q1,r0},{a},{Z1,Z},,r0,Z,{r0})


(r0,,Z) = {(q0,Z1Z)}
(q0,a,Z1)={(q1,Z1)}
(q1,,Z1) = {(r0,ZZ1)}
(q1,,Z) = {(r0,ZZ)}

La construccin con APs es as:


Sea A1=(K1,1,1,1,q0,Z1,F1) - Z1, r0K1 un AP tal que T(A1)=L construimos as el
el AP A=(K1{r0}, 1, 1{Z}, , r0, Z, {})
:
1)(r0,,Z) = { (q0,Z1Z), (r0,) }
2) (qi,c,X) = 1(qi,c,X) qiK1, c(1{}), X1
3) (qi,,Z) = { (r0,Z) } qiK1
Ntese que el inciso 2 nos dice que copiemos 1. Adems
wL+ si y slo si
w=w1...wm con m0 wiT(A1) si y slo si
(q0,wi,Z1)|-- (qi,,) qiK1
*
si y slo si en A
r0,wi,Z|--(q0,wi,Z1Z)|--*(qi,,Z)|--(r0,,Z)|--(r0,,) qiK1 por 1,2,3 y 1 si y slo si
r0,w1...wm,Z|--*(r0,,) rjK con m0 si y slo si
wT(A) w=w1...wm
Por otro lado es claro que (r0,,Z)|--(r0,,) -por 1-, es decir, T(A).

Ejemplo:
Sea A1=({q0,q1},{a},{Z1},1,q0,Z1,{})
1: 1(q0,a,Z1)={(q1,)}
Construimos as el APe.f. A=({q0,q1,r0},{a},{Z1,Z},,r0,Z,{})

221
:
(r0,,Z) = { (q0,Z1Z), (r0,) }
(q0,a,Z1)={(q1,)}
(q0,,Z) = {(r0,Z)}
(q1,,Z) = {(r0,Z)}

Interseccin, diferencia y complemento


Los lenguajes libres de contexto no son cerrados respecto de la operacin interseccin: es
decir dados dos lenguajes libres de contexto L1 y L2: L=(L1L2) no es siempre libre de
contexto, puede serlo o no. En otras palabras, existen lenguajes libres de contexto L1 y L2 tales
que L=(L1L2) no es libre de contexto.
Lo mismo sucede con la operacin complemento y con la operacin diferencia.

En efecto, es claro que L1={a,b} y L2={b,c} son lenguajes libre de contexto, pues son finitos y
de ah regulares -es obvio que toda GR es una GLC-. L=(L1L2)={b}, que es finito y de ah
regular y por lo tanto libre de contexto.
Por otro lado, L1={aibicj / i+j>0} y L2={aibjcj / i+j>0} son lenguajes libres de contexto pues
L1=L(G1) con G1=({S,X,C},{a,b,c},P1,S)
P1:
S-->XC
S-->X
S-->C
X-->aXb
X-->ab
C-->cC
C-->c
Y L2=L(G2) con G2=({Z,Y,A},{a,b,c},P2,Y)
P2:
Z-->AY
Z-->A
Z-->Y
Y-->bXc
Y-->bc
A-->aA
A-->a
En este caso L=(L1L2)={ajbjcj / j>0}, en el siguiente captulo demostraremos que este
lenguaje no es libre de contexto.

Para la diferencia: con los lenguajes libre de contexto L1={a,b} y L2={b,c}, L=(L1-L2)={a}
que es finito y de ah regular y por lo tanto libre de contexto.
Por otro lado, L1={aibicj / i+j>0} y L2={aibjck / jk, i+j+k>0} son libres de contexto pues
L1=L(G1) con G1 como antes y L2=L(G2) con G2=({Z,A,W,S1,S2},{a,b},P2:,Z)

222
P2:
Z-->A
Z-->W
Z-->AW
W-->S1
W-->S2
S1-->bS1c
S1-->bS1
S1-->b
S2-->bS2c
S2-->S2c
S2-->c
A-->aA
A-->a
Ahora L=(L1-L2)={ajbjcj / j>0} (esto puede verse ms rpidamente recordando que
L1-L2=L1L2c, L2c representa el complemento de L2), en el siguiente captulo demostraremos
que este lenguaje no es libre de contexto.

Para el complemento: Supongamos que los lenguajes libres de contexto son cerrados respecto
de la operacin complemento. Sean L1 y L2 dos lenguajes libres de contexto, sean L3=L1c y
L4=L2c sus complementos (libres de contexto, por el supuesto), entonces L5=L3L4 tambin es
libre de contexto (por la cerradura para la unin). Luego L= L5c tambin es libre de contexto
(por el supuesto). Pero L=(L1L2), de modo que los lenguajes libres de contexto son cerrados
respecto de la operacin interseccin. Sabemos que esto falso, lo muestra que nuestro
supuesto est equivocado.

Interseccin y diferencia entre un lenguaje libre de contexto y uno regular


Aunque los lenguajes libres de contexto no son cerrados respecto de la interseccin, ello
cambia cuando se intersecta un lenguaje libre de contexto con uno regular.
Sean L1=T(A1) A1 un APe.f. y L2=T(A2) A2 un AFD, entonces podemos construir un APe.f A
tal que T(A)=(L1L2).
Demostracin:
Sean A1=(K1,,,1,q0,Z,F1) y A2=(K2,,2,p0,F2), construimos as el APe.f
A=(K1 X K2), , , , [q0,p0], Z, F1 X F2)
:
([qj,ph],)([qi,pg],a,X) si (qj,)1(qi,a,X) y 2(pg,a)=ph
2) ([qj,ph],)([qi,ph],,X) si (qj,)1(qi,,X), phK2
T(A)=[T(A1)T(A2)]. En efecto, mostraremos por induccin sobre el nmero de movimientos
que si ([q0,p0],w,Z)|--*([qj,ph],,) en A entonces (q0,w,Z)|--*(qj,,) en A1 y 2*(p0,w)=ph.
Caso base: Ntese que por ser un APe.f se puede alcanzar un estado final con cero
movimientos si la cadena de entrada es la vaca y si el estado inicial es final. Sea pues,

223
([q0,p0],w,Z)|--*([qj,ph],,) en cero movimientos, por lo cual [q0,p0]=[qj,ph], w= y =Z.
Entonces es obvio que (q0,w,Z)|--*(qj,,) en A1 por la reflexividad de |--* y 2*(p0,w)=ph por
definicin de 2*.
Hiptesis inductiva: El enunciado es cierto para menos de k movimientos.
Paso inductivo: Sea que ([q0,p0],w,Z)|--*([qj,ph],,) en k movimientos. Desglosmoslos en el
ltimo movimiento y el resto, con w=uc -c({})-, as:
([q0,p0],uc,Z)|--*([qi,pg],c,X)|--([qj,ph],,) donde = y el ltimo movimiento ha utilizado
la regla ([qj,ph],)([qi,pg],c,X), esta regla est presente porque (qj,)1(qi,c,X) y
2(pg,c)=ph si c (si c=, pg=ph). Adems, ([q0,p0],uc,Z)|--*([qi,pg],c,X) se hace en menos de
k movimientos, es decir, ([q0,p0],u,Z)|--*([qi,pg],,) con =X se hace en menos de k
movimientos, por hiptesis inductiva resulta que (q0,u,Z)|--*(qi,,) en A1 y 2*(p0,u)=pg.
Pero entonces en A1 es posible (q0,uc,Z)|--*(qi,c,X)|--(qj,,) y en A2 es posible
2*(p0,uc)=2(2*(p0,u),c)=2(pg,c)=ph (si c=, 2*(p0,uc)=2*(p0,u)=pg=ph).
Es decir, (q0,w,Z)|--*(qj,,) en A1 y 2*(p0,w)=ph -pues w=uc, =.
Inversamente, mostraremos por induccin sobre el nmero de movimientos que
si (q0,w,Z)|--*(qj,,) en A1 y 2*(p0,w)=ph entonces ([q0,p0],w,Z)|--*([qj,ph],,) en A.
Caso base: Ntese que por ser un APe.f se puede alcanzar un estado final con cero
movimientos si la cadena de entrada es la vaca y si el estado inicial es final. Sea pues,
(q0,w,Z)|--*(qj,,) en A1 en cero movimientos y 2*(p0,w)=ph, por lo cual qj=q0, w= y =Z,
adems que ph=p0. Pero entonces por la reflexividad de |--* en A ([q0,p0],w,Z)|--*([qj,ph],,).
Hiptesis inductiva: El enunciado es cierto para menos de k movimientos.
Paso inductivo: Sea que (q0,w,Z)|--*(qj,,) en A1 en k movimientos y 2*(p0,w)=ph.
Desglosemos los movimientos en el ltimo y el resto, con w=uc -c({})-, as:
(q0,uc,Z)|--*(qi,c,X)|--(qj,,) donde = y el ltimo movimiento ha utilizado la regla
(qj,)1(qi,c,X). Es claro que (q0,uc,Z)|--*(qi,c,X), se hace en menos de k movimientos, es
decir, (q0,u,Z)|--*(qi,,) con =X se hace en menos de k movimientos.
. si c=: tenemos que 2*(p0,u)=ph y (q0,u,Z)|--*(qi,,) con =X se hace en menos de k
movimientos, por hiptesis inductiva resulta que ([q0,p0],u,Z)|--*([qi,ph],,) en A. Como
(qj,)1(qi,,X), esta regla permite, por 2, que ([qj,ph],)([qi,ph],,X). Luego, en A es
posible ([q0,p0],u,Z)|--*([qi,ph],,X)|--([qj,ph],,), es decir, ([q0,p0],w,Z)|--*([qj,ph],,)
pues w=u, =.
. si c=a, a: tenemos que 2*(p0,w)=ph, sea 2*(p0,u)=pg, como w=ua, resulta que 2(pg,a)=ph.
As pues (q0,u,Z)|--*(qi,,) con =X se hace en menos de k movimientos y 2*(p0,u)=pg, por
hiptesi inductiva ([q0,p0],u,Z)|--*([qi,pg],,) en A. Como (qj,)1(qi,a,X), esta regla junto a
2(pg,a)=ph permiten, por 1, que ([qj,ph],)([qi,pg],a,X). Luego, en A es posible
([q0,p0],ua,Z)|--*([qi,pg],a,X)|--([qj,ph],,), es decir, ([q0,p0],w,Z)|--*([qj,ph],,) pues w=ua,
=.
Hemos probado que ([q0,p0],w,Z)|--*([qj,ph],,) en A si y slo si (q0,w,Z)|--*(qj,,) en A1 y
2*(p0,w)=ph. Con qjF1 y phF2, el enunciado dice que wT(A) si y slo si wT(A1) y
wT(A2).

224
Ejemplo:
Sea el AFD A2=({p0},{a},2,p0,{p0})
2: 2(p0,a)=p0
Sea el APe.f. A1=({q0,q1},{a},{Z},,q0,Z,{q1})
1:
1(q0,a,Z)={(q1,Z)}
1(q1,a,Z)={(q0,Z)}

Contruimos as el APe.f. A=({[q0,p0],[q1,p0]},{a},{Z},,[q0,p0],Z,{[q1,p0]})


:
([q0,p0],a,Z)={([q1,p0],Z)}
([q1,p0],a,Z)={([q0,p0],Z)}

Es importante hacer resaltar, para ello basta ver la forma de construir A, que si el APe.f. A1 es
determinstico, el APe.f resultante A es tambin determinstico.

Una interesante construccin alternativa parte de una GLC limpia G=(N,T,P,S) y de un AFD
A=(K,T,,q1,F) para construir la GLC G tal que L(G)=L(G)T(A) as:
G=(N,T,P,S)
N={S} { Ypq / Y(NT); p,qK }
P:
1) S-->Sq1p pK
2) Ypq-->X1pr1X2r1r2...Xmr(m-1)q si Y-->X1...XmP; p,r1,...,r(m-1),qK
pq
3) a -->a si (p,a)=q

Ejemplo:
Sea el AFD A=({q1},{a,b},,q1,{q1})
: (q1,a)=(q1,b)=q1
Sea la GLC G=({S},{a,b},P,S)
P:
S-->aSb
S-->ab

Construimos as la GLC G=(N,{a,b},P,S)


N={S, Sq1q1, aq1q1, bq1q1}
P:
S-->Sq1q1
Sq1q1-->aq1q1Sq1q1bq1q1
Sq1q1-->aq1q1bq1q1
aq1q1-->a
bq1q1-->b

225
Para la diferencia: sean L1=T(A1) A1 un APe.f. y L2=T(A2) A2 un AFD, entonces podemos
construir un APe.f A tal que T(A)=(L1-L2). En efecto, sabemos que los lenguajes regulares son
cerrados respecto de la operacin complemento, es decir L2c es regular.
(L1-L2)=(L1L2c), es decir, la diferencia entre un lenguaje libre de contexto y uno regular no
es sino la interseccin entre un lenguaje libre de contexto y otro regular, lo que como
acabamos de ver- es libre de contexto.

Interseccin, complemento y diferencia entre lenguajes libres de contexto


determinsticos
Sea L=T(A) A un APe.f. determinstico, entonces podemos construir otro APe.f.
determinstico A tal que T(A)=Lc.
Para mostrar este enunciado requerimos algunos resultados previos.
El siguiente APe.f.determinstico de ejemplo A=({q0,q1},{a},{Z},,q0,Z,{q1}) con una nica
regla de transicin (q0,a,Z)={(q1,Z)} nos sirve para mostrar que necesitamos alguna forma de
consumir toda la cadena entrada (para cualquier entrada). Con la entrada w=aaa tenemos que
(q0,aaa,Z)|--(q1,aa,Z). Es claro que w no es aceptada, sin embargo lo que nos interesa remarcar
ahora es que este APe.f. no ha ledo toda su entrada, que es lo que se desea.
Aunque apelaremos a un estado muerto, no basta incluirlo directamente, pues necesitamos
que el APe.f. resultante no slo acepte el mismo lenguaje que el autmata inicial sino que
adems siga siendo determinstico.
El ejemplo siguiente muestra efectivamente que aadir un estado muerto directamente
puede ser errneo.
Sea el APe.f. determinstico A=({q0,q1,q2},{a},{Z},,q0,Z,{q2})
: (q0,a,Z)={(q1,Z)}(q1,,Z)={(q2,Z)}(q2,,Z)={(q1,Z)}
T(A)={a} nuevamente y -por ejemplo- con w=aaa este autmata sigue sin consumir toda su
entrada. Sin embargo, si pensamos transitar de q1 (o q2) hacia un estado muerto con el smbolo
a para all consumir toda la entrada es evidente que el nuevo autmata ser no
determinstico.

Debemos pues construir otro APe.f. tal que consuma toda su entrada pero siga siendo
determinstico. Para ello definiremos al par (q,Y) con qK,Y como cclico si
(q,,Y)|--+(q,,Y) con ,*. Si desde la d.i. inicial logramos accesar a otra d.i. que
tenga a q como estado actual y a Y como el tope de la pila, entonces el APe.f. A puede
ingresar a una secuencia infinita de movimientos de tipo 2, atravesando posiblemente por
estados finales incluso sin consumir toda su entrada.
Sea A=(K,,,,q0,Z,F) el APe.f. determinstico inicial con q0,qe,qmK y Z0, a partir de l
construimos as otro APe.f A=(K {q0,qe,qm},, {Z0},,q0,Z0,F {qe})
:
1) (q0,,Z0) = {(q0,ZZ0)}
2) (q,a,Z0) = {(qm,Z0)} qK, a
3) (q,a,Y) = {(qm,Y)} si |(q,a,Y)+(q,,Y)|=0 qK, a, Y
4) (qm,a,Y) = {(qm,Y)} a, Y{Z0}

226
5) Calculamos todos los pares cclicos.
Para cada par cclico (q,Y) calculamos todos los estados qj a los que se llega desde el estado q
con el tope Y- solamente con -transiciones, es decir, con qK,Y, todos los estados qj
tales que (q,,Y)|--*(qj,,) *:
(q,,Y) = {(qm,Y)} si ningn qjF
(q,,Y) = {(qe,Y)} si algn qjF
6) (qe,,Y) = {(qm,Y)} Y{Z0}
7) (q,a,Y) =(q,a,Y) si (q,a,Y) no se ha definido en 2,3 5 qK, a{}, Y
A no slo consumir toda su entrada, sino que ya no tiene ningn par cclico, de manera que
no ingresar a secuencias infinitas de movimientos, adems T(A)=T(A).
Ahora s retornamos al enunciado inicial, a partir del APe.f A=(K,,,,q0,Z,F) que no tiene
pares cclicos (y que consume toda su entrada) construimos otro APe.f A tal que
T(A)=*-T(A), es decir A acepta el complemento de A.
A=(K,,,,q0,Z,F)
K = {[q,r] / qK, r=1,2,3}
q0 = [q0,1] si q0F
[q0,2] si q0F
F={ [q,3] / qK }
:
1) Si (q,,Y)={(p,)} y pF
([q,1],,Y) = {([p,1],)}
([q,2],,Y) = {([p,1],)}
2) Si (q,,Y)={(p,)} y pF
([q,1],,Y) = {([p,1],)}
([q,2],,Y) = {([p,2],)}
3) Si (q,a,Y)={(p,)} y pF
([q,2],,Y) = {([q,3],Y)}
([q,1],a,Y) = ([q,3],a,Y) = {([p,1],)}
4) Si (q,a,Y)={(p,)} y pF
([q,2],,Y) = {([q,3],Y)}
([q,1],a,Y) = ([q,3],a,Y) = {([p,2],)}

Ejemplo:
Sea el APe.f A1=({q0,q1,q2},{a},{Z},1,q0,Z,{q2})
1:
1(q0,a,Z)={(q1,Z)}
1(q1,,Z)={(q2,Z)}
1(q2,,Z)={(q1,Z)}
Es claro que T(A)={a}.
Ahora construiremos otro APe.f. determinstico A que consuma toda su entrada, que no tenga
pares cclicos y tal que T(A)=T(A1):

227
A=({q0,q1,q2,p0,qe,qm},{a},{Z,Z0},,p0,Z0,{q2,qe})
:
a) (p0,,Z0)={(q0,ZZ0)} por la regla 1
b) (q0,a,Z0)={(qm,Z0)} por la regla 2
c) (q1,a,Z0)={(qm,Z0)} idem
d) (q2,a,Z0)={(qm,Z0)} idem
la regla 3 no se aplica (todos los estados tienen salidas)
e) (qm,a,Z)={(qm,Z)} por la regla 4
f) (qm,a,Z0)={(qm,Z0)} idem
En A1 los pares cclicos son (q1,Z) y (q2,Z) pues (q1,,Z)|--+(q1,,Z) y (q2,,Z)|--+(q2,,Z).
Desde q1 con el tope Z podemos llegar a q2(F) y a q1.
Desde q2 con el tope Z podemos llegar a q1 y a q2(F).
g) (q1,,Z)={(qe,Z)} por la regla 5
h) (q2,,Z)={(qe,Z)} idem
i) (qe,,Z)={(qm,Z)} por la regla 6
j) (qe,,Z0)={(qm,Z0)} idem
k) (q0,a,Z)={(q0,Z)} por la regla 7
Partiendo de A construiremos otro APe.f. determinstico A talque T(A)=*-T(A).
A=(K,{a},{Z,Z0},,q0,Z0,F)
K={[p0,1],[q0,1],[q1,1],[q2,1],[qe,1],[qm,1],
[p0,2],[q0,2],[q1,2],[q2,2],[qe,2],[qm,2],
[p0,3],[q0,3],[q1,3],[q2,3],[qe,3],[qm,3]}
q0=[p0,2]
F={[p0,3],[q0,3],[q1,3],[q2,3],[qe,3],[qm,3]}
:
De la transicin a) por la regla 2 :
([p0,1],,Z0)={([q0,1],ZZ0)}
([p0,2],,Z0)={([q0,2],ZZ0)}
De la transicin b) por la regla 4:
([q0,2],,Z0)={([q0,3],Z0)}
([q0,1],a,Z0)={([qm,2],Z0)}
([q0,3],a,Z0)={([qm,2],Z0)}
De la transicin c) por la regla 4:
([q1,2],,Z0)={([q1,3],Z0)}
([q1,1],a,Z0)={([qm,2],Z0)}
([q1,3],a,Z0)={([qm,2],Z0)}
De la transicin d) por la regla 4:
([q2,2],,Z0)={([q2,3],Z0)}
([q2,1],a,Z0)={([qm,2],Z0)}
([q2,3],a,Z0)={([qm,2],Z0)}

228
De la transicin e) por la regla 4:
([qm,2],,Z)={([qm,3],Z)}
([qm,1],a,Z)={([qm,2],Z)}
([qm,3],a,Z)={([qm,2],Z)}
De la transicin f) por la regla 4:
([qm,2],,Z0)={([qm,3],Z0)}
([qm,1],a,Z0)={([qm,2],Z0)}
([qm,3],a,Z0)={([qm,2],Z0)}
De la transicin g) por la regla 1:
([q1,1],,Z)={([qe,1],Z)}
([q1,2],,Z)={([qe,1],Z)}
De la transicin h) por la regla 1:
([q2,1],,Z)={([qe,1],Z)}
([q2,2],,Z)={([qe,1],Z)}
De la transicin i) por la regla 2:
([qe,1],,Z)={([qm,1],Z)}
([qe,2],,Z)={([qm,2],Z)}
De la transicin j) por la regla 2:
([qe,1],,Z0)={([qm,1],Z0)}
([qe,2],,Z0)={([qm,2],Z0)}
De la transicin k) por la regla 4:
([q0,2],,Z)={([q0,3],Z)}
([q0,1],a,Z)={([q1,2],Z)}
([q0,3],a,Z)={([q1,2],Z)}
Hemos resaltado en negrita las reglas de transicin que sera interesante graficar primero si as
se desea.
Resta indicar si el clculo de pares cclicos es computable, es decir, si podemos escribir algn
algoritmo que nos diga, dado un APe.f. determinstico A, cules son sus pares cclicos si
existen. Dicho clculo en efecto es computable: Para cada par estado,smbolo de la pila (q,Y)
podemos iniciar una serie de -transiciones, si en algn momento ello no es posible es claro
que el par no es cclico, slo resta ver si (q,,Y)|--+(q,,Y) en un nmero posiblemente
largo pero finito de movimientos puesto que el nmero de estados y el nmero de smbolos es
finito.
Ello se simplifica si A est en forma normal 2, cosa que exigiremos al utilizar la conversin.

Existen lenguajes libres de contexto determinsticos cuya unin no es un lenguaje libre de


contexto determinstico: En efecto, sean L1={aibjck / ij, j0} y L2={aibjck / ik, j0}, primero
mostraremos que ambos lenguajes son libres de contexto determinsticos describiendo APs
determinsticos que los acepten:

El APe.f. determinstico A1=({q0,q1},{a,b,c},{Z,A,C},1,q0,Z,{q0,q1}) acepta L1.

229
1:
1(q0,a,Z)={(q0,AZ)}
1(q0,a,A)={(q0,AA)}
1(q0,b,A)={(q1,)}
1(q1,b,A)={(q1,)}
1(q0,c,A)={(q1,C)}
1(q1,c,A)={(q1,C)}
1(q0,c,Z)={(q1,C)}
1(q1,c,Z)={(q1,C)}
1(q1,c,C)={(q1,C)}
El APe.f. determinstico A2=({p0,p1},{a,b,c},{Z,A,B},2,p0,Z,{p0,p1}) acepta L2.
2:
2(p0,a,Z)={(p0,AZ)}
2(p0,a,A)={(p0,AA)}
2(p0,b,A)={(p0,A)}
2(p0,c,A)={(p1,)}
2(p1,c,A)={(p1,)}
2(p0,b,Z)={(p1,B)}
2(p1,b,B)={(p1,B)}
Sea L=(L1L2). Es claro que
Lc = (L1L2)c = [ {aibjck / ij, j0} {aibjck / ik, j0} ]c
= ({a}*{b}*{c}*)c {aibjck / i<j, i<k}
Y de ah L3 = [Lc ({a}*{b}*{c}*)] = {aibjck / i<j, i<k}
Ahora mostraremos que L3 no es libre de contexto. Supongamos que lo es y que G=(N,T,P,S)
con |N|=n es una GLC en FNCH tal que L(G)=L3, sea m=2n y sea la cadena w=aibjck en L(G)
con i=m, j=k=m+1, es decir w=ambm+1cm+1, por el lema de bombeo podemos reescribir as
w=yuxvz con |uv|>0, |uxv|2n, adems que yuhxvhzL(G) para todo h0. Como siempre
hacemos un anlisis de las cadenas u y v:
. Si u o v (o ambas subcadenas) incluyen dos smbolos diferentes, con h=2 por simple
inspeccin la cadena resultante yu2xv2z no est en L(G) pues tiene smbolos mezclados (por
ejemplo a..ab..ba..ab..b), pero el lema dice que esas cadenas estn en L(G). Una
contradiccin.
. Si u (o v) incluye slo as, con h suficientemente grande e incluso con h=2- por simple
inspeccin las cadenas resultantes no estn en L(G) pues tienen ij (basta una a ms para
igualar las m+1 bs), pero el lema dice que esas cadenas estn en L(G). Una contradiccin.
. Si ni u ni v incluyen as, con h=0 por simple inspeccin la cadena resultante yxz no est en
L(G) pues tiene ij (o ik) (basta una b menos -o una c menos - para igualar las m as),
pero el lema dice que esas cadenas estn en L(G). Una contradiccin.
Hemos mostrado que [Lc ({a}*{b}*{c}*)] no es libre de contexto. Es evidente que
({a}*{b}*{c}*) es regular, sabemos que un lenguaje libre de contexto intersectado con un
lenguaje regular es tambin libre de contexto, luego si Lc fuera libre de contexto, toda la

230
interseccin sera un lenguaje libre de contexto, pero no es el caso, entonces Lc no es libre de
contexto. Tambin sabemos que si un lenguaje es libre de contexto determinstico su
complemento tambin es libre de contexto determinstico. As, si L fuera libre de contexto
determinstico, entonces Lc sera tambin libre de contexto determinstico, pero Lc no es libre
de contexto determinstico (ni siquiera es libre de contexto!), luego L=(L1L2) no es libre de
contexto determinstico, que es lo que queriamos probar.

Existen lenguajes libres de contexto determinsticos cuya interseccin no es un lenguaje libre


de contexto determinstico, es decir, los lenguajes libres de contexto determinsticos no son
cerrados respecto de la interseccin: En efecto, sabemos que estos lenguajes son cerrados
respecto al complemento. Sean L1 y L2 lenguajes libres de contexto determinsticos, entonces
como L=(L1c L2c)c=(L1L2), si el cierre se diera con la interseccin, tambin se dara con la
unin, cosa que hemos probado falsa.

Existen lenguajes libres de contexto determinsticos cuya diferencia no es un lenguaje libre de


contexto determinstico, es decir, los lenguajes libres de contexto determinsticos no son
cerrados respecto de la diferencia: En efecto, sabemos que estos lenguajes son cerrados
respecto al complemento. Sean L1 y L2 lenguajes libres de contexto determinsticos, entonces
como (L1-L2) =(L1L2c), si el cierre se diera con la diferencia, tambin se dara con la
interseccin, cosa que hemos probado falsa.

Existen lenguajes libres de contexto determinsticos cuya concatenacin no es un lenguaje


libre de contexto determinstico, es decir, los lenguajes libres de contexto determinsticos no
son cerrados respecto de la concatenacin: En efecto, en principio mostraremos que los
lenguajes L=({0}.L1) L2 --donde L1={aibjck / ij, j0} y L2={aibjck / ik, j0}- y L3={0}*
son libres de contexto determinsticos.
El APe.f. determinstico A3=({r0},{0},{Z},3,r0,Z,{r0}) acepta L3.
3: 3(q0,0,Z)={(q0,Z)}
El APe.f. determinstico A=({r0,q0,q1,p0,p1},{0,a,b,c},{Z,A,B,C},,r0,Z,{r0,q0,q1,p0,p1}) acepta
L.
:
(r0,0,Z)={(q0,Z)} (q0,a,Z)={(q0,AZ)} (p0,a,A)={(p0,AA)}
(q0,a,A)={(q0,AA)} (p0,b,A)={(p0,A)}
(r0,b,Z)={(p1,B)} (q0,b,A)={(q1,)} (p0,c,A)={(p1,)}
(r0,a,Z)={(p0,AZ)} (q1,b,A)={(q1,)} (p1,c,A)={(p1,)}
(q0,c,A)={(q1,C)} (p1,b,B)={(p1,B)}
(q1,c,A)={(q1,C)}
(q0,c,Z)={(q1,C)}
(q1,c,Z)={(q1,C)}
(q1,c,C)={(q1,C)}

231
Si los lenguajes libres de contexto determinsticos fueran cerrados respecto de la
concatenacin, el lenguaje L4=L3.L sera un lenguaje libre de contexto determinstico.
Pero no lo es como argumentamos a continuacin. Es claro que ({0}{a}*{b}*{c}*) es regular.
Sabemos que el resultado de intersectar un lenguaje libre de contexto determinstico con un
lenguaje regular es un lenguaje libre de contexto determinstico.
Trabajando bajo el supuesto de que L4 es libre de contexto determinstico, entonces
[L4 ({0}{a}*{b}*{c}*)] resulta un lenguaje libre de contexto determinstico, pero
L4 [{0}{a}*{b}*{c}*]
=[L3.L] [{0}{a}*{b}*{c}*]
=[{0}*. ([{0}.L1] L2)] [{0}{a}*{b}*{c}*]
=[ {0}*. ([{0}.{aibjck / ij, j0}] {aibjck / ik, j0})] [{0}{a}*{b}*{c}*]
={0}.{aibjck / ij, j0}] {0}{aibjck / ik, j0}
={0}.L1 {0}.L2
Es decir, ({0}.L1 {0}.L2) es libre de contexto determinstico, pero ello indica que (L1 L2)
es libre de contexto determinstico: en efecto, necesitamos un AP determinstico que acepte
cadenas en (L1 L2), si ya hay un AP determinstico A que acepta cadenas en
({0}.L1{0}.L2) entonces podemos utilizar el mismo A para reconocer cadenas en (L1 L2)
adicionando a cada entrada el prefijo 0 que es espreo pero necesario para utilizar A, con
este artificio el AP determinstico A nos sirve bien para reconocer (L1 L2) lo que nos
permite decir que (L1 L2) si es libre de contexto determinstico. Sin embargo hemos ya
probado que (L1 L2) no es libre de contexto determinstico, lo que prueba nuestro
enuenciado.

Existen lenguajes libres de contexto determinsticos cuya estrella de Kleene no es un lenguaje


libre de contexto determinstico: En efecto, sabemos que L=({0}.L1) L2 es libre de contexto
determinstico -el APe.f determinsitico A de arriba lo acepta-, pero L* no lo es puesto que si
lo fuera entonces el lenguaje [L* ({0}{a}*{b}*{c}*)] tambin sera libre de contexto
determinstico por la misma razn de arriba-, como [L* ({0}{a}*{b}*{c}*)] = {0}.L1
{0}.L2 estaramos diciendo que (L1 L2) es libre de contexto determinstico que por lo
expuesto arriba- es falso.

232
CAPTULO 12. PROBLEMAS DE DECISIN

Pertenencia de una cadena a un lenguaje libre de contexto (el algoritmo CYK)


El problema siguiente es decidible: pertenece la cadena w a L(G) donde G es una GLC?
Mostraremos primero un conocido procedimiento terico. Sea G una GLC en FNCH, ZN y
Z=>w, probaremos por induccin sobre |w| que hay una derivacin de (2|w|-1) pasos de w a
partir de Z.
Caso base: |w|=1, pero entonces wT, como G est en FNCH debe existir una produccin
Z-->wP y por tanto es posible la derivacin Z=>w de 1(=2(1)-1=2|w|-1) paso.
Hiptesis inductiva: El enunciado es cierto para |w|<k.
Paso inductivo: Sea |w|=k. Como G est en FNCH la derivacin debe ser de la forma
Z=>XY=>uv, donde w=uv. Es claro que X=>u, que Y=>v, que |w|=|u|+|v| y que tanto |u|<k
como |v|<k.
De ah es posible describir dicha derivacin as:
Z=>XY en un paso

=> uY en (2|u|-1) pasos por hiptesis inductiva
=>uv en (2|v|-1) pasos por hiptesis inductiva
Es decir, Z=>w en [1+2|u|-1+2|v|-1] = [2|u|+2|v|-1] = [2(|u|+|v|)-1] = (2|w|-1) pasos.
Pero entonces una forma de determinar si wL(G), es decir si S=>w, es averiguar si hay una
derivacin de (2|w|-1) pasos de w a partir de S, como el nmero de producciones y de No
Terminales y Terminales- es finito podemos escribir y testear todas las derivaciones que
toman (2|w|-1]) pasos a partir de S y ver si alguna de las cadenas derivadas es w.
El anterior procedimiento puede ser costoso computacionalmente, de ah que otras propuestas
de reconocimiento de pertenencia se han propuesto. El algoritmo, ya visto, de Earley se aplica
directamente aqu; aprovechamos este problema de decisin para introducir un popular
algoritmo llamado CYK cuyo nombre viene de su descubridor Cocke y sus publicadores
Younger y Kasami.
El algoritmo CYK usualmente trabaja sobre una GLC en FNCH. Sea w=a1...am la cadena de
testeo (por ejemplo w=abaab), sea zij la subcadena de w que comienza en la posicin i, de
longitud j (en el ejemplo z23=baa, z51=b, z15=w). El algoritmo se basa en el hallazgo de No
Terminales X que deriven la subcadena zij, es decir, X=>zij, todos estos No Terminales se
reunen en el conjunto Bij. El objetivo es hallar el conjunto B1m, es decir, los No Terminales X
tales que X=>z1m, y ver si la raz S est en dicho conjunto, si lo est wL(G), en otro caso
no.
Aunque en la subcadena zij el rango de i o el de j- pueden ir de 1 a m, es claro que se
influyen: as si el rango de i va de 1 a m, el rango de j depende de i pues va de 1 a m-i+1, en
el ejemplo con i=4, j va de 1 a 2(=5-4+1 ), no tiene sentido hablar de z43, es decir la
subcadena que empieza en la posicin 4 de longitud 3, pues w solamente tiene 5 smbolos.
Inversamente, por similares razones, si el rango de j va de 1 a m, el rango de i depende de j
pues va de 1 a m-j+1.
Sea XN, es posible decidir si X=>zij.

233
Ello se muestra por induccin sobre j, basta para ello construir el conjunto Bij, es decir, hallar
todos los No Terminales X tales que X=>zij y ver si XBij.
Caso base: j=1. Es evidente que para construir Bi1, es decir, hallar los No Terminales X tales
que X=>zi1 (subcadenas de w que comienzan en la posicin i, de longitud 1, esto es zi1=ai ), es
decir, No Terminales que derivan el smbolo de la posicin i, basta hallar
Bi1={ XN / X->ai P } y ver si X est en este conjunto.
Hiptesis inductiva: El enunciado es cierto para j<k.
Paso inductivo: Sea j=k(>1). Es claro que X=>zik si y slo si X=>YW=>zihW=>zihz(i+h)(k-h)
con X-->YWP y 1h<k, Y deriva los primeros h smbolos de zik, W deriva los ltimos k-h
smbolos de zik. Por hiptesis inductiva es posible decidir si Y=>zih as como si W=>z(i+h)(k-h),
pues h<k y k-h<k, bastar observar los conjuntos Bih y B(i+h)(k-h). De ah es posible decidir si
X=>zik, basta construir Bik={ X / X-->YWP, YBih, WB(i+h)(k-h)} para todas las
combinaciones a que de lugar 1h<k - y ver si X est en este conjunto.
El procedimiento siguiente se desprende de lo que se acaba de anotar:
Para i de 1 a m: Bi1={ XN / X->ai P }
Para j de 2 a m:
Para i de 1 a m-j+1:
Bij={}
Para h de 1 a j-1: Bij=Bij { X / X-->YWP, YBih, WB(i+h)(j-h)}
Es comn presentar esta construccin de los conjuntos Bij en una matriz cuadrada B de
dimensin (m X m) de la que slo se llena una parte triangular como se muestra a
continuacin.

Ejemplos:
Sea la GLC en FNCH G=({S,X,Y,A},{a,b},P,S)
P:
S-->XY
X-->XA
Y-->AY
A-->a
X-->a
X-->b
Y-->a
Con la cadena de testeo w=baa=a1a2a3 configuramos la matriz B del modo que se ilustra
enseguida; cada posicin i,j representa al conjunto Bij descrito arriba:
As por ejemplo B21={X / X->a2P}={X / X->aP}={A,X,Y}
X
A,X,Y -
A,X,Y - -
Trabajando con la celda B12 (i=1, j=2, h=1) tenemos B12={ X / X-->YWP, YB11, WB21}
Como B11.B21={X}.{A,X,Y}={XA,XX,XY}, buscamos todas las producciones que tengan
estas partes derechas, y aadimos sus partes izquierdas al conjunto.

234
Trabajando con la celda B22 (i=2, j=2, h=1) tenemos B22={ X / X-->YWP, YB21, WB31}
Como B21.B31={A,X,Y}.{A,X,Y}={AA,AX,AY,XA,XX,XY,YA,YX,YY}, buscamos todas
las producciones que tengan estas partes derechas, y aadimos sus partes izquierdas al
conjunto.
X S,X
A,X,Y X,Y,S -
A,X,Y - -
Trabajando con la celda B13 (i=1, j=3), en este caso h debe ir de 1 a 2(=j-1).
En principio B13={}, para h=1 tenemos:
B13={} { X / X-->YWP, YB11, WB22}
Como B11.B22={X}.{X,Y,S}={XX,XY,XS}, buscamos todas las producciones que tengan
estas partes derechas, y aadimos sus partes izquierdas al conjunto, as B13={S}
Para h=2 tenemos:
B13={S} { X / X-->YWP, YB12, WB31}
Como B12.B31={S,X}.{A,X,Y}={SA,SX,SY,XA,XX,XY}, buscamos todas las producciones
que tengan estas partes derechas, y aadimos sus partes izquierdas al conjunto, finalmente
B13={S,X}, luego la matriz entera es:
X S,X S,X
A,X,Y X,Y,S -
A,X,Y - -
Como la raz S est en B13 entonces wL(G).
Para la cadena de testeo w=babaa, la matriz final es:
X X,S
A,X,Y -
X X,S S,X - -
A,X,Y Y,X,S - - -
A,X,Y - - - -
Como la raz S no est en B15 entonces wL(G).

Lenguaje aceptado por una GLC: vaco o no


El problema siguiente es decidible: el lenguaje aceptado por una GLC es vaco?
En efecto, sea la GLC G=(N,T,P,S), construimos el conjunto de No Terminales UTILES
como se indic antes, si SUTILES es claro que L(G) no es vaco, en otro caso lo es.
Otra alternativa es ir probando cadenas para ver si alguna es generada por la GLC, es decir, si
cuando menos una de ellas pertenece a L(G). Para hacer ms sistemtica la prueba se escogen
las cadenas en orden lxico, es decir, primero luego a1 luego a2 ... luego an, luego a1a1, etc.
Si hay una cadena que pertenece a L(G) este conjunto no es vaco, en otro caso lo es.
Lo central en esta alternativa es tener un nmero finito de cadenas de prueba, de lo contrario
podramos estar intentando con las infinitas cadenas de *. Este conjunto finito de cadenas de
prueba lo ofrece el lema de bombeo. En efecto, supongamos que G est en FNCH y que |N|=n:
L(G) w |w|<2n S=>w

235
Es obvio que si hay una cadena w -|w|<2n- tal que S=>w entonces L(G).
Inversamente, sea L(G), probaremos que w |w|<2n S=>w por reduccin al absurdo.
Supongamos que la cadena ms pequea en longitud- de L(G) es w, con |w|2n-, por el lema
de bombeo podemos reescribirla as w=yuxvz con |uv|>0 y por lo tanto |yxz|<|yuxvz|, por el
supuesto es claro que yxzL(G) pues la cadena ms peuqea es w. Pero por el lema
mencionado con i=0 yxzL(G).
Esta contradiccin prueba el enunciado que nos da el conjunto finito de cadenas de prueba
buscado: debemos probar solamente las cadenas de longitud menor que 2n si alguna de ellas,
es aceptada es obvio que L(G), en otro caso L(G)=.

Infinitud (finitud) del lenguaje aceptado por una GLC


El problema siguiente es decidible: el lenguaje aceptado por una GLC es infinito?
Sea G una GLC en FNCH con |N|=n, nuevamente el lema de bombeo nos ayudar a demostrar
que L(G) es infinito w 2n|w|<2n+1 wL(G).
Si hay una cadena wL(G) -2n|w|<2n+1- es claro que |w|2n, por el lema de bombeo podemos
reescribirla as w=yuxvz, adems yuixvizL(G) para todo i0, de ah que L(G) sea infinito.
Inversamente, supongamos que L(G) es infinito, sea w la cadena ms pequea en longitud-
de L(G) con |w|2n+1, por este hecho es obvio que tambin |w|2n, de ah por el lema de
bombeo podemos reescribir esta cadena as w=yuxvz con |uxv|2n. Adems con i=0,
yxzL(G). Sea w=yxz. Resulta pues que |w|<|w| pues |uv|>0. Como w es la cadena ms
pequea en L(G) de longitud |w|2n+1, entonces la cadena w no puede ser sino tal que
|w|<2n+1.
Por otro lado, |w|=|yxz|yz|. Adems, como |w|2n+1 y |uxv|2n, resulta que |yuxvz|-|uxv|2n,
es decir, (|yz|+|uxv|)-|uxv|2n . Pero entonces |yz|2n. Es decir, 2n|w|<2n+1 con wL(G).

Adicionalmente mencionaremos que es indecidible el problema de determinar si la


interseccin de dos lenguajes libres de contexto es vaca. La demostracin de ello requiere
introducir el concepto de insolubilidad (su prueba) y otros aspectos relacionados, cosa que no
cubre este trabajo.

Lenguajes no libres de contexto


El siguiente es un problema complejo: es L un lenguaje libre de contexto?
En efecto, hay lenguajes que no son libres de contexto, es decir, lenguajes para los cuales no
es posible escribir una GLC que los genere ni un AP que los acepte. El ejemplo tpico es
L={ajbjcj / j>0}, es imposible escribir una GLC que genere L o un AP que acepte L.
Conviene pues tener instrumentos que nos ayuden en la tarea de decidir si un lenguaje es o no
es libre de contexto y, slo si lo es, empezar la tarea de escribir una GLC o un AP para ese
lenguaje.
Sabemos que los conjuntos de cadenas- finitos son regulares y por lo tanto son libres de
contexto.

236
Dado un conjunto infinito de cadenas, el lema de bombeo puede ser til para mostrar que no
es libre de contexto.

Ejemplos:
Mostraremos que L={ajbjcj / j>0} no es libre de contexto, es decir, no hay una GLC G que lo
genere.
Demostracin:
Supongamos que L si es libre de contexto, es decir, L=L(G) con |N|=n y G en FNCH.
Es claro que L es infinito y que las cadenas de L tienen longitud 3j, luego hay una cadena
wL(G) tal que |w|2n, por ejemplo para j=2n la cadena w es tal que |w|=3(2n)2n. Por el lema
de bombeo w puede reescribirse as w=yuxvz con |uv|>0 y |uxv|2n, adems yuixvizL(G)
para todo i0.
Procedemos a analizar cul es la forma de la cadena uxv y por lo tanto de u y v:
i) Una posibilidad es que uxv sea una secuencia del mismo smbolo y por lo tanto u y v
tambin, digamos u=a...a, v=a...a, pero entonces con i=0 la cadena yxz tiene igual nmero de
bs y cs pero tiene menos as: por simple inspeccin dicha cadena no est en L, pero por el
lema de bombeo con i=0 esa cadena s est en L. Una contradiccin.
El razonamiento es idntico si las secuencias son del smbolo b o del smbolo c, e incluso
si una de las cadenas u o v es vaca.
ii) Otra posibilidad es que uxv sea una secuencia de dos smbolos (no de longitud 2), por
ejemplo uxv=a...ab...b, de manera que:
u=a..ab..b y v=b..b, o bien u=a..a y v=a..ab..b, en cualesquiera de estos casos con i=2 tenemos
que la cadena yu2xv2z tiene una secuencia (una subcadena) del tipo a..ab..ba...ab..b
(correspondiente a u2 o bien a v2) que por simple inspeccin no corresponde a una cadena en
L, pero por el lema de bombeo esta cadena s est en L. Una contradiccin.
Esto sucede incluso si la cadena v es vaca en el primer caso, o si la cadena u es vaca en el
segundo caso.
u=a...a y v=b...b, pero entonces con i=0 la cadena yxz tienen ms cs que as y ms cs que
bs: por simple inspeccin dicha cadena no est en L, pero por el lema de bombeo con i=0 esa
cadena s estn en L. Una contradiccin.
El razonamiento es idntico si uxv=b...bc...c.
ii) No hay otras formas posibles. Una secuencia de tres smbolos (no de longitud 3) para uxv
es imposible pues |uxv|2n, pero (con j=2n) la ltima a de u debe estar a ms de 2n posiciones
de la primera c (pues de por medio estn las 2n bes).
Estas contradicciones invalidan nuestro supuesto y concluimos que L no es libre de contexto.
L={bjckdh / j+k+h>0}{ambjcjdj / m+j>0}={ambjckdh / m=0 j=k=h} no es libre de contexto.
Demostracin:
Supongamos que L si es libre de contexto, es decir, L=L(G) con |N|=n y G en FNCH.
Lamentablemente no se puede utilizar el lema de bombeo. En efecto, trabajando con dicho
lema, elijamos wL(G) tal que |w|2n, sabemos que w puede reescribirse as w=yuxvz con
|uv|>0 y |uxv|2n, adems yuixvizL(G) para todo i0.
Procedemos a analizar cul es la forma de u y v:

237
i) Si w=bjckdh, es posible que u y v sean secuencias de un slo smbolo no necesariamente el
mismo-, en cuyo caso la conclusin del lema que yuixvizL(G) para todo i0 no se
contradice.
ii) Si w=ambjcjdj, es posible que u y v sean secuencias del mismo smbolo a, en cuyo caso la
conclusin del lema que yuixvizL(G) para todo i0 no se contradice.
Sin embargo, el lema de Ogden s puede aplicarse.
Sea wL(G) con w=ambjcjdj y m>0. Sea e el entero del lema. Marquemos e smbolos de w as:
w=ambjcjdj. Por el lema podemos descomponer as w=yuxvz, x contiene algn smbolo
marcado, u y v no son simultneamente libres de smbolos marcados (u.v tiene por lo menos
uno), uxv tiene a lo mse smbolos marcados, yuixvizL(G) para todo i0.
Procedemos a analizar cul es la forma de la cadena u:
i) Si u incluye una secuencia de dos smbolos marcados bs y cs cs y ds1, u=apb..bc..c,
u=b..bc..c, u=c...cd...d con i=2 tenemos que la cadena yu2xv2z tiene una subcadena del tipo
apb..bc..capb..bc..c ( b..bc..cb..bc..c c..cd..dc..cd..d) correspondiente a u2 que por simple
inspeccin no corresponde a una cadena en L, pero por el lema de Ogden esta cadena s est
en L. Una contradiccin.
ii) Si u incluye una secuencia de tres smbolos marcados el razonamiento es semejante al
anterior.
iii) Si u incluye una secuencia de slo un smbolo marcado, digamos bs, tenemos varios
subcasos -el razonamiento es idntico si la secuencia es del smbolo c o del smbolo d-:
. u=apb...b, con i=2 la cadena yu2xv2z tiene una subcadena del tipo apb..bapb..b que por simple
inspeccin no corresponde a una cadena en L, pero por el lema de Ogden esta cadena s est
en L. Una contradiccin.
. u=b...b, v=. En este caso con i=0 la cadena yxz tiene as, luego igual nmero de cs y ds
pero tiene menos bs: por simple inspeccin dicha cadena no est en L, pero por el lema de
Ogden con i=0 esa cadena s est en L. Una contradiccin.
. u=b...b, por la forma de nuestro marcado v contiene una secuencia de un smbolo marcado,
digamos v=d...d. En este caso con i=0 la cadena yxz tiene as y luego ms cs que bs y ms
cs que ds: por simple inspeccin no corresponde a una cadena en L, pero por el lema de
Ogden esta cadena s est en L. Una contradiccin. Pasa algo semejante con v=d...d.
Si v=b...b con i=0 la cadena yxz tiene as, luego igual nmero de cs y ds pero tiene menos
bs: por simple inspeccin dicha cadena no est en L, pero por el lema de Ogden con i=0 esa
cadena s est en L. Nuevamente una contradiccin.
iv) Si u no incluye smbolos marcados, u=ap u=. Por el lema sabemos que x contiene por lo
menos un smbolo marcado, entonces por la forma de nuestro marcado v debe ser de slo
smbolos marcados, si es una secuencia de dos o tres smbolos marcados con i=2 la cadena
yu2xv2z tiene una subcadena del tipo c..cd..d, si es una secuencia de slo un smbolo marcado
con i=0 la cadena yxz tendr as y luego menos de un smbolo que de los otros dos: en ambos
casos por simple inspeccin dichas cadenas no estn en L, pero por el lema de Ogden s lo
estn. Una contradiccin.
v) No hay otras formas posibles.
Estas contradicciones invalidan nuestro supuesto y concluimos que L no es libre de contexto.

238
Gramticas LL y LR
Hemos visto el algoritmo CYK y el de Earley para decidir si una cadena est o no en L(G),
dicho de otro modo, para reconocer si la cadena dada est o no en el lenguaje que representa
(genera) la gramtica G.
Aunque el reconocimiento ms propiamente es parte de estudios sobre compilacin (diseo de
compiladores, anlisis lxico, etc.) aprovecharemos su mencin para presentar una nocin de
las gramticas LL y LR.
Supongamos que se tiene el conjunto de producciones P={S-->aSb,S-->Y,Y-->ab,S-->ab} y
queremos esgrimir un algoritmo que para la cadena w -por ejemplo w=aabb- nos diga si hay o
no una derivacin S=>*w:
La construccin de analizadores sintcticos se ocupa precisamente de ello: cmo disear un
reconocedor lo ms eficientemente posible. Fjese que una alternativa elemental es contruir un
autmata de pila a partir de la gramtica segn se vio- y dejar que dicho autmata reconozca
o no la cadena w. En funcin de los problemas que aparezcan puede ser til variar la
construccin del autmata, mejorarlo en algn sentido o bien construir otra GLC que
minimice los problemas.
Es claro que el algoritmo que estamos considerando tendr que leer la cadena de entrada w
para ver si es o no generada en G, es comn hacerlo revisando los smbolos de izquierda a
derecha.
Con la gramtica y la cadena de ejemplo podemos pensar que nuestro algoritmo leer una a
y empezar la derivacin en S, enseguida tendr que enfrentar el problema de utilizar
alguna produccin: puede buscar todas las que tengan como parte izquierda S intentar
fortuna con alguna elegida al azar y si se deriva w (en base a una serie de pasos de derivacin)
terminar con xito, sino retroceder hasta la (errnea) decisin tomada e intentar con otra.
Ntese que si P={S-->aSb,S-->ab,S-->dY,Y-->cc} y w=aabb, una decisin mejor se tomar
seleccionando slo las producciones que tengan como parte izquierda S y a como cabeza
de la parte derecha.

Si nos permitimos preanalizar, es decir, leer un smbolo ms a la derecha del que estamos
revisando, las cosas podran mejorar en este ejemplo, pues si el siguiente smbolo a una a es
otra a, es claro que slo la produccin S-->aSb puede ser til para intentar una derivacin.
Una exigencia fuerte es que no tengamos necesidad de retroceder para tomar otra decisin
sino hacer nuestro algoritmo tan ingenioso que cada decisin sea la buena (si w es generada, e
incluso si no es generada), es decir, que haya determinismo.
En otros casos, es imprescindible reducir los problemas y tomar la decisin buena requiere
leer no uno sino 2 (o bien k) smbolos ms a la derecha del que se escudria.
Si exigimos una derivacin ms a la izquierda, a los algoritmos que tienen este
comportamiento (tomando siempre buenas decisiones) los llamaremos analizadores sintcticos
LL(k) la primera L es por left to right (leer los smbolos de entrada de izquierda a derecha) y
la segunda L es por leftmost derivation (derivacin ms a la izquierda)-.

239
No siempre es posible construir uno de estos para una GLC (e incluso para un lenguaje dado),
por ejemplo para el lenguaje L={aibi / i>0}{ai / i>0} no hay un analizador LL(k).
Una GLC LL es aquella que admite la construccin de un (algoritmo) analizador sintctico LL
con la peculiaridad que las producciones se usan en el sentido ParteIzquierda-->ParteDerecha,
es decir, se busca una derivacin que parte del smbolo raz hasta la cadena de entrada w (top-
down o descendente).
Por otro lado en los analizadores sintcticos LR(k) la primera L es por left to right (leer los
smbolos de entrada de izquierda a derecha)- lo que se busca es una derivacin ms a la
derecha (la segunda R es precisamente por rightmost derivation), la k tiene una significacin
anloga. Una GLC LR es aquella que admite la construccin de un (algoritmo) analizador
sintctico LR donde las producciones se usan en el sentido ParteDerecha-->ParteIzquierda, es
decir, se busca una derivacin que parte de la cadena de entrada w hasta el smbolo raz
(bottom-up o ascendente).
Ahora queda el problema de reconocer si una GLC es LL o LR, o el ms fuerte de construir
una GLC de uno de estos dos tipos directamente (o a partir de otra dada):
En principio diremos que una GLC es LL si es LL(k), y es LR si es LR(k) para algn k.
Denotaremos por PRIMEROSk() a los primeros k Terminales con que empiezan las cadenas
derivables desde , PRIMEROSk()={u / =>*u con |u|=k =>*u con |u|<k}
Sea G una GLC limpia, aqu slo consideraremos derivaciones ms a la izquierda.
Diremos que G es LL(k) si
i) S=>*wA=>w=>*w
ii) S=>*wA=>w=>*w
iii) PRIMEROSk()=PRIMEROSk()
implican que =.
Sea G=(N,T,P,S) una GLC y sea G=(N{S},T,P{S-->S},S) donde S es un nuevo No
Terminal, aqu slo consideraremos derivaciones ms a la derecha.
Diremos que G es LR(k) si
i) S=>*Aw=>w
ii) S=>*Bx=>y
iii) PRIMEROSk(w)= PRIMEROSk(y)
implican que Ay=Bx con =, y=x.

240
CAPTULO 13. LENGUAJES SENSIBLES AL CONTEXTO

Un lenguaje es sensible al contexto si hay una Gramtica Sensible al Contexto que lo genera,
o un Autmata Limitado Linealmente que lo acepte.

GRAMTICAS SENSIBLES AL CONTEXTO (GSC)


Las GSCs son semejantes a las GLCs salvo la parte izquierda de las producciones que es
ahora ms permisiva.
Una GSC es una cudrupla G=(N,T,P,S) donde N,T y S se definen de manera idntica a como
lo hemos estado haciendo y donde P es un conjunto de producciones del siguiente tipo:
--> donde ,(N T)+, || ||
Aunque suele presentarse la definicin de una GSC indicando que P es un conjunto de
producciones del tipo: --> AN, ,(N T)*, (N T)+; donde se
evidencia claramente que el contexto de A est tomado en cuenta y est conformado por a
la izquierda de A y a la derecha de A, nosotros tomaremos esta restriccin como una forma
normal -muy utilizada- de las GSCs.

Ejemplos:
El lenguaje L={aibici / i>0} es sensible al Contexto. En efecto, la GSC
G=({S,B,C},{a,b,c},P,S)
P:
S-->aSBC
S-->abC
CB-->BC
bB-->bb
bC-->bc
cC-->cc
es tal que L(G)=L.
Intentemos una breve descripcin de cmo se comporta esta GSC:
Es claro que S=>abC=>abc utilizando la segunda y la quinta produccin.
Derivemos aaabbbccc utilizando las producciones pertinentes:
S=>aSBC
=>aaSBCBC
=>aaabCBCBC
... hasta aqu hemos utilizado las producciones 1 y 2 que podran recibir el sobrenombre de
generadoras; en efecto estas dos producciones generan cadenas que tienen un nmero igual de
smbolos que son o representan as, bs y cs (aunque todava no en el orden deseado, ni de
slo Terminales). Sigamos...
=>aaabCBCBC=>aaabCBBCC=>aaabBCBCC=>aaabBBCCC
... que se obtiene utilizando varias veces la tercera produccin, que reemplaza la cadena CB,
subrayada para que se note mejor, por la cadena BC, en negrita para que se note mejor, esta
produccin podra recibir el sobrenombre de ordenadora. Sigamos...

241
=>aaabbBCCC=>aaabbbCCC=>aaabbbcCC=>aaabbbccC=>aaabbbccc
... que se obtiene utilizando las ltimas tres producciones, que actan simulando una cada de
domin y que podran recibir el sobrenombre de minusculizadoras.
Sabemos que hay muchas otras derivaciones posibles a partir de S, un ejemplo de una
derivacin alternativa es el siguiente:
S=>aSBC=>aaSBCBC=>aaabCBCBC=>aaabcBCBC=>aaabcBBCC
Que se trunca ah.
La GSC G=({S,D,A},{a,b,c},P,S)
P:
S-->DS
S-->A
DA-->aA
Da-->aaD
A-->a
k
Es tal que L(G)={ a 2 | k0}.
Un ejemplo de derivacin es este: S=>DS=>DDS=>DDA=>DaA=>aaDA=>aaaA=>aaaa

El formato --> con ||||, permite conjunto extraos de producciones por ejemplo:
P={S-->ab,ab-->cd} que corresponde a una GSC que genera L(G)={ab,cd}.

Forma normal de Kuroda (FNK)


Una GSC G se dice que est en FNK si cada una de sus producciones es de uno de los
siguientes tipos:
A-->a, A-->B, A-->BC AB-->CD donde aT y A,B,C,DN.

AUTMATAS LIMITADOS LINEALMENTE (ALL)


Tcnicamente los ALLs (Linear Bounded Automata en ingls) son Mquinas de Turing (con
una cinta finita) cuyo conocimiento se presupone en este captulo. Sin embargo, a modo de
recordatorio, describiremos brevemente estos artefactos.
Como en los otros autmatas, hay una cinta (con la cadena) de entrada con una especie de
cabezal que apunta los smbolos que estn siendo ledos:
En los AFs se analiza (se consume) un smbolo de entrada y el cabezal se mueve a la derecha.
Podemos graficar ello, por ejemplo, as:
abaab abaab
^ ^
| |
En cambio en los APs, a travs de los -movimientos existe la posibilidad de que el
mencionado cabezal no se mueva a la derecha sino que permanezca esttico, por ejemplo:
abaab abaab
^ ^
| |

242
Los ALLs introducen nuevos tipos de movimientos de manera que el cabezal de la cinta de
entrada, ya no solo podr quedarse esttico, sino que -incluso- podr ir hacia la izquierda o
hacia la derecha o quedarse fijo, segn sus reglas de transicin. Ms an, los ALLs tienen la
capacidad de modificar los smbolos de la cinta de entrada; por ejemplo, en algn momento la
entrada aaba puede cambiar por aada o bien por aa&a.

Un ALL es una quntupla A=(K,{,},,q0,F)


K es el conjunto de estados
C = {,} es el conjunto de smbolos admisibles en la cinta
es el alfabeto de entrada
es un conjunto de marcas auxiliares para el trabajo del ALL
y son los delimitadores izquierdo y derecho de la cadena de entrada
q0 es el estado inicial
FK es el conjunto de estados finales, convencionalmente F={qf} (un nico estado final)
es la funcin de transicin definida como : K X C --> 2K X ({R,L}C), cuya interpretacin y
restricciones indicaremos enseguida.
Las reglas de transicin siguiendo la representacin que hemos estado manejando tendran
esta apariencia:
(q0a)={(q1 R)}
(q1b)={(qf, *)}
Son ms populares las respresentaciones de las reglas de transicin de un ALL (de una
Mquina de Turing) en otros trminos equivalentes: en forma de tablas, de ternas, de
quntuplas, de cudruplas, etc.
Nosotros adoptaremos la representacin en cudruplas, en donde las reglas de transicin de
tienen estas formas:
1) qia R qj
Que indica que si estamos en el estado qiy el cabezal est analizando una a, el ALL se mueve
un smbolo hacia la derecha y cambia al estado qj. (La R es por Right).
2) qia L qj
Que indica que si estamos en el estado qiy el cabezal est analizando una a, el ALL se mueve
un smbolo hacia la izquierda y cambia al estado qj. (La L es por Left).
3) qia c qj
Que indica que si estamos en el estado qiy el cabezal est analizando una a, el ALL
reemplaza el smbolo a por el smbolo c en la cinta de entrada pero el cabezal no se mueve; el
estado actual cambia de qi a qj.
4)Adems:
Si una cudrupla empieza con qi. . el tercer componente es necesariamente R
Si una cudrupla empieza con qi. . el tercer componente es necesariamente L
Ninguna cudrupla tiene como tercer componente a ni
Ninguna cudrupla empieza con qf

243
Est claro pues que la cinta (de entrada) de los ALLs es finita y est limitada por los
marcadores y .

As, las reglas de transicin de un ALL siguiendo esta representacin en cudruplas tendran
la siguiente apariencia:
q0a R q1
q1b * qf
Obviamente este es slo un ejemplo para mostrar la apariencia de un ALL: el nmero y la
forma exacta de las cudruplas depende del lenguaje en consideracin.

Si no hay dos cudruplas que empiecen con el mismo par inicial qia . ., el ALL se dice
determinstico, en otro caso se dice no determinstico.

Descripciones instantneas y lenguaje aceptado T(A)


En un ALL una d.i. es una tripleta (i,qj,u) donde
. i seala la posicin del cabezal en la cinta del ALL, el smbolo est en la posicin 0, el
primer smbolo de la cadena u est en la posicin 1, etc.; el smbolo est en la posicin
|u|+1.
. qj es el estado actual
. u indica el contenido actual de la cinta del ALL, u()*
Al empezar su trabajo con la cadena de entrada w, el cabezal del ALL se posiciona
inmediatamente a la derecha de y, obviamente, el estado inicial es q0, es decir, la d.i. inicial
es (1,q0,w). Cuando la cadena de entrada es la cadena vaca, la d.i. es (1,q0,) y el cabezal
apunta a .
La idea de un movimiento para pasar de una d.i. a otra se preserva.
El lenguaje aceptado por el ALL A se define as:
T(A)={ w* / (1,q0,w)|--*(i,qf,u), 0i|u|+1, u()* }

Ejemplos:
El ALL A=({q0,q1,qf},{a}{ }{,},,q0,{qf})
: q0aRq1
Acepta T(A)={}, pues nunca llegar al estado final -condicin para aceptar cadenas-.

El ALL A=({q0,qf},{a}{ }{,},,q0,{qf})


: q0Lqf
Acepta T(A)={}, el nico movimiento que puede dar es (1,q0,)|--*(0,qf,) con como
cadena de entrada. Con otra entrada, digamos aa, la d.i. inicial sera (1,q0,aa), ninguna
cudrupla empieza por q0 a . ., y el trabajo del ALL quedara truncado sin llegar a qf.

El ALL A=({q0,q1,q2,q3,q4,q5,qf},{a,b}{*,&}{,},,q0,{qf})

244
:
1) q0a * q4
2) q4 R q1
3) q1a R q1
4) q1& R q1
5) q1b & q5
6) q5& L q2
7) q2& L q2
8) q2a L q2
9) q2* R q0
10) q0& R q3
11) q3 R q3
12) q3 L qf
Acepta T(A)={aibi / i>0}, presentaremos los movimientos para la aceptacin de la cadena
aabb indicando con un subndice el nmero de regla utilizado:
(1,q0,aabb)|--1(1,q4,*abb)|--2(2,q1,*abb)|--3(3,q1,*abb)|--5(3,q5,*a&b)
|--6(2,q2,*a&b)|--8(1,q2,*a&b)|--9(2,q0,*a&b)|--1(2,q4,**&b)
|--2(3,q1,**&b)|--4(4,q1,**&b)|--5(4,q5,**&&)|--6(3,q2,**&&)
|--8(2,q2,**&&)|--9(3,q0,**&&)|--10(4,q3,**&&)|--11(5,q3,**&&)
|--12(4,qf,**&&), es decir,
(1,q0,aabb)|--*(4,qf,**&&)

CONVERSIONES GENRICAS Y CERRADURA: El caso sensible al contexto

Construccin de una GSC con slo No Terminales en la parte izquierda de sus


producciones
Dada una GSC G podemos construir otra GSC G tal que L(G)=L(G) y tal que G tenga slo
No Terminales en la parte izquierda de sus producciones.
Sea G=(N,T,P,S), con T={a1,...,am}; bsicamente se trata de construir G a travs de una
Mayusculizacin semejante a la ya vista en GLCs. G=(N,T,P,S)
P = {--> / -->P, =[a1/Xa1,...,am/Xam], =[a1/Xa1,...,am/Xam]} (*)
{ Xai-->ai / aiT } (**)
XaiN, N = N {Xai / aiT}
Es decir, en todas y cada una de las producciones de G reemplazamos cada Terminal ai por un
nuevo No Terminal Xai y agregamos la produccin Xai-->ai.
Como L(G){a1,...,am}*, con los reemplazos es claro que con la parte (*) de P se genera un
lenguaje sobre {Xa1,...,Xam}* prcticamente igual a L(G) salvo que los terminales son Xai en
vez de ai, si a ello agregamos el trabajo de las producciones de (**) tenemos que L(G)=L(G).

245
Construccin de una GSC en forma normal a partir de otra
Es claro que una GSC tal que todas sus producciones son del tipo
--> donde AN, ,(NT)*, (N T)+
tiene todas sus producciones del tipo --> donde ,(N T)+, ||||.
Dada una GSC G=(N,T,P,S) podemos construir otra GSC G tal que L(G)=L(G) y tal que G
tenga sus producciones en forma normal, es decir, del tipo
--> donde AN, ,(NT)*, (NT)+
En efecto, podemos suponer sin prdida de generalidad que G tiene slo No Terminales en la
parte izquierda de sus producciones. Si no es as podemos recurrir a la construccin anterior,
sin embargo, es posible que G ya tenga slo No Terminales en la partes izquierdas de sus
producciones sin recurrir a la construccin anterior - en cuyo caso sus partes derechas no
necesariamente sern cadenas de slo No Terminales que es lo que ocurre con las
producciones de la parte (*) en la mencionada construccin.
A partir de P construimos P as:
1) Si una produccin de P ya tiene el tipo indicado no debemos hacerle ningn cambio y la
copiamos en P.
2) Si una produccin de P no respeta el tipo indicado, le aplicamos lo siguiente:
Representaremos la produccin de la que hablamos as:
Y1Y2...Yn-1Yn --> q1q2...qn-1qnqn+1...qm nm
Todos los smbolos de la parte izquierda son No Terminales, debido al supuesto.
Reemplazamos esta produccin por el siguiente conjunto de producciones (W es un nuevo No
terminal):
Y1Y2Y3...Yn-1Yn --> WY2Y3...Yn-1Yn
WY2Y3...Yn-1Yn --> Wq2Y3...Yn-1Yn
Wq2Y3..Yn-1Yn --> Wq2q3Y4...Yn-1Yn
... ... ...
Wq2q3q4...qn-2Yn-1Yn --> Wq2q3q4...qn-2qn-1Yn
Wq2q3q4...qn-1Yn --> Wq2q3q4...qn-1qnqn+1...qm
Wq2q3q4...qn-1qnqn+1...qm --> q1q2q3q4...qn-1qnqn+1...qm
Donde hemos resaltado en negrita el No Terminal en la parte izquierda (A) que se reemplaza
por la subcadena en la parte derecha (), de manera que todas estas nuevas producciones estn
en el formato A--> cuyo contexto y es evidente. Por ejemplo en la primera
produccin =, A=Y1, =Y2Y3...Yn-1Yn, =W.
Fjese que la parte derecha de la primera produccin es la parte izquierda de la segunda; la
parte derecha de la segunda produccin es la parte izquierda de la tercera; etc.
Fjese que todas reemplazan un No Terminal (A) por la subcadena de un smbolo, excepto
la penltima que reemplaza Yn por qnqn+1...qm.
N se construye a partir de N aadiendo todos los nuevos No Terminales.

Ejemplos:
Sea la GSC G=({S},{a,b,c,d},{S-->ab,ab-->cd},S)

246
Luego de la Mayusculizacin tenemos el siguiente conjunto de producciones:
S-->XaXb
XaXb-->XcXd
Xa-->a Xb-->b
Xc-->c Xd-->d
Excepto la produccin XaXb-->XcXd todas respetan la forma normal con =,=, su parte
izquierda como A y su parte derecha como .
En la produccin XaXb-->XcXd: n=m=2, as reemplazamos esta por:
XaXb-->WXb
WXb -->WXd
WXd -->XcXd
Luego tenemos la resultante GSC G=({S,Xa,Xb,Xc,Xd,W},{a,b,c,d},P,S)
P:
S-->XaXb
XaXb-->WXb
WXb -->WXd
WXd -->XcXd
Xa-->a
Xb-->b
Xc-->c
Xd-->d

Sea la GSC G=({S,B,C},{a,b,c},P,S)


P:
S-->aSBC
S-->abC
CB-->BC
bB-->bb
bC-->bc
cC-->cc
Luego de la Mayusculizacin tenemos el siguiente conjunto de producciones:
que respetan la forma normal excepto la 3
S-->XaSBC =,=, A=S, =XaSBC
S-->XaXbC =,=, A=S, =XaXbC
CB-->BC no respeta el tipo
XbB-->XbXb =Xb,=, A=B, =Xb
XbC-->XbXc =Xb,=, A=C, =Xc
XcC-->XcXc =Xc,=, A=C, =Xc
Xa-->a
Xb-->b
Xc-->c

247
Reemplazamos CB-->BC, donde n=m=2, por:
CB-->WB
WB-->WC
WC-->BC
As tenemos la resultante GSC G=({S,B,C,Xa,Xb,Xc,W},{a,b,c},P,S)
P:
S-->XaSBC
S-->XaXbC
CB-->WB
WB-->WC
WC-->BC
XbB-->XbX
XbC-->XbXc
XcC-->XcXc
Xa-->a
Xb-->b
Xc-->c

Construccin de una GSC en FNK a partir de otra


Dada una GSC G=(N,T,P,S) podemos construir otra GSC G tal que L(G)=L(G) y tal que G
este en FNK.
En efecto, podemos suponer sin prdida de generalidad que a G ya se le ha aplicado el proceso
de Mayusculizacin. A partir de P construimos P as:
1) Si una produccin de P ya tiene el tipo indicado no debemos hacerle ningn cambio y la
copiamos en P.
2) Si en P est la produccin A-->X1...Xm con m>2 se le aplica un proceso de particin tal
como se hizo en la forma normal de Chomsky en gramticas libres de contexto.
3) Si en P est la produccin X1...Xn-->Y1...Ym con n2 y mn (ntese que por la
mayusculizacin todos los smbolos son No Terminales), se reemplaza por las siguientes
producciones:
X1X2 --> Y1W1
WjXj+2 --> Yj+1Wj+1 j=1,...,n-2
Wn-1 --> Yn...Ym (si esta produccin tiene la parte derecha de longitud mayor a 2
se le aplica el proceso de particin de Chomsky)
Todos los Wi son nuevos No Terminales.
N se construye a partir de N aadiendo todos los nuevos No Terminales.

Ejemplo:
Sea la GSC G=({S,A,B,C,D,E},{a,b,d,c,e},P,S)
P:
S-->ABCD
S-->ABC

248
ABC-->DDD
ABCD-->CCACBEE
A-->a B-->b
C-->c D-->d
E-->e
Construimos as la GSC G=(N,{a,b,d,c,e},P,S)
P:
1)
A-->a
B-->b
C-->c
D-->d
E-->e
2) De S-->ABCD
S-->AZ1
Z1-->BZ2
Z2-->CD
De S-->ABC
S-->AZ3
Z3-->BC
3) De ABC-->DDD
AB-->DW1
W1C-->DW2
W2-->D
De ABCD-->CCACBEE
AB-->CV1
V1C-->CV2
V2D-->AV3
V3-->CBEE esta produccin se reemplaza por
V3-->CZ4
Z4-->BZ5
Z5-->EE

Construccin de un ALL a partir de una GSC


Sea G=(N,T,P,S) una GSC, entonces podemos construir un ALL A tal que T(A)=L(G).
Representaremos la produccin j-sima as:
j
I1... jIn --> jD1... jDm donde nm

Cuando n<m, extenderemos la parte izquierda de la produccin j-sima as:


j
I1... jInjIn+1... jIm --> jD1... jDm donde jIn+1=...= jIm=b
(b es un smbolo auxiliar que denota el espacio en blanco)

249
De manera que despus de esta transformacin, todas las producciones de P son tales que
la parte izquierda es igual -en longitud- a la parte derecha. Denominaremos j a la longitud de
la parte derecha (o izquierda) de la produccin j-sima, supondremos que existen |P|=k
producciones.

Construimos as el ALL A=(K,TN {b}){,},,q0,{qf })


:
1) q0 c c q1 c(TN{b})
q0c c p1 c(TN{b})
2) q1c R q1 c(TN{b,})
q1 L q2
q1 jD1 jD1 jp1 j=1,...,k
q2c L q2 c(TN{b,})
q2 R q0
3) jph jDh jIh jqh j=1,...,k; h=1,...,(j -1)
j
qh jIh R jph+1 j=1,...,k; h=1,...,(j -1)
j j
ph b R ph j=1,...,k; h=1,...,(j -1)
j
pj jDj jIj q2 j=1,...,k
4) p1 b R p1
p1 S R p 2
p2 b R p 2
p2 L qf
K={q0,q1,q2,qf,p1,p2} {jqh / j=1,...,k; h=1,...,j} {jph / j=1,...,k; h=1,...,j}

La idea aqu es simular la derivacin S=>*w de G en el ALL A pero en orden inverso.


Por ejemplo si el ltimo paso de una derivacin es abcD=>abcd, entonces en la cinta del ALL
las reglas deben cambiar el contenido de la cinta abcd por abcD, y as sucesivamente; los
espacios b aadidos aseguran que cada reemplazo coincida en tamao. Si la simulacin es
exitosa, al final el contenido de la cinta sera S posiblemente con espacios b a izquierda y
derecha.

Ejemplo:
Sea la GSC G=({S,B,A},{a},P,S) cuyo conjunto de producciones transformadas (con k=5) es
P:
i) Sb-->BS 1=2
ii) S-->A 2=1
iii) BA-->aA 3=2
iv) Bab-->aaB 4=3
v) A-->a 5=1

250
Construimos as el ALL A=(K,{a}{S,B,A,b}{,},,q0,{qf })
K = {q0,q1,q2,qf,p1,p2}
{1q1,1q2,2q1,3q1,3q2,4q1,4q2,4q3 ,5q1}
{1p1,1p2,2p1,3p1,3p2,4p1,4p2,4p3 ,5p1}
:

1) q0 a a q1 q0 a a p1
q0 S S q1 q0 S S p1
q0 B B q1 q0 B B p1
q0 A A q1 q0 A A p1
q0 b b q1 q0 b b p1
2) q1a R q1 q1 B B p1
1
q2a L q2
q1 S R q1 q1 A A 2p1 q2 S L q2
q1 B R q1 q1 a a 3p1 q2 B L q2
q1 A R q1 q1 a a 4p1 q2 A L q2
q1 b R q1 q1 a a 5p1 q2 b L q2
q1 R q1 q2 L q2
q1 L q2 q2 R q0
3) Para i) Sb-->BS 1=2
1
p1 B S 1q1
1
q1 S R 1p2
1
p1 b R 1p1
1
p2 S b q2

Para ii) S-->A 2=1


2
p1 A S q2

Para iii) BA-->aA 3=2


3
p1 a B 3q1
3
q1 B R 3p2
3
p1 b R 3p1
3
p2 A A q2

Para iv) Bab-->aaB 4=3


4
p1 a B 4q1
4
q1 B R 4p2
4
p1 b R 4p1

251
4
p2 a a 4q2
4
q2 a R 4p3
4
p2 b R 4p2
4
p3 B b q2
Para v) A-->a 5=1
5
p1 a A q2
4) p1 b R p1
p1 S R p 2
p2 b R p2
p2 L qf
Por ejemplo la derivacin de la cadena aa en la gramtica transformada es:
Sb=>BS=>BA=>aA=>aa
Los movimientos para la aceptacin de dicha cadena son:
(1,q0,aa)|--(1,q1,aa)|--(2,q1,aa)|--(1,5p1,aa)
|--(2,q2,aA)|--(1,q2,aA)|--(0,q2,aA)|--(1,q0,aA)|--(1,q1,aA)
|--(1,3p1,aA)|--(1,3q1,BA)|--(2,3p2,BA)
|--(2,q2,BA)|--(1,q2,BA)|--(0,q2,BA)|--(1,q0,BA)|--(1,q1,BA)|--(2,q1,BA)
|--(2, 2p1,BA)|--(2,q2,BS)|--(1,q2,BS)|--(0,q2,BS)|--(1,q0,BS)|--(1,q1,BS)
|--(1,1p1,BS)|--(1,1q1,SS)|--(2,1p2,SS)|--(2,q2,Sb)
|--(1,q2,Sb)|--(0,q2,Sb)|--(1,q0,Sb)|--(1,p1,Sb)
|--(2,p2,Sb)|--(3,p2,Sb)|--(2,qf,Sb)

Construccin de una GSC a partir de un ALL


Sea A un ALL, entonces podemos construir una GSC G tal que L(G)=T(A)-{}.
En efecto, sea el ALL A=(K,{,},,q0,{qf}) construimos as la GSC G=(N,,P,S):
N = {S,Z,X}
N1 donde N1={ aq / a(), qK }
N2 donde N2={ [a / a() } { a] / a() }
N3 donde N3={ [aq / a(), qK } { a]q / a(), qK }
N4 donde N4={ (aq / a(), qK } { a)q / a(), qK }
N5 donde N5={ a / a }
Ntese que aq, [a, a], [aq, a]q, (aq, a)q y a son cada uno- un nico smbolo de
N.
P:
1) S --> Z
S --> X

2) Z --> cZ c(N2)
Z --> Zc c(N2)
Z --> bqf b(N2)
Z --> a)qf a()

252
Z --> (aqf a()
3) Si q L p es una regla de A
b]p --> b)q b()
4) Si q R p es una regla de A
[bp --> (bq b()
5) Si q a L p es una regla de A
bpa --> baq b()
bpa] --> ba]q b()
[bpa --> [baq b()
[bpa] --> [ba]q b()
(ap --> [aq
6) Si q a R p es una regla de A
abp --> aqb b()
[abp --> [aqb b()
ab]p --> aqb] b()
[ab]p --> [aqb] b()
a)p --> a]q
7) Si q a b p es una regla de A
bp --> aq
[bp --> [aq
b]p --> a]q
8) [aq0 --> a a
ab --> ab a,b
ab] --> ab a,b
9) Sea W={a / aT(A)} (ntese que W es finito)
X --> a aW
Las producciones de 9 son necesarias puesto que las producciones de 2 a 8 slo generan en
G- cadenas de 2 o ms smbolos (que son aceptadas por A).

Ejemplo:
Sea el ALL A=({q0,qf},{a,b}{,},,q0,{qf}) (en este caso =) :
q0 L qf
q0 R qf
q0 a L q0
q0 a L qf
q0 a R qf
q0 a b qf
Slo para tener un ejemplo ms abarcador este ALL tiene varias cudruplas que hacen
finalmente lo mismo, debiera ser claro que T(A)={}{aw / w*}

Construimos as la GSC G=(N,{a,b},P,S):

253
N = {S,Z,X}
{ aq0, aqf, bq0, bqf }
{ [a, [b, a], b] }
{ [aq0, [bq0, [aqf, [bqf , a]q0, b]q0, a]qf, b]qf }
{ (aq0, (bq0, (aqf, (bqf , a)q0, b)q0, a)qf, b)qf }
{ a, b }
P:
1) S --> Z
S --> X
2)
Z --> aZ Z --> Za Z --> aqf Z --> a)qf Z --> (aqf
Z --> bZ Z --> Zb Z --> bqf Z --> b)qf Z --> (bqf
Z --> [aZ Z --> Z[a Z --> [aqf
Z --> [bZ Z --> Z[b Z --> [bqf
Z --> a]Z Z --> Za] Z --> a]qf
Z --> b]Z Z --> Zb] Z --> b]qf
3) De q0 L qf
a]qf --> a)q0
b]qf --> b)q0
4) De q0 R qf
[aqf --> (aq0
[bqf --> (bq0
5) De q0 a L q0
aq0 a --> a aq0
bq0 a --> b aq0
aq0 a] --> a a]q0
bq0 a] --> b a]q0
[aq0 a --> [a aq0
[bq0 a --> [b aq0
[aq0 a] --> [a a]q0
[bq0 a] --> [b a]q0
(aq0 --> [aq0
De q0 a L qf
aqf a --> a aq0
bqf a --> b aq0
aqf a] --> a a]q0
bqf a] --> b a]q0
[aqf a --> [a aq0
[bqf a --> [b aq0
[aqf a] --> [a a]q0
[bqf a] --> [b a]q0
(aqf --> [aq0

254
6) De q0 a R qf
a aqf --> aq0 a
a bqf --> aq0 b
[a aqf --> [aq0 a
[a bqf --> [aq0 b
a a]qf --> aq0 a]
a b]qf --> aq0 b]
[a a]qf --> [aq0 a]
[a b]qf --> [aq0 b]
a)qf --> a]q0
7) De q0 a b qf
bqf --> aq0
[bqf --> [aq0
b]qf --> a]q0
8)

[aq0 --> a aa --> aa a a] --> aa


[bq0 --> b ab --> ab a b] --> ab
ba --> ba b a] --> ba
bb --> bb b b] --> bb

9) X --> a pues W={a}

Unin
Los lenguajes sensibles al contexto son cerrados respecto de la operacin unin.
Sean G1=(N1,T1,P1,S1) y G2=(N2,T2,P2,S2) dos GSCs en forma normal tales que L(G1)=L1 y
L(G2)=L2 con (N12 S(N1N2), entonces podemos construir una GSC G tal que
L(G)=L1L2.
La construccin y la demostracin son prcticamente las mismas que para GLCs.
Construimos as la GSC G=(N1N2{S},T1T2,{S-->S1}{S-->S2}P1P2,S).
Ntese que si las GSCs no estn en forma normal la construccin puede dar lugar a cosas
errneas:
Sea G1=({S1},{a},{S1-->a},S1) y G2=({S2},{a,b,d},{S2-->b,a-->d},S2). Es claro que ambas son
GSCs, que L(G1)={a} y que L(G2)={b}, siguiendo la construccin indicada tenemos que
G=({S,S1,S2},{a,b,d},{S-->S1,S-->S2,S1-->a,S2-->b,a-->d},S) que genera L(G)={a,b,d} que
evidentemente no es la unin deseada.

255
Concatenacin
Los lenguajes sensibles al contexto son cerrados respecto de la operacin concatenacin.
Sean G1=(N1,T1,P1,S1) y G2=(N2,T2,P2,S2) dos GSCs tales que L(G1)=L1 y L(G2)=L2 con
(N12 S(N1N2), entonces podemos construir una GSC G tal que L(G)=L2.L1.
Necesitamos ms requerimientos sobre G1 y G2 para aplicar la construccin vista en las
GLCs, pues hacerlo directamente acarrea errores como se muestra a continuacin.
Sean las GSCs G1=({S1},{a},{S1-->a},S1) y G2=({S2},{a,b,d},{S2-->b,aS2-->ad},S2). Ntese
que L(G1)={a} y L(G2)={b}. Siguiendo directamente la construccin mencionada, tenemos
que G=({S,S1,S2},{a,b,d},{S-->S1S2,S1-->a,S2-->b,aS2-->ad},S) que genera L(G)={ab,ad} que
evidentemente no es la concatenacin deseada, incluso bajo el hecho de las dos gramticas
iniciales estn en forma normal.
Lo que sucede es que los contextos, que se consideran en la parte izquierda de las
producciones (para aplicarlas), no estn siendo diferenciados, es decir, se mezclan.
Debemos pues diferenciarlos y una forma que no resta generalidad al enunciado es exigir que
las dos gramticas iniciales G1 y G2 sean tales que tengan slo No Terminales en la parte
izquierda de sus producciones, si a ello le sumamos que N1 y N2 son disjuntos entonces la
posibilidad de mezcla desaparece.
Construimos as la GSC G=(N1N2{S},T1T2,{S-->S1S2}P1P2,S).

Ejemplo:
Sean las GSCs G1=({S1},{a},{S1-->a},S1) y G2=({S2},{a,b,d},{S2-->b,aS2-->ad},S2).
Como G2 no cumple el requerimiento, construimos G a partir de G2 tal que L(G)=L(G2)
como ya se sabe:
G=({S2,Xa,Xb,Xd},{a,b,d},{S2-->Xb,XaS2-->XaXd,Xa-->a,Xb-->b,Xd-->d},S2)
Finalmente construimos as la GSC G=({S,S1,S2,Xa,Xb,Xd},{a,b,d},P,S)
P:
S-->S1S2
S1-->a
S2-->Xb
XaS2-->XaXd
Xa-->a
Xb-->b
Xd-->d

Cruz de Kleene
Los lenguajes sensibles al contexto son cerrados respecto de la operacin Cruz de Kleene.
Al igual que en el anterior caso es posible que al aplicar directamente la solucin para GLCs
los contextos, que se consideran en la parte izquierda de las producciones (para aplicarlas), no
se diferencien, es decir, se mezclen, como mostramos a continuacin incluso si la GSC
inicial tiene slo No Terminales en la parte izquierda de sus producciones.
Sea la GSC G1=({S1,A},{a,b},{S1-->A,AS1-->Ab,A-->a},S1). Ntese que L(G1)={a}.

256
Siguiendo directamente la construccin mencionada, tenemos que
G=({S,S1,A},{a,b},P,S)
P:
S-->S1S
S-->S1
S1-->A
AS1-->Ab
A-->a
Que permite la derivacin S=>S1S=>S1S1=>AS1=>Ab=>ab de la cadena abque
evidentemente no est en la cruz de Kleene deseada.
Para evitar estos problemas recurrimos a la siguiente ingeniosa solucin.
Sea G1=(N1,T1,P1,S1) una GSC que tiene slo No Terminales en la parte izquierda de sus
producciones tal que L(G1)=L1, con SN1, entonces podemos construir una GSC G tal que
L(G)=L1+ as:
A partir de G1 obtenemos la GSC G2=(N2,T1,P2,S2) que es prcticamente la misma que G1
salvo que los nombres de las No Terminales tienen el subndice 2 de manera que (N1N2={}
y SN2. Es claro que L(G2)=L1=L(G1).
Ahora, con G1 y G2, construimos G as:
G=(N1N2{S},T1,{S-->S1S2S,S-->S1S2,S-->S1}P1P2,S).
De manera que tendremos derivaciones que comiencen as S=>+S1S2S1S2...S1S2(S1), cada
smbolo S1 (o S2) derivar una cadena de L1, y como N1N2 no hay posibilidad de mezcla.

Ejemplo:
Sea las GSC G1=({S1,A},{a,b},{S1-->A,AS1-->Ab,A-->a},S1).
Construimos as la GSC G2=({S2,A2},{a,b},{S2-->A2,A2S2-->A2b,A2-->a},S2).
Y as la la GSC G=({S,S1,A,S2,A2},{a,b},P,S)
P:
S-->S1S2S
S-->S1S2
S-->S1
S1-->A
AS1-->Ab
A-->a
S2-->A2
A2S2-->A2b
A2-->a

Interseccin
Los lenguajes sensibles al contexto son cerrados respecto de la operacin interseccin.
Sean A1=(K1,11{,},1,q0,{qf}) y A2=(K2,22{,},2,p0,{pf}) dos ALLs
tales que T(A1)=L1 y T(A2)=L2 con (K12)={} y rh(K1K2), entonces podemos construir
un ALL A tal que T(A)=L1L2.

257
La idea de la construccin es que el ALL A acte primero como A1 y si la cadena es aceptada
por este primer ALL luego acte como A2 con la misma cadena. Como slo tenemos una cinta
para la cadena de entrada, es usual copiar dicha cadena en una cinta auxiliar y si A1 acepta
la entrada, reponer dicha cadena de la cinta auxiliar a la cinta de entrada del ALL A. Ello se
hace de la siguiente ingeniosa manera utilizando la nica cinta que tenemos en A:
Cada smbolo de entrada ai en la cinta, se reemplaza por el (nuevo) smbolo ici, por ejemplo si
en la cinta tenemos la entrada aba=a1a2a1, se la reemplaza por 1c12c21c1 (la negrita es slo para
diferenciar el smbolo del centro). Luego se construye a partir de A1 un conjunto de
cudruplas que trabajan de manera semejante a 1 pero sobre los superndices i de los
smbolos icj. He aqu la simulacin de dos cintas: los superndices trabajan como lo smbolos
de la cinta de arriba y los subndices actan como la cinta auxiliar de abajo. Todo lo que
hace A1 se hace en la cinta de arriba. Si A1 llega a su estado final, pasamos al estado inicial
de A2 y, o bien trabajamos en la cinta de abajo o bien reponemos la entrada original
cambiando cada smbolo icj por aj.
Ntese que adems de los smbolos ici necesitamos otros del tipo icj.

Construimos as el ALL A=(K1K2{r0,r1,r2,r3},,,r0,{pf})


Sea 1212={a1,...,an}.
= 1 2 12 {,} { icj / i=1,...,n; j=1,...,n }
:
r0ai ici r1 i=1,..,n Van cambiando los smbolos de la cadena de entrada
r 1 c i R r 0
i
i=1,..,n de izquierda a derecha uno a uno, creando las dos cintas.
r0 L r2 Cuando termina vuelve el puntero
r2 ici L r2 i=1,..,n al principio de la entrada
r2 R q0 para empezar como A1.

qhicj L qk j=1,..,n si qhai L qk est en 1 simulan A1


qhicj R qk j=1,..,n si qhai R qk est en 1 en la cinta
qhicg jct qk g=1,..,n si qhai aj qk est en 1 superior
t=1,..,n
qh L qk si qh L qk est en 1
qh R qk si qh R qk est en 1

qf icj R qf i=1,..,n Si A1 lleg al estado final


j=1,..,n avanzamos hasta el final de la cinta
qf L r3
r3 icj aj r3 i=1,..,n Reponemos la entrada original almacenada
j=1,..,n en la cinta inferior
r 3 aj L r 3 j=1,..,n
r3 R p0 Y empezamos el trabajo de A2

258
phai L pk si phai L pk est en 2 Es decir,
phai R pk si phai R pk est en 2 copiar
phai aj pk si phai aj pk est en 2 A2
ph L pk si ph L pk est en 2
ph R pk si ph R pk est en 2

Ejemplo:
Sea el ALL A1=({q0,q1,qf},{a,b}{,},1,q0,{qf})
1:
q0a R q1
q1b R q1
q1 L qf
Sea el ALL A2=({p0,pf},{a,b}{,},2,p0,{pf})
2:
p0a R p0
p0b R p0
p0 L pf
Construimos as el ALL A=({q0,q1,qf,p0,pf,r0,r1,r2,r3},,,r0,{pf})
={a,b}{,}{1c1,1c2,2c1,2c2}
:
r0a 1c1 r1 q01c1 R q1 qf 1c1 R qf p0a R p0
r0b 2c2 r1 q01c2 R q1 qf 1c2 R qf p0b R p0
r1 1c1 R r0 q12c1 R q1 qf 2c1 R qf p0 L pf
2
r1 c2 R r0
2
q1 c2 R q1
2 q f c 2 R q f

r0 L r2 q1 L qf qf L r3
r2 c1 L r2
1 r 3 1c 1 a r 3
r2 2c2 L r2 r 3 1c 2 b r 3
r 3 2c 1 a r 3
r2 R q0
r 3 2c 2 b r 3
r3 a L r3
r3 b L r3
r3 R p0

Complemento
Immerman demostr en 1987 que los lenguajes sensibles al contexto son cerrados respecto de
la operacin complemento. La prueba de ello en trminos de cudruplas es demasiado extensa
para describirse. Sin embargo, presentaremos la idea subyacente a este resultado en forma de
un procedimiento ms parecido al lenguaje natural. Lo central de dicho procedimiento es
entender que cada instruccin del procedimiento puede ser traducida a cudruplas y cada
clculo quepa en la longitud de la cinta de entrada del ALL A (con la entrada w).

259
Recordemos tambin que es posible simular ms de una cinta de trabajo en un sola cinta,
como muestra el caso de la interseccin (donde el nodeterminismo se nota bien al elegir una
de entre varias producciones representadas por cudruplas); se necesitan varias cintas para
varios contadores y contenedores de cadenas en lo que sigue.
Dado el ALL A -T(A)=L- se construye A de manera tal que en lugar de almacenar todas las
d.i. de A, simplemente las contemos (posiblemente almacenando una d.i. a la vez). Ello es
posible pues para la cinta conteniendo w, con |w|=n y |K|=k estados hay un nmero finito
t = |w|*k*n|w| de d.i.. Podemos limitar el tiempo de corrida de A con la entrada w- a t, pues
cualquier serie de movimientos de largo mayor a t repetir alguna d.i. necesariamente.
Sea I la d.i. inicial de A y sea m el nmero de d.i. alcanzables desde I.
Primero supondremos que tenemos calculado en alguna cinta de A- el valor de m, luego
indicaremos cmo puede calcularse.
El siguiente procedimiento de A acepta cadenas cuando A las rechaza:
r=0
Para todas las t d.i.:
Sea C la d.i. en actual consideracin
Simule nodeterminsticamente una serie de movimientos de I a C -en A-
(quizs limitando el tiempo de corrida de A)
Si ello es posible:
Si C incluye al estado final de A rechace w
Si no r=r+1
Si r=m entonces acepte w, en otro caso rechace w
Si A acepta w, A encontrar nodeterminsticamente la serie de movimientos hasta llegar a la
d.i. de aceptacin y rechazar w. En otro caso, A encontrar nodeterminsticamente todas las
m d.i. alcanzables desde I y la ltima condicin del procedimiento har que acepte w.
Para el clculo de m diremos que mj es el nmero de d.i. alcanzables desde I en a lo ms j
pasos. Es claro que m0=1 y que mt=m que es lo que se desea calcular-.
El siguiente procedimiento calcula mj+1 a partir de mj.
mj+1=0
Para todas las t d.i.:
Sea C la d.i. en actual consideracin
b=0
r=0
Para todas las t d.i.:
Sea D la d.i. en actual consideracin
Simule nodeterminsticamente una serie de movimientos de I a D en a lo ms j pasos
Si ello es posible:
r=r+1
Si D=C o C se alcanza a partir de D en 1 movimiento
b=1
Si r<mj rechace este clculo
mj+1=mj+b

260
La condicin r<mj garantiza que hayamos considerado todas las d.i. D alcanzables desde I en j
movimientos, cuando dicha condicin se cumple significa que se ha calculado bien el valor de
b, que ser 1 si C es alcanzable desde I en a lo ms j+1 movimientos, y ser 0 en otro caso.

PROBLEMAS DE DECISIN
Presentaremos ahora algunos resultados conocidos para lenguajes sensibles al contexto.

Pertenencia de una cadena a un lenguaje sensible al contexto


El problema siguiente es decidible: pertenece la cadena w a L(G) donde G es una GSC?
En efecto, sea G una GSC, dado que en sus producciones cada parte izquierda es en longitud-
menor o igual que su parte derecha, resulta que cualquier derivacin que empiece en S, si
hacemos S=u1 hablamos de u1=>u2=>u3=>...=>un, es tal que |u1||u2|...|un|. Adems no es
posible que las formas sentenciales de una derivacin tenga la misma longitud infinitamente
puesto que slo hay un nmero finito de No Terminales y de Terminales.
Ello nos ofrece un procedimiento para determinar la pertenencia o no de w al lenguaje:
A partir de S derivamos todas las formas sentenciales de longitud 1 (si ello es posible, ntese
que S se incluye por s misma), a partir de ellas todas las formas sentenciales de longitud 2, y
as sucesivamente hasta derivar todas las formas sentenciales de longitud |w|. Luego vemos si
w est en este ltimo grupo, si es as wL(G) en otro caso wL(G).
Ciertamente este es un procedimiento costoso computacionalmente pero, cuando menos
tericamente, es efectivo.

Algunos otros problemas de decisin


Para G una GSC, el problema de determinar si L(G)={} es indecidible. En efecto, si el
problema fuera decidible, dado que una GLC es una GSC, podemos partir de dos GLCs,
convertirlas en GSCs (no hay que hacer cambio alguno), obtener los ALLs asociados,
obtener el ALL que acepte la interseccin y verificar si este ltimo ALL acepta el vaco o no;
lo que solucionara el problema de determinar si la interseccin de dos lenguajes libres de
contexto es vaca, cosa que como se mencion en el anterior captulo- es indecidible.
Presser menciona que el problema de determinar si L(G) es infinito se muestra indecidible en
el trabajo de Landweber.
Finalmente el problema de saber si los ALL no determinsticos son equivalentes a los ALL
determinsticos contina abierto.

Lenguajes no sensibles al contexto


Mostraremos que hay por lo menos- un lenguaje (recursivo) que no es sensible al contexto.
Trabajemos con el alfabeto T={a} y pensemos en todas las GSCs que tienen este conjunto de
Terminales, es decir, en adelante cualquier mencin a una GSC supondr que sta trabaja con
T={a} como conjunto de Terminales. Sin prdida de generalidad supongamos que todas estas
gramticas tienen sus No Terminales renombrados como X1, X2, etc. (X1 denota al smbolo
raz).

261
Seguidamente lo que haremos ser representar cada una de las GSCs por una sola cadena en
el alfabeto B={0,1} (aqu pensamos bsicamente en la representacin del conjunto de
producciones, pero es fcil generalizar ello a la descripcin de toda la gramtica), para ello
utilizamos los siguientes reemplazos (el ; est pensado como separador de producciones):
a se reemplaza con 0
--> se reemplaza con 01
; se reemplaza con 011
Xi se reemplaza con 01i+2
No todas las cadenas de B* representan GSCs, pero dada una de estas cadenas hay a lo ms
una GSC representada por ella.
Ahora podemos ordenar lexicogrficamente todas las cadenas de B* y por tanto ordenar todas
las GSCs.
Sea Lj el lenguaje generado por la j-sima GSC de esta ordenacin y sea L={aj / ajLj}.
L no es sensible al contexto. En efecto, supongamos que lo sea, es decir hay una GSC que
genera L; por lo tanto dicha GSC debe estar en la ordenacin mencionada, digamos que es la
k-sima GSC de esta ordenacin, es decir, L=Lk. Pero entonces resulta que
akL si y slo si akLk por la forma de L
si y slo si akL pues Lk=L
Esta contradiccin prueba nuestra afirmacin.
Se puede decir ms an, L as definido es recursivo (vase el siguiente captulo). En efecto,
dada la cadena aj podemos determinar si est o no en L as: primero ubicamos en la
ordenacin la j-sima GSC, luego dado que esta gramtica es recursiva podemos observar si aj
est o no en Lj, si no lo est aj es de L, en otro caso no.

262
CAPTULO 14. RELACIONES Y CONVERSIONES ENTRE NIVELES DE LA
JERARQUA DE CHOMSKY

Todos los lenguajes regulares son libres de contexto


En efecto, las GRs cumplen la definicin de las GLCs, es ms podemos decir que vistas
como GLCs- estn en FNG.
Alternativamente mostraremos la construccin de un APe.f. a partir de un AFN.
Dado una AFN A, podemos construir un APe.f. A tal que T(A)=T(A).
En efecto, sea el AFN A=(K, , d, q1, F), construimos as el APe.f. A:
A=(K, , {Z}, , q1, Z, F)
: (qj,Z)(qi,a,Z) si qjd(qi,a)
Ntese que aqu el estado inicial del APe.f. es q1 y que el nico smbolo de la pila no se
mueve ni cambia nunca.

Ejemplo:
A partir del siguiente AFN A=({q1,q2},{a,b},d,q1,{q2})
d:
d(q1,a)={q1,q2}
d(q2,b)={q1,q2}
Construimos as el AP e.f. A=({q1,q2},{a,b},{Z},,q1,Z,{q2})
:
(q1,a,Z)={(q1,Z),(q2,Z)}
(q2,b,Z)={(q1,Z),(q2,Z)}
Mencionemos adems que hay lenguajes libres de contexto que no son regulares, por ejemplo
{aibi / i>0}.

Todos los lenguajes libres de contexto son sensibles al contexto


En efecto, las GLCs cumplen la definicin de las GSCs, es ms podemos decir que vistas
como GSCs- estn en forma normal.
Alternativamente mostraremos de manera indirecta cmo construir un ALL a partir de un
autmata de pila: Sin prdida de generalidad supongamos que tenemos un AP A a partir de
A sabemos que puede construirse una GLC G, tambin se sabe que desde G podemos
construir una GSC G (es prcticamente la misma), finalmente con G podemos construir un
ALL como se indica en el anterior captulo.
Mencionemos adems que hay lenguajes sensibles al contexto que no son libres de contexto,
por ejemplo {aibici / i>0}.
Aunque no las exponemos agregaremos que todas las GSCs cumplen la definicin de unas
gramticas denominadas de tipo 0.

Jerarqua de Chomsky
Se conoce como Jerarqua de Chomsky a una categorizacin por niveles de los lenguajes y sus
gramticas y autmatas asociados. La ms comn es la siguiente:

263
L3: Lenguajes tipo 3 o regulares, soportados por los autmatas finitos y las gramticas
regulares, por ejemplo {ai / i>0}.
L2: Lenguajes tipo 2 o libres (independientes) de contexto, soportados por los autmatas de
pila y las gramticas libres de contexto, por ejemplo {aibi / i>0}.
L1: Lenguajes tipo 1 o sensibles al contexto, soportados por los autmatas limitados
linealmente y las gramticas sensibles al contexto, por ejemplo {aibici / i>0}.
L0: Lenguajes tipo 0 o recursivamente enumerables, soportados por las gramticas tipo 0 y las
mquinas de Turing. Es ms usual estudiar estos desde la perspectiva de las mquinas de
Turing y la computabilidad, que se constituyen en un captulo fundamental de la teora de la
computacin ms all de los lenguajes formales.
La jerarqua mencionada es esta:
L3L2L1L0
Algunas investigaciones han agregado tipos (o familias) de lenguajes entre estas cuatro
clsicas, por ejemplo los lenguajes libres de contexto determinsticos L son tales que
L3LL2.

Construccin de una Gramtica de tipo 1,2 3 cuyo smbolo raz no aparezca en


ninguna parte derecha de las producciones
La construccin dada para gramticas tipo 3 sirve bien aqu.
Sea G=(N,T,P,S) -SN- una gramtica de tipo 1, 2 3 tal que L(G)=L y G incluye a su
smbolo raz S en la parte derecha de alguna(s) de sus producciones, podemos construir as
una gramtica G de tipo 1, 2 3 correspondientemente tal que G no incluya a su smbolo
raz en la parte derecha de ninguna de sus producciones y L(G)=L(G):
G=(N{S},T,P,S)
P = P { S --> / S --> P }
Es obvio que S no aparecer en ninguna parte derecha porque S no es un smbolo de G

L(G) es recursivo para G una gramtica de tipo 1, 2 3


Cuando decimos que L(G) es recursivo queremos indicar que el problema de determinar si
una cadena dada est o no en L(G) (membresa) es decidible. Ya hemos mostrado cmo
determinar si la cadena w est o no en L(G) cuando G es una gramtica de tipo 3, 2 1.
El procedimiento visto para las GSCs sirve bien para los otros tipos, esta es una consecuencia
de la propiedad de no decrecimiento de las formas sentenciales que se van derivando.

Variantes
Para las gramticas y en particular- los autmatas presentados, se han sugerido y estudiado
una cantidad importante de variantes. Por ejemplo controlando el orden en que se utilizan las
producciones como en las gramticas denominadas atributivas. O bien dando o quitando
flexibilidad a los autmatas ya sea en el manejo de la cinta de entrada o en otros componentes
de los mismos, por ejemplo autmatas de pila con ms de una pila, con un slo smbolo en la
pila (counter pushdown), autmatas finitos que pueden ir a derecha o izquierda en la cinta de
entrada (bidireccionales), y un largo etctera.

264
Slo a ttulo de ejemplo daremos una descripcin de uno de ellos, invitando al(a la) lector(a) a
indagar en los otros casos:

Autmatas finitos probabilsticos (AFP)


Un AFP es una sxtupla A=(K,,,Q0,F,)
K, ,y F tienen la misma interpretacin que en los autmatas finitos (K={q0,...,qn}).
:K X -->[0,1]n+1 define las reglas de probabilidades de transicin. As cada regla es del tipo
(qi,a)=[p0(qi,a),...,pn(qi,a)], pj(qi,a) es la probabilidad de pasar del estado qi al estado qj con el
smbolo a (pj(qi,a)=1).
Q0=[p0,...,pn] es el vector distribucin inicial que describe la probabilidad pi de que el estado
de inicio sea qi (pj=1), es decir, todos los estados (con pj>0) son probables estados iniciales.
es el punto de corte que permite discernir cundo una cadena es aceptada o no.
Dada podemos construir una matriz M denominada matriz de probabilidades de transicin
para cada aas (es usual que al escribir un AFP se presenten directamente las matrices):
p0(q0,a) ... pn(q0,a)
M(a) = ... ... ...
p0(qn,a) ... pn(qn,a)
M(az)= M(a) X M(z), as cuando w=a1...am con m>0, M(w)=M(a1) X...X M(am).
Interesa saber la probabilidad pf(w) de terminar en un estado final partiendo de algn estado
inicial con la cadena w, misma que calcularemos as:
Construimos el vector columna F=[f1 ... fn]T (la T indica transposicin) con fj=1 si qjF,
fj=0 en otro caso.
pf(w)= Q0 X M(w) X F
El lenguaje aceptado por el AFP se define as T(A)={ w*/ pf(w)> }
Qj = Q0 X M(w) es la distribucin j originada por la cadena w a partir del vector distribucin
inicial. La siguiente distribucin Qj+1 originada por la cadena z a partir de la distribucin Qj
ser Qj+1 = Qj X M(z). De manera que dada una cadena, no tenemos una secuencia de estados
sino una secuencia de distribuciones.
Ntese que si Q0=[1,0,...,0] y cada fila de las matrices M(ai) tiene slo un 1 y el resto ceros, el
AFP no es otra cosa que un AFD.

Ejemplo:
Sea el siguiente AFP A=({q0,q1},{a,b},,Q0,{q1},=0.8)
:
0.7 0.3 0.4 0.6
M(a)= M(b)=
0.6 0.4 0.6 0.4
Q0=[0.5 0.5]

265
Veamos qu pasa con la cadena w=abb:
F=[0 1] T
0.7 0.3 0.4 0.6 0.4 0.6 0.508 0.492
M(abb)=M(a) X M(b) X M(b)= X X =
0.6 0.4 0.6 0.4 0.6 0.4 0.504 0.496
0.508 0.492 T
pf(abb)=Q0 X M(w) X F=[0.5 0.5] X X [0 1] =0.494
0.504 0.496
Como pf(abb) no es mayor que el punto de corte =0.8, la cadena w no es aceptada.

266
BIBLIOGRAFA

Brookshear Glenn. Teora de la computacin. Addison-Wesley. Priemra edicin. 1993.

Brzozowski Janusz. Derivatives of regular expressions. Journal of the ACM. Vol. 11, No. 4,
pp. 481-494. 1964.

Davis, Martin; Sigal Ron; Weyuker Elaine. Computability, complexity and languages.
Academic Press. Segunda edicin. 1994.

Fernandez Gregorio; Sez Fernando. Fundamentos de informtica. Alianza. Primera


edicin. 1987.

Garca Pedro et al. Teora de autmatas y lenguajes formales. Alfaomega. Primera edicin.
2001.

Ginzburg A. A procedure for checkin equality of regular expressions. Journal of the ACM
Vol 14, No. 2, pp. 355-362. 1967.

Hopcroft, John; Ullman Jeffrey. Introduccin a la teora de autmatas, lenguajes y


computacin. Continental. Primera edicin. 1997.

Immerman Neil. Nondeterministic space is closed under complementation SIAM Journal of


Computer, pp. 935-938. 1988.

Kelley Dean. Teora de autmatas y lenguajes formales. Prentice Hall. Primera edicin
1995.

Martin, John. Introduction to languages and the theory of computation. McGraw-Hill.


Tercera edicin. 2003.

Presser, Leon; Crdenas Alfonso; Marn Miguel. Ciencias de la computacin Vol. II


Lenguajes, traductores y aplicaciones. Limusa. Primera edicin. 1972.

267
NDICE

AFD, 33
AFN, 48
Alfabeto, 1
ALL, 242
Ambigedad, 158
APe.f., 169
AP, 169
rboles, 154
Arden, 75
Autmata finito determinstico, 33
Autmatas de pila, 169
Autmatas finitos determinsticos, 33
Autmatas finitos probabilsticos, 265
Autmatas limitados linealmente, 242
Brzozowski, 108
Cabeza de la parte derecha, 165
Cadena, 1
Cerradura, 128, 215, 245
Clausura reflexiva transitiva, 7
Cociente, 6
Complemento, 6, 134, 259
Concatenacin, 3, 4, 131, 216, 256
Cruz de Kleene, 6, 219, 256
Cuasi-gramticas libres de contexto, 204
CYK, 233
Chomsky, 162
Derivadas, 65
Descripcin instantnea, 38, 39, 169
Determinstico, 33, 34, 48, 176, 177, 178, 179
Diferencia, 6, 133
Earley, 141
Ecuaciones, 75
Equivalencia, 145
Estrella, 5
Estrella de Kleene, 5, 66, 112, 128, 135, 232
Expansin, 164
Expresiones regulares, 62
FNCH, 186
FNG, 191
FNK, 242
Forma normal, 162, 242
Ginzburg, 145
GLC, 152
GLC limpia, 180

268
Glushkov, 101
Gramtica libre de contexto, 152
Gramtica regular lineal derecha, 8
Gramtica regular lineal izquierda, 20
Gramticas LL y LR, 239
Gramticas regulares, 8
Greibach, 162
GRLD, 23
GRLI, 23
GSC, 241
Igualdad, 2
Immerman, 259
Inclusin, 144
Interseccin, 4, 134, 222, 223, 226, 257
Inversa, 2
Inverso, 5
Jerarqua de Chomsky, 263
Kleene, 100
Kuroda, 242
L(G) lenguaje generado, 14
Lema de bombeo, 43, 165
Lenguaje, 2
Lenguaje regular, 26
Lenguajes sensibles al contexto, 241
Longitud, 2
McNaughton, 101
Minimizacin, 118
Moore, 145
Myhill-Nerode, 45
No determinstico, 48
No terminales inaccesibles, 161
No terminales intiles, 161
Ogden, 167
Paso de derivacin, 13
Poda, 164
Potencia, 3
Prefijo, 3
Problemas de decisin, 141, 233, 261
Producciones borradoras, 161
Producciones renombradoras, 161
Recursivo por izquierda, 165
Regla de transicin, 33
Reinicializable, 87
Smbolo, 1
Subcadena, 4
Sufijo, 4
Suma directa, 145

269
T(A): lenguaje aceptado, 40
Thompson, 104
Transiciones vacas, 52
Unin, 4, 128, 215, 255
Yamada, 101
-AFN, 52
-cierre, 53

270