Documentation

Std.WP.Triple.Monad

Hoare triples for the monadic combinators #

The rules that build a Triple for pure, >>=, <$> and <*> from triples for the parts.

theorem Std.WP.Triple.pure {Pred : Type w} {EPred : Type w'} {m : Type v → Type u} [Monad m] [Assertion Pred] [Assertion EPred] [WPMonad m Pred EPred] {α : Type v} {pre : Pred} {post : αPred} {epost : EPred} (a : α) (h : Lean.Order.PartialOrder.rel pre (post a)) :
pre Pure.pure a post; epost
theorem Std.WP.Triple.bind {Pred : Type w} {EPred : Type w'} {m : Type v → Type u} [Monad m] [Assertion Pred] [Assertion EPred] [WPMonad m Pred EPred] {α β : Type v} {pre : Pred} {epost : EPred} {post : βPred} (x : m α) (f : αm β) (mid : αPred) (hx : pre x mid; epost ) (hf : ∀ (a : α), mid a f a post; epost ) :
pre x >>= f post; epost
theorem Std.WP.Triple.map {Pred : Type w} {EPred : Type w'} {m : Type v → Type u} [Monad m] [Assertion Pred] [Assertion EPred] [WPMonad m Pred EPred] {α β : Type v} {pre : Pred} {post : βPred} {epost : EPred} [LawfulMonad m] (f : αβ) (x : m α) (h : pre x fun (a : α) => post (f a); epost ) :
pre f <$> x post; epost
theorem Std.WP.Triple.seq {Pred : Type w} {EPred : Type w'} {m : Type v → Type u} [Monad m] [Assertion Pred] [Assertion EPred] [WPMonad m Pred EPred] {α β : Type v} {pre : Pred} {post : βPred} {epost : EPred} [LawfulMonad m] (x : m (αβ)) (y : m α) (h : pre x fun (f : αβ) => wp y (fun (a : α) => post (f a)) epost; epost ) :
pre x <*> y post; epost