Documentation

Std.Internal.Do.Triple.Basic

Hoare triples #

Hoare triples form the basis for compositional functional correctness proofs about monadic programs.

As usual, Triple x pre post epost holds iff the precondition pre entails the weakest precondition wp x post epost of x : m α for the postcondition post and error postcondition epost. It is thus defined in terms of an instance WPMonad m Pred EPred.

structure Std.Internal.Do.Triple {Pred EPred : Type u} {Prog : Type v} {Value : Type u} [Assertion Pred] [Assertion EPred] (x : Prog) [WP Prog Value Pred EPred] (pre : Pred) (post : ValuePred) (epost : EPred) :

A Hoare triple for reasoning about programs. A Hoare triple Triple x pre post epost is a specification for x: if assertion pre holds before x, then postcondition post holds after running x (and epost handles any errors).

Instances For

    Hoare triple notation without exception postcondition (defaults to ). An optional (m := …) after the precondition ascribes the program to monad .

    Equations
    • One or more equations did not get rendered due to their size.
    Instances For

      Hoare triple notation with a binder for the return value.

      Equations
      • One or more equations did not get rendered due to their size.
      Instances For

        Hoare triple notation with an exception postcondition: ⦃ P ⦄ x ⦃ Q; E ⦄ := Triple x P Q E.

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For

          Hoare triple notation with a binder for the return value and an exception postcondition.

          Equations
          • One or more equations did not get rendered due to their size.
          Instances For

            Pretty-print Triple applications back as ⦃ … ⦄ notation.

            Equations
            • One or more equations did not get rendered due to their size.
            Instances For
              theorem Std.Internal.Do.Triple.iff {Pred EPred : Type u} {Prog : Type v} {Value : Type u} [Assertion Pred] [Assertion EPred] [WP Prog Value Pred EPred] {x : Prog} {pre : Pred} {post : ValuePred} {epost : EPred} :
              pre x post; epost Lean.Order.PartialOrder.rel pre (wp x post epost)
              theorem Std.Internal.Do.Triple.iff_conseq {Pred EPred : Type u} {Prog : Type v} {Value : Type u} [Assertion Pred] [Assertion EPred] [WP Prog Value Pred EPred] {x : Prog} {pre : Pred} {post : ValuePred} {epost : EPred} :
              pre x post; epost ∀ (pre' : Pred) (post' : ValuePred), Lean.Order.PartialOrder.rel pre' preLean.Order.PartialOrder.rel post post'Lean.Order.PartialOrder.rel pre' (wp x post' epost)
              theorem Std.Internal.Do.Triple.entails_wp_of_pre_post {Pred EPred : Type u} {Prog : Type v} {Value : Type u} [Assertion Pred] [Assertion EPred] [WP Prog Value Pred EPred] {x : Prog} {pre pre' : Pred} {post post' : ValuePred} {epost : EPred} (h : pre' x post'; epost ) (hpre : Lean.Order.PartialOrder.rel pre pre') (hpost : Lean.Order.PartialOrder.rel post' post) :
              Lean.Order.PartialOrder.rel pre (wp x post epost)
              theorem Std.Internal.Do.Triple.entails_wp_of_pre {Pred EPred : Type u} {Prog : Type v} {Value : Type u} [Assertion Pred] [Assertion EPred] [WP Prog Value Pred EPred] {x : Prog} {pre pre' : Pred} {post : ValuePred} {epost : EPred} (h : pre' x post; epost ) (hpre : Lean.Order.PartialOrder.rel pre pre') :
              Lean.Order.PartialOrder.rel pre (wp x post epost)
              theorem Std.Internal.Do.Triple.entails_wp_of_post {Pred EPred : Type u} {Prog : Type v} {Value : Type u} [Assertion Pred] [Assertion EPred] [WP Prog Value Pred EPred] {x : Prog} {pre : Pred} {post post' : ValuePred} {epost : EPred} (h : pre x post'; epost ) (hpost : Lean.Order.PartialOrder.rel post' post) :
              Lean.Order.PartialOrder.rel pre (wp x post epost)
              theorem Std.Internal.Do.Triple.pure {m : Type u → Type v} {Pred EPred : Type u} [Assertion Pred] [Assertion EPred] [Monad m] [WPMonad m Pred EPred] {α : Type u} {pre : Pred} {post : αPred} {epost : EPred} (a : α) (h : Lean.Order.PartialOrder.rel pre (post a)) :
              pre Pure.pure a post; epost
              theorem Std.Internal.Do.Triple.bind {m : Type u → Type v} {Pred EPred : Type u} [Assertion Pred] [Assertion EPred] [Monad m] [WPMonad m Pred EPred] {α β : Type u} {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.Internal.Do.Triple.map {m : Type u → Type v} {Pred EPred : Type u} [Assertion Pred] [Assertion EPred] [Monad m] [WPMonad m Pred EPred] {α β : Type u} {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.Internal.Do.Triple.seq {m : Type u → Type v} {Pred EPred : Type u} [Assertion Pred] [Assertion EPred] [Monad m] [WPMonad m Pred EPred] {α β : Type u} {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