You are on page 1of 3

TEORIA DE AUTOMATAS

Y LENGUAJES FORMALES
Grado en Ingeniera Informatica Online, Curso 2012-2013
Universidad Rey Juan Carlos
DE LA HOJA DE PROBLEMAS No 7
GU
IA PARA LA REALIZACION
(Tema 7: M
aquinas de Turing)
El objetivo de esta hoja es practicar el dise
no de maquinas de Turing que reconozcan lenguajes
y que computen funciones. Los ejercicios del 1 al 10 corresponden a la primera clase, mientras
que los ejercicios del 11 al 27 solicitan maquinas de Turing que computen funciones. Quiza los
enunciados puedan parecer largos en algunos casos pero solo aquellos ejercicios marcados con
la etiqueta avanzado deberan ofrecer complejidad.
Antes de abordar el dise
no de una m
aquina de Turing se deberan tener en cuenta las siguientes
consideraciones:
La maquina de Turing puede escribir en la cinta cualquier caracter que desee. Por lo tanto,
a no ser que el enunciado diga lo contrario, podemos escribir los smbolos que queramos
de forma que el dise
no de la m
aquina sea mas sencillo o intuitivo.
La maquina de Turing se va moviendo por la cinta hacia derecha o izquierda seg
un nos
plazca.
Al movernos por la cinta es muy importante que no perdamos la posicion en la
que nos encontramos. Por ejemplo, sabemos que a la izquierda y a la derecha de la
cadena de entrada se encuentran caracteres en blanco, por lo tanto, si buscamos el
u
ltimo car
acter de la cadena de entrada, podemos recorrerlos todos hasta encontrar
el primer blanco; encontrado este, el u
ltimo caracter se encuentra a su izquierda.
De igual manera podemos hacer para encontrar el primer caracter de la cadena de
entrada (si nos movemos hacia la izquierda, estara a la derecha del primer blanco
que nos encontremos).
A veces para no perdernos o para delimitar zonas en la cinta (zona donde escribir
la soluci
on, zona d
onde hacer calculos intermedios, etcetera) es bueno escribir cosas
en la cinta. En la cinta podemos escribir lo que queramos, quiza escribir un * en
alg
un sitio, pueda ser u
til para movernos (a izquierda o derecha) y encontrar esa
zona.
De hecho, el funcionamiento de una maquina de Turing es ese: leo un elemento, en esa
posicion escribo algo (si escribo ese mismo elemento, la cinta queda igual), me muevo a
otro lado de la cinta y hago algo, vuelvo a por otro elemento, escribo, me muevo para
hacer algo, vuelvo a por otro elemento...
Para tener una visi
on de como funciona una maquina de Turing, se recomienda
instalar JFLAP o xTuringMachine (enlaces en la pagina de la asignatura), introducir
alguna m
aquina que hayamos hecho en clase y ejecutarla.
Una buena manera de dise
nar una maquina de Turing es, ante un problema dado, pensar
en una soluci
on que resuelva el problema de manera iterativa.
Los elementos que ya hemos ledo debemos marcarlos o eliminarlos para evitar que
sean tratados de nuevo.
Para elegir si marcarlos o eliminarlos podemos seguir las siguientes recomendaciones:
1

Si no vamos a volver a utilizar los smbolos podemos eliminarlos. Sin embargo,


si los smbolos se encuentran en medio de la cadena de entrada no es bueno
eliminarlos, ya que al sustituirlos por el caracter blanco, podra ocurrir que en
alguna de las iteraciones, al encontrarnos con ese blanco, no sepamos distinguir
si se trata de un blanco en medio de la cadena de entrada o del blanco que marca
el final de la misma (es decir: perderamos referencias que sirven para encontrar
nuestra posici
on dentro de la cinta). Por lo tanto, aunque no los vayamos a
utilizar, si se encuentran en medio de la cadena de entrada, lo mejor es marcarlos
(y eliminarlos antes de finalizar si es necesario).
Sin embargo, si los vamos a utilizar posteriormente, la u
nica opcion es marcarlos.
Es importante crear una subrutina que trate a todos los elementos por igual (siempre
que sea posible). En el momento en que hagamos una subrutina para el primer
elemento, otra para el segundo, otra para el u
ltimo, etcetera... mas probabilidades
habr
a de cometer un error en el dise
no de la maquina, mas estados tendra y m
as
tiempo se habr
a invertido en su dise
no.
Debemos tener presente c
omo esta codificada la cadena de entrada. Si la codificacion
esta en unario, debemos ser conscientes que tenemos un uno de mas respecto a las unidades
del natural que estamos representando (un 3 se representa con cuatro unos). Por lo general,
a veces compensa manipular la entrada (eliminando un uno del parametro) dejando que
as haya tantos unos como unidades tiene el natural que representa.
Imagnate que est
as implementando un algoritmo que realiza una multiplicacion y
que recibe dos n
umeros naturales codificados en unario. Multiplicar es sumar un
n
umero consigo mismo tantas veces como indica el otro. Si tenemos tantos unos
como unidades, podramos ir quitando unidades a uno de los parametros y, por cada
unidad, sumar el otro n
umero consigo mismo. Si antes de ejecutar el algoritmo no
hemos ajustado la entrada (eliminando el uno de exceso), cometeremos un error
porque sumaremos el n
umero consigo mismo una vez mas.
Piensa en las condiciones de finalizacion, cuando has terminado de ejecutar las subrutinas
y debes transitar a un estado final?
Por u
ltimo, recuerda las restricciones de las maquinas de Turing en cuanto a su finalizacion:
Si es una m
aquina de Turing reconocedora de lenguajes, la cinta puede quedar con
cualquier cosa y el cabezal tambien puede quedar en cualquier posicion. Lo importante es que si la cadena es aceptada, la maquina pare en un estado final.
Sin embargo, si se trata de una maquina de Turing para computar funciones, la
m
aquina debe parar en un estado final, en la cinta solo debe quedar la solucion
(el resto de caracteres deben de haber sido borrados) y el cabezal tiene que estar
apuntando al primer car
acter de la solucion.
A continuaci
on se ofrecen indicaciones o pistas para solventar algunos ejercicios:
Ej.2) Deberas comprobar que por cada a existe una b y una c. Tambien deberas asegurar
que se respeta la estructura de la palabra (primero as, luego bs y por u
ltimo, cs).
Este es un caso en el que:
Cuando leas las as las puedes eliminar (es decir, escribir un blanco en su lugar).
Cuando vuelvas a por la siguiente a a tratar, sera como si tratases la cadena por
primera vez, puesto que ser
a la primera a.
2

Por cada a debes cancelar una b pero, en este caso, cancelar no significa borrar.
Las bs deberas marcarlas, puesto que si las borras, estaras dejando blancos entre
las as y las cs con lo cual no sabras situarte ni al principio ni al final de la
palabra.
Ej.3) En este ejercicio el car
acter c sirve para posicionarse en la cadena: marca el fin de la
primera cadena x y el comienzo de la segunda. Ten en cuenta que cuando ponemos
xcx quiere decir que hay dos cadenas iguales, separadas por una c.
Ej.4) Parecido al ejercicio 2, pero aqu la palabra no tiene estructura. Te puedes encontrar as,
bs y cs en cualquier orden.
Ej.9) Piensa que las bs que queden despues de anularlas con las primeras as se deben
poder cancelar con las u
ltimas as.
Ej.13) Debemos contar el n
umero de as que hay en una cadena y es el resultado que debemos
calcular. Iremos construyendo el resultado de manera iterativa, cada vez que encontremos
una a a
nadiremos un 1 a la solucion. La solucion la comenzaremos a escribir inmediatamente despues del blanco que separa el u
ltimo caracter de la cadena de entrada (es
decir, la cadena y la soluci
on estan separadas por un blanco). La solucion la codificaremos en unario, por lo que, al final, pondremos un 1 extra. Borraremos el parametro de
entrada (si no lo hemos hecho anteriormente) y colocaremos el cabezal encima del primer
caracter de la soluci
on.
Ej.17) Cancelamos los smbolos de x y de y uno a uno. En un momento dado, quedaran m
as
smbolos de uno que de otro (esa sera la solucion) o habremos eliminado ambos parametros
(eran iguales). Si la soluci
on la proporcionamos en unario, deberemos realizar los ajustes
necesarios.
Ej.19) Antes de comenzar eliminamos un uno de cada parametro (y as pasan a tener tantos unos
como unidades el natural, eliminando el exceso de la notacion unaria). Sumar dos n
umeros
puede consistir simplemente es concatenar ambas cadenas... Despues dividir entre dos
puede ser: por cada dos elementos que quito... pongo un uno en el resultado... La division
es ver cu
antas veces un n
umero coge en otro.
Ej.20) Multiplicar es sumar un n
umero consigo mismo tantas veces como indica el otro. Habra que
tener en cuenta el exceso del unario.
Ej.26) Idea: la soluci
on se inicializa con cero; por cada unidad que pueda sustraer al n
umero
natural, sumo (en binario) un uno a la solucion (creando as, de manera iterativa, el
n
umero binario). En este ejercicio, la solucion crece hacia la izquierda, por lo tanto, sera
aconsejable escribirla a la izquierda del n
umero natural, separada por un blanco (y no a
la derecha como se hace habitualmente).

You might also like