Los dos ejercicios clásicos, resueltos paso a paso sobre el autómata que acabas de dibujar: pasar de no determinista a determinista por construcción de subconjuntos, y reducir un AFD al mínimo número de estados por refinamiento de particiones.
Validar cadena
800 ms
ab
Validación en lote
Una cadena por línea. Cada cadena se valida con el autómata actual.
Cadena
Resultado
a
✓ Aceptada
ab
⚠ Sin transición
ba
⚠ Sin transición
aab
⚠ Sin transición
abab
⚠ Sin transición
📝 Casos para clase
12 problemas de teoría de autómatas con solución, siempre los mismos y en el mismo orden. Un profesor puede decir «resuelve los casos 3, 7 y 11» y corregir sin ambigüedad. Puedes comprobar cada resultado dibujando el autómata en el editor de arriba y pulsando Determinizar o Minimizar.
Caso 1 · Número par de cerosteoría
Un AFD sobre el alfabeto {0, 1} tiene dos estados: q0 (inicial y final) y q1. Sus transiciones son δ(q0,0)=q1, δ(q1,0)=q0, δ(q0,1)=q0 y δ(q1,1)=q1. ¿Cuántas de estas seis cadenas acepta: 1, 00, 010, 0110, 101, 0001?
📚Guía de Autómatas Finitos
DFA, NFA y lenguajes regulares
DFA vs NFA — Comparativa
Característica
DFA (Determinista)
NFA (No determinista)
Transiciones por símbolo
Exactamente una desde cada estado
Cero, una o varias desde cada estado
ε-transiciones
No permitidas
Permitidas (saltar sin leer entrada)
Estado activo en cada paso
Uno solo
Conjunto de estados
Potencia (lenguajes que reconocen)
Lenguajes regulares
Lenguajes regulares (la misma)
Tamaño típico (estados)
Más estados (puede explotar)
Menos estados, más compacto
Implementación
Tabla de transiciones directa
Conversión a DFA o simulación con conjuntos
Velocidad de ejecución
Rápida (un acceso por símbolo)
Más lenta (gestionar conjuntos)
Casos de Uso Reales
🎓Estudiante de Teoría de la Computación
Tienes que demostrar en el examen que un lenguaje es regular construyendo un autómata, y comparar DFA con NFA para los mismos lenguajes.
Carga el ejemplo «Contiene 01» (NFA) y verifica que también puede construirse como DFA con más estados.
📚Opositor TIC / Concurso público
Las pruebas tipo test preguntan diferencias entre DFA y NFA, qué es la ε-clausura, y cómo se relacionan los autómatas con las expresiones regulares.
Usa el ejemplo a*b*c* y observa cómo las ε-transiciones simplifican el diseño de patrones.
💻Programador de parsers y lexers
Implementas un analizador léxico (lexer) o un motor de expresiones regulares. Necesitas convertir patrones a DFAs eficientes.
Las herramientas como flex/lex generan DFAs automáticamente desde expresiones regulares (algoritmo de Thompson + subconjuntos).
👨🏫Profesor / docente de informática
Quieres mostrar visualmente a tu clase cómo evolucionan los estados activos en un NFA durante la lectura de una cadena.
Usa el ejemplo a*b*c* y reproduce paso a paso una cadena como «aabbcc» para ver la épsilon-clausura en acción.
Preguntas Frecuentes
¿Cuál es la diferencia real entre DFA y NFA en potencia?
Reconocen exactamente la misma clase de lenguajes: los lenguajes regulares. Todo NFA puede convertirse en un DFA equivalente (algoritmo de subconjuntos), aunque el DFA puede tener exponencialmente más estados en el peor caso.
La diferencia es de conveniencia, no de potencia: el NFA es más compacto y fácil de diseñar; el DFA es más rápido al ejecutarse.
¿Qué es una ε-transición y para qué sirve?
Es una transición que se puede «tomar gratis», sin leer ningún símbolo de la entrada. Solo existe en NFAs. Sirve para combinar fácilmente autómatas (concatenación, unión, estrella de Kleene) sin tener que reorganizar estados.
En el ejemplo a*b*c*, las ε-transiciones permiten saltar de la «zona de a» a la «zona de b» sin leer nada.
¿Cómo se convierte un NFA a un DFA?
Mediante el algoritmo de subconjuntos: cada estado del DFA equivalente representa un conjunto de estados del NFA (los que estarían activos a la vez). Si el NFA tiene n estados, el DFA puede tener hasta 2^n estados, aunque normalmente muchos menos.
Calcula primero la ε-clausura del estado inicial; luego, para cada conjunto y cada símbolo, determina el siguiente conjunto. El panel Convertir el autómata hace esa tabla sobre el que tengas dibujado, fila a fila, para que puedas contrastarla con la tuya.
¿Qué son los lenguajes regulares?
Son los lenguajes que pueden ser reconocidos por un autómata finito (DFA o NFA). Equivalentemente, son los lenguajes que pueden describirse con una expresión regular. Cierran bajo unión, concatenación, intersección, complemento y estrella de Kleene.
Ejemplos: cadenas con número par de 0s, cadenas que terminan en «ab», identificadores válidos en un lenguaje de programación.
¿Qué relación hay con las expresiones regulares?
Son equivalentes: para cada expresión regular existe un autómata finito que reconoce el mismo lenguaje, y viceversa (teorema de Kleene). Los motores de regex modernos (PCRE, RE2…) usan internamente NFAs o DFAs según la implementación.
RE2 (Google) y los motores POSIX usan DFAs lazy para garantizar tiempo lineal, evitando el catastrophic backtracking de los regex tradicionales.
¿Por qué algunos lenguajes no son regulares?
Porque un autómata finito tiene memoria limitada (solo el estado actual). Lenguajes que requieren contar arbitrariamente (como aⁿbⁿ) o emparejar paréntesis no son regulares: necesitan autómatas con pila (lenguajes libres de contexto).
Se demuestra con el lema del bombeo: si un lenguaje fuera regular, cualquier cadena suficientemente larga tendría una porción que se puede repetir indefinidamente y seguir en el lenguaje.
Cómo Diseñar un Autómata — Paso a Paso
1
Describe el lenguaje en palabras
Antes de dibujar nada, escribe con claridad qué cadenas se aceptan y cuáles no. Ejemplo: «cadenas sobre {0,1} con un número par de 0s».
2
Identifica la «memoria» necesaria
Cada estado representa una propiedad acumulada de lo leído hasta ahora. En el ejemplo: ¿cuántos 0s llevo? Solo importa la paridad → 2 estados.
3
Define estado inicial y estados finales
El inicial representa «aún no he leído nada». Los finales son aquellos en los que la cadena leída es válida. Marca uno o varios como finales según el lenguaje.
4
Dibuja todas las transiciones
Para cada estado y cada símbolo del alfabeto, indica a qué estado se va. En un DFA debe haber siempre exactamente una transición. En NFA pueden faltar o haber varias.
5
Verifica con cadenas de prueba
Prueba al menos una cadena que debe aceptar y otra que debe rechazar. Usa el modo batch del simulador con varias cadenas representativas.
Mejores Prácticas
🎯Diseña primero el NFA, luego conviértelo
Es más fácil pensar en NFAs (sin la restricción de transición única). Una vez funciona, conviértelo a DFA si necesitas eficiencia.
🔍Usa nombres descriptivos para los estados
En lugar de q0, q1, q2, considera «par», «impar» o «leí_a», «leí_ab» para que el diseño sea autoexplicativo.
✂️Minimiza estados
Si dos estados son equivalentes (mismas transiciones, mismo carácter de final), fusiónalos. El botón Minimizar el AFD lo hace por refinamiento de particiones y enseña cada ronda; el algoritmo de Hopcroft resuelve lo mismo en O(n log n).
🪤Define el estado «trampa» (dead state)
En DFA, todas las transiciones deben estar definidas. Si una cadena no debe aceptarse, redirige las transiciones inválidas a un estado trampa no final del que no se puede salir.
🧪Prueba con casos límite
Cadena vacía, un solo símbolo, todos los símbolos del alfabeto, cadena muy larga. Si tu autómata acepta el lenguaje vacío, el estado inicial debe ser también final.
🔁Aprovecha las ε-transiciones
Para combinar autómatas (unión, concatenación, estrella) las ε-transiciones son tu mejor amiga. Es la base del algoritmo de Thompson para regex.
⚠️Errores frecuentes a evitar
Olvidar que en un DFA todas las transiciones deben estar definidas: si falta alguna, formalmente no es un DFA (aunque algunos textos permiten DFAs parciales).
Confundir «estado inicial» con «estado final»: el inicial es el de partida; los finales son donde la cadena se acepta. Pueden coincidir.
Usar ε-transiciones en un DFA: están prohibidas. Si las necesitas, es que estás diseñando un NFA.
No considerar la cadena vacía: si la cadena vacía pertenece al lenguaje, el estado inicial debe ser final.
Pensar que un NFA es «más potente» que un DFA: NO. Reconocen los mismos lenguajes (regulares). La diferencia es solo la conveniencia de diseño.
Olvidar la épsilon-clausura al simular un NFA: tras cada transición de símbolo, hay que cerrar bajo ε para no perder estados accesibles.