(* * Copyright (c) 2009-2016, Andrew Appel, Robert Dockins, Aquinas Hobor and Le Xuan Bach * *)
Require VST.msl.tree_shares.
Module Share : SHARE_MODEL := tree_shares.Share.
Definition share : Type := Share.t.
Instance pa_share : Perm_alg share := Share.pa.
Instance sa_share : Sep_alg share := Share.sa.
Instance ca_share : Canc_alg share := Share.ca.
Definition emptyshare : share := Share.bot.
Definition fullshare : share := Share.top.

(* Specifications: *)
Theorem leq_join_sub : forall s1 s2:Share.t,
s1 <= s2 <-> join_sub s1 s2.
Lemma top_correct' : forall x:t, join_sub x top.
Lemma bot_identity : identity bot.
Hint Resolve bot_identity.
Lemma identity_share_bot : forall s,
identity s -> s = bot.
Lemma factoryOverlap' : forall f1 f2 n1 n2,
isTokenFactory f1 n1 -> isTokenFactory f2 n2 -> joins f1 f2 -> False.
Lemma identityToken' : forall x, isToken x 0 <-> identity x.
Lemma nonidentityToken' : forall x n, (n > 0)%nat -> isToken x n -> nonidentity x.
Lemma nonidentityFactory' : forall x n, isTokenFactory x n -> nonidentity x.
Lemma split_join : forall x1 x2 x,
split x = (x1,x2) -> join x1 x2 x.
Lemma split_nontrivial' : forall x1 x2 x,
split x = (x1, x2) ->
(identity x1 \/ identity x2) ->
identity x.
Lemma rel_leq : forall a x, join_sub (rel a x) a.
Lemma rel_join : forall a x y z,
join x y z ->
join (rel a x) (rel a y) (rel a z).
Lemma rel_join2 : forall a x y s,
nonidentity a ->
join (rel a x) (rel a y) s ->
exists z, s = rel a z /\ join x y z.
Lemma rel_nontrivial : forall a x,
identity (rel a x) ->
(identity a \/ identity x).