(* 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.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).Implicit Types (x : ptr) (h : heap).Definition pick (h : heap) := 
  if h is Heap.Def hs _ then head null (supp hs) else null.

Lemma pickP h : valid h && ~~ empb h = (pick h \in dom h).