induction l1; intros.
destruct l2; simpl in L. trivial. omega.
destruct l2; simpl in L. omega.
rewrite (IHl1 l2) with (d:=d).
specialize (N O). simpl in N. rewrite N; trivial. omega.
omega.
intros. apply (N (S i)). simpl; omega.
Qed.

(* Specifications: *)
Lemma Znth_extensional {A} {d: Inhabitant A}(l1 l2 : list A):
Zlength l1 = Zlength l2 ->
(forall i,
(0 <= i < Zlength l1) -> Znth i l1 = Znth i l2) -> l1 = l2.
Lemma force_lengthn_app1 {A}{d: Inhabitant A}: forall n l1 l2, length l1 =n -> force_lengthn n (l1 ++ l2) d = l1.
(*Lemma map_Znth {A B : Type}{d: Inhabitant A} (f : A -> B) l n: Znth n (map f l) = f (Znth n l). *)
Lemma listD16 {A} (l:list A): Zlength l = 16 ->
exists v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15,
l = [v0; v1; v2; v3; v4; v5; v6; v7; v8; v9; v10; v11; v12; v13; v14; v15].
Lemma listGE16 {A} (l:list A): 16 <= Zlength l ->
exists v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 t,
l = [v0; v1; v2; v3; v4; v5; v6; v7; v8; v9; v10; v11; v12; v13; v14; v15] ++ t
/\ Zlength t = Zlength l - 16.