Simplificar una expresión lógica consiste en transformarla en una forma más breve o clara sin cambiar su valor de verdad.
Las equivalencias lógicas permiten reemplazar una expresión por otra equivalente. Gracias a eso podemos simplificar expresiones complejas, eliminar redundancias y escribir condiciones más claras.
En programación, simplificar no significa escribir menos a cualquier costo. Significa expresar la misma regla de una forma más comprensible y menos propensa a errores.
Simplificar una expresión lógica significa transformarla en otra expresión equivalente que sea más conveniente.
Una expresión simplificada puede tener menos operadores, menos repeticiones o una estructura más clara.
Para simplificar expresiones, usaremos principalmente estas leyes:
| Ley | Ejemplo |
|---|---|
| Doble negación | ¬¬p ≡ p |
| Identidad | p ∧ V ≡ p, p ∨ F ≡ p |
| Dominación | p ∧ F ≡ F, p ∨ V ≡ V |
| Idempotencia | p ∧ p ≡ p, p ∨ p ≡ p |
| De Morgan | ¬(p ∧ q) ≡ ¬p ∨ ¬q |
| Distributiva | (p ∧ q) ∨ (p ∧ r) ≡ p ∧ (q ∨ r) |
Un método práctico es:
Simplifiquemos:
Paso a paso:
Usamos identidad de AND y luego identidad de OR.
Simplifiquemos:
Como cualquier expresión AND falso es falsa:
No hace falta evaluar p ∨ q.
Simplifiquemos:
Reordenamos y eliminamos la repetición:
Usamos conmutatividad e idempotencia.
Simplifiquemos:
Aplicamos De Morgan:
Después de De Morgan, simplificamos la doble negación.
Simplifiquemos:
Factorizamos p:
Como q ∨ ¬q es una tautología:
La expresión completa se simplifica a p.
Veamos una condición redundante:
const puedeAcceder = (cuentaActiva && esAdmin) || (cuentaActiva && esEditor);
Factorizando cuentaActiva:
const puedeAcceder = cuentaActiva && (esAdmin || esEditor);
La segunda forma evita repetir la condición común.
Una condición como esta puede ser difícil de leer:
const accesoDenegado = !(usuarioActivo && tienePermiso);
Aplicando De Morgan:
const accesoDenegado = !usuarioActivo || !tienePermiso;
La segunda forma muestra explícitamente las razones por las que se deniega el acceso.
Después de simplificar una expresión importante, conviene verificar que la nueva forma sea equivalente.
const valores = [true, false];
for (const p of valores) {
for (const q of valores) {
const original = !(p && q);
const simplificada = !p || !q;
console.log(original === simplificada);
}
}
Si todas las comparaciones devuelven true, las expresiones son equivalentes.
A veces una expresión más larga es más clara para quien lee el código.
const puedeComprar = hayStock && pagoAprobado && !cuentaBloqueada;
Esta condición puede ser más legible que una versión demasiado compacta o factorizada. La simplificación debe mejorar comprensión, no solo reducir caracteres.
Supongamos esta expresión:
Simplificamos paso a paso:
Resultado final:
La simplificación de expresiones lógicas permite reducir redundancias, aclarar reglas y detectar errores. Es una habilidad clave para escribir condiciones correctas y mantener código más comprensible.
En el próximo tema estudiaremos implicaciones y equivalencias notables.