(*****   SUBLIST  ******)
Definition sublist {A} (lo hi: Z) (al: list A) : list A :=
firstn (Z.to_nat (hi-lo)) (skipn (Z.to_nat lo) al).
Definition upd_Znth {A} (i: Z) (al: list A) (x: A): list A :=
sublist 0 i al ++ x :: sublist (i+1) (Zlength al) al.

(* Lemma sublist_sublist: forall {A} lo hi lo' hi' (al: list A), 0 <= lo <= hi -> hi <= hi'-lo' -> 0 <= lo' <= hi' -> hi' <= Zlength al -> sublist lo hi (sublist lo' hi' al) = sublist (lo+lo') (hi+lo') al. *)
Lemma sublist_rejoin:
forall {A} lo mid hi (al: list A),
0 <= lo <= mid ->
mid <= hi <= Zlength al ->
sublist lo mid al ++ sublist mid hi al = sublist lo hi al.