Implicit Type p : seq T.Variant split x : seq T -> seq T -> seq T -> Type :=
  Split p1 p2 : split x (rcons p1 x ++ p2) p1 p2.Variant split x : seq T -> seq T -> seq T -> Type :=
  Split p1 p2 : split x (rcons p1 x ++ p2) p1 p2.Variant splitr x : seq T -> Type :=
  Splitr p1 p2 : splitr x (p1 ++ x :: p2).Variant splitr x : seq T -> Type :=
  Splitr p1 p2 : splitr x (p1 ++ x :: p2).Definition next p x := if p is y :: p' then next_at x y y p' else x.Definition prev p x := if p is y :: p' then prev_at x y y p' else x.(* ucycleb is the boolean predicate, but ucycle is defined as a Prop *)
(* so that it can be used as a coercion target. *)
Definition ucycleb p := cycle e p && uniq p.Definition ucycle p : Prop := cycle e p && uniq p.

Lemma shortenP x p : path e x p -> shorten_spec x p (last x p) (shorten x p).