Automation
2026-01-16

Ajedrez, PLC y máquinas de estados finitos

Estaba en la pausa del café, después de varias horas programando, mirando las musarañas como si de ahí fuera a salir la solución.

Cuando llevas mucho rato encima del código, el cuerpo sigue en automático, pero la cabeza empieza a divagar sin pedir permiso.

En una de esas divagaciones me di cuenta de una cosa.

Hay dos cosas que me gustan mucho en la vida: programar PLCs y jugar al ajedrez.

Lo típico sería decir algo como “ambas son estrategia” y quedarte tan ancho, pero lo que me obsesionó fue otra cosa: que, si te pones formal, ambas se pueden describir con el mismo modelo matemático.

Ese modelo es la máquina de estados finitos (FSM).

Y no, no lo digo como metáfora bonita. Lo digo como: “puedo escribir la 5-tupla, definir el estado, definir los eventos, definir la transición… y todo encaja”.

"Vale, relájate Samuel... pero sí: el ajedrez es una FSM. Y un PLC bien hecho, también."

1) Qué es una FSM (definición matemática real)

Una máquina de estados finitos se define como la 5-tupla:

\[ M = (S,\ \Sigma,\ \delta,\ s_0,\ F) \]
  • S: conjunto finito y no vacío de estados.
  • Σ: conjunto finito de entradas / eventos.
  • δ: función de transición de estado.
  • s₀ ∈ S: estado inicial.
  • F ⊆ S: estados finales (si el sistema “acepta” o “termina”).

En el caso clásico determinista (DFA/FSM determinista), la transición es una función:

\[ \delta : S\times \Sigma \rightarrow S \]

Es decir: estado actual + eventosiguiente estado (único).

Y la dinámica temporal es discreta:

\[ sₖ₊₁ = \delta(sₖ, σₖ) \]

Dos notas técnicas importantes (aquí empieza lo divertido):

1.1 FSM parcial vs total (y el “estado error”)

En muchos sistemas reales, hay entradas/eventos que simplemente no aplican en ciertos estados. Matemáticamente eso significa que δ no está definida para algunos pares (s,σ). Eso es una FSM parcialmente definida.

Si quieres “totalizar” el modelo (que δ esté siempre definida), haces un truco estándar: añades un estado sumidero (error) y mandas todo lo ilegal ahí:

\[ \begin{aligned} \delta'(s,\sigma) &= \delta(s,\sigma) &&\text{si está definida}\\ \delta'(s,\sigma) &= \perp &&\text{si no está definida}\\ \delta'(\perp,\sigma) &= \perp &&\forall\,\sigma \end{aligned} \]

Esto en PLC suena a: “si me llega algo imposible, me voy a FAULT/SAFE y me quedo ahí”.

1.2 Grafo de estados (porque todo acaba siendo un grafo)

Una FSM se puede ver como un grafo dirigido:

\[ \begin{aligned} G&=(V,E),\qquad V=S,\\ E&\subseteq S\times \Sigma\times S \quad (\text{aristas etiquetadas}) \end{aligned} \]

Y esto permite hacer análisis muy útiles:

  • Alcanzabilidad: estados a los que puedes llegar desde s₀.
  • Estados muertos: estados desde los que no hay salida útil (o te quedas atrapado).
  • Ciclos: comportamiento recurrente.
  • Estados absorbentes: una vez entras, no sales (FAULT típico).

Si te gusta la teoría: estás a un paso de hablar de propiedades de seguridad (“nunca pasa X”) y propiedades de vivacidad (“eventualmente pasa Y”). Pero no me voy a flipar… todavía.

2) El ajedrez como FSM (sin humo)

Para modelar el ajedrez como FSM, necesitamos definir un estado que haga el sistema determinista. Una definición mínima razonable es:


s = (B, t, c, e)
              
  • B: tablero completo (qué pieza hay en cada casilla).
  • t: turno (W/B).
  • c: derechos de enroque.
  • e: casilla de captura al paso (o “no aplica”).

Más formal (porque aquí hemos venido a lucirnos):

\[ \begin{aligned} B&:\{1,\dots,64\}\rightarrow P\cup\{\emptyset\}\\ t&\in\{W,B\}\\ c&\subseteq\{WK,WQ,BK,BQ\}\\ e&\in\{1,\dots,64\}\cup\{\perp\} \end{aligned} \]

Con esto, el conjunto de estados es:

\[ S=\{(B,t,c,e)\ \mid\ \text{estado legal según las reglas}\} \]

Los eventos Σ son movimientos (jugadas). Un movimiento puede representarse como:

\[ \begin{aligned} m&=(from,to,promo)\\ from,to&\in\{1,\dots,64\}\\ promo&\in\{Q,R,B,N,\perp\} \end{aligned} \]

Y la transición es “aplicar una jugada legal”:

\[ \begin{aligned} \delta(s,m)&=s' &&\text{si }m\text{ es legal en }s\\ \text{(no definida)} &&&\text{si }m\text{ es ilegal en }s \end{aligned} \]

Los estados finales F incluyen:

  • Mate: jugador al turno en jaque y sin jugadas legales.
  • Tablas: ahogado, triple repetición, regla de los 50 movimientos, material insuficiente, etc.

Una partida, matemáticamente, es una trayectoria:

\[ s₀ —m₁\rightarrow s₁ —m₂\rightarrow … —mₖ\rightarrow sₖ \]

Y sí: el espacio de estados es enorme, pero finito. Así que sigue siendo FSM.

3) Un PLC como FSM (modelo de ingeniería)

En automatización, solemos pensar en términos de “modos” y “pasos”. Eso ya es una FSM, aunque nadie lo llame así.

Un estado típico de PLC lo puedes escribir así:


s = (mode, step, flags)
              
  • mode: STOP / MANUAL / AUTO / FAULT / ...
  • step: índice de secuencia (GRAFCET implícito o explícito).
  • flags: memorias internas, enclavamientos, diagnósticos latched, etc.

Las entradas Σ son (dependiendo del sistema): sensores, timers, comandos del operador, señales de safety, comunicaciones, etc.

Y la transición δ la implementas tú. En cada scan:

\[ sₖ₊₁ = \delta(sₖ, inputsₖ) \]

Nota: en PLC, inputsₖ es un vector muestreado en el tiempo. Aun así, el modelo FSM funciona bien porque el scan define un “tiempo discreto” natural.

3.1 Moore vs Mealy (sí, también en PLC)

En teoría de autómatas hay dos formas típicas de asociar salidas:

  • Moore: la salida depende solo del estado: y = g(s).
  • Mealy: la salida depende del estado y la entrada: y = g(s, σ).

En PLC, si quieres un comportamiento estable y fácil de depurar, tiendes a diseñar más “Moore” (acciones por estado) y dejar “Mealy” para decisiones de transición (guards).

4) Puntos en común (los de verdad)

4.1 Ambos son sistemas dinámicos discretos

\[ sₖ₊₁ = \delta(sₖ, σₖ) \]

En ajedrez cada “tick” es una jugada. En PLC cada “tick” es un scan.

4.2 Ambos son deterministas (la incertidumbre está fuera)

En ambos casos, δ es determinista: si el estado y el evento son los mismos, el siguiente estado es el mismo.

4.3 Estados válidos ≠ estados deseables

Este es el paralelismo más útil:

\[ S=S_{\mathrm{safe}}\cup S_{\mathrm{unsafe}} \]
  • En ajedrez: hay posiciones legales pero perdidas.
  • En PLC: hay estados alcanzables pero peligrosos o inestables.

4.4 Transiciones prohibidas

  • Ajedrez: reglas → jugadas ilegales.
  • PLC: interlocks → transiciones imposibles.

Formalmente: δ no definida (o transición a estado error/safe).

4.5 Ciclos y estados absorbentes

Ambos tienen ciclos. Y ambos tienen estados “terminales” o absorbentes.

\[ \delta(s_f,\sigma)=s_f\qquad \forall\,\sigma \]

En ajedrez: mate/tablas. En PLC: FAULT/E-STOP (hasta reset consciente).

5) Vale, ¿y esto cómo se lleva a la práctica en un PLC?

Aquí van principios que salen directamente del modelo:

Principio 1 — Estado explícito, único, y sin “telepatía”

Si tu máquina tiene modos/pasos, decláralos como tal. Si no lo haces, igual existen, pero escondidos en flags dispersos.

Principio 2 — Diseña δ (transiciones) antes que el “qué hacer”

Primero define el grafo (qué estados hay y cómo conectan). Luego implementas acciones.

Principio 3 — Prohíbe lo peligroso (no confíes en la suerte)

Si un camino existe en el grafo, alguien (o algo) lo encontrará. Haz S_unsafe inalcanzable o intercepta hacia SAFE/FAULT.

Principio 4 — Los fallos son estados, no IFs sueltos

Un fallo no es un IF aislado: merece un estado absorbente y un reset consciente.

Principio 5 — Si no lo puedes dibujar, probablemente está mal

Un diagrama sencillo de estados suele revelar problemas que el código oculta.

6) Mini-ejemplo (FSM industrial típica)


S = {IDLE, EXTENDING, EXTENDED, RETRACTING, FAULT}

IDLE      --cmd_extend-->   EXTENDING
EXTENDING --s_ext-->        EXTENDED
EXTENDING --timeout-->      FAULT

EXTENDED  --cmd_retract-->  RETRACTING
RETRACTING--s_ret-->        IDLE
RETRACTING--timeout-->      FAULT

FAULT     --reset & ok-->   IDLE
FAULT     --other-->        FAULT
              

7) Cierre

En ajedrez rara vez pierdes por una jugada aislada. Pierdes porque permitiste que la partida entrara en una región del espacio de estados donde ya no había buenas salidas.

En automatización industrial pasa lo mismo. La diferencia es que aquí el coste del error es real.


Diseñar una FSM no es “academia”.
Es ingeniería: control explícito del espacio de estados alcanzable.
              
← ALL INSIGHTS HOME →
META
POST
SLUG
chess_fsm
LANG
es
TAG
Automation
Edita el contenido en content/insights/chess_fsm.es.md y vuelve a ejecutar el build.