Este término, estaba enseñando un curso sobre introducción a la teoría de la computación, y uno de los temas era autómatas finitos: DFA, NFA y similares. Comencé escribiendo la definición de un DFA:
Un autómata finito determinista (DFA) es una tupla de 5 tuplas [matemáticas] (Q, \ Sigma, \ delta, q_0, F) [/ matemáticas] donde: Q es un conjunto finito de estados …
Prácticamente podía sentir a mis alumnos quedarse dormidos en sus asientos. Inevitablemente, un estudiante hizo la única pregunta que nunca debe hacerle a un teórico:
- ¿Las matemáticas detienen a un programador o son las restricciones del lenguaje, o posiblemente un problema de eficiencia?
- ¿De qué manera las matemáticas son similares a la codificación?
- Cómo crear una ecuación matemática compleja desde cero
- ¿Por qué es más fácil verificar una respuesta que producirla?
- ¿Cuál es una buena manera de entender que FSA (automatización de estado finito) o los lenguajes regulares están cerrados bajo diferencia, complementación e intersección, pero FST (traductores de estado finito) o relaciones regulares no lo están?
“Entonces … ¿cómo es esto útil en la vida real?”
DFA como modelo de computación
He realizado algunas investigaciones teóricas sobre la teoría del lenguaje formal y los DFA, por lo que mi respuesta inmediata fue por qué los DFA son importantes para los teóricos.
Arriba: un DFA requiere memoria O (1), independientemente de la longitud de la entrada.
Es posible que haya oído hablar de las máquinas de Turing, que abstrae la idea de una “computadora”. De manera similar, los lenguajes regulares describen lo que es posible hacer con una computadora con muy poca memoria. No importa cuánto dure la entrada, un DFA solo realiza un seguimiento del estado en el que se encuentra actualmente, por lo que solo requiere una cantidad constante de memoria.
Al estudiar las propiedades de los lenguajes regulares, obtenemos una mejor comprensión de lo que es y lo que no es posible con computadoras con muy poca memoria.
Esto explica por qué los teóricos se preocupan por los lenguajes regulares, pero ¿cuáles son algunas aplicaciones del mundo real ?
DFA y expresiones regulares
Las expresiones regulares son una herramienta útil que todo programador debe saber. Si desea verificar si una cadena es una dirección de correo electrónico válida, puede escribir algo como:
/^([a-z0-9_\.-font>+)@([\da-z\.-font>+)\.([az\.font>{2,6})$/
Detrás de escena, esta expresión regular se convierte en un NFA, que puede evaluarse rápidamente para producir una respuesta.
No necesita comprender las partes internas de esto para usar expresiones regulares, pero es útil conocer algo de teoría para comprender sus limitaciones. Algunos programadores pueden intentar usar expresiones regulares para analizar HTML, pero si ha visto el Lema de bombeo, comprenderá por qué esto es fundamentalmente imposible.
DFA en compiladores
En cada lenguaje de programación, el primer paso en el compilador o intérprete es el lexer. El lexer lee en un archivo de su lenguaje de programación favorito y produce una secuencia de tokens. Por ejemplo, si tiene esta línea en C ++:
cout << "Hola mundo" << endl;
El lexer genera algo como esto:
IDENTIFICADOR cout LSHIFT << STRING "Hola mundo" LSHIFT << IDENTIFICADOR endl SEMICOLON;
El lexer usa un DFA para recorrer el archivo fuente, un carácter a la vez, y emitir tokens. Si alguna vez diseñas tu propio lenguaje de programación, esta será una de las primeras cosas que escribirás.
Arriba: descripción de Lexer para números JSON, como -3.05
DFA para inteligencia artificial
Otra aplicación de autómatas finitos es la programación de agentes simples para responder a las entradas y producir acciones de alguna manera. Puede escribir un programa completo, pero un DFA a menudo es suficiente para hacer el trabajo. Los DFA también son más fáciles de razonar y más fáciles de implementar.
La IA para Pac-Man usa un autómata de cuatro estados:
Por lo general, este tipo de autómata se denomina máquina de estado finito (FSM) en lugar de DFA. La diferencia es que en un FSM, hacemos una acción dependiendo del estado, mientras que en un DFA, nos importa aceptar o rechazar una cadena, pero son el mismo concepto.
DFA en probabilidad
¿Qué pasa si tomamos un DFA, pero en lugar de reglas de transición fijas, las transiciones eran probabilísticas? Esto se llama una cadena de Markov!
Arriba: cadena de Markov de 3 estados para modelar el clima
Las cadenas de Markov se usan con frecuencia en probabilidad y estadística, y tienen muchas aplicaciones en finanzas e informática. El algoritmo PageRank de Google utiliza una cadena gigante de Markov para determinar la importancia relativa de las páginas web.
Puede calcular cosas como la probabilidad de estar en un estado después de un cierto número de pasos de tiempo, o el número esperado de pasos para alcanzar un cierto estado.
En resumen, los DFA son herramientas potentes y flexibles con innumerables aplicaciones del mundo real. La investigación en la teoría del lenguaje formal es valiosa, ya que nos ayuda a comprender mejor los DFA y lo que pueden hacer.
Publicado originalmente en mi blog