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 fold_right_sepcon_deletenth': forall n (l:list (LiftEnviron mpred)),
@fold_right (environ -> mpred) (environ -> mpred) sepcon emp l =
nth n l emp * fold_right sepcon emp (delete_nth n l).