El producto cartesiano genera todos los pares ordenados posibles entre dos conjuntos. A partir de esos pares podemos definir relaciones discretas seleccionando solo los vínculos que cumplen una condición.
Las relaciones discretas se construyen a partir de pares ordenados. Para saber qué pares pueden existir entre dos conjuntos, usamos el producto cartesiano.
El producto cartesiano permite formar todas las combinaciones posibles entre los elementos de un primer conjunto y los elementos de un segundo conjunto. Luego, una relación se obtiene seleccionando algunos de esos pares.
Dados dos conjuntos A y B, el producto cartesiano A × B es el conjunto de todos los pares ordenados (a, b) donde a pertenece a A y b pertenece a B.
El primer componente de cada par sale de A. El segundo componente sale de B.
El producto cartesiano no es conmutativo en general. Esto significa que A × B no representa lo mismo que B × A.
Los mismos elementos aparecen combinados, pero cada par tiene sus componentes en posiciones distintas.
Si el conjunto A tiene m elementos y el conjunto B tiene n elementos, entonces A × B tiene m × n pares ordenados.
| Conjunto A | Conjunto B | Cantidad en A × B |
|---|---|---|
| {1, 2} | {a, b, c} | 2 × 3 = 6 pares |
| {Ana, Luis, Marta} | {leer, editar} | 3 × 2 = 6 pares |
| {pendiente, aprobado} | {aprobado, rechazado, archivado} | 2 × 3 = 6 pares |
Podemos generar el producto cartesiano recorriendo cada elemento del primer conjunto y combinándolo con cada elemento del segundo conjunto.
function productoCartesiano(A, B) {
const pares = [];
for (const a of A) {
for (const b of B) {
pares.push([a, b]);
}
}
return pares;
}
console.log(productoCartesiano([1, 2], ["x", "y"]));
El resultado es una lista con todos los pares ordenados posibles.
Una relación entre A y B es un subconjunto de A × B. Esto significa que una relación toma algunos pares posibles, no necesariamente todos.
En este ejemplo, la relación selecciona pares donde el segundo número es una unidad mayor que el primero.
Muchas relaciones se definen mediante una condición lógica. Por ejemplo, podemos decir que a está relacionado con b si a < b.
const A = [1, 2, 3];
const B = [1, 2, 3, 4];
const relacionMenorQue = productoCartesiano(A, B)
.filter(([a, b]) => a < b);
console.log(relacionMenorQue);
function productoCartesiano(A, B) {
return A.flatMap(a => B.map(b => [a, b]));
}
Primero generamos todos los pares posibles y luego conservamos solo los que cumplen la condición.
Una misma relación puede representarse de varias formas. La elección depende del problema y de las operaciones que queramos realizar.
| Representación | Descripción | Uso habitual |
|---|---|---|
| Pares ordenados | Lista explícita de vínculos. | Permisos, asociaciones, dependencias. |
| Tabla | Filas y columnas que muestran combinaciones. | Bases de datos y reportes. |
| Matriz | Valores 0 o 1 que indican si existe relación. | Cálculo, análisis y algoritmos. |
| Grafo dirigido | Nodos conectados por flechas. | Rutas, redes, dependencias y estados. |
Supongamos que tenemos usuarios y permisos disponibles. El producto cartesiano contiene todas las asignaciones posibles, pero la relación de permisos reales contiene solo las autorizadas.
const usuarios = ["Ana", "Luis"];
const permisos = ["leer", "editar", "eliminar"];
const todosLosPares = productoCartesiano(usuarios, permisos);
const permisosAsignados = [
["Ana", "leer"],
["Ana", "editar"],
["Luis", "leer"]
];
console.log("Pares posibles:", todosLosPares);
console.log("Relación real:", permisosAsignados);
function productoCartesiano(A, B) {
return A.flatMap(a => B.map(b => [a, b]));
}
La relación real es un subconjunto de todas las combinaciones posibles entre usuarios y permisos.
Para conjuntos pequeños, una tabla puede mostrar con claridad qué pares pertenecen a una relación. Marcamos con 1 cuando el vínculo existe y con 0 cuando no existe.
| Usuario / Permiso | leer | editar | eliminar |
|---|---|---|---|
| Ana | 1 | 1 | 0 |
| Luis | 1 | 0 | 0 |
Esta forma anticipa la representación matricial de relaciones, que estudiaremos más adelante.
El producto cartesiano nos da el universo de pares posibles. Una relación discreta selecciona algunos de esos pares para expresar vínculos concretos entre elementos.
En el próximo tema estudiaremos el concepto de relación binaria, una de las formas más importantes de relación en matemáticas discretas e informática.