(* the inheritance from PCMs *)
Definition heapUMCMix :=
UMCMixin ftE tfE defE undefE emptyE updE domE dom_eqE freeE
findE unionE umfiltE empbE undefbE ptsE.
Canonical heapUMC := Eval hnf in UMC heap heapUMCMix.
Definition heapPCMMix := union_map_classPCMMix heapUMC.
Canonical heapPCM := Eval hnf in PCM heap heapPCMMix.
Definition heapCPCMMix := union_map_classCPCMMix heapUMC.
Canonical heapCPCM := Eval hnf in CPCM heap heapCPCMMix.
Definition heapTPCMMix := union_map_classTPCMMix heapUMC.
Canonical heapTPCM := Eval hnf in TPCM heap heapTPCMMix.
End Exports.
End Heap.
Export Heap.Exports.
Notation heap := Heap.heap.
Definition heap_pts A (x : ptr) (v : A) :=
@UMC.pts _ _ heapUMC x (idyn v).
Notation "x :-> v" := (@heap_pts _ x v) (at level 30).
(*****************************)
(* Specific points-to lemmas *)
(*****************************)
Section HeapPointsToLemmas.
Implicit Types (x : ptr) (h : heap).

Lemma updi_iinv x xs1 xs2 h1 h2 :
size xs1 = size xs2 -> valid (updi x xs1 \+ h1) ->
updi x xs1 \+ h1 = updi x xs2 \+ h2 -> xs1 = xs2 /\ h1 = h2.