21. Leyes de De Morgan

Las leyes de De Morgan permiten transformar la negación de una conjunción en una disyunción, y la negación de una disyunción en una conjunción.

21.1 Introducción

Las leyes de De Morgan son equivalencias fundamentales para trabajar con negaciones de expresiones compuestas. Son muy útiles para simplificar condiciones, reescribir código y razonar sobre reglas lógicas.

En programación aparecen cada vez que negamos una condición que contiene && u ||.

21.2 Las dos leyes

Las leyes de De Morgan son:

¬(p ∧ q) ≡ ¬p ∨ ¬q
¬(p ∨ q) ≡ ¬p ∧ ¬q

En palabras: al distribuir una negación sobre una conjunción o disyunción, se niega cada proposición y se cambia el operador.

21.3 Primera ley: negar una conjunción

La primera ley dice:

¬(p ∧ q) ≡ ¬p ∨ ¬q

Significa que "no es cierto que p y q" equivale a "no p o no q".

Ejemplo:

No es cierto que el usuario esté activo y tenga permiso.
Equivale a: el usuario no está activo o no tiene permiso.

21.4 Tabla de verdad de la primera ley

p q p ∧ q ¬(p ∧ q) ¬p ¬q ¬p ∨ ¬q
V V V F F F F
V F F V F V V
F V F V V F V
F F F V V V V

Las columnas ¬(p ∧ q) y ¬p ∨ ¬q coinciden en todas las filas.

21.5 Segunda ley: negar una disyunción

La segunda ley dice:

¬(p ∨ q) ≡ ¬p ∧ ¬q

Significa que "no es cierto que p o q" equivale a "no p y no q".

Ejemplo:

No es cierto que el usuario sea administrador o editor.
Equivale a: el usuario no es administrador y no es editor.

21.6 Tabla de verdad de la segunda ley

p q p ∨ q ¬(p ∨ q) ¬p ¬q ¬p ∧ ¬q
V V V F F F F
V F V F F V F
F V V F V F F
F F F V V V V

Las columnas ¬(p ∨ q) y ¬p ∧ ¬q coinciden en todas las filas.

21.7 Regla práctica

Para aplicar De Morgan:

  1. Distribuye la negación hacia cada proposición.
  2. Cambia por , o por .
  3. Mantén los paréntesis necesarios para conservar la estructura.
Negar una conjunción produce una disyunción de negaciones.
Negar una disyunción produce una conjunción de negaciones.

21.8 De Morgan en JavaScript

En JavaScript, las leyes se expresan así:

!(p && q) equivale a !p || !q
!(p || q) equivale a !p && !q
const p = true;
const q = false;

console.log(!(p && q) === (!p || !q));
console.log(!(p || q) === (!p && !q));

21.9 Ejemplo: validar acceso

Supongamos que el acceso se rechaza cuando no se cumplen todos los requisitos.

const usuarioActivo = true;
const tienePermiso = false;

const accesoRechazado = !(usuarioActivo && tienePermiso);

console.log(accesoRechazado);

Aplicando De Morgan:

const accesoRechazado = !usuarioActivo || !tienePermiso;

Ambas expresiones son equivalentes.

21.10 Ejemplo: excluir roles

Supongamos que queremos verificar que un usuario no sea administrador ni editor.

const esAdmin = false;
const esEditor = false;

const noTieneRolesDeEdicion = !(esAdmin || esEditor);

console.log(noTieneRolesDeEdicion);

Aplicando De Morgan:

const noTieneRolesDeEdicion = !esAdmin && !esEditor;

21.11 Elegir la forma más clara

Las dos formas son equivalentes, pero una puede ser más fácil de entender según el contexto.

Forma Cuándo puede ser clara
!(activo && tienePermiso) Cuando se quiere decir "no cumple todos los requisitos"
!activo || !tienePermiso Cuando se quiere mostrar explícitamente qué puede fallar
!(esAdmin || esEditor) Cuando se quiere negar un grupo de roles permitidos
!esAdmin && !esEditor Cuando se quiere listar roles excluidos uno por uno

21.12 De Morgan con más de dos proposiciones

Las leyes también se extienden a más de dos proposiciones.

¬(p ∧ q ∧ r) ≡ ¬p ∨ ¬q ∨ ¬r
¬(p ∨ q ∨ r) ≡ ¬p ∧ ¬q ∧ ¬r
const nombreValido = true;
const emailValido = true;
const passwordValida = false;

const formularioInvalido = !(nombreValido && emailValido && passwordValida);
const formularioInvalido2 = !nombreValido || !emailValido || !passwordValida;

console.log(formularioInvalido === formularioInvalido2);

21.13 Uso en simplificación

Las leyes de De Morgan ayudan a mover negaciones hacia adentro o hacia afuera de una expresión. Esto permite simplificar condiciones y preparar expresiones para otras leyes lógicas.

¬(p ∧ ¬q) ≡ ¬p ∨ q

Primero se niega cada parte. Luego se cambia la conjunción por disyunción. La doble negación de q se simplifica a q.

21.14 Errores comunes

  • Distribuir la negación sin cambiar el operador.
  • Convertir !(p && q) en !p && !q, que no es equivalente.
  • Convertir !(p || q) en !p || !q, que no es equivalente.
  • Olvidar simplificar dobles negaciones.
  • No usar paréntesis al aplicar la transformación.

21.15 Qué debes recordar de este tema

  • ¬(p ∧ q) ≡ ¬p ∨ ¬q.
  • ¬(p ∨ q) ≡ ¬p ∧ ¬q.
  • Al distribuir una negación, se cambia AND por OR y OR por AND.
  • En JavaScript: !(p && q) equivale a !p || !q.
  • Las leyes de De Morgan son muy útiles para reescribir condiciones negadas.

21.16 Conclusión

Las leyes de De Morgan son equivalencias esenciales para transformar negaciones de expresiones compuestas. Permiten escribir condiciones más claras, detectar errores y simplificar fórmulas lógicas.

En el próximo tema estudiaremos las leyes de identidad.