Los pares ordenados son una forma directa y precisa de representar relaciones discretas. Cada par indica un vínculo concreto entre un elemento de origen y un elemento de destino.
Una relación discreta puede representarse de varias maneras: pares ordenados, tablas, matrices o grafos. La representación mediante pares ordenados es una de las más simples, porque enumera explícitamente cada vínculo existente.
Esta forma es muy útil cuando queremos definir una relación con claridad, verificar si un vínculo existe o construir ejemplos pequeños antes de pasar a representaciones más compactas.
Una relación R puede escribirse como un conjunto de pares ordenados. Cada par tiene la forma (a, b).
El primer componente suele representar el origen, la entrada, el sujeto o el elemento inicial. El segundo componente representa el destino, la salida, el objeto relacionado o el elemento final.
Si queremos representar qué permisos tiene cada usuario, podemos usar pares ordenados.
El par (Ana, editar) indica que Ana tiene permiso para editar. El par (Luis, editar) no aparece, por lo tanto ese permiso no está asignado a Luis dentro de esta relación.
La lectura de un par depende del significado de la relación. No basta con mirar los datos: también hay que conocer la regla que interpreta el vínculo.
| Relación | Par ordenado | Lectura |
|---|---|---|
| usuario tiene permiso | (Ana, leer) | Ana tiene permiso para leer. |
| producto pertenece a categoría | (teclado, periféricos) | El teclado pertenece a la categoría periféricos. |
| ciudad conecta con ciudad | (Córdoba, Rosario) | Hay una conexión desde Córdoba hacia Rosario. |
| tarea depende de tarea | (interfaz, API) | La interfaz depende de la API. |
En un par ordenado, cambiar el orden puede cambiar completamente el significado.
Esos dos pares no son equivalentes. Por eso esta representación es adecuada para relaciones dirigidas, como dependencias, rutas, transiciones y asignaciones.
En JavaScript, podemos representar una relación como una lista de arreglos de dos posiciones. Cada arreglo interno representa un par ordenado.
const permisos = [
["Ana", "leer"],
["Ana", "editar"],
["Luis", "leer"],
["Marta", "comentar"]
];
console.log(permisos);
Esta representación es simple y permite recorrer la relación con estructuras habituales del lenguaje.
Una consulta común consiste en preguntar si un par pertenece a una relación. En código, esto equivale a buscar si existe un par con ambos componentes.
const permisos = [
["Ana", "leer"],
["Ana", "editar"],
["Luis", "leer"]
];
function contienePar(relacion, origen, destino) {
return relacion.some(([a, b]) => a === origen && b === destino);
}
console.log(contienePar(permisos, "Ana", "editar"));
console.log(contienePar(permisos, "Luis", "editar"));
También podemos construir una relación mediante una condición. Por ejemplo, sobre el conjunto {1, 2, 3, 4}, definimos que a está relacionado con b si a < b.
const conjunto = [1, 2, 3, 4];
const menorQue = conjunto.flatMap(a =>
conjunto
.filter(b => a < b)
.map(b => [a, b])
);
console.log(menorQue);
El resultado es el conjunto de pares ordenados que cumplen la regla.
Como una relación es un conjunto de pares, no debería contener pares repetidos. En programación, si usamos arreglos, debemos controlar esa duplicación manualmente.
const relacionConRepetidos = [
["Ana", "leer"],
["Ana", "leer"],
["Luis", "editar"]
];
const clavesUnicas = new Set();
const relacionSinRepetidos = [];
for (const par of relacionConRepetidos) {
const clave = JSON.stringify(par);
if (!clavesUnicas.has(clave)) {
clavesUnicas.add(clave);
relacionSinRepetidos.push(par);
}
}
console.log(relacionSinRepetidos);
La clave generada permite detectar cuándo dos pares tienen los mismos componentes en el mismo orden.
Dentro de un producto cartesiano, hay dos casos extremos: la relación vacía y la relación universal.
| Relación | Descripción | Ejemplo |
|---|---|---|
| Relación vacía | No contiene ningún par. | R = {} |
| Relación universal | Contiene todos los pares del producto cartesiano. | R = A × B |
Entre esos dos extremos se encuentran la mayoría de las relaciones que se usan en problemas reales.
| Aspecto | Detalle |
|---|---|
| Ventaja | Es clara, explícita y fácil de leer para relaciones pequeñas. |
| Ventaja | Permite consultar pertenencia, dominio e imagen de forma directa. |
| Límite | Puede ocupar mucho espacio si la relación tiene muchos pares. |
| Límite | No siempre es la forma más eficiente para cálculos repetidos o relaciones densas. |
Representar relaciones mediante pares ordenados permite expresar de forma directa qué vínculos existen entre los elementos de dos conjuntos. Es una base sólida para luego pasar a representaciones más compactas o visuales.
En el próximo tema estudiaremos la representación matricial de relaciones, una forma especialmente útil para cálculos y análisis sistemático.