Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Esta obra est bajo una licencia de Creative Commons. Pulsa aqu para obtener el emulador de mquina de Turing Actualmente existen gran cantidad de ordenadores, capaces de realizar sorprendentes funciones. Todos ellos, sin embargo, estn basados en un simplsimo artilugio imaginario capaz de hacer cualquier operacin matemtica computable; esto es, que se pueda realizar de una forma totalmente mecnica. Son las mquinas de Turing.
Al estallar la Segunda Guerra Mundial, Turing fue alejado del mundo acadmico y reclutado por la Escuela de Cdigos y Cifrados del gobierno britnico. Las actividades que realizaba consistan de manera primordial en descifrar el cdigo militar alemn ENIGMA. Para ello desarroll el invento ms secreto de dicha guerra: el Colossus, primer ordenador electromecnico del mundo. Ms adelante, sera destinado a los Estados Unidos con el fin de crear unos cdigos seguros para las comunicaciones transatlnticas entre los pases aliados. Acabada la guerra, Turing colabor en la construccin del ENIAC. Posteriormente recibi el encargo de empezar a trabajar en la construccin de un ordenador totalmente britnico, destinado al National Physical Laboratory, y que recibira el nombre de ACE (Automatic Computing Engine). Esta mquina tard mucho tiempo en ser construida, pero era superior a ENIAC en muchas caractersticas. Frustrado por el lento avance, dimiti y se fue a vivir a Manchester, colaborando en el proyecto del MARK I, el ordenador de la universidad. Al mismo tiempo, era asesor de la compaa Ferranti y, por tanto, colabor en la construccin de los primeros ordenadores fabricados en Gran Bretaa. En 1952, Turing fue acusado de homosexualidad, y dos aos ms tarde se suicid.
P mueve el cursor una posicin a la derecha O mueve el cursor una posicin a la izquierda Q mueve el cursor una posicin hacia arriba A mueve el cursor una posicin hacia abajo 1 escribe un uno en la posicin del cursor 0 escribe un cero en la posicin del cursor ESPACIO retorna al men principal, y toma la posicin actual del cursor como la posicin en la que pondr la mquina en marcha.
PROGRAMAR LA MAQUINA: Sirve para introducir la tabla de posibilidades para la mquina. Aparece sta en pantalla, inicialmente toda a cero, y a los lados del primer grupo aparecen dos smbolos # en inverso. Son el cursor. Para realizar la programacin, hay que tener en cuenta lo siguiente:
El emulador puede manejar hasta cien estados, nombrados con los nmeros del cero (0) al noventa y nueve (99). Obviamente, un programa para el simulador no tiene por qu usarlos todos. El estado de detencin no se simboliza con un nmero, sino con el smbolo de la arroba (@ , cdigo ASCII: 64). Es un estado especfico, y es el que reconoce el emulador como estado de detencin. Los nicos smbolos que puede imprimir en la cinta son el cero (0) y el uno (1). El sentido de avance de la cinta se indica con los smbolos < (izquierda) y > (derecha).
En pantalla aparece la tabla que define la mquina actual, dispuesta de una manera especial: en la parte superior aparecen los nmeros del cero al cuatro, y a la izquierda los nmeros del cero al noventa y cinco, de cinco en cinco. Esos nmeros especifican el estado en que se debe encontrar la mquina para que ejecute la instruccin indicada. En la parte superior, debajo de cada nmero, aparecen un cero y un uno. Son los smbolos que debe encontrar la mquina en la cinta para que ejecute la instruccin indicada. Por ltimo, debajo de cada cero o uno aparecer un bloque de instrucciones, compuesto por dos nmeros y un sentido, representado por los signos < y >. Veamos un ejemplo para que quede claro: la pantalla tendr este aspecto:
0 0 5 10 15 20 25 0 A E 1 B F 0 C 1 1 D 1 G 2 0 H 1 3 0
Las instrucciones (o el bloque) colocadas en la posicin de la letra A se ejecutarn si la mquina est en estado cero y encuentra un cero en la cinta; las de la posicin de la B, si la mquina est en estado cero y encuentra un uno; las de C, si est en estado 1 (1+0) y encuentra un cero; las de F si est en estado 5 (5+0) y encuentra un uno; las de G, si est en estado 12 (10+2) y encuentra un cero... Vemos que el estado viene definido por la suma de las cifras de la izquierda y de la parte superior. Para realizar una modificacin, se debe situar el cursor (representado por dos signos # en fondo inverso, uno a cada lado) en el bloque a cambiar, y pulsar ENTER. El programa nos pedir el nuevo smbolo a escribir en la cinta, a lo que debemos responder 1 o 0, seguido de ENTER; despus nos preguntar el nuevo estado al que pasa la mquina, que debe ser un nmero del 0 al 99, o bien el smbolo de la arroba ( @ ), que indicar estado de detencin. Por ltimo, nos preguntar el sentido en que debe moverse la cabeza, a lo que responderemos < , para indicar izquierda, o bien > , para indicar derecha. Si el nuevo estado es el de detencin ( @ ), el ordenador aadir automticamente el smbolo < (no tiene razn de ser el querer meter un sentido, pues en estado de detencin el programa para la ejecucin con un mensaje y vuelve al men principal). Cuando se ha cambiado un bloque, el cursor pasa automticamente al bloque de la derecha, siguiente en orden creciente de estado. Si estamos en un bloque del borde, pasar al primero de la lnea siguiente. Esto permite programar la mquina con ms comodidad, al no tener que desplazar el cursor hasta el siguiente bloque. Para volver al men principal, se debe pulsar ESPACIO. EJECUCION NORMAL: Pone en marcha la mquina sobre la cinta, tomando como posicin inicial la que tena el cursor al salir de la opcin ACTUALIZAR LA CINTA. Si no se haba escogido an dicha opcin, se pondr en marcha en la parte central. La ejecucin terminar en cualquiera de los siguientes casos:
La mquina llega al estado de detencin (o estado @). Imprime el mensaje "LA MAQUINA SE HA DETENIDO". La mquina se sale de la cinta por cualquiera de los dos lados. Imprime el mensaje "LA MAQUINA SE HA ESCAPADO". Se llega al nmero lmite de ciclos de ejecucin. Este lmite es seleccionable en el apartado OPCIONES del men. Se pulse la tecla ENTER.
EJECUCION PASO A PASO: Realiza la ejecucin paso a paso, esperando a que se pulse una tecla antes de calcular el siguiente ciclo. Muestra, adems, el
estado actual de la mquina y el nmero de ciclo. Es una opcin muy til para depurar programas. La ejecucin terminar en los mismos casos que la ejecucin normal, volviendo al men principal. OPCIONES: Permite seleccionar el nmero mximo de ciclos que puede ejecutarse el programa actual. Si excede de siete cifras, el programa avisar con un mensaje, pidiendo que lo teclee de nuevo. Tambin permite seleccionar el estado en el que la mquina empezar su ejecucin. Por defecto, este estado es el cero, pero puede cambiarse a voluntad. Obviamente, no puede ser el estado de detencin (@). SALIR: Devuelve el control al BASIC.
A A B B C C
0 1 0 1 0 1
B B A C A C
1 0 1 0 0 0
Hemos puesto los posibles estados en columna, y los posible smbolos en fila, y hemos expresado el nuevo estado, smbolo y sentido todo junto. El sentido lo expresamos con la direccin en la que apunta el smbolo < o >. Vamos a poner nuestra mquina sobre esta cinta:
cabezal v ... 0 0 0 0 0 1 0 0 0 0 ...
Indicaremos el estado actual de la mquina encima del cabezal. Veamos los sucesivos pasos de esta mquina si partimos del estado A:
1) A v ... 0 0 0 0 0 1 0 0 0 0 ... 2) B v ... 0 0 0 1 0 1 0 0 0 0 ... 3) A v ... 0 0 0 1 1 1 0 0 0 0 ... 4) B v ... 0 0 0 1 1 0 0 0 0 0 ... 5) C v ... 0 0 0 1 0 0 0 0 0 0 ... 6) C v ... 0 0 0 0 0 0 0 0 0 0 ... El estado es A y leemos un cero; luego debemos cambiar al estado B, escribir un 1 y movernos a la derecha El estado es B y leemos un cero; luego debemos cambiar al estado A, escribir un 1 y movernos a la derecha El estado es A y leemos un uno; luego debemos cambiar al estado B, escribir un 0 y movernos a la izquierda El estado es B y leemos un uno; luego debemos cambiar al estado C, escribir un 0 y movernos a la izquierda El estado es C y leemos un uno; luego debemos cambiar al estado C, escribir un 0 y movernos a la derecha El estado es C y leemos un cero; luego debemos cambiar al estado A, escribir un 0 y movernos a la izquierda
7)
A v ... 0 0 0 0 0 0 0 0 0 0 ...
El estado es A y leemos un cero; luego debemos cambiar al estado B, escribir un 1 y movernos a la derecha
La ejecucin de esta mquina seguira indefinidamente, rellenando la cinta con unos y ceros de una manera ms o menos aleatoria. Realmente, una mquina de Turing til debera poder detenerse; esto es, tener un estado en el que se detiene. Dicho estado se alcanzara igual que cualquier otro estado. Esto es, supongamos que el estado D es el de paro; lo nico que debemos hacer es que, cuando la mquina halla terminado el clculo, pase a estado D; de este modo se detiene y permite examinar la cinta para buscar el resultado. Vemos que esta mquina no hace gran cosa. Sin embargo, una mquina de Turing puede hacer cosas tiles, tales como sumar dos nmeros, multiplicarlos, copiarlos, etc. Disponiendo de una mquina con el suficiente nmero de estados, podramos hacer con ella cualquier operacin que un ordenador normal pudiese realizar. Las mquinas de Turing plantean una deduccin bastante curiosa: dado que en ellas se puede realizar cualquier trabajo computable, es posible programarlas para que simulen el comportamiento de un potente ordenador. Y como una mquina de Turing puede ser codificada en CUALQUIER ordenador, por pequeo que sea, sera posible (si disponemos de memoria suficiente, claro) emular en nuestro ordenador de casa una mquina de Turing que simule un superordenador. Esto significa que todos los ordenadores pueden realizar exactamente el mismo tipo de tareas, y que los clculos que pueda realizar el ms grande los puede llevar a cabo tambin el ms pequeo. La nica diferencia sera, obviamente, la velocidad.
uno. De este modo tendramos una cadena formada por tantos unos como indica la suma de los dos nmeros originales. Vemoslo con un ejemplo: sumemos tres y cinco: cinta inicial: 0000111011111000 ponemos un cero en el lugar del uno de la izquierda: 0000011011111000 ponemos un uno en el lugar del cero de separacin: 0000011111111000 el resultado: ocho unos, el nmero ocho. Para implementar esto, supondremos que la mquina se encuentra a la izquierda. Empezaremos en el estado A. El estado inicial no tiene por qu ser necesariamente el primero de la lista de estados, pero es costumbre que sea as. De todos modos, si no es el primero, una simple reordenacin del programa resuelve el problema. Dado que el cabezal no tiene por qu estar inmediatamente antes del primer nmero, sino que puede estar ms alejada, debemos asegurarnos de que llega hasta l sin alterar nada. Lo que debemos hacer es que, mientras lea un cero y est en estado A, escriba un cero (as no altera nada), vuelva a estado A, y se mueva una casilla a la derecha. En cuanto llegue al primer nmero, se encontrar un uno que es preciso convertir a cero antes de seguir. Por tanto, si se encuentra en estado A y encuentra un uno, debe escribir un cero y moverse a la derecha para acercarse al cero de separacin. Pero hay que tener en cuenta que, si permaneciese en estado A, como despus del primer uno vienen ms, los pondra todos a cero; por tanto, debemos aadir un nuevo estado: el B. En cuanto encuentre un uno en estado A, deber pasar a este nuevo estado B. Una vez que ha puesto ese uno a cero, debe desplazarse hasta llegar al cero de separacin, pero sin alterar nada; luego, si estando en estado B encuentra un uno, debe poner un uno, moverse a la derecha, y pasar de nuevo a estado B. Pero en cuanto detecte un cero, significa que ha llegado a la separacin, luego si estando en B encuentra un cero, debe ponerlo a uno.
Ahora que la suma est terminada, la mquina debe pararse, pasando al estado correspondiente. Le denominaremos @ (arroba), para distinguirlo de otros posibles estados. En cuanto lo alcanza, la mquina ya no leer ningn smbolo ms ni se desplazar. Veamos el programa de esta mquina de sumar:
0 A B 0,A,> 1,@ 1 0,B,> 1,B,>
E 1,H,< El marcador est a la izquierda 1,F,< Vamos hacia la izquierda de la separacin. Fin de la copia. desde la separacin. F 1,G,> Iniciamos el cambio de lugar del marcador. H ----- Nunca se da esta condicin. No programar o poner un bloque ficticio. I La cadena ya est copiada. la mquina debe detenerse. original. 0,@ 1,F,< Seguimos hasta encontrar el marcador. 0,B,> Terminamos el desplazamiento del marcador y recomenzamos. 1,I,> Nos movemos hasta el inicio de la cadena
J K L
N O
----0,@
0,K,> 1,O,<
El bloque ----- significa que esa condicin nunca puede darse, por lo que se debe dejar sin rellenar o bien poner un bloque ficticio.
LA RUTINA BORRACINTAS
Un programa que, en principio, no pasa de ser una mera curiosidad, es el programa borracintas. Lo nico que hace es colocar la cinta de una mquina de Turing a cero, eliminando todos los posibles unos que pudiese contener. Dado que el nmero de unos existentes no lo podemos conocer a priori, y dado que la cinta es infinita, sta mquina, para que realmente sea eficiente, no podr detenerse nunca. De todos modos, el nmero de unos no puede ser infinito, pues entonces nunca conseguiramos borrar totalmente la cinta (por mucho tiempo que tuvisemos la mquina en funcionamiento, siempre quedaran unos sin borrar). Veamos como disearla. Una posible opcin sera hacer una mquina de un solo estado que, encuentre lo que encuentre, escriba un cero y pase a la casilla siguiente. Su listado sera:
A 0 0,A,> 1 0,A,>
Vemos, sin embargo, que esta mquina no es totalmente efectiva, pues slo elimina los unos que se hallen a la derecha de la posicin de origen. Podramos disear una mquina borracintas que trabaje hacia la izquierda, y usar primero una y luego otra; pero como la cinta es infinita, nunca sabramos cuando podemos parar, pues pueden quedar an unos por eliminar. Por eso debemos disear otra mquina ms verstil que sta. La segunda versin de la mquina borracintas usa dos estados. Se trata de una unin de las dos mquinas borracintas anteriores. Lo que hace es desplazarse en un sentido hasta que encuentra un uno. En cuanto llega a l lo cambia por un cero y se desplaza en el sentido contrario hasta encontrar otro uno, repitiendo el proceso. Su listado sera:
A 0 0,A,> 1 0,B,< B 0 0,B,< 1 0,A,>
Si bien esta mquina es notablemente superior, vemos que puede darse el caso de que haya ms unos hacia el lado derecho de la posicin inicial que hacia el lado izquierdo (no olvidemos que el nmero de unos es finito). Si se diese esta situacin, en cuanto se acabasen los unos en uno de los lados, la mquina se
escapara por l, dejando los del otro lado sin borrar. Por fortuna, en esta vida todo tiene solucin, y este problema no iba a ser menos. Para conseguir eliminar todos los unos, podemos hacer que, cada vez que la mquina encuentre uno, lo ponga a cero, coloque un uno en la siguiente posicin, e invierta su sentido. De este modo, los nuevos unos se comportarn como barreras. Cada vez que la mquina llega a una, la desplaza una posicin e invierte su sentido. De este modo, la mquina siempre recorrer por igual los dos sentidos. Una precaucin consiste en colocar al principio dos unos seguidos, pues puede ocurrir que en uno de los dos sentidos no haya unos, y la mquina se pierda. De este modo, al colocar esos dos unos, inicializamos las barreras. A cada vuelta, las barreras se irn ensanchando ms. Cuando una barrera se pone encima de un uno, lo anula, de modo que al siguiente paso del cabezal quedar eliminado. El programa puede ser el siguiente:
A B C 0 1,B,> 1,C,< 0,C,< 1 1,B,> 1,C,< 0,D,< D E F 0 1,E,> 0,E,> 1,C,< 1 1,E,> 0,F,> 1,C,<
Los estados A y B sirven para inicializar las dos barreras. El cdigo del programa empieza en C, desplazndose hacia la izquierda hasta encontrar un uno, momento en que lo cambia por un cero y pasa al estado D, que pone un uno una posicin ms hacia la izquierda e inicia el desplazamiento hacia la derecha, pasando al estado E. En el, el cabezal se desplaza hacia la derecha hasta encontrar un uno, cambindolo por un cero y pasando al estado F en la siguiente casilla. En este estado, se pone un uno y se comienza el desplazamiento hacia la izquierda, volviendo al estado C y cerrando el bucle.
Se sabe el mximo de unos para las mquinas de 1,2,3 y 4 estados, que son 1, 4 , 6 y 13 unos, respectivamente. Para ms estados, el nmero exacto no se puede determinar. Vamos a ver los programas de algunos castores afanosos:
Una vez puesta en marcha, parece seguir un curso cclico, a medida que va aumentando el nmero de unos de la cinta. De hecho, parece que nunca se va a detener; sin embargo, como castorcito afanoso que es, se detiene una vez cumplida su misin: imprimir 501 unos.
Pero... como (casi) siempre ha ocurrido en la historia de la computacin, ante una solucin a un problema, siempre existe otra que es, o mejor, o ms simple. Dos aos despus, el 21 de diciembre de 1984, George Uhing descubri una mquina de Turing pentaestado capaz de imprimir 1915 unos antes de detenerse. Como es lgico, el programa de Uwe Schult qued sin el ttulo de castor, otorgndoselo al nuevo algoritmo. Me hubiera gustado poder incluir su listado, pero no he tenido manera de encontrarlo. Y as sigue la cosa. Posiblemente algn da aparecer una nueva mquina de Turing pentaestado capaz de imprimir un nmero mayor de unos, proclamndose nueva campeona. Quien puede predecir cual ser el lmite de estos ingenios?