destruct n.
intros.
apply False_rect; auto with algebra.
intros.
generalize (j:fin n).
clear j.
intro j.
induction  n as [| n Hrecn].
apply False_rect.
apply fin_O_nonexistent; auto with algebra.
case i.
intro x; case x.
intros.
set (l := in_range_prf) in *.
case j.
intros.
set (l0 := in_range_prf0) in *.
apply
(existT
(fun i' : fin (S (S n)) =>
Ap v i' =' omit v (Build_finiteT l) (Build_finiteT l0) in _)
(Build_finiteT (lt_n_S _ _ l0))).
apply Trans with (Seqtl v (Build_finiteT l0)); auto with algebra.
intros.
rename in_range_prf into l.
case j.
intro x0; case x0.
intro l0.
apply
(existT
(fun i' : fin (S (S n)) =>
Ap v i' =' Ap (omit v (Build_finiteT l)) (Build_finiteT l0) in _)
(Build_finiteT (lt_O_Sn (S n)))).
apply Trans with (head (omit v (Build_finiteT l))); auto with algebra.
intros.
rename in_range_prf into l0.
generalize
(Hrecn (Seqtl v) (Build_finiteT (lt_S_n _ _ l))
(Build_finiteT (lt_S_n _ _ l0))).
intro.
inversion_clear X.
generalize H.
clear H.
case x1.
intros.
apply
(existT
(fun i' : fin (S (S n)) =>
Ap v i' =' Ap (omit v (Build_finiteT l)) (Build_finiteT l0) in _)
(Build_finiteT (lt_n_S _ _ in_range_prf))).
apply
Trans
with
((head v;; omit (Seqtl v) (Build_finiteT (lt_S_n _ _ l)))
(Build_finiteT l0)); auto with algebra.
Defined.
(** - omit_removes' on the other hand does this: suppose again v:(seq n A) and i:(fin n) and define w:=(omit v i). Suppose that this time j:(fin n). If [~i='j] then (v j)='(w j') for some j'; again omit_removes' returns this j' and a proof. *)

(* Specifications: *)
Lemma omit_removes' :
forall (n : Nat) (A : Setoid) (v : seq n A) (i j : fin n),
~ i =' j in _ -> sigT (fun j' => v j =' omit v i j' in _).