(* Path length and merge *)
Section PATHLEN.
Variable uf: t.
Definition F_pathlen (a: elt) (rec: forall b, order uf.(m) b a -> nat) : nat :=
match getlink uf.(m) a with
| inleft (exist a' P) => S (rec a' P)
| inright _ => O
end.
Definition pathlen (a: elt) : nat := Fix uf.(mwf) (fun _ => nat) F_pathlen a.

(* Specifications: *)
Lemma pathlen_unroll:
forall a, pathlen a = match M.get a uf.(m) with Some a' => S(pathlen a') | None => O end.
Lemma pathlen_none:
forall a,
M.get a uf.(m) = None ->
pathlen a = 0.
Lemma pathlen_some:
forall a a',
M.get a uf.(m) = Some a' ->
pathlen a = S (pathlen a').
Lemma pathlen_zero:
forall a, repr uf a = a <-> pathlen a = O.
Lemma pathlen_unroll:
forall a, pathlen a = match M.get a uf.(m) with Some a' => S(pathlen a') | None => O end.
Lemma pathlen_none:
forall a,
M.get a uf.(m) = None ->
pathlen a = 0.
Lemma pathlen_some:
forall a a',
M.get a uf.(m) = Some a' ->
pathlen a = S (pathlen a').
Lemma pathlen_zero:
forall a, repr uf a = a <-> pathlen a = O.