Está en la página 1de 13

UNIVERSIDAD FERMIN TORO

DEPARTAMENTO DE MATEMÁTICAS
ESTRUCTURAS DISCRETAS II
ING. MSC. ADRIANA BARRETO

MAQUINAS DE ESTADO FINITO

1. Máquinas de Estado Finito.

Una máquina de estado finito es una máquina abstracta que reconoce cadenas de
caracteres dando una respuesta de “SÍ” o “NO” basada en las transiciones entre “estados” de la
máquina, las transiciones se escogen en base al siguiente carácter de la cadena.

ALGORITMO

a. Comenzar en el “estado inicial” y en el primer carácter de la cadena a analizar;

Repetir:

b. Transición al estado siguiente escogiendo el arco saliente etiquetado con ese carácter;

c. Pasar al siguiente carácter de la cadena;

Hasta que la cadena esté vacía o no haya transición aplicable;

d. Si la cadena está vacía Y el estado actual es un estado final devuelve “SI”

en otro caso devuelve “NO”.

2. Componentes

Estado del proceso

Transición entre estados controlada por el reconocimiento de un carácter concreto

Estado inicial

Estado final

Podemos representar también el “programa” para una máquina de estado finito en una tabla:

Cada fila en la tabla FSM tiene que ser distinta en sus dos primeras columnas para que la máquina
sea DETERMINISTA.

A medida que prosigue el proceso de reconocimiento se puede listar las transiciones que se
ejecutan listando cada fila de la tabla de transiciones.

Ejercicio.
Diseña una FSM, dando su representación gráfica y su tabla para reconocer cadenas binarias que
comiencen y terminen con “0” y contengan al menos un par de “1,s” adyacentes. Es decir cadenas
como: “0110” (la más corta) ó “0000111110”. Para esta última cadena escribe la lista de estados
de transición utilizados para el proceso de reconocimiento completo.

Para comprobar tu diseño puedes emplear la emulación de una FSM construida por un
estudiante en Inglaterra:

http://www.belgarath.demon.co.uk/java/fsme.html
2. Máquinas Equivalentes.

Sean las Máquinas Determinísticas A1=(å, Q1, f1, q01, F1) y A2=(å, Q2, f2, q02, F2),
Decimos que las dos máquinas son equivalentes si reconocen el mismo lenguaje. Es decir: si
f(q01,x)Î F1Ûf(q02,x)ÎF2, para todo xÎå*. Dicho de otro modo, decimos que dos máquinas son
equivalentes si sus estados iniciales los son: q01Eq02.

Teorema.- Sean dos MD A1=(å, Q1, f1, q01, F1) y A2=(å, Q2, f2, q02, F2), tales que Q1 y Q2 no
tienen estados comunes y |Q1|=n1 y |Q2|=n2. Entonces, A1 y A2 son equivalentes si q01 yq02 son
equivalentes en la máquina A=A1+A2, es decir, si ambas máquinas aceptan las mismas palabras de
longitud menor que n1+n2-1. Además, en general, n1+n2-2 es el valor más pequeño que cumple
siempre este teorema.

ALGORITMO PARA VER SI DOS MÁQUINAS SON EQUIVALENTES.

Calcular la suma directa de máquinas


Construir PE del máquina suma obtenido
Comprobar que los estados iniciales son equivalentes, es decir, están en la misma clase de
equivalencia. Cuando se da la condición: p01, p02 Î C0 Þ A1 y A2 son equivalentes.

Ejemplo:
El máquina suma dará:

fÅ a b
®q1 q2 q1
*q2 q3 q1
*q3 q2 q1
q4 q1 q1
p1 p2 p1
*p2 p2 p1
p3 p2 p1

P0={{q1, q4, p1, p3}, {q2, q3, p2}}


P1={{ q1, p1, p3}, { q4},{q2, q3, p2}}
P2={{ q1, p1, p3}, { q4},{q2, q3, p2}}
luego P1= P2 =PE
Por otro lado, diremos que dos clases de máquinas y son equivalentes si toda
máquina en una clase es simulada por una máquina en la otra, es decir,

 y


donde c y d son funciones apropiadas de conversión de palabras de un alfabeto a otro,

considerando los alfabetos de ambas máquinas, que cumplen además . Máquinas


con cintas semi-infinitas, : Estas son máquinas de Turing donde las casillas de la cinta se
ponen en correspondencia con mas no con , es decir, la cinta de cada máquina de esta clase
tiene una casilla inicial a la izquierda, digamos c0, y se prolonga indefinidamente a la derecha.

Proposición 6.1 y son equivalentes.


En efecto, por un lado, tenemos que toda máquina es en sí del tipo .

Recíprocamente, enumeremos las casillas de la cinta semi-infinita C como Dada


una máquina M del tipo enumeremos a las casillas de la cinta de M como

Pongamos un símbolo especial S en c0 e identifiquemos al


sector ``negativo'' de la cinta de M con las casillas impares de C y al ``no-negativo'' de M con las
casillas pares de C:

Observamos que el movimiento hacia una casilla contigua en la cinta de M se traduce a dos
movimientos contiguos en C. Cada vez que se ``atraviesa'' S en C se cambia de sentido: Un
movimiento a la derecha en M corresponde a dos hacia la izquierda en C y viceversa. Hechas estas
observaciones, de manera directa se puede simular a M usando C. Máquinas con cintas de varias
pistas, : Estas son máquinas de Turing cuyas cintas tienen varias ``pistas''. Pueden verse
también como máquinas de varias cintas con movimientos ``sincronizados'': Movimiento que se
hace en una cinta, se hace en todas.

Proposición y son equivalentes.


En efecto, por un lado, tenemos que toda máquina es en sí del tipo .
Recíprocamente, dada una máquina Mk del tipo con k pistas, la podemos simular con una
máquina M del tipo de cualquiera de las dos maneras alternativas:
1.
Si A es el alfabeto de Mk, entonces en cada momento el funcionamiento de Mk depende de
la lista de k símbolos que aparece en la casilla actual, consistente de k casillas, una por
cada pista. Esto define a una máquina del del tipo sobre el alfabeto Ak que es una
potencia cartesiana del original.

2.
Consideremos una cinta de una sola pista en donde sus casillas se agrupan en bloques de
k casillas. La posición j-ésima de la i-ésima pista en la cinta de Mk corresponde a la posición

-ésima de la nueva cinta. En esta nueva, casillas contiguas en lamisma


pista de Mk distanciarán de k casillas. El mecanismo de funcionamiento se modifica para
que cada movimiento de Mk obligue a revisar un bloque de k casillas y haga la modificación
correspondiente, trabajando siempre en bloques.

Máquinas con cintas de varias cintas , : Estas son máquinas de Turing con varias cintas
con movimientos ``independientes''.
Proposición y son equivalentes.
Demostraremos que y son equivalentes. En efecto, por un lado, tenemos que
toda máquina es en sí del tipo . Recíprocamente, dada una máquina del
tipo con k pistas, la podemos simular con una máquina del tipo , con 2k
pistas como sigue: Cada cinta Cj da origen a dos pistas Pj0,Pj1. La pista Pj1 tiene el mismo contenido
que la cinta Cj. La pista Pj0 está en blanco salvo en la posición donde se encuentra la j-ésima cabeza

lectora de , en la cual hay una marca `` '' para marcar que ésa es la casilla escudriñada en
la j-ésima cinta. Con esto, la máquina se construye de manera inmediata. Máquinas con dos
símbolos, : Estas son máquinas de Turing sobre el alfabeto (0+1).

Proposición y son equivalentes.


En efecto, por un lado, tenemos que toda máquina es en sí del tipo .
Recíprocamente, dada una máquina M del tipo sobre un alfabeto con m símbolos, sea

. Cada símbolo en el alfabeto puede codificarse mediante una cadena de k bits. Por
tanto M puede verse como una m''aquina de k pistas. De acuerdo con la segunda construcción de
la máquina del tipo simuladora de una máquina del tipo , obtenemos una máquina
del tipo que simula a M.

3. Estados equivalentes. (Relaciones entre los estados de dos máquinas).

Sea la máquina determinista (å, Q, f, q0, F). Decimos que dos estados p,qÎQ son
equivalentes (se representa por pEq) si para toda palabra xÎå*, se verifica que f(p,x)ÎFÛf(q,x)ÎF.

Nota: Si pEq entonces pEnq, para todo n.

Propiedades de la equivalencia de estados .

Dado AF=(å, Q, f, q0, F), con p,qÎQ , pEq si "xÎå* ® f(p,x)ÎFÛ f(q,x)ÎF
pEkq (p y q son k-equivalentes) si: "xÎå* | |x|<=k ® f(p,x)ÎFÛ f(q,x)ÎF
Ambas relaciones de equivalencia E y Ek inducen una partición de equivalencia sobre el
máquina finito. Es decir: E induce PE, y Ek induce Pk.

La primera partición que se establece es P0, se hace con: p E0q Û( pÎFÛ qÎF). Nota: Entonces
P0={(Q-F),F}

Ek,si pEkq Þ pEvq " v<k; si pEq Þ "k pEkq.

LEMA1 (propiedad de estados)


Si pEk+1q Þ pEkq y f(p,a)Ekf(q,a) "aÎå

LEMA2.
Pk=Pk+1 Þ Pk= PE
LEMA3 (Se va a establecer cuando se estabiliza el valor de la partición)
Si |Q| = n >1 Þ pEnq Û pEn-2q

Es decir, n-2 es el grado de equivalencia menor al que habría que llegar para conseguir confirmar la
equivalencia de dos estados en un máquina con n estados.
TEOREMA
Si |Q|=n>1 Þ $j<=n-2 | Pj= Pj+1

Algoritmo para construir PE.

P0={{qiÏF},{ qiÎF}}
Pn+1={ pEn+1q Û pEnq y f(p,a)Enf(q,a) "aÎå}
Pn =Pn+1 =PE
Ejemplo :

Para hallar las partes de equivalencia del máquina primero debemos partir de un máquina
finito conexo. Para ello vamos a eliminar q4, ya que no es posible acceder a él desde el estado
inicial (q1). Ahora vamos a establecer las partes de equivalencia:

®P0={Q-F, F}={{q1}, {q2, q3}}

Ahora hacemos P1, para ello sabemos que {q1} va a seguir igual, es decir, va a ser
equivalente con sigo mismo, puesto que accede a los mismo estados(finales o no finales).

Miramos {q2, q3} y comprobamos si acceden al mismo tipo de estado para las mismas
entradas, es decir, sabiendo que q2 E0 q3 vamos a ver si q2 E1 q3:
f(q2,a)=q3ÎF f(q2,b)=q1ÏF
f(q3,a)=q2ÎF f(q3,b)=q1ÏF
luego q2 E1 q3.
P1={{q1}, {q2, q3}}= P0= PE

Algoritmo para hallar el máquina mínimo de uno dado


Calcular el máquina conexo
Construir Q/E del máquina conexo obtenido en el punto anterior.
Calcular A?=(å,Q/E,f?,C0,F?), donde:
a. C0 es la clase donde se encuentra q0 ;
b. F?={c | c contiene al menos un estado de F(es decir, existe un qÎF, tal que qÎc)};
c. f?: Q/E x å ® Q/E, donde
f?(ci, a)= cj Û $ qi Î ci y $ qj Î cj | f(qi,a)=qj

Ejemplo:

Es un máquina conexo, pues todos sus estados son accesibles, vamos a hallar las partes de
equivalencia:
P0={{s,t,u,v},{p,q,r}} (={Q-F,F})
miramos la equivalencia de las clases de equivalencia establecidas en P0.
f(p,a) = pÎF; f(p,b)= qÎF;
f(q,a)= rÎF; f(q,b)=pÎF;
f(r,a)= rÎF; f(r,b)=rÎF;
aqui vemos que {p,q,r} se conserva pues tienen iguales transiciones a estados finales a
partir de las entradas.
f(s,a)=tÏF; f(s,b)=pÎF
f(t,a)=tÏF; f(t,b)=uÏF
f(u,a)=tÏF; f(u,b)=vÏF
f(v,a)=vÏF; f(v,b)=uÏF
ahora vemos que mientras t,u,v tienen iguales transiciones a estados no finales para
las mismas entradas, siguen siendo equivalentes, mientras que s para b transita a un
estado final, ya será equivalente a los tres estados anteriores:

P1={{p,q,r},{s},{t,u,v}}
Ahora hallamos P2:
f(p,a) = pÎF; f(p,b)= qÎF;
f(q,a)= rÎF; f(q,b)=pÎF;
f(r,a)= rÎF; f(r,b)=rÎF;
f(t,a)=tÏF; f(t,b)=uÏF
f(u,a)=tÏF; f(u,b)=vÏF
f(v,a)=vÏF; f(v,b)=uÏF
P2= {{p,q,r},{s},{t,u,v}} = P1
luego PE= {{p,q,r},{s},{t,u,v}}

El máquina mínimo nos va a quedar:

Si nos pidieran el lenguaje de máquina: L(A)=L(A?)={b(a+b)*}, (donde A es el máquina inicial,


y A? es la máquina mínimo).

4. Isomorfismo de Máquinas.

Se dice que A1 es isomorfo a A2, es decir, A1»A2 si $ i :Q1®Q2, (i : imagen). Por lo tanto :
i(p01) = p02 (la imagen del estado inicial de A1 es el estado inicial de A2.

Dados pÎF1, qÎF2 : i(p)ÎF2, y i(q)ÎF1.(es decir, la imagen de los estados finales de uno de los
máquinas, es un estado final del otro máquina).

i(f1(p1,e)) = f2(i(p1),e) = f2(i(p2),e).La imagen de la transición es la transición de la


imagen. Por lo tanto A1 y A2 son iguales renombrando estados.

Entonces si dos máquinas son isomorfos van a ser equivalentes, es decir, los lenguajes que
van a generar ambos máquinas van a ser el mismo : L(A1) = L(A2). Con esto comprobamos
que la isomorfía implica la equivalencia.

Teorema : Si dos máquinas son equivalentes, entonces sus máquinas mínimos son isomorfos,
es decir : A1EA2 Þ Â1»Â2 (siendo  i º máquina mínimo de Ai).

5. Proceso de Minimización de estados de una máquina.


Como una mera aplicación de las conversiones introducidas, presentamos aquí
procedimientos para obtener ``redes mínimas'' que especifican máquinas equivalentes a las

codificads por los métodos de la sección anterior. Sea una

máquina de estados finitos, con nQ estados, símbolos de entrada y símbolos de salida.

Sea la red de Petri que la representa. Según se vió, esta red puede describirse por la lista
de (transiciones-lugares-transiciones) siguiente:

Continuando con la notación algebraica, para cada estado podemos escribir

donde es el conjunto de estados que bajo la entrada e arriban al

estado q, y para cada símbolo de salida escribamos

donde es el conjunto de estados que bajo la entrada e dan respuesta

s. Cada uno de los conjuntos en la colección es un


candidato para formar un supralugar en la red minimizada. Digamos que un conjunto de estados

es congruente bajo la transición si

y es congruente bajo la función de respuesta si

Estas nociones son decidibles. De hecho, dado un conjunto de estados, entonces probando
cada uno de los símbolos de entrada se decide si acaso ese conjunto es congruente ya sea por
transiciones o por respuestas. Los elementos de son congruentes por la transición o por la
respuesta. En el procedimiento de minimización se trata de reconocer el subrecubrimiento
formado por los subconjuntos más grandes de conjuntos en tales que los elementos en sean a
la vez congruentes por transición y por respuesta. En tal caso, la red consistente de los lugares-
entradas y de los lugares-salidas anteriores más lugares correspondientes a elementos de con
las transiciones evidentes:

El algoritmo de minimización revisa cada uno de los conjuntos de estados correspondientes a


transiciones de estados y de respuestas y revisa si son congruentes o no. En caso afirmativo, hace
la síntesis apropiada. En cada síntesis se procede recursivamente para proseguir con todas las
síntesis posibles.
6. Las Máquinas de Turing.
Actualmente existen gran cantidad de ordenadores, capaces de realizar sorprendentes
funciones. Todos ellos, sin embargo, están basados en un simplísimo artilugio imaginario capaz de
hacer cualquier operación matemática computable; esto es, que se pueda realizar de una forma
totalmente mecánica. Son las máquinas de Turing.

ALAN M. TURING
BIOGRAFIA
Alan Mathison Turing nació en 1912, y muy pronto mostró una extraordinaria intuición
científica.
Mientras su padre se hallaba en Madrás, trabajando para el Indian Civil Service, Turing
ganó numerosos premios escolares, y más tarde una beca que le llevaría al King's College de
Cambridge. Fue aquí cuando empezó a interesarse seriamente por los problemas de lógica
matemática.
En 1931, el matemático checo Kurt Godel descubrió que había teoremas matemáticos que
eran verdaderos aún cuando no se pudiesen probar. Ante esto, Alan Turing se puso a investigar
aquellos que sí podían ser probados. Quería intentar demostrar la vieja idea de que las
matemáticas no son un arte misterioso, sino una ciencia exacta regida por reglas lógicas.
Para hacerlo, ideó una máquina imaginaria capaz de realizar de manera totalmente mecánica los
procesos que normalmente llevaría a cabo un matemático. Había una máquina para cada proceso;
así, había una máquina que sumaba, otra que multiplicaba, etc. Estas máquinas acabarían por
recibir el nombre de "Máquinas de Turing". Básicamente, lo que quería era hacer una lista de los
problemas que una máquina sería capaz de resolver siguiendo reglas lógicas. Si esta lista abarcaba
todos los problemas matemáticos, entonces su tesis quedaría demostrada, y con ella la teoría de la
computabilidad.
Tras estudiar con detenimiento el funcionamiento de sus máquinas, concluyó que era
posible diseñar un artilugio único capaz de cumplir las funciones de cualquier otra máquina de
Turing. A ésta se le llamó la "Máquina Universal de Turing".
Al estallar la Segunda Guerra Mundial, Turing fue alejado del mundo académico y reclutado
por la Escuela de Códigos y Cifrados del gobierno británico. Las actividades que realizaba consistían
de manera primordial en descifrar el código militar alemán ENIGMA. Para ello desarrolló el invento
más secreto de dicha guerra: el Colossus, primer ordenador electromecánico del mundo. Más
adelante, sería destinado a los Estados Unidos con el fin de crear unos códigos seguros para las
comunicaciones transatlánticas entre los países aliados.

Acabada la guerra, Turing colaboró en la construcción del ENIAC. Posteriormente recibió el


encargo de empezar a trabajar en la construcción de un ordenador totalmente británico, destinado
al National Physical Laboratory, y que recibiría el nombre de ACE (Automatic Computing Engine).
Esta máquina tardó mucho tiempo en ser construida, pero era superior a ENIAC en muchas
características. 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
compañía Ferranti y, por tanto, colaboró en la construcción de los primeros ordenadores fabricados
en Gran Bretaña.
En 1952, Turing fue acusado de homosexualidad, y dos años más tarde se suicidó.

6.1. ¿Qué son y cómo funcionan?

Una máquina de Turing consiste, básicamente, en una cinta infinita, dividida en casillas.
Sobre esta cinta hay un dispositivo capaz de desplazarse a lo largo de ella a razón de una casilla
cada vez. Este dispositivo cuenta con un cabezal capaz de leer un símbolo escrito en la cinta, o de
borrar el existente e imprimir uno nuevo en su lugar. Por último, contiene además un registro capaz
de almacenar un estado cualquiera, el cual viene definido por un símbolo. Los símbolos que definen
el estado del dispositivo no tienen por que coincidir con los símbolos que se pueden leer o escribir
en la cinta. En los programas presentados en el artículo, los posibles símbolos a leer o escribir en la
cinta son el 0 y el 1, y los posibles estados se representan con letras mayúsculas. En el emulador,
existe un cambio en la representación del estado, usando para ello los números del 0 al 99, para
permitir un mayor número de ellos.

La máquina tiene un funcionamiento totalmente mecánico y secuencial. Lo que hace es leer


el símbolo que hay en la casilla que tiene debajo. Después toma el símbolo del estado en que se
encuentra. Con estos dos datos accede a una tabla, en la cual lee el símbolo 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 máquina de Turing capaz de leer o
escribir los símbolos 0 y 1 en la cinta (en la definición original de Turing, el número de símbolos a
usar podía ser cualquiera, con la única condición de ser un número finito, y no tenían por qué ser
números; sin embargo, en aplicaciones prácticas se suelen limitar a estos dos), y que puede tener
los estados A, B y C (una máquina de Turing puede tener cualquier número de estados; la única
condición es que sea un número finito). Supongamos que definimos la siguiente tabla:
estado símbolo nuevo nuevo sentido de
inicial leído estado símbolo avance
A 0 B 1 DERECHA
A 1 B 0 IZQUIERDA
B 0 A 1 DERECHA
B 1 C 0 DERECHA
C 0 A 0 IZQUIERDA
C 1 C 0 DERECHA

La cual vamos a simplificar de la siguiente manera:


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

Hemos puesto los posibles estados en columna, y los posible símbolos en fila, y hemos expresado
el nuevo estado, símbolo y sentido todo junto. El sentido lo expresamos con la dirección en la que
apunta el símbolo < o >.

Vamos a poner nuestra máquina sobre esta cinta:

cabezal
v
... 0 0 0 0 0 1 0 0 0 0 ...
Indicaremos el estado actual de la máquina encima del cabezal. Veamos los sucesivos pasos de
esta máquina si partimos del estado A:
1) A El estado es A y leemos un cero;
v luego debemos cambiar al estado B,
... 0 0 0 0 0 1 0 0 0 0 ... escribir un 1 y movernos a la derecha
2) B El estado es B y leemos un cero;
v luego debemos cambiar al estado A,
... 0 0 0 1 0 1 0 0 0 0 ... escribir un 1 y movernos a la derecha
3) A El estado es A y leemos un uno;
v luego debemos cambiar al estado B,
... 0 0 0 1 1 1 0 0 0 0 ... escribir un 0 y movernos a la izquierda
4) B El estado es B y leemos un uno;
v luego debemos cambiar al estado C,
... 0 0 0 1 1 0 0 0 0 0 ... escribir un 0 y movernos a la izquierda
5) C El estado es C y leemos un uno;
v luego debemos cambiar al estado C,

... 0 0 0 1 0 0 0 0 0 0 ... escribir un 0 y movernos a la derecha


6) C El estado es C y leemos un cero;
v luego debemos cambiar al estado A,
... 0 0 0 0 0 0 0 0 0 0 ... escribir un 0 y movernos a la izquierda
7) A El estado es A y leemos un cero;
v luego debemos cambiar al estado B,

... 0 0 0 0 0 0 0 0 0 0 ... escribir un 1 y movernos a la derecha


La ejecución de esta máquina seguiría indefinidamente, rellenando la cinta con unos y
ceros de una manera más o menos aleatoria. Realmente, una máquina de Turing útil debería poder
detenerse; esto es, tener un estado en el que se detiene. Dicho estado se alcanzaría 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 máquina halla terminado el cálculo, pase a estado D; de este modo se
detiene y permite examinar la cinta para buscar el resultado.
Vemos que esta máquina no hace gran cosa. Sin embargo, una máquina de Turing puede
hacer cosas útiles, tales como sumar dos números, multiplicarlos, copiarlos, etc. Disponiendo de
una máquina con el suficiente número de estados, podríamos hacer con ella cualquier operación
que un ordenador normal pudiese realizar.

Las máquinas de Turing plantean una deducción 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 máquina de Turing puede ser codificada en CUALQUIER
ordenador, por pequeño que sea, sería posible (si disponemos de memoria suficiente, claro) emular
en nuestro ordenador de casa una máquina de Turing que simule un superordenador. Esto significa
que todos los ordenadores pueden realizar exactamente el mismo tipo de tareas, y que los cálculos
que pueda realizar el más grande los puede llevar a cabo también el más pequeño. La única
diferencia sería, obviamente, la velocidad.

Ejemplos:

a. SUMA DE DOS NUMEROS

Una de las tareas más simples que puede llevar a cabo una máquina de Turing es la suma
de dos números. Para ello debemos definir primero una convención para representar dichos
números en la cinta. En principio, podríamos pensar que, al usar los símbolos 0 y 1, podemos
representar los números directamente en binario; sin embargo, la cantidad de operaciones
necesarias para trabajar con ellos hace que el número de estados de la máquina sumadora crezca
sorprendentemente, debido a que es un sistema de numeración posicional.
Para simplificar el proceso, vamos a representar cada número por una cadena con tantos
unos como indique dicho número; así, para representar el tres, escribiríamos tres unos seguidos;
para un cinco, cinco unos.
Veamos como podemos sumarlos. Si tenemos dos números en una cinta, separados uno de
otro por un cero, la forma más fácil de sumarlos sería convertir uno de los unos de los extremos en
cero, y cambiar el cero de separación por un uno. De este modo tendríamos una cadena formada
por tantos unos como indica la suma de los dos números originales. Veámoslo 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 separación:
0000011111111000
el resultado: ocho unos, el número ocho.

Para implementar esto, supondremos que la máquina 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
reordenación del programa resuelve el problema.
Dado que el cabezal no tiene por qué estar inmediatamente antes del primer número, sino
que puede estar más 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 número, 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 separación. Pero hay que tener en cuenta que, si
permaneciese en estado A, como después del primer uno vienen más, los pondría todos a cero; por
tanto, debemos añadir 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 separación,
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 separación, luego si estando en B encuentra un cero, debe ponerlo a uno.
Ahora que la suma está terminada, la máquina debe pararse, pasando al estado correspondiente.
Le denominaremos @ (arroba), para distinguirlo de otros posibles estados. En cuanto lo alcanza, la
máquina ya no leerá ningún símbolo más ni se desplazará.

Veamos el programa de esta máquina de sumar:


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

b. PRODUCTO DE DOS NUMEROS

Vamos a aprovecharnos de la rutina de copia para hacer una rutina de multiplicación.


Si analizamos el producto de dos números, 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 numeración, la suma no es más 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 números seguidos (con el cero de separación entre ellos, claro) y mandamos a nuestra
rutina que copie el primero (el de más a la izquierda, en nuestro caso), lo hará a continuación 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 número a multiplicar, tantas veces
como indique el primero, lo que haremos será sumar el segundo número 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 número, haremos
un contador con un cero, de la misma manera que hicimos en la propia rutina de copia. Así de fácil.

Veamos un programa de máquina 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 artículo. Esto significa que la máquina no
se debe poner en marcha en el estado A, sino en el estado J.
0 1 0 1
I 0,L,< 1,I,< M 1,N,> 1,M,<
J 0,J,> 0,K,> N ----- 0,K,>
K 0,A,> 1,K,> O 0,@ 1,O,<
L 1,O,< 1,M,<
El bloque ----- significa que esa condición nunca puede darse, por lo que se debe dejar sin
rellenar o bien poner un bloque ficticio.

También podría gustarte