induction ls1; intuition; simpl in *.
rewrite <- app_assoc.
f_equal.
eauto.
Qed.
(* list_pred lifts a predicate on A and B to a predicate on list A and list B.  It is useful for reasoning about fold, map, etc. *)
Inductive list_pred(A B : Set)(pred : A -> B -> Prop) : list A -> list B -> Prop :=
| list_pred_nil :
list_pred pred nil nil
| list_pred_cons :
forall a1 a2 ls1 ls2,
pred a1 a2 ->
list_pred pred ls1 ls2 ->
list_pred pred (a1 :: ls1) (a2 :: ls2).

(* Specifications: *)
Lemma list_pred_eq_impl_eq :
forall (A : Set)(ls1 ls2 : list A),
list_pred eq ls1 ls2 ->
ls1 = ls2.