End MapFoldDistr.
Section MapFoldDistrL.
Variable A : Type.
Variable M : Type.
Variable neutral : M.
Variable op : M -> M -> M.
Variable M' : Type.
Variable neutral' : M'.
Variable op' : M' -> M' -> M'.
Variable N : Type.
Variable times : N -> M -> M'.
Variable absorb : forall c:N, times c neutral = neutral'.
Variable
distr :
forall (a b:M) (c:N), times c (op a b) = op' (times c a) (times c b).

Lemma MapFold_distr_l :
forall (f:ad -> A -> M) (m:Map A) (c:N),
times c (MapFold A M neutral op f m) =
MapFold A M' neutral' op' (fun (a:ad) (y:A) => times c (f a y)) m.