(*Unital*)
Instance discHeap_unital:
  @UnitalSeparationAlgebra Heap discHeap_R Heap_Join.(*Residual*)
Instance discHeap_residual:
  @ResidualSeparationAlgebra Heap discHeap_R Heap_Join.(** * Monotonic heap*)

Instance monHeap_R: Relation Heap :=
  @pointwise_relation _ _ (@option01_relation _ eq).Instance po_monHeap_R: PreOrder Krelation :=
  @pointwise_preorder _ _ _ (@option01_preorder _ _ (eq_preorder _)).(* Upwards-closed*)
Instance monHeap_uSA:
  @UpwardsClosedSeparationAlgebra Heap monHeap_R Heap_Join.(*Downwards-closed*)
Definition monHeap_dSA:
  @DownwardsClosedSeparationAlgebra Heap monHeap_R Heap_Join.(* Increasing *)
Instance monHeap_increasing:
  @IncreasingSeparationAlgebra Heap monHeap_R Heap_Join.(* Residual *)
Instance monHeap_residual:
  @ResidualSeparationAlgebra Heap monHeap_R Heap_Join.(* Unital *)
Instance monHeap_unital:
  @UnitalSeparationAlgebra Heap monHeap_R Heap_Join.Definition Heap': Type := addr -> option val.Instance Heap_Join': Join Heap' :=
  @fun_Join _ _ (@option_Join _ (equiv_Join)).Instance Heap_SA': SeparationAlgebra Heap' :=
  @fun_SA _ _ _ (@option_SA _ _ (equiv_SA)).(** * Discrete heap *)
Instance discHeap_R': Relation Heap' :=
  eq.Instance po_discHeap_R': PreOrder Krelation :=
  eq_preorder _.Program Instance discHeap_ikiM': IdentityKripkeIntuitionisticModel Heap'.(*Upwards-closed*)
Instance discHeap_uSA':
  @UpwardsClosedSeparationAlgebra Heap' discHeap_R' Heap_Join'.(*Downwards-closed*)
Instance discHeap_dSA':
  @DownwardsClosedSeparationAlgebra Heap' discHeap_R' Heap_Join'.

Lemma discHeap_empty_increasing': @increasing Heap' discHeap_R' Heap_Join' (fun _ => None).