Fixpoint lm_to_ml {A:Type} (lm:list (monad A)) : monad (list A):=
match lm with
| [] => Mreturn []
| m::ms => m >>::(lm_to_ml ms)
end.

Lemma lm_to_ml_bounds {R T:Type} n (mtl:list (monad T)) f_low f_up f_in (r: T → list R):
fmono f_low → fmono f_up → Forall Mle mtl →
(∀ mt s n', mt ∈ mtl → n' ∈ map f_in (r (snd (mt s))) → f_low s ≤ n' ≤ f_up (fst (mt s))) →
∀ st st', st ≤ st' →  (* st, st' need to be in the induction hypothesis. *)
n ∈ map f_in (concat (map r (snd (lm_to_ml mtl st')))) →
f_low st ≤ n ≤ f_up (fst (lm_to_ml mtl st')).