16. Leyes de De Morgan

Las leyes de De Morgan muestran cómo se relacionan el complemento, la unión y la intersección. Son reglas esenciales para transformar expresiones de conjuntos y condiciones lógicas.

16.1 Introducción

Las leyes de De Morgan son dos reglas fundamentales que conectan operaciones de conjuntos con operaciones lógicas. Permiten transformar el complemento de una unión en una intersección de complementos, y el complemento de una intersección en una unión de complementos.

En programación, estas leyes aparecen cuando negamos condiciones compuestas y cuando simplificamos filtros con operadores lógicos.

16.2 Primera ley de De Morgan

El complemento de la unión de dos conjuntos es igual a la intersección de sus complementos.

(A ∪ B)ᶜ = Aᶜ ∩ Bᶜ

Esto significa que estar fuera de A ∪ B equivale a estar fuera de A y fuera de B al mismo tiempo.

16.3 Interpretación de la primera ley

Si un elemento no pertenece a la unión de A y B, entonces no pertenece a A ni pertenece a B.

x ∉ (A ∪ B) equivale a x ∉ A y x ∉ B

La negación de "pertenece a A o pertenece a B" se transforma en "no pertenece a A y no pertenece a B".

16.4 Segunda ley de De Morgan

El complemento de la intersección de dos conjuntos es igual a la unión de sus complementos.

(A ∩ B)ᶜ = Aᶜ ∪ Bᶜ

Esto significa que estar fuera de A ∩ B equivale a estar fuera de A o fuera de B.

16.5 Interpretación de la segunda ley

Si un elemento no pertenece a la intersección de A y B, entonces falla al menos una de las dos pertenencias.

x ∉ (A ∩ B) equivale a x ∉ A o x ∉ B

La negación de "pertenece a A y pertenece a B" se transforma en "no pertenece a A o no pertenece a B".

16.6 Las dos leyes juntas

Ley Forma con conjuntos Forma lógica equivalente
Primera (A ∪ B)ᶜ = Aᶜ ∩ Bᶜ no (A o B) = no A y no B
Segunda (A ∩ B)ᶜ = Aᶜ ∪ Bᶜ no (A y B) = no A o no B

16.7 Ejemplo con conjuntos numéricos

Tomemos un universo finito para calcular los complementos con claridad.

U = {1, 2, 3, 4, 5, 6} A = {1, 2, 3} B = {3, 4}

Primero calculamos la primera ley:

A ∪ B = {1, 2, 3, 4} (A ∪ B)ᶜ = {5, 6} Aᶜ = {4, 5, 6} Bᶜ = {1, 2, 5, 6} Aᶜ ∩ Bᶜ = {5, 6}

Ambos lados dan el mismo resultado.

16.8 Segundo ejemplo

Con los mismos conjuntos, verificamos la segunda ley.

A ∩ B = {3} (A ∩ B)ᶜ = {1, 2, 4, 5, 6} Aᶜ = {4, 5, 6} Bᶜ = {1, 2, 5, 6} Aᶜ ∪ Bᶜ = {1, 2, 4, 5, 6}

Nuevamente, ambos lados de la igualdad representan el mismo conjunto.

16.9 Interpretación con diagramas de Venn

En un diagrama de Venn, la primera ley indica que la región fuera de A y B juntos es la misma región que queda fuera de A y fuera de B al mismo tiempo.

La segunda ley indica que la región fuera de la zona común entre A y B incluye todo lo que queda fuera de A o fuera de B.

16.10 Relación con condiciones en programación

En programación, las leyes de De Morgan permiten transformar condiciones negadas.

!(condicionA || condicionB) equivale a !condicionA && !condicionB !(condicionA && condicionB) equivale a !condicionA || !condicionB

Estas transformaciones ayudan a leer, simplificar o invertir filtros lógicos.

16.11 Ejemplo lógico en JavaScript

Supongamos que una aplicación debe detectar usuarios que no son activos ni tienen suscripción.

const usuario = {
  activo: false,
  suscripcion: false
};

const fueraDeActivosOSuscriptos = !(usuario.activo || usuario.suscripcion);
const noActivoYNoSuscripto = !usuario.activo && !usuario.suscripcion;

console.log(fueraDeActivosOSuscriptos);
console.log(noActivoYNoSuscripto);
console.log(fueraDeActivosOSuscriptos === noActivoYNoSuscripto);

Ambas condiciones son equivalentes por la primera ley de De Morgan.

16.12 Verificación con conjuntos en JavaScript

Podemos verificar las leyes usando operaciones con Set.

function union(a, b) {
  return new Set([...a, ...b]);
}

function interseccion(a, b) {
  return new Set([...a].filter(elemento => b.has(elemento)));
}

function complemento(universo, conjunto) {
  return new Set([...universo].filter(elemento => !conjunto.has(elemento)));
}

function sonIguales(a, b) {
  return a.size === b.size && [...a].every(elemento => b.has(elemento));
}

const universo = new Set([1, 2, 3, 4, 5, 6]);
const a = new Set([1, 2, 3]);
const b = new Set([3, 4]);

const izquierda = complemento(universo, union(a, b));
const derecha = interseccion(complemento(universo, a), complemento(universo, b));

console.log([...izquierda]);
console.log([...derecha]);
console.log(sonIguales(izquierda, derecha));

El resultado confirma la primera ley de De Morgan para esos conjuntos.

16.13 Verificar la segunda ley en JavaScript

function union(a, b) {
  return new Set([...a, ...b]);
}

function interseccion(a, b) {
  return new Set([...a].filter(elemento => b.has(elemento)));
}

function complemento(universo, conjunto) {
  return new Set([...universo].filter(elemento => !conjunto.has(elemento)));
}

function sonIguales(a, b) {
  return a.size === b.size && [...a].every(elemento => b.has(elemento));
}

const universo = new Set([1, 2, 3, 4, 5, 6]);
const a = new Set([1, 2, 3]);
const b = new Set([3, 4]);

const izquierda2 = complemento(universo, interseccion(a, b));
const derecha2 = union(complemento(universo, a), complemento(universo, b));

console.log([...izquierda2]);
console.log([...derecha2]);
console.log(sonIguales(izquierda2, derecha2));

La salida confirma que (A ∩ B)ᶜ = Aᶜ ∪ Bᶜ.

16.14 Aplicaciones prácticas

Situación Transformación Uso
Filtros negados no (A o B) = no A y no B Buscar elementos que no cumplen ninguna condición
Validaciones no (A y B) = no A o no B Detectar por qué falla un requisito compuesto
Consultas Complemento de unión o intersección Reescribir condiciones de búsqueda
Permisos Negar combinaciones de accesos Identificar usuarios excluidos por reglas compuestas

16.15 Errores frecuentes

  • Negar una unión y mantener la unión en lugar de cambiarla por intersección.
  • Negar una intersección y mantener la intersección en lugar de cambiarla por unión.
  • Olvidar complementar cada conjunto individual.
  • Usar complementos sin definir el universo.
  • Confundir la negación de "o" con una condición exclusiva.

16.16 Qué debes recordar de este tema

  • El complemento de una unión es la intersección de los complementos.
  • (A ∪ B)ᶜ = Aᶜ ∩ Bᶜ.
  • El complemento de una intersección es la unión de los complementos.
  • (A ∩ B)ᶜ = Aᶜ ∪ Bᶜ.
  • Las leyes de De Morgan también se aplican a condiciones lógicas.
  • En programación ayudan a transformar condiciones negadas.

16.17 Conclusión

Las leyes de De Morgan permiten transformar expresiones con complementos, uniones e intersecciones. Son esenciales para simplificar razonamientos y para escribir condiciones lógicas equivalentes en programas.

En el próximo tema estudiaremos la simplificación de expresiones de conjuntos.