Library Coq.Vectors.VectorSpec


Proofs of specification for functions defined over Vector
Author: Pierre Boutillier Institution: PPS, INRIA 12/2010

Require Fin.
Require Import VectorDef.
Import VectorNotations.

Definition cons_inj A a1 a2 n (v1 v2 : t A n)
 (eq : a1 :: v1 = a2 :: v2) : a1 = a2 /\ v1 = v2 :=
   match eq in _ = x return caseS _ (fun a2´ _ v2´ => fun v1´ => a1 = a2´ /\ v1´ = v2´) x v1
   with | eq_refl => conj eq_refl eq_refl
   end.

Lemmas are done for functions that use Fin.t but thanks to Peano_dec.le_unique, all is true for the one that use lt

Lemma eq_nth_iff A n (v1 v2: t A n):
  (forall p1 p2, p1 = p2 -> v1 [@ p1 ] = v2 [@ p2 ]) <-> v1 = v2.

Lemma nth_order_last A: forall n (v: t A (S n)) (H: n < S n),
 nth_order v H = last v.

Lemma shiftin_nth A a n (v: t A n) k1 k2 (eq: k1 = k2):
  nth (shiftin a v) (Fin.L_R 1 k1) = nth v k2.

Lemma shiftin_last A a n (v: t A n): last (shiftin a v) = a.

Lemma shiftrepeat_nth A: forall n k (v: t A (S n)),
  nth (shiftrepeat v) (Fin.L_R 1 k) = nth v k.

Lemma shiftrepeat_last A: forall n (v: t A (S n)), last (shiftrepeat v) = last v.

Lemma const_nth A (a: A) n (p: Fin.t n): (const a n)[@ p] = a.

Lemma nth_map {A B} (f: A -> B) {n} v (p1 p2: Fin.t n) (eq: p1 = p2):
  (map f v) [@ p1] = f (v [@ p2]).

Lemma nth_map2 {A B C} (f: A -> B -> C) {n} v w (p1 p2 p3: Fin.t n):
  p1 = p2 -> p2 = p3 -> (map2 f v w) [@p1] = f (v[@p2]) (w[@p3]).

Lemma fold_left_right_assoc_eq {A B} {f: A -> B -> A}
  (assoc: forall a b c, f (f a b) c = f (f a c) b)
  {n} (v: t B n): forall a, fold_left f a v = fold_right (fun x y => f y x) v a.

Lemma to_list_of_list_opp {A} (l: list A): to_list (of_list l) = l.