Definition Delta_types V G {C: compspecs} (tys : list type) : tycontext :=
  make_tycontext
    (params_of_types
       1 ((Tfunction (type_of_params (params_of_types 2 tys)) Tvoid cc_default) :: tys))
    nil nil Tvoid V G nil.

Lemma semax_prog_entry_point {CS: compspecs} V G prog b id_fun id_arg arg A (P Q: forall ts : list Type, (dependent_type_functor_rec ts (AssertTT A)) mpred) NEP NEQ h: @semax_prog CS prog V G -> Genv.find_symbol (globalenv prog) id_fun = Some b -> find_id id_fun G = Some (mk_funspec ((id_arg, Tpointer Tvoid noattr) :: nil, tptr Tvoid) cc_default A P Q NEP NEQ) -> is_pointer_or_null arg -> (* initial environment *) let rho0 : environ := construct_rho (filter_genv (globalenv prog)) empty_env (PTree.set 1 (Vptr b Ptrofs.zero) (PTree.set id_arg arg (PTree.empty val))) in (* initial environment without the function => to check jm |= P a *) let rho1 : environ := construct_rho (filter_genv (globalenv prog)) empty_env ((* PTree.set 1 (Vptr b Ptrofs.zero) *) (PTree.set id_arg arg (PTree.empty val))) in { q : corestate | (forall jm, Val.inject (Mem.flat_inj (nextblock (m_dry jm))) arg arg -> exists jm', semantics.initial_core (juicy_core_sem (cl_core_sem (globalenv prog))) h jm q jm' (Vptr b Ptrofs.zero) (arg :: nil)) /\ forall (jm : juicy_mem) ts a, app_pred (P ts a rho1) (m_phi jm) -> (* (forall rho, app_pred (! (Q ts a rho >=> !!False)) (m_phi jm)) ->*) app_pred (funassert (Delta_types V G (Tpointer Tvoid noattr::nil)) rho0) (m_phi jm) -> forall z, app_pred (ext_compat z) (m_phi jm) -> jsafeN (@OK_spec Espec) (globalenv prog) (level jm) z q jm }.