Fixpoint freelist_no_overlap (l: list (block * Z * Z)) : Prop :=
match l with
| nil => True
| (b, lo, hi) :: l' =>
freelist_no_overlap l' /\
(forall b' lo' hi', In (b', lo', hi') l' ->
b' <> b \/ hi' <= lo \/ hi <= lo')
end.

Theorem match_envs_free_blocks:
forall j cenv e le m lo hi te tle tlo thi m' tm,
match_envs j cenv e le m lo hi te tle tlo thi ->
Mem.inject j m tm ->
Mem.free_list m (blocks_of_env ge e) = Some m' ->
exists tm',
Mem.free_list tm (blocks_of_env tge te) = Some tm'
/\ Mem.inject j m' tm'.