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.

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