Definition option_bind {A B: Type} (f : A -> option B) (x : option A) :=
  match x with | None => None | Some y => f y end.Fixpoint option_list_map {A : Type} (l : list (option A)) : option (list A) :=
match l with 
| nil => Some nil
| Some h :: t => option_map (cons h) (option_list_map t)
| _ => None
end.

(* Specifications: *)
Lemma option_list_map_Some {A : Type} (l : list (option A)) v: option_list_map l = Some v -> forall x, In x l -> exists vx, x = Some vx.
Lemma option_list_map_map {A : Type} (l : list (option A)) f : (forall x, In x l -> x = Some (f x)) -> option_list_map l = Some (map f l).