Ltac ssromega :=
  repeat arith_hypo_ssrnat2coqnat;
  arith_goal_ssrnat2coqnat; simpl;
  omega.Class monad (mon : Type -> Type) :=
  {
    ret : forall {A : Type},  A -> mon A;
    bind : forall {A B : Type}, mon A -> (A -> mon B) -> mon B
  }.Class monad (mon : Type -> Type) :=
  {
    ret : forall {A : Type},  A -> mon A;
    bind : forall {A B : Type}, mon A -> (A -> mon B) -> mon B
  }.Class monad (mon : Type -> Type) :=
  {
    ret : forall {A : Type},  A -> mon A;
    bind : forall {A B : Type}, mon A -> (A -> mon B) -> mon B
  }.Notation "'do!' X <- A ; B" := (bind A (fun X => B)) (at level 40).

Lemma prod_fun : forall {A B C : Type} (f g: A -> (B * C)), f = g -> (fun x : A => fst (f x)) = (fun x : A => fst (g x)) /\ (fun x : A => snd (f x)) = (fun x : A => snd (g x)).