(* own isn't precise unless the ghost is a Disj_alg. Is this a problem? *)

(* Specifications: *)
Lemma own_list_alloc : forall la lp, Forall valid la -> length lp = length la ->
emp |-- |==> (EX lg : _, !!(Zlength lg = Zlength la) &&
iter_sepcon (fun '(g, a, p) => own g a p) (combine (combine lg la) lp)).
Corollary own_list_alloc' : forall a pp i, 0 <= i -> valid a ->
emp |-- |==> (EX lg : _, !!(Zlength lg = i) && iter_sepcon (fun g => own g a pp) lg).
Lemma own_list_dealloc : forall {A} f (l : list A),
(forall b, exists g a pp, f b |-- own g a pp) ->
iter_sepcon f l |-- |==> emp.
Lemma own_list_dealloc' : forall {A} g a p (l : list A),
iter_sepcon (fun x => own (g x) (a x) (p x)) l |-- |==> emp.