Documentation

VCVio.EvalDist.Basic

Denotational Semantics for Output Distributions #

This file defines a typeclass for monads that can be canonically embedded in the SPMF monad. We require this embedding respect the basic monad laws.

We also define a number of specific cases:

For the last case, we assume mx has an OptionT transformer to represent the failure. In future it may be nice to generalize to any AlternativeMonad using an additional typeclass (note that it can't extend the existing one as it outputs in an SPMF).

@[reducible]
def SPMF :
Type u → Type u

Subprobability distribution.

Equations
    Instances For
      theorem SPMF.tsum_run_some_eq_one_sub {α : Type u} (p : SPMF α) :
      ∑' (x : α), (OptionT.run p) (some x) = 1 - (OptionT.run p) none
      @[simp]
      theorem SPMF.tsum_run_some_ne_top {α : Type u} (p : SPMF α) :
      ∑' (x : α), (OptionT.run p) (some x)
      theorem SPMF.run_none_eq_one_sub {α : Type u} (p : SPMF α) :
      (OptionT.run p) none = 1 - ∑' (x : α), (OptionT.run p) (some x)
      @[simp]
      theorem SPMF.run_none_ne_top {α : Type u} (p : SPMF α) :
      theorem SPMF.ext {α : Type u} {p q : SPMF α} (h : ∀ (x : α), (OptionT.run p) (some x) = (OptionT.run q) (some x)) :
      p = q
      theorem SPMF.ext_iff {α : Type u} {p q : SPMF α} :
      p = q ∀ (x : α), (OptionT.run p) (some x) = (OptionT.run q) (some x)
      instance SPMF.instFunLikeENNReal {α : Type u} :
      Equations
        @[simp]
        theorem SPMF.apply_eq_run_some {α : Type u} (p : SPMF α) (x : α) :
        p x = (OptionT.run p) (some x)
        theorem SPMF.apply'_none_eq_run {α : Type u} (p : SPMF α) :
        have p' := p; p' none = (OptionT.run p) none
        class HasEvalDist (m : Type u → Type v) [Monad m] :
        Type (max (u + 1) v)

        The monad m has a well-behaved embedding into the SPMF monad. TODO: modify this to extend MonadHom to get some lemmas for free.

        Instances
          def probOutput {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] (mx : m α) (x : α) :

          Probability that a computation mx returns the value x.

          Equations
            Instances For
              noncomputable def probEvent {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] (mx : m α) (p : αProp) :

              Probability that a computation mx outputs a value satisfying p.

              Equations
                Instances For
                  def probFailure {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] (mx : m α) :

                  Probability that a compuutation mx will fail to return a value.

                  Equations
                    Instances For

                      Probability that a computation returns a particular output.

                      Equations
                        Instances For

                          Probability that a computation returns a value satisfying a predicate.

                          Equations
                            Instances For

                              Probability that a computation fails to return a value.

                              Equations
                                Instances For

                                  Probability that a computation returns a value satisfying a predicate.

                                  Equations
                                    Instances For

                                      Probability that a computation returns a value satisfying a predicate.

                                      Equations
                                        Instances For
                                          theorem probOutput_def {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] (mx : m α) (x : α) :
                                          theorem probEvent_def {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] (mx : m α) (p : αProp) :
                                          theorem probFailure_def {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] (mx : m α) :
                                          @[simp]
                                          theorem evalDist_comp_pure {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] :
                                          @[simp]
                                          theorem evalDist_comp_pure' {α β : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] (f : αβ) :
                                          @[simp]
                                          theorem probOutput_pure {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] [DecidableEq α] (x y : α) :
                                          Pr[=x|pure y] = if x = y then 1 else 0
                                          @[simp]
                                          theorem evalDist_map {α β : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] [LawfulMonad m] (mx : m α) (f : αβ) :
                                          evalDist (f <$> mx) = f <$> evalDist mx
                                          @[simp]
                                          theorem evalDist_comp_map {α β : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] [LawfulMonad m] (mx : m α) :
                                          (evalDist fun (f : αβ) => f <$> mx) = fun (f : αβ) => f <$> evalDist mx
                                          @[simp]
                                          theorem evalDist_seq {α β : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] [LawfulMonad m] (mf : m (αβ)) (mx : m α) :
                                          evalDist (mf <*> mx) = evalDist mf <*> evalDist mx
                                          @[simp]
                                          theorem evalDist_ite {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] (p : Prop) [Decidable p] (mx mx' : m α) :
                                          theorem probEvent_eq_tsum_indicator {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] (mx : m α) (p : αProp) :
                                          Pr[p|mx] = ∑' (x : α), {x : α | p x}.indicator (fun (x : α) => Pr[=x|mx]) x
                                          theorem probEvent_eq_tsum_ite {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] (mx : m α) (p : αProp) [DecidablePred p] :
                                          Pr[p|mx] = ∑' (x : α), if p x then Pr[=x|mx] else 0
                                          @[simp]
                                          theorem probFailure_add_tsum_probOutput {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] (oa : m α) :
                                          Pr[⊥|oa] + ∑' (x : α), Pr[=x|oa] = 1
                                          @[simp]
                                          theorem tsum_probOutput_add_probFailure {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] (oa : m α) :
                                          ∑' (x : α), Pr[=x|oa] + Pr[⊥|oa] = 1
                                          @[simp]
                                          theorem probOutput_le_one {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} {x : α} :
                                          Pr[=x|mx] 1
                                          @[simp]
                                          theorem probOutput_ne_top {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} {x : α} :
                                          @[simp]
                                          theorem probOutput_lt_top {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} {x : α} :
                                          @[simp]
                                          theorem not_one_lt_probOutput {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} {x : α} :
                                          ¬1 < Pr[=x|mx]
                                          @[simp]
                                          theorem tsum_probOutput_le_one {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} :
                                          ∑' (x : α), Pr[=x|mx] 1
                                          @[simp]
                                          theorem tsum_probOutput_ne_top {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} :
                                          ∑' (x : α), Pr[=x|mx]
                                          @[simp]
                                          theorem probEvent_le_one {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} {p : αProp} :
                                          Pr[p|mx] 1
                                          @[simp]
                                          theorem probEvent_ne_top {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} {p : αProp} :
                                          @[simp]
                                          theorem probEvent_lt_top {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} {p : αProp} :
                                          @[simp]
                                          theorem not_one_lt_probEvent {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} {p : αProp} :
                                          ¬1 < Pr[p|mx]
                                          @[simp]
                                          theorem probFailure_le_one {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} :
                                          @[simp]
                                          theorem probFailure_ne_top {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} :
                                          @[simp]
                                          theorem probFailure_lt_top {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} :
                                          @[simp]
                                          theorem not_one_lt_probFailure {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} :
                                          @[simp]
                                          theorem one_le_probOutput_iff {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} {x : α} :
                                          1 Pr[=x|mx] Pr[=x|mx] = 1
                                          @[simp]
                                          theorem one_le_probEvent_iff {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} {p : αProp} :
                                          1 Pr[p|mx] Pr[p|mx] = 1
                                          @[simp]
                                          theorem one_le_probFailure_iff {α : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] {mx : m α} :
                                          theorem probOutput_bind_eq_tsum {α β : Type u} {m : Type u → Type v} [Monad m] [HasEvalDist m] (mx : m α) (my : αm β) (y : β) :
                                          Pr[=y|mx >>= my] = ∑' (x : α), Pr[=x|mx] * Pr[=y|my x]
                                          theorem probOutput_true_eq_probEvent {α : Type} {m : TypeType u} [Monad m] [HasEvalDist m] (mx : m α) (p : αProp) :
                                          Pr[=True|do let xmx pure (p x)] = Pr[p|mx]

                                          Add instance for SPMF just to give access to notation.

                                          Equations
                                            @[simp]
                                            theorem SPMF.evalDist_eq {α : Type u} (p : SPMF α) :
                                            @[simp]
                                            theorem SPMF.probOutput_eq {α : Type u} (p : SPMF α) :
                                            probOutput p = p
                                            @[simp]
                                            theorem SPMF.probFailure_eq {α : Type u} (p : SPMF α) :
                                            noncomputable instance PMF.hasEvalDist :
                                            Equations
                                              @[simp]
                                              theorem PMF.evalDist_eq {α : Type u} (p : PMF α) :
                                              @[simp]
                                              theorem PMF.probOutput_eq {α : Type u} (p : PMF α) :
                                              probOutput p = p
                                              @[simp]
                                              theorem PMF.probEvent_eq {α : Type u} (p : PMF α) :
                                              @[simp]
                                              theorem PMF.probFailure_eq {α : Type u} (p : PMF α) :