Definition array_at_ (sh: Share.t) (t: type) (gfs: list gfield) (lo hi: Z) : val -> mpred :=
 array_at sh t gfs lo hi (list_repeat (Z.to_nat (hi-lo)) (default_val _)).

(* Specifications: *)
Lemma field_at_offset_zero: forall sh t gfs v p, field_at sh t gfs v p = field_at sh t gfs v (offset_val 0 p).
Lemma field_at__offset_zero: forall sh t gfs p, field_at_ sh t gfs p = field_at_ sh t gfs (offset_val 0 p).
Lemma data_at_offset_zero: forall sh t v p, data_at sh t v p = data_at sh t v (offset_val 0 p).
Lemma data_at__offset_zero: forall sh t p, data_at_ sh t p = data_at_ sh t (offset_val 0 p).
Lemma array_at_ext: forall sh t gfs lo hi v0 v1 p, Zlength v0 = Zlength v1 -> (forall i u0 u1, lo <= i < hi -> JMeq u0 (Znth (i-lo) v0) -> JMeq u1 (Znth (i-lo) v1) -> field_at sh t (ArraySubsc i :: gfs) u0 p = field_at sh t (ArraySubsc i :: gfs) u1 p) -> array_at sh t gfs lo hi v0 p = array_at sh t gfs lo hi v1 p.
Lemma field_at_Tarray: forall sh t gfs t0 n a v1 v2 p, legal_nested_field t gfs -> nested_field_type t gfs = Tarray t0 n a -> 0 <= n -> JMeq v1 v2 -> field_at sh t gfs v1 p = array_at sh t gfs 0 n v2 p.