Section contents.
Variables (T: E) (ol: list T).
Definition Index := natBelow (length ol).
Definition subscript: Index -> T := vec.nth (vec.insertion_sort (@Ele T) (@Ele_le_dec T) (vec.from_list ol)).
Definition UE: E :=
Build_E (fun x y: Index => Ecmp T (subscript x) (subscript y))
(fun x y => Ecmp_sym T (subscript x) (subscript y))
(fun x y z => Ecmp_trans T (subscript x) (subscript y) (subscript z))
(fun x y z => Ecmp_eq_trans_l T (subscript x) (subscript y) (subscript z)).
Definition IndexIn (i: nat) (l: list Index): Prop := In i (map nb_val l).
Definition IndexSeq (b: nat) (l: list Index): Prop :=
forall i, b <= i -> i < b + length l -> IndexIn i l.
Definition IndexSeq_above (b: nat) (l: list Index): Prop := IndexSeq (b - length l) l.
Proof with try assumption.
repeat intro.
apply lt_asym with (nb_val x) (nb_val y)...
apply IndicesCorrect.
apply Ecmp_apply_sym...
Qed.
Definition IndexSeq_uncons l b:
IndexSeq b l -> l <> nil -> exists l', exists p: Index, nb_val p = b /\ Permutation.Permutation (p :: l') l.
Proof with auto.
destruct l; intros.
intros.
elimtype False...
assert (b < b + length (i :: l)).
simpl. omega.
specialize (H b (le_refl _) H1).
unfold IndexIn in H.
destruct (In_map_inv H). clear H.
destruct H2.
subst b.
destruct (In_inv_perm _ _ H2).
eauto.
Qed.

Lemma IndexSeq_cons_inv (b: Index) (l: list Index): IndexSeq b (b :: l) -> IndexSeq (S b) l.