1. ¿Qué son las relaciones y funciones discretas?

Las relaciones y funciones discretas permiten describir vínculos entre elementos separados, como usuarios, permisos, nodos, estados, claves, valores y decisiones lógicas dentro de un programa.

1.1 Introducción

En matemáticas discretas trabajamos con objetos separados y contables: números enteros, elementos de un conjunto, registros de una base de datos, vértices de un grafo o estados de un algoritmo.

Una relación discreta indica qué elementos están vinculados entre sí. Una función discreta es un caso especial de relación en el que cada elemento de entrada tiene una única salida asociada.

Estas ideas son fundamentales en programación porque permiten modelar dependencias, clasificaciones, recorridos, equivalencias, asignaciones y reglas de decisión.

1.2 Qué es una relación discreta

Una relación discreta conecta elementos de uno o más conjuntos. Por ejemplo, si tenemos un conjunto de estudiantes y un conjunto de materias, podemos relacionar cada estudiante con las materias que cursa.

Estudiantes = {Ana, Luis, Marta} Materias = {Matemática, Programación} Relación cursa: {(Ana, Programación), (Luis, Matemática), (Marta, Programación)}

Cada par ordenado indica un vínculo concreto. El par (Ana, Programación) significa que Ana cursa Programación.

1.3 Qué es una función discreta

Una función discreta también relaciona elementos, pero con una condición más estricta: cada entrada debe estar asociada con una sola salida.

usuarioAsignado(idTicket) = técnicoResponsable

Si cada ticket de soporte tiene un único técnico responsable, esa asignación puede modelarse como una función. En cambio, si un estudiante puede cursar varias materias, esa relación no necesariamente es una función desde estudiantes hacia materias.

1.4 Diferencia entre relación y función

Concepto Idea principal Ejemplo
Relación Un elemento puede vincularse con ninguno, uno o varios elementos. Un usuario puede tener varios roles.
Función Cada entrada tiene exactamente una salida. Un DNI corresponde a una sola persona.

1.5 Representación mediante pares ordenados

Una de las formas más simples de representar una relación es usar pares ordenados. El primer elemento del par suele indicar el origen y el segundo elemento indica el destino o valor relacionado.

R = {(1, 2), (1, 3), (2, 4), (3, 4)}

Esta relación puede leerse como: 1 está relacionado con 2, 1 está relacionado con 3, 2 está relacionado con 4 y 3 está relacionado con 4.

1.6 Relaciones discretas en JavaScript

En programación podemos representar una relación como una lista de pares. Cada par puede almacenarse como un arreglo de dos posiciones.

const relacion = [
  ["Ana", "Programación"],
  ["Luis", "Matemática"],
  ["Marta", "Programación"]
];

console.log(relacion);

Esta estructura permite recorrer, filtrar y consultar vínculos entre elementos, igual que se haría con registros de una base de datos o aristas de un grafo.

1.7 Funciones discretas en JavaScript

Una función discreta puede representarse con un objeto o un mapa cuando cada clave tiene un único valor asociado.

const responsablePorTicket = {
  T100: "Ana",
  T101: "Luis",
  T102: "Marta"
};

console.log(responsablePorTicket.T101);

La clave T101 tiene una sola salida: Luis. Por eso esta asignación se comporta como una función discreta.

1.8 Ejemplos en informática

Área Relación o función discreta Uso habitual
Bases de datos Relación entre tablas Vincular clientes con pedidos.
Estructuras de datos Relación entre nodos Representar listas, árboles y grafos.
Seguridad Usuarios y permisos Determinar qué acciones puede realizar cada usuario.
Algoritmos Estados y transiciones Modelar autómatas, recorridos y decisiones.
Inteligencia artificial Objetos y atributos Representar conocimiento y reglas lógicas.

1.9 Cómo reconocer si una relación es función

Para saber si una relación es una función, debemos revisar las entradas. Si una misma entrada aparece relacionada con dos salidas distintas, entonces no es función.

function esFuncion(pares) {
  const salidasPorEntrada = new Map();

  for (const [entrada, salida] of pares) {
    if (salidasPorEntrada.has(entrada) && salidasPorEntrada.get(entrada) !== salida) {
      return false;
    }
    salidasPorEntrada.set(entrada, salida);
  }

  return true;
}

console.log(esFuncion([[1, "A"], [2, "B"], [3, "C"]]));
console.log(esFuncion([[1, "A"], [1, "B"], [2, "C"]]));

El primer caso es función porque cada entrada tiene una única salida. El segundo no lo es porque la entrada 1 aparece asociada con A y con B.

1.10 Por qué son discretas

Decimos que estas relaciones y funciones son discretas porque trabajan con elementos separados, no con intervalos continuos. En lugar de analizar todos los valores reales entre 0 y 1, podemos trabajar con identificadores, nodos, índices, estados o valores lógicos.

  • Un conjunto de usuarios registrados es discreto.
  • Los nodos de un grafo son elementos discretos.
  • Los valores verdadero y falso forman un conjunto discreto.
  • Los índices de un arreglo son valores discretos.
  • Los estados de una máquina de estados son discretos.

1.11 Qué debes recordar de este tema

  • Una relación discreta describe vínculos entre elementos de conjuntos.
  • Una función discreta es una relación donde cada entrada tiene una única salida.
  • Los pares ordenados permiten representar relaciones de forma precisa.
  • En programación, las relaciones aparecen en bases de datos, grafos, permisos, estructuras de datos y algoritmos.
  • Una lista de pares puede representar una relación; un mapa clave-valor puede representar una función discreta.
  • Para verificar si una relación es función, se revisa que ninguna entrada tenga dos salidas distintas.

1.12 Conclusión

Las relaciones y funciones discretas ofrecen un lenguaje matemático para describir conexiones y asignaciones dentro de sistemas computacionales. Gracias a ellas podemos modelar permisos, dependencias, estructuras, recorridos, reglas lógicas y transformaciones de datos.

En el próximo tema veremos la importancia de las relaciones discretas en informática y cómo estas ideas aparecen en problemas reales de programación.