{-@ type ProofLeftIdentity Unit Bind F X = {v:Proof | runFun (runFun Bind (runFun Unit X)) F  == runFun F X } @-}

{-@ prop_left_identity :: forall <p :: a -> m a -> Prop,
                                  q :: m a -> Arrow (Arrow a (m b)) (m b) -> Prop>.
                          {unit::Arrow<p> a (m a),bind :: Arrow<q> (m a) (Arrow (Arrow a (m b)) (m b)), x :: a, f :: Arrow a (m b)  |- Proof  <: ProofLeftIdentity unit bind f x}
                        unit: Arrow<p> a (m a) -> bind: Arrow<q> (m a) (Arrow (Arrow a (m b)) (m b))
                      -> x:a -> f:Arrow a (m b)
                      -> ProofLeftIdentity unit bind f x
  @-}

prop_left_identity :: (Arrow a (m a)) -> (Arrow (m a) (Arrow (Arrow a (m b)) (m b)))
                    -> a -> (Arrow a (m b))
                    -> Proof
prop_left_identity iunit ibind x f = Proof
prop_left_identity :: (Arrow a (m a)) -> (Arrow (m a) (Arrow (Arrow a (m b)) (m b)))
                    -> a -> (Arrow a (m b))
                    -> Proof
prop_left_identity iunit ibind x f = Proof
prop_left_identity iunit ibind x f = Proof