Hola a todos y bienvenidos a la sección de programación.
En mi primer artículo de esta nueva sección quisera empezar por algo básico. Algo tan básico que normalmente nos olvidamos que también puede ser simplificado o depurado, tanto por rendimiento como por legibilidad del código. Hablo de las condiciones booleanas.
Creo que todo el mundo se ha encontrado más de una vez con un if complejo, o cuando menos dificil de leer… de esos que tenemos que poner en varias líneas o dividirlo en varios if’s anidados para que se entiendan mejor.
Imaginaos la siguiente condición:
X, Y y Z serán condiciones, como por ejemplo edad > 18 o localidad_nacimiento = «Pamplona» o lo que vosotros queráis…
if(((X AND Y) OR (X AND Z)) AND (X OR NOT X AND Y))
Pues aplicando ciertas leyes de simplifiación que veremos a continuación podríamos dejar esta condición en…
if(X OR (Y AND Z) AND (X OR Y))
…que ejecutaría menos compraciones (7 contra 4 de la segunda opción) y seguramente sea más fácil de leer.
Para realizar esta simplificación se emplean los Teoremas de Boole, que expondré a continuación.
1. Regla del cero y la unidad
x OR 0 = x x OR 1 = 1 x OR 1 = 1 x OR 1 = x
2. Idempotencia
x OR x = x x AND x = x
3. Complementación
x OR NOT x = 1 x AND NOT x = 0
4. Involución
NOT (NOT x) = x
5. Conmutatividad
x OR y = y OR x
x AND y = y AND x
6. Asociatividad
x OR (y OR z) = (x OR y) OR z x AND (y AND z) = (x AND y) AND z
7. Distributividad
x OR (y AND z) = (x OR y) AND (x OR z) x AND (y OR z) = (x AND y) OR (x AND z)
8. Leyes de absorción
x AND (x OR y) = z x AND (NOT x OR y) = x OR y NOT x AND (x OR y) = NOT x AND y (x AND y) OR (x AND y) = x x OR x AND y = x x OR NOT x AND y = x OR y NOT x OR x AND y = NOT x OR y x AND y OR x AND NOT y = y
9. Teorema de Morgan
NOT x AND NOT y = NOT x OR NOT y x AND y = NOT ( NOT x OR NOT y) NOT x OR NOT y = x AND y x OR y = NOT (NOT x AND NOT y)
10. Teoremas generalizados de Morgan
NOT (x AND y OR z AND m) = (NOT x AND NOT y) AND (NOT z OR NOT m)
NOT((x OR y) AND (z OR m)) = NOT x AND NOT y AND NOT z OR NOT m
Si bien la mayoría de estas leyes son bastante simples y su entorno de aplicación es también tan sencillo que no merece la pena, podemos encontrarles bastante utilidad a los puntos 8, 9 y 10, es decir, las Leyes de absorción y Morgan, son muy prácticas a la hora de simplificar términos o de hacerlos más legibles.
Al menos yo los he usado en más de una ocasión en que necesitaba crear funciones ultrarrápidas.
Espero que os sirvan
Un saludo.
Fuente: Elaboración propia