(** Map a function over a list *)

Fixpoint map (A B : Set) (f : A -> B) (l : list A) {struct l} : 
 list B :=
  match l with
  | Nil => Nil B
  | Cons a r => Cons B (f a) (map A B f r)
  end.Notation Map := (map _ _) (only parsing).

(* Specifications: *)
Lemma map_length : forall (A B : Set) (f : A -> B) (l : list A), length A l = length B (map A B f l).