theorem
LawfulMonadAttach.canReturn_bind_imp'
{m : Type u_1 → Type u_2}
{α β : Type u_1}
{b : β}
[Monad m]
[LawfulMonad m]
[MonadAttach m]
[LawfulMonadAttach m]
{x : m α}
{f : α → m β}
:
MonadAttach.CanReturn (x >>= f) b → ∃ (a : α), MonadAttach.CanReturn x a ∧ MonadAttach.CanReturn (f a) b
theorem
LawfulMonadAttach.eq_of_canReturn_pure
{m : Type u_1 → Type u_2}
{α : Type u_1}
[Monad m]
[MonadAttach m]
[LawfulMonad m]
[LawfulMonadAttach m]
{a b : α}
(h : MonadAttach.CanReturn (pure a) b)
:
theorem
LawfulMonadAttach.canReturn_map_imp'
{m : Type u_1 → Type u_2}
{α β : Type u_1}
{b : β}
[Monad m]
[LawfulMonad m]
[MonadAttach m]
[LawfulMonadAttach m]
{x : m α}
{f : α → β}
:
MonadAttach.CanReturn (f <$> x) b → ∃ (a : α), MonadAttach.CanReturn x a ∧ f a = b
theorem
LawfulMonadAttach.canReturn_liftM_imp'
{m : Type u_1 → Type u_2}
{n : Type u_1 → Type u_3}
{α : Type u_1}
[Monad m]
[MonadAttach m]
[LawfulMonad m]
[LawfulMonadAttach m]
[Monad n]
[MonadAttach n]
[LawfulMonad n]
[LawfulMonadAttach n]
[MonadLiftT m n]
[LawfulMonadLiftT m n]
{x : m α}
{a : α}
:
MonadAttach.CanReturn (liftM x) a → MonadAttach.CanReturn x a
theorem
WeaklyLawfulMonadAttach.attach_bind_val
{m : Type u_1 → Type u_2}
{α β : Type u_1}
[Monad m]
[MonadAttach m]
[LawfulMonad m]
[WeaklyLawfulMonadAttach m]
{x : m α}
{f : α → m β}
:
theorem
WeaklyLawfulMonadAttach.bind_attach_of_nonempty
{m : Type u_1 → Type u_2}
{β α : Type u_1}
[Monad m]
[MonadAttach m]
[LawfulMonad m]
[WeaklyLawfulMonadAttach m]
[Nonempty (m β)]
{x : m α}
{f : Subtype (MonadAttach.CanReturn x) → m β}
:
MonadAttach.attach x >>= f = do
let a ← x
if ha : MonadAttach.CanReturn x a then f ⟨a, ha⟩ else Classical.ofNonempty
theorem
WeaklyLawfulMonadAttach.pbind_eq_bind
{m : Type u_1 → Type u_2}
{α β : Type u_1}
[Monad m]
[MonadAttach m]
[LawfulMonad m]
[WeaklyLawfulMonadAttach m]
{x : m α}
{f : α → m β}
:
theorem
WeaklyLawfulMonadAttach.pbind_eq_bind'
{m : Type u_1 → Type u_2}
{α β : Type u_1}
[Monad m]
[MonadAttach m]
[LawfulMonad m]
[WeaklyLawfulMonadAttach m]
{x : m α}
{f : α → m β}
: