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

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

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

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

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

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

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

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)))

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)

fun xor(x:bool, y:bool) {
  if x then
    not y
  else
    y
}

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

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

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