Equivalencia de estados DFA alcanzables
Agrupa estados alcanzables de un DFA completo de hasta 16 estados y cuatro símbolos según sus sufijos aceptados.
def dfa_classes(table, accepting):
if type(table) is not list or not 1 <= len(table) <= 16:
raise ValueError("state count")
n = len(table)
if type(table[0]) is not list or not 1 <= len(table[0]) <= 4:
raise ValueError("alphabet size")
width = len(table[0])
if any(type(row) is not list or len(row) != width or
any(type(x) is not int or not 0 <= x < n for x in row)
for row in table):
raise ValueError("complete transition table")
if type(accepting) is not set or any(
type(x) is not int or not 0 <= x < n for x in accepting):
raise ValueError("accepting states")
seen, pending = {0}, [0]
while pending:
for dest in table[pending.pop()]:
if dest not in seen:
seen.add(dest); pending.append(dest)
groups = [g for g in (seen & accepting, seen - accepting) if g]
while True:
owner = {s: i for i, g in enumerate(groups) for s in g}
refined = []
for group in groups:
buckets = {}
for state in sorted(group):
key = tuple(owner[d] for d in table[state])
buckets.setdefault(key, set()).add(state)
refined.extend(buckets.values())
if len(refined) == len(groups):
return sorted([sorted(g) for g in refined])
groups = refined| Proyecto | Prueba estados equivalentes y distinguibles, excluyendo los inalcanzables y rechazando transiciones inválidas. |
|---|---|
| Revisa antes de aplicar | Compara el comportamiento real con el resultado esperado. Si una prueba falla, investiga la causa antes de hacer más cambios. |
| Modelos | Configura un endpoint compatible con OpenAI o Anthropic usando la URL base y, si hace falta, una clave API. Prueba la conexión. Un servidor local debe estar en ejecución; las herramientas remotas pueden enviar datos por separado. |
def dfa_classes(table, accepting):
if type(table) is not list or not 1 <= len(table) <= 16:
raise ValueError("state count")
n = len(table)
if type(table[0]) is not list or not 1 <= len(table[0]) <= 4:
raise ValueError("alphabet size")
width = len(table[0])
if any(type(row) is not list or len(row) != width or
any(type(x) is not int or not 0 <= x < n for x in row)
for row in table):
raise ValueError("complete transition table")
if type(accepting) is not set or any(
type(x) is not int or not 0 <= x < n for x in accepting):
raise ValueError("accepting states")
seen, pending = {0}, [0]
while pending:
for dest in table[pending.pop()]:
if dest not in seen:
seen.add(dest); pending.append(dest)
groups = [g for g in (seen & accepting, seen - accepting) if g]
while True:
owner = {s: i for i, g in enumerate(groups) for s in g}
refined = []
for group in groups:
buckets = {}
for state in sorted(group):
key = tuple(owner[d] for d in table[state])
buckets.setdefault(key, set()).add(state)
refined.extend(buckets.values())
if len(refined) == len(groups):
return sorted([sorted(g) for g in refined])
groups = refinedSimplifica el código con estado conservando el comportamiento observable
StateAmaranth es un entorno de programación para Windows destinado a examinar software con estado mediante un modelo de IA conectado. Empieza por los eventos que acepta el sistema y los resultados que puede observar un consumidor. Una solicitud de simplificar estados necesita ese contexto para que una representación menor no se convierta en el objetivo a costa del comportamiento de la aplicación.
El ejemplo suministrado de estados deterministas proporciona una tarea concreta: examinar equivalencias entre estados alcanzables conservando el comportamiento de aceptación. Aporta tu tabla de transiciones y el estado inicial previsto. Pide al modelo que explique qué distinciones importan antes de solicitar cambios, especialmente si la aplicación expone algo más que un resultado simple de aceptación o rechazo.
Revisa cualquier agrupación propuesta frente a secuencias breves de eventos con resultados conocidos. Incluye rutas que alcancen estados distintos y casos con entradas inalcanzables, y ejecuta las comprobaciones en tu proyecto. Examina también la interfaz que consume la agrupación, porque cambiar la numeración o representación de estados puede romper consumidores aunque se conserve la aceptación.
Puedes seleccionar un modelo de IA sin restricciones mediante un endpoint compatible con OpenAI o de Anthropic admitido que lo ofrezca. Configura credenciales según sea necesario y verifica los límites de contexto y las herramientas disponibles. El comportamiento de respuesta del modelo sigue dependiendo del endpoint; las pruebas de que la simplificación es segura provienen de tus observaciones declaradas y las comprobaciones que realices.
Preguntas para refactorizar una máquina de estados
- ¿Qué debe contar como comportamiento observable en mi solicitud?
Enumera las salidas o decisiones de las que dependen los consumidores, no solo los nombres internos de estados. Si las transiciones emiten acciones o errores, inclúyelos. El ejemplo ilustrado basado en aceptación puede ser más limitado que el comportamiento que debe conservar tu aplicación real.
- ¿Pueden fusionarse siempre estados con aceptación equivalente en mi aplicación?
No sin comprobar el resto del contrato. Tu aplicación puede exponer identificadores, acciones u otros efectos dependientes del estado. Pide al asistente que examine esos consumidores antes de aplicar un argumento de equivalencia basado solo en la aceptación.
- ¿Cómo deben tratarse los estados inalcanzables durante la revisión?
Indica el estado inicial y cómo se determina la alcanzabilidad. Incluye un caso con entradas inalcanzables y la salida prevista. Revisa si los consumidores esperan que esas entradas sigan siendo identificables antes de aceptar eliminarlas o reagruparlas.
- ¿Qué debo probar tras cambiar identificadores de estado?
Comprueba transiciones, referencias almacenadas y cualquier interfaz que muestre o consuma identificadores. Ejecuta secuencias de comportamiento además de comprobaciones de estructura de la agrupación devuelta. Conservar la aceptación no demuestra por sí solo que el código dependiente siga interpretando correctamente la representación.
StateAmaranth · Actualizado 2026-10-25