Proof using.
intros l g; elim l; simpl in |- *; auto.
intros a H; case H.
intros a l0 H a0 H0; case in_app_or with (1 := H0); simpl in |- *; auto.
intros H1; exists a; auto.
intros H1; case H with (1 := H1).
intros b (H2, H3); exists b; simpl in |- *; auto.
Qed.
End List.
(* Definition of a map2 *)
Section map2.
Variables (A : Type) (B : Type) (C : Type).
Variable f : A -> B -> C.
Fixpoint map2 (l1 : list A) : list B -> list C :=
fun l2 =>
match l1 with
| nil => nil
| a :: l3 =>
match l2 with
| nil => nil
| b :: l4 => f a b :: map2 l3 l4
end
end.

(* Specifications: *)
Theorem map2_app :
forall l1 l2 l3 l4,
length l1 = length l2 ->
map2 (l1 ++ l3) (l2 ++ l4) = map2 l1 l2 ++ map2 l3 l4.