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

Lemma MapFold_canon_1 : forall m0:Map B, mapcanon B m0 -> forall op:Map B -> Map B -> Map B, (forall m1:Map B, mapcanon B m1 -> forall m2:Map B, mapcanon B m2 -> mapcanon B (op m1 m2)) -> forall f:ad -> A -> Map B, (forall (a:ad) (y:A), mapcanon B (f a y)) -> forall (m:Map A) (pf:ad -> ad), mapcanon B (MapFold1 A (Map B) m0 op f pf m).