La relación inversa de una relación R intercambia el orden de cada par: donde antes iba de a hacia b, ahora va de b hacia a. Permite recorrer vínculos en sentido contrario.
Muchas relaciones tienen un sentido natural: "es mayor que", "es padre de", "depende de". Pero a veces necesitamos recorrer esa relación al revés: "es menor que", "es hijo de", "es requerido por".
La relación inversa formaliza esa inversión de sentido. Dada cualquier relación, su inversa existe siempre y se obtiene simplemente intercambiando los componentes de cada par.
Sea R una relación de A en B. La relación inversa de R, escrita R⁻¹, es la relación de B en A definida por:
Es decir, (b, a) ∈ R⁻¹ si y solo si (a, b) ∈ R. También se la llama relación transpuesta o relación conversa.
Sea R = {(1, a), (2, a), (3, b), (3, c)} de A = {1, 2, 3} en B = {a, b, c}.
El dominio de R⁻¹ es {a, b, c} y su codominio es {1, 2, 3}: exactamente al revés que R.
Calcular la inversa es sencillo: basta con intercambiar cada par.
const R = [[1, 'a'], [2, 'a'], [3, 'b'], [3, 'c']];
function inversa(relacion) {
return relacion.map(([a, b]) => [b, a]);
}
console.log(inversa(R));
// [['a', 1], ['a', 2], ['b', 3], ['c', 3]]
La función usa map para transformar cada par [a, b] en [b, a].
Si M_R es la matriz booleana de R, entonces la matriz de R⁻¹ es la transpuesta de M_R: se intercambian filas y columnas.
function transponer(matriz) {
const filas = matriz.length;
const cols = matriz[0].length;
const resultado = Array.from({ length: cols }, () => Array(filas).fill(false));
for (let i = 0; i < filas; i++) {
for (let j = 0; j < cols; j++) {
resultado[j][i] = matriz[i][j];
}
}
return resultado;
}
// Matriz de R: A={1,2,3}, B={a,b,c}
const MR = [
[true, false, false], // fila 1: (1,a)
[true, false, false], // fila 2: (2,a)
[false, true, true ] // fila 3: (3,b), (3,c)
];
console.log(transponer(MR));
La matriz transpuesta tiene las dimensiones invertidas: si M_R es de tamaño n×m, entonces M_{R⁻¹} es de tamaño m×n.
| Propiedad | Enunciado |
|---|---|
| Involución | (R⁻¹)⁻¹ = R |
| Inversa de la unión | (R ∪ S)⁻¹ = R⁻¹ ∪ S⁻¹ |
| Inversa de la intersección | (R ∩ S)⁻¹ = R⁻¹ ∩ S⁻¹ |
| Inversa de la composición | (S ∘ R)⁻¹ = R⁻¹ ∘ S⁻¹ |
| Inversa de la identidad | I_A⁻¹ = I_A |
La propiedad de involución garantiza que invertir dos veces devuelve la relación original, igual que en los números con el recíproco doble.
La inversa conserva o transforma algunas propiedades de la relación original de manera predecible:
| Propiedad de R | ¿La conserva R⁻¹? | Justificación |
|---|---|---|
| Reflexiva | Sí | (a, a) ∈ R implica (a, a) ∈ R⁻¹ |
| Simétrica | Sí | Si R es simétrica, R⁻¹ = R |
| Antisimétrica | Sí | La condición antisimétrica se preserva al invertir |
| Transitiva | Sí | Si a→b→c en R, entonces c→b→a en R⁻¹ |
| Orden parcial | Sí | R⁻¹ también es un orden parcial (el "orden dual") |
Si R es una relación de orden parcial, su inversa R⁻¹ también lo es. Este orden inverso se llama orden dual o orden opuesto.
Ejemplo: En divisibilidad sobre {1, 2, 3, 6}, la inversa de "a divide a b" es "b es múltiplo de a". Ambas son órdenes parciales válidos sobre el mismo conjunto.
Una relación es simétrica si y solo si coincide con su inversa.
Esto puede aprovecharse como criterio de verificación:
function esSimetrica(relacion) {
return relacion.every(([a, b]) =>
relacion.some(([x, y]) => x === b && y === a)
);
}
const R1 = [[1, 2], [2, 1], [3, 3]];
const R2 = [[1, 2], [2, 3]];
console.log(esSimetrica(R1)); // true
console.log(esSimetrica(R2)); // false
La inversa de una composición invierte el orden de los factores, igual que ocurre con las matrices y con las funciones inversas.
Ejemplo: Si R representa "trabaja en" (empleado → empresa) y S representa "tiene sede en" (empresa → ciudad), entonces S ∘ R representa "trabaja en una empresa con sede en" (empleado → ciudad).
La inversa (S ∘ R)⁻¹ representa "tiene un empleado que trabaja en" (ciudad → empleado), y puede calcularse como R⁻¹ ∘ S⁻¹.
| Área | Relación original | Relación inversa |
|---|---|---|
| Grafos dirigidos | Aristas del grafo | Grafo transpuesto (aristas al revés) |
| Bases de datos | Tabla de referencia (clave foránea) | Consulta de quién referencia a quién |
| Sistemas de archivos | Directorio contiene archivo | Archivo pertenece a directorio |
| Herencia en POO | Clase hereda de superclase | Superclase tiene como subclase |
| Algoritmos de grafos | Alcanzabilidad hacia adelante | Alcanzabilidad hacia atrás (Kosaraju) |
En algoritmos de grafos como el de Kosaraju para componentes fuertemente conexas, se necesita el grafo transpuesto, que no es más que la relación inversa representada como lista de adyacencia.
// Grafo como lista de adyacencia
const grafo = {
1: [2, 3],
2: [4],
3: [4],
4: []
};
function transponerGrafo(g) {
const transpuesto = {};
for (const nodo of Object.keys(g)) {
transpuesto[nodo] = transpuesto[nodo] || [];
for (const vecino of g[nodo]) {
transpuesto[vecino] = transpuesto[vecino] || [];
transpuesto[vecino].push(Number(nodo));
}
}
return transpuesto;
}
console.log(transponerGrafo(grafo));
// { '1': [], '2': [1], '3': [1], '4': [2, 3] }
El grafo transpuesto se usa para verificar alcanzabilidad en sentido inverso.
La relación inversa es una operación simple pero poderosa: intercambiar los pares de una relación da acceso a la perspectiva opuesta del vínculo. Es fundamental en grafos transpuestos, órdenes duales, verificación de simetría y composición inversa.
En el próximo tema estudiaremos las propiedades algebraicas de las relaciones, reuniendo en un marco unificado las operaciones de unión, intersección, complemento, composición e inversa.