(** * Theorems about State effects *)
(* begin hide *)
Program
Setoid
Morphisms
RelationClasses.
Basics.Basics
Basics.Category
Basics.CategoryKleisli
Basics.Monad
Core.ITreeDefinition
Core.KTree
Core.KTreeFacts
Eq.Eq
Eq.UpToTaus
Indexed.Sum
Interp.Interp
Interp.InterpFacts
Interp.RecursionFacts
Events.State.
Open Scope itree_scope.
(* end hide *)
Definition _interp_state {E F S R}
(f : E ~> stateT S (itree F)) (ot : itreeF E R _)
: stateT S (itree F) R := fun s =>
match ot with
| RetF r => Ret (s, r)
| TauF t => Tau (interp_state f t s)
| VisF e k => f _ e s >>= (fun sx => Tau (interp_state f (k (snd sx)) (fst sx)))
end.

Lemma unfold_interp_state {E F S R} (h : E ~> Monads.stateT S (itree F))
(t : itree E R) s :
eq_itree eq
(interp_state h t s)
(_interp_state h (observe t) s).