Está en la página 1de 14

Las mquinas de Turing

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.

ALAN M. TURING BIOGRAFIA


Alan Mathison Turing naci en 1912, y muy pronto mostr una extraordinaria intuicin cientfica. Mientras su padre se hallaba en Madrs, trabajando para el Indian Civil Service, Turing gan numerosos premios escolares, y ms tarde una beca que le llevara al King's College de Cambridge. Fue aqu cuando empez a interesarse seriamente por los problemas de lgica matemtica. En 1931, el matemtico checo Kurt Godel descubri que haba teoremas matemticos que eran verdaderos an cuando no se pudiesen probar. Ante esto, Alan Turing se puso a investigar aquellos que s podan ser probados. Quera intentar demostrar la vieja idea de que las matemticas no son un arte misterioso, sino una ciencia exacta regida por reglas lgicas. Para hacerlo, ide una mquina imaginaria capaz de realizar de manera totalmente mecnica los procesos que normalmente llevara a cabo un matemtico. Haba una mquina para cada proceso; as, haba una mquina que sumaba, otra que multiplicaba, etc. Estas mquinas acabaran por recibir el nombre de "Mquinas de Turing". Bsicamente, lo que quera era hacer una lista de los problemas que una mquina sera capaz de resolver siguiendo reglas lgicas. Si esta lista abarcaba todos los problemas matemticos, entonces su tesis quedara demostrada, y con ella la teora de la computabilidad. Tras estudiar con detenimiento el funcionamiento de sus mquinas, concluy que era posible disear un artilugio nico capaz de cumplir las funciones de cualquier otra mquina de Turing. A sta se le llam la "Mquina Universal 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.

USO DEL SIMULADOR


Acompaando a este artculo va un simulador de mquina de Turing. Por razones de transportabilidad entre distintos modelos de ordenadores, est escrito integramente en BASIC, a pesar de lo cual mantiene una velocidad perfectamente adecuada. Para usarlo, es necesario usar el editor QBASIC de Microsoft o el compilador QUICKBASIC, de la misma casa. Al arrancar el programa, la pantalla se llenar de ceros, mientras en la parte inferior de la pantalla aparece el mensaje "IMPRIMIENDO CINTA". Esa lnea es la zona de mensajes. Los ceros son la presentacin de la cinta de la mquina en pantalla. A continuacin aparece un men con las siguientes opciones: LIMPIAR LA CINTA: Borra todos los unos impresos en la cinta, dejndola rellena de ceros. ACTUALIZAR LA CINTA: Sirve para colocar unos en las zonas que nos interesen, para definir una situacin inicial para la mquina. Los controles son los siguientes:

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.

QUE SON Y COMO FUNCIONAN?


Una mquina de Turing consiste, bsicamente, en una cinta infinita, dividida en casillas. Sobre esta cinta hay un dispositivo capaz de desplazarse a lo largo de ella a razn de una casilla cada vez. Este dispositivo cuenta con un cabezal capaz de leer un smbolo escrito en la cinta, o de borrar el existente e imprimir uno nuevo en su lugar. Por ltimo, contiene adems un registro capaz de almacenar un estado cualquiera, el cual viene definido por un smbolo. Los smbolos que definen el estado del dispositivo no tienen por que coincidir con los smbolos que se pueden leer o escribir en la cinta. En los programas presentados en el artculo, los posibles smbolos a leer o escribir en la cinta son el 0 y el 1, y los posibles estados se representan con letras maysculas. En el emulador, existe un cambio en la representacin del estado, usando para ello los nmeros del 0 al 99, para permitir un mayor nmero de ellos. La mquina tiene un funcionamiento totalmente mecnico y secuencial. Lo que hace es leer el smbolo que hay en la casilla que tiene debajo. Despus toma el smbolo del estado en que se encuentra. Con estos dos datos accede a una tabla, en la cual lee el smbolo que debe escribir en la cinta, el nuevo estado al que debe pasar y si debe desplazarse a la casilla izquierda o derecha. Para comprender mejor, vamos a ver un simple ejemplo: sea la mquina de Turing capaz de leer o escribir los smbolos 0 y 1 en la cinta (en la definicin original de Turing, el nmero de smbolos a usar poda ser cualquiera, con la nica condicin de ser un nmero finito, y no tenan por qu ser nmeros; sin embargo, en aplicaciones prcticas se suelen limitar a estos dos), y que puede tener los estados A, B y C (una mquina de Turing puede tener cualquier nmero de estados; la nica condicin es que sea un nmero finito). Supongamos que definimos la siguiente tabla:
estado inicial smbolo ledo nuevo estado nuevo smbolo sentido de avance

A A B B C C

0 1 0 1 0 1

B B A C A C

1 0 1 0 0 0

DERECHA IZQUIERDA DERECHA DERECHA IZQUIERDA DERECHA

La cual vamos a simplificar de la siguiente manera:


0 A B C B,1,> A,1,> A,0,< 1 B,0,< C,0,> C,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.

SUMA DE DOS NUMEROS


Una de las tareas ms simples que puede llevar a cabo una mquina de Turing es la suma de dos nmeros. Para ello debemos definir primero una convencin para representar dichos nmeros en la cinta. En principio, podramos pensar que, al usar los smbolos 0 y 1, podemos representar los nmeros directamente en binario; sin embargo, la cantidad de operaciones necesarias para trabajar con ellos hace que el nmero de estados de la mquina sumadora crezca sorprendentemente, debido a que es un sistema de numeracin posicional. Para simplificar el proceso, vamos a representar cada nmero por una cadena con tantos unos como indique dicho nmero; as, para representar el tres, escribiramos tres unos seguidos; para un cinco, cinco unos. Veamos como podemos sumarlos. Si tenemos dos nmeros en una cinta, separados uno de otro por un cero, la forma ms fcil de sumarlos sera convertir uno de los unos de los extremos en cero, y cambiar el cero de separacin por un

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,>

COPIA DE UNA CADENA DE UNOS A CONTINUACION DE ELLA MISMA


Puede ser til para algunas aplicaciones obtener una copia de un nmero a continuacin de l mismo, bien sea como parte del proceso, bien porque ste lo modifica y queremos mantener el original inalterado. Una posibilidad para copiar una cadena de N unos es usar una mquina de N estados; sin embargo, esto hace aumentar su nmero de manera poco menos que incontrolable; por eso nos conviene hallar un sistema que no consuma tantos estados, y, sobre todo, que funcione para cualquier cadena, no solo para las de longitud N. Una de las maneras ms cmodas es usar un cero como contador. Esto es: colocamos un cero en lugar del primer uno de la cadena, nos desplazamos hasta el final de ella, colocamos un uno, y volvemos hasta donde est el cero. Lo cambiamos a un uno, pasamos a la siguiente casilla, ponemos un cero y repetimos el proceso. De este modo, el cero se ir corriendo a lo largo de la cadena original, y cada vez que se desplace una posicin, aparecer un nuevo uno al final de la cadena copiada. La mquina se detendr en cuanto intente poner un cero en el lugar que ocupe otro cero en vez de un uno, pues significar que ha llegado al cero de separacin de la cadena original y la cadena copia. Veamos un programa que cumple lo expuesto, comentado:
0 1 A 0,A,> Nos movemos hacia la derecha 0,B,> Ponemos un cero en el hasta el principio de la cadena. primer uno de la cadena. B 0,C,> Vamos a la derecha, a travs de 1,B,> Vamos desde el marcador la separacin entre cadenas. hasta la separacin. C 1,D,< Ponemos un uno en el extremo de la cadena copia. 1,C,> Vamos hacia la derecha de la cadena copia.

D 0,E,< Vamos hacia la izquierda desde la separacin.

1,D,< Vamos hacia la izquierda por la copia.

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

PRODUCTO DE DOS NUMEROS


Vamos a aprovecharnos de la rutina de copia para hacer una rutina de multiplicacin. Si analizamos el producto de dos nmeros, vemos que se trata simplemente de sumar el primero a s mismo tantas veces como indica el segundo. Y como trabajando con nuestro particular sistema de numeracin, la suma no es ms que unir dos cadenas, vemos que esta es una tarea perfecta para nuestra rutina de copiado. La manera de hacerlo es muy simple: debido a una casualidad totalmente intencionada :-) , si hay dos nmeros seguidos (con el cero de separacin entre ellos, claro) y mandamos a nuestra rutina que copie el primero (el de ms a la izquierda, en nuestro caso), lo har a continuacin del segundo, pero sin separarlo; en otras palabras, habr sumado al segundo una copia del primero. De este modo, si activamos la rutina de copia sobre el segundo nmero a multiplicar, tantas veces como indique el primero, lo que haremos ser sumar el segundo nmero a s mismo tantas veces como indique el primero. Los habremos multiplicado. Para que la rutina de copia se active tantas veces como indica el primer nmero, haremos un contador con un cero, de la misma manera que hicimos en la propia rutina de copia. As de fcil. Veamos un programa de mquina de Turing que lo hace. Los estados de la A a la H son los mismos que los de la rutina de copia, para ahorrar espacio en el artculo. Esto significa que la mquina no se debe poner en marcha en el estado A, sino en el estado J.
I 0 0,L,< 1 1,I,< M 0 1,N,> 1 1,M,<

J K L

0,J,> 0,A,> 1,O,<

0,K,> 1,K,> 1,M,<

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.

LOS CASTORES AFANOSOS


El problema del castor afanoso es uno de los ms interesantes, trabajando con mquinas de Turing. Un castor afanoso es, simplemente, una mquina de Turing de N estados, la cual, una vez puesta en marcha sobre una cinta totalmente a cero, imprime ms unos que cualquier otra mquina de Turing de N estados. Adems de esto, debe cumplir la condicin de detenerse tras haber impreso la serie de unos. No es indispensable que los unos estn seguidos en la cinta; puede haber ceros de separacin entre ellos. Tal vez alguien piense que es un problema trivial; sin embargo, es la base de la teora de la computabilidad de una funcin. Precisamente, el mximo nmero de unos que puede imprimir una mquina de Turing de N estados es una funcin no computable; es decir, si queremos hacer un castor afanoso de N estados, no podemos saber, a priori, cual es el nmero de unos que imprimir.

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:

CASTOR AFANOSO DE 1 ESTADO:


A 0 1,@ 1 1,@

CASTOR AFANOSO DE 2 ESTADOS:


A B 0 1,B,> 1,A,< 1 1,B,< 1,@

CASTOR AFANOSO DE 3 ESTADOS:


A B C 0 1,B,> 1,A,< 1,B,< 1 1,C,< 1,B,> 1,@

EL PROBLEMA DEL CASTOR AFANOSO DE 5 ESTADOS:


Para intentar resolver el problema del castor afanoso de cinco estados, en 1982 se anunci un concurso. Para participar, haba que presentar un castor afanoso pentaestado, y ganara el que ms unos fuese capaz de imprimir antes de detenerse. El vencedor del concurso, celebrado en enero de 1983, fue la mquina presentada por Uwe Schult, la cual fue capaz de imprimir 501 unos en la cinta. Su programa es el siguiente:
A B C 0 1,B,> 1,C,> 1,A,< 1 0,C,< 1,D,> 0,B,> D E 0 0,E,> 1,C,< 1 1,@ 1,A,>

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?

También podría gustarte