(*TODO: Move to ev_semantics*)
Definition in_free_list (b : block) ofs xs :=
exists x, List.In x xs /\
let '(b', lo, hi) := x in
b = b' /\
(lo <= ofs < hi)%Z.
Fixpoint in_free_list_trace (b : block) ofs es :=
match es with
| event_semantics.Free l :: es =>
in_free_list b ofs l \/ in_free_list_trace b ofs es
| _ :: es =>
in_free_list_trace b ofs es
| [:: ] =>
False
end.

Lemma free_list_cases:
forall l m m' b ofs
(Hfree: Mem.free_list m l = Some m'),
(permission_at m b ofs Cur = Some Freeable /\
permission_at m' b ofs Cur = None) \/
(permission_at m b ofs Cur = permission_at m' b ofs Cur).