induction ls; intuition; simpl in *.
intuition.
remember (split ls) as z.
destruct z.
simpl in *.
intuition.
subst.
econstructor.
intuition.
edestruct IHls.
eauto.
econstructor.
right.
eauto.
Qed.
(* There is nth_error in the Coq library, but it seems to return something in Type. *)
Fixpoint nth_option(A : Set)(ls : list A)(i : nat) :=
match ls with
| nil => None
| a :: ls' =>
match i with
| O => Some a
| S i' =>
nth_option ls' i'
end
end.

Theorem nth_option_app_Some :
forall (A : Set)(ls1 ls2 : list A) i a,
nth_option ls1 i = Some a ->
nth_option (ls1 ++ ls2) i = Some a.