Definition tcret_proof retsig (A: rmaps.TypeTree)
(Q: forall ts : list Type,
functors.MixVariantFunctor._functor
(rmaps.dependent_type_functor_rec ts (AssertTT A)) mpred)  :=
(forall gx ts x (ret : option val),
(Q ts x (make_ext_rval gx ret)
&& !!step_lemmas.has_opttyp ret (opttyp_of_type retsig)
|-- !!tc_option_val retsig ret)).
Inductive semax_body_proof :=
| mk_body: forall {Vprog: varspecs} {Gprog: funspecs} {cs: compspecs}
{f: function} {id: ident} {fspec: funspec},
@semax_body Vprog Gprog cs f (id,fspec) -> semax_body_proof
| mk_external: forall (id: ident) retsig {Espec: OracleKind} {ids: list ident} {ef: external_function}
{A} {P Q: forall ts : list Type,
functors.MixVariantFunctor._functor
(rmaps.dependent_type_functor_rec ts (AssertTT A)) mpred},
tcret_proof retsig A Q ->
@semax_external Espec ids ef A P Q -> semax_body_proof.

Lemma tycontext_sub_nofunc_tycontext:
forall V1 G1 V2 G2,
(forall id, sub_option (make_tycontext_g V1 G1) ! id (make_tycontext_g V2 G2) ! id) ->
(forall id, sub_option (make_tycontext_s G1) ! id (make_tycontext_s G2) ! id) ->
tycontext_sub (nofunc_tycontext V1 G1) (nofunc_tycontext V2 G2).