Hatt
Hatt is a command-line program which prints truth tables for expressions in
classical propositional logic, and a library allowing its parser, evaluator and
truth table generator to be used in other programs.
Installation
Hatt is available from Hackage. To install it with cabal-install
, update
your list of known packages and then install Hatt.
$ cabal update
$ cabal install hatt
To build it from source, cd
into the directory containing the Hatt source
files, including hatt.cabal
, and run cabal install
.
Valid Hatt expressions
The following are all valid expression forms which can be parsed by Hatt, where
ϕ and ψ are metalinguistic variables standing in for any valid expression.
- Variables:
P
, Q
, a
, b
etc.---basically anything in the character
class [a-zA-Z]
- Negation:
~ϕ
- Conjunction:
(ϕ & ψ)
- Disjunction:
(ϕ | ψ)
- Conditional:
(ϕ -> ψ)
- Biconditional:
(ϕ <-> ψ)
Parentheses are not required around top-level formulae, regardless of whether
the primary connective is binary. For example, the expression a | b
is valid
and will be parsed correctly, as would p <-> (q & ~r)
, although the
parenthesised versions of both these expressions ((a | b)
and
(p <-> (q & ~r))
) are also fine.
There is currently no support for operator precedence, so nested expressions
must be parenthesised correctly for the parser to make sense of them.
Using the hatt
command-line program
The default mode is interactive: you start the program, enter expressions at
the prompt, and their truth tables are printed. Here's an example session.
$ hatt
Entering interactive mode. Type `help` if you don't know what to do!
> A | B
A B | (A | B)
-------------
T T | T
T F | T
F T | T
F F | F
> p -> (q & ~r)
p q r | (p -> (q & ~r))
-----------------------
T T T | F
T T F | T
T F T | F
T F F | F
F T T | T
F T F | T
F F T | T
F F F | T
> e <-> f
e f | (e <-> f)
---------------
T T | T
T F | F
F T | F
F F | T
> exit
The --evaluate
flag lets you pass a single expression to be evaluated
directly.
$ hatt --evaluate="P -> (Q | ~R)"
P Q R | (P -> (Q | ~R))
-----------------------
T T T | F
T T F | F
T F T | F
T F F | F
F T T | F
F T F | F
F F T | T
F F F | F
By default, hatt
will print ASCII representations of expressions. If you have
a Unicode-capable terminal, try passing the --pretty
option to pretty-print
expressions using the the more common logical symbols.
$ hatt --evaluate="P -> (Q | ~R)" --pretty
P Q R | (P → (Q ∨ ¬R))
----------------------
T T T | F
T T F | F
T F T | F
T F F | F
F T T | F
F T F | F
F F T | T
F F F | F
You can enable pretty-printing while in interactive mode by using the pretty
command.
If you pass the --coloured
flag, hatt
will colour the truth values in the
tables which it prints: green for true, red for false. You can enable colouring
during interactive mode by using the colour
command.
You can print out the normal forms of expressions too, by prefixing an
expression with nnf
, dnf
or cnf
.
$ hatt --pretty
> nnf ~(P -> (Q & R))
(P ∧ (¬Q ∨ ¬R))
The three supported normal forms are negation normal form, conjunctive normal
form and disjunctive normal form.
Using Hatt in other programs
Hatt exposes the Data.Logic.Propositional
module, which provides a simple API
for parsing, evaluating, and printing truth tables, and for converting logical
expressions into normal forms.