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))).

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.