25. Representación tabular de funciones

Una tabla de valores organiza todos los pares de una función en filas y columnas. Es la forma más directa de visualizar, compartir y verificar el comportamiento completo de una función discreta.

25.1 Introducción

Cuando el dominio de una función es finito, es posible listar explícitamente todos los pares (a, f(a)). Organizar esos pares en una tabla hace que la función sea fácil de leer, comparar y verificar.

La representación tabular es especialmente útil en informática: las tablas de verdad de las funciones booleanas, los diccionarios, las tablas de base de datos y los arrays asociativos son todos ejemplos de funciones en formato tabular.

25.2 Estructura de una tabla de valores

Una tabla de valores tiene dos columnas: la columna del dominio y la columna de la imagen. Cada fila corresponde a un elemento del dominio y su valor bajo la función.

f : {1, 2, 3, 4, 5} → ℤ con f(n) = n² - n ┌───┬──────┐ │ n │ f(n) │ ├───┼──────┤ │ 1 │ 0 │ │ 2 │ 2 │ │ 3 │ 6 │ │ 4 │ 12 │ │ 5 │ 20 │ └───┴──────┘

Cada fila tiene exactamente un valor en la columna de imagen: la condición de función se verifica visualmente.

25.3 Construir una tabla en JavaScript

Con un dominio y una función definida por fórmula, podemos generar la tabla completa automáticamente.

const dominio = [1, 2, 3, 4, 5];

function f(n) {
  return n * n - n;
}

// Construir la tabla como array de objetos
const tabla = dominio.map(n => ({ entrada: n, salida: f(n) }));

// Mostrar la tabla fila por fila
tabla.forEach(fila => console.log(fila));
// {"entrada":1,"salida":0}
// {"entrada":2,"salida":2}
// {"entrada":3,"salida":6}
// {"entrada":4,"salida":12}
// {"entrada":5,"salida":20}

25.4 Leer propiedades desde la tabla

Una vez construida la tabla, podemos extraer información relevante de la función directamente.

const dominio = [1, 2, 3, 4, 5];

function f(n) { return n * n - n; }

const tabla = dominio.map(n => [n, f(n)]);

// Imagen de la función
const imagen = [...new Set(tabla.map(([, b]) => b))];
console.log('Imagen:', imagen); // [0, 2, 6, 12, 20]

// Valor máximo alcanzado
const max = Math.max(...imagen);
console.log('Máximo:', max); // 20

// Valor mínimo alcanzado
const min = Math.min(...imagen);
console.log('Mínimo:', min); // 0

// Elemento con mayor imagen
const argmax = tabla.reduce((acc, cur) => cur[1] > acc[1] ? cur : acc);
console.log('Argmax:', argmax); // [5, 20]

25.5 Tablas con dominio no numérico

El dominio puede ser cualquier conjunto finito. La tabla funciona igual: una columna de entradas y una columna de salidas.

g : {norte, sur, este, oeste} → {0°, 90°, 180°, 270°} ┌─────────┬──────┐ │ Direc. │ Ang. │ ├─────────┼──────┤ │ norte │ 0° │ │ este │ 90° │ │ sur │ 180° │ │ oeste │ 270° │ └─────────┴──────┘
const g = new Map([
  ['norte', 0],
  ['este',  90],
  ['sur',   180],
  ['oeste', 270]
]);

// Mostrar la tabla completa
for (const [dir, ang] of g) {
  console.log(`${dir.padEnd(8)} → ${ang}°`);
}

// Evaluar un punto
console.log(g.get('sur')); // 180

25.6 Tablas de funciones de dos variables

Una función de dos variables f : A × B → C puede representarse como una tabla bidimensional: las filas corresponden a los valores de A y las columnas a los de B.

f(a, b) = a + b sobre A = {0,1,2}, B = {0,1,2} ┌───┬───┬───┬───┐ │ + │ 0 │ 1 │ 2 │ ├───┼───┼───┼───┤ │ 0 │ 0 │ 1 │ 2 │ │ 1 │ 1 │ 2 │ 3 │ │ 2 │ 2 │ 3 │ 4 │ └───┴───┴───┴───┘
const A = [0, 1, 2];
const B = [0, 1, 2];

function f(a, b) { return a + b; }

// Construir la tabla bidimensional
const tablaBi = A.map(a =>
  Object.fromEntries([['a\\b', a], ...B.map(b => [b, f(a, b)])])
);

// Mostrar la tabla bidimensional fila por fila
tablaBi.forEach(fila => console.log(fila));
// {"a\\b":0,"0":0,"1":1,"2":2}
// {"a\\b":1,"0":1,"1":2,"2":3}
// {"a\\b":2,"0":2,"1":3,"2":4}

25.7 Tabla de verdad como caso especial

La tabla de verdad es una tabla de valores donde el dominio es un conjunto de combinaciones de valores booleanos y la imagen es un valor booleano. Es uno de los usos más frecuentes de la representación tabular en informática.

f(p, q) = p AND q ┌───┬───┬───────────┐ │ p │ q │ p AND q │ ├───┼───┼───────────┤ │ F │ F │ F │ │ F │ V │ F │ │ V │ F │ F │ │ V │ V │ V │ └───┴───┴───────────┘
const valores = [false, true];

function and(p, q) { return p && q; }

// Generar tabla de verdad automáticamente
for (const p of valores) {
  for (const q of valores) {
    const resultado = and(p, q);
    console.log(`${String(p).padEnd(5)} AND ${String(q).padEnd(5)} = ${resultado}`);
  }
}
// false AND false = false
// false AND true  = false
// true  AND false = false
// true  AND true  = true

25.8 Detectar propiedades desde la tabla

La tabla permite verificar propiedades de la función con inspección directa.

Propiedad Qué buscar en la tabla
Es función Cada entrada aparece exactamente una vez en la columna de entradas
Es inyectiva Ningún valor aparece dos veces en la columna de salidas
Es sobreyectiva Todo elemento del codominio aparece al menos una vez en la columna de salidas
Es biyectiva Cada valor del codominio aparece exactamente una vez en la columna de salidas
Es constante Todos los valores de la columna de salidas son iguales
Es identidad Cada entrada coincide con su salida

25.9 Verificar propiedades con código

const dominio   = [1, 2, 3, 4];
const codominio = [1, 2, 3, 4];

function f(n) { return 5 - n; } // f(1)=4, f(2)=3, f(3)=2, f(4)=1

const tabla = dominio.map(a => [a, f(a)]);
const salidas = tabla.map(([, b]) => b);

// ¿Es inyectiva? (no hay salidas repetidas)
const esInyectiva = new Set(salidas).size === salidas.length;
console.log('Inyectiva:', esInyectiva); // true

// ¿Es sobreyectiva? (todo el codominio aparece)
const esSobreyectiva = codominio.every(b => salidas.includes(b));
console.log('Sobreyectiva:', esSobreyectiva); // true

// ¿Es biyectiva?
console.log('Biyectiva:', esInyectiva && esSobreyectiva); // true

// ¿Es la identidad?
const esIdentidad = tabla.every(([a, b]) => a === b);
console.log('Identidad:', esIdentidad); // false

25.10 Tabla como estructura de datos en programación

En programación, las tablas de funciones se implementan de distintas formas según la necesidad:

Estructura Lenguaje Cuándo usarla
Array de pares JavaScript, Python Dominio pequeño, orden importa
Map / Diccionario JavaScript, Python, Java Dominio arbitrario, búsqueda eficiente O(1)
Array indexado C, JavaScript Dominio = enteros consecutivos
Tabla de base de datos SQL Gran volumen, consultas complejas
Enum / switch Java, C, TypeScript Dominio fijo y conocido en tiempo de compilación

25.11 Reconstruir la función desde la tabla

Si tenemos una tabla de valores, podemos reconstruir la función como lista de pares o como objeto de búsqueda eficiente.

// Tabla dada como array de objetos
const tablaOriginal = [
  { entrada: 'a', salida: 10 },
  { entrada: 'b', salida: 30 },
  { entrada: 'c', salida: 20 },
  { entrada: 'd', salida: 10 }
];

// Convertir a Map para evaluación eficiente
const funcion = new Map(tablaOriginal.map(({ entrada, salida }) => [entrada, salida]));

// Evaluar
console.log(funcion.get('b')); // 30
console.log(funcion.get('d')); // 10

// Convertir a lista de pares
const pares = [...funcion.entries()];
console.log(pares);
// [['a',10],['b',30],['c',20],['d',10]]

25.12 Errores comunes

  • Incluir una entrada más de una vez en la tabla con salidas distintas: viola la unicidad y la relación deja de ser función.
  • Omitir algún elemento del dominio en la tabla: viola la existencia.
  • Confundir la tabla de una función de dos variables con una lista de pares: la tabla bidimensional es más compacta pero contiene la misma información.
  • Creer que la tabla es solo una herramienta pedagógica: en bases de datos y sistemas de consulta, las tablas son la representación principal.
  • No distinguir entre la columna de codominio y la columna de imagen al analizar la tabla.

25.13 Qué debes recordar de este tema

  • Una tabla de valores organiza todos los pares (a, f(a)) de una función discreta.
  • Cada fila tiene exactamente una entrada y exactamente una salida.
  • La condición de función se verifica visualmente: cada entrada aparece una sola vez.
  • Las funciones de dos variables se representan con tablas bidimensionales.
  • La tabla de verdad es un caso especial de tabla de valores para funciones booleanas.
  • Desde la tabla se pueden detectar directamente inyectividad, sobreyectividad y biyectividad.

25.14 Conclusión

La representación tabular convierte una función abstracta en un objeto concreto y manejable. Facilita la verificación de propiedades, la comparación entre funciones y la comunicación de resultados. En programación, las tablas son la base de estructuras como los diccionarios, las tablas de bases de datos y las tablas de verdad.

En el próximo tema estudiaremos la representación gráfica de funciones discretas: cómo visualizar los pares de una función mediante puntos en un plano o mediante diagramas de flechas.