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.