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.
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 ||.
Las leyes de De Morgan son:
En palabras: al distribuir una negación sobre una conjunción o disyunción, se niega cada proposición y se cambia el operador.
La primera ley dice:
Significa que "no es cierto que p y q" equivale a "no p o no q".
Ejemplo:
| 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.
La segunda ley dice:
Significa que "no es cierto que p o q" equivale a "no p y no q".
Ejemplo:
| 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.
Para aplicar De Morgan:
En JavaScript, las leyes se expresan así:
const p = true;
const q = false;
console.log(!(p && q) === (!p || !q));
console.log(!(p || q) === (!p && !q));
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.
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;
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 |
Las leyes también se extienden a más de dos proposiciones.
const nombreValido = true;
const emailValido = true;
const passwordValida = false;
const formularioInvalido = !(nombreValido && emailValido && passwordValida);
const formularioInvalido2 = !nombreValido || !emailValido || !passwordValida;
console.log(formularioInvalido === formularioInvalido2);
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.
Primero se niega cada parte. Luego se cambia la conjunción por disyunción. La doble negación de q se simplifica a q.
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.