Una máquina de estados finitos ( FSM ) o autómata de estados finitos ( FSA , plural: autómatas ), autómata finito o simplemente máquina de estados , es un modelo matemático de computación . Es una máquina abstracta que puede estar en exactamente uno de un número finito de estados en un momento dado. La FSM puede cambiar de un estado a otro en respuesta a algunas entradas ; el cambio de un estado a otro se llama transición . [1] Una FSM se define por una lista de sus estados, su estado inicial y las entradas que activan cada transición. Las máquinas de estados finitos son de dos tipos: máquinas de estados finitos deterministas y máquinas de estados finitos no deterministas . [2] Para cualquier máquina de estados finitos no determinista, se puede construir una determinista equivalente.
El comportamiento de las máquinas de estados se puede observar en muchos dispositivos de la sociedad moderna que realizan una secuencia predeterminada de acciones en función de una secuencia de eventos que se les presentan. Ejemplos sencillos son: las máquinas expendedoras , que dispensan productos cuando se deposita la combinación adecuada de monedas; los ascensores , cuya secuencia de paradas está determinada por los pisos solicitados por los pasajeros; los semáforos , que cambian de secuencia cuando hay automóviles esperando; las cerraduras de combinación , que requieren la introducción de una secuencia de números en el orden adecuado.
La máquina de estados finitos tiene menos poder computacional que algunos otros modelos de computación como la máquina de Turing . [3] La distinción de poder computacional significa que hay tareas computacionales que una máquina de Turing puede hacer pero una FSM no. Esto se debe a que la memoria de una FSM está limitada por el número de estados que tiene. Una máquina de estados finitos tiene el mismo poder computacional que una máquina de Turing que está restringida de tal manera que su cabeza solo puede realizar operaciones de "lectura", y siempre tiene que moverse de izquierda a derecha. Las FSM se estudian en el campo más general de la teoría de autómatas .
Un ejemplo de un mecanismo simple que puede ser modelado por una máquina de estados es un torniquete . [4] [5] Un torniquete, utilizado para controlar el acceso al metro y a las atracciones de los parques de atracciones, es una puerta con tres brazos giratorios a la altura de la cintura, uno de ellos a lo ancho de la entrada. Inicialmente, los brazos están bloqueados, bloqueando la entrada, impidiendo el paso de los clientes. Al depositar una moneda o ficha en una ranura del torniquete, se desbloquean los brazos, lo que permite que un solo cliente pase. Después de que el cliente pasa, los brazos se bloquean nuevamente hasta que se inserta otra moneda.
Considerado como una máquina de estados, el torniquete tiene dos estados posibles: Locked y Unlocked . [4] Hay dos posibles entradas que afectan a su estado: poner una moneda en la ranura ( coin ) y empujar el brazo ( push ). En el estado bloqueado, empujar el brazo no tiene ningún efecto; no importa cuántas veces se dé la entrada push , permanece en el estado bloqueado. Poner una moneda, es decir, dar a la máquina una entrada de moneda , cambia el estado de Locked a Unlocked . En el estado desbloqueado, poner monedas adicionales no tiene ningún efecto; es decir, dar entradas de monedas adicionales no cambia el estado. Un cliente que empuja a través de los brazos da una entrada push y restablece el estado a Locked .
La máquina de estados del torniquete se puede representar mediante una tabla de transición de estados , que muestra para cada estado posible, las transiciones entre ellos (según las entradas proporcionadas a la máquina) y las salidas resultantes de cada entrada:
Estado actual | Aporte | Próximo estado | Producción |
---|---|---|---|
Bloqueado | acuñar | Desbloqueado | Desbloquea el torniquete para que el cliente pueda pasar. |
empujar | Bloqueado | Ninguno | |
Desbloqueado | acuñar | Desbloqueado | Ninguno |
empujar | Bloqueado | Cuando el cliente ha pasado, se bloquea el torniquete. |
La máquina de estados del torniquete también se puede representar mediante un gráfico dirigido llamado diagrama de estados (arriba) . Cada estado está representado por un nodo ( círculo ). Los bordes ( flechas ) muestran las transiciones de un estado a otro. Cada flecha está etiquetada con la entrada que activa esa transición. Una entrada que no causa un cambio de estado (como una entrada de moneda en el estado Desbloqueado ) está representada por una flecha circular que regresa al estado original. La flecha hacia el nodo Bloqueado desde el punto negro indica que es el estado inicial.
Un estado es una descripción del estado de un sistema que está esperando para ejecutar una transición . Una transición es un conjunto de acciones que se ejecutarán cuando se cumpla una condición o cuando se reciba un evento. Por ejemplo, cuando se utiliza un sistema de audio para escuchar la radio (el sistema está en el estado "radio"), recibir un estímulo "próximo" da como resultado pasar a la siguiente estación. Cuando el sistema está en el estado "CD", el estímulo "próximo" da como resultado pasar a la siguiente pista. Estímulos idénticos desencadenan diferentes acciones según el estado actual.
En algunas representaciones de máquinas de estados finitos, también es posible asociar acciones con un estado:
Se utilizan varios tipos de tablas de transición de estados . La representación más común se muestra a continuación: la combinación del estado actual (por ejemplo, B) y la entrada (por ejemplo, Y) muestra el siguiente estado (por ejemplo, C). La información completa de la acción no se describe directamente en la tabla y solo se puede agregar mediante notas al pie. [ Se necesita más explicación ] Es posible una definición de FSM que incluya la información completa de la acción mediante tablas de estados (consulte también la máquina virtual de estados finitos ).
Estado actual Aporte | Estado A | Estado B | Estado C |
---|---|---|---|
Entrada X | ... | ... | ... |
Entrada Y | ... | Estado C | ... |
Entrada Z | ... | ... | ... |
El lenguaje de modelado unificado tiene una notación para describir las máquinas de estados. Las máquinas de estados UML superan las limitaciones [ cita requerida ] de las máquinas de estados finitos tradicionales al tiempo que conservan sus principales beneficios. Las máquinas de estados UML introducen los nuevos conceptos de estados anidados jerárquicamente y regiones ortogonales , al tiempo que extienden la noción de acciones . Las máquinas de estados UML tienen las características tanto de las máquinas Mealy como de las máquinas de Moore . Admiten acciones que dependen tanto del estado del sistema como del evento desencadenante , como en las máquinas Mealy , así como acciones de entrada y salida , que están asociadas con estados en lugar de transiciones, como en las máquinas de Moore. [ cita requerida ]
El lenguaje de especificación y descripción es un estándar de la UIT que incluye símbolos gráficos para describir acciones en la transición:
SDL incorpora tipos de datos básicos llamados "Tipos de datos abstractos", un lenguaje de acción y una semántica de ejecución para hacer que la máquina de estados finitos sea ejecutable. [ cita requerida ]
Existe una gran cantidad de variantes para representar un FSM como el de la figura 3.
Además de su uso en el modelado de sistemas reactivos presentados aquí, las máquinas de estados finitos son significativas en muchas áreas diferentes, incluyendo la ingeniería eléctrica , la lingüística , la informática , la filosofía , la biología , las matemáticas , la programación de videojuegos y la lógica . Las máquinas de estados finitos son una clase de autómatas estudiados en la teoría de autómatas y la teoría de la computación . En informática, las máquinas de estados finitos se utilizan ampliamente en el modelado del comportamiento de las aplicaciones ( teoría de control ), el diseño de sistemas digitales de hardware , la ingeniería de software , los compiladores , los protocolos de red y la lingüística computacional .
Las máquinas de estados finitos se pueden subdividir en aceptores, clasificadores, transductores y secuenciadores. [6]
Los aceptadores (también llamados detectores o reconocedores ) producen una salida binaria, que indica si la entrada recibida es aceptada o no. Cada estado de un aceptador es de aceptación o de no aceptación . Una vez que se ha recibido toda la entrada, si el estado actual es de aceptación, la entrada es aceptada; de lo contrario, es rechazada. Como regla general, la entrada es una secuencia de símbolos (caracteres); no se utilizan acciones. El estado inicial también puede ser de aceptación, en cuyo caso el aceptador acepta la cadena vacía. El ejemplo de la figura 4 muestra un aceptador que acepta la cadena "nice". En este aceptador, el único estado de aceptación es el estado 7.
Un conjunto (posiblemente infinito) de secuencias de símbolos, llamado lenguaje formal , es un lenguaje regular si existe algún aceptor que acepte exactamente ese conjunto. Por ejemplo, el conjunto de cadenas binarias con un número par de ceros es un lenguaje regular (cf. Fig. 5), mientras que el conjunto de todas las cadenas cuya longitud es un número primo no lo es. [7] : 18, 71
También se podría decir que un aceptor define un lenguaje que contendría todas las cadenas aceptadas por el aceptor pero ninguna de las rechazadas; ese lenguaje es aceptado por el aceptor. Por definición, los lenguajes aceptados por los aceptores son los lenguajes regulares .
El problema de determinar el lenguaje aceptado por un aceptor dado es una instancia del problema de la ruta algebraica —en sí mismo una generalización del problema de la ruta más corta a gráficos con aristas ponderadas por los elementos de un semianillo (arbitrario) —. [8] [9] [ jerga ]
En la figura 5 aparece un ejemplo de un estado de aceptación: un autómata finito determinista (DFA) que detecta si la cadena de entrada binaria contiene un número par de 0.
S 1 (que también es el estado de inicio) indica el estado en el que se ha introducido un número par de 0. Por lo tanto, S 1 es un estado de aceptación. Este aceptador finalizará en un estado de aceptación si la cadena binaria contiene un número par de 0 (incluida cualquier cadena binaria que no contenga 0). Algunos ejemplos de cadenas aceptadas por este aceptador son ε (la cadena vacía ), 1, 11, 11..., 00, 010, 1010, 10110, etc.
Los clasificadores son una generalización de los aceptores que producen una salida n -aria donde n es estrictamente mayor que dos. [10]
Los transductores producen una salida en función de una entrada determinada y/o de un estado mediante acciones. Se utilizan para aplicaciones de control y en el campo de la lingüística computacional .
En aplicaciones de control se distinguen dos tipos:
Los secuenciadores (también llamados generadores ) son una subclase de aceptores y transductores que tienen un alfabeto de entrada de una sola letra. Producen una sola secuencia, que puede verse como una secuencia de salida de salidas del aceptor o del transductor. [6]
Otra distinción es entre autómatas deterministas ( DFA ) y no deterministas ( NFA , GNFA ). En un autómata determinista, cada estado tiene exactamente una transición para cada entrada posible. En un autómata no determinista, una entrada puede conducir a una, más de una o ninguna transición para un estado dado. El algoritmo de construcción de conjuntos de potencias puede transformar cualquier autómata no determinista en un autómata determinista (normalmente más complejo) con funcionalidad idéntica.
Una máquina de estados finitos con un solo estado se denomina "máquina de estados finitos combinatoria". Solo permite acciones en la transición a un estado. Este concepto es útil en casos en los que se requiere que varias máquinas de estados finitos trabajen juntas y cuando es conveniente considerar una parte puramente combinatoria como una forma de máquina de estados finitos para adaptarse a las herramientas de diseño. [11]
Existen otros conjuntos de semánticas disponibles para representar máquinas de estados. Por ejemplo, existen herramientas para modelar y diseñar lógica para controladores embebidos. [12] Combinan máquinas de estados jerárquicas (que normalmente tienen más de un estado actual), gráficos de flujo y tablas de verdad en un solo lenguaje, lo que da como resultado un formalismo y un conjunto de semánticas diferentes. [13] Estos gráficos, al igual que las máquinas de estados originales de Harel , [14] admiten estados anidados jerárquicamente, regiones ortogonales , acciones de estado y acciones de transición. [15]
De acuerdo con la clasificación general, se encuentran las siguientes definiciones formales.
Una máquina de estados finitos determinista o un aceptor de estados finitos determinista es un quíntuple , donde:
Tanto para las FSM deterministas como para las no deterministas, es convencional permitir que sea una función parcial , es decir, no tiene que estar definida para cada combinación de y . Si una FSM está en un estado , el siguiente símbolo es y no está definido, entonces puede anunciar un error (es decir, rechazar la entrada). Esto es útil en las definiciones de máquinas de estados generales, pero menos útil cuando se transforma la máquina. Algunos algoritmos en su forma predeterminada pueden requerir funciones totales.
Una máquina de estados finitos tiene la misma capacidad computacional que una máquina de Turing que está restringida de tal manera que su cabeza sólo puede realizar operaciones de "lectura" y siempre tiene que moverse de izquierda a derecha. Es decir, cada lenguaje formal aceptado por una máquina de estados finitos es aceptado por un tipo de máquina de Turing restringida de ese tipo, y viceversa. [16]
Un transductor de estados finitos es un séxtuple , donde:
Si la función de salida depende del estado y del símbolo de entrada ( ), esa definición corresponde al modelo de Mealy y puede modelarse como una máquina de Mealy . Si la función de salida depende únicamente del estado ( ), esa definición corresponde al modelo de Moore y puede modelarse como una máquina de Moore . Una máquina de estados finitos sin ninguna función de salida se conoce como semiautómata o sistema de transición .
Si ignoramos el primer símbolo de salida de una máquina de Moore, , entonces se puede convertir fácilmente a una máquina de Mealy con salida equivalente estableciendo la función de salida de cada transición de Mealy (es decir, etiquetando cada borde) con el símbolo de salida dado del estado de Moore de destino. La transformación inversa es menos sencilla porque un estado de máquina de Mealy puede tener diferentes etiquetas de salida en sus transiciones entrantes (bordes). Cada uno de esos estados debe dividirse en múltiples estados de máquina de Moore, uno para cada símbolo de salida incidente. [17]
Optimizar una FSM significa encontrar una máquina con el número mínimo de estados que realice la misma función. El algoritmo más rápido conocido que realiza esto es el algoritmo de minimización de Hopcroft . [18] [19] Otras técnicas incluyen el uso de una tabla de implicación o el procedimiento de reducción de Moore. [20] Además, las FSA acíclicas se pueden minimizar en tiempo lineal . [21]
En un circuito digital , un FSM puede construirse utilizando un dispositivo lógico programable , un controlador lógico programable , puertas lógicas y flip flops o relés . Más específicamente, una implementación de hardware requiere un registro para almacenar variables de estado, un bloque de lógica combinacional que determina la transición de estado y un segundo bloque de lógica combinacional que determina la salida de un FSM. Una de las implementaciones de hardware clásicas es el controlador Richards .
En una máquina de Medvedev , la salida está conectada directamente a los flip-flops de estado, minimizando el retraso de tiempo entre los flip-flops y la salida. [22] [23]
A través de la codificación de estados, las máquinas de estados de bajo consumo se pueden optimizar para minimizar el consumo de energía.
Los siguientes conceptos se utilizan comúnmente para crear aplicaciones de software con máquinas de estados finitos:
Los autómatas finitos se utilizan a menudo en la interfaz de los compiladores de lenguajes de programación. Una interfaz de este tipo puede comprender varias máquinas de estados finitos que implementan un analizador léxico y un analizador sintáctico. A partir de una secuencia de caracteres, el analizador léxico construye una secuencia de tokens de lenguaje (como palabras reservadas, literales e identificadores) a partir de la cual el analizador sintáctico construye un árbol sintáctico. El analizador léxico y el analizador sintáctico manejan las partes regulares y libres de contexto de la gramática del lenguaje de programación. [24]
Los procesos de cadenas de Markov finitas también se conocen como subdesplazamientos de tipo finito .