Query Implementations with State Monads #
This file gives lemmas about QueryImpl spec m
when m
is something like StateT σ n
.
TODO: should generalize things to MonadState
once laws for it exist.
theorem
OracleComp.StateT_run_simulateQ_eq_map_run'_simulateQ
{ι : Type u_1}
{spec : OracleSpec ι}
{m : Type u → Type v}
[AlternativeMonad m]
[LawfulAlternative m]
{σ : Type u}
[Subsingleton σ]
(so : QueryImpl spec (StateT σ m))
{α : Type u}
(oa : OracleComp spec α)
(s s' : σ)
:
If the state type is Subsingleton
, then we can represent simulation in terms of simulate'
,
adding back any state at the end of the computation.
theorem
OracleComp.StateT_run'_simulateQ_eq_self
{ι : Type u_1}
{spec : OracleSpec ι}
{σ : Type u}
[Subsingleton σ]
{α : Type u}
(so : QueryImpl spec (StateT σ (OracleComp spec)))
(h : ∀ (α : Type u) (q : spec.OracleQuery α) (s : σ), (so.impl q).run' s = liftM q)
(oa : OracleComp spec α)
(s : σ)
: