(* Finally, the semantics of MapFold which we will be using *)

Lemma myMapFold_lemma :
forall (A B : Set) (f : ad -> A -> Map B) (m : Map A),
f_OK _ _ f ->
forall (a : ad) (y : B),
MapGet _ (MapFold _ _ (M0 _) (MapMerge _) f m) a = Some y <->
(exists a1 : ad,
(exists y1 : A,
MapGet _ m a1 = Some y1 /\ MapGet _ (f a1 y1) a = Some y)).