33. Retículos (lattices)

Un retículo es un orden parcial en el que cualquier par de elementos tiene una mejor cota inferior y una mejor cota superior. Esta estructura unifica operaciones tan conocidas como intersección y unión de conjuntos, o mcd y mcm de enteros.

33.1 Introducción

Los órdenes parciales permiten que algunos elementos sean incomparables. Los retículos agregan una garantía muy útil: para dos elementos cualesquiera existe una forma canónica de combinarlos «hacia abajo» y otra «hacia arriba» dentro del orden.

Estas dos operaciones aparecen en conjuntos, permisos, jerarquías de tipos, análisis de programas y sistemas distribuidos. Aunque el nombre inglés lattice suele traducirse como retículo, no se refiere aquí a una matriz de puntos geométrica.

33.2 Recordatorio: orden parcial

Un orden parcial es una relación reflexiva, antisimétrica y transitiva. Se suele escribir a ≤ b, aunque el símbolo representa una relación general, no necesariamente el orden numérico.

Ejemplos de órdenes parciales:
⊆ entre conjuntos.
«divide a» entre enteros positivos.
«es prerequisito de» entre tareas sin ciclos.

Puede haber elementos incomparables.

Un retículo parte de un conjunto con orden parcial. Si la relación no es un orden parcial, las nociones de cota inferior y superior no describen la estructura buscada.

33.3 Cotas superiores

Sea S un subconjunto de un conjunto parcialmente ordenado P. Un elemento u de P es una cota superior de S si cada elemento de S es menor o igual que u.

u es cota superior de S si para todo s en S: s ≤ u.

Con inclusión de conjuntos:
{1, 2, 3} es cota superior de {{1}, {2}}.
También lo es {1, 2, 3, 4}.

Una colección puede tener varias cotas superiores o ninguna. La cota superior más pequeña, si existe, recibe un nombre especial: supremo o mínimo común superior.

33.4 Cotas inferiores

Un elemento l de P es una cota inferior de S si l es menor o igual que cada elemento de S.

l es cota inferior de S si para todo s en S: l ≤ s.

Con inclusión de conjuntos:
∅ es cota inferior de {{1, 2}, {2, 3}}.
También lo es {2}.

La cota inferior más grande, si existe, se llama ínfimo o máximo común inferior. Las palabras «superior» e «inferior» se interpretan siempre respecto del orden elegido.

33.5 Supremo e ínfimo

El supremo de S, denotado sup S, es la menor de todas sus cotas superiores. El ínfimo, denotado inf S, es la mayor de todas sus cotas inferiores.

sup S = la cota superior más pequeña.
inf S = la cota inferior más grande.

Para conjuntos ordenados por ⊆:
sup({A, B}) = A ∪ B.
inf({A, B}) = A ∩ B.

«Menor» y «mayor» no significan necesariamente cantidad de elementos. En el orden por inclusión, un conjunto es menor cuando está contenido en el otro.

33.6 Mínimo no es lo mismo que minimal

Un mínimo de un subconjunto S es un elemento que es menor o igual que todos los elementos de S. Un elemento minimal solo no tiene otro elemento estrictamente menor dentro de S.

En un orden parcial pueden existir varios elementos minimales incomparables.
Un mínimo, si existe, es único.

Análogamente, un máximo es único; puede haber varios maximales.

El ínfimo es una cota inferior máxima y no debe confundirse con un elemento minimal de S. Esta distinción es esencial al leer diagramas de Hasse.

33.7 Encuentro y unión

En un retículo, para dos elementos a y b, el ínfimo se llama encuentro y se denota a ∧ b. El supremo se llama unión o join y se denota a ∨ b.

a ∧ b = mayor elemento que es ≤ a y ≤ b.
a ∨ b = menor elemento que es ≥ a y ≥ b.

Los símbolos ∧ y ∨ son abstractos: su significado concreto depende del orden.

En conjuntos, ∧ se convierte en intersección y ∨ en unión. En divisibilidad, se convierten en mcd y mcm. El mismo lenguaje describe ambas situaciones.

33.8 Definición de retículo

Un conjunto parcialmente ordenado P es un retículo si para todo par a, b de P existen a ∧ b y a ∨ b.

Retículo = orden parcial + encuentro para cada par + unión para cada par.

No basta con que algunos pares tengan cotas.
La condición debe cumplirse para todos los pares de P.

La definición solo exige operaciones para pares. En un retículo finito, esta condición permite obtener ínfimos y supremos de cualquier subconjunto finito no vacío repitiendo las operaciones binarias.

33.9 Ejemplo: conjunto de partes

El conjunto de todos los subconjuntos de un conjunto U, llamado conjunto potencia y escrito P(U), ordenado por inclusión, es un retículo.

Sea U = {1, 2, 3}.
A = {1, 2}, B = {2, 3}.

A ∧ B = A ∩ B = {2}.
A ∨ B = A ∪ B = {1, 2, 3}.

La intersección siempre está contenida en ambos conjuntos y es la mayor con esa propiedad. La unión siempre contiene a ambos y es la menor con esa propiedad.

33.10 Ejemplo: divisores de un número

Consideremos los divisores positivos de 12 ordenados por divisibilidad: {1, 2, 3, 4, 6, 12}. Este conjunto forma un retículo.

Para 4 y 6:
4 ∧ 6 = mcd(4, 6) = 2.
4 ∨ 6 = mcm(4, 6) = 12.

2 divide a 4 y a 6; 12 es múltiplo de 4 y de 6.

Al restringirnos a los divisores de 12, tanto el mcd como el mcm de dos elementos vuelven a pertenecer al conjunto. Esta clausura es parte de lo que hace funcionar el ejemplo.

33.11 Diagrama de Hasse de divisores

El orden por divisibilidad de los divisores de 12 puede describirse por niveles:

Nivel superior: 12.
Debajo: 4 y 6.
Debajo: 2 y 3.
Nivel inferior: 1.

Las conexiones representan divisibilidad inmediata, no todas las relaciones transitivas.

Por ejemplo, 1 está por debajo de 12, pero no hace falta dibujar una arista directa porque existen cadenas intermedias. El encuentro de 4 y 6 se ubica hacia abajo; su unión, hacia arriba.

33.12 mcd y mcm como operaciones de retículo

En los enteros positivos ordenados por divisibilidad, el encuentro de a y b es mcd(a, b), y la unión es mcm(a, b).

a ∧ b = mcd(a, b).
a ∨ b = mcm(a, b).

mcd(18, 24) = 6.
mcm(18, 24) = 72.

El mcd es el mayor divisor común según el orden usual de enteros, pero desde la perspectiva de divisibilidad es la mayor cota inferior. El mcm es la menor cota superior en ese mismo orden.

33.13 Implementar encuentro y unión por divisibilidad

function mcd(a, b) {
  a = Math.abs(a);
  b = Math.abs(b);
  while (b !== 0) [a, b] = [b, a % b];
  return a;
}

function mcm(a, b) {
  if (a === 0 || b === 0) return 0;
  return Math.abs((a / mcd(a, b)) * b);
}

console.log({ encuentro: mcd(18, 24), union: mcm(18, 24) });
// { encuentro: 6, union: 72 }

La función mcm divide antes de multiplicar para reducir el riesgo de desbordamiento. Para enteros mayores que el rango seguro de JavaScript debe emplearse una variante con BigInt.

33.14 Operaciones de conjuntos en JavaScript

Si representamos conjuntos finitos con Set, la intersección y la unión implementan directamente ∧ y ∨ del retículo de subconjuntos.

function interseccion(a, b) {
  return new Set([...a].filter(valor => b.has(valor)));
}

function union(a, b) {
  return new Set([...a, ...b]);
}

const a = new Set([1, 2]);
const b = new Set([2, 3]);

console.log([...interseccion(a, b)]); // [2]
console.log([...union(a, b)]);        // [1, 2, 3]

Como los conjuntos no tienen orden inherente, los arreglos resultantes se muestran solo para inspección. Lo importante es la pertenencia, no la posición de los valores.

33.15 Leyes algebraicas de un retículo

Las operaciones ∧ y ∨ satisfacen leyes que recuerdan a la unión e intersección de conjuntos:

Idempotencia: a ∧ a = a y a ∨ a = a.
Conmutatividad: a ∧ b = b ∧ a; a ∨ b = b ∨ a.
Asociatividad: (a ∧ b) ∧ c = a ∧ (b ∧ c).
Absorción: a ∧ (a ∨ b) = a; a ∨ (a ∧ b) = a.

Estas leyes permiten tratar muchas expresiones sin referirse cada vez al diagrama de orden. Además, caracterizan algebraicamente a los retículos: una estructura con dos operaciones que las cumple puede interpretarse mediante un orden parcial.

33.16 Retículos acotados

Un retículo es acotado si tiene un elemento mínimo global 0 y un elemento máximo global 1. Estos símbolos son nombres estructurales y no tienen por qué ser los números cero y uno.

En P(U) ordenado por ⊆:
0 = ∅ y 1 = U.

En los divisores de 12 ordenados por |:
0 = 1 y 1 = 12.

El segundo ejemplo muestra por qué conviene pensar en «mínimo» y «máximo» del orden, no en el valor numérico. Bajo divisibilidad, 1 es el mínimo porque divide a todos los elementos.

33.17 Retículos distributivos

Un retículo es distributivo si encuentro y unión se distribuyen mutuamente, de forma análoga a multiplicación y suma:

a ∧ (b ∨ c) = (a ∧ b) ∨ (a ∧ c).
a ∨ (b ∧ c) = (a ∨ b) ∧ (a ∨ c).

El retículo de subconjuntos con intersección y unión es distributivo. Esta propiedad será importante al estudiar álgebra de Boole, donde además aparecen complementos.

33.18 Complementos y retículos booleanos

En un retículo acotado, un complemento de a es un elemento b que cumple a ∧ b = 0 y a ∨ b = 1. No todos los retículos poseen complementos.

En P(U):
a ∧ (U \ a) = ∅.
a ∨ (U \ a) = U.

Por ejemplo, en U = {1, 2, 3}, el complemento de {1, 3} es {2}.

Un retículo acotado, distributivo y complementado es un álgebra de Boole. El curso profundizará en esta estructura en los próximos temas de lógica y circuitos.

33.19 Un orden parcial que no es retículo

No todo orden parcial tiene encuentro y unión para cada par. Consideremos elementos a y b, ambos por debajo de dos elementos incomparables c y d, sin un elemento menor común entre c y d que siga estando por encima de a y b.

a ≤ c, a ≤ d, b ≤ c y b ≤ d.
c y d son cotas superiores de {a, b}.
Pero c y d son incomparables y no existe una cota superior menor que ambas.

{a, b} no tiene supremo: no es un retículo.

Tener cotas superiores no basta. Debe existir una cota superior que sea menor o igual que todas las otras cotas superiores, es decir, una unión bien definida.

33.20 Aplicaciones en programación

  • Permisos: combinar permisos puede modelarse como unión, y buscar capacidades comunes como intersección.
  • Análisis estático: la información de diferentes caminos de un programa se combina mediante operaciones de unión o encuentro.
  • Jerarquías de tipos: algunos sistemas usan tipos superior e inferior comunes para razonar sobre expresiones.
  • Sistemas distribuidos: estructuras de datos convergentes combinan estados con operaciones asociativas, conmutativas e idempotentes.
  • Dependencias: una estructura de orden parcial ayuda a expresar precedencias sin imponer un orden artificial entre tareas independientes.

El modelo exacto depende del dominio. Antes de llamar «unión» a una operación de software, se debe comprobar qué orden representa y si realmente satisface las propiedades requeridas.

33.21 Errores frecuentes

  • Confundir el supremo con un máximo numérico o el ínfimo con un mínimo numérico.
  • Suponer que todo orden parcial es automáticamente un retículo.
  • Confundir elementos maximales con un máximo global, o minimales con un mínimo global.
  • Usar mcd y mcm sin indicar que el orden considerado es la divisibilidad.
  • Creer que ∧ y ∨ siempre significan AND y OR lógicos.
  • Asumir que todos los retículos tienen complementos o son distributivos.

33.22 Qué debes recordar y conclusión

  • Una cota superior contiene o supera a todos los elementos considerados; una cota inferior está por debajo de todos ellos.
  • El supremo es la menor cota superior y el ínfimo es la mayor cota inferior.
  • Un retículo ofrece encuentro a ∧ b y unión a ∨ b para cualquier par.
  • En conjuntos ordenados por inclusión, ∧ es intersección y ∨ es unión.
  • En enteros positivos ordenados por divisibilidad, ∧ es mcd y ∨ es mcm.
  • Los retículos conectan órdenes parciales con las operaciones de álgebra de Boole.

Los retículos muestran que operaciones cotidianas de unión y encuentro comparten una misma estructura abstracta. En el próximo tema estudiaremos el álgebra de Boole, que formaliza la lógica de valores verdaderos y falsos mediante operaciones relacionadas.