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.

(*Variant if l is monotonically decreasing Fixpoint new_freezelist_nth (l: list nat) (al: list mpred): (list mpred) * (list mpred) := match l with | nil => (nil,al) | (n::l') => let (xs, ys) := new_freezelist_nth l' (my_delete_nth n al) in (my_nth n al emp::xs, ys) end.*)
Lemma freeze_SEP'':
forall l Espec {cs: compspecs} Delta P Q  R c Post xs ys,
(xs, ys) = my_freezelist_nth l R ->
@semax cs Espec Delta (PROPx P (LOCALx Q (SEPx (FRZL xs:: ys)))) c Post ->
@semax cs Espec Delta (PROPx P (LOCALx Q (SEPx R))) c Post.