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).

(* Specifications: *)
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.
Parameter tree_height : t -> nat.