Monad morphisms and weakest precondition interpretations #
A WP m ps is a WPMonad m ps if the interpretation WP.wp is also a monad morphism, that is,
it preserves pure and bind.
class Std.Do.WPMonad (m : Type u → Type v) (ps : outParam PostShape) [Monad m] extends LawfulMonad m, Std.Do.WP m ps :
Type (max (u + 1) v)
A monad with weakest preconditions (WP) that is also a monad morphism, preserving pure and
bind.
In practice, mvcgen is not useful for reasoning about programs in a monad that is without a
WPMonad instance. The specification lemmas for Pure.pure and Bind.bind, as well as those for
operators like Functor.map, require that their monad have a WPMonad instance.
- seq_assoc {α β γ : Type u} (x : m α) (g : m (α → β)) (h : m (β → γ)) : h <*> (g <*> x) = Function.comp <$> h <*> g <*> x
WP.wppreservespure.WP.wppreservesbind.
Instances
@[instance_reducible]
Equations
- Std.Do.Id.instWPMonad = { toLawfulMonad := Id.instLawfulMonad, toWP := Std.Do.Id.instWP, wp_pure := ⋯, wp_bind := ⋯ }
@[instance_reducible]
instance Std.Do.StateT.instWPMonad {m : Type u → Type v} {ps : PostShape} {σ : Type u} [Monad m] [WPMonad m ps] :
WPMonad (StateT σ m) (PostShape.arg σ ps)
Equations
- Std.Do.StateT.instWPMonad = { toLawfulMonad := ⋯, toWP := Std.Do.StateT.instWP, wp_pure := ⋯, wp_bind := ⋯ }
@[instance_reducible]
instance Std.Do.ReaderT.instWPMonad {m : Type u → Type v} {ps : PostShape} {ρ : Type u} [Monad m] [WPMonad m ps] :
WPMonad (ReaderT ρ m) (PostShape.arg ρ ps)
Equations
- Std.Do.ReaderT.instWPMonad = { toLawfulMonad := ⋯, toWP := Std.Do.ReaderT.instWP, wp_pure := ⋯, wp_bind := ⋯ }
@[instance_reducible]
instance Std.Do.ExceptT.instWPMonad {m : Type u → Type v} {ps : PostShape} {ε : Type u} [Monad m] [WPMonad m ps] :
WPMonad (ExceptT ε m) (PostShape.except ε ps)
Equations
- Std.Do.ExceptT.instWPMonad = { toLawfulMonad := ⋯, toWP := Std.Do.ExceptT.instWP, wp_pure := ⋯, wp_bind := ⋯ }
@[instance_reducible]
instance Std.Do.OptionT.instWPMonad {m : Type u → Type v} {ps : PostShape} [Monad m] [WPMonad m ps] :
WPMonad (OptionT m) (PostShape.except PUnit ps)
Equations
- Std.Do.OptionT.instWPMonad = { toLawfulMonad := ⋯, toWP := Std.Do.OptionT.instWP, wp_pure := ⋯, wp_bind := ⋯ }
@[instance_reducible]
instance Std.Do.EStateM.instWPMonad {ε σ : Type u_1} :
WPMonad (EStateM ε σ) (PostShape.except ε (PostShape.arg σ PostShape.pure))
Equations
- Std.Do.EStateM.instWPMonad = { toLawfulMonad := ⋯, toWP := Std.Do.EStateM.instWP, wp_pure := ⋯, wp_bind := ⋯ }
@[instance_reducible]
instance Std.Do.Except.instWPMonad {ε : Type u_1} :
WPMonad (Except ε) (PostShape.except ε PostShape.pure)
Equations
- Std.Do.Except.instWPMonad = { toLawfulMonad := ⋯, toWP := Std.Do.Except.instWP, wp_pure := ⋯, wp_bind := ⋯ }
@[instance_reducible]
Equations
- Std.Do.Option.instWPMonad = { toLawfulMonad := instLawfulMonadOption, toWP := Std.Do.Option.instWP, wp_pure := @Std.Do.Option.instWPMonad._proof_2, wp_bind := ⋯ }
@[instance_reducible]
instance Std.Do.State.instWPMonad {σ : Type u_1} :
WPMonad (StateM σ) (PostShape.arg σ PostShape.pure)
Equations
- Std.Do.State.instWPMonad = { toLawfulMonad := ⋯, toWP := Std.Do.State.instWP, wp_pure := ⋯, wp_bind := ⋯ }
@[instance_reducible]
instance Std.Do.Reader.instWPMonad {ρ : Type u_1} :
WPMonad (ReaderM ρ) (PostShape.arg ρ PostShape.pure)
Equations
- Std.Do.Reader.instWPMonad = { toLawfulMonad := ⋯, toWP := Std.Do.Reader.instWP, wp_pure := ⋯, wp_bind := ⋯ }