Inicio

Pensamientos

Ver entrada

Avatar de jesus   jesus   05/03/2015 a las 08:10 Valoración: 1
Generador de tablas de verdad para expresiones lógicas
Foto: Generador de tablas de verdad para expresiones lógicas

Nota: pincha AQUÍ para probar el generador de tablas de verdad

De qué va el rollo

Recientemente he tenido que lidiar con un problema de lógica para una aplicación que va a incorporar un sistema de notificaciones de usuario con reglas relativamente complejas. Los usuarios pueden crear reglas del tipo A and (B or C), pero el interfaz de usuario, para no ser demasiado complejo (problemas del desarrollo rápido) no soporta paréntisis.

Como en situaciones parecidas, he señalado al cliente que seleccionar varios "and" y "or" entremezclados puede no tener el resultado esperado por los usuarios. El caso es que las expresiones lógicas tienen un órden de "lectura" correcto (bueno, hay convenciones) y expresiones como A and B or C, que pueden ser interpretadas de diversos modos (por ejemplo: (A and B) or C y A and (B or C)), también tienen su interpretación correcta.

Y lo que es más, la expresión A and (B or C) se puede reescribir, siendo su expresión lógica equivalente A and B or A and C.

Como en realidad no tenía muy fresca la lógica (atrás quedaron los mapas de Karnaugh y esas cosas que hacíamos en primero de carrera), escribí un poco de código PHP para generar tablas de verdad y evaluar diferentes expresiones lógicas, para ver cuáles son equivalentes, y así refrescarme la memoria sobre estos temas.

Y ya puestos que escribo un poco de código, pues lo aprovecho para ponerlo acá a disposición de estudiantes de informática u otras ingenierías, programadores y demás mataos que necesiten echar un vistazo rápido a los resultados de sus expresiones lógicas.

El algoritmo:

Básicamente hay tres partes principales para esta mini utilidad:

  1. Identificar los operandos de la expresión o expresiones lógicas: necesitamos saber su número para saber cuántas filas y combinaciones serán necesarias para la tabla de verdad
  2. Crear las combinaciones de valores (0, 1) para la tabla de verdad. El array multidimensional tendrá un total de 2 num_operandos (dos elevado al número de operandos identificados), y cada columna cambiará de valor, de 0 a 1, dependiendo del número de columna que sea
  3. Evaluar las expresiones lógicas y añadir los resultados a la tabla

Identificar los operandos es sencillo una vez se define su formato, y se encuentra la expresión regular a usar. En este caso he decido que los operandos son letras mayúsculas y los operadores van en minúscula, por lo tanto la expresión es:

(?!and|or|xor)[A-Z].

Lo siguiente es crear el array con las combinaciones de los operandos (ceros y unos) para la tabla de verdad. Básicamente son series de ceros y unos consecutivos. ¿Pero cuánto toca cambiar del 0 al 1? Bueno, la fórmula que yo he usado es:

k == (numCombinations/(pow(2,i)))

Cuando el número de elementos de la serie del mismo valor (ceros o unos) por el que vamos es el número de combinaciones dividido por dos elevado al número de columna (operando i).

Finalmente habría que evaluar las expresiones lógicas, que son básicamente cualquier cosa que el usuario haya introducido en el campo de texto pertinente (sí, esto tiene peligros). Para ello lo primero (obviando ciertas medidas de seguridad) es transformar los operandos en variables PHP. Una vez hecho eso (con la pertinente expresión regular), se evalúa con la functión eval() de PHP, que es lo que hace todo esto bastante peligroso, si está expuesto a usuarios con malas intenciones y ciertos conocimientos.

Una de las cosas que se observan al llamar a eval() es que cualquier cosa que pase ahí puede ir directamente a la salida, y no queremos eso, sino capturar esa salida. He optado por poner (concatenar) un bonito return al principio que hace la magia para estos fines.

Bueno, pues con un par de cosillas más, una llamada AJAX y tal ya tenemos la mini utilidad para comprar expresiones y crear sus tablas de verdad.

Emocionante, ¿verdad?

La utilidad en sí está en esta web

Generador de tabla de verdad para expresiones lógicas


Visto: 5928 veces   Compartir en Menéame Compartir en Twitter Compartir en Facebook Compartir en Delicious

Imágenes relacionadas:

Ese soy yo Pablito y Sophia Retrato de Sophia con Minolta XD-5 III Niñas marroquinas Colores de Essaouira Ese soy yo Yo en el fuerte español en Keelung Pescadores y gaviotas en Essaouira Barca en Essaouira Pato y Photoshop  Temperatura de color Torres de alta tensión III

Aviso Legal Contacto Mapa del sitio Colabora Buscador Acerca de esta web Acerca del autor
DeSastreCajón, corriendo sobre jMVC