Вы находитесь на странице: 1из 124

Lenguajes y Maquinas

Silvia Takahashi

29 de julio de 2014
2
Captulo 1

Conceptos Basicos

Este captulo presenta una vision global de la teora de lenguajes. Primero se dan las definiciones basicas.
Luego se describen los conceptos de sintaxis y semantica. Estos conceptos seran cubiertos en mas profundidad
en los captulos siguientes.
Dado un lenguaje, se debe poder determinar si una cadena pertenece o no al lenguaje. Note que el
problema de determinar si un programa en un lenguaje de programacion es correcto sintacticamente o no, es
un caso especial de este problema. Otro problema es saber cual es el significado de cada uno de los elementos
del lenguaje. Esto puede querer decir algo tan sencillo como un valor en un dominio dado o su comportamiento
sobre una maquina. A lo primero (la forma) se le llama sintaxis y a lo segundo (el significado) se le llama
semantica.

1.1. Definiciones Generales


En esta seccion se presentan las definiciones basicas de la teora de lenguajes. Estas definiciones son
necesarias para el resto del libro1 . El lector notara la analoga entre la teora de cadenas y la teora de
secuencias vista en [Gries94].
Comenzamos con los elementos constructores de los lenguajes. El elemento mas sencillo es el alfabeto:

Definicion 1. Un alfabeto es un conjunto finito de smbolos.

Se debe resaltar lo siguiente de esta definicion:

1. Los alfabetos son finitos.

2. Por smbolo no se esta haciendo referencia a un solo caracter. Los smbolos se pueden denotar con
nombres.

Los siguientes son ejemplos de alfabetos:

{a, b, c}

{while, if, else, +, ++, {, }, , =, class, extends, private, public}

{sustantivo, verbo, pronombre, adjetivo, adverbio, preposicion}

{1 , 2 , ..., n }
1 Las definiciones basicas para el analisis de lenguajes mostradas en esta seccion son las que se encuentran en los libros

dedicados a teora de compiladores, teora de lenguajes, teora de la computacion. Hay pequenas variaciones en cuanto a la
notacion. Las referencias [Denning78], [Lewis81] y [Lopez87] fueron usadas como base para esta seccion

3
El siguiente concepto de la teora de lenguajes es el de cadena o palabra (o programa!). Dado un alfabeto,
podemos formar palabras o cadenas con los smbolos del alfabeto. Por ejemplo, dado el alfabeto {a, b, c}
podemos formar las siguientes palabras o cadenas: a, b, ab, cab, bb, aaaa.
Definicion 2. Dado un alfabeto A, una cadena sobre A es una sucesion de longitud finita (mayor o igual a
cero) de smbolos del alfabeto. La letra griega lambda, , se usa para denotar la cadena vaca sobre cualquier
alfabeto.
En esta definicion tambien se debe resaltar el hecho que las cadenas son de longitud finita.
Ejemplo 1.1. Dado un alfabeto A = {a, b}, las siguientes son cadenas sobre A.

a, b, aa, ba, bb, ba, aaa, aba, abb, aba, baa, bba, bbb, bba
Ejemplo 1.2. Si el alfabeto A es:

{while, if, else, +, ++, {, }, , =, class, extends, private, public, (, ), ==, var, num}

, las siguientes son cadenas sobre A.


while (var == var) var = var + num

var var var ())(


Note que, en el ejemplo, la segunda cadena no es una instruccion correcta en Java.
La siguiente definicion de cadena es recursiva. Esta definicion facilitara la definicion de otros conceptos
as como demostraciones que usan induccion estructural sobre las cadenas.
Definicion 3. Recursivamente se define una cadena sobre un alfabeto A con las siguientes dos proposiciones:
La cadena vaca denotada por es una cadena sobre A.
Si es una cadena sobre A (digamos 1 2 . . . n para n 0 con cada i A) y es un smbolo del
alfabeto A, ( A) entonces (i.e., 1 2 . . . n ) es una cadena sobre A.
La longitud de una cadena es el numero de smbolos de la misma. Se puede definir este concepto recur-
sivamente sobre la estructura de las cadenas como se muestra a continuacion.
Definicion 4. Sea una cadena sobre A, la longitud de denotada #. se define as:
Si = entonces #.| = #. = 0
Si = con A entonces #. = #. = 1 + #.
Tambien se define recursivamente el concepto de concatenacion de cadenas. Intuitivamente la concatena-
cion de cadenas se obtiene pegando cadenas. Dadas dos cadenas: = 1 2 . . . n y = 1 2 . . . m con
n 0 y m 0, la concatenacion de y denotada sera: 1 2 . . . n 1 2 . . . m . Formalmente:
Definicion 5. Si y son cadenas sobre A entonces la concatenacion de y denotada se define
recursivamente sobre la estructura de as:
Si = entonces = =
Si = con A entonces = () = ()
Ahora se define el conjunto de todas las palabras de longitud finita que pueden formarse con smbolos de
un alfabeto dado A. Este conjunto se denota A . Primero se define An que denota el conjunto de todas las
cadenas de longitud n que se pueden formar con smbolos de A.
Definicion 6. El conjunto de todas las cadenas sobre un alfabeto A se denota A . Para definir A formal-
mente, primero definimos Ai .

4
A0 = {}

Ak = { : A, Ak1 } para k > 0



A = Ak
S
k=0

Ejemplo 1.3. Sea A = {a, b, c}

A0 = {}
A1 = {a, b, c}
A2 = {aa, ab, ac, ba, bb, bc, ca, cb, cc}

A3 = {aaa, aab, aac, aba, abb, abc, aca, acb, acc, baa, bab,
bac, bba, bbb, bbc, bca, bcb, bcc, caa, cab, cac, cba, cbb, cbc, cca, ccb, ccc}
Finalmente, con estas definiciones se puede definir formalmente el concepto de lenguaje. Siempre que se
habla de lenguaje, se hace con respecto a un alfabeto. Un lenguaje sobre un alfabeto es un conjunto, no
necesariamente finito, de cadenas sobre el alfabeto.

Definicion 7. Un lenguaje sobre un alfabeto A es un conjunto de cadenas sobre A. Formalmente, un lenguaje


sobre A es un subconjunto de A .

Ejemplo 1.4. Dado el alfabeto: A = {a, b, c} los siguientes son lenguajes sobre A.
, a, b, aa, ba, bb, bac, aaa, caaaaba

{ : A , tiene un numero par de as}


{, a, b, aa, ba, bb, ba, aaa, c}
{an cbn : n > 0}
Ejemplo 1.5. Dado el alfabeto A = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, los siguientes son lenguajes sobre A.

{123, 34, + + 90+}


L = {0, 1, 2, 3, 4, 5, 7, 8, 9, 0} { + : L, L}. Esta ultima es una definicion recursiva.
Dado cualquier alfabeto A, los siguientes son lenguajes sobre A:

{}

Ai para i 0

Tambien existe el concepto de concatenacion de lenguajes. Esta definicion se basa en la definicion de


concatenacion de cadenas. La concatenacion de dos lenguajes L1 y L2 es el lenguaje que contiene todas las
cadenas formadas al concatenar cada una de las cadenas de L1 con cada una de las cadenas de L2

Definicion 8. Dados dos lenguajes: L1 y L2 podemos definir la concatenacion de estos lenguajes (denotada
L1 L2 ), as: { : L1 , L2 }.

5
Ejemplo 1.6. Sean: L1 = {a, ab, bb}, L2 = {b, a, }, L3 = {ab, aa}. Entonces:
L1 L1 = {aa, aab, abb, aba, abab, abbb, bba, bbab, bbbb}

L1 L2 = {ab, aa, a, abb, aba, bbb, bba, bb}


L1 L3 = {aab, aaa, abab, abaa, bbab, bbaa}
Note que como un lenguaje es un conjunto, entonces no tiene elementos repetidos.
Dado un lenguaje L, es util definir el lenguaje formado concatenando L palabras L cuantas veces se
quiera. Para esto se usa el operador , que se introdujo en la definicion ??. Formalmente:

Definicion 9. Dado un lenguaje L, L = {} {1 2 . . . n | n 0, i L para todo 1 i n}.


Recursivamente:

L0 = {}

Lk = LLk1

L = Lk
S
k=0

1.1.1. Ejercicios
1. De ejemplos de cadenas sobre el alfabeto {casa, amarilla, es, carro, azul, y, son}

2. De ejemplos de cadenas sobre el alfabeto {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

3. Usando las definiciones, demuestre las siguientes proposiciones:

Para cualquier par de cadenas: y , se tiene que: || = || + ||


Para cualquier cadena , se tiene que = = .

4. De ejemplos de cadenas sobre el alfabeto {N U M, +, , (, )}

5. Sea A = {a, b}, encuentre A4 .

6. Sea A = {a}, encuentre An .

7. Dadas las siguientes afirmaciones indique si son falsas o verdaderas, justificando su respuesta.

Dado un alfabeto A, el lenguaje A siempre es infinito.


Dado un lenguaje L, se puede decir que siempre L.
Dado un lenguaje L, se puede decir que siempre L .

8. Sea L un lenguaje con n elementos y M un lenguaje con m elementos, cuantos elementos tiene el
lenguaje LM

1.2. Sintaxis
En la seccion anterior se uso la notacion de conjuntos para definir lenguajes. Otra forma, es definir la
forma que tienen las cadenas que pertenecen al lenguaje en lenguaje natural: diciendo como son o como
pueden construirse las cadenas que pertenecen al lenguaje. Si el lenguaje es pequeno y poco complejo,
estas metodologas pueden ser aceptables, pero si el lenguaje es muy grande, esto no es viable. Se introduce,
entonces, un formalismo para definir lenguajes y para determinar si una cadena pertenece o no a un lenguaje:
las gramaticas.

6
Definicion 10. Una gramatica es una 4-tupla (N, T, S, P ) donde:

N es un conjunto finito de smbolos llamados no-terminales,

T es un conjunto finito de smbolos llamados terminales,

S es un smbolo denominado smbolo distinguido con S N , y

P es un conjunto de producciones. Una produccion es una regla de la forma: con y cadenas


de longitud mayor o igual a cero. Es decir (N T ) , (N T ) .

Dada una gramatica G = (N, T, S, P ), se desea definir el lenguaje generado por G. Se comienza con
una definicion que muestra como se usan las reglas de produccion para obtener una cadena a partir de otra.
En este caso decimos que una cadena es derivable a partir de otra cadena . La Definicion 11 define el
concepto de ser derivable en un paso y la Definicion 12 define el concepto de ser derivable en cero o mas
pasos.

Definicion 11. Dada una cadena (N T ) tal que = 0 con A N , (N T ) , 0 (N T ) ,


(N T ) . Si hay una regla en P , se dice que 0 es derivable en un paso de 0 y escribimos
0 0 .

Definicion 12. Dadas dos cadenas 0 y n , decimos que n es derivable (en cero o mas pasos) de 0 , y

escribimos 0 = n . Si se cumple alguna de las siguientes condiciones:

0 = n

0 n

Si existen n 1 cadenas: 1 , 2 , . . . , n1 tales que i1 i para 1 i n. (o equivalentemente,



usando una definicion recursiva, si existe una cadena tal que (0 ) ( = n ) )

Con estos conceptos, se puede definir el lenguaje generado por una gramatica:

Definicion 13. Dada una gramatica G = (N, T, S, P ), el lenguaje generado por G, denotado L(G) es el
conjunto de todas las cadenas de terminales que se pueden derivar a partir del smbolo distinguido, es decir

L(G) = { : T , S = }.

El proceso de derivacion describe como se llega del smbolo distinguido a la cadena derivada. Los compi-
ladores, o traductores, usan o implementan este proceso de distintas formas.

Definicion 14. Dada una gramatica G y una cadena L(G), una derivacion para es una secuencia de
cadenas 0 , 1 , . . . , n tales que 0 = S, n = , y i1 i para 1 i n. Generalmente denotamos
la derivacion as: 0 1 2 . . . n1 n .

7
Ejemplo 1.7. Una gramatica para generar el lenguaje L = {an bn cn : n 0} se puede definir as:
No terminales: S, Y, Z

Terminales: a, b, c
Smbolo distinguido: S
Reglas:
1. S
2. S aSYZ
3. aY ab
4. bY bb
5. Z c
6. ZY YZ

Mostramos un ejemplo de una derivacion:


S aSYZ
aaSYZYZ
aaaSYZYZYZ
aaaYZYXYZ
aaabZYZYZ
aaabYZZYZ
aaabbZZYZ
aaabbZYZZ
aaabbYZZZ
aaabbbZZZ
aaabbbcZZ
aaabbbccZ
aaabbbccc
Comentarios:

Por las reglas 1 y 2 se puede afirmar que: S = an S(ZY)n an (ZY)n . Por lo tanto se garantiza que
hay tantas Zs como as y tantas Ys como as.
se sabe que todas las as aparecen juntas y al principio de la cadena.

Las ultima regla logra:an S(ZY)n = an Yn Zn

Las reglas 3 y 4 garantizan que las bs aparecen despues de las as y que estan seguidas.
al finalizar la conversion de las Ys en bs se pasa a converitir las Zs en cs con la regla 5.
Si se aplica la regla 5 cuando aun aparece alguna Y a la derecha, esta nunca podra convertirse en una
b. En el ejemplo, de derivacion, no se peude terminar si se hubiese aplicado la regla 5, antes de pasar
las Y a la izquierda estas no se habran podido convertir en b.

Se dice que una gramatica G genera una cadena si existe una derivacion para la cadena con la gramatica.
Puede que haya una derivacion que no llegue a esa cadena, pero con tal de que haya una entonces, se puede
decir que la gramatica la genera. Para decir que una gramatica no genera una cadena, habra que demostrar
la imposibilidad que se genere.

8
Ejemplo 1.8. Mostramos una derivacion que no logra llegar a una cadena de terminales.
S aSYZ
aaSYZYZ
aaaSYZYZYZ
aaaYZYXYZ
aaabZYZYZ
aaabYZZYZ
aaabbZZYZ
aaabbcZYZ
aaabbcYZZ
aaabbcYcZ
aaabbcYcc

Este ejemplo muestra que no se pueden generar bs a la derecha de cs.


Las definiciones presentadas se refieren a las gramaticas generales sin restricciones. Se restringen estas
gramaticas estableciendo la forma que pueden tomar las producciones obteniendo: gramaticas dependientes
del contexto, gramaticas independientes del contexto y gramaticas regulares. A continuacion se definen los
distintos tipos de gramaticas. La restriccion mas debil es la siguiente.

Definicion 15. Una gramatica es Dependiente del contexto si para cualquier produccion , #.
#..

La gramatica del ejemplo no es dependiente del contexto, pues la regla 1 no cumple con la condicion que
la longitud de la parte izquierda sea menor o igual que la longitud de la parte derecha. Note, entonces, que
estas gramaticas no pueden servir para generar lenguajes que contienen la cadena vaca.
Modificamos el lenguaje agegandole un smbolo de final de cadena. Este lenguaje s se puede generar con
una gramatica que es dependiente del contexto. Este smbolo de final de cadena, ademas nos sirve para guiar
la generacion del smbolo c apartir de Z, sin correr el riesgo de que existan smbolos Y a su derecha.

Ejemplo 1.9. Una gramatica dependiente del contexto para {an bn cn # : n 0}:
No terminales: S, X, Y, Z

Terminales: a, b, c, #
Smbolo distinguido: S
Reglas:
1. S X#
2. S #
3. X aYZ
4. X aXYZ
5. aY ab
6. bY bb
7. Z# c#
8. Zc cc
9. ZY YZ
Mostramos un ejemplo de una derivacion:

9
Ejemplo 1.10. Derivacion de aaabbbccc#:

S X#
aXYZ#
aaXYZYZ#
aaaYZYZYZ#
aaabZYZYZ#
aaabYZZYZ#
aaabbZZYZ#
aaabbZYZZ#
aaabbYZZZ#
aaabbbZZZ#
aaabbbZZc#
aaabbbZcc#
aaabbbccc#
El siguiente tipo de gramaticas restringen la forma del lado izquierdo de las reglas de produccion: admin-
tiendo unicamente un no-terminal al lado izquierdo.

Definicion 16. Una gramatica es Independiente del contexto si todas las producciones son de la forma
A donde A N y (N T )2 .

Estas gramaticas se denominan independientes del contexto porque podemos reemplazar el no terminal
de la izquierda por la parte derecha sin importar el contexto donde se encuentre. Vale la pena notar que el
contexto al que se refiere es un concepto puramente sintactico. Quiere decir que el no terminal A siempre se
puede reemplazar por , sin importar el contexto (los smbolos que estan al lado de A) en que aparezca A.
En las gramaticas dependientes del contexto, se permiten regalas de esta forma: A , en este caso
se puede reemplazar A por , si A esta en el contexto de y .
Ejemplo 1.11. La siguiente gramatica sirve para generar el lenguaje: an bn : n 0. G =
({S}, {a, b}, S, {S aSb, S })
Una derivacion para aaabbb sera: S aSb aaSbb aaaSbbb aaabbb
Hay una ultima restriccion que puede agregarse a las gramaticas. La idea es restringir la forma que tiene
la parte derecha de las reglas:

Definicion 17. Una gramatica es regular si la parte derecha de la regla tiene a lo mas un no terminal y
este siempre aparece a la izquierda o a la derecha. Es decir, si ocurre una y solo una de las dos condiciones
siguientes:

Todas las producciones son de la forma: A B o A con T , A N y B N . Es decir, la


parte derecha de las reglas tiene a lo mas un no-terminal y este aparece siempre a la derecha.

Todas las producciones son de la forma: A B o A con T , A N y B N . Es decir, la


parte derecha de las reglas tiene a lo mas un no-terminal y este aparece siempre a la izquierda.

En el primer caso se dice que la gramatica es regular por la derecha y en el segundo se dice que es regular
por la izquierda.

Cada una de estas restricciones define, no solo una clase de gramaticas, tambien define una clase de
lenguajes y describen una jerarqua entre los tipos de lenguajes3 . Un lenguaje es regular si puede generarse
con una gramatica regular; un lenguaje es independiente del contexto si puede generarse con una gramatica
independiente del contexto y un lenguaje es dependiente del contexto si puede generarse con una gramatica
2 Note que en estas gramaticas el lado derecho s puede ser .
3 Esta jerarqua de lenguajes se denomina la Jerarqua de Chomsky por el linguista Noam Chomsky

10
dependiente del contexto 4 . Finalmente los lenguajes definidos con gramaticas sin restricciones son lenguajes
recursivamente enumerables. Esta jerarqua tambien incluye las maquinas con las que se pueden reconocer los
lenguajes. Los lenguajes recursivamente enumerables son reconocidos por maquinas de Turing; los lenguajes
dependientes del contexto son reconocidos por Maquinas de Turing restringidas linealmente; los lenguajes
independientes del contexto son reconocidos por automatas de pila; y finalmente, los lenguajes regulares
son reconocidos por automatas finitos. Estos ultimos seran explicados en profundidad en el Captulo 2. El
captulo 3 describe brevemente los automatas de pila. El lector interesado en profundizar en el tema de los
otros formalismos puede consultar las referencias que se refieren a la teora de la calculabilidad.

1.2.1. Gramaticas independientes del contexto


Casi siempre en el analisis de lenguajes se utilizan las gramaticas independientes del contexto o regulares.
Como vimos, estas imponen una restriccion sobre la forma de las reglas y son, por lo tanto, mas facilmente
implementables. Dado que este texto esta dedicado principalmente al procesamiento de lenguajes, el resto
del texto tratara solo este tipo de gramaticas.
En esta seccion redefiniremos algunos terminos para ajustarlos a las gramaticas independientes del con-
texto.

Definicion 18. Una gramatica independiente del contexto es una 4-tupla (N, T, S, P ) donde:

N es un conjunto de smbolos no-terminales,

T es un conjunto de smbolos terminales,

S es un smbolo denominado smbolo distinguido con S N , y

P es un conjunto de producciones. Una produccion es una regla de la forma: A con A N y


(N T ) .

Ahora se daran las definiciones necesarias para determinar el lenguaje generado por la gramatica. Al igual
que en el caso anterior, comenzamos definiendo la nocion de derivable en un paso. Las nociones de derivacion
y lenguaje generado por una gramatica son las mismas que las dadas para las gramaticas generales.

Definicion 19. Dada una cadena de (N T ) de la forma A 0 con A N , (N T ) , 0 (N T ) ,


si hay una regla A en P , se dice que 0 es derivable en un paso de A 0 y escribimos A 0 0 .

Se puede asociar un arbol de sintaxis a cada derivacion, informalmente se puede describir la construccion
del arbol de sintaxis como sigue:

La raz del arbol de sintaxis es el smbolo distinguido.

Este nodo tiene como hijos los smbolos que quedan al lado derecho de la primera regla usada en la
derivacion.

Cada nodo etiquetado con un smbolo no terminal tiene como hijos los smbolos de la parte derecha
de la regla de produccion que se aplico para reemplazar este smbolo.

Los smbolos terminales (as como la cadena vaca) son las hojas del arbol.

Dado un arbol de sintaxis, la cadena resultante de la derivacion correspondiente es la lista de las hojas
del arbol, ledas de izquierda a derecha e ignorando aquellas hojas etiquetadas con .
4 Un lenguaje que contiene la cadena vaca puede ser dependiente del contexto mas no puede ser generado por una gramatica

dependiente del contexto por la restriccion sobre la longitud de la parte derecha. En este caso, se dice que L es un lenguaje
dependiente del contexto si y solamente si existe una gramatica G tal que L(G) = L {}

11
Ejemplo 1.12. El arbol asociado a la derivacion del ejemplo 1.11 es el siguiente:
S

a S b

a S b

a S b

Figura 1.1: Arbol para derivacion anbn


La siguiente gramatica sirve para generar el lenguaje de las expresiones aritmeticas entre numeros de un
solo dgito: L = {0, 1, 2, 3, 4, 5, 7, 8, 9} { + : L, L}

Smbolos no-terminales: E

Smbolos terminales: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +

Smbolo distinguido: E

Producciones:

1. E 0
2. E 1
3. E 2
4. E 3
5. E 4
6. E 5
7. E 6
8. E 7
9. E 8
10. E 9
11. E E+E

Algunas derivaciones para 3 + 7 + 9 seran 5 :

Derivacion 1 Derivacion 2

E E+E E E+E

E + E+E E+9

3+E+E E+E+9

3+7+E 3+E+9

3+7+9 3+7+9

12
E

E + E

E + E 9

5 7

Figura 1.2

El siguiente arbol de sintaxis corresponde a ambas derivaciones.


En cambio: la siguiente derivacion tiene un arbol de sintaxis diferente.

Derivacion 1

E E+E

3+E

3+E+E

3+7+E

3+7+9

E + E

3 E + E

7 9

Figura 1.3

Dada una derivacion:


0 1 2 . . . n1 n
decimos que es una derivacion por la izquierda si en cada paso de la derivacion se escoge el elemento no
terminal mas a la izquierda para ser reemplazado. Note que la Derivacion 1 y la Derivacion 3 mostradas
arriba son ambas derivaciones por la izquierda. En cambio, la Derivacion 2 no lo es. Esto lleva a la definicion
de derivable por la izquierda.

Definicion 20. Dada una cadena de (N T ) de la forma A con A N , T y (N T ) si hay


una regla A en P , se dice que es derivable por la izquierda en un paso de A y escribimos
A L $.

5 el no-terminal que se esta reemplazando esta subrayado

13
Definicion 21. Dadas dos cadenas 0 y n , decimos que n es derivable por la izquierda (en cero o

mas pasos) de 0 , y escribimos 0 ==n . Si :
L
0 = n
0 L n
Si existen n 1 cadenas: 1 , 2 , . . . , n1 tales que i1 L i para 1 i n
Analogamente se define el concepto de derivable por la derecha:
Definicion 22. Dada una cadena de (N T ) de la forma A con A N , T y (N T ) si hay
una regla A en P , se dice que es derivable por la derecha en un paso de A y escribimos
A R .

Definicion 23. Dadas dos cadenas 0 y 0 , decimos que n es derivable por la derecha (en cero o mas
pasos) de 0 , y escribimos 0 R n . Si:
0 = n
0 R n
Si existen n 1 cadenas: 1 , 2 , . . . , n1 tales que i1 R i para 1 i n
Se puede demostrar que i1 L i i1 R i i1 i .
Con estas definiciones se puede definir formalmente el concepto de gramatica ambigua.
Definicion 24. Se dice que una gramatica es ambigua si existe una cadena del lenguaje generado por la
gramatica que tiene dos derivaciones por la izquierda diferentes o equivalentemente dos derivaciones por la
derecha diferentes o si tiene dos arboles de sintaxis diferentes.
La gramatica del ejemplo anterior es ambigua, ya que tiene dos derivaciones por la izquierda diferentes
para la cadena 3+7+9.

Ejercicios
1. Dadas las siguientes afirmaciones, indique si son ciertas o falsas justificando su respuesta.
a) Dada una gramatica G = (N, T, S, P ) y una cadena = 0 sigma1 . . . sigman tal que L(G)
entonces puede existir un i con 1 i n tal que i 6 T .
b) Dada la siguiente gramatica G = (S, A, B, a, b, S, {S AB, A a, B b, A aA, b bB},
podemos decir que G es ambigua pues la cadena ab tiene las siguientes dos derivaciones:
S AB aB ab
S AB Ab ab
c) Dado un lenguaje L se puede construir mas de una gramatica que lo genera.
d ) Dado un alfabeto T , la siguiente gramatica G = ({S}, T, S, {S } {a : T | : S aS}) se
puede decir que L(G) = T .
e) Dada una gramatica G = (N, T, S, P ) y una cadena tal que L(G) entonces en el arbol
de sintaxis que representa la derivacion de puede haber hojas etiquetadas con smbolos no-
terminales.
f ) Dada la siguiente gramatica G = ({S, A, B}, {a, b}, S, {S AB, A aA, B bB}) L(G) =
g) Dada la siguiente gramatica G = ({S, A, B}, {a, b}, S, {S AB, A aA, B bB}) L(G) = {}
2. Dadas las siguientes gramaticas clasifquelas como regulares, independientes del contexto o dependientes
del contexto. Indique solo la clasificacion mas restrictiva.
a) G = ({S, A, B}, {a, b}, S, {S AB, A a, B b, A aA, B bB})
b) G = ({S, A, B}, {a, b}, S, {S A, S B, A a, B b, A aA, B bB})
c) G = ({S, A, B}, {a, b}, S, {S aAa, Aa bBa, B b, A aAa, B bB})

14
1.2.2. Expresiones Regulares
Para los lenguajes regulares, existe otro formalismo para describirlos ademas de las gramaticas regula-
res: las expresiones regulares. Estas son un formalismo para representar lenguajes. Dado un alfabeto, las
expresiones regulares describen conjuntos de cadenas del alfabeto. Por lo tanto, describen lenguajes sobre el
alfabeto.

Definicion 25. Dado un alfabeto A = 1 , . . . , n una expresion regular sobre el alfabeto A se define,
recursivamente, as.

es una expresion regular sobre el alfabeto y representa el lenguaje vaco, es decir {}.

es una expresion regular sobre el alfabeto y representa el lenguaje que solo incluye la cadena la
cadena vaca, es decir {}.

Para todo i tal que i A, i es una expresion regular sobre el alfabeto y representa el lenguaje {i }

Si y son expresiones regulares que representan los lenguajes L y L respectivamente, entonces


las siguientes tambien son expresiones regulares.

( | ) representa el lenguaje L L
() representa el lenguaje L L
( ) representa el lenguaje L
Solamente estas son expresiones regulares.

Los parentesis se omiten a no ser que ayude a la claridad. Se supone que tiene la maxima precedencia
y | la mnima.
Ejemplo 1.13. Las cadenas sobre {c, a, t} que contienen la subcadena cat: (c|a|t) cat(c|a|t)

Ejemplo 1.14. Las cadenas sobre {c, a, t} que terminan con la subcadena cat: (c|a|t) cat

Ejemplo 1.15. Las cadenas sobre {c, a, t} que comienzan con la subcadena cat: cat(c|a|t)

Ejemplo 1.16. Las cadenas sobre {a, b} que contienen un numero de as que es multiplo de 3:
((b ab ab a)|b)

Ejemplo 1.17. Las cadenas sobre {a, b} que contienen un numero de as modulo 3 es uno: ((b ab ab a)|b) ab

Ejemplo 1.18. Las cadenas sobre {a, b} que contienen un numero de as modulo 3 es dos:

ab ((b ab ab a)|b) ab

Ejemplo 1.19. Las cadenas sobre {a, b} que contienen un numero de as que no es multiplo de tres:

(((b ab ab a)|b) ab )|(ab ((b ab ab a)|b) ab )

Ejemplo 1.20. Las cadenas sobre {a, b} que no contienen aba como subcadena. Esto es un poco mas
complicado ya que no existe el smbolo de negacion en las expresiones regulares: ((aa bb)|b) (((aa )(b|))|)
Algunos de los ejemplos de arriba no son muy intuitivos. No es sencillo ver como construir una expresion
regular a partir de una descripcion en palabras del lenguaje. Abajo se presentan algunos ejemplos que
intentan mostrar como construir una expresion regular a partir de una descripcion.

15
Ejemplo 1.21. Las cadenas sobre {0, 1, 2, 3} de la forma 1 2 . . . n , tales que n 0 y tales que para todo
i, 1 < i n se cumple que i+1 = (i + 1) mod 4. Ejemplos de cadenas que pertenecen a este lenguaje
seran 0123, 3012, 012301230123, 01, 2301.
En primer lugar se podra pensar que una expresion valida sera:

(0123)

El problema de esta expresion es que solo contempla el caso en que la cadena comienza con 0, termina en 3
y tiene longitud multiplo de 4.
Se comienza arreglando el problema de la longitud. Primero, para que la cadena tenga longitud, long, tal
que long mod 4 = 1. Entonces se puede concatenar 3 a (0123) , obteniendo 3(0123) . Si se quiere que
long mod 3 = 2, se obtiene 23(0123) . Para long mod 4 = 3, 123(0123) . Combinando estas expresiones se
obtiene:
(3|23|123|)(0123)
Aun hay problemas pues esta expresion regular solo cubre los casos en que la cadena termina en 3. Las
siguientes expresiones regulares contemplan los casos en que la cadena termina en 0, 1 y 2:

(0|30|230|)(1230)
(1|01|301|)(2301)
(2|12|012|)(3012)

Para obtener la expresion completa se hace la disyuncion de las cuatro expresiones obteniendo:

(3|23|123|)(0123) | (0|30|230|)(1230) | (1|01|301|)(2301) | (2|12|012|)(3012)

Ejercicios
1. Defina una expresion regular que reconozca el lenguaje sobre {0, 1} que representa un numero binario
par.
2. Defina una expresion regular sobre {0, 1} donde la paridad de numero de 0s es igual a la paridad de
numeros de 1s.
3. Defina una expresion regular sobre {0, 1, 2} tal que el ultimo smbolo de la cadena representa la suma
de los dgitos que han salido hasta ahora modulo 3.
4. Defina una expresion regular sobre {0, 1} donde el ultimo smbolo indica la paridad del resto de la
cadena.
5. Defina una expresion regular sobre {a, b} tal que contiene la cadena abba y la cadena bab. Note que las
siguientes cadenas hacen parte del lenguaje: babba y abbab.
6. Defina una expresion regular que contiene la cadena aba siempre que comience con la cadena bba. Si
no comienza con bba, no tiene que contener aba.
7. Defina una expresion regular para denotar numeros en notacion de punto flotante.
8. Defina una expresion regular que defina el lenguaje de las cadenas compuestas de sub-cadenas de
longitud 4 donde el cuarto caracter de cada sub-cadena indica su paridad.

1.3. Semantica: un primer vistazo


En esta seccion se explicara brevemente el concepto de semantica. Este tema se retomara en el capitulo
de Semantica y Traduccion.

16
Como se vio en la seccion anterior, la sintaxis define la forma que deben tener las cadenas que pertenecen
a un lenguaje; la semantica define su significado. En el caso concreto de los lenguajes de programacion, el
significado de un lenguaje puede ser el valor resultante despues de la ejecucion del mismo o su traduccion
a codigo de maquina. Por ejemplo, para un lenguaje como HTML, su semantica es la visualizacion en la
pantalla; para un programa escrito en Java su significado sera su traduccion a ByteCode. En los primeros
lenguajes de programacion se defina la semantica usando lenguaje natural. Esto ocasionaba problemas ya
que distintas implementaciones del lenguaje a veces tenan como resultado interpretaciones distintas de la
semantica. Se quiere poder definir la semantica del lenguaje de una forma clara y sin ambiguedades.
La semantica de muchos lenguajes de programacion se define en forma operacional. Es decir, se explica
como se ejecutara el programa en una maquina dada. Es bastante util para la implementacion de los lenguajes
de programacion imperativos. Pero para un lector que no este familiarizado con la estructura del computador
puede ser difcil de entender. Otra forma de definir el significado de los lenguajes es la semantica axiomatica.
Este enfoque tambien se usa mas frecuentemente para los lenguajes imperativos. La idea es definir aserciones
que hablan del estado del programa (el valor de las variables). La semantica denotacional se usa para traducir
una sentencia escrita en un lenguaje a otro dominio (que a su vez podra ser un lenguaje).

1.4. Vision global del problema


En las secciones anteriores se dieron los fundamentos para el analisis de lenguajes. Para el lector puede no
ser clara su aplicabilidad al desarrollo de software ni tampoco claro como se podra implementar facilmente
un analizador de lenguajes. En esta seccion se presenta un ejemplo completo para el analisis de un programa
sencillo.
Considere el siguiente ejemplo: Tenemos un robot que vive en un mundo de una dimension. El robot
puede moverse a la izquierda o a la derecha o puede ir a una posicion dada de su mundo. Podemos manejar
el robot con los siguientes comandos: move(Dir, steps) o goto(pos).
Una gramatica para las instrucciones del robot seran:

No terminales: I, Dir, Val


Terminales: move, goto, (, ), INT, ,00 , right, left,
Smbolo distinguido: I
Reglas:
I move(Dir, INT)
I goto(Val)
Dir right
Dir left
Val INT
Val INT

Suponga que tenemos la cadena move(right, 12). El problema es que esta cadena se compone de carac-
teres, no de los smbolos terminales sobre los cuales se definio la gramatica. Por lo tanto, lo primero que
debemos hacer es dividir la cadena en los elementos sintacticos del lenguaje: < M OV E > . (, < RIGHT >,
< EN T ERO, 12 >, ). Luego s vemos si estos elementos conforman una instruccion bien formada. El
primer paso es el analisis lexico. El segundo es el analisis sintactico. Para el segundo paso usamos la gramatica
que definimos arriba. Para el primer paso debemos definir las expresiones regulares que definen los tokens.
Podemos definirla as:
T oken move
T oken goto

17
T oken right
T oken left
T oken (
T oken )

T oken ,
T oken Num
T oken

N um (Dig)+
El analizador lexico reconoce tokens (elementos sintacticos). El proceso de analisis lexico no solo debe
decir si esta bien o no, debe dar como resultado lo que reconoce.
Algo interesante es que los lenguajes usados para definir la forma que tienen los tokens son, por lo general,
lenguajes regulares. Mientras que el lenguaje que define la sintaxis del lenguaje en s generalmente es un
lenguaje independiente del contexto.
El resultado del analisis sintactico es simplemente exito o fracaso si solo se esta verificando la correccion
sintactica de la instruccion. Si estamos interesados en hacer un analisis semantico hay varias posibilidades.
Podemos hacer un interprete que simplemente lea una instruccion y la ejecute sobre una clase que imple-
mente el robot. Tambien podemos calcular un valor que en nuestro ejemplo puede ser la posicion del robot
suponiendo que conocemos la posicion de la que parte.
Existen herramientas que nos ayudan a construir aplicaciones que hacen analisis sintactico. Estas herra-
mientas ademas pueden usarse para hacer la interpretacion o para hacer calculos de valores. En este libro,
la herramienta que usaremos sera JavaCC. Para el ejemplo de arriba, el siguiente archivo de JavaCC define
los tokens y la gramatica y realiza acciones para calcular la posicion del Robot.
Seguramente, en este punto al lector le costara trabajo entender la sintaxis particular de JavaCC. Sin
embargo, debe ser clara la relacion que tiene con la definicion de tokens y reglas que se menciona arriba.
Note que a las reglas se les pueden pasar parametros y estas a su vez pueden retornar valores. En este caso la
regla usada para la instruccion recibe como parametro la instruccion donde esta y retorna la posicion donde
queda.
Si lo que se quiere es manejar un Robot definido con la clase Robot1D que tiene metodos para cambiar
la posicion del Robot, lo que habra que cambiar seran las acciones realizadas al definir las reglas. Tambien
se tendra que tener acceso a los metodos del Robot. Digamos que el Robot1D tiene solo dos metodos:

void move(int steps): Si steps es positivo se mueve a la derecha, si es negativo, a la izquierda.

void go(int pos): Va a la posicion pos.

Los cambios que se deben efectuar son: agregar un atributo a la clase Robot1D, as como un metodo
setRobot. Ademas, se cambia la implementacion de las reglas para las instrucciones. En la figura de abajo
solo se muestra lo que cambia.
El resto del libro estara dedicado a entrar en detalle en cada uno de los temas tratados en esta seccion.

18
Figura 1.4

19
Figura 1.5

20
Captulo 2
Modelando con gramticas
Este captulo muestra ejemplos de definiciones de gramticas a partir de definiciones informales de los
lenguajes. Luego, describimos la extensin al formalismo de gramticas conocido como BNF extendido. A partir
de la descripcin de un lenguaje con este formalismo se puede construir un programa que reconozca las cadenas
del lenguaje: un compilador si/no. Es decir, un programa que recibe una cadena y puede decir si la cadena
pertenece o no al lenguaje. El mtodo que se describe en este captulo es el de descenso recursivo. A pesar de
que es relativamente fcil construir estos compiladores a partir de la gramtica, existen herramientas que hacen
esto automticamente. Una de estas herramientas es JavaCC. En este captulo se mostrar cmo usar JavaCC, un
generador de compiladores para Java.

Usaremos las siguientes convenciones para la descripcin de gramticas: los smbolos no-terminales se
escribirn en rojo, los terminales en azul, y los smbolos de la gramtica como la flecha, lambda y los que se
usan en el BNF-extendido en negro.

4.1 Definicin de Gramticas


En esta seccin se presentan algunos ejemplos de definicin de gramticas a partir de descripciones en lenguaje
natural. No se pueden dar unas reglas infalibles para este proceso, ya que en muchos casos depende mucho de la
intuicin del diseador. Cada sub seccin de esta seccin corresponde a un ejemplo donde se ilustra el proceso
de construccin de gramticas para problemas propuestos. El lector notar que si se parte de una definicin
recursiva es muy fcil obtener la gramtica correspondiente.

4.1.1 Expresiones-S
Las expresiones S son la base del lenguaje de programacin LISP. Podemos definir un sub-conjunto de estas
expresiones recursivamente as:

Un entero es una expresin S

Si E1, ,En son expresiones-S (para n > 0), entonces las siguientes tambin son expresiones-S.

1. (+E1En)

2. (*E1En)

Primero se debe determinar cules son los smbolos terminales. En este caso, vemos que los terminales son los
nmeros (NUM), abrir parntesis, cerrar parntesis y los smbolos + y *.

2-1 S.Takahashi
Digamos que S es el smbolo distinguido para generar expresiones S. Del primer punto obtenemos:

S NUM

Para las siguientes reglas tenemos un problema ya que no podemos escribir algo como E1En. Lo que estamos
diciendo en realidad es que tenemos una lista de una o ms expresiones a las que se les antepone un operando.
La regla es entonces:

S (OP Ls)

Donde Ls es una lista de una o ms expresiones S. Una Lista de una o ms expresiones-S es: una expresin-S o
una Lista de expresiones-S seguida de una expresin-S. Eso nos da las siguientes dos reglas:

Ls S
Ls Ls S
Falta entonces definir OP:

OP *
OP +
De hecho, no es necesario definir OP aparte y la siguiente gramtica es suficiente

S NUM
S (+ Ls)
S (* Ls)
Ls S
Ls Ls S

4.1.2 Un lenguaje para un editor grfico


Un dibujo se puede representar como una secuencia no vaca de objetos, separados por comas, entre
parntesis y precedidos de la palabra "DIBUJO". Es decir, es una cadena de la forma DIBUJO(O1,, On),
donde cada Oi es una cadena que representa un objeto.

Un objeto puede ser un crculo, un punto, una lnea, un rectngulo, o un cuadro de dibujo especificados con
cadenas de las formas descritas abajo:

CIRC(Coordenadas, Radio, Color1, Color2): Representa un crculo con centro en Coordenadas, radio
Radio, borde de color Color1 y relleno de color Color2.

PUNT(Coordenadas, Color): Representa un punto localizado en Coordenadas de color Color.

2-2 S.Takahashi
LINEA(Coordenadas1, Coordenadas2, Color): Representa una lnea que va de Coordenadas1 a
Coordenadas2 y con color Color.

RECT(Coordenadas1, Coordenadas2, Color1, Color2): Representa un rectngulo con esquinas opuestas


Coordenadas1 y Coordenadas2, borde de color Color1 y relleno de color Color2.

DIB(Coordenadas1, Coordenadas2, Color1, Color2, (O1, ,On)): Un cuadro de dibujo es un rectngulo


que contiene dibujos. Se especifica igual que un rectngulo cambiando el nombre a DIB y agregando
una lista de objetos entre parntesis.

Coordenadas es una pareja de la forma (X, Y) donde X y Y son enteros positivos.

Color es una tripla (A, V, R) donde A, V, y R son nmeros enteros positivos y negativos.

Radio es un entero

Primero que todo, hay que determinar cules son los smbolos terminales. En este caso son los siguientes: los
enteros (NUM), el smbolo -, para distinguir enteros negativos, abrir parntesis, cerrar parntesis, coma, y las
palabras, DIBUJO, RECT, LINEA, PUNT, CIRC y DIB.

Queremos definir una gramtica para un dibujo, entonces usamos D como smbolo distinguido y a partir del
primer punto en la descripcin del lenguaje tenemos:

D DIBUJO( Os )

Los puntos suspensivos no hacen parte de una gramtica, entonces no pueden usarse en las producciones; se
debe definir una lista de uno o ms objetos usando el no terminal Os.

Se define una lista de uno o ms objetos recursivamente as: una lista es un objeto o es una lista seguida de una
coma seguida de un objeto. Eso nos da las siguientes dos reglas:

Os Ob
Os Os , Ob
Ahora se dan las reglas para generar descripciones de objetos. Cada uno de los puntos de la definicin dada,
genera una regla:

Ob CIRC( Coor , Radio , Color , Color )


Ob PUNT( Coor , Color )
Ob LINEA( Coor , Coor , Color )
Ob RECT( Coor , Coor , Color , Color )
La definicin de cuadro de dibujo tambin hace referencia a una lista de dibujos:

2-3 S.Takahashi
Ob DIB( Coor , Coor , Color , Color , ( Os ))

An faltan las definiciones de Coordenadas, Radio y Color:

Coor (NUM , NUM)

Radio NUM

Como color se compone de nmeros que pueden ser positivos o negativos, se agrega un no terminal para
representar enteros:

Color ( Z , Z , Z )

Finalmente, esta es la definicin de entero positivo o negativo:

Z -NUM
Z NUM

4.1.3 El lenguaje de las expresiones aritmticas


Las expresiones aritmticas son expresiones formadas con los operadores binarios suma, resta, multiplicacin,
divisin y el operador prefijo para el cambio de signo.

Una primera aproximacin sera la siguiente gramtica.

E E+E
E E-E
E E*E
E E/E
E -E
E num
E (E)
Si se quiere que la gramtica incorpore las propiedades de asociatividad por la izquierda y de la precedencia de
operadores usual, se define la gramtica as:

E E+T
E E-T
E T
T T*F

2-4 S.Takahashi
T T/F
T F
F -P
F P
P num
P (E)
El smbolo distinguido es E. Note que los operadores de suma y resta que tienen menos precedencia son los que
aparecen primero en una derivacin a partir del smbolo distinguido. Los parntesis y el operador unario para
cambiar de signo, operadores que tienen ms precedencia, aparecen ms lejos del smbolo distinguido.

4.1.4 El lenguaje de las gramticas


Suponga que queremos definir una gramtica para definir gramticas independientes del contexto. Recuerden
que segn la descripcin dada en el Captulo 1, una gramtica es una cudrupla cuyo primer componente es un
conjunto de smbolos no-terminales; el segundo componente es un conjunto de smbolos no terminales; el tercer
componente es un smbolo distinguido; y el cuarto componente es un conjunto de producciones. Una produccin
es un no-terminal seguido por una flecha, seguido por el smbolo lambda o por una secuencia no vaca de
terminales y no-terminales. En cada uno de los casos de arriba el conjunto se denota como una lista entre
corchetes.

Para facilitar las cosas, suponga que tenemos un analizador lxico que nos reconoce los siguientes smbolos
terminales:

{term, noTerm, (, ), , ,, {, }}.

Es importante notar que el smbolo ac es un terminal. Recuerden que la parte derecha de las reglas puede
ser una secuencia de smbolos terminales y noterminales o la cadena vaca representada por el smbolo lambda.

Se comienza entonces con la definicin:

Una gramtica es una cudrupla

Gramatica ( {NTs}, {Ts}, noTerm, {Ps})


NTs es una lista de no terminales separados por comas

NTs noTerm
NTs NTs , noTerm
Ts es una lista de terminales separados por comas

2-5 S.Takahashi
Ts term
Ts Ts , term
Ps es una lista de producciones separadas por comas

Ps P
Ps Ps , P
Una produccin es un no-terminal seguido por una flecha, seguido por el smbolo lambda o por una
secuencia no vaca de terminales y no-terminales.

P noTerm ParteDerecha
ParteDerecha
ParteDerecha Sims
Sims Sim
Sims Sims Sim
Sim term
Sim noTerm

4.1.5 Un lenguaje para manejo de inventarios


Digamos que queremos verificar si un archivo de datos usado para agregar inventarios a un almacn
tiene el formato correcto. Se describe informalmente el formato como sigue:

El archivo tiene una secuencia de comandos, uno por lnea. Donde cada comando puede ser:
INSERTAR_NUEVO nombre codigo precio cantidad

ACTUALIZAR CANTIDAD POR codigo num

ACTUALIZAR CANTIDAD codigo num

CAMBIAR PRECIO codigo precio

CAMBIAR PRECIO POR codigo porcentaje

PARA CADA CODIGO EN { listadeCodigos }

comandosdeActualizacion

FINPARA

2-6 S.Takahashi
Los comandos de actualizacin pueden tener el siguiente formato:
ACTUALIZAR CANTIDAD POR num

ACTUALIZAR CANTIDAD num

CAMBIAR PRECIO precio

CAMBIAR PRECIO POR porcentaje

Lista de Cdigos: Cdigos separados por comas.

Suponga que ya se tiene un analizador lxico que reconoce los siguientes tokens (smbolos terminales):

Cdigo

Precio

Porcentaje

Nombre

Smbolo de fin de lnea EOL

Coma (separador en las listas) COMMA

Abrir y cerrar corchete: OBR, CBR

Adems se tendra un token por cada una de las palabras reservadas


INSERTAR_NUEVO

ACTUALIZAR

CANTIDAD

POR

CAMBIAR

PRECIO

PARA

CADA

CODIGO

EN

FINPARA

2-7 S.Takahashi
Comenzamos a definir la gramtica. En la descripcin dice que el archivo es una secuencia de
comandos, uno por lnea. Suponga que el smbolo distinguido es Coms. En este caso, el fin del lnea no
es un separador. Cada comando debe tener un fin de lnea al final.

1. COMs COM EOL


2. COMs COMs COM EOL
Pasamos a definir los comandos,

3. COM INSERTAR_NUEVO nombre codigo precio cantidad


4. COM ACTUALIZAR CANTIDAD POR codigo num
5. COM ACTUALIZAR CANTIDAD codigo num
6. COM ACTUALIZAR CANTIDAD POR codigo num
7. COM CAMBIAR PRECIO POR codigo porcentaje
8. COM CAMBIAR PRECIO codigo precio
9. COM PARA CADA CODIGO EN OBR Codigos CBR EOL ListaCs FINPARA
En la ltima regla quedaron no terminales pendientes de definir la lista de cdigos y la lista de
comandos internos.

10. Codigos OBR Cs CBR


11. Cs Cs COMA Codigo
12. Cs Codigo

13. ListaCs COMi EOL


14. ListaCs ListaCs COMi EOL

Los comandos internos se diferencian de los que ya se definieron en que no es necesario poner el
cdigo. Necesitamos nuevas reglas para estos.

15. COMi ACTUALIZAR CANTIDAD num


16. COMi ACTUALIZAR CANTIDAD POR num
17. COMi CAMBIAR PRECIO POR porcentaje
18. COMi CAMBIAR PRECIO precio

2-8 S.Takahashi
Ejercicios
1. Defina una gramtica para las expresiones booleanas formadas con las constantes true y false, y los
conectivos: , , , , y .

2. Defina una gramtica para las expresiones regulares bien formadas sobre el alfabeto {a,b}.

3. El lenguaje Prolog es un lenguaje lgico. Los programas Prolog se definen como una secuencia de hechos y
reglas seguidos por una consulta. Comenzamos por definir los constructos bsicos del lenguaje que sern
los terminales de la gramtica que genera el lenguaje.

a. Un tomo es un nmero o un nombre.

b. Un nombre es una secuencia cadena alfanumrica que comienza con una letra minscula.

c. Una variable es una secuencia alfanumrica que comienza con una mayscula.

A continuacin se definen los constructos compuestos.

a. Un funtor es un nombre que puede o no estar seguido de una secuencia de argumentos separados por
comas entre parntesis.

b. Un argumento es un funtor, un nmero o una variable.

c. Un hecho es un funtor seguido por un punto (.).

d. Una regla es un funtor seguido por el operador ":-" seguido por una secuencia de uno o ms funtores
separados por comas y seguidos por un punto.

e. Una consulta es el operador "?-" seguido por una secuencia de uno o ms funtores separados por comas.

Suponiendo que los terminales son los nombres, los enteros, las variables, la coma, el punto y los operadores: "?-
" y ":-". Defina la gramtica para un programa Prolog.

4. Defina la gramtica para las declaraciones de variables en Java.

5. Defina la gramtica para la definicin de los encabezados de los mtodos en Java.

6. Agregue las operaciones resta y divisin a la gramtica de la seccin 4.1.3

7. Agregue la operacin prefija para cambiar signo a la gramtica de la seccin 4.1.3

8. Agregue la operacin de elevar es decir: (expresin)^Entero a la gramtica de la seccin 4.1.3

9. Agregue la invocacin a la funcin raz cuadrada: sqrt a la gramtica de la seccin 4.1.3

2-9 S.Takahashi
10. Agregue el uso de variables, representadas con una letra mayscula o minscula: A-Z a la gramtica de la
seccin 4.3. Puede suponer que los nombres de variables son terminales.

11. Enriquezca la gramtica para Prolog con la siguiente regla: "una argumento tambin puede ser una lista.Una
lista se define as:

La lista vaca denotada [ ] es una lista

Si a1, ..., an son argumentos y L es una lista ENTONCES LAS SIGUIENTES TAMBIN SON
LISTAS:

[ a1, ... , an | L]

[ a1, ... , an ]

4.2 Extendiendo el formalismo


Las gramticas independientes del contexto pueden extenderse para simplificar la descripcin de ciertos
lenguajes. Esto no aumenta su expresividad. Estas gramticas se llaman gramticas BNF extendidas (Bakus
Naur Form) en honor de J. Bakus y P.Naur quienes usaron este formalismo para la descripcin de Algol1.

En esta seccin describimos el formalismo y convertimos algunas de las gramticas de la seccin anterior a BNF
extendido. La seccin 4.2.1 describe el formalismo y la seccin 4.2.2 muestra algunos ejemplos.

4.2.1 Descripcin
Para distinguir los smbolos terminales de los no-terminales, los no terminales se escriban dentro de corchetes
triangulares y en lugar de flecha usaban ::=. Esto era necesario ya que no se tenan conjuntos de caracteres
extendidos y facilitaba la impresin. En estas notas no vamos a usar estas convenciones. En lugar de esto,
usaremos colores para distinguir los smbolos terminales de los no terminales. Los no terminales los escribimos
en rojo, los terminales en azul y los smbolos de gramtica en negro.

Tal como su nombre lo indica, el BNF extendido, extiende la notacin de las gramticas independientes del
contexto para facilitar la notacin; no extienden la expresividad del formalismo. Es ms bien un azcar
sintctico. Las reglas siguen siendo de la formal: NoTerminal ParteDerecha.
La parte derecha de las reglas es de la forma: 12n, donde Cada i es una expresin que puede ser un

terminal, un no-terminal, o de la forma: {12 k}, [12 s], o (1|2| |n) donde cada i es a su

1
Para un resumen de la historia de los lenguajes de programacin se recomienda la introduccin a [PRATT1996]

2-10 S.Takahashi
vez una expresin. La extensin se refiere a las tres ltimas formas que describimos abajo.

[12 s]: Esto quiere decir que los smbolos que se encuentran entre los corchetes cuadrados son
opcionales.

{12 k}: Esto quiere decir que la cadena que est entre los corchetes se puede repetir cero o ms
veces.

(cad1 | cad2): Tiene la misma semntica que en las expresiones regulares.

Adems se usan parntesis para agrupar.

Dado que tenemos la posibilidad de poner opciones en cada regla, podemos restringir a que haya una sola regla
por cada no terminal.

Es claro que siempre que tenemos una gramtica en formato BNF extendido, la podramos cambiar a una
gramtica sin las extensiones.

El problema que tenemos, entonces, es convertir una gramtica independiente del contexto a un BNF extendido.
Para esto tenemos las reglas que aparecen en la Tabla 4.1.

Note que si slo aplicamos la primera regla, ya tendramos una gramtica en formato BNF extendido. Sin
embargo, a veces es til aplicar las otras reglas para disminuir el nmero de reglas de una gramtica. Esto no
necesariamente la hace ms entendible pero facilita la construccin de analizadores sintcticos a partir de las
gramticas. Esto se discutir en la siguiente seccin.

A continuacin se mostrar cmo se puede convertir una gramtica independiente del contexto a una gramtica
en formato BNF extendido que haga uso de todas las extensiones mencionadas.

Regla de Transformacin Si tiene: Cambie a:


1 A 1 A 1 | 2 || n
A 2

A n
2 Ley de arden A(A)| A { }
A(A)| A { }
3 A ( | ) A [ ]
4 A[A] A { }

2-11 S.Takahashi
5 A Reemplace A por siempre
es simple o A ocurre pocas que aparezca en la parte
veces en la parte derecha de las derecha de alguna
producciones; y A no aparece produccin y elimine la
en . produccin A.

6 Factorizacin A (1 | 2 || n) A (1 | 2 || n)
A (1 | 2 || n) A (1 | 2 || n)
Tabla 4.1 Reglas de Transformacin de BNF a BNF extendido

4.2.2 Ejemplos
En esta seccin mostramos ejemplos en los que transformamos gramticas de la seccin anterior al nuevo
formalismo. Los ejemplos que se incluyen son: el de las expresiones aritmticas, el de gramticas y el lenguaje
para inventarios.

4.2.2.1 Expresiones aritmticas

Aplicamos las reglas a la gramtica de la seccin 4.1.3. Comenzamos una vez ms con la regla 1.

1. E E + T | E T | T
2. T T * F | T / F | F
3. F -P| P
4. P num | (E)

El | es asociativo entonces podemos suponer la siguiente asociacin:

1. E (E + T | E T )| T
2. T (T * F | T / F) | F
3. F -P| P
4. P num | (E)
En las producciones 1 y 2 podemos factorizar E y T a la izquierda respectivamente. En la produccin 3
factorizar P a la derecha. Note que ac el smbolo lambda s representa la cadena vaca.

1. E E (+ T | T )| T
2. T T ( * F | / F) | F
3. F (-| ) P

2-12 S.Takahashi
4. P num | (E)
En las producciones 1 y 2 aplicar la ley de Arden (Regla 2) teniendo en cuenta que la recursin es por la
izquierda.

1. E T {(+ T | T )}
2. T F {( * F | / F)}
3. F (-| ) P
4. P num | (E)
En la produccin 3 aplicar la regla 3.

1. E T {(+ T | T )}
2. T F {( * F | / F)}
3. F [-] P
4. P num | (E)

Podemos eliminar la regla 4, reemplazando P por su definicin en la produccin 3.

1. E T {(+ T | T )}
2. T F {( * F | / F)}
3. F [ - ]( num | (E))

No vale la pena seguir factorizando para sacar la T en la produccin 1 o F en la 2, ya que cuando pasemos a
evaluar la semntica, es ms fcil dejarlos como estn.

4.2.2.2 El lenguaje de las gramticas

La gramtica para describir gramticas independientes del contexto de la seccin 4.1.4. Comenzamos aplicando
la regla 1. Debemos enfatizar que el smbolo es un terminal y no la cadena vaca.

1. Gramatica ( {NTs}, {Ts}, noTerm, {Ps})


2. NTs noTerm | (NTs , noTerm)
3. Ts term | ( Ts , term )
4. Ps P | (Ps , P)
5. P noTerm ParteDerecha

2-13 S.Takahashi
6. ParteDerecha | Sims
7. Sims Sim | ( Sims Sim)
8. Sim term | noTerm

Ahora aplicamos la regla 2 a las producciones 2, 3, 4 y 7

1. Gramatica ( {NTs}, {Ts}, noTerm, {Ps})


2. NTs noTerm { , noTerm }
3. Ts term {, term }
4. Ps P {, P }
5. P noTerm ParteDerecha
6. ParteDerecha | Sims
7. Sims Sim { Sim }
8. Sim term | noTerm

Aplicamos la regla 5 a los terminales: NTs, Sims, Ts, Ps, y ParteDerecha .

1. Gramatica ( { noTerm { , noTerm }}, { term {, term }}, noTerm, { P {, P }})


2. P noTerm ( | (Sim { Sim }))
3. Sim term | noTerm

4.2.2.3 El lenguaje de inventarios

Este lenguaje es relativamente sencillo de convertir. No hay muchos casos en que tengamos que aplicar la regla
de Arden. Sin embargo, para facilitar la aplicacin de diversas tcnicas de compilacin, se sugiere aplicar la
regla de factorizacin para que dos opciones en el patrn de seleccin tengan el mismo prefijo.

Comenzamos, entonces, con la gramtica obtenida en la seccin anterior aplicando la primera regla de
transformacin.

1. COMs COM EOL | COMs COM EOL


2. COM INSERTAR_NUEVO nombre codigo precio cantidad
| ACTUALIZAR CANTIDAD codigo num

2-14 S.Takahashi
| ACTUALIZAR CANTIDAD POR codigo num
| CAMBIAR PRECIO POR codigo porcentaje
| CAMBIAR PRECIO codigo precio
| PARA CADA CODIGO EN Codigos EOL ListaCs FINPARA
3. Codigos OBR Cs CBR
4. Cs codigo | Cs COMA codigo
5. ListaCs COMi EOL | ListaCs COMi EOL
6. COMi ACTUALIZAR CANTIDAD num
| ACTUALIZAR CANTIDAD POR num
| CAMBIAR PRECIO POR porcentaje
| CAMBIAR PRECIO precio

Aplicamos la ley de Arden a las producciones 1, 4 y 5.

1. COMs COM EOL { COM EOL}


2. COM INSERTAR_NUEVO nombre codigo precio cantidad
| ACTUALIZAR CANTIDAD codigo num
| ACTUALIZAR CANTIDAD POR codigo num
| CAMBIAR PRECIO codigo precio
| CAMBIAR PRECIO POR codigo porcentaje
| PARA CADA CODIGO EN OBR Codigos EOL CBR ListaCs FINPARA
3. Codigos OBR Cs CBR
4. Cs codigo { COMA codigo }
5. ListaCs COMi EOL { COMi EOL}
6. COMi ACTUALIZAR CANTIDAD num
| ACTUALIZAR CANTIDAD POR num
| CAMBIAR PRECIO POR porcentaje
| CAMBIAR PRECIO precio
Factorizamos ACTUALIZAR CANTIDAD y CAMBIAR PRECIO en las reglas 2 y 5. Y pasamos Cs a la
produccin 4 y eliminamos a 4.

1. COMs COM EOL { COM EOL}


2. COM INSERTAR_NUEVO nombre codigo precio cantidad
| ACTUALIZAR CANTIDAD ( POR codigo num | codigo num )
| CAMBIAR PRECIO ( POR codigo porcentaje | codigo precio )
| PARA CADA CODIGO EN Codigos EOL ListaCs FINPARA
3. Codigos OBR codigo { COMA codigo } CBR
4. ListaCs COMi EOL { COMi EOL}

2-15 S.Takahashi
5. COMi ACTUALIZAR CANTIDAD ( num | POR num )
| CAMBIAR PRECIO ( POR porcentaje | precio )

Se podra factorizar num a la derecha en las producciones dos y cinco. Sin embargo, as se simplificara la
construccin de un compilador si-no, podra complicar su interpretacin o traduccin. Cuando pasemos al
captulo 5 veremos que hay una semntica distinta cuando tiene el POR que cuando no lo tiene.

4.3 Construyendo Compiladores


En el captulo 3 vimos cmo dada cualquier gramtica, G, podamos construir un autmata no-determinstico
que reconociera L(G). Se vieron dos tipos de autmatas: los descendentes y los ascendentes. A partir de una
gramtica en formato BNF extendido podemos construir un programa determinstico que reconoce el lenguaje
generado por esa gramtica siguiendo unas reglas sencillas de transformacin. Para esto suponemos que ya
tenemos un analizador lxico. Es decir, un programa que lee cadenas de caracteres y produce smbolos no
terminales o tokens.

Vamos a suponer que tenemos los siguientes mtodos que provee el analizador lxico:

Token SigTok(): un mtodo que retorna el siguiente token. Este slo mira el token; no lo saca de la
entrada.

aceptar(Token t): este mtodo saca el primer elemento de la cinta de entrada si es t. Si el siguiente
smbolo no es t, genera un error.

Ahora describimos el problema:

Suponemos que para todo no terminal tenemos una sola regla de la forma:
A 12n

Donde cada i puede ser de la forma:

Un no-terminal.
Un terminal.
Una expresin de la forma (1|2| |n).
Una expresin de la forma {}.
Una expresin de la forma [].
Lambda .
A su vez cada es de la forma: 12n

2-16 S.Takahashi
Para cada no terminal vamos a escribir un mtodo: mA() que tendr las instrucciones necesarias para
reconocer cadenas generadas por A.
Si para el no terminal A tenemos la regla: A 12n , el mtodo correspondiente sera de la forma:
mA()
{
traduccinDe(1)
traduccinDe(2)
.
traduccinDe(n)
}

Donde la traduccin depende de la forma de (i) como se muestra en la Tabla 4.2. Se abusa de la
notacin usando el smbolo y usando conjuntos, en lugar de simples valores, en los casos del switch
y en las condiciones.
Tipo de Smbolo Traduccin
Terminal t accept(Token_t)
noTerminal N mN() donde mN() es el mtodo que corresponde a N.

{} While sigToken()CS() {
Traduccion()
}
[] if sigToken()CS() {
Traduccion()
}
Token t;
(1|2| |n) t = SigToken();
Switch(t) {
CS(1): Traduccion(1); break;
CS(2): Traduccion(2); break;

CS(n): Traduccion(2); break;
Default: throw new Exception();
}

Nota: esto es una traduccin correcta siempre y cuando, se


cumpla la siguiente condicin: ( i| 1 i n: i) = .
Tabla 4.2 Generacin de parser descendentes a partir de BNF extendido
Podemos generar un cdigo un poco ms eficiente aprovechando la forma de lo que se encuentra

2-17 S.Takahashi
dentro de los smbolos {} y [] como se muestra en la Tabla 4.3. Para esta tabla suponga que es un
smbolo terminal.

Tipo de Smbolo Traduccin


While sigToken(){1,2, ,n}) {
{(1|2| |n) }
Avanzar();
Traduccion();
}
[(1|2| |n) ] if sigToken() CS() {
Avanzar();
Traduccion()
}
(1|2| |n) if SigToken(){1,2, ,n}
avanzar()
else
throw new Exception();
}
(1|ii | |n) Token t;
t = SigToken();
Switch(t) {
CS(1): Traduccion(1); break;
CS(2): Traduccion(2); break;

i: avanzar();Traduccion(i); break;

CS(n): Traduccion(2); break;
Default: throw new Exception();
}
Tabla 4.3 Optimizacin de la traduccin
En la Tabla 4.2 y en la Tabla 4.3, se usa el concepto de conjunto de seleccin (CS)2. El conjunto de
seleccin de 12n es el conjunto de terminales con los que puede comenzar 12n. Cada i
puede ser un terminal, un no-terminal, o una expresin BNF de la forma: {12 k}, [12 s], o
(1|2| |n).
Se presentan las siguientes reglas sencillas para calcular el conjunto de seleccin de 12n:
Si n=0 (si no hay smbolos) entonces el conjunto de seleccin es vaco.

2
Esta es una simplificacin del clculo del FIRST y el FOLLOW presentado en el libro de A. Aho, M., et al., Compilers
Principles, Techniques, & Tools, 2nd Ed., Addison Wesley, 2007.

2-18 S.Takahashi
Si 1 es un terminal (digamos t) entonces CS(t2n)= {token_t} .
Si 1 es un no Terminal de A tal que su definicin es: A 12m. entonces
CS(A2n)= CS(12m2n).
si 1 es de la forma (1|2| |m):
CS((1|2| |m) 2n) = CS(12n) CS(22n) CS(m2n)
si 1 es de la forma {}:
CS({} 2n) = CS() CS(2n).

si 1 es de la forma []:
CS([] 2n) = CS() CS(2n) .
Para el ejemplo de las expresiones aritmticas, sta sera su traduccin:

mExp() {
E
mTerm(); T
While (sigToken()==+ || sigToken()==-) { {(+ T | T )}
Token t = sigToken();
switch (t) {
case +:
aceptar(+);
mTerm();
Break;
case -:
aceptar(-);
mTerm();
Break;
Default:
Throw new ParseException ()
}
}
}

mTerm() {
T
mFact(); F
While (sigToken()==* || sigToken()==/) { {(* F | / F )}
Token t = sigToken();
switch (t) {
case *:
aceptar(*);
mFact();
Break;

2-19 S.Takahashi
case /:
aceptar(/);
mFact();
Break;
Default:
Throw new ParseException ()
}
}
}

mFact() {
F
if (sigToken()==-) { [-]
Aceptar(-);
}
Token t = sigToken(); ( num | (E))
switch (t) {
case NUM:
aceptar(NUM);
Break;
case (:
Aceptar(();
mExp();
aceptar());
Break;
Default:
Throw new ParseException ()
}
}

Si aplicamos este proceso a la gramtica extendida de las gramticas, nos dara lo siguiente:

Gramatica ( { noTerm { , noTerm }}, { term {, term }}, noTerm, { P {, P }})


P noTerm ( | (Sim { Sim }))
Sim term | noTerm
Nos da los siguientes mtodos:
mGramtica()
Aceptar((); (
Aceptar({) {
Aceptar(NoTerm); NoTerm

2-20 S.Takahashi
While (sigToken()==,) { {
Aceptar(,); ,
Aceptar(NoTerm); NoTerm
} }
Aceptar(}) }
Aceptar(,) ,
Aceptar({) {
Aceptar(term) term
While (sigToken()==,){ {
Aceptar(,); ,
Aceptar(term); term
} }
Aceptar(}) }
Aceptar(,) ,
Aceptar(noTerm) noTerm
Aceptar(,) ,
Aceptar({) {
mP() P
While (sigToken()==,){ {
Aceptar(,); ,
mP() P }})
} }
Aceptar(}) }
Aceptar()) )
}

mP()
Aceptar(noTerm); noTerm
Aceptar()
Token t = sigToken() ( | (Sim { Sim }))
Switch (t) {
Case :
Aceptar();break;
Case term:
Case noterm: Sim
pSim()
While sigToken() in {term,noterm}{ {
pSim() Sim
} }
Break;
}
}

2-21 S.Takahashi
msim()
Token t = sigToken() term | noTerm
Switch (t) {
Case term: term
Aceptar(term);break;
Case noTerm: noTerm
Aceptar(noTerm);break;
}
}

4.4 JavaCC para generar Compiladores

En la seccin anterior, mostramos cmo construir un compilador a partir de la definicin en BNF de la


gramtica. Esto puede resultar bastante engorroso en lenguajes grandes. Existen muchos generadores
automticos de compiladores. En este libro usamos JavaCC, ub programa genera parsers de descenso
recursivo. Lo bueno de esto es que el parser generado es fcil de entender. Otros enfoques generan
parsers ascendentes, lo cual implica la necesidad de construir el autmata de pila. Por lo tanto el
programa generado es la implementacin del autmata de pila.

Tal como se mencion en el captulo 2, JavaCC permite definir tanto el analizador lxico como el
sintctico. Comenzamos, entonces definiendo los elementos sintcticos del lenguaje y luego mostramos
cmo combinarlos para definir todas las cadenas del lenguaje.

Hay ciertas restricciones que tienen las gramticas para las cuales podemos usar JavaCC. Como se usa
un parser descendente, la cadena se lee de izquierda a derecha y la derivacin que se usa es una
derivacin por la izquierda. La gramtica no puede ser ambigua y no debe ser recursiva por la
izquierda. JavaCC s admite usar el formalismo extendido.

Un archivo para JavaCC tiene extensin .jj. Estos archivos se procesan con JavaCC, tal como se
muestra en la Figura 1. En este ejemplo el archivo que se est procesando se llama Transform.jj. Al
correr JavaCC, se generan los archivos: Transform.java, TransformTokenManager.java y
TransformConstants.java, que son particulares al archivo procesado. Tambin se generan los siguientes
cuatro archivos que son comunes a todos: TokenMgrError.java, ParseException.java, Token.java, y
ASCII_CharStream.java.

2-22 S.Takahashi
Figura 1. Procesamiento de Archivos JavaCC

Un archivo para JavaCC tiene el siguiente formato:

javacc_input

[javacc_options]

PARSER_BEGIN "(" IDENTIFIER ")"

java_compilation_unit

PARSER_END "(" IDENTIFIER ")"

productions

<EOF>

IDENTIFIER debe ser el nombre del archivo sin la extensin jj. java_compilation_unit es
simplemente cdigo Java.

Las producciones se usan tanto para definir el analizador lxico como el sintctico. Veremos cmo se
usa JavaCC en algunos ejemplos.

Considere el lenguaje sencillo de expresiones aritmticas.

S E \n

E T { + T | - T }

T F { * F | / F }

2-23 S.Takahashi
F [-](num | (E ))

Para definir el archivo JavaCC tendramos primero que determinar cules son tokens del lenguaje. Si
estos se componen de un solo carcter, no se tienen que definir explcitamente. Tenemos una sentencia
para definir tokens. Es usual agrupar tokens que estn relacionados. En este caso, el token DIGITO es
privado al grupo. El token nmero es una secuencia de uno o ms dgitos.

Tendramos que crear un archivo que se llama ParseExpression.jj. La primera parte del archivo tendra
lo siguiente. En este caso, no definimos nada adicional. Ac se pueden definir mtodos privados o si se
quiere hacer una aplicacin sencilla se podra hacer todo en un solo archivo definiendo el main ac.

options
{
LOOKAHEAD=1;
IGNORE_CASE=true;
}

PARSER_BEGIN(ParseExpression)

public class ParseExpression {


}

PARSER_END(ParseExpression)

Los siguientes segmentos de cdigo iran en la parte de producciones del archivo de JavaCC.

TOKEN :
{
<#DIGITO: ["0" - "9"] >
| <NUMERO: (<DIGITO>)+>
}

Tambin debemos definir qu caracteres se ignoran y se usan como separadores, si existen. En este
caso estos seran nicamente los espacios.

SKIP :
{
"\r"
| " "
}

Luego se definen las reglas. Como javaCC est escrito sobre Java y los corchetes se usan en Java para
agrupar instrucciones, entonces para denotar la repeticin de patronees se usa ( para abrir y )* para
cerrar.

void input():
{}
{
expr() "\n"

2-24 S.Takahashi
}
void expr():
{}
{
term()( "+" term() | "-" term())*
}
void term():
{}
{
fact()( "*" fact() | "/" fact())*
}

void fact():
{}
{
["-"] ( <NUMERO> | "(" expr() ")")
}

Para invocar el parser, tendramos que hacer lo siguiente:

ParseExpression parser = new ParseExpression(new java.io.StringReader(""));


String expression;
// Codigo para dejar en expresion lo que se quiere parsear

parser.ReInit(new java.io.StringReader(expression));

try {
parser.input();
System.out.println(Cadena Aceptada);
}

catch(ParseException pex)
{ System.out.println(ERROR DE SINTAXIS);

}
catch (Error err)
{
System.out.println("Posible Error LExico);

}
catch (Exception error)
{
System.out.println(Otro Error);

Considere el siguiente ejemplo de los inventarios. En este caso, debemos tener en cuenta la definicin
exacta de los elementos lxicos del lenguaje, los tokens.

Suponga que un cdigo es un nmero de seis a nueve dgitos. Un precio es un nmero de punto flotante
con dos cifras decimales precedido por el smbolo $. El porcentaje es un nmero de punto flotante con

2-25 S.Takahashi
dos cifras decimales, con el smbolo % al final y que puede estar precedido por el smbolo -. El
nombre del producto se pone entre < y > y puede incluir blancos.

Los tokens para el analizador sintctico de este archivo se describiran as:

SKIP :
{
"\r"
| " "
}
TOKEN :
{

<INS_N: "INSERTAR_NUEVO" >


| <ACT: "ACTUALIZAR" >
| <CANT: "CANTIDAD" >
| <CAMB: "CAMBIAR" >
| <PRICE: "PRECIO" >
| <POR: "POR" >
| <PARA: "PARA" >
| <CADA: "CADA" >
| <CODIGO: "CODIGO" >
| <EN: "EN" >
| <FIN: "FINPARA">
}
TOKEN :
{
<#LETRA: ["A" - "Z"] >
| <#DIGITO: ["0" - "9"] >
| <#PALABRA: <LETRA>(<LETRA>|<DIGITO>)*>
| <NOMBRE: "<" (<PALABRA>|" ")* ">">
| <NUMERO: (<DIGITO>)+>
| <PRECIO: "$"(<DIGITO>)+"."<DIGITO><DIGITO>>
| <PORCENTAJE: ("-")?(<DIGITO>)+"."(<DIGITO><DIGITO>)"%">
}

Para no confundir una <PALABRA> con las palabras reservadas, estas ltimas deben definirse antes
del token <PALABRA>.

Abajo se muestran las reglas. En algunas de ellas se hace un clculo para obtener el valor semntico del
token o para hacer validaciones adicionales. Para el nombre, se debe tomar la subcadena que est entre
los corchetes triangulares. Para el precio y el porcentaje, se debe tomar el valor real de la cadena
omitiendo el smbolo $ y el smbolo %, respectivamente. Para el cdigo, se debe verificar que
tenga entre seis y nueve dgitos.

2-26 S.Takahashi
Modificamos un poco la gramtica para facilitar el proceso de interpretacin que se discutir en el
siguiente captulo. La gramtica modificada se muestra a continuacin:

2-27 S.Takahashi
1. COMs ( COM EOL)+
2. COM COMIns | COMAct | COMCh | COMPara
3. COMIns INSERTAR_NUEVO nombre codigo precio cantidad
4. COMAct ACTUALIZAR CANTIDAD ( POR codigo num | codigo num )
5. COMCh CAMBIAR PRECIO ( POR codigo porcentaje | codigo precio )
6. COMPara PARA CADA CODIGO EN Codigos EOL ListaCs FINPARA
7. Codigos OBR codigo { COMA codigo } CBR
8. ListaCs (Inst EOL)+
9. Inst InstAct | IntstCh
10. InstAct ACTUALIZAR CANTIDAD ( num | POR num )
11. InstCH CAMBIAR PRECIO ( POR porcentaje | precio )

Luego quitamos los terminales COM e Inst, y la gramtica que traduciremos a JavaCC queda as:

1. COMs ( (COMIns | COMAct | COMCh | COMPara) EOL)+


2. COMIns INSERTAR_NUEVO nombre codigo precio cantidad
3. COMAct ACTUALIZAR CANTIDAD ( POR codigo num | codigo num )
4. COMCh CAMBIAR PRECIO ( POR codigo porcentaje | codigo precio )
5. COMPara PARA CADA CODIGO EN Codigos EOL ListaCs FINPARA
6. Codigos OBR codigo { COMA codigo } CBR
7. ListaCs ((InstAct | IntstCh) EOL)+
8. InstAct ACTUALIZAR CANTIDAD ( num | POR num )
9. InstCH CAMBIAR PRECIO ( POR porcentaje | precio )

Las dems reglas son una simple reescritura de la gramtica. En este caso no se usan los valores
semnticos de los terminales calculados arriba. Esto se ver en el captulo de traduccin del libro.

2-28 S.Takahashi
void input():
{}
{
((comandoInsert()|comandoAct() | comandoCh()| comandoPara())"\n")+
}

void comandoInsert():
{}
{
<INS_N> nombre() codigo() precio() cantidad()
}

void comandoAct():
{ }
{
<ACT> <CANT> ( <POR> codigo() cantidad() | codigo() cantidad() )
}

void comandoCh():
{}
{
<CAMB> <PRICE> ( <POR> codigo() porcentaje() | codigo() precio())
}

void comandoPara():
{}
{
<PARA> <CADA> <CODIGO> <EN> codigos() "\n"((instAct()| instCh())"\n")+ <FIN>
}

void codigos():
{}
{
"{" codigo()( "," codigo())* "}"
}

void instAct():
{}
{
<ACT> <CANT> ( <POR> cantidad() | cantidad() )
}

void instCh():
{}
{
<CAMB> <PRICE>( <POR> porcentaje() | precio())
}

2-29 S.Takahashi
Bibliografa:

1. Aho, A V., Sethi, R., Ullman, J.D., Compililadores: Principios, tcnicas y herramientas, Addison-Wesley,
1990.

2. Manuales de JavaCC

3. Lpez Rodrigo, Notas del curso de Compiladores, Universidad de los Andes, Bogot, Colombia, 1986-1993.

2-30 S.Takahashi
Captulo 3
Autmatas de Estados Finitos
Los autmatas finitos son mquinas formales que se usan para reconocer lenguajes regulares. Como se vio en el
captulo anterior, estos son los lenguajes ms sencillos, los lenguajes que son generados por gramticas
regulares. En este captulo se darn las definiciones formales de los autmatas determinsticos y los autmatas
no determinsticos. Adicionalmente, se muestra la relacin entre estos y las expresiones regulares. Luego, se
describen los autmatas con respuestas y cmo estos pueden ser usados para hacer traducciones o clculos
sencillos con las cadenas que pertenecen a los lenguajes regulares. Finalmente, se habla de las limitaciones de
este formalismo.

La seccin 2.1 describe informalmente lo que es un autmata con aplicaciones en dominios distintos al anlisis
de lenguajes. La Seccin 2.2 da definiciones formales y ejemplos de autmatas de estados finitos. La seccin la
seccin 2.3 muestra la relacin entre los autmatas finitos y las expresiones regulares. La Seccin 2.4 describe
formalmente los autmatas con respuestas y da ejemplos. Finalmente, la Seccin 2.5 habla de las limitaciones de
los autmatas regulares.

3.1 Qu es un autmata de estados finitos?


Un autmata de estados finitos es una mquina con un nmero finito de estados que lee smbolos de una cinta de
entrada infinita. El comportamiento de la mquina est determinado nicamente por el estado en que se
encuentra y el smbolo en la cinta de entrada. Al leer un smbolo de la cinta de entrada cambia de estado y
avanza en la cinta de entrada. Cuando ya no quedan smbolos por leer, para. An cuando la cita es infinita, la
cadena que gua el comportamiento del autmata no lo es. Esta cadena puede ser tan larga como se quiera, pero
siempre finita.

1 2 3 4 ....... i....... n

s1 s2 ... sk sk+1

En la mquina de la figura de arriba, en el tiempo k est leyendo sk y est en el estado i. La cabeza lectora
nicamente puede avanzar.

3-1 S.Takahashi
Estas mquinas pueden usarse para reconocer lenguajes. Es decir, para leer cadenas (secuencias de smbolos) y
determinar si pertenecen o no a un lenguaje. Los autmatas tambin sirven para describir el comportamiento de
otras mquinas o sistemas. En este caso, no siempre se usa el concepto de cinta de entrada. En lugar de esto el
autmata responde a ciertas acciones o estmulos del mundo exterior. Esto no hace que el modelo sea ms
general ya que podemos pensar en que las acciones se codifican y se ponen en la cinta de entrada que podra
inclusive tener una entrada infinita.

Se puede representar un autmata con un multi-grafo1. Cada nodo representa un estado, los arcos representan
transiciones y estn etiquetados con la accin (o con el smbolo ledo de la cinta de entrada) que causa la
transicin. Se debe tener tambin una convencin para indicar los estados donde puede comenzar la ejecucin. A
continuacin se muestran dos ejemplos

Ejemplo 2.1 El autmata de la figura describe el comportamiento de un semforo peatonal. Inicialmente


el semforo est en rojo para el peatn y se supone que acaba de pasar a rojo. Se quiere garantizar que el
semforo permanezca en rojo al menos cuatro ticks de reloj. Esto quiere decir que si el peatn oprime el
botn y el semforo acaba de pasar a rojo debe esperar cuatro ticks de reloj para que pase a amarillo (y
luego a verde); si han pasado dos ticks slo debe esperar dos ticks; y si han pasado 10 cambia
inmediatamente. Oprimir el botn ms de una vez no afecta el comportamiento. El semforo permanece
en verde por cuatro ticks de reloj.

tick
r-v tick
R
boton
v4
tick tick
tick
boton r1
R1 v3
tick
tick boton r2
tick
R2
tick
boton v2
tick
r3
R3 tick
tick
boton r4 v1
tick
R4 boton
tick

tick v-r

Ejemplo 2.2 El siguiente autmata modela una luz con un temporizador y con sensor de movimiento.

Al estar apagado (off), el movimiento no afecta el estado.

1
Es un multi-grafo por que puede haber ms de un arco entre dos nodos.

3-2 S.Takahashi
Cuando se acciona el interruptor se pasa al estado (on5).
Mientras haya movimiento se queda en (on5); si hay un tick de reloj, pasa el estado (on4).
En (on4): si percibe movimiento pasa al estado (on5); con un tick de reloj, pasa el estado (on3).
En (on3): si percibe movimiento pasa al estado (on5); con un tick de reloj, pasa el estado (on2).
En (on2): si percibe movimiento pasa al estado (on5); con un tick de reloj, pasa el estado (on1).
En (on1): si percibe movimiento pasa al estado (on5); con un tick de reloj, pasa el estado (sb).
En (sb): si percibe movimiento pasa al estado (on5) de lo contrario con un tick de reloj permanece en
este estado.
En cualquier estado se puede pasar al estado (off) accionando el interruptor.
move

tick

move
switch switch
off
switch
sb
on5
tick
switch move
switch tick
tick switch
switch tick on4

on1 on3
tick move

tick
move
on2

move

Con estos dos ejemplos, se concluye el tema de autmatas de propsito general. Las siguientes secciones se
centran en autmatas para el reconocimiento de lenguajes.

3.2 Autmatas finitos: definiciones formales


En esta seccin se presentan las definiciones formales de los autmatas de estados finitos determinsticos y no-
determinsticos. Se dan las convenciones para la representacin de los autmatas por medio de multi-grafos. Se
incluyen ejemplos de reconocedores de lenguajes usando tanto autmatas determinsticos como no-
determinsticos. Estos ejemplos se resuelven usando la representacin grfica o tambin usando un enfoque ms
formal, lo cual resultar til para la descripcin de autmatas muy grandes o de una alta complejidad. Al final de
la seccin se discute cmo podra ser la implementacin de un autmata en el lenguaje Java y se ilustra cmo
podra usarse dentro de una aplicacin ms grande para ayudar a verificar la entrada del usuario.

3-3 S.Takahashi
3.2.1 Autmatas determinsticos (DFA)
Estos autmatas se denominan determinsticos ya que en cada estado su comportamiento es fijo. Es decir, dado
el estado y el smbolo en la cinta de entrada hay un nico estado al cual puede pasar.

Definicin 2.1. Un autmata determinstico de estados finitos (DFA), M, es una quntupla: (Q, , qI, F, ),
donde:
Q es un conjunto finito de estados,
es un alfabeto finito
qI Q es el estado inicial
F Q son los estados finales
Q Q es la funcin de transicin de estados

La condicin de ser determinstico es debido a que hay un nico estado inicial, y las transiciones estn descritas
por una funcin total.

Intuitivamente el comportamiento del autmata puede describirse as: el autmata comienza en el estado inicial y
lee una secuencia de smbolos: smbolo por smbolo hasta que se acabe la secuencia. En cada instante lee un
smbolo , y dependiendo del smbolo y del estado s en el que se encuentra, cambia al estado dado por la
funcin de transicin: (s, ) . Si al terminar de leer toda la secuencia de smbolos est en un estado final,
entonces se dice que el autmata acepta la cadena; de lo contrario, se dice que no la acepta.

En este punto vale la pena resaltar el significado de estado. El hecho que un autmata est en un estado, quiere
decir que el proceso de reconocimiento de la cadena que se est leyendo est en un punto especfico que cumple
con ciertas condiciones. Es fundamental tener esto presente al disear autmatas para reconocer lenguajes.

Un autmata puede describirse dando la lista de sus estados, el alfabeto, el estado inicial, los estados finales, y la
funcin transicin. Esta funcin se puede describir usando notacin usual para definir funciones o usando una
matriz, con una fila por cada estado y una columna por cada smbolo del alfabeto. Si (s, )= s entonces en la
matriz se tiene que M[s, ]=s. Tambin se puede describir un autmata grficamente con un grafo generalizado,
as:
Los estados son vrtices:

El estado inicial se marca con una flecha:

qI

3-4 S.Takahashi
Los estados finales tienen doble borde:

Si (q,)=p entonces hay un arco etiquetado con de q a p:


q p

Ejemplo 2.3 El autmata: M=({0,1},{a,b},{0},{(0,a) 1, (0,b) 0, (1,a) 0, (1,b) 1}} puede


representarse grficamente as:

b a b
0 1
a

Note que en este caso el estado inicial tambin es un estado final.

Como los autmatas se van a usar para reconocer lenguajes, se debe poder determinar cul es el lenguaje que
reconoce un autmata. Esto requiere algunos conceptos adicionales que se definen a continuacin.

Definicin 2.2. Dado un autmata M=(Q,,qI,F,) para q y p estados de M y un smbolo del alfabeto , si
(q,)=p decimos que p es -sucesor de q y escribimos q p.

Se extiende esta definicin a cadenas as:

Definicin 2.3. Dado un autmata M=(Q,,qI,F,) para p y q estados de M y *, decimos que p es -



sucesor de q y escribimos q p .Si:

= y p = q,

=' y existe un estado p' tal que q
p' y p' p

(o equivalentemente: =12...n y existen estados q1, q2, ..., qn. con p = q1 y q = qn tales que para todo i con
0i n se tiene que (qi-1,i) = qi)

Esta definicin puede darse tambin basndose en la clausura transitiva de la funcin de transicin. La clausura
transitiva se obtiene a partir de la funcin de transicin as:

Podemos extender la funcin de transicin usando la clausura transitiva as:

* Q * Q

*(q, ) = q

*(q, ) = *((q,),)

3-5 S.Takahashi
Como es una funcin, entonces para todo estado p y toda cadena * existe un nico estado q talque

(*(p,) = q). Por lo tanto, * tambin es una funcin. Note tambin que p q si y solamente si *(p,) = q,
dando as otra definicin para el concepto de -sucesor.

Los conceptos dados ya permiten definir qu quiere decir que un autmata acepta una cadena.


Definicin 2.4. Dado un autmata M=(Q,,qI,F,), decimos que M acepta una cadena si y solo si qI q
y q F (o equivalentemente si *( qI, ) F).

El lenguaje reconocido por un autmata es el conjunto de todas las cadenas que son aceptadas por un autmata.

Definicin 2.5. Dado un autmata M=(Q,,qI,F,), el lenguaje reconocido por M, L(M) es el conjunto de

todas las cadenas aceptadas por M. L(M)={: qI q y q F}, (i.e., L(M)={: *( qI, ) F }).

El autmata del Ejemplo 2.3 reconoce las cadenas formadas por as y bs que tienen un nmero par de a's.

Ejemplo 2.4 Este autmata reconoce las cadenas formadas por a's y b's tales que el nmero de b's es
mltiplo de tres.

a a

b
0 1

b b

Es conveniente volver a resaltar el significado del nombre de los estados en este ejemplo. Cuando el autmata
est en el estado 0, el nmero de bs mdulo tres que han salido hasta el momento es 0, en el estado 1 es uno y
en el estado 2 es dos. Se habran podido nombrar los estados A, B y C. Pero al nombrarlos con nmeros, el
nombre del estado tiene significado en relacin con las condiciones que se cumplen en el proceso de
reconocimiento de la cadena.

Ejemplo 2.5 El siguiente autmata reconoce las cadenas del alfabeto {c, a, t} que contienen la cadena cat
como subcadena.

3-6 S.Takahashi
Note que en el estado _cat se est esperando la subcadena cat. En el estado 2, si sale la subcadena at ya
debe aceptar la cadena. En el estado 3 le hace falta slo una t. Finalmente, en el estado 4, ya recibi la
cadena y no importa lo que salga.

Ejemplo 2.6 El siguiente autmata reconoce las cadenas que no contienen la cadena cat como subcadena.

Note que el autmata del Ejemplo 2.6 difiere del autmata del ejemplo 2.5 en los estados finales.

Este ejemplo da las bases para el siguiente teorema:

Teorema 2.1. Dado un autmata determinstico: M=(Q,,qI,F,) tal que L(M)=L, el


autmata M'=(Q,,qI,Q-F,) reconoce el complemento de L. Es decir, L(M') = ~L(M).

Demostracin:
L(M)
= Def de L(M)
{: *( qI, ) Q-F }
= Q es el Universo de los estados
{: *( qI, ) F }
= {x:Q} = ~{x :Q}
~{: *( qI, ) F }
= Def de L(M)
~L(M)

3-7 S.Takahashi
El teorema y su demostracin ilustran cmo dado un autmata regular determinstico que reconoce un lenguaje
L, se puede construir un autmata que reconoce el complemento del lenguaje.

A continuacin se muestran varios ejemplos de reconocedores.

Ejemplo 2.7 El siguiente autmata reconoce las cadenas que comienzan con la subcadena aba. Note que
si llega a comenzar con algo diferente a aba llega a un sumidero del cual no puede salir. Una vez ha
recibido la subcadena aba ya no importa qu sigue, acepta la cadena.

a
a b a

b a
b b
b a

Ejemplo 2.8 El siguiente autmata reconoce las cadenas que terminan con la subcadena aba. Para esto,
modificamos el autmata que reconoce las cadenas que contienen aba haciendo que el estado final no sea
un sumidero.

b a a
a b a

b
b

Hay ejemplos ms complicados que exigen primero la comprensin de condiciones complejas para poder
construir el autmata requerido. En estos casos, tambin se deben combinar autmatas para llegar a la solucin.

Ejemplo 2.9 Se quiere construir un autmata que reconozca las cadenas sobre {a,b,c} donde c slo puede
aparecer si la cadena comienza con a.

En este caso, se debe resaltar que lo que se dice es que c puede aparecer si comienza con a, no dice que
debe aparecer. Dicho en otras palabras, c no puede aparecer si la cadena no comienza por a. Otra
caracterstica que se puede deducir es que las cadenas que pertenecen al lenguaje no pueden comenzar con
c, pues si comienzan con c no comienza por a y al no comenzar por a no puede contener c. Tambin se
puede deducir que el autmata acepta cualquier cadena que no contiene c.

3-8 S.Takahashi
El autmata entonces se compone de dos sub-autmatas, uno que acepta c y otro que no. Ahora si
comienza con a, entonces pasa al autmata que acepta las cadenas que contienen c, si comienza con b pasa
al que no acepta c. Todos los estados son finales menos el estado de error.

a|b|c

abc
a

inic b a|b
ab

error
a|b|c

El siguiente ejemplo muestra la utilidad de los autmatas para comprobacin de correccin en las
comunicaciones.

Ejemplo 2.10 Se quiere verificar que la cadena que se est leyendo est formada por secuencias
sucesivas de 8 bits en las que el octavo bit indica la paridad de los 7 anteriores.

0 0 0 0 0 0
1-0 2-0 3-0 4-0 0 5-0 6-0 7-0 1
1 1 1 1 1 1
0
0-0 Err
1 1 1 1 1 1 1
0
1-1 2-1 3-1 4-1 5-1 6-1 7-1 1
0 0 0 0 0
0

El nombre del estado (i,j) indica lo siguiente: i indica el nmero de bits (mdulo 8) que ha salido hasta el
momento mientras que j indica la paridad de los i bits anteriores.

Si el nmero de estados es muy grande, puede no resultar prctico dibujar el autmata. En algunos casos se
puede definir con una tabla de estados contra smbolos del alfabeto de entrada. An as podra resultar
complicado. La idea es darle un nombre adecuado a los estados para poder definir la funcin de transicin
fcilmente.

Ejemplo 2.10a El autmata del Ejemplo 2.10 lo habramos podido definir as:

Q = { (x,y) : x [0..7] y {0,1}} {err}


(err,y) = err para y {0,1}
((x,y),z) = (x+1,(y+z) mod 2 ) x [06] y {0,1} z {0,1}

3-9 S.Takahashi
((7,y),z) = (0,0) si y= z
((7,y),z) = err si y z
F = {(0,0)}
qi = (0,0)
El siguiente ejemplo muestra cmo es ms fcil construir un autmata dando la definicin de la funcin que
dibujar el autmata, an cuando la funcin a primera vista parezca complicada.

Ejemplo 2.11 Un autmata regular que reconozca el lenguaje sobre {0,1,2,3} tal que las cadenas que
pertenecen al lenguaje: 1n cumplen con la siguientes condiciones:

1 {0,1,2,3}
2 {0,1,2,3}
i-1 i i+1 si i i+1
i+1 i i-1 si i+1 i
Note que lo que est haciendo es definiendo i+1 a partir de las anteriores. Rescribiendo la definicin para
definir i, tenemos:
i i 1 i-2 si i-1 i-2
i i-1 i-2 si i-1 i-2

Ahora a construir el autmata

En primera instancia, lo nico que podemos saber del autmata es su alfabeto de entrada: {0,1,2,3}.

Se debe recordar que los estados modelan, como su nombre lo indica, un estado en la computacin
(i.e., en este caso, modelan un paso en el proceso de reconocimiento de cadenas). Denotamos los estados
(a,b) donde a es el valor que se ley en tiempo i-2 y b es el valor ledo en tiempo i-1. Faltara decir cmo
se comienza. pero en realidad, no hay restriccin sobre los dos primeros smbolo de las cadenas. Se debe
asegurar que al leer el segundo smbolo se llega al estado correcto (a,b). Entonces, necesitamos 5 nuevos
estados:

{inic,0, 1, 2, 3}.

Inic es el estado inicial, cuando no ha ledo nada. Cada uno de los estados {0,1,2,3} indica que se ha ledo
un solo smbolo y cual se ha ledo. Se tiene entonces: Q = {(x,y) : 0 x,y < 4 } {0,1,2,3,inic, error}

El estado inicial es inic

No hay restriccin sobre la longitud de la cadena. Mientras no haya llegado al estado de error, la
cadena est bien: por lo tanto F = Q {error}.

3-10 S.Takahashi
Ahora para las transiciones: estando en el estado (a,b), si leemos c, se debe cumplir una de las
siguientes dos condiciones a b c o ab c. Si no se cumple, se debe pasar a un estado de error que es
adems un sumidero. Si se cumple, se pasa al estado (b,c) pues al leer tambin avanzamos en el tiempo y
estamos en el tiempo (i+1), habiendo ledo b en tiempo (i) y b en tiempo (i-2). Esto se expresa de la
siguiente forma:
Para: (0 b,a,c <4)
((a,b),c) = (b,c) para a b c
((a,b),c) = (b,c) para a b c
((a,b),c) = error para a b c < b
((a,b),c) = error para a b c > b
(error,a) = error
Las Transiciones iniciales: para 0 a,b < 4:
(inic,a) = a
(a,b)= (a,b)

3-11 S.Takahashi
La funcin de transicin tambin se habra podido describir con con una tabla T de estados x entradas,
donde Tabla[x,y] =(x,y).

0 1 2 3
Error error Error error Error
Inic 0 1 2 3
0 (0,0) (0,1) (0,2) (0,3)
1 (1,0) (1,1) (1,2) (1,3)
2 (2,0) (2,1) (2,2) (2,3)
3 (3,0) (3,1) (3,2) (3,3)
(0,0) (0,0) (0,1) (0,2) (0,3)
(0,1) error (1,1) (1,2) (1,3)
(0,2) error Error (2,2) (2,3)
(0,3) error Error error (3,3)
(1,0) (0,0) Error error Error
(1,1) (1,0) (1,1) (1,2) (1,3)
(1,2) error error (2,2) (2,3)
(1,3) error error error (3,3)
(2,0) (0,0) error error Error
(2,1) (1,0) (1,1) error Error
(2,2) (2,0) (2,1) (2,2) (2,3)
(2,3) error error error (3,3)
(3,0) (0,0) error error Error
(3,1) (1,0) (1,1) error Error
(3,2) (2,0) (2,1) (2,2) Error
(3,3) (3,0) (3,1) (3,2) (3,3)

EJERCICIOS

1. Describa un autmata determinstico que acepte las cadenas sobre {a,b} en las que el nmero de a's
mdulo 2 es igual al nmero de b's mdulo 2.

2. Describa un autmata determinstico que acepte las cadenas sobre {a,b} que no comienzan por a.

3. Describa un autmata que acepte las cadenas sobre {a,b} tales que el nmero de b's que aparecen en la
cadena NO es mltiplo de 3.

4. Describa un autmata determinstico que acepte el cadenas sobre {a,b} tal que el nmero de as
mdulo 3 ms el nmero de bs mdulo 3 es menor o igual que cuatro.

3-12 S.Takahashi
5. Describa un autmata determinstico que acepte cadenas sobre {a,b} que contienen la subcadena aba si
comienzan por la subcadena bbb. Si no comienza por la subcadena bbb no deben tener la subcadena
aba. Note que si comienza con el prefijo bbb no tiene que tener la subcadena aba.

6. Describa un autmata determinstico que reconozca el lenguaje sobre [0-9] tal que las cadenas que
pertenecen al lenguaje: 1n cumplen con la siguientes condiciones:
1 [0-9]
2 [0-9]
i-1 i i-2 si i-1 i-2 para i>2
i-1 i i-2 si i-1 > i-2 para i>2

3.2.2 Autmatas No-determinsticos (NDFA)


Podemos definir autmatas finitos donde la transicin puede no ser determinstica y donde se pueda realizar una
transicin leyendo cero o ms smbolos de la cinta de entrada. Esto le agrega facilidad de expresin, mas no
poder computacional.

Definicin 2.6. Un autmata no-determinstico de estados finitos (NDFA), M, es una quintupla: (Q,,I,F,),
donde:
Q es un conjunto finito de estados,
es un alfabeto finito
I Q son los estados iniciales
F Q son los estado finales
Q * Q es una relacin de transicin de estados

En los autmatas no-determinsticos, el concepto de sucesor es un poco ms complicado que en los autmatas
determinsticos.

Definicin 2.7. Dado un autmata M=(Q,,I,F,) para pQ, qQ, q estados de M y *, decimos que p

es -sucesor de q y escribimos q p, si ocurre cualquiera de las siguientes condiciones:
= y p = q
((q, ), p)

Existen cadenas * y * tales que = y existe un estado q' tal que ((q, ),q') y q p.

Note que en un autmata no-determinstico, para algn , un estado puede tener ms de un -sucesor o ningn
-sucesor.

3-13 S.Takahashi
La clausura transitiva de la relacin de transicin se define as:

* Q * Q

((q, ),q) *

si ((q, ),p) entonces ((q, ),p) *

si * y existen * , * y rQ tales que = y ((q, ),r) y ((r, ),p) * entonces


((q, ),p) *.

En estos autmatas, la clausura transitiva da origen a una definicin alterna al concepto de -sucesor ya que p
es -sucesor de q si y solamente si ((q, ),p) *.

Los autmatas no determinsticos suelen ser ms sencillos que los determinsticos. El siguiente ejemplo muestra
cmo se puede simplificar la definicin del Ejemplo 2.5.

Ejemplo 2.12 Un autmata que reconoce las cadenas que contienen la subcadena aba

a a

aba

b b

La definicin formal de este autmata sera la siguiente:

Q = {1,2}

={a,b}

I={1}

F={2}

={((1,a),1),((1,b),1),((1,aba),2),((2,a),2),((2,b),2)}

A continuacin se define el cmo se puede determinar cul es el lenguaje reconocido por un autmata no
determinstico. El concepto de configuraciones puede servir para aclarar el comportamiento de los autmatas.
Una configuracin indica el estado del proceso de reconocimiento de una cadena en particular. Indica en qu
estado est el autmata y qu le falta por leer.

3-14 S.Takahashi
Definicin 2.8. Dado un autmata, M=(Q,,I,F,), una configuracin sobre M es una pareja q,, con qQ
y con *.

En ejemplo de arriba algunas configuraciones son: 1, ababa, 1,baba, 2, ba, 2, a y 2,.

Podemos pasar de una configuracin a otra usando la relacin de transicin de estados.

Definicin 2.9. Dado un autmata, M, y q, y q, configuraciones de M se dice que q, es


alcanzable en un paso a partir de q, y escribimos q, q, si:
=
=
((q, ),q)

La relacin de ser alcanzable en un paso puede extenderse con su clausura reflexiva-transitiva para obtener la
relacin de ser alcanzable en cero o ms pasos. Volviendo al Ejemplo 2.12, y a las configuraciones mencionadas
arriba se tiene que:

1, ababa 1,baba,

1, ababa 2, ba,

2, ba 2,a

2, a 2,

Definicin 2.10. Dado un autmata, M, y q, y q, configuraciones de M se dice que q, es


alcanzable (en cero ms pasos) a partir de q, y escribimos q, q, si:
q, = q,
q, q,
Existe una configuracin q, tal que q, q, y q, q,

Un autmata no-determinstico acepta una cadena, si, comenzando en un estado inicial, con puede llegar a
uno final leyendo TODA la cadena. Formalmente:

Definicin 2.11. Dado un autmata M=(Q,,I,F,) decimos que M acepta una cadena * si existen qI
I y f F tales que:

qI f, (o equivalentemente)

qI, f,

El lenguaje reconocido por un autmata incluye todas las cadenas que son aceptadas por el autmata.

3-15 S.Takahashi
Definicin 2.12. L(M), el lenguaje reconocido por M=(Q,,I,F,), es el conjunto de todas las cadenas
aceptadas por M.

L(M) = {: *, existen qI I y fF, tales que qI f}


o, usando la notacin de configuraciones
L(M) = {: *, existen qI I y fF, tales que qI, f,}

Ejemplo 2.13 Un autmata que reconoce las cadenas que terminan con la cadena aba

a
aba

En el ejemplo anterior, al leer la cadena abab, podra llegar al estado final, usando el arco etiquetado con aba,
pero la cadena no es aceptada, ya que al llegar al estado final, no ha terminado de leer toda la cadena.

Ejemplo 2.14 Un autmata que reconoce las cadenas que comienzan con la subcadena aba.

aba

Al comparar estos autmatas con los de la seccin anterior, se nota que stos no requieren sumideros ya que en
este caso la cadena no terminara de leerse.

Es importante resaltar que dado un autmata no-determinstico que reconoce L, al cambiar los estados finales
por no finales y viceversa no se obtiene autmata que reconozca el complemento de L.

Por ejemplo, al cambiar los estados finales por no finales del autmata descrito arriba, se obtiene el siguiente
autmata.

3-16 S.Takahashi
a a

aba

b b

Note que con la cadena aba se puede quedar en el estado inicial y por lo tanto aceptar la cadena.

En la mayora de

Es muy importante notar que si hay alguna forma de partir de un estado inicial con una cadena y llegar a un
estado final, se dice que el autmata acepta la cadena, as haya alguna forma de no aceptarla. Se dice que un
autmata no determinstico no acepta una cadena si no existe forma de llegar de un estado inicial a un estado
final habiendo leido toda la cadena. Es importante enfatizar este ltimo concepto. Una cadena no es aceptada si
no existe forma de aceptarla.

Ejercicios:

1. Defina un autmata de estados finitos que reconozca cadenas sobre el alfabeto {0,1,2} en el que la suma de
los dgitos es no es mltiplo de 3.

2. Defina un autmata de estados finitos que reconozca las cadenas sobre el alfabeto {0,1,2,3,4,5,6,7,8,9} que
representan nmero mltiplos de 10. Suponga que el lee el nmero de izquierda a derecha.

3. Defina autmatas no-determinsticos para los ejercicios de la seccin anterior.

3.2.3 Equivalencia entre autmatas determinsticos y no-determinsticos (NDFA)


Se puede demostrar que estos dos tipos de autmatas son equivalentes. Para demostrar esto tenemos que
demostrar que siempre que tenemos un autmata determinstico podemos construir otro no determnistico
equivalente y viceversa.

La primera parte es fcil, ya que Un autmata determinstico tambin es un autmata no determinstico donde:

para todo ((q, ),p) , || = 1

para todo (q, ) Q , existe un p Q tal que ((q, ),p)

si ((q, ),p) y ((q, ),r) , entonces p=r

La segunda parte de la demostracin en la cual se muestra que dado un autmata no-determinstico siempre se
puede construir un autmata determinstico equivalente no es tan sencilla. La demostracin de este hecho se
encuentra en [1].

3-17 S.Takahashi
3.3 Equivalencia de Expresiones Regulares y Autmatas de Estados Finitos
La clase de lenguajes que son reconocidos por un autmata de estados finitos es igual a la clase de lenguajes que
pueden ser descritos por una expresin regular.

Teorema 2.2. Un lenguaje L puede representarse usando expresiones regulares si y solo si


existe un autmata finito que lo reconoce.

No se demostrar este teorema formalmente; nicamente se ilustra cmo para todo lenguaje L expresado por
medio de una expresin regular podemos construir un autmata no determinstico que lo reconoce. De hecho, as
se demuestra, usando induccin estructural, que todo lenguaje que se puede definir por medio de una expresin
regular, es reconocido por algn autmata determinstico.

Para lograr esto, se comienza mostrando que para todo lenguaje descrito con una expresin regular bsica
podemos construir un autmata que lo reconoce. Luego se supone que se tienen autmatas para expresiones
regulares y se muestra que se pueden construir autmatas2 para expresiones regulares compuestas.

Sea ={1,,n}.

El lenguaje representado por es reconocido por el autmata no determinstico M=(Q,,I,F,) con Q


={1}, I={1} , F =, =:

El lenguaje representado por es reconocido por el autmata no determinstico M=(Q,,I,F,) con Q


={1}, I={1} , F ={1}, =:

Para todo i el lenguaje representado por i es reconocido por el autmata no determinstico


M=(Q,,I,F,) con Q ={1,2}, I ={1} , F ={2}, ={((1, i),2)}:

2
Estos autmatas pueden ser determinsticos o no-determinsticos ya que estos dos formalismos son equivalentes. Un
autmata determinstico es un caso particular de autmata no-determinstico y un autmata no-determinstico siempre puede
convertirse a uno determinstico equivalente.

3-18 S.Takahashi
Suponga que M = (Q,,qI, F, ) y M=(Q,,qI, F, ) son autmatas de estados finitos
determinsticos que reconocen los lenguajes descritos por y respectivamente. Entonces se deben
construir autmatas M| , M y M* tales que reconozcan los lenguajes descritos por (|), () y (*)
respectivamente. Abajo se muestran estos autmatas. Debe ser evidente para el lector que estos autmatas
reconocen los lenguajes requeridos.

o M| =(QQ, , {qI,qI},FF,) con

= {((q,), (q,)):(qQ) ( )} {((q,), (q,)):(qQ) ( )}

... ...

...
...

M M

... ... ...


...

M|

o M=(QQ, , {qI},F,)

con = {((q,), (q,)):(qQ) ( )}


{((q,), (q,)):(qQ) ( )}
{((q,), qI):qF )}



... ... ... ...
...

...
...
...
...

M M M

3-19 S.Takahashi
El NDFA: M*=(Q {qI}, , {qI},F{qI},)

con ={((q,),q):((qQ)((q,)=q))} {((q,), qI ):qF{qI})}

...
...
... ...

M
M *

3.4 Autmatas con Respuestas


En las secciones anteriores se mostraron los autmatas como una herramienta para reconocer lenguajes. Los
autmatas sirven para modelar otro estilo de problemas. Podemos generalizar la definicin de autmata para que
en cada estado o en cada transicin se produzca una respuesta. En este caso, el autmata no solo tendra una
cinta de entrada sino tambin una cinta de salida. En cada instante lee un smbolo de la cinta de entrada y
dependiendo de esto escribe algo en la de la salida y cambia de estado. No se puede devolver para revisar lo
escrito. Las aplicaciones ms naturales de este tipo de autmatas es la traduccin de un lenguaje en otro.

Hay dos tipos de autmatas de salida: unos con respuestas en los estados y otros con respuestas en las
transiciones.

Definicin 2.13. Un autmata determinstico con respuestas en los estados, M, es una sxtupla: (Q,,
',qI,,g), donde:
Q es un conjunto finito de estados,
es el alfabeto de entrada, un conjunto finito de smbolos
' es el alfabeto de salida, un conjunto finito de smbolos
qI Q es el estado final
Q Q es la funcin de transicin de estados
g Q * es la funcin de salida

Al dibujar estos autmatas se escribe el identificador del estado, seguido por el smbolo "/", seguido por la
cadena de salida.

3-20 S.Takahashi
Ejemplo 2.15 El siguiente autmata es un contador en mdulo 3 del nmero de 1's que han salido hasta
el momento.

0
0
1
A/0 B/1

1 1

C/2
0

Si un autmata con respuestas en los estados recibe la cadena vaca en todo caso contesta algo: la respuesta del
estado inicial. El autmata de arriba responde 0 si recibe la cadena vaca. Esto es correcto ya que, en la cadena
vaca el nmero de 1s es 0 i 0 mod 3 = 0.

Los autmatas con respuestas en las transiciones producen una salida cada vez que se ejecuta una transicin.

Definicin 2.14. Un autmata determinstico con respuestas en las transiciones, M, es una sxtupla:
(Q,, ', qI,,h), donde:
Q es un conjunto finito de estados,
es el alfabeto de entrada, un conjunto finito de smbolos
' es el alfabeto de salida, un conjunto finito de smbolos
Q Q es la funcin de transicin
h Q '* es la funcin de salida

Algunos autores definen la funcin de salida, h, como Q. Es decir slo se admite un smbolo como
respuesta.

Al dibujar estos autmatas en las transiciones se escribe a/w donde a es el smbolo que causa la transicin y w w
es lo que escribe.

Ejemplo 2.16 El siguiente autmata replica la entrada con un retraso de 2. Por defecto, los primeros dos
smbolos que imprime son siempre 0.

3-21 S.Takahashi
1/0

0/0 00 01
1/1

1/0
0/1
0/0

10 11 1/1

0/1

El siguiente ejemplo es, tal vez el ms complejo que tiene este captulo. Se muestra el proceso de construccin.

Ejemplo 2.17 Se quiere definir un autmata con respuestas en las transiciones para que lea un nmero
en base 10 de izquierda a derecha y escriba el resultado de dividir el nmero por 4 seguido por el caracter
R seguido por el residuo. Puede suponer que el final del nmero de entrada se marca con el smbolo #.

Primero se va a mostrar cmo se divide un nmero por 4. Digamos: 1234#.:


Divida 01 por 4 escriba 0 y lleve 1
Divida 12 por 4 escriba 3 y lleve 0
Divida 03 por 4 escriba 0 y lleve 3
Divida 34 por 4 escriba 8 y lleve 2
Finalmente escriba el residuo que es 2
Para poder implementar un proceso se necesitan cuatro estados, donde cada estado indica cunto se lleva,
y uno adicional para terminar.

Si est en el estado i, quiere decir que el residuo que se lleva es i. Veamos qu pasa en cada estado al leer
cada smbolo de entrada.

En el estado 0, el estado inicial En el Estado 1


Lee Interpreta Escribe Pasa a Lee Interpreta Escribe Pasa a
0 0 0 0 0 10 2 2
1 1 0 1 1 11 2 3
2 2 0 2 2 12 3 0
3 3 0 3 3 13 3 1
4 4 1 0 4 14 3 2
5 5 1 1 5 15 3 3
6 6 1 2 6 16 4 0
7 7 1 3 7 17 4 1
8 8 2 0 8 18 4 2
9 9 2 1 9 19 4 3
# R0 F # R1 F

3-22 S.Takahashi
En el estado 2 En el estado 3
Lee Interpreta Escribe Pasa a Lee Interpreta Escribe Pasa a
0 20 5 0 0 30 7 2
1 21 5 1 1 31 7 3
2 22 5 2 2 32 8 0
3 23 5 3 3 33 8 1
4 24 6 0 4 34 8 2
5 25 6 1 5 35 8 3
6 26 6 2 6 36 9 0
7 27 6 3 7 37 9 1
8 28 7 0 8 38 9 2
9 29 7 1 9 39 9 3
# R0 F # R1 F

En este caso, es ms fcil definir el autmata sin dibujos pero explcitamente as:

Q = {0,1,2,3,f}
= {0,1,2,3,4,5,6,7,8,9,#}
= {0,1,2,3,4,5,6,7,8,9,R}
qI = 0
(i,#) = f
(i,d) = (i*10 + d) mod 4
h(i,#) = Ri
h(i,4) = (i*10 + d) div 4

3-23 S.Takahashi
El siguiente autmata modela la suma de dos nmeros en base diez.

Ejemplo 2.18 Queremos definir un autmata con respuestas cuyo alfabeto de entrada es:

{(x,y): x {0,1,2,3}, y{0,1,2,3}}.

La cadena de entrada representa 2 nmeros en base 4. Por ejemplo si tenemos los siguientes 2 nmeros:
112113 y 333. Este nmero se representara as:
6 5 4 3 2 1
(1,0) (1,0) (2,0) (1,3) (1,3) (3,3)

La respuesta del autmata debe ser el nmero que representa la suma de los dos nmeros representados en
la entrada. La respuesta tambin debe ser dada en base 4.

En este caso la respuesta sera.


6 5 4 3 2 1
1 1 3 1 1 2

Para la solucin se requieren 2 estados uno en que se lleva 1 y otro en que no se lleva nada. Los estados
se llaman 0 y 1 respectivamente.

(0,(x,y)) = if (x + y) < 4 then 0 else 1.

(1,(x,y)) = if (x + y + 1) < 4 then 0 else 1.

h(1,(x,y)) = (x+y+1) mod 4

h(0,(x,y)) = (x+y) mod 4

Ahora hara falta marcar el final de cadena con algn smbolo digamos #. Entonces agregamos las
siguientes definiciones.

(0,#) = 0

(1,#) = 0

h(1,#) = 1

h(0,#) =

Ejercicios

3-24 S.Takahashi
1. Disee un autmata con respuestas que lea cadenas sobre el alfabeto {a,b,c} y como respuesta refleje la
entrada intercalando despus de cada smbolo un nmero en {0,1,2} que representa el nmero (mdulo 3) de
veces que ha salido el smbolo de entrada. Por ejemplo, si el autmata lee: abccaabcca, entonces respondera
a1b1c1c2a2a0b2c0c1a1.

2. Defina un autmata con respuestas en las transiciones que reciba una cadena de la foma: s 1sn con si
{0,1,2}. El autmata debe responder con una cadena de la forma: r1rn, donde:

r1 = s1 mod 3

ri = (si + si-1) mod 3 para i > 1

3. Se desea definir un autmata con respuestas en las transiciones que lea cadenas de la forma: 12...n
escriba cadenas de la forma: 12... n. Donde:

i = i /2 Si tanto i como i son pares

i = ((i + i-1 ) mod 5) De lo contrario

Suponga que el alfabeto de entrada es {0,1,2,3,4}. Suponga que o = 0

Ejemplo

I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
1 2 3 4 4 4 2 3 3 4 4 5 4 4 1 2 2 3
1 1 0 2 3 2 1 0 1 2 3 4 4 2 0 1 4 0

3.5 Implementacin
Es relativamente fcil pensar en hacer una clase autmata. Comenzamos definiendo una clase abstracta que
define la forma de procesar smbolos y cadenas. Para definir un autmata particular, se tendran que definir los
estados, y las transiciones particulares. Si el autmata tiene respuestas, se definira tambin la funcin de
respuestas. En este caso, estaramos implementando autmatas determinsticos pero no exigimos que la funcin
sea total.

Comenzamos con la definicin de estados. Como se vio en las secciones anteriores, a veces es til definir los
estados como tuplas (e.g., el ejemplo de divisin por cuatro o el de secuencias de 8 bits donde el ltimo bit
verifica la paridad de los siete anteriores). Entonces, definimos el estado como una subclase de ArrayList. Se
define un mtodo selector para obtener los componentes de la tupla y un mtodo id que se usa cuando el estado
es un valor nico no una tupla.

3-25 S.Takahashi
public class State extends ArrayList<Object> {

protected State(Object vals [])


{
super();
int i;
for (i=0; i < vals.length ; i++) {
add(vals[i]);
}
}

public Object nTh(int n) {


return this.get(n);
}

public Object id() throws Exception {


if (size() == 1)
return this.get(0);
else throw new Exception("mtodo no vlido para estados con id de tupla ");
}
}

Tenemos una fbrica para evitar que se generen copias de estados iguales.

public class StateFactory {


private static final Hashtable <Integer, State>
statePool = new Hashtable <Integer , State> ();

public static State s(Object [] a) {

int code = Arrays.hashCode(a);


State s = statePool.get(code);
if(s == null) {
s = new State(a);
statePool.put(code, s);
}
return s;
}
}

Un autmata se compone de un conjunto finito de estados, un alfabeto finito, unos estados finales (si no es de
respuestas), un estado inicial y la funcin de transicin. Para el alfabeto podemos suponer que acepta cadenas
sobre los caracteres char de java. Como no exigimos que la funcin de transicin sea total, si no hay una
transicin para un estado dado, simplemente se detendra la ejecucin en ese punto. Para el conjunto de estados
usamos una clase States. Esta clase se implementa como un arreglo de estados y nos permite referirnos a un
estado tanto como por el estado mismo, como por su posicin en el arreglo de estados.

3-26 S.Takahashi
public class States extends ArrayList <State> {

public States () {
super ();
}

public int storeState(State s)throws Error {


int pos;

pos= indexOf(s);
if (pos == -1)
{
pos = new Integer(size());
add(pos,s);
}
return pos;
}

public boolean has(State s) {


return contains(s);
}

public int index(State s) {


return indexOf(s);
}

public State getState(int index) {


return get(index);
}

Finalmente, definimos una clase abstracta autmata como se muestra a continuacin. Lo que debe definir cada
clase autmata subclase de esta es la inicializacin y la funcin de transicin delta. Vale la pena explicar en
detalle esta clase. Los atributos de la clase son:

La cinta de salida
La cinta de entrada
El estado actual
Los estados
Los estados Finales
El estado inicial

3-27 S.Takahashi
public abstract class Automata {

String inputTape;
StringBuffer outputTape = new StringBuffer();
State currentState;
States states;
ArrayList <State> finalStates ;
State inic;
int tapePos;

protected Automata(){
}

protected void initializeAutomata(States myStates,


State myStartState,
ArrayList <State> myFinalStates ) {
states = myStates;
inic=myStartState;
finalStates = myFinalStates;
}

public void setInput(String inputString) {


inputTape = inputString;
}

private void processSymbol() throws Exception {


outputTape.append(transitionOutput(currentState,inputTape.charAt(tapePos)));
currentState = delta(currentState,inputTape.charAt(tapePos));
if (!states.has(currentState)) {
throw new Exception("Estado inexistente: " + currentState);
}
outputTape.append(stateOutput(currentState));
tapePos++;
}

public boolean processString() throws Exception


{
tapePos = 0;
currentState = inic;
outputTape = new StringBuffer();
outputTape.append(stateOutput(currentState));

while (tapePos < inputTape.length()) {


processSymbol();
}
return finalStates.contains(currentState) && tapePos==inputTape.length();
}

protected abstract State delta(State s, char c) throws Exception;

protected String stateOutput(State s) {


return new String();
}

protected String transitionOutput(State s, char c){


return new String();
}

protected static State s(Object ... nn)


{
return StateFactory.s(nn);
}

public String getOutput(){


return outputTape.toString();
}
}

3-28 S.Takahashi
El constructor es vaco y ms bien se define un inicializador (initializeAutmata) para los datos del
autmata. Se usa este mtodo para definir cules son los estados, el estado inicial y los estados finales. Como el
autmata puede correrse con varias entradas, se incluye el mtodo setInput. Se provee un mtodo apra
obtener lo que se ha escrito en la cinta de salida getInput. Al definir una clase autmata subclase de esta
clase abstracta, se deben definir funciones para la transicin, para dar la respuesta en un estado y para la
respuesta en una transicin. Estos mtodos son:
protected abstract State delta(State s, char c) throws Exception;
protected String stateOutput(State s) {
protected String transitionOutput(State s, char c){
y se usan en los dos mtodos definidos en la clase abstracta processSymbol y processString. Estos
mtodos son los que realizan el proceso de la cadena. Se realiza la transicin correspondiente y se escribe en la
cinta de salida.

En la clase autmata tambin definimos un mtodo State s(Oject ... nn) para poder tener acceso a los
estados a travs de la fbrica de una forma ms amigable. Para crear el estado representado por una tupla (x,y),
se puede escribir simplemente s(x,y).

Lo interesante es ver cmo se construyen autmatas nuevos heredando de esta clase abstracta. Mostramos la
implementacin del contador mdulo 3, de las palabras que contienen cat, y del verificador de paridad.

Comenzamos con la clase contador mdulo 3 que implementa el autmata cuyo diagrama se muestra en el
Ejemplo 2.4. En este caso, definimos tres estados: s(0), s(1) y s(2). Indicamos que el estado inicial es el s(0) y
que este es el nico estado final.

Luego se define el mtodo delta que define la funcin de transicin de estados. Esta depende del valor del estado
dado por st.id(), que en este caso es un entero y del carcter ledo.

El otro ejemplo es el del verificador de paridad. Este es un poco ms complejo.

public class ContadorModulo3 extends Automata {

public ContadorModulo3()
{
super();

States myStates = new States() ;


ArrayList <State> myFinalStates = new ArrayList <State> ();
State myStartState;
int i;

for (i=0; i<3; i++)


myStates.storeState(s(i));
myFinalStates.add(s(0));
myStartState = s(0);
initializeAutomata(myStates,myStartState,myFinalStates);
}

3-29 S.Takahashi
protected State delta(State st, char c) throws Exception{

State resp;
int stVal = (Integer) st.id();

if (c == 'a') {
resp = s((stVal+1)%3);
}
else if (c == 'b'){
resp = st;
}
else
throw new Exception("Error: caracter no permitido - "+c);

return resp;
}
}

Note que sera fcil hacer un contador mdulo n. Esto se hara as:
public class ContadorModuloN extends Automata{
private int n;

public ContadorModuloN(int n)
{
super();
this.n = n;
States myStates = new States() ;

ArrayList <State> myFinalStates = new ArrayList <State> ();

State myStartState;

int i;
for (i=0; i<n; i++){
myStates.storeState(s(i));
}
myFinalStates.add(s(0));
myStartState = s(0);
initializeAutomata(myStates,myStartState,myFinalStates);
}

protected State delta(State st, char c) throws Exception{

State resp;
int stVal = (Integer) st.id();

if (c == 'a') {
resp = s((stVal+1)%n);
}
else if (c == 'b'){
resp = st;
}
else
throw new Exception("Error: caracter no permitido - "+c);

return resp;
}
}

3-30 S.Takahashi
De esta forma, para definir un contador mdulo 3 lo haramos as:

ContadorModuloN cont3 = new ContadorModuloN(3);

Hemos visto cmo se definen los autmatas pero no cmo se usan. Para esto, se usan los mtodos para darle la
cadena y para procesarla.

3.6 Limitaciones de los Autmatas Regulares


Los autmatas regulares no sirven para reconocer todos los lenguajes recursivamente enumerables. De hecho
hay muchos lenguajes que no pueden ser reconocidos por ningn autmata regular. En esta seccin se mostrar
cmo se puede demostrar que un lenguaje no es regular usando algunos resultados conocidos.

El siguiente teorema sirve para demostrar por construccin que un lenguaje es regular. Como se ver en uno de
los ejemplos, tambin servir para demostrar, por contradiccin que un lenguaje no es regular.

Teorema 2.3. Teorema: Si L y M son lenguajes regulares entonces los siguientes lenguajes
tambin son regulares:

L M
L M
L M
L*
~L
L - M
La demostracin de este teorema es por construccin. Es decir, dado que se tiene un autmata que reconoce L y
otro que reconoce M se construye uno que reconozca el lenguaje requerido. Por el teorema que se demostr en la
Seccin 2.2, se deduce que los lenguajes son cerrados bajo la complementacin. Podemos probar que son
cerrados bajo la unin, la concatenacin y la clausura basndonos en la construccin de los autmatas que
reconocen los lenguajes descritos por expresiones regulares. Para demostrar que los lenguajes regulares son
cerrados bajo la interseccin es necesario construir un autmata un poco ms complejo y esta demostracin se
sale del objetivo de este texto.
Para demostrar que un lenguaje es regular se puede usar cualquiera de las siguientes tcnicas:

Construir un autmata que lo reconoce. En este caso hay que demostrar que reconoce todas las cadenas en el
lenguaje y no reconoce ninguna cadena que no est en el lenguaje.

Construir una gramtica regular que lo genera.

3-31 S.Takahashi
Construir una expresin regular que lo describe.

Mostrar que es finito, ya que todo lenguaje finito es regular.


Se quiere encontrar una forma de determinar si un lenguaje es regular. Intuitivamente, un lenguaje que requiera
un nmero potencialmente infinito de estados para ser reconocido, no es regular. El ejemplo clsico de un
lenguaje que no es regular es {anbn: n >= 0} (i.e., las cadenas formadas por una secuencia de as de longitud n,
seguida de una secuencia de bs de longitud n). El problema radica en que cuando un autmata comienza al leer
las bs debe recordar cuntas as han salido.

Los siguientes teoremas son expuestos en [3] y se usan para demostrar que un lenguaje no es regular. El segundo
teorema es ms fuerte que el primero.

Teorema 2.4. Sea L un lenguaje regular infinito sobre un alfabeto . Entonces existen cadenas
*, *, * tales que y nL para todo n0.
Dem:
Sea L un lenguaje regular e infinito entonces, existe un autmata determinstico M = (Q,,qI, F, ) tal
que L(M) = L. Como L es infinito, existe L con || = k tal que k > #.Q.
Sea = 12...k, existen estados q0,q1, ..., qk nicos con q0= qI y qkF tales que:
qt-1 t
qt para 1 t k. (i.e., q0 1
q1 2
q2 ... qk-1 k
qk )
Como k > #.Q entonces, por el principio del palomar, debe existir al menos un estado por el que pasa
ms de una vez. Dicho formalmente:
existen estados qi y qj con 0 ijk tales que qi= qj, (1)
Note que: q0 1...i qi i+1...j qj j+1...k qk (2)

Como i=j: q0 1...i qi i+1...j qi j+1...k qk (3)

Sean: = 1...i, = i+1...j, = j+1...k como i < j, entonces , se puede, entonces, rescribir la

ecuacin (3) as: q0 qi qi qk (4)
Entonces, para llegar de q0 a q1, puede leer cero o ms veces. Es decir:

q0 qi qk; q0 qi qi qk; q0 qi qi qi qk;
n
En general: q0 qi qi qk (5)
Como q0= qI y qkF entonces L. n

Este teorema no sirve para demostrar que un lenguaje es regular; sirve para demostrar que no es regular. Se
demuestra por contradiccin: si no existen cadenas con las propiedades enunciadas, entonces el lenguaje no es

3-32 S.Takahashi
regular. En general la demostracin se hace as: se supone que el lenguaje es regular y se definen las cadenas ,
y de forma general y se muestra que existe un n tal que nL, llegando as a una contradiccin.

Ejemplo 2.19 L={ap: p es primo} no es regular.

Dem: Suponga que L es regular. Entonces por el Teorema 2.4, deben existir cadenas a*, a* y a*
con tales que nL para cualquier n.

Sean: =ap, =aq, =ar. Como entonces se sabe que q1. Se debe cumplir que para todo n, p+nq+r
es un nmero primo.

Sea n=(p+2q+r+2) entonces p+nq+r debe ser primo:


p+nq+r es primo
= n=p+2q+r+2
p+( p+2q+r+2)q+r es primo
= aritmtica
p+pq+2q2+rq+2q+r es primo
= aritmtica
(q+1)(p+2q+r) es primo
= q1 q+1 2 y (p+21+r) 2
false
Por lo tanto, la suposicin inicial (L es regular) es falsa.

El siguiente teorema establece un resultado ms fuerte:

Teorema 2.5. Sea L un lenguaje regular y M = (Q, , qI, ) un autmata determinstico tal
que L(M)=L, entonces para cualquier cadena L tal que || |Q| existen cadenas *,
*, * tales que: =, || #.Q, y nL para todo n0.

Dem:

Sean L un lenguaje regular, M = (Q,,qI, F, ) tal que L(M) = L, y L con |||Q|.

Sean k=|Q| , m= ||, = 12...k...m.

t
Entonces, existen estados q0,q1, ..., qk ..., qm con q0= qI y qmF tales que: qt-1 qt para 1
k+1...m
t k y qk qm.

1 2 k k+1...m
(i.e., q0 q1 q2 ... qk-1 qk qm )

3-33 S.Takahashi
Como k = #.Q entonces, por el principio del palomar, debe pasar ms de una vez por un
estado cuando reconoce los primeros k smbolos de la cadena. Dicho formalmente: existen
estados qi y qj con 0 ijk tales que qi= qj, (1)

1...i i+1...j j+1...k k+1...m


q0 qi qj qk qm

1...i i+1...j j+1...k k+1...m


q0 qi qi qk qm (2)

Sean:

= 1...i,

= i+1...j,

= j+1...k...m, con ya que i < j , y con || #.Q, ya que jk. (3)


De (2) y (3) se deduce que: q0 qi y qi qi y qi qm (4)

Hay que demostrar que para todo n, n L

Dado que q0= qI y qk F es lo mismo que demostrar:

n
q0 qi qi qj qj qk.

Dado (4), slo hay que demostrar:

n
qi qj.

Esta demostracin se termina de la misma forma que la demostracin del teorema anterior.
La diferencia de la demostracin radic en la forma como se escogieron las subcadenas para
asegurar que cumplieran con las condiciones requeridas (ver (3)).

Este teorema se usa as: Se supone que el lenguaje es regular y se escoge una cadena en el lenguaje de longitud
suficiente para la cual al escoger cadenas que cumplan con las condiciones descritas, exista un n tal que nL.

Ejemplo 2.20 L={anbn: n 0} no es regular.

Suponga que L es regular y que M es un autmata con k estados que lo reconoce. Sea =akbk. Es claro
que L. Entonces por el teorema 2.5 deben existir cadenas: , y , tales que = y ||k y tales

3-34 S.Takahashi
que para todo n, nL. Como =akbk y ||k entonces y estn compuestas slo de as. Por lo
tanto, podemos decir que:

=at
=as
=ak-(s+t)bk
Donde 1 s+t k y s 1.

Es claro que: =

Decir que para todo n, nL equivale a decir que para todo n: t+ns+k-(s+t)=k. Sin embargo, tomando
n=0 tenemos que:

t+ns+k-(s+t)=k
n=0
t+k-(s+t)=k
aritmtica
-s = 0
s >= 1
false
Por lo tanto L no es regular.

Ejemplo 2.21 L={: {a,b}* =R} no es regular.

Suponga que L es regular y que M es un autmata con k estados que lo reconoce. Sea =akbak. Es claro
que L. Entonces por el teorema 2.5 deben existir cadenas: , y , tales que = y ||k y que
para todo n, nL. Como =akbk y ||k entonces y estn compuestas slo de as. Por lo tanto,
podemos decir que:

=at
=as
=ak-(s+t)bak
Donde 1 s+t k y s 1.

Es claro que: =

Como no se hicieron suposiciones adicionales con respecto a las cadenas, decir que para todo n, nL
equivale a decir que para todo n: t+ns+k-(s+t)=k. Sin embargo, tomando n=0 tenemos que:

3-35 S.Takahashi
t+ns+k-(s+t)=k
= n=0
t+k-(s+t)=k
= aritmtica
-s = 0
= s >= 1
false
Por lo tanto L no es regular.

El teorema 2.3 puede usarse para demostrar que un lenguaje no es regular. El siguiente ejemplo ilustra este uso.

Ejemplo 2.22 L={anbm: n0 m 0 | nm} no es regular3.

Suponga que L es regular, entonces por el teorema 2.3 a*b*-L debe ser regular:

a*b*-L
= def de L y de a*b*
{anbm : n0 m 0 }-{anbm : n0 m 0 | nm}
= operaciones sobre conjuntos
{anbm : n0 m 0 | n=m}
= Leibniz
{anbn : n0 }
Pero se sabe que este lenguaje no es regular. Por lo tanto se llega a una contradiccin, invalidando la
suposicin inicial: L es regular.

Por lo tanto, L NO es regular

Es interesante notar que, en cambio, L={anbm: n 0 m 0} s es regular. Note que no se est diciendo nada
acerca de la relacin entre n y m. De hecho L=a*b*.

Ejercicios

1. Dados los siguientes lenguajes, si son regulares o no y demustrelo.

a. L = {anbm: n 0 m 0| m < n}

b. L = {anbm: n 0 m 0| m n}

3
En notacin de [2] esto sera: {n.m:nat | nm: anbm}

3-36 S.Takahashi
c. L = {anbm: n 0 m 0| m > n}

d. L = {anam: n 0 m 0| m = n}

e. L = {anbm: n 0 m 0| m n}

f. L = {anbm: n 0 m 0| 5 m n}

g. L = {anbm: n 0 m 0| 5 m n}

h. L = {anbm: n 0 10 m 0| m n}

i. L = {anbm: n 0 10 m 0| m n, m 5}

2. Demuestre que si un lenguaje, L, es regular entonces el reverso del lenguaje, LR, tambin lo es. Se define LR
como {: RL}.

3. Definimos el lenguaje de los prefijos de L como: Lpre = {: existe un tal que L}. Demuestre que si L
es regular entonces Lpre es regular.

4. Definimos el lenguaje de los sufijos de L como: Lsuf = {: existe un tal que L}. Demuestre que si L
es regular entonces Lsuf es regular.

5. Demuestre que todo lenguaje finito es regular.

6. Demuestre que si L es infinito y es reconocido por un autmata determinstico de estados finitos con k
estados, entonces existe una cadena L tal que || > k.

3-37 S.Takahashi
Captulo 4
Autmatas de Pila y Gramticas Independientes del Contexto

4.1 Introduccin

En el Captulo 2 se vieron los autmatas de estados finitos y su relacin con las expresiones regulares. En este
captulo se vern los autmatas de pila y su relacin con las gramticas independientes del contexto. Los
autmatas de pila tienen memoria representada en forma de una pila lo que les permite reconocer una clase de
lenguajes ms grande: los lenguajes independientes del contexto.

Un autmata de pila es una mquina con un nmero finito de estados, una cinta de entrada y una pila. El
autmata lee cadenas de smbolos de longitud finita de la cinta de entrada que es infinita1. El comportamiento de
la mquina est determinado por el estado en que se encuentra, el smbolo o smbolos en el tope de la pila y el o
los smbolos en la cinta de entrada. Para cada estado y dependiendo del tope de la pila, al leer uno o varios
smbolos de la cinta de entrada cambia de estado, empila o desempila de la pila y avanza en la cinta de entrada.
En la mquina de la figura de abajo, en el tiempo k est leyendo sk y est en el estado i y la pila tiene la el
smbolo n en el tope. La cabeza lector nicamente puede avanzar.

1 2 3 4 ....... i....... n

n-1

...
s1 s2 ... sk sk+1
1

Estas mquinas tambin pueden usarse para reconocer lenguajes. Es decir, para leer cadenas (secuencias de
smbolos) y determinar si pertenecen o no a un lenguaje dado. Tambin sirven para describir el comportamiento
de ciertas mquinas.

1
Es decir, las cadenas son de longitud finita, digamos n, y n puede ser tan grande como se quiera.

3-1
4.2 Autmatas de pila como reconocedores de lenguajes

La definicin formal de un autmata de pila est dada en la Definicin 3.1.

Definicin 3.1. Un autmata de pila es una sxtupla M=(Q,,,qI, F, ) donde:


Q es un conjunto finito de estados
es un alfabeto de entrada finito
es un alfabeto de pila finito
qI Q es el estado inicial
F Q es el conjunto de estados finales
(Q * *) (Q *) es la relacin de transicin de estados

Cmo se usa un autmata de pilas para reconocer cadenas? El autmata comienza en el estado inicial con una
secuencia de smbolos por leer. Inicialmente la pila est vaca. En cada instante lee smbolos de la cinta de
entrada. Dependiendo de lo que lee, del tope de la pila y del estado en el que se encuentra, cambia de estado
avanza en al cinta de entrada, desempila lo que reconoci en la pila y empila smbolos en la pila de acuerdo con
la relacin de transicin de estados. Si puede aplicar sucesivamente estas transformaciones y llegar a un punto
en el cual ha leido toda la cadena, est en un estado final y la pila est vaca, entonces se dice que el autmata
acepta la cadena.

Las transiciones se interpretan as: si ((q, , ),(p, )) esto se lee as: "si est en el estado q, leyendo una
cadena con prefijo y con en el tope de la pila, avance sobre , desempile , empile y pase al estado p".

Al decir que est en el tope quiere decir que si: = 12...n entonces la pila sera:

n-1

...
1

Cuando es la cadena vaca, , se est diciendo que no importa qu est en la pila. NO QUIERE DECIR
QUE LA PILA ESTA VACIA. De hecho, la notacin de transiciones no permite determinar cuando la pila est
vaca. Para esto sera necesario usar un smbolo en el alfabeto de la pila que se use para marcar la base de la pila.

3-2
Si = 12...n al decir que se empila sobre una pila: , la pila quedara:

n-1

...
1

De manera anloga, si = entonces se est indicando que no se debe empilar nada, NO QUIERE DECIR QUE
EMPILE .

Si se mira la pila como una cadena, al decir que est en el tope de la pila, estamos diciendo que la pila es de la
forma: para algn . Anlogamente, al empilar sobre una pila , la pila quedara .

La transicin descrita arriba, es la transicin general. Hay transiciones ms especficas descritas a continuacin:

((q, ,),(p, )) si est en el estado q y la cadena que est leyendo tiene como prefijo entonces (sin
importar lo que est en el tope de la pila), lea , empile y pase al estado p.

((q, , ),(p, )) si est en el estado q y la cadena que est leyendo tiene como prefijo y en el tope de la
pila est , entonces lea , desempile y pase al estado p (sin empilar nada).

((q, ,),(p, )) si est en el estado q y la cadena que est leyendo tiene como prefijo sin importar la pila,
lea , pase a p y no empile nada.

((q, , ),(p, )) si est en el estado q, lee y est en el tope de la pila, pase a p empilando sobre .

((q, ,,),(p, )) si est en el estado q, lee y est en el tope de la pila, pase a p dejando en el tope de
la pila.

Note que en las ltimas dos transiciones debemos volver a empilar ya que al reconocerlo, se desempila. Si en
cualquiera de las transiciones mencionadas arriba, es , esto indica que se toma la accin correspondiente sin
avanzar sobre la cinta de entrada.

El estado general de un autmata de pilas est dado por: el estado en que se encuentra, lo que le falta por leer y
la pila. Formalmente, esto se define como configuracin:

Definicin 3.2. La configuracin de un autmata de pilas es una tripleta, (q, , ), con qQ, ,*, * y
donde: q es el estado en el que se encuentra, es la pila y es lo que le falta por leer.

3-3
Interesa definir como pasar de una configuracin a otra.

Definicin 3.3. Dadas dos configuraciones: (q, ,) y (q, , ) si:


=
=, = y
((q, ,, ), (q, )) .
Se dice que (q,,) es alcanzable en un paso a partir de (q, , ) y escribimos:
(q, , ) (q, , ).
Es decir: Para todo * , *, ((q, , , ), (q, )) (q, , ) (q, , )

La clausura transitiva de esta relacin da el concepto de ser alcanzable desde entre configuraciones.

Definicin 3.4. Dadas dos configuraciones C y K decimos que K es alcanzable desde C y escribimos C * K
si ocurre alguna de las siguientes condiciones:
C=K
CK
Existe una configuracin C tal que C C y C*K

Con la definicin de alcanzable, se define cuando un autmata acepta una cadena. Informalmente, una cadena es
aceptada por un autmata de pilas si comienza con la cadena por leer en el estado inicial con la pila vaca y
puede llegar a una configuracin con un estado final, sin nada por leer y con la pila vaca.

Definicin 3.5. Dado M=(Q,,,qI,F,) y *, se dice que M acepta a , si existe un estado final f (f F)
tal que (qI, , ) * (f, ,).

Note que no es suficiente terminar en un estado final; hay que terminar en un estado final habiendo ledo todo y
con la pila vaca. Anlogamente a que con los autmatas finitos, podemos definir el lenguaje reconocido por un
autmata de pilas, como el conjunto de todas las cadenas que son aceptadas por dicho autmata.

Con el concepto de aceptar una cadena, se define el lenguaje aceptado por un autmata.

Definicin 3.6. Dado M=(Q,,,qI,F,) y definimos el lenguaje aceptado por M, denotado como L(M) as:
L(M)={: * | f F tal que (qI, , )* (f, ,)}

Los autmatas de pilas tienen ms poder computacional que los autmatas de estados finitos. Estos pueden
reconocer lenguajes que no pueden ser reconocidos por los autmatas finitos. Por ejemplo pueden reconocer el
lenguaje : {anbn: n 0}.

Hay autmatas determinsticos y no-determinsticos.

3-4
Definicin 3.7. Un autmata de pila determinstico es un autmata de pila para toda configuracin (q, , )
existe a lo ms una configuracin (q, , ) tal que (q, , )(q, , ).

A diferencia de lo que ocurre con los autmatas regulares, los autmatas de pila no determinsticos no tienen el
mismo poder computacional que los determinsticos. Los ejemplos mostrados en este captulo usan tanto
autmatas determinsticos como no determinsticos.

Ejemplo 3.1 El autmata determinstico M=({1,2},{a,b}, {a},1, {1,2}, {((1, ,a),(1,a)), ((1,a,b),(2, )),
((2,a,b),(2, ))}) reconoce {anbn: n 0}.

A continuacin se muestra la ejecucin de la mquina para algunas cadenas de {a,b}*.

Aaabbb
Estado Pila Cadena Accin
1 aaabbb aplicar ((1,a,),(1,a))
1 a aabbb aplicar ((1,a,),(1,a))
1 aa abbb aplicar ((1,a,),(1,a))
1 aaa bbb aplicar ((1,b,a),(2, ))
2 aa bb aplicar ((2,b,a),(2, ))
2 a b aplicar ((2,b,a),(2, ))
2 acepta: 2 es final
Ab
Estado Pila Cadena Accin
1 ab aplicar((1,a,),(1,a))
1 a b aplicar((1,b,),(1,))
2 Acepta: 2 es final

Estado Pila Cadena Accin
1 Acepta: 1 es final
Bbb
Estado Pila Cadena Accin
1 bbb Falla: no hay regla que
aplicar y queda por leer bbb
Aaabbbb
Estado Pila Cadena Accin
1 aaabbb aplicar((1,a,),(1,a))
1 a aabbb aplicar((1,a,),(1,a))
1 aa abbb aplicar((1,a,),(1,a))
1 aaa bbb aplicar((1,b,a),(2, ))
2 aa bb aplicar((2,b,a),(2, ))
2 a b aplicar((2,b,a),(2, ))
2 b falla: no hay regla que
aplicar y falta por leer b

3-5
Aaabb
Estado Pila Cadena Accin
1 aaabbb aplicar((1,a,),(1,a))
1 a aabbb aplicar((1,a,),(1,a))
1 aa abbb aplicar((1,a,),(1,a))
1 aaa bbb aplicar((1,b,a),(2, ))
2 aa bb aplicar((2,b,a),(2, ))
2 a Falla: pues ley todo, pero
la pila no est vaca.

La notacin mostrada para describir autmatas puede resultar un poco engorrosa. Explicamos una notacin
diagramtica para describir estos autmatas,

Los estados, el estado inicial y los estados finales se representan igual que en los autmatas de estados finitos.
Lo que vara son las transiciones. Estas se denotan como se muestra abajo.

((q, ,),(p, )) , (Si reconoce en el tope, desempile y empile )


changeTop(
q ) p

((q, ,),(p, )) (Si reconoce en el tope, desempile )


pop (
q ) p

((q, ,),(p, )) , (Si reconoce en el tope empile sobre )


pushOn(
q ) p

((q, , ),(p, )) (empile sin importar que hay en la pila)


push(
q ) p

((q, , ),(p, )) (Si reconoce en el tope djelo en el tope)


skip(
q ) p

((q, ,),(p, )) (Ignore la pila)


ignore
q ) p

3-6
Estas transiciones las abreviaremos como se muestra abajo, cuando se quiera hacer referencia a ellas en el texto
y no en un dibujo de un autmata.

q ,changeTop (,) p

q pop() p

q ,pushOn(,) p

q ,push () p

q ,skip () p

q ,ignore p

EJERCICIOS

1. Verifique que todas las transiciones ms comunes descritas arriba pueden ser descritas por medio de las
instrucciones changeTop, pop, pushOn, push, skip, e ignore,

2. Verifique que las instrucciones ignore y pushOn son innecesarias podran simularse con otras
instrucciones. Ayuda: Debe reemplazar cada instruccin por || instrucciones.

3. Se puede Podramos hacer modelar todo con una sola instruccin eliminando las restricciones: , ?
Justifique su respuesta.

Ejemplo 3.1a El ejemplo mostrado arriba: {anbn: n 0} y M = ({1,2},{a,b},{a},1,{1,2},{((1,a,),(1,a)),


((1,b,a),(2, )), ((2,b,a),(2, )) }) se dibujara as:

a,push(a) b,pop(a)

b,pop(a)

A continuacin se muestran ms ejemplos:

Ejemplo 3.2 Para el lenguaje {a3nbn: n 0} el autmata determinstico M =


({1,2},{a,b},{a},1,{1,2},{((1,a,),(1,a)), ((1,b,aaa),(2, )), ((2,b,aaa),(2, )) }) reconoce el lenguaje y se
dibujara as:

a,push(a) b,pop(aaa)

b,pop(aaa)

3-7
Ejemplo 3.3 El siguiente autmata determinstico reconoce las cadenas sobre { {,},[,],(,) } en los que
los parntesis estn balanceados.

[,push([ )
(,push(( )
{,push({ )

1 ),pop(( )

},pop({ ) ],pop([ )

Ejemplo 3.4 El siguiente autmata no-determinstico reconoce las cadenas sobre {a, b} que son
palndromos.

a,push(a) b,pop(b)
a,pop(a) a,pop(a)
b,push(b)
b,pop(b)

b,ignore
a,ignore

Ejemplo 3.5 El siguiente autmata no-determinstico reconoce las cadenas sobre {a, b} que son
palndromos de longitud par.

b,pop(b)
a,push(a)
a,pop(a) a,pop(a)
b,push(b)
b,pop(b)

Ejemplo 3.6 El siguiente autmata determinstico reconoce el lenguaje {cR: {a,b}*}

a,push(a) b,pop(b)
b,push(b) a,pop(a)
c,ignore

EJERCICIOS
1. Muestre el seguimiento de los autmatas de arriba para una cadena del lenguaje de longitud 4 y una cadena
que no est en el lenguaje de longitud 5.
2. Describa autmatas de pilas (determinsticos o no-determinsticos) para reconocer los siguientes lenguajes:
a. { anbn: n > 0}
b. { anbm: n m 0}

3-8
c. { anbm: n m > 0}
d. { anbm: n > m 0}
e. { anbm: n > m > 0}
f. { anbm: m n 0}
g. { anbm: m n > 0}
h. { anbm: m > n 0}
i. { anbm: m > n > 0}
j. { an=bn: n 0} { an>bm: n m 0} { anbm: m n 0}
3. Enriquezca la definicin de autmata de pilas para que de respuestas:
a. en los estados
b. en las transiciones
4. Describa un autmata de pila que reconozca el lenguaje de las palabras palndromes sobre el alfabeto: {a, A,
b, B} donde no se toma en cuenta las diferencias por mayscula y minscula. Ejemplos de palabras en este
lenguaje seran: aaAAbbBbaaaa aaAA abbBbA
5. Describa un autmata de pilas que reconozca el siguiente lenguaje:
L = {a} { () : L } { + : L }
6. Describa un autmata de pilas que reconozca el siguiente lenguaje:
L = {a} { f(1, ..., n) : n > 0, 0 i n, i L } .
Ejemplos de palabras en este lenguaje a f(a) f(a,a,a) f(f(a,a),f(a),a)
7. Modifique el autmata que reconoce parntesis balanceados para que dentro de los parntesis siempre deba
haber o secuencia de a's separadas por comas o secuencias de expresiones de parntesis y a's separadas por
comas.
Ejemplos de palabras en este lenguaje: a (a,a,a) ([a,{(a,a),a}],a)

3-9
4.3 Combinado autmatas

En el Captulo 2 al mostrar la equivalencia entre expresiones regulares y autmatas mostramos como podemos
combinar autmatas para obtener la concatenacin, la unin y la clausura de los lenguajes reconocidos por los
autmatas. Los autmatas de pila tambin se pueden combinar.

Suponga que M = (Q,,, qI, F, ) y M=(Q,,,qI, F, ) son autmatas de de pila que reconocen
los lenguajes L y L respectivamente. Entonces se desea construir autmatas M| , M y M* tales que
reconozcan los lenguajes descritos por (L|L), (LL) y (L*) respectivamente. Como son autmatas distintos,
para todas las construcciones suponemos que Q Q = .

Abajo se muestran la definicin formal de estos autmatas y se ilustra la combinaci. Debe ser evidente para el
lector que estos autmatas reconocen los lenguajes requeridos (i.e., L(M|)=(L|L), L(M)=(LL) y
L(M*=(L)*).

Sea qI tal que qI (QQ) entonces M| =(QQ{qI}, , ,qI ,FF,) con

= {(( qI,, ), (qI,)),(( qI,, ), (qI,))}

... ...
...
...

M M

...
...

qI


...
...
M |

3-10
Sean qI tal que qI (QQ) y $ talque $ entonces M=(QQ{qI}, , {$},qI,F,)

con = {(( qI,, ), (qI,$))} {((q,,$), (qI,)) | qF )}

... ...

...
...
M M

pop($)

pop($)
,push($)
... ...
... ... ...
pop($)

Sean qI tal que qI Q y $ talque $ entonces M* =(Q{qI}, , {$},qI,{qI},)

con = {(( qI,, ), (qI,$))} {((q,,$), (qI,)) | qF )}

pop($)

,push($) pop($)
...
... ... ...
pop($)
...

M M

3-11
4.4 Autmatas y Gramticas

Los autmatas pila reconocen la misma clase de lenguajes generados por las gramticas independientes del
contexto. En esta seccin veremos como construir un autmata de pilas que reconozca el lenguaje generado por
una gramtica dada. Tambin veremos como construir una gramtica que genere el lenguaje reconocido por un
autmata dado.

Se recomienda repasar las definiciones de gramticas dadas en el Captulo 1 antes de continuar leyendo esta
seccin.

4.4.1 De Autmatas a Gramticas

Primero se da la definicin de un autmata de pilas simplificado. En este tipo de autmata de pilas simplificado
es aquel en que las instrucciones pueden ser solamente de una de las siguientes formas:

p a,push(c) r

p a,pop(c) r

Con a { } y c

Formalmente esto se define as:

Definicin 3.8. Un autmata de pila simplificado es una sxtupla M=(Q,,,qI,qf,) donde :


Q es un conjunto finito de estados
es un alfabeto de entrada finito
es un alfabeto de pila
qI Q es el estado inicial
qf Q es el estado final
(Q ({ }) ({ })) (Q ( { })) es la relacin de transicin de estados, y se cumple que:
((q,a, b), (p, c)) ( b = c )

Note que los autmatas simplificados no necesariamente son determinsticos. La clase de los lenguajes
reconocidos por los autmatas de pila simplificados es exactamente igual a la clase de lenguajes reconocidos por
los autmatas de pila. Para demostrar esto habra que demostrar que dado un autmata de pilas es posible
construir un autmata de pilas simplificado y viceversa. Es fcil ver que todo autmata simplificado es un
autmata de pilas. La reciproca se deja como ejercicio.

Dado un autmata de pilas simplificado (no necesariamente determinstico): M=(Q,,,s,f,) se puede construir
una gramtica G=(N,T,S,P) tal que L(M)=L(G) de la siguiente forma:

3-12
1. Hay un nterminal por cada elemento en QQ para facilidad de expresin se definen as: N = {Apq | pQ, q
Q}
2. Los terminales son el alfabeto de entrada: T=
3. El smbolo distinguido, S es: Asf
4. La lista de producciones se construye as:
a. Por cada q Q agregue la produccin: Aqq :
b. Por cada pQ, q Q, r Q agregue la produccin: ApqApr Arq
c. Si se tiene que p a,push(c) r y adems que tb,pop(c) q agregue la produccin: ApqaArtb
Es decir:
P = {ApqaArtb : a,b { }, ((p,a,),(r,c)) , ((t,b,c),(q,)) }
{ApqApr Arq: pQ, q Q, r Q}
{Aqq : q Q}
Es posible demostrar que para cualquier autmata M, al generar la gramtica con estas reglas, L(G) = L(M).
Esto, sin embargo, queda fuera del propsito de estas notas.

Ejemplo 3.7 Recuerde el autmata de arriba que reconoce{ anbn: n 0}

a,push(a) b,pop(a)

b,pop(a)
1 2

An cuando no las reglas s son de la forma correcta, se tienen 2 estados finales. Se arregla el autmata
as:

a,push(a) b,pop(a)

b,pop(a)
1 2
,ignore

El problema es que toda transicin debe empilar o desempilar. Entonces se hace lo siguiente: Se agrega un
smbolo al alfabeto de la pila, que es empilado al pasar del estado 1 al 2. Este debe ser desempilado.

,pop($)
a,push(a) b,pop(a)

b,pop(a)
1 2
,push($)

3-13
Dadas las reglas, se pueden construir fcilmente los conjuntos de terminales, de los no-terminales y se
puede determinar cul es el smbolo distinguido.

N = {A11, A12, A21, A22}


T = {a,b}
S= A12
Ahora se empiezan a aplicar las reglas para obtener las producciones. De la regla (a) se obtienen las
siguientes reglas:

A11
A22
Aplicando la regla (b), se agregan las siguientes producciones:

p q r Produccion
agregada
ApqApr Arq
1 1 1 A11A11 A11
1 1 2 A11A12 A21
1 2 1 A12A11 A12
1 2 2 A12A12 A22
2 1 1 A21A21 A11
2 1 2 A21A22 A21
2 2 1 A22A21 A12
2 2 2 A22A22 A22

Ahora la regla 3:

1 a,push(a) 1 y adems que 1b,pop(a) 2,entonces se agrega A12 aA11b

1 a,push(a) 1 y adems que 2b,pop(a) 2,entonces se agrega: A12 aA12b

1 ,push($) 2 y adems que 2,pop($) 2,entonces se agrega: A12 A22

Finalmente, la producciones seran las siguientes:

3-14
A11 A12 aA11b
A11A11 A11 A12 aA12b
A11A12 A21 A21A21 A11
A12A11 A12 A21A22 A21
A12A12 A22 A22A21 A12
A12 A22 A22A22 A22
A22

Por inspeccin podemos simplificar esta gramtica.

Se ve que el smbolo A21 es intil, ya que todas las reglas que lo tienen en la parte izquierda lo tienen
tambin en la parte derecha. Esto hace que una vez se genera este smbolo, nunca puede eliminarse. Por lo
tanto, se eliminan todas la reglas que tienen este smbolo dejando la gramtica as:
A11 A12 aA11b
A11A11 A11 A12 aA12b
A12A11 A12 A22A22 A22
A12A12 A22 A22
A12 A22

Ahora nos damos cuenta que los smbolos A22 y A11 slo puede generar . Podemos entonces cambiar
estos smbolos por cuando aparecen en la parte derecha de una regla y eliminar las reglas que los tienen
en la parte izquierda dejando la gramtica as:
A12A12 A12 ab
A12A12 A12 aA12b
A12 A22
A22

Las primeras dos reglas son intiles y la cuarta y la quinta nunca se usarn debido a que A22 nunca
aparece en la parte derecha de una regla. Entonces, la gramtica queda:

A12

A12 ab

A12 aA12b
3-15
Ahora se mostrara que si una palabra est en el lenguaje, entonces es generada por la gramtica. Faltara
demostrar que si no est en el lenguaje reconocido por el autmata entonces no es generada por la
gramtica. Esta demostracin se omite.

La demostracin se hace inductivamente. Primero se muestra que se puede generar y que se puede
generar ab; luego se muestra que si se puede generar akbk entonces e puede generar ak+1bk+1.

3-16
Recuerde que demostrar que la gramtica genera una cadena, , es demostrar que S * . Como el
smbolo distinguido de esta gramtica es A12, en este caso se debe demostrar que A12*2.

1. A12*
A12
aplicamos A12

2. A12 * ab
A12
aplicamos A12 ab
ab
3. Si A12 * akbk entonces A12 *ak+1bk+1.

Hiptesis de induccin: A12 * akbk


A12
aplicamos A12 aA12b
a A12b
* hiptesis de induccin
aakbkb
= notacin de cadenas
ak+1bk+1

4.4.2 De Gramticas a Autmatas

En esta seccin se muestra como construir autmatas no determinsticos que reconocen el lenguaje generado por
una gramtica dada. Se construyen dos tipos de autmatas uno para hacer anlisis descendente y otro para hacer
anlisis ascendente. En el anlisis descendente comenzamos con el smbolo distinguido para generar las cadenas
del lenguaje, en el anlisis ascendente se parte de la cadena para llegar al smbolo distinguido. Vindolo en
trminos del rbol de sintaxis en el anlisis descendente comenzamos por la raz y llegamos a las hojas. En el
ascendente, comenzamos por las hojas para llegar a la raz.

El proceso de construccin de los autmatas se har a travs de un ejemplo.

La siguiente gramtica reconoce el lenguaje { anbn: n 0}: ({A},{a, b},A,{ A ,A aAb}). El conjunto de
terminales es {A}, el de no-terminales en {a, b}, el smbolo distinguido es A y las producciones son las dos
producciones de arriba.

2
Note que en este caso el smbolo no se est usando como implicacin lgica; se usa como el concepto de ser deivable
en un paso, visto en el Captulo 1.

3-17
Autmata descendente:

El autmata descendente correspondiente a esta gramtica se construye as:

El autmata tiene tres estados: s, q y f, donde s es el estado inicial y f es el nico estado final. En el estado
q, se realizaran todas las acciones necesarias para reconocer el lenguaje.

El alfabeto de entrada es el conjunto de smbolos terminales.

El alfabeto de pila es la unin de los terminales y los no terminales agregando un smbolo nuevo $3. Este
smbolo se usar para marcar la base de la pila.

Ahora las transiciones: la idea es que este autmata comience con el smbolo distinguido en la pila y aplique
reglas de produccin para reconocer las cadenas del leguaje. Por o tanto:

para comenzar ponemos el smbolo distinguido en la pila. Agregamos una transicin del estado
inicial a q, y se empila $ y el smbolo distinguido:

s ,push($A) q

Como el autmata acepta con la pila vaca, lo ltimo que se debe hacer es desempilar la marca de
base de pila. Agregamos, entonces, una transicin de q el estado interno al estado final f donde se
desempila el smbolo $.

q,pop($) f

Ahora por cada regla de produccin: L agregar la regla: q,pop(L) q En este caso
particular se agregara la siguiente transicin.

q,pop(A) q

Por cada regla de produccin: L con agregar la regla: q,ChangeTop(L, R) q En


este caso particular se agregara la siguiente transicin:

q,changeTop(A,bAa) q 4

Finalmente, la parte de reconocer: por cada smbolo t de los terminales, , agregamos la siguiente
transicin: qt,pop(t) q. En este caso particular se agregaran las siguientes transiciones.

qa,pop(a) q y qb,pop(b) q

3
que es un smbolo que no existe en los terminales ni en los no terminales
4
Note que la regla era A aAb y empilamos bAa porque se empila el reverso de la parte derecha de la regla.

3-18
El autmata quedara as:

,pop(A)
,changeTop(A,bAa)

s ,push($A) q ,pop($) f

a,pop(a)
b,pop(b)

Su funcionamiento para dos ejemplos (una cadena en el lenguaje y una que no est en el lenguaje se define as)

aaabbb
Estado Pila Cadena Accin
s aaabbb ,push($A) q
q $A aaabbb ,changeTop(A,bAa) q
q $bAa aaabbb a,pop(a) q
q $bA aabbb ,changeTop(A,bAa) q
q $bbAa aabbb a,pop(a) q
q $bbA abbb ,changeTop(A,bAa) q
q $bbbAa abbb a,pop(a) q
q $bbbA bbb ,pop(A) q
q $bbb bbb b,pop(b) q
q $bb bb b,pop(b) q
q $b b b,pop(b) q
q $ ,pop($) f
f ACEPTA
aaabb
Estado Pila Cadena Accin
s aaabb ,push($A) q
q $A aaabb ,changeTop(A,bAa) q
q $bAa aaabb a,pop(a) q
q $bA aabb ,changeTop(A,bAa) q
q $bbAa aabb a,pop(a) q
q $bbA abb ,changeTop(A,bAa) q
q $bbbAa abb a,pop(a) q
q $bbbA bb ,pop(A) q
q $bbb bb b,pop(b) q
q $bb b b,pop(b) q
q $b Falla: no hay reglas
aplicables
El proceso descrito arriba para construir el autmata descendente a partir de una gramtica independiente del
contexto se define formalmente a continuacin.

3-19
Dada una gramtica G=(N,, S, P) construimos el autmata que reconoce L(G) as:

M = ({s,q,f}, , N {$},s,{f},) con:

= {(s,, ), (q,$S)} {(q,, $), (f, )} {(q,, ), (q, ): }{(q,, A), (q, R): A }.

El autmata generado reconoce la palabras en L(G) usando anlisis descendente.

Autmatas ascendentes

El autmata descendente correspondiente a esta gramtica se construye as:

El autmata tambin tiene tres estados: s, q y f, donde s es el estado inicial y f es el nico estado final. En el
estado q, se realizaran todas las acciones necesarias para reconocer el lenguaje.

El alfabeto de entrada es el conjunto de smbolos terminales.

El alfabeto de pila es la unin de los terminales y los no terminales agregando un smbolo nuevo $5. Este
smbolo se usar para marcar la base de la pila.

Ahora las transiciones: la idea es que de este autmata comience trate de obtener el smbolo distinguido. Por
lo tanto:

Si en la pila est $S en el tope donde S es smbolo distinguido, pasamos a f y aceptamos (siempre y


cuando, claro, se haya terminado de leer la cadena). Agregamos, entonces, una transicin de q el
estado interno al estado final f donde se desempila $S.

q,pop($S) f

Para comenzar ponemos el smbolo $ en la pila. Agregamos una transicin del estado inicial a q, y
se empila $:

s ,push($) q

Ahora por cada regla de produccin: L agregar la regla: q,push(L) q : Lo que esto
quiere decir es que puede ser L. En este caso particular se agregara la siguiente transicin.

q,push(A) q

Por cada regla de produccin: L con agregar la regla: q,ChangeTop(,L) q En


este caso particular se agregara la siguiente transicin:

q,changeTop(aAb, A) q

5
que es un smbolo que no existe en los terminales ni en los no terminales

3-20
Finalmente, la parte de leer: por cada smbolo t de los terminales, , agregamos la siguiente
transicin: qt,push(t) q. En este caso particular se agregaran las siguientes transiciones.
qa,push(a) q y qb,push(b) q

El autmata quedara as:


,push(A)
,changeTop(aAb,A)

s ,push($) q ,pop($A f
)

a,push (a)
b,push (b)

Su funcionamiento para los dos mismos ejemplos de la seccin anterior se muestra a continuacin.

aaabbb
Estado Pila Cadena Accin
s aaabbb ,push($) q
q $ aaabbb a,push(a) q
q $a aabbb a,push(a) q
q $aa abbb a,push(a) q
q $aaa bbb ,push(A) q
q $aaaA bbb b,push(b) q
q $aaaAb bb ,changeTop(aAb,A) q
q $aaA bb b,push(b) q
q $aaAb b ,changeTop(aAb,A) q
q $aA b b,push(b) q
q $aAb b ,changeTop(aAb,A) q
q $A ,pop($A) f
f ACEPTA
aaabb
Estado Pila Cadena Accin
s aaabb ,push($) q
q $ aaabb a,push(a) q
q $a aabb a,push(a) q
q $aa abb a,push(a) q
q $aaa bb ,push(A) q
q $aaaA bb b,push(b) q
q $aaaAb b ,changeTop(aAb,A) q
q $aaA b b,push(b) q
q $aaAb ,changeTop(aAb,A) q
q $aA Falla: no hay regla aplicable

3-21
Formalmente el proceso es el siguiente:

Dada una gramtica G=(N,, S, P) se construye M para que L(M)=L(G) as:

M = ({s,q,f}, , N {$},s,{f},) con

= {(s,, ), (q,$)} {(q,, $S), (f, )} {(q,, ), (q, ): } {(q,, ), (q, A): A }

Este adems analiza la cadena en forma ascendente.

A continuacin se muestra otro ejemplo.

La siguiente gramtica genera el lenguaje de las expresiones de sumas de a's con asociando a la izquierda:

E E +T
ET
Ta
El autmata descendente es:
changeTop(T,a)
changeTop(E,T+E)
changeTop(E,T)

s ,push($E) q ,pop($) f

a,pop(a)
+,pop(+)

El seguimiento para la cadena a+a+a se muestra a continuacin:


Estado Pila Cadena Accin
s a+a+a ,push($E) q
q $E a+a+a ,changeTop(E,T+E) q
q $T+E a+a+a ,changeTop(E,T+E) q
q $T+T+E a+a+a ,changeTop(E,T) q
q $ T+T+T a+a+a ,changeTop(T,a) q
q $T+T+a a+a+a a,pop(a) q
q $T+T+ +a+a +,pop(+) q
q $T+T a+a ,changeTop(T,a) q
q $T+a a+a a,pop(a) q
q $T+ +a +,pop(+) q
q $T a ,changeTop(T,a) q
q $a a ,pop(a) q
q $ ,pop($) f
f ACEPTA
Note que la derivacin sugerida por este seguimiento es: EE+TE+T+TT+T+Ta+T+Ta+a+Ta+a+a

3-22
El autmata ascendente se muestra a continuacin:

changeTop(a,T)
changeTop(E+T, E)
changeTop(T,E)

s ,push($) q ,pop($E) f

a,push (a)
+,push (+)

El seguimiento para la cadena a+a+a es:


Estado Pila Cadena Accin
s a+a+a ,push($) q
q $ a+a+a a,push(a) q
q $a +a+a ,changeTop(a,T) q
q $T +a+a ,changeTop(T,E) q
q $ E +a+a +,push(+) q
q $E+ a+a a,push(a) q
q $E+a +a ,changeTop(a,T) q
q $E+T +a ,changeTop(E+T,E) q
q $E +a +,push(+) q
q $E+ a a,push(a) q
q $E+a ,changeTop(a,T) q
q $E+T ,changeTop(E+T,E) q
q $E ,pop($E) f
f ACEPTA
En este caso, la derivacin correspondiente es: EE+TE+aE+T+aE+a+aT+a+aa+a+a

Cuando se est haciendo seguimiento de autmatas ascendentes a veces se usa otra notacin. En lugar de decir
a, push(a), se dice shift. Esto causa que el primer smbolo de la cadena de entrada pase a la pila. En lugar de
decir changeTop(E+T,E) , se dice, reduce E E+T. No se empila $ al principio; en lugar de esto se le agrega
$ al final de la cadena. Al estar E en el tope de la pila y $ en la entrada, se acepta con la instruccin ACCEPT. A
veces ni se dibuja el autmata.

Ejemplo 3.8 La siguiente gramtica genera el lenguaje de expresiones de la forma a o f(exp, ..., exp)
Ea
E f( L )
L E
L L,E
El seguimiento para f(f(a,a),a) sera:

3-23
Pila Cadena Accin
f(f(a,a),a)$ shift
f (f(a,a),a)$ shift
f( f(a,a),a)$ shift
f(f (a,a),a)$ shift
f(f( a,a),a)$ shift
f(f(a ,a),a)$ reduce Ea
f(f(E ,a),a)$ reduce LE
f(f(L ,a),a)$ shift
f(f(L, a),a)$ shift
f(f(L,a ),a)$ reduce Ea
f(f(L,E ),a)$ reduce LL,E
f(f(L ),a)$ shift
f(f(L) ,a)$ reduce Ef(L)
f(E ,a)$ reduce LE
f(L ,a)$ shift
f(L, a)$ shift
f(L,a )$ reduce Ea
f(L,E )$ reduce LL,E
f(L )$ shift
f(L) $ reduce Ef(L)
E $ ACCEPT
EJERCICIOS

1. Construya los autmatas descendentes y ascendentes para las siguientes gramticas

2. Sin construir el autmata ascendente muestre el seguimiento del reconocimiento de la cadena a+a*(a+a) para
la gramtica: (El smbolo distinguido es E u los terminales son a.+.(.)
E E +T
ET
TT*F
TF
Fa
F (E)

3-24
Lenguajes y Maquinas

Silvia Takahashi

8 de octubre de 2012
2
Captulo 1

Maquinas de Turing

En este captulo se presentan las maquinas de Turing. Estas maquinas son mas poderosas computacio-
nalmente que los automatas de pila. A primera vista una maquina de Turing se parece a los automatas
vistos en los captulos anteriores. Al igual que los automatas de estados finitos, y los automatas de Pila, las
maquinas de Turing tienen un numero finito de estados y una cinta de donde pueden leer. No tienen una
pila, pero pueden escribir sobre la misma cinta que leen. En cada instante, el automata, dependiendo del
estado en el que esta y del smbolo que esta leyendo, pasa a otro estado y puede escribir un smbolo en la
cinta y moverse a la izquierda o a la derecha en la cinta. El poder escribir y devolverse es lo que le agrega
poder computacional a las maquinas de Turing.

1.1. Definciones
La descripcion formal de una Maquina de Turing se enuncia a continucacion:

Definicion 1. Una maquina de Turing es una cuadrupla: (Q, , qI , ) donde:

Q es un conjunto finito de estados,

es un alfabeto finito que incluye el smbolo # que representa el blanco.

qI Q es el estado inicial

: (Q ) (Q {8} ( (, )) es una funcion transicion.

La funcion de transicion de estados sirve para indicar el comportamiento de la maquina al estar en un


estado dado y leyendo un smbolo en la cinta de entrada. Esta es una funcion parcial. Esto quiere decir, que
puede haber parejas (estado, smbolo) para las cuales la funcion no esta definida.
El comportamiento de la maquina esta dado por la funcion de transicion:

Si (q, ) = (q1 , , ), esto quiere decir que que si esta en un estado q, leyendo , escriba , mueva la
cabeza lectora a la derecha y pase al estado q1 .

Si (q, ) = (q1 , , ), esto quiere decir que que si esta en un estado q, leyendo , escriba , mueva la
cabeza lectora a la izquierda y pase al estado q1 .

Si (q, ) = (8, , ), esto quiere decir que que si esta en un estado q, leyendo , escriba , mueva la
cabeza lectora a la derecha y detenga la ejecucion.

Si (q, ) = (8, , ), esto quiere decir que que si esta en un estado q, leyendo , escriba , mueva la
cabeza lectora a la izquierda y detenga la ejecucion.

3
La ejecucion termina normalmente, si se ejecutan cualquiera de las dos ultimas instrucciones descritas
arriba. Tambien puede detenerse si para algun estado y algun smbolo, no esta especificado que accion se
debe tomar. La ejecucion tambien termina si la cabeza lectora se sale por el extremo izquierdo de la cinta,
y en este caso terminara en error.
La configuracion de una maquina de Turing esta dada por el estado en que se ecuentra, el contenido de
la cinta de entrada, y la posicion de la cabeza lectora sobre la cinta. As la cinta de entrada sea infinita, nos
interesa solo la parte de la cinta que no esta compuesta solo de blancos. Para los problemas que vamos a
ver, la porcion de la cinta que no esta en blanco es finita. Por lo tanto, podemos decir que la cadena sobre
la cinta es de la forma: #+ .
Podemos definir formalmente la configuracion de una maquina de Turing as:

Definicion 2. Dada una Maquina de Turing M = (Q, , qI , ), una configuracion de M es una tripla
: hq, , pi (Q {8} N. Esto indica que la M esta en el estado q. que la cinta lectora tiene una
cadena de la forma #+ y que la cabeza lectora esta en la posicion p de la cinta.

Por ejemplo: suponga que: = 1 . . . n1 n , donde n = #; estamos leyendo i ; y estamos en el


estado q. Podemos representar la configuracion as: (q, 1 . . . i . . . n1 n ), subrayando el smbolo que se
esta leyendo. Si se esta en una configuracion en que el estado es 8, se sabra que el calculo ha terminado sin
problemas. Si estamos en una configuracion: (q, 1 . . . i . . . n1 n ), y (q, i ) no esta definido, la ejecucion
esta detenida.

Definicion 3. Decimos que una configuracion K es alcanzable en un paso de una configuracion C, y escri-
bimos C K si:

C = (q, 1 . . . i . . . n1 n ) (con i < n), (q, i) = (q1 , (, ) y K = (q, 1 . . . i+1 . . . n1 n ).

Si la maquina de Turing esta en una configuracion: (q, 1 . . . i . . . n1 n ), (con 1 < i), si (q, i) =
(q1 , (, ) entonces pasara a la configuracion: (q, 1 . . . i1 . . . n1 n ).

Si la maquina de Turing esta en una configuracion: (q, 1 . . . i . . . n1 n ), y si (q, i) = (q1 , (, )


entonces pasara a la configuracion: (q, 1 . . . i . . . #).

Si la maquina de Turing esta en una configuracion: (q, 1 . . . n ), si (q, i) = (q1 , (, ) entonces la


ejecucion terminara abruptamente pues la cabeza lectora no puede moverse a lizquierda a partir de esa
posicion.

Si podemos pasar de una configuracion C1 a otraCn en un paso, ecribimos C1 Cn . Si podemos pasar


de de una configuracion C1 a otraC2 en cero o mas pasos escribimos: C1 Cn

Definicion 4. Decimos que una configuracion Cn es alcanzable en cero o mas pasos a partir de C1 si:

C1 = Cn

C1 Cn

Existe una configuracion C tal que C1 C y C Cn .

1.2. Extensiones a la definicion


Es util extender la definicion de maquinas de Turing para que pueda mover la cabeza sin leer y que pueda
leer sin avanzar o retroceder. Tambien, sera util poder hacer que ignore la cinta al leer o escribir. Esto no
le agrega poder computacional pero puede hacer que sea mas facil describir ciertos calculos.

4
1.2.1. Operacion Nula
Comenzamos extendiendo las Maquinas de Turing, agregando la accion de no mover la cabeza lectora.
Si hacemos esto, la funcion de transicion tendra la siguiente forma:

: (Q ) (Q {8} ( (, , ))

Esto no agrega poder computacional. Podemos ver que si tenemos un maquina de Turing con la operacion
, es facil construir una maquina de Turing con el mismo comporamiento, que no tiene esta operacion.

Teorema 5. Toda maquina de Turing extendida con la operacion puede convertirse a una maquina de
Turing equivalente que no tiene esta operacion.
Considere una maquina de Turing con la operacion

T = (Q, , qI , )
Podemos construir una maquina de Turing equivalente que no contiene esta operacion as:

T 0 = (Q0 , , qI , 0 )
Sea Q0 = Q qp : p Q
Suponemos que Q Q0 =
Definimos 0 as:

Las transiciones que no tienen no cambian: 0 (q, ) = (p, , op) si (q, ) = (p, , op) y op 6=

Las transiciones tienen NOP, se cambian por una transicion al estado qp moviendose a la derecha:
0 (q, ) = (qp , , ) si (q, ) = (p, , ).

Agregamos transiciones para cada qp para que pase al estado p moviendose a la izquierda con cualquier
smbolo y volviendo a escribir el mismo, para as no cambiar la cinta. 0 (qp , ) = (p, , ) para cada
p Q y cada in

1.2.2. Ignorar la cinta


Podemos tambien extender la maquina para ignorar la cinta. Es decir, para que ejecute la accion inde-
pendientemente de lo que hay en la cinta y para que no escriba nada en la cinta.
LA funcion de transicion entonces quedara as:

: (Q ( {}) (Q {8} ((( {}) (, , ))


Donde
(q, ) = . . . indica que para cualquier smbolo del alfabeto se ejecute la accion.
(q, c) = ( . . .) que no se escribe nada y se deja tal como esta.
Es facil ver que estas transiciones. pyuden reemplazarse por una transicion por cada smbolo del alfabeto
para quedar con una maquina sin transiciones |lambda.
Sin embargo estas transiciones- podran agregar no determinismo si tenemos una mezcla de transiciones-
con transiciones normales saliendo de un mismo estado. Lo cual en s no es problema, ya que las Maquinas
de Turing no-determinsticas tienen el mismo poder computacional que las determinsticas, Sin ambargo,
podra ser problematico para su simulacion. Si queremos evitar esto se debe garantizar que:

Si existe una transicion que salga de un estado q, que se active al leer , no debe existir ninguna otra
que se active con algun

Si existe una transicion que salga de un estado q, y que escriba , no debe existir una que escriba otra
cosa.

5
Teorema 6. Si tenemos una Maquina de Turing con transiciones que se ejecutan al leer (es decir, igno-
rando la cinta) y que permiten escribir (es decir, no escribir nada), podemos construir una maquina de
Turing equivalente que no lee ni escribe .
Lo que queremos hacer, entonces, es cambiar las transiciones que tienen por transiciones equivalentes
que no tienen .

Cambiamos las transiciones que leen (un smbolo distinto de ) y no escriben nada (transiciones de
la forma: (q, ) = (p, , op)) por la transicion: (q, ) = (q, ), una transicion en la que se escribe lo
mismo que se lee.

Cambiamos las transiciones que ignora la cinta y escribe (un smbolo distinto de ) - transiciones
de la forma: (q, ) = (p, , op) por transiciones: (q, ) = (p, , op) (una por cada ).

Cambiamos las transiciones que ni leen y escriben (transiciones de la forma: (q, ) = (p, , op)) por
transiciones: (q, ) = (p, , op), una por cada en

Formalmente: 0 =
{((q, ), (p, , op))} {((q, ), (p, , op)) : , }

1.3. Representacion Grafica

Graficamente, podemos describir una maquina de Turing con un multigrafo donde los nodos representan
estados y los arcos las transiciones. Los arcos se etiquetan con el smbolo que se lee seguido del smbolo /
seguido de una pareja Instruccion(), donde instruccion puede ser , o .
Si tenemos que (q, ) = (p, , act), esto se dibujara as:

1.4. Ejemplos

1.4.1. Shift Left

Problema: La maquina comienza en una configuracion de la forma: #1 2 . . . n y termina en una confi-


guaracion: #2 . . . n . Para facilidad suponga que i {0, 1} para 0 i n. Tenemos entonces:

6
1.4.2. Invertir una cadena

Problema: La maquina comienza en una configuracion de la forma: #1 2 . . . n y termina en una confi-


guaracion: #n . . . 1 . Donde tanto al principio como al final, la cabeza se encuentra al principio de la cinta.
Para facilidad suponga que i {0, 1} para 0 i n. Tenemos entonces:

7
1.4.3. an b n c n
En el Captulo 2, vimos que este lenguaje no es independiente del contexto. No podemos construir un
automata de pila que lo reconoza.
Vamos a suponer que comenzamos en una configuracion # y terminamos en una configuracion en la
que hemos escrito Y si la cadena esta en el lenguaje y N de lo contrario.
beginexample Considere el lenguaje {an bn cn : n 0}. Este es un lenguaje que no es independiente del
contexto (ni regular). Para reconocer este lenguaje debemos leer una a y aseguranos de que haya tanto una
b como una c por esa a.
Para facilidad, vamos a suponer que comenzamos en una configuracion que tiene la siguiente forma:

##+

Queremos una Maquina de Turing que comience en esta configuracion y si

{a, b, c}
y

= an bn cn
entonces la Maquina debe terminar en una configuracion:

8
Y
sin importar que esta a la derecha o a la izquierda de Y .

A continuacion explicamos el comportamiento de la maquina.

1.4.4. Dividir por 4


Al igual que en los automatas podemos definir las maquinas usando formulas en lugar de dibujos.
Suponga que queremos definir una maquina de Turing que comienza en el extremo izquierdo de la cinta
donde aparece una cadena de dgitos y queremos escribir el resultado de dividir el numero que aparece en la
cinta por cuatro (ver el ejemplo del trasductor del captulo 1), esta maquina se describe as:

Q = {0, 1, 2, 3, R1 , R2 , R3 }
= {0, 1, 2, 3, R, #}
qI = 0
La funcion de transicion la escribimos as:
(s, d) = ((10 s) + d)mod4, (((10 s) + d) 4), ), para d 1, 2, 3, 4
(0, #) = (8, (#, ))
(d, #) = (Rd , (R, )) para d 6= 0
(Rd , #) = (8, (d, ))

Comenzamos leyendo el numero de derecha a izquierda. Tenemos 4 estados para esta fase que indican
cuanto se lleva de la division anterior.
Para la fase final tenemos 3 estados para escribir el residuo.
Esta sera la traza de la ejecucion de la maquina con el numero: 12345

1.4.5. Otras extensiones


Existen otras extensiones de Maquinas de Turing; ninguna de las cuales agrega poder computacional.
Simplemente, agregan poder de expresion.

Maquinas con una cinta infinita en ambas direcciones


Maquinas no determinsiticas
Maquinas con dos cintas
Maquinas con mas de dos cintas (pero el numero de cintas debe ser predeterminado)

9
1.5. Mejorando la notacion
Buscamos mejorar la notacion para que la descripcion de las maquinas no sea tan engorrosa. Para esto
necesitamos dos conceptos: maquinas atomicas sencillas que ejecutan procesos simples y combinacion de
maquinas.

1.5.1. Maquinas Sencillas


En esta seccion se definen unas maquinas de Turing que ejecutan acciones simples. Estas luego pueden
combinarse para realizar tareas mas complejas.

Moverse a la derecha

R = ({q}, , q, R )
Donde
R (q, ) = (8, , )

1.5.2. Moverse a la izquierda

L = ({q}, , q, L )
Donde

L (q, ) = (8, , )

1.5.3. Escribir un smbolo:

W = ({q}, , q, W )
Donde
W (q, ) = (8, , )

1.5.4. Moverse a la derecha hasta encontrar un smbolo dado,


Esta maquina hace las siguiente secuencia de operaciones:

1. Se mueve a la derecha

2. Si esta leyendo el smbolo , se detiene; de lo contrario, vuelve al paso 1

R= = ({q, p}, , q, R )
Donde
R= (q, ) = (p, , R)
R= (p, ) = (8, , N OP )
Para 6= :
R= (p, ) = (p, , )

10
1.5.5. Moverse a la izquierda hasta encontrar un smbolo,
Esta maquina hace las siguiente secuencia de operaciones:

1. Se mueve a la izquierda
2. Si esta leyendo el smbolo , para de lo contrario vuelve al paso 1

L= = ({q, p}, , q, L )
Donde
L= (q, ) = (p, , R)
L= (p, ) = (8, , N OP )
Para 6= :
L= (p, ) = (p, , )

1.5.6. Moverse a la derecha hasta no estar leyendo un smbolo dado,


Esta maquina hace las siguiente secuencia de operaciones:

1. Se mueve a la derecha
2. Si esta no esta leyendo el smbolo , para de lo contrario vuelve al paso 1

R6= = ({q, p}, , q, R6= )


Donde
R6= (q, ) = (p, , R)
R6= (p, ) = (p, , N OP )
Para 6= :
R6= (p, ) = (8, , )

1.5.7. Moverse a la derecha hasta no estar leyendo un smbolo dado,


Esta maquina hace las siguiente secuencia de operaciones:

1. Se mueve a la derecha
2. Si esta no esta leyendo el smbolo , para de lo contrario vuelve al paso 1

R6= = ({q, p}, , q, R6= )


Donde
R6= (q, ) = (p, , R)
R6= (p, ) = (p, , N OP )
Para 6= :
R6= (p, ) = (8, , )

1.5.8. Combinacion de maquinas


Las maquinas de Turing pueden combinarse agegando una operacion que es una llamda a otra maquina.

11
1.5.9. Una nueva notacion
La notacion para describir maquinas de Turing puede resultar un poco engorrosa. En los ejemplos mos-
trados arriba, veamos que acciones como buscar un smbolo, requieren muchos estados. Muchos autores,
introducen una notacion en la que priman las operaciones. Se tienen algunas operaciones basicas, e inclusive
se pueden definir maquinas mas complejas y conectarlas. En este caso, los nodos son operaciones y los arcos se
etiquetan con smbolos que permiten el paso de una operacion a otra. Esto en realidad, lo que esta haciendo
mostrar en un diagrama la forma en que se combinan las maquinas simples que se describieron arriba.
Estas maqunas representan las sigientes operaciones basicas.

Moverse a la derecha sin escribir. Es lo mismo que tener la siguiente transicion.


Moverse a la izquierda sin escribir
Moverse a la derecha hasta encontrar un smbolo dado. Note que se mueve a la derecha. Si es el smbolo
dado entonces ya termina. se vuelve a mover a la derecha.
Moverse a la derecha hasta que no este leyendo un smbolo dado
Moverse a la izquierda hasta encontrar un smbolo dado
Moverse a la izquierda hasta que no este leyendo un smbolo dado
Escribir un smbolo

Ejemplo 1. Digamos que queremos verificar si se esta leyendo una cadena de la forma : #a2n . paran > 0
Primero vamos a verificar que la cadena este formada solo con as, antes de comenzar el proceso. Luego
volvemos al principio de la cinta.
De haber al menos 1 a. Entonces comenzamos marcando esa a, cambiandola por X. Estamos entonces
en esta situacion: Xam donde m+1 es de la forma 2n.
Lo que hacemos es ver si se pueden multplicar las X por 2. Es decir, pasar de esta configuarcion a XXam
y luego XXXXam , y as sucesivamente.
Estamos entonces replicando la secuencia de Xs siempre y cuando haya as.
Para esto hacemos lo siguiente: marcamos la X con una M y avanzamos buscando una a. Si la encontramos
la marcamos con una H. Si encontramos blanco, hay un error. Al buscar la a, pueden tambien aparecer as
marcadas con H. Sabemos que hemos terminado de duplicar las X cuando encontramos una H en lugar de
una X. En ese caso tenemos que cambiar las H, por X. Si despues de la ultima H, hay una z es por que
debemos seguir multiplicando por dos.
Ejemplo 2. Este se habra podido hacer mas facilmente combinando maquinas as:

1.6. Equivalencias
En esta seccion veremos como simular los automatas vistos en captulos anteriores con maquinas de
Turning.

1.6.1. Automata Finito


Digamos que tenemos un automata finito determinstico definido as:

M = (Q, , qI , F, M )
donde {#, 2
, 4} 6 y 8 6 Q. Entonces la maquina de Turing defininida as:

T = (Q {8}, {#, 2
, 4}, qI , T )
donde:

12
T (q, ) = ((q, ), (, )) para
) para q F
T (q, #) = (8, 2
T (q, #) = (8, 4) para q
/F

simula el comportamiento del automata M . Terminando correctamente escribiendo 2


 si la cadena es
aceptada, y escribiendo 4 de lo contrario.
Sea = 1 . . . n 2
, Si T comienza en una configuracion (qI , 1 . . . n ):

Si L(M ), entonces la maquina de Turing terminara en la siguiente configuracion: (8, 1 . . . n 2



Si L(M ), entonces la maquina de Turing terminara en la siguiente configuracion: (8, 1 . . . n 4

1.6.2. Automata de Pila


Haremos la equivalencia para un automata de pila simplificado.
Un automata de pila simplificado es de la forma:

M = (Q, , , s, f, )

Donde:
(Q ( ) ( )) (Q ( ))
Y:
((q, a, b), (p, c)) (b = c 6= )
Recuerde que lo que indica esta regla es simplemente que las reglas solo pueden empilar o desempliar un
unico smbolo. Solo pueden ser push o pop. No puede ser Skip, pushOn, changeT op.
La maqina de Turning extendida correspondiente se construira as:
Vamos a construir una maquina de Turing tal que para todo L(M ) si la maquina comienza en una
configuracion # en el estado inicial terminara en un estado: 2 y para cada / L(M ) si la maquina
comienza en una configuracion 8, # en el estado inicial terminara en un estado: 8, 4 o trancada por
no poder seguir.
Comenzamos:

T = (QT , T , qI T , T
Inicialmente:

QT = Q {qI T }
T = {$} donde $ es un smbolo que no esta ni en ni en Gamma.

Vamos a agregar unas reglas que le permiten a la maquina pasar de la configuracion:


(qI T , #) a la configuracion: (qI , $)
donde esta parado en el primer smbolo de o en el blanco siguiente si es vaco.
Estas seran las reglas (qI T , #) = (qmark , (#, )) y para cada agregamos la regla (qmark , ) =
(qmark , (, )) y ademas la siguiente: (qmark , #) = (qmarkR , ($, )) El estado markR sirve para devolvernos
a principio: (qmarkR , ) = (qmarkR , (, )) (qmarkR , #) = (qI , (#, ))
Vamos a agregar estados que nos serviran para empilar un valor en la pila y volver a donde bamos
leyendo.
delta(qpush , ) = (delta(qpush , (, )))
delta(qpush , $) = ((ppush , , )))
delta(qpush , $) = ((ppush , , )))

13

Вам также может понравиться