The prednote package

Build and evaluate trees of predicates. For example, you might build
a predicate of the type Int -> Bool. You do this by assembling
several predicates into a tree. You can then verbosely evaluate
this tree, showing why a particular result is reached.

prednote also provides modules to test several subjects against a
given predicate, and to parse infix or RPN expressions into a tree of
predicates.