Las leyes distributivas permiten transformar expresiones que combinan AND y OR, distribuyendo un operador sobre otro sin cambiar el valor lógico.
Las leyes distributivas son equivalencias que permiten reescribir expresiones donde una proposición se combina con un grupo de proposiciones.
Son muy importantes para simplificar expresiones lógicas, transformar reglas de negocio y trabajar con álgebra booleana.
Las leyes distributivas son:
La primera distribuye AND sobre OR. La segunda distribuye OR sobre AND.
La expresión p ∧ (q ∨ r) significa que p debe cumplirse, y además debe cumplirse q o r.
En palabras: p junto con una alternativa equivale a dos casos posibles: p con q, o p con r.
Supongamos esta regla:
Si definimos:
La expresión es:
La forma distribuida es:
Comparemos las columnas finales de ambas formas.
| p | q | r | p ∧ (q ∨ r) | (p ∧ q) ∨ (p ∧ r) |
|---|---|---|---|---|
| V | V | V | V | V |
| V | V | F | V | V |
| V | F | V | V | V |
| V | F | F | F | F |
| F | V | V | F | F |
| F | V | F | F | F |
| F | F | V | F | F |
| F | F | F | F | F |
Las columnas finales coinciden, por eso las expresiones son equivalentes.
La segunda ley dice:
Esta ley suele resultar menos intuitiva al principio, pero es igual de válida en lógica proposicional.
Comparemos las columnas finales:
| p | q | r | p ∨ (q ∧ r) | (p ∨ q) ∧ (p ∨ r) |
|---|---|---|---|---|
| V | V | V | V | V |
| V | V | F | V | V |
| V | F | V | V | V |
| V | F | F | V | V |
| F | V | V | V | V |
| F | V | F | F | F |
| F | F | V | F | F |
| F | F | F | F | F |
Podemos comprobar las equivalencias con booleanos.
const p = true;
const q = false;
const r = true;
const forma1 = p && (q || r);
const forma2 = (p && q) || (p && r);
console.log(forma1 === forma2);
La comparación devuelve true.
Las leyes distributivas también pueden usarse en sentido inverso. A esto se lo puede pensar como factorización.
La proposición p aparece repetida en ambos términos, por eso puede factorizarse.
Esta condición repite cuentaActiva:
const puedeAcceder = (cuentaActiva && esAdmin) || (cuentaActiva && esEditor);
Aplicando distributividad en sentido inverso:
const puedeAcceder = cuentaActiva && (esAdmin || esEditor);
La segunda forma suele ser más clara porque expresa primero el requisito común.
Distribuir puede ser útil para separar casos.
La forma distribuida muestra dos escenarios: uno donde se cumple p ∧ q y otro donde se cumple p ∧ r.
Factorizar puede ser útil para eliminar repetición.
La forma factorizada muestra que p es un requisito común para ambos casos.
Las leyes distributivas suelen combinarse con otras leyes para simplificar expresiones.
En este ejemplo usamos distributividad, tautología e identidad.
Las leyes distributivas permiten transformar expresiones que mezclan conjunción y disyunción. Son una herramienta poderosa para simplificar reglas lógicas y hacer más claras las condiciones de un programa.
En el próximo tema estudiaremos la simplificación de expresiones lógicas.