(*Unital*)
Instance discHeap_unital:
@UnitalSeparationAlgebra Heap discHeap_R Heap_Join.
(*Residual*)
Instance discHeap_residual:
@ResidualSeparationAlgebra Heap discHeap_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.
End heaps.
(***********************************)
(* The other nondisjoint HEAPS     *)
(***********************************)
Section heaps'.
Context (addr val: Type).
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'.

(* Specifications: *)
(*Empty heap is increasing element*)
Lemma discHeap_empty_increasing':
@increasing Heap' discHeap_R' Heap_Join' (fun _ => None).