[Haskell-cafe] Proof question -- (==) over Bool

Luke Palmer lrpalmer at gmail.com
Fri May 21 22:01:04 EDT 2010


2010/5/21 R J <rj248842 at hotmail.com>:
> I'm trying to prove that (==) is reflexive, symmetric, and transitive over
> the Bools, given this definition:
> (==)                       :: Bool -> Bool -> Bool
> x == y                     =  (x && y) || (not x && not y)
> My question is:  are the proofs below for reflexivity and symmetricity
> rigorous, and what is the proof of transitivity, which eludes me?  Thanks.
>
> Theorem (reflexivity):  For all x `elem` Bool, x == x.
> Proof:
>       x == x
>   =    {definition of "=="}
>       (x && x) || (not x && not x)
>   =    {logic (law of the excluded middle)}
>       True

This one depends on what you mean by rigorous.  But you would have to
have lemmas showing that && and || correspond to the predicate logic
notions.  I would do this by cases:

x = True:
  (True && True) || (not True && not True)
  ...
  True || False
  True
x = False
  (False && False) || (not False && not False)
  ...
  False || True
  True



> Theorem (symmetricity):  For all x, y `elem` Bool, if x == y, then y == x.
> Proof:
>       x == y
>   =    {definition of "=="}
>       (x && y) || (not x && not y)
>   =    {lemma:  "(&&)" is commutative}
>       (y && x) || (not x && not y)
>   =    {lemma:  "(&&)" is commutative}
>       (y && x) || (not y && not x)
>   =    {definition of "=="}
>       y == x

Yes, given the lemmas about && and ||, this is rigorous.  You can
prove those lemmas by case analysis.

> Theorem (transitivity):  For all x, y, z `elem` Bool, if x == y, and y == z,
> then x == z.
> Proof: ?

My first hunch here is to try the following lemma:

  Lemma: if (x == y) = True if and only if x = y.

where == is the version you defined, and = is regular equality from
logic, if you are allowed to rely on that.  I would prove this by
cases.

At this point, you can convert transitivity of == to transitivity of
=, which is assumed by the axioms.  You could do the same for the
other proofs you asked about instead of brute-forcing them.

If you aren't allowed such magic, then I guess you could do all 8
cases of x, y, and z (i.e. proof by truth table).  Somebody else might
have a cleverer idea.

Luke


More information about the Haskell-Cafe mailing list