Tactic Notation "freeze1_SEP" constr(n) constr(m) :=
(gather_SEP n m); eapply (freeze1_SEP' (nat_of_Z 0)); simpl.
Tactic Notation "freeze1_SEP" constr(n) constr(m) constr(k)  :=
(gather_SEP n m k); eapply (freeze1_SEP' (nat_of_Z 0)); simpl.
Tactic Notation "freeze1_SEP" constr(n) constr(m) constr(k)  constr(p) :=
(gather_SEP n m k p); eapply (freeze1_SEP' (nat_of_Z 0)); simpl.
Tactic Notation "freeze1_SEP" constr(n) constr(m) constr(k) constr(p) constr(q) :=
(gather_SEP n m k p q); eapply (freeze1_SEP' (nat_of_Z 0)); simpl.
(*******************freezing a list of mpreds ******************************)
Fixpoint freezelist_nth (l: list nat) (al: list mpred): (list mpred) * (list mpred) :=
match l with
| nil => (nil,al)
| (n::l') => let (xs, ys) := freezelist_nth l' al
in (nth n ys emp::xs, delete_nth n ys)
end.

Lemma flatten_emp_in_SEP':
forall n P Q (R: list mpred) R',
nth_error R n = Some emp ->
R' = firstn n R ++ skipn (S n) R ->
PROPx P (LOCALx Q (SEPx R)) = PROPx P (LOCALx Q (SEPx R')).