32. Relaciones de equivalencia y de orden

Las relaciones describen cómo se vinculan los elementos de un conjunto. Algunas agrupan elementos indistinguibles bajo cierto criterio; otras los organizan mediante precedencia, inclusión o divisibilidad.

32.1 Introducción

En programación no solo importan los valores individuales, sino también sus vínculos: dos usuarios pueden ser iguales por un identificador, una tarea puede depender de otra, un conjunto puede estar contenido en otro y un archivo puede ser una versión posterior de otro.

La matemática discreta modela estos vínculos mediante relaciones. Dos familias especialmente importantes son las relaciones de equivalencia, que clasifican, y las relaciones de orden, que organizan o establecen precedencia.

32.2 Producto cartesiano

Dados dos conjuntos A y B, su producto cartesiano A × B es el conjunto de todos los pares ordenados (a, b) con a en A y b en B.

A = {1, 2}.
B = {x, y, z}.

A × B = {(1, x), (1, y), (1, z), (2, x), (2, y), (2, z)}.
|A × B| = |A|·|B| = 2·3 = 6.

El orden del par importa: (1, x) no es el mismo objeto que (x, 1). Las relaciones se construyen como subconjuntos de productos cartesianos.

32.3 Qué es una relación

Una relación R de A en B es un subconjunto de A × B. Si A = B, decimos que R es una relación sobre A. Escribimos aRb cuando el par (a, b) pertenece a R.

En los enteros, «menor o igual que» es una relación:
3 ≤ 5 es verdadera; 5 ≤ 3 es falsa.

En los conjuntos, «ser subconjunto de» también es una relación:
{1, 2} ⊆ {1, 2, 3}.

La misma pareja de conjuntos puede admitir muchas relaciones distintas. Las propiedades de R dependen de la regla que define cuáles pares pertenecen a ella.

32.4 Formas de representar una relación

En conjuntos finitos, una relación puede mostrarse como lista de pares, como matriz o como grafo dirigido. Cada formato resalta una característica diferente.

Lista: R = {(1, 1), (1, 2), (2, 2)}.

Matriz: fila a, columna b; 1 si aRb y 0 si no.

Grafo dirigido: un vértice por elemento y una flecha a → b cuando aRb.

La matriz permite verificar propiedades mediante patrones de filas y columnas. El grafo dirigido ayuda a visualizar recorridos, ciclos y dependencias.

32.5 Dominio, codominio e imagen

Para una relación R de A en B, el dominio de R contiene los elementos de A que se relacionan con al menos un elemento de B. La imagen contiene los elementos de B relacionados con al menos un elemento de A.

R = {(1, a), (1, b), (3, b)} de {1, 2, 3} en {a, b, c}.

Dominio de R = {1, 3}.
Imagen de R = {a, b}.

Una función es un caso particular de relación: cada elemento del dominio debe relacionarse con exactamente un elemento del codominio.

32.6 Propiedad reflexiva

Una relación R sobre A es reflexiva si cada elemento se relaciona consigo mismo:

R es reflexiva si para todo a en A: aRa.

La igualdad = y la relación ≤ son reflexivas.
La relación < no es reflexiva, porque nunca a < a.

En la matriz de una relación reflexiva, todos los elementos de la diagonal principal son 1. En un grafo dirigido, cada vértice tiene un lazo hacia sí mismo.

32.7 Propiedad simétrica

Una relación R sobre A es simétrica si al relacionarse a con b, también se relaciona b con a.

R es simétrica si aRb implica bRa.

«Tener la misma edad que» es simétrica.
«Ser menor o igual que» no es simétrica: 3 ≤ 5, pero 5 ≤ 3 es falso.

En la matriz, una relación simétrica se refleja respecto de la diagonal principal. En un grafo, toda flecha entre vértices distintos tiene su flecha inversa.

32.8 Propiedad antisimétrica

Una relación R es antisimétrica si aRb y bRa solo pueden ocurrir cuando a y b son el mismo elemento.

R es antisimétrica si aRb y bRa implican a = b.

≤ es antisimétrica: si a ≤ b y b ≤ a, entonces a = b.
⊆ es antisimétrica: si A ⊆ B y B ⊆ A, entonces A = B.

Antisimétrica no significa «no simétrica». La igualdad es simultáneamente simétrica y antisimétrica; fuera de la diagonal no tiene pares relacionados.

32.9 Propiedad transitiva

Una relación R es transitiva si una cadena de dos relaciones permite concluir una relación directa:

R es transitiva si aRb y bRc implican aRc.

Si 2 ≤ 5 y 5 ≤ 9, entonces 2 ≤ 9.
Si A ⊆ B y B ⊆ C, entonces A ⊆ C.

La transitividad permite deducir consecuencias de dependencias y precedencias. Una relación «ser amigo de» suele ser simétrica, pero no es necesariamente transitiva.

32.10 Resumen de propiedades

RelaciónReflexivaSimétricaAntisimétricaTransitiva
=
No
<NoNoSí (vacía de pares opuestos)
«misma edad»No en general
«ser amigo de»No en generalSí en un modelo mutuoNoNo en general

Las propiedades deben evaluarse respecto de un conjunto y una definición concretos. Una relación informal puede requerir aclaraciones antes de decidir si las cumple.

32.11 Relaciones de equivalencia

Una relación de equivalencia sobre A es reflexiva, simétrica y transitiva. Modela la idea de que dos elementos son indistinguibles según un criterio elegido.

Equivalencia = reflexiva + simétrica + transitiva.

Ejemplos:
igualdad de enteros;
tener el mismo resto módulo m;
cadenas con la misma longitud.

La equivalencia no requiere que los elementos sean idénticos. Dos enteros distintos pueden ser equivalentes módulo 5 si pertenecen a la misma clase de residuos.

32.12 Clases de equivalencia

La clase de equivalencia de a es el conjunto de todos los elementos relacionados con a. Se escribe [a].

Módulo 5:
[2] = {..., -8, -3, 2, 7, 12, ...}.

«Misma longitud» sobre cadenas:
["sol"] contiene todas las cadenas de longitud 3.

Si a y b son equivalentes, entonces [a] = [b]. Si no lo son, sus clases no tienen elementos en común. Por ello, las clases de equivalencia dividen el conjunto original en grupos disjuntos.

32.13 Particiones

Una partición de un conjunto A es una colección de subconjuntos no vacíos, disjuntos dos a dos, cuya unión es A. Las clases de cualquier relación de equivalencia forman una partición.

Los enteros módulo 3 se particionan en:
[0] = {..., -3, 0, 3, ...}.
[1] = {..., -2, 1, 4, ...}.
[2] = {..., -1, 2, 5, ...}.

También funciona al revés: toda partición define una relación de equivalencia, declarando equivalentes a dos elementos cuando pertenecen al mismo bloque de la partición.

32.14 Agrupar datos por una clave

En programación, agrupar registros por una clave construye clases de equivalencia. Por ejemplo, los productos con la misma categoría pertenecen a un mismo grupo respecto de la relación «tener igual categoría».

function agruparPorCategoria(productos) {
  const grupos = new Map();

  for (const producto of productos) {
    const grupo = grupos.get(producto.categoria) ?? [];
    grupo.push(producto.nombre);
    grupos.set(producto.categoria, grupo);
  }
  return grupos;
}

const productos = [
  { nombre: "teclado", categoria: "periféricos" },
  { nombre: "mouse", categoria: "periféricos" },
  { nombre: "monitor", categoria: "pantallas" }
];

console.log(agruparPorCategoria(productos));

Cada producto queda en exactamente un grupo siempre que cada registro tenga una categoría definida. Esa condición corresponde a que las clases formen una partición.

32.15 Relaciones de orden parcial

Una relación de orden parcial sobre A es reflexiva, antisimétrica y transitiva. Se suele denotar con ≤, aunque no tiene por qué ser el orden numérico habitual.

Orden parcial = reflexiva + antisimétrica + transitiva.

Ejemplos:
≤ sobre enteros;
⊆ sobre conjuntos;
«divide a» sobre enteros positivos;
«es prerequisito de» en un conjunto de tareas sin ciclos.

La palabra «parcial» indica que puede haber elementos que no se puedan comparar. No todos los órdenes parciales forman una sola cadena.

32.16 Divisibilidad como orden parcial

En los enteros positivos, definimos a ≤d b cuando a divide a b. Esta relación es un orden parcial.

2 ≤d 6, porque 2 | 6.
3 ≤d 6, porque 3 | 6.
Pero 2 y 3 son incomparables: 2 ∤ 3 y 3 ∤ 2.

Por eso la divisibilidad no es un orden total.

La reflexividad proviene de que a divide a. La antisimetría y transitividad se derivan de las propiedades de la divisibilidad.

32.17 Orden total

Un orden parcial es total o lineal si cualquier par de elementos puede compararse: para todos a y b, se cumple aRb o bRa.

El orden ≤ sobre los enteros es total:
para dos enteros a y b, siempre a ≤ b o b ≤ a.

La inclusión ⊆ sobre todos los subconjuntos no es total:
{1} y {2} son incomparables.

Ordenar una lista de números usa un orden total. En cambio, ordenar tareas con dependencias necesita tratar elementos incomparables y puede producir varias secuencias válidas.

32.18 Órdenes estrictos

Un orden estricto, como <, es irreflexivo y transitivo: ningún elemento es menor que sí mismo y las cadenas se preservan. A menudo se obtiene desde un orden no estricto eliminando la igualdad.

a < b si y solo si a ≤ b y a ≠ b.

En un orden parcial, a <R b puede significar:
aRb y a ≠ b.

Conviene no mezclar las propiedades de los órdenes estrictos con las de los no estrictos. Un orden parcial no estricto es reflexivo; su versión estricta correspondiente es irreflexiva.

32.19 Diagramas de Hasse

Un diagrama de Hasse representa un orden parcial sin dibujar lazos reflexivos ni flechas que se deducen por transitividad. Los elementos mayores se colocan visualmente por encima de los menores.

Para los divisores de 12:
1 está debajo de 2 y 3.
2 está debajo de 4 y 6.
3 está debajo de 6.
4 y 6 están debajo de 12.

No se dibuja 1 → 12: se deduce por transitividad.

Esta representación hace visibles los elementos incomparables y las relaciones de cobertura. El próximo tema estudiará estructuras de orden parcial con propiedades adicionales llamadas retículos.

32.20 Verificar propiedades en un conjunto finito

Para una relación definida por una función booleana relacion(a, b), podemos recorrer todas las parejas o ternas del conjunto finito y comprobar sus propiedades.

function esEquivalencia(elementos, relacion) {
  for (const a of elementos) {
    if (!relacion(a, a)) return false; // reflexividad

    for (const b of elementos) {
      if (relacion(a, b) && !relacion(b, a)) return false; // simetría

      for (const c of elementos) {
        if (relacion(a, b) && relacion(b, c) && !relacion(a, c)) {
          return false; // transitividad
        }
      }
    }
  }
  return true;
}

const mismoResiduoMod3 = (a, b) => ((a - b) % 3) === 0;
console.log(esEquivalencia([0, 1, 2, 3, 4, 5], mismoResiduoMod3)); // true

El algoritmo revisa O(n³) ternas por la condición de transitividad. Para conjuntos pequeños es claro y útil; en estructuras grandes se aprovechan propiedades específicas de la relación en lugar de probar todos los casos.

32.21 Verificar un orden parcial

function esOrdenParcial(elementos, relacion) {
  for (const a of elementos) {
    if (!relacion(a, a)) return false;

    for (const b of elementos) {
      if (relacion(a, b) && relacion(b, a) && a !== b) return false;

      for (const c of elementos) {
        if (relacion(a, b) && relacion(b, c) && !relacion(a, c)) {
          return false;
        }
      }
    }
  }
  return true;
}

const divide = (a, b) => b % a === 0;
console.log(esOrdenParcial([1, 2, 3, 6], divide)); // true

Para evitar ambigüedades, los elementos del ejemplo son números primitivos. Si se usan objetos, se debe definir con claridad qué significa que dos elementos sean iguales, por ejemplo mediante un identificador.

32.22 Aplicaciones en programación

  • Equivalencias: agrupar datos, deduplicar registros, clasificar por clave y normalizar residuos.
  • Órdenes parciales: dependencias de paquetes, tareas de compilación, permisos jerárquicos y versiones.
  • Órdenes totales: ordenar resultados, priorizar eventos y realizar búsquedas binarias.
  • Relaciones en general: grafos sociales, tablas de asociaciones, permisos y reglas de negocio.

Modelar explícitamente una relación obliga a precisar su significado. Esto previene errores como tratar una dependencia como si fuera simétrica o suponer que una clasificación permite comparar todos los elementos.

32.23 Errores frecuentes

  • Confundir simetría con antisimetría.
  • Suponer que toda relación transitiva es reflexiva.
  • Llamar orden total a una relación que tiene pares incomparables.
  • Olvidar que una equivalencia debe cumplir simultáneamente tres propiedades.
  • Creer que las clases de equivalencia pueden superponerse parcialmente.
  • Usar comparaciones de objetos en JavaScript sin definir una noción de igualdad de dominio.

32.24 Qué debes recordar y conclusión

  • Una relación es un conjunto de pares ordenados que describe vínculos entre elementos.
  • Reflexividad, simetría, antisimetría y transitividad caracterizan distintos tipos de relación.
  • Una equivalencia es reflexiva, simétrica y transitiva; sus clases forman una partición.
  • Un orden parcial es reflexivo, antisimétrico y transitivo; puede tener elementos incomparables.
  • Un orden total permite comparar cualquier par de elementos.
  • Las relaciones modelan agrupamientos, dependencias, jerarquías y ordenamientos de software.

Las relaciones de equivalencia permiten agrupar; las de orden permiten organizar. En el próximo tema estudiaremos retículos, órdenes parciales en los que ciertos pares poseen operaciones naturales de encuentro y unión.