Capítulo 2 — Matemática discreta
Mapa de la lección
Lección 02 publicada. Mapa, ejemplo, EX003.
flowchart TD
N0["Resultados de aprendizaje y conexión"]
N1["2.1 La lógica es el lenguaje de los permisos"]
N2["2.2 Los grafos modelan la dependencia"]
N3["2.5 Actividad práctica: Lab 2"]
N4["Síntesis del capítulo"]
N0 --> N1 --> N2 --> N3 --> N4
N4 --> EX["Ejemplo resuelto"]
EX --> Q["Ejercicio EX003"]
Dibujo lógico
flowchart LR
N0["Resultados de aprendizaje y conexión"]
N1["2.1 La lógica es el lenguaje de los permisos"]
N2["2.2 Los grafos modelan la dependencia"]
N3["2.5 Actividad práctica: Lab 2"]
N4["Síntesis del capítulo"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX003"]
[Resultados de aprendizaje y conexión]
|
v
[2.1 La lógica es el lenguaje de los permisos]
|
v
[2.2 Los grafos modelan la dependencia]
|
v
[2.5 Actividad práctica: Lab 2]
|
v
[Síntesis del capítulo]
|
v
[Ejemplo resuelto] --> [Ejercicio EX003]
Resultados de aprendizaje y conexión
Al terminar este capítulo, usted podrá (1) escribir condiciones de enclavamiento y de permiso como expresiones booleanas y comprobarlas de forma exhaustiva con una tabla de verdad; (2) modelar las dependencias de la infraestructura como un grafo dirigido y calcular qué falla cuando falla un nodo; (3) usar conjuntos, relaciones y conteo para acotar en cuántos estados puede estar un sistema de control; y (4) indicar con precisión cuándo una comprobación exhaustiva es factible y cuándo no. El capítulo se apoya en la visión de existencias y flujos del capítulo 1 y prepara el capítulo 4, donde implementará estos modelos en código.
2.1 La lógica es el lenguaje de los permisos
Los sistemas de control están llenos de reglas del tipo «la bomba puede funcionar solo si…». Escríbalas como expresiones booleanas. Sea $H$ = nivel por encima del límite alto, $S$ = presión de aspiración baja, $P$ = permiso remoto presente, $M$ = manual local seleccionado. Una regla típica es $\text{RUN} = \neg H \wedge \neg S \wedge (P \vee M)$. Dos reglas son equivalentes si coinciden en todas las entradas; las leyes de De Morgan ($\neg(A\wedge B) = \neg A \vee \neg B$) permiten reescribir condiciones de disparo como permisos. Con cuatro entradas hay $2^4 = 16$ estados, y una tabla de verdad comprueba cada uno. La ingeniería de seguridad añade una pregunta que la seguridad funcional ya se hace: ¿qué entrada puede influir un atacante? Si $P$ llega por una red, entonces $P \vee M$ significa que un permiso falsificado basta para arrancar la bomba siempre que $H$ y $S$ sean falsos. Eso puede ser aceptable (los disparos físicos siguen actuando) o puede no serlo, si funcionar en ese momento provoca un transitorio de presión.
2.2 Los grafos modelan la dependencia
Un grafo dirigido $G = (V, E)$ tiene nodos y flechas. Trace una flecha de $a$ a $b$ cuando $a$ necesita $b$ para funcionar. El conjunto de lo afectado cuando $b$ falla es todo lo que puede alcanzar $b$ siguiendo las flechas: sus ancestros en esta orientación. La búsqueda en anchura calcula ese conjunto en un tiempo proporcional al número de aristas. Rinaldi, Peerenboom y Kelly (2001) distinguen interdependencias físicas, cibernéticas, geográficas y lógicas entre infraestructuras; un grafo de dependencias es el modelo más simple que puede contener las cuatro, siempre que se etiquete cada arista con su tipo.
Vocabulario de grafos que usará: camino, ciclo (un bucle de dependencia; por ejemplo, la red de telemetría necesita la energía de la red eléctrica y la restauración del operador de la red necesita telemetría), grado de entrada y grado de salida, vértice de corte (un nodo cuya eliminación desconecta el grafo) y componente fuertemente conexa. Un vértice de corte en un grafo de suministro es un punto único de falla.
2.3 Conteo, espacios de estados y sus límites
Un sistema con $n$ entradas binarias tiene $2^n$ estados de entrada; con 30 entradas son más de mil millones. Si se añade memoria interna (temporizadores, enclavamientos con retención), el espacio de estados crece todavía más rápido. La comprobación exhaustiva es excelente para enclavamientos pequeños e imposible para plantas enteras; para estas se usa la estructura (descomposición, invariantes) y el muestreo (capítulo 30). El principio del palomar da cotas de seguridad rápidas: un contador de mensajes de 16 bits da la vuelta tras 65.536 mensajes, de modo que, a un mensaje por segundo, se repite en unas 18 horas, y a partir de ahí falla una comprobación contra repetición basada solo en ese contador.
2.4 Ejemplo resuelto: dependencias de Lowmarsh (sintético)
Los ingenieros de LRWA enumeran de qué depende el suministro del Hospital St Brenna's: del depósito de Hollin Hill y de la alimentación directa desde PS4; Hollin Hill depende de PS3; cada estación de bombeo necesita energía de la red eléctrica y su RTU; ambas RTU se comunican por una red LTE privada que, a su vez, se alimenta del alimentador F1 de la red. El Lab 2 codifica esto y calcula el conjunto de impacto de cada falla. Perder el alimentador F1 deja fuera de servicio la red LTE además de PS3, de modo que también se pierde la telemetría «redundante» de PS4, que está en el alimentador F2. El diseño de dos alimentadores parecía diverso en el plano eléctrico; el grafo muestra una dependencia común a través de las comunicaciones.
2.5 Actividad práctica: Lab 2
# Lab 2 - dependency closure and an interlock truth table (synthetic Lowmarsh assets, offline)
from collections import deque
from itertools import product
DEPENDS = { # asset: assets it needs in order to work
"hospital_supply": ["hollin_res", "ps4"],
"hollin_res": ["ps3"], "ps4": ["grid_f2", "rtu4"], "ps3": ["grid_f1", "rtu3"],
"rtu3": ["lte"], "rtu4": ["lte"], "lte": ["grid_f1"], "fenwick_wtw": ["grid_f1", "chlorine"],
"ps3_feed": ["fenwick_wtw"],
}
def impacted(failed):
users = {}
for a, ds in DEPENDS.items():
for d in ds: users.setdefault(d, []).append(a)
seen, q = {failed}, deque([failed])
while q:
n = q.popleft()
for u in users.get(n, []):
if u not in seen: seen.add(u); q.append(u)
return sorted(seen - {failed})
for f in ("grid_f1", "lte", "grid_f2", "chlorine"):
print(f"{f:9} -> {impacted(f)}")
# Pump P3 may run iff level below high AND suction not low AND (remote permit OR local manual)
rows = [(h, s, p, m, (not h) and (not s) and (p or m)) for h, s, p, m in product([0, 1], repeat=4)]
print("states allowing run:", sum(r[4] for r in rows), "of", len(rows))
Salida esperada:
grid_f1 -> ['fenwick_wtw', 'hollin_res', 'hospital_supply', 'lte', 'ps3', 'ps3_feed', 'ps4', 'rtu3', 'rtu4']
lte -> ['hollin_res', 'hospital_supply', 'ps3', 'ps4', 'rtu3', 'rtu4']
grid_f2 -> ['hospital_supply', 'ps4']
chlorine -> ['fenwick_wtw', 'ps3_feed']
states allowing run: 3 of 16
Solo 3 de los 16 estados de entrada permiten que la bomba funcione: aquellos con $H = S = 0$ y al menos uno de $P, M$.
Lea despacio la lista de impacto del alimentador F1. Contiene la red LTE, ambas RTU y PS4, aunque PS4 se alimenta del alimentador F2, porque la RTU de PS4 llega a la sala de control solo a través de LTE. Esa es la dependencia común oculta que describe el ejemplo resuelto. El resultado de la tabla de verdad es igual de concreto: tres de dieciséis estados permiten que la bomba funcione, y todos ellos exigen que las entradas de nivel alto y de aspiración baja sean falsas, de modo que un permiso remoto falsificado por sí solo nunca puede arrancar la bomba en una condición de disparo.
2.6 Errores comunes y límites
- Trazar flechas en direcciones mezcladas («alimenta» frente a «depende de») en un mismo grafo.
- Tratar dos caminos como redundantes sin comprobar los nodos compartidos más abajo.
- Probar un enclavamiento solo con casos «típicos», cuando la tabla es lo bastante pequeña para probarlos todos.
- Olvidar que un grafo modela si algo funciona, no cuán bien: los modos degradados necesitan pesos o estados (capítulo 22).
- Elegir tamaños de contadores e identificadores sin contar cuánto tardan en dar la vuelta.
En LRWA estos errores tienen consecuencias directas: un grafo que mezcla direcciones de flechas indicaría que perder PS4 perjudica al alimentador F2, y una revisión que se detuviera en el plano eléctrico habría pasado por alto por completo la dependencia LTE compartida.
Ejercicios — capítulo 2
EX003 — Reescritura de un enclavamiento. Objetivo: manipular expresiones booleanas y razonar sobre entradas que llegan por la red. Entradas: RUN de §2.1. Pasos: (1) escriba la condición de disparo $\neg\text{RUN}$ en forma de suma de productos usando las leyes de De Morgan; (2) enumere los estados en los que un permiso remoto falsificado cambia el resultado; (3) proponga un cambio que mantenga la operación remota pero exija una segunda condición independiente. Evidencia esperada: expresiones, lista y propuesta. Rúbrica: 3 = álgebra correcta, exactamente los estados correctos, propuesta independiente del mismo camino de red; 2 = un desliz; 1 = solo el álgebra; 0 = nada.
EX004 — Comprobación de diversidad. Objetivo: encontrar dependencias comunes ocultas. Entradas: Lab 2. Pasos: (1) añada un enlace satelital con respaldo de baterías, sat, que solo usa RTU4 y que no depende de la red eléctrica; (2) vuelva a ejecutar e informe el impacto de grid_f1; (3) indique si el suministro del hospital sobrevive ahora a la pérdida de F1 y qué sigue sin decirle el grafo. Evidencia esperada: diccionario modificado, salida, dos frases. Rúbrica: 3 = modelado correcto (que rtu4 dependa de lte o de sat obliga a señalar que este grafo simple solo modela dependencias de tipo Y), conclusión honesta sobre ese límite; 2 = salida correcta, límite omitido; 1 = no ejecutado; 0 = nada.
Síntesis del capítulo
Escriba las reglas como lógica y las dependencias como grafos, y deje que la computadora las compruebe. Los enclavamientos pequeños pueden y deben comprobarse de forma exhaustiva; los sistemas completos no, y el conteo se lo indica. Busque nodos compartidos detrás de caminos aparentemente diversos, etiquete las aristas con su tipo y pregúntese, de cada entrada, cuáles llegan por una red que un adversario podría alcanzar.
Siga estudiando — capítulo 02 de 50
← Capítulo 01 · Índice de capítulos del curso · Capítulo 03 →
Continúe con la siguiente lección escrita.