Notation "[ 'eta' f ]" := (fun x => f x) : function_scope.Notation "'fun' => E" := (fun _ => E) : function_scope.Notation id := (fun x => x).Notation "@ 'id' T" := (fun x : T => x) (only parsing) : function_scope.Definition idfun T x : T := x.Definition phant_id T1 T2 v1 v2 := phantom T1 v1 -> phantom T2 v2.

(* Specifications: *)
Lemma obindEapp (fo : aT -> option rT) : obind fo = oapp fo None.
Lemma omapEbind : omap f = obind (olift f).
Lemma omapEapp : omap f = oapp (olift f) None.
Lemma oappEmap (y0 : rT) x : oapp f y0 x = odflt y0 (omap f x).
Lemma omap_comp : omap (g \o f) =1 omap g \o omap f.
Lemma oapp_comp x : oapp (g \o f) x =1 (@oapp _ _)^~ x g \o omap f.
Lemma oapp_comp_f (x : rT) : oapp (g \o f) (g x) =1 g \o oapp f x.
Lemma olift_comp : olift (g \o f) = olift g \o f.