induction n in m, a, b, c, d |- *; simpl; intros.
rewrite (eq_nil a).
rewrite (eq_nil b)...
destruct (Vcons_eq_inv H).
destruct (IHn _ _ _ _ _ H1).
split...
rewrite (eq_cons a).
rewrite (eq_cons b).
rewrite H0.
rewrite H2...
Qed.
(* remove *)
Definition remove (T: Set) (n: nat) (v: Vector.t T (S n)) (nb: natBelow (S n)): Vector.t T n :=
natBelow_rect_S
(fun (n0: nat) (_: natBelow (S n0)) => Vector.t T (S n0) -> Vector.t T n0)
(fun p => @tail p _)
(fun v p H v0 => Vector.cons (head v0) (H (tail v0))) nb v.
(* permutations *)
Inductive Permutation (A: Type): forall n, Vector.t A n -> Vector.t A n -> Prop :=
| perm_nil: Permutation Vector.nil Vector.nil
| perm_skip (x: A) n (v v': Vector.t A n): Permutation v v' -> Permutation (Vector.cons x v) (Vector.cons x v')
| perm_swap (x y: A) n (l: Vector.t A n): Permutation (Vector.cons y (Vector.cons x l)) (Vector.cons x (Vector.cons y l))
| perm_trans n (l l' l'': Vector.t A n): Permutation l l' -> Permutation l' l'' -> Permutation l l''.
Hint Resolve perm_nil.
Hint Resolve perm_skip.
Hint Resolve perm_swap.

(* Specifications: *)
Lemma perm_sym (X: Set) n (a b: Vector.t X n): Permutation a b -> Permutation b a.
Proof with auto. intros p. induction p... apply perm_trans with l'... Qed.
Lemma perm_refl (X: Set) n (v: Vector.t X n): Permutation v v.
Lemma remove_head (T: Set) p (v: Vector.t T (S p)):
remove v (mkNatBelow 0 p) = tail v.
Lemma remove_map (A B: Set) (f: A -> B) n (i: natBelow (S n)) (v: Vector.t A (S n)):
remove (map f v) i = map f (remove v i).