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.
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.
El complemento de la unión de dos conjuntos es igual a la intersección de sus complementos.
Esto significa que estar fuera de A ∪ B equivale a estar fuera de A y fuera de B al mismo tiempo.
Si un elemento no pertenece a la unión de A y B, entonces no pertenece a A ni pertenece a B.
La negación de "pertenece a A o pertenece a B" se transforma en "no pertenece a A y no pertenece a B".
El complemento de la intersección de dos conjuntos es igual a la unión de sus complementos.
Esto significa que estar fuera de A ∩ B equivale a estar fuera de A o fuera de B.
Si un elemento no pertenece a la intersección de A y B, entonces falla al menos una de las dos pertenencias.
La negación de "pertenece a A y pertenece a B" se transforma en "no pertenece a A o no pertenece a B".
| 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 |
Tomemos un universo finito para calcular los complementos con claridad.
Primero calculamos la primera ley:
Ambos lados dan el mismo resultado.
Con los mismos conjuntos, verificamos la segunda ley.
Nuevamente, ambos lados de la igualdad representan el mismo conjunto.
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.
En programación, las leyes de De Morgan permiten transformar condiciones negadas.
Estas transformaciones ayudan a leer, simplificar o invertir filtros lógicos.
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.
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.
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ᶜ.
| 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 |
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.