Definition gupd_reptype_array_is_pair: forall t n a i t0,
  0 <= i < n ->
  sigT (fun F => sigT (fun G =>
    forall v v0,
      F (gupd_reptype_array t n a i t0 v v0) =
        (proj_except_reptype_array t n a i v, v0) /\
      gupd_reptype_array t n a i t0 v v0 =
        G (proj_except_reptype_array t n a i v, v0)
  )).Definition gupd_reptype_structlist_is_pair: forall f i t0,
  isOK (field_type i f) = true ->
  sigT (fun F => sigT (fun G =>
    forall v v0,
      F (gupd_reptype_structlist f i t0 v v0) =
        (proj_except_reptype_structlist f i v, v0) /\
      gupd_reptype_structlist f i t0 v v0 =
        G (proj_except_reptype_structlist f i v, v0)
  )).Definition gupd_reptype_unionlist_is_pair: forall f i t0,
  sigT (fun F => sigT (fun G =>
    forall (v: reptype_unionlist f) v0,
      F (gupd_reptype_unionlist i t0 v0) = (proj_except_reptype_unionlist, v0) /\
      gupd_reptype_unionlist i t0 v0 = G (proj_except_reptype_unionlist, v0))).

(* Specifications: *)
Lemma nf_sub2_is_nf_sub2_1_nf_replace2: forall t gf gfs, legal_nested_field t (gf :: gfs) -> nf_replace2 t gfs (nf_sub2 (nested_field_type2 t gfs) gf nil) = nf_sub2 t gf gfs.
Lemma nf_replace2_is_nf_replace2_1_nf_replace2: forall t gf gfs t0, legal_nested_field t (gf :: gfs) -> nf_replace2 t gfs (nf_replace2 (nested_field_type2 t gfs) (gf :: nil) t0) = nf_replace2 t (gf :: gfs) t0.
Lemma proj_except_reptype_is_proj_except_reptye1_gupd_reptype: forall t gf gfs v, legal_nested_field t (gf :: gfs) -> JMeq (proj_except_reptype t gf gfs v) (gupd_reptype t gfs _ v (proj_except_reptype _ gf nil (proj_reptype t gfs v))).
Lemma gupd_reptype_is_gupd_reptye1_gupd_reptype: forall t gf gfs t0 v v0, legal_nested_field t (gf :: gfs) -> JMeq (gupd_reptype t (gf :: gfs) t0 v v0) (gupd_reptype t gfs _ v (gupd_reptype _ (gf :: nil) _ (proj_reptype t gfs v) v0)).