End Map.
Notation map := map.
(*****************)
(** ** Flat Map  *)
(*****************)
Section FlatMap.
Variables (A : Type) (B : Type).
Variable f : A -> list B.
(** [flat_map] *)
Fixpoint flat_map (l:list A) : list B :=
match l with
| [] => []
| x :: l => f x ++ flat_map l
end.

(* Specifications: *)
Lemma flat_map_concat_map l :
flat_map l = concat (map f l).
Lemma flat_map_app l1 l2 :
flat_map (l1 ++ l2) = flat_map l1 ++ flat_map l2.
Lemma in_flat_map l y :
In y (flat_map l) <-> exists x, In x l /\ In y (f x).