Module Type SHARE_MODEL.
Include BA_FACTS.
Parameter EqDec_share: EqDec t.
Existing Instance EqDec_share.
(* Splittability *)
Parameter split : t -> t * t.
(* Token factories *)
Parameter isTokenFactory : t -> nat -> Prop.
Parameter isToken : t -> nat -> Prop.
Parameter create_token : nat -> t -> (t*t).
Parameter split_token : nat -> t -> t*t.
(* relativization *)
Parameter rel : t -> t -> t.
Parameter unrel: t -> t -> t.
Definition Lsh  : t := fst (split top).
Definition Rsh  : t := snd (split top).
Definition splice (a b: t) : t := lub (rel Lsh a) (rel Rsh b).

Axiom unrel_rel: forall x sh, nonidentity x -> unrel x (rel x sh) = sh.
Axiom unrel_splice_L: forall a b, unrel Lsh (splice a b) = a.
Axiom unrel_splice_R: forall a b, unrel Rsh (splice a b) = b.
Axiom contains_Lsh_e: forall sh, join_sub Lsh sh -> unrel Lsh sh = top.
Axiom contains_Rsh_e: forall sh, join_sub Rsh sh -> unrel Rsh sh = top.
Axiom unrel_disjoint: forall a a', a <> bot -> glb a a' = bot -> unrel a a' = bot.
Axiom unrel_lub: forall a b1 b2, unrel a (lub b1 b2) = lub (unrel a b1) (unrel a b2).
Axiom unrel_glb: forall a b1 b2, unrel a (glb b1 b2) = glb (unrel a b1) (unrel a b2).
Axiom unrel_join: forall x a b c, join a b c -> join (unrel x a) (unrel x b) (unrel x c).
Axiom unrel_top: forall a, unrel a top = top.
Axiom unrel_bot: forall a, unrel a bot = bot.
Axiom top_unrel: forall a, unrel top a = a.
Axiom bot_unrel: forall a, unrel bot a = a.