booleval es una command line utility que evalúa expresiones lógicas e imprime sus tablas de verdad.
<eval> ::= ";"
| "exit"
| <prop>
| <eval> <prop>
<prop> ::= <term>
| <prop> "->" <term>
| <prop> "<->" <term>
| <prop> "<~>" <term>
<term> ::= <atom>
| <term> "&" <atom>
| <term> "|" <atom>
| <term> "!" <atom>
<atom> ::= <id>
| "~" <atom>
| "(" <prop> ")"
| "[" <prop> "]"
| "{" <prop> "}"
<id> ::= [a-zA-Z]{1,1}
La sig. tabla muestra los conectores lógicos y su equivalente implementados en booleval (Booleval):
| Conector | Lógica | Booleval |
|---|---|---|
| Negación | ¬ | ~ |
| Conjunción | ˄ | & |
| Disyunción | ˅ | | |
| Disyunción Exclusiva | ⊻ | <~> |
| Condicional | → | -> |
| Bicondicional | ↔ | <-> |
| Negación Conjunta | ↓ | ! |
Puntuadores: como comenté anteriormente, cada expresión debe terminar con ;. También podemos utilizar (), [] y {} como separadores.
Además, booleval reconoce los comentarios de una línea (como en Python), todo lo que esté luego del caracter # hasta el salto de línea será ignorado. Los comentarios son (más) útiles para documentar las expresiones cuando las tengamos en un archivo.
Cada expresión lógica debe terminar en ';', esto hace posible que booleval pueda procesar varias de estas
al mismo tiempo (separadas por ;). La siguiente expresión lógica (p ∧ q → r) se la podemos
pasar a booleval como: (p & q → r);. Nota: la precedencia y asociatividad de los conectores lógicos está programada
en la utilidad, por lo que todas las siguientes expresiones
son equivalentes: (p ∧ q) → r ≡ {(p ∧ q) → r} ≡ p ∧ q → r.
Uso
- Arrancar el programa
$ python -m booleval ## entrada estándar $ python -m booleval < props.txt ## redirección
Luego de ejecutar el comando anterior (entrada estándar), la utilidad nos responde mostrandonos el siguiente prompt '>' que nos señala que está lista para evaluar expresiones:
$>
- Corrida. Nota que lo que aparece luego de
;es un comentario:
$> ~(p & q) <-> (~p | ~q); # De Morgan's Law
- Salida:
La línea final de la tabla muestra si se trata de una Tautología (tautology), Contradicción (contradiction) o una Contingencia (contingent):
p q (p&q) ~(p&q) ~p ~q (~p|~q) ~(p&q)<->(~p|~q) ====================================================== V V V F F F F V V F F V F V V V F V F V V F V V F F F V V V V V ====================================================== ~(p&q)<->(~p|~q) = tautology
Nota: algunos prefieren que la tabla anterior se mostrara así:
p q ~p ~q (p&q) ~(p&q) (~p|~q) ~(p&q)<->(~p|~q) ====================================================== V V F F V F F V V F F V F V V V F V V F F V V V F F V V F V V V ====================================================== ~(p&q)<->(~p|~q) = tautologySin embargo, esta salida no muestra el estricto orden (de izquierda a derecha) de evaluación de las subexpresiones.
- Ejemplo Complejo:
Una proposición {[(p ∧ q) → ¬r] ↔ [(s ∨ ¬t) ∧ (r → p)]} (1) requiere generar 2⁵ = 32
filas necesarias para las 5 variables; (2) las entradas de las variables (p, q, r, s, t) deben
seguir el orden binario estándar fundamental para legibilidad técnica; (3) comprobar:
- A = (p ∧ q) → ¬r
- B = (s ∨ ¬t)
- C = (r → p)
- D = B ∧ C
Resultado Final: A ↔ D
- Entrada:
$> {[(p & q) -> ~r] <-> [(s | ~t) & (r -> p)]};
- Salida (copiada directo de la terminal):
p q r s t (p&q) ~r [(p&q)->~r] ~t (s|~t) (r->p) [(s|~t)&(r->p)] {[(p&q)->~r]<->[(s|~t)&(r->p)]}
===========================================================================================================
V V V V V V F F F V V V F
V V V V F V F F V V V V F
V V V F V V F F F F V F V
V V V F F V F F V V V V F
V V F V V V V V F V V V V
V V F V F V V V V V V V V
V V F F V V V V F F V F F
V V F F F V V V V V V V V
V F V V V F F V F V V V V
V F V V F F F V V V V V V
V F V F V F F V F F V F F
V F V F F F F V V V V V V
V F F V V F V V F V V V V
V F F V F F V V V V V V V
V F F F V F V V F F V F F
V F F F F F V V V V V V V
F V V V V F F V F V F F F
F V V V F F F V V V F F F
F V V F V F F V F F F F F
F V V F F F F V V V F F F
F V F V V F V V F V V V V
F V F V F F V V V V V V V
F V F F V F V V F F V F F
F V F F F F V V V V V V V
F F V V V F F V F V F F F
F F V V F F F V V V F F F
F F V F V F F V F F F F F
F F V F F F F V V V F F F
F F F V V F V V F V V V V
F F F V F F V V V V V V V
F F F F V F V V F F V F F
F F F F F F V V V V V V V
===========================================================================================================
{[(p&q)->~r]<->[(s|~t)&(r->p)]} = contingent
- Salir de la herramienta:
$> exit
- Mejorar esta documentación
- Agregar una interfaz gráfica (GUI)
- Implementar más features
- Más conectores; conectores alternativos...
- Exportar a distintos formatos (Markdown, reStructuredText, etc.)?
MIT License
Written by Osmar D. Gómez A (ozzygomez)

