and_assoc: (all P:bool, Q:bool, R:bool. (P and Q and R) = (P and Q and R))

and_false: (all P:bool. (P and false) = false)

and_idempotent: (all P:bool. (P and P) = P)

and_or_absorb: (all P:bool, Q:bool. (P and (P or Q)) = P)

and_or_distrib: (all P:bool, Q:bool, R:bool. (P and (Q or R)) = ((P and Q) or (P and R)))

and_sym: (all P:bool, Q:bool. (P and Q) = (Q and P))

and_true: (all P:bool. (P and true) = P)

contrapositive: (all P:bool, Q:bool. (if ((if P then Q) and not Q) then not P))

double_neg: (all P:bool. (not (not P)) = P)

eq_false: (all P:bool. ((not P)  (P = false)))

eq_true: (all P:bool. (P  (P = true)))

ex_mid: (all b:bool. (b or not b))

iff_equal: (all P:bool, Q:bool. (if (P  Q) then P = Q))

iff_refl: (all P:bool. (P  P))

iff_symm: (all P:bool, Q:bool. (if (P  Q) then (Q  P)))

iff_trans: (all P:bool, Q:bool, R:bool. (if ((P  Q) and (Q  R)) then (P  R)))

implies_refl: (all P:bool. (if P then P))

implies_trans: (all P:bool, Q:bool, R:bool. (if ((if P then Q) and (if Q then R)) then (if P then R)))

modus_ponens: (all P:bool, Q:bool. (if ((if P then Q) and P) then Q))

not_and: (all P:bool, Q:bool. (not (P and Q)) = (not P or not Q))

not_or: (all P:bool, Q:bool. (not (P or Q)) = (not P and not Q))

or_and_absorb: (all P:bool, Q:bool. (P or (P and Q)) = P)

or_and_distrib: (all P:bool, Q:bool, R:bool. (P or (Q and R)) = ((P or Q) and (P or R)))

or_assoc: (all P:bool, Q:bool, R:bool. (P or Q or R) = (P or Q or R))

or_false: (all P:bool. (P or false) = P)

or_idempotent: (all P:bool. (P or P) = P)

or_not: (all P:bool, Q:bool. (if ((P or Q) and not P) then Q))

or_sym: (all P:bool, Q:bool. (P or Q) = (Q or P))

or_true: (all P:bool. (P or true) = true)

define xor : (fn (bool, bool) -> bool) = fun x:bool, y:bool {
      if x then
        not y
      else
        y
    }

xor_assoc: (all a:bool, b:bool, c:bool. xor(a, xor(b, c)) = xor(xor(a, b), c))

xor_commute: (all a:bool, b:bool. xor(a, b) = xor(b, a))

xor_false: (all b:bool. xor(false, b) = b)

xor_neg: (all a:bool. xor(a, not a) = true)

xor_self: (all a:bool. xor(a, a) = false)

xor_true: (all b:bool. xor(true, b) = (not b))