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.
Definition complete_option {A : Type} x0 (x : option A) : A :=
match x with
| None => x0
| Some x => x
end.
Definition option_le x y : Prop :=
exists vx vy, x = Some vx /\ y = Some vy /\ le vx vy.
Notation "x ≤p y" := (option_le x y) (at level 60).
Definition option_choice {A B: Type} (f g: A -> option B) x :=
match f x with
| Some v => Some v
| None => g x
end.
Notation " f ;; g " := (option_choice f g) (at level 60).

Lemma option_choice_assoc {A B: Type} (f g h : A -> option B) x:
(f;;(g;;h)) x = (f;;g;;h) x.