Você está na página 1de 10

INTRODUCCIÓN A

MÁQUINAS ESTADO FINITAS


4.1. Cyclops, el ordenador más simple posible
Comenzamos ahora nuestro estudio de la Teoría de la Computación. Aquí no nos
interesa el último software o hardware, el conocimiento que cambia a mes y que se
vuelve obsoleto después de solo unos pocos años. En su lugar, vamos a hacer algunas
preguntas bastante profundas sobre la naturaleza de la computación. Si bien está claro
que esto debe ser valioso conocimiento de fondo para el informático profesional, debe
señalarse que también tiene relevancia para el estudiante de matemáticas. Después de
todo, una gran parte de las matemáticas implica el cálculo, y los algoritmos
(procedimientos para calcular algo) han existido durante miles de años.
Las preguntas sobre la naturaleza fundamental de la computación fueron hechas no por
científicos de la computación, sino por matemáticos y cuando empezaron a preguntarse
(en la primera mitad del siglo XX) no había personas tales como los informáticos ni
máquinas tales como computadoras . De hecho, fue el trabajo pionero de matemáticos
como Alan Turing que ayudó a dar a luz a la computadora.
Ahora una computadora moderna es una máquina extremadamente complicada. Para
entender su naturaleza esencial debemos quitar toda esta complejidad y considerar la
computadora más simple posible. Llamaremos a esto las computadoras más simples de
todo posible, "Cyclops".
[Cyclops era el nombre dado a un carácter de la mitología griega con solamente un ojo,
colocado en el medio de su frente. Verá pronto por qué este nombre es muy apropiado
para esta máquina más primitiva.]
Hay cuatro características esenciales de cualquier dispositivo de computación:
* Un mecanismo para la entrada
* Un mecanismo de salida
Memoria
* Programas.
La entrada puede venir a través de una variedad de dispositivos como CD-ROM o
módems inalámbricos, pero el dispositivo de entrada más familiar es el teclado.
Proporcionaremos a Cyclops con un teclado con apenas una llave con el numeral "1"
grabado en él. Así que una entrada típica de Cyclops sólo puede ser una cadena de 1,
como 11111. Esto significa que no podemos utilizar la notación binaria para los números.
En cambio, para introducir el número n, tendremos que pulsar la tecla "1" n veces.
La salida también puede venir a través de una variedad de canales, pero probablemente
el más familiar es la unidad de visualización de vídeo, o pantalla de ordenador. Nuestras
computadoras más simples de todas las posibles tendrán que tener una pantalla
monocromática. En una pantalla LCD típica hay miles de pequeños "píxeles" - puntos
que pueden estar encendidos o apagados (iluminados u oscuros). Los cíclopes tendrán
que contentarse con una sola pantalla de píxeles - o, de manera equivalente, una sola
bombilla que puede estar encendida o apagada.
En todas las computadoras una parte de la RAM (memoria de acceso aleatorio) está
dedicada a proporcionar la salida de pantalla. (En los primeros días de las computadoras
caseras cuando había memoria muy limitada.
Los programadores se vieron obligados a veces a hacer uso de esta memoria para sus
cálculos y por lo tanto, mientras que el programa estaba corriendo todo tipo de "basura"
aparecería en la pantalla hasta que el resultado final se muestra. Hoy en día la memoria
se mide en gigabytes y cada gigabyte consta de un gran número de diminutas unidades
de memoria llamadas "bits". Un bit es la cantidad de memoria contenida en un interruptor
de luz que "recuerda" si está encendido o apagado. Con el fin de crear el más simple de
todos los posibles-computadoras vamos a insistir en que la única bombilla que Cyclops
tiene para su pantalla tiene que duplicar como una memoria de un bit.
Finalmente está el programa. Normalmente las computadoras usan parte de su memoria
para almacenar un programa, ¡pero esto es un poco más que pedirle a nuestro enano
de un solo bit! En su lugar vamos a "hard-wire" el programa en Cyclops en la misma
manera que hay un programa de cableado en el micro-procesador que controla una
lavadora automática. Esto significa, por supuesto, que a menos que le volvamos a
conectar, Cyclops será un solo programa de computadora. Así que nuestra computadora
mínima es una máquina de un solo bit, solo programa con una sola llave y una sola
bombilla como la pantalla!
En cualquier momento, la bombilla está encendida o apagada. Al presionar las teclas,
el programa determinará si la bombilla debe estar encendida o apagada. Puesto que
nuestra intención es hacer de Cyclops una máquina determinista, las decisiones
tomadas por el programa deben ser determinadas solamente por dos cosas: qué tecla
ha sido presionada y en qué estado está la máquina actualmente. La regla de decisión
puede ser establecida en una tabla de El siguiente formulario:

Cada una de estas dos celdas debe contener el nombre del siguiente estado en el que
va la máquina, es decir, cada uno es "ON" o "OFF".
Dado que hay dos posibilidades para cada celda hay 4 combinaciones en total. Cada
uno de estos puede ser pensado como un programa que puede ser cableado en Cíclope.
Aquí hay un programa de este tipo.
Ejemplo 1:

Cuando la luz está apagada, una pulsación de tecla la encenderá. Cuando está
encendido, al presionar la tecla se desactiva. Este programa hará que Cyclops cambie
repetidamente la lámpara de salida de encendido y apagado cada vez que se presiona
la tecla "1".
Esta computadora muy simple, que ejecuta este programa muy simple, de hecho se
fabrica realmente, aunque no como un dispositivo de computación. Más bien es un
interruptor de la luz del interruptor como usted consigue en muchas lámparas de
escritorio. Presione el botón, y si la luz está apagada, entonces se enciende. Empuje de
nuevo y la luz se apaga. Hace muchos años, tales interruptores estaban conectados a
cables largos de los techos y cada vez que se tira del cable, la luz del techo cambiaría
su estado.
Ahora puede que nunca haya pensado en un mecanismo como un ordenador primitivo,
pero sí puede calcularlo. Podemos usarlo para calcular si un número dado n es impar o
incluso examinando el efecto de n pulsaciones de la clave. Primero restablecemos la
máquina apagando la luz. Luego pulsamos el botón n veces. Si, cuando terminamos, la
luz está encendida, entonces n es impar. Si termina apagado, el número es par. En total
hay cuatro diferentes "programas" que Cyclops se puede dar. Uno fue dado en el

Ejemplo 1. Los otros tres son:


Estos tres no son tan útiles como el modelo de interruptor de luz. En el primero, la
entrada no tiene ningún efecto, como si la clave fuera un dummy - no conectado a nada.
Los otros dos pueden cambiar el estado, pero el efecto no puede ser revertido. Los
botones de un ascensor funcionan como este último. Una vez que están encendidos, no
se pueden apagar (hasta que se restablecen al llegar al piso requerido).
Así que hemos aprendido todo lo que hay que saber sobre las máquinas de 1 entrada
de 2 estados, que no es mucho! Así que vamos a generalizar Cyclops a una máquina
con m teclas de entrada y n estados.
4.2. Máquinas de Estado Finito
Una máquina de estado finito consta de lo siguiente:
(1) un conjunto llamado el alfabeto de entrada;
(2) un conjunto S cuyos elementos se llaman estados;
(3) una función T: S I S llamada función de transición;
(4) un elemento particular, s0 S llamado estado inicial;
El funcionamiento de la máquina es el siguiente:
La máquina comienza en el estado inicial s0. La entrada es una cadena de caracteres
del alfabeto de entrada que se leen uno a la vez (desde la izquierda). En cada etapa la
máquina está en algún estado s S. Si la máquina está en el estado s, y el siguiente
carácter de entrada es c I, la máquina pasa al estado T (s, c) y espera al siguiente
carácter de entrada. El proceso continúa de esta manera hasta que se hayan procesado
todos los caracteres de entrada.
Ejemplo 2
I = {1, 2}; S = {A, B, C, D}; S0 = A.
T viene dado por la tabla

Supongamos que la entrada a esta máquina es 1121221121. Las sucesivas transiciones


de la máquina son:

Aunque lo describimos de forma abstracta, esta máquina en particular puede tener una
interpretación muy familiar. Imagine que usted es el operador de un paseo de parque de
diversiones y tiene que llenar coches de cuatro plazas de una sucesión de parejas y
clientes individuales.
Sus instrucciones son esperar hasta que el coche esté lleno antes de dejarlo ir. Sin
embargo, si llega una pareja, en lugar de dividirlos, dejar que el coche ir con sólo 3
pasajeros y poner a la pareja en la siguiente.
La entrada consiste en los clientes que llegan en 1 y 2. Los cuatro estados, de A a D,
corresponden a las cuatro situaciones posibles que puede tener con el coche actual. El
estado A es Donde tienes un coche completamente vacío y los estados B, C y D son
donde hay uno, dos o tres pasajeros esperando en el coche. Examine la tabla de estado
para ver que usted está de acuerdo en que describe con precisión la situación.
Ambos ejemplos 1 y 2 sirven para otro propósito que el cálculo. El hecho de que un
interruptor de luz pueda distinguir entre números pares e impares no es el propósito
para el cual se hizo, y el operador del paseo en tren fantasma ciertamente no se ve a sí
mismo como un engranaje en alguna computadora gigante, pero bastante débil.
En lo que sigue, nos concentraremos en las máquinas de estado finito como dispositivos
para realizar algún tipo de cálculo. La naturaleza física de los estados no nos afectará,
sólo el movimiento abstracto de estado a estado.
En la práctica, las máquinas de estado finito se implementan electrónicamente de una
de dos maneras. Podemos construir un chip electrónico, incorporando la lógica de la
máquina. Esto se hace cuando la máquina es parte de un equipo que está diseñado p
ara reaccionar a la entrada externa de alguna manera definida. O podemos incorporar
la máquina de estado finito dentro de algún programa de computadora, donde la
computadora simula a máquina.
De hecho, una computadora misma es una máquina de estado finito. El conjunto de
estados es el conjunto de todas las combinaciones posibles de bits de memoria interna.
Esto es enorme, pero finito.
4.3. Máquinas Mealy
Para ser de cualquier uso en computación, una máquina de estado finito debe tener
alguna forma de salida. Hay varias maneras de proporcionar esa salida. Una manera
obvia es hacer que la máquina lo imprima (en una pantalla, o en papel, o tal vez como
una secuencia de tonos). Necesitamos un alfabeto de salida, O, que puede o no ser el
mismo que el alfabeto de entrada. Cada vez que la máquina lee un carácter de la
entrada, sale un carácter así como cambia su estado.
Para describir la salida de tal máquina podemos tener una función adicional que asigna
a cada combinación de estado y carácter de entrada, un carácter de salida. En otras
palabras, tenemos una función P: S I O. Cuando la máquina está en estado s y lee
el carácter c, la salida es P (s, c).
Una máquina de este tipo se conoce como Mealy Machine. Podemos describir una
máquina Mealy por un par de mesas. La tabla de estados proporciona el nuevo estado,
para cada combinación de estado y carácter y la tabla de salida proporciona el carácter
que se emite en cada etapa. El estado inicial se indica poniendo una flecha corta delante
de ese estado en la columna de la izquierda.
Ejemplo 3: La siguiente máquina Mealy hace eco de la entrada después de un retardo
de dos pasos. Los dos primeros caracteres de salida son ambos 0. A continuación, la
salida en cada etapa es la entrada de dos pasos anteriores. Los últimos dos caracteres
de entrada se ignoran.
I = O = {0, 1}; S = {A, B, C, D} con s0 = A.
El significado de estos estados será el siguiente:
A significa que los siguientes dos caracteres de salida deben ser 0, 0
B significa que los siguientes dos caracteres de salida deben ser 0, 1
C significa que los siguientes dos caracteres de salida deben ser 1, 0
D significa que los siguientes dos caracteres de salida deben ser 1, 1
Dar una interpretación a los estados no es una parte de la descripción de la máquina.
Uno puede "operar" la máquina sin pensarlo sin ese conocimiento. Sin embargo, al
diseñar máquinas de estado finito y comprender su función, es muy importante poder
adjuntar un significado a cada estado.
Las tablas de transición y salida de esta máquina son las siguientes (indicamos el hecho
de que A es el estado inicial colocando una flecha delante de él):

Así que si la entrada es 111001111 la salida será 001110011 como se muestra a

continuación:
El efecto es imprimir dos 0 iniciales y luego repetir la entrada con un retardo de dos
pasos. Por supuesto porque la salida tiene la misma longitud que la entrada, los dos
últimos caracteres de entrada serán ignorados.
4.4. Máquinas Moore
Una disposición alternativa para la salida es hacer que la máquina imprima un cierto
carácter de salida cuando entra en un estado. Estas máquinas se llaman máquinas de
Moore. La salida está conectada a los estados en lugar de a las transiciones.
Formalmente, la salida de una máquina de Moore se describe por una función P: S →
O, donde como antes, O es el alfabeto de salida.
Ejemplo 4
La siguiente máquina Moore es también una máquina de retardo de dos pasos, que se
comporta de forma equivalente a la máquina Mealy en el ejemplo 3.
I = O = {0, 1}; S = {A, B, C, D} con s0 = A.

Utilizando la misma cadena de entrada que antes obtenemos la misma salida. La única
diferencia es que la salida responde sólo al estado que se está introduciendo.
Es una tarea relativamente rutinaria convertir una máquina Mealy en una máquina
Moore y viceversa.
4.5. Acceptores de Estado Finito
Incluso la máquina de Moore es más de lo que necesitamos aquí. Nuestro enfoque en
las máquinas de estado finito será como aceptantes para los idiomas. Dado un lenguaje,
en un alfabeto dado, nos gustaría encontrar una máquina que decida si una cadena
dada pertenece o no al lenguaje.
Aquí la salida es un simple "SI" o "NO". No nos interesan los resultados parciales.
Esperamos a que la máquina lea toda la cadena de entrada y sólo entonces estamos
interesados en la respuesta. En un aceptor de estado finito (FSA), la salida se determina
seleccionando un subconjunto de estados como estados de aceptación. Si la máquina
termina en un estado de aceptación, después de haber leído toda la cadena, decimos
que la cadena ha sido aceptada por la máquina. De lo contrario es rechazado.
Cada máquina de Moore con el conjunto de salida {0,1} puede considerarse como FSA
tomando los estados de aceptación como aquellos para los cuales la salida es un "1". Y
cada FSA se puede considerar como una máquina de Moore con el alfabeto de salida
{0, 1} simplemente suponiendo que la máquina imprime un "1" cada vez que entra en
un estado de aceptación y "0" cuando entra en cualquier otro estado.
La ligera modificación a la forma en que lo presentamos como aceptor de estado finito
es reemplazar los 1 en la columna final por * y los 0 por espacios en blanco, de modo
que los estados aceptantes son aquellos con un asterisco en contra de ellos.
Ejemplo 5
Escribiendo la máquina de Moore en el ejemplo 4 como un aceptor de estado finito

tenemos:
Como dijimos anteriormente, nuestro enfoque principal estará en los aceptantes de los
estados finitos. Ahora que corresponde a cada FSA hay un lenguaje, el conjunto de
todas las cadenas de entrada que son aceptadas por la máquina. Decimos que una FSA
acepta un lenguaje, L, si acepta cada cadena en L y rechaza todas las demás.
Una pregunta importante es "¿puede cada idioma ser aceptado por una FSA?" La
respuesta es "no". Sólo para ciertos idiomas existe una FSA correspondiente. ¿Cuáles?
Tendremos que esperar hasta un capítulo posterior para obtener una respuesta.
Ejemplo 6
El lenguaje aceptado por la FSA anterior es el conjunto de todas las cadenas cuyo tercer
último símbolo es un
"1". Este lenguaje puede ser descrito por la expresión regular (0 + 1) * 1 (00 + 01 + 10
+ 11).
4.6. Diagramas de estado
A menudo es conveniente representar gráficamente una máquina de estados finitos.
Esto se hace por .Dibujando un pequeño círculo para cada estado, con el nombre del
estado dentro y flechas de dibujo .Conectando los estados para representar las
transiciones. El carácter de entrada que da lugar a una.La transición se escribe al lado
de la flecha correspondiente. Se indica el estado inicial mediante el dibujo .Una flecha
corta apuntando a ella. La salida se representa de las siguientes maneras:
Máquinas Mealy:
La salida se escribe junto al carácter de entrada para cada transición de la siguiente
manera:

Esto indica que si la máquina está en el estado A y recibe la entrada "1" entonces emite
un "0" y
Se mueve al estado G.
Máquinas Moore:
La salida se adjunta al nombre del estado de la siguiente manera:

Esto indica que si la máquina está en el estado A y recibe la entrada 1, se mueve al


estado G y
Produce un 0.
FSA:
Los estados aceptantes se distinguen dibujando un anillo doble alrededor de ellos como
sigue:

Esto indica que si la máquina está en el estado A y recibe la entrada 1, se mueve al


estado G. Si
Que era el último carácter de la cadena de entrada, la cadena sería aceptada.
Ejemplo 7: La siguiente tabla y diagrama representan la misma máquina Mealy.
Ejemplo 8
La tabla y el diagrama representan la misma máquina Moore.

Ejemplo 9
La siguiente tabla y diagrama representan la misma FSA.

4.7. Agujeros negros


Con una FSA a menudo llegamos a una situación en la que podemos rechazar la cadena
sin
Necesitando ver el resto de ella. Por ejemplo si tenemos un aceptor para el lenguaje
(10) * nosotros
Puede rechazar la cadena 101101010101 tan pronto como leamos el cuarto carácter.
Más allá de esto
Punto, no nos importa lo que leemos. ¡El destino de la cuerda está sellado!
La manera más conveniente de tratar esto es tener un estado especial que represente
Rechazo antes de que la entrada esté completa. Las transiciones que salen de tal
estado deben
Derecha otra vez. Por lo tanto, una vez que la máquina llega a este estado nunca puede
salir. por
Esta razón se la conoce a veces como un "agujero negro", por analogía con esas
regiones del exterior
Espacio con una concentración tan alta de fuerza gravitacional que nada de lo que entra
puede
escapar.
Un FSA típico tendrá un agujero negro (sólo uno es necesario) con muchos
Transiciones en ella. Para incluir el agujero negro en un diagrama de estado con todas
sus flechas entrantes,
Haría que el diagrama parezca excesivamente desordenado. Por esta razón
generalmente omitimos el
Agujero negro de diagramas de estado. Por lo tanto, siempre que no haya una flecha
emergiendo de un estado
Para un carácter de entrada particular, se supone que hay una flecha invisible que
conduce a la
calabozo. Y, por supuesto, el agujero negro nunca es un estado de aceptación.
Ejemplo 10
Diseñe una FSA para aceptar el lenguaje que consiste en todas las cadenas binarias
que comienzan con 1011. En
Otras palabras diseñan una FSA para el lenguaje dado por la expresión regular 1011 (0
+ 1) *.

El estado F actúa claramente como un agujero negro. Por lo tanto, podemos simplificar
el diagrama
Borrarlo. Se supone que cualquier transición que no se muestre conduzca a este agujero
negro.
Otra simplificación es combinar las flechas que comienzan y terminan con el mismo
estado.
NOTAS:
(1) No confunda la notación 0,1 con la notación 0/1 que utilizamos para las máquinas
Mealy.
Algunos libros usan 0,1 en tales situaciones, por lo que existe cierto peligro de confusión.
Para nosotros, 0/1
Significa "leer 0 y escribir 1", mientras que 0,1 significa "leer 0 o 1".
(2) Obsérvese que E no es un agujero negro porque es un estado de aceptación.
(3) Omitimos un agujero negro en un diagrama de estado pero debe ser incluido en una
tabla de estado.