(** ** Properties of [replace] *)

(* Specifications: *)
Lemma nth_replace_eq A: forall n p (v : t A n) a,
nth (replace v p a) p = a.
Lemma nth_replace_neq A: forall n p q, p <> q -> forall (v : t A n) a,
nth (replace v q a) p = nth v p.
Lemma nth_order_replace_eq A: forall n k (v : t A n) a (H1 : k < n) (H2 : k < n),
nth_order (replace v (Fin.of_nat_lt H2) a) H1 = a.
Lemma nth_order_replace_neq A: forall n k1 k2, k1 <> k2 ->
forall (v : t A n) a (H1 : k1 < n) (H2 : k2 < n),
nth_order (replace v (Fin.of_nat_lt H2) a) H1 = nth_order v H1.
Lemma replace_id A: forall n p (v : t A n),
replace v p (nth v p) = v.
Lemma replace_replace_eq A: forall n p (v : t A n) a b,
replace (replace v p a) p b = replace v p b.
Lemma replace_replace_neq A: forall n p1 p2 (v : t A n) a b, p1 <> p2 ->
replace (replace v p1 a) p2 b = replace (replace v p2 b) p1 a.
Lemma replace_append_L A: forall n m (v : t A n) (w : t A m) p a,
replace (v ++ w) (Fin.L m p) a = (replace v p a) ++ w.
Lemma replace_append_R A: forall n m (v : t A n) (w : t A m) p a,
replace (v ++ w) (Fin.R n p) a = v ++ (replace w p a).