Variable comm : forall a b:M, op a b = op b a.

(* Specifications: *)
Lemma MapFold_Put_disjoint_1 :
forall (p:positive) (f:ad -> A -> M) (pf:ad -> ad)
(a1 a2:ad) (y1 y2:A),
Nxor a1 a2 = Npos p ->
MapFold1 A M neutral op f pf (MapPut1 A a1 y1 a2 y2 p) =
op (f (pf a1) y1) (f (pf a2) y2).
Lemma MapFold_Put_disjoint_2 :
forall (f:ad -> A -> M) (m:Map A) (a:ad) (y:A) (pf:ad -> ad),
MapGet A m a = None ->
MapFold1 A M neutral op f pf (MapPut A m a y) =
op (f (pf a) y) (MapFold1 A M neutral op f pf m).
Lemma MapFold_Put_disjoint :
forall (f:ad -> A -> M) (m:Map A) (a:ad) (y:A),
MapGet A m a = None ->
MapFold A M neutral op f (MapPut A m a y) =
op (f a y) (MapFold A M neutral op f m).
Lemma MapFold_Put_behind_disjoint_2 :
forall (f:ad -> A -> M) (m:Map A) (a:ad) (y:A) (pf:ad -> ad),
MapGet A m a = None ->
MapFold1 A M neutral op f pf (MapPut_behind A m a y) =
op (f (pf a) y) (MapFold1 A M neutral op f pf m).
Lemma MapFold_Put_behind_disjoint :
forall (f:ad -> A -> M) (m:Map A) (a:ad) (y:A),
MapGet A m a = None ->
MapFold A M neutral op f (MapPut_behind A m a y) =
op (f a y) (MapFold A M neutral op f m).
Lemma MapFold_Merge_disjoint_1 :
forall (f:ad -> A -> M) (m1 m2:Map A) (pf:ad -> ad),
MapDisjoint A A m1 m2 ->
MapFold1 A M neutral op f pf (MapMerge A m1 m2) =
op (MapFold1 A M neutral op f pf m1) (MapFold1 A M neutral op f pf m2).
Lemma MapFold_Merge_disjoint :
forall (f:ad -> A -> M) (m1 m2:Map A),
MapDisjoint A A m1 m2 ->
MapFold A M neutral op f (MapMerge A m1 m2) =
op (MapFold A M neutral op f m1) (MapFold A M neutral op f m2).