Fixpoint bempty (m: t A) : bool :=
      match m with
      | Leaf => true
      | Node l None r => bempty l && bempty r
      | Node l (Some _) r => false
      end.Fixpoint beq (m1 m2: t A) {struct m1} : bool :=
      match m1, m2 with
      | Leaf, _ => bempty m2
      | _, Leaf => bempty m1
      | Node l1 o1 r1, Node l2 o2 r2 =>
          match o1, o2 with
          | None, None => true
          | Some y1, Some y2 => beqA y1 y2
          | _, _ => false
          end
          && beq l1 l2 && beq r1 r2
      end.

(* Specifications: *)
Lemma bempty_correct: forall m, bempty m = true <-> (forall x, get x m = None).
Lemma beq_correct: forall m1 m2, beq m1 m2 = true <-> (forall (x: elt), match get x m1, get x m2 with | None, None => True | Some y1, Some y2 => beqA y1 y2 = true | _, _ => False end).
Lemma bempty_correct: forall m, bempty m = true <-> (forall x, get x m = None).
Lemma beq_correct: forall m1 m2, beq m1 m2 = true <-> (forall (x: elt), match get x m1, get x m2 with | None, None => True | Some y1, Some y2 => beqA y1 y2 = true | _, _ => False end).