Module Type UNIONFIND.
Parameter elt: Type.
Parameter elt_eq: forall (x y: elt), {x=y} + {x<>y}.
Parameter t: Type.
Parameter repr: t -> elt -> elt.
Definition sameclass (uf: t) (a b: elt) : Prop := repr uf a = repr uf b.
Parameter empty: t.
Parameter find: t -> elt -> elt * t.
Parameter union: t -> elt -> elt -> t.
Parameter merge: t -> elt -> elt -> t.
Parameter path_ord: t -> elt -> elt -> Prop.
Parameter pathlen: t -> elt -> nat.

Axiom pathlen_merge:
forall uf a b x,
pathlen (merge uf a b) x =
if elt_eq (repr uf a) (repr uf b) then
pathlen uf x
else if elt_eq (repr uf x) (repr uf a) then
pathlen uf x + pathlen uf b + 1
else
pathlen uf x.