Fixpoint lem (m0 m1 : Map bool) {struct m1} : Prop :=
  match m0, m1 with
  | M0, M0 => True
  | M0, M1 _ _ => False
  | M0, M2 _ _ => False
  | M1 _ _, M0 => False
  | M1 a b, M1 a' b' => if Neqb a a' then leb b b' else False
  | M1 _ _, M2 _ _ => False
  | M2 _ _, M0 => False
  | M2 _ _, M1 _ _ => False
  | M2 a b, M2 c d => lem a c /\ lem b d
  end.

(* Specifications: *)
Lemma lem_reflexive : r_reflexive bool lem.
Lemma lem_antisymmetric : r_antisymmetric bool lem.
Lemma lem_transitive : r_transitive bool lem.
Lemma lem_order : r_order bool lem.