Load loadpath.
(** Separation Logic Interface  This module type axiomatizes the types and operators upon which our soundness proof depends.  NOTE: This module type will probably be made obsolete sometime in the future (if we ever get back to working on this project).  We now believe it's better to axiomatize the separation logic directly (i.e., its proof theory) as opposed to axiomatizing the /models/ of the separation logic, which is what we do here. *)
Module Type VERISTAR_LOGIC.
(** Locations and values *)
Parameters loc val : Type.
Declare Instance Join_val: Join val.
Declare Instance Perm_val: Perm_alg val.
Declare Instance Sep_val: Sep_alg val.
Declare Instance Canc_val: Canc_alg val.
Parameter val2loc : val -> option loc.
Parameter nil_val : val.

(* Specifications: *)
Axiom nil_not_loc : val2loc nil_val = None.
Parameter empty_val : val.
(** The empty value: read "undefined" *)
Axiom emp_empty_val : forall v, identity v <-> v = empty_val.
Definition full (v : val) := forall v2, joins v v2 -> identity v2.
Axiom val2loc_full : forall v l, val2loc v = Some l -> full v.
Axiom nil_full : full nil_val.
Axiom empty_not_full : ~full empty_val.
Axiom val2loc_inj : forall v1 v2 l,
val2loc v1 = Some l ->  val2loc v2 = Some l -> v1=v2.
Axiom loc_eq_dec : forall l1 l2 : loc, Decidable.decidable (l1=l2).
Axiom nil_dec : forall v, Decidable.decidable (v=nil_val).
Definition var : Type := Ident.t.