(** Comparison functions. *)
Require Char.
(** Total order on strings. *)
Fixpoint compare (x y : t) : comparison :=
match x, y with
| [], [] => Eq
| [], _ => Lt
| _, [] => Gt
| x :: xs, y :: ys =>
match Char.compare x y with
| Eq => compare xs ys
| c => c
end
end.
induction x as [|a x HI]; destruct y as [|b y]; simpl; try congruence.
case_eq (Char.compare a b); simpl; try congruence.
now intros Hab Hxy; rewrite (Char.compare_implies_eq _ _ Hab); rewrite (HI _ Hxy).
Qed.

Lemma compare_same_is_eq : forall (x : t), compare x x = Eq.