Fixpoint list_drop (A: Type) (n: nat) (l: list A) {struct n} : list A :=
match n with O => l | S i => match l with nil => nil | _ :: l' => list_drop A i l' end end.
Arguments list_drop [A] _ _.
Definition straightline (c: Clight.statement) :=
forall ge ve te k m ve' te' k' m',
cl_step ge (State ve te (Kseq c :: k)) m (State ve' te' k') m' ->  k=k'.

(* Specifications: *)
Lemma straightline_assign: forall e0 e, straightline (Clight.Sassign e0 e).
Lemma extract_exists_pre_later {CS: compspecs} {Espec: OracleKind}:
forall  (A : Type) (Q: assert) (P : A -> assert) c Delta (R: ret_assert),
(forall x, semax Espec Delta (fun rho => Q rho && |> P x rho) c R) ->
semax Espec Delta (fun rho => Q rho && |> exp (fun x => P x rho)) c R.
Lemma extract_exists_pre {CS: compspecs} {Espec: OracleKind}:
forall  (A : Type) (P : A -> assert) c Delta (R: ret_assert),
(forall x, semax Espec Delta (P x) c R) ->
semax Espec Delta (fun rho => exp (fun x => P x rho)) c R.