Require VST.floyd.aggregate_pred. Import VST.floyd.aggregate_pred.aggregate_pred.
Local Open Scope logic.
(************************************************  Definition of nested_reptype_structlist, field_at, array_at, data_at, nested_sfieldlist_at  ************************************************)
Section CENV.
Context {cs: compspecs}.

(* Specifications: *)
Lemma struct_Prop_cons2:
forall it it' m (A: ident*type -> Type)
(P: forall it, A it -> Prop)
(v: compact_prod (map A (it::it'::m))),
struct_Prop (it :: it' :: m) P v =
(P _ (fst v) /\ struct_Prop (it'::m) P (snd v)).
Lemma struct_Prop_ext_derives: forall m {A0 A1} (P0: forall it, A0 it -> Prop) (P1: forall it, A1 it -> Prop) v0 v1,
members_no_replicate m = true ->
(forall i d0 d1, in_members i m ->
P0 _ (proj_struct i m v0 d0) -> P1 _ (proj_struct i m v1 d1)) ->
struct_Prop m P0 v0 -> struct_Prop m P1 v1.
Lemma struct_Prop_ext: forall m {A0 A1} (P0: forall it, A0 it -> Prop) (P1: forall it, A1 it -> Prop) v0 v1,
members_no_replicate m = true ->
(forall i d0 d1, in_members i m ->
P0 _ (proj_struct i m v0 d0) = P1 _ (proj_struct i m v1 d1)) ->
struct_Prop m P0 v0 = struct_Prop m P1 v1.