Fixpoint MapCanonicalize (m:Map A) : Map A :=
match m with
| M2 m0 m1 => makeM2 A (MapCanonicalize m0) (MapCanonicalize m1)
| _ => m
end.

(* Specifications: *)
Lemma mapcanon_exists_1 : forall m:Map A, eqmap A m (MapCanonicalize m).
Lemma mapcanon_exists_2 : forall m:Map A, mapcanon (MapCanonicalize m).
Lemma mapcanon_exists :
forall m:Map A, {m' : Map A | eqmap A m m' /\ mapcanon m'}.
Lemma MapRemove_canon :
forall m:Map A, mapcanon m -> forall a:ad, mapcanon (MapRemove A m a).
Lemma MapMerge_canon :
forall m m':Map A, mapcanon m -> mapcanon m' -> mapcanon (MapMerge A m m').
Lemma MapDelta_canon :
forall m m':Map A, mapcanon m -> mapcanon m' -> mapcanon (MapDelta A m m').