Fixpoint tailOpt(A : Set)(n : nat)(v : Vector.t A n) : option (Vector.t A (pred n)):=
  match v with
    | [] => None
    | Vector.cons _ _ _ v => Some v
  end.

(* Specifications: *)
Lemma tailOpt_eq : forall (A : Set)(n : nat)(v1 v2 : Vector.t A n), v1 = v2 -> tailOpt v1 = tailOpt v2.
Lemma vector_cons_eq_inv : forall (A : Set)(n : nat)(a1 a2 : A)(v1 v2 : Vector.t A n), Vector.cons A a1 n v1 = Vector.cons A a2 n v2 -> a1 = a2 /\ v1 = v2.
Lemma pair_eq_inv : forall (A B : Type)(a1 a2 : A)(b1 b2 : B), (a1, b1) = (a2, b2) -> a1 = a2 /\ b1 = b2.
Lemma opt_eq_inv : forall (A : Type)(a1 a2 : A), Some a1 = Some a2 -> a1 = a2.
Lemma shiftOut_ls_eq : forall n ls1 ls2 v ls1' ls2', shiftOut ls1 n = Some (v, ls1') -> shiftOut ls2 n = Some (v, ls2') -> (firstn n ls1) = (firstn n ls2).
Lemma le_refl_gen : forall n1 n2, (n1 = n2 -> n1 <= n2)%nat.
Lemma app_first_eq : forall (A : Type)(ls2 ls1 ls3 : list A), ls1 = ls2 ++ ls3 -> length ls1 = length ls2 -> ls1 = ls2 /\ ls3 = nil.
Lemma to_list_eq_inv : forall (A : Set) n (v1 v2 : Vector.t A n), VectorDef.to_list v1 = VectorDef.to_list v2 -> v1 = v2.
Lemma shiftOut_to_list : forall n (v : Bvector n), shiftOut (VectorDef.to_list v) n = Some (v, nil).
Lemma shiftOut_app_None : forall ls1 ls2 n, shiftOut (ls1 ++ ls2) n = None -> shiftOut ls1 n = None.
Lemma BVxor_same_id : forall n (v : Bvector n), BVxor n v v = Bvect_false n.
Lemma BVxor_comm : forall n (v1 v2 : Bvector n), BVxor n v1 v2 = BVxor n v2 v1.
Lemma BVxor_id_r : forall n (v : Bvector n), BVxor n v (Bvect_false n) = v.
Lemma BVxor_id_l : forall n (v : Bvector n), BVxor n (Bvect_false n) v = v.
Lemma BVxor_assoc : forall n (v1 v2 v3 : Bvector n), BVxor n (BVxor n v1 v2) v3 = BVxor n v1 (BVxor n v2 v3).
Lemma BVxor_id_r_inv : forall n (v1 v2 : Bvector n), BVxor n v1 v2 = v1 -> v2 = (Bvect_false n).
Lemma BVxor_id_inv : forall n (v1 v2 : Bvector n), BVxor n v1 v2 = Bvect_false n -> v1 = v2.