Definition add_funspecs (Espec : OracleKind) (ext_link: Strings.String.string -> ident) (fs : funspecs) : OracleKind :=
  match Espec with
    | Build_OracleKind ty spec =>
      Build_OracleKind ty (add_funspecs_rec ext_link ty spec fs)
  end.

(* Specifications: *)
Lemma necR_jm_phi : forall jm jm', necR jm jm' -> necR (m_phi jm) (m_phi jm').
Lemma semax_ext' (ext_link: Strings.String.string -> ident) id sig cc A P Q NEP NEQ (fs : funspecs) : let f := mk_funspec sig cc A P Q NEP NEQ in In (ext_link id,f) fs -> funspecs_norepeat fs -> (forall n, semax_external (add_funspecs Espec ext_link fs) (fst (split (fst sig))) (EF_external id (funsig2signature sig cc)) _ P Q n).
Lemma semax_ext (ext_link: Strings.String.string -> ident) id ids sig sig' cc A P Q NEP NEQ (fs : funspecs) : let f := mk_funspec sig cc A P Q NEP NEQ in In (ext_link id,f) fs -> funspecs_norepeat fs -> ids = fst (split (fst sig)) -> sig' = funsig2signature sig cc -> (forall n, semax_external (add_funspecs Espec ext_link fs) ids (EF_external id sig') _ P Q n).
Lemma semax_ext'_void (ext_link: Strings.String.string -> ident) id sig cc A P Q NEP NEQ (fs : funspecs) : let f := mk_funspec (sig, tvoid) cc A P Q NEP NEQ in In (ext_link id,f) fs -> funspecs_norepeat fs -> (forall n, semax_external (add_funspecs Espec ext_link fs) (fst (split sig)) (EF_external id (mksignature (map typ_of_type (map snd sig)) None cc)) _ P Q n).
Lemma semax_ext_void (ext_link: Strings.String.string -> ident) id ids sig sig' cc A P Q NEP NEQ (fs : funspecs) : let f := mk_funspec (sig, tvoid) cc A P Q NEP NEQ in In (ext_link id,f) fs -> funspecs_norepeat fs -> ids = fst (split sig) -> sig' = mksignature (map typ_of_type (map snd sig)) None cc -> (forall n, semax_external (add_funspecs Espec ext_link fs) ids (EF_external id sig') _ P Q n).