Module SingletonHole.
Definition array_with_hole {cs: compspecs} sh (t: type) i n (al': list (reptype t)) p :=
ALL v:reptype t,
(data_at sh t v (field_address (tarray t n) (ArraySubsc i :: nil) p) -* data_at sh (tarray t n) (upd_Znth i al' v) p).

(* Specifications: *)
Lemma array_with_hole_intro {cs: compspecs} sh: forall t i n (al: list (reptype t)) p,
0 <= i < n ->
data_at sh (tarray t n) al p |--
data_at sh t (Znth i al) (field_address (tarray t n) (ArraySubsc i :: nil) p) *
array_with_hole sh t i n al p.
Lemma array_with_hole_elim {cs: compspecs} sh: forall t i n (a: reptype t) (al: list (reptype t)) p,
data_at sh t a (field_address (tarray t n) (ArraySubsc i :: nil) p) *
array_with_hole sh t i n al p |--
data_at sh (tarray t n) (upd_Znth i al a) p.