Theorem: MonadState.get.arg.revDerivValM_rule (SciLean/Core/Monads/StateT.lean)

State before:
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : RevDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : SemiInnerProductSpace K S
X : Type ?u.221038
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.221049
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.221060
inst✝ : SemiInnerProductSpace K Z
⊢ revDerivValM K get = do
    let __do_lift ← get
    pure (__do_lift, fun ds => modify fun ds' => ds + ds')
Tactic:
funext
State after:
case h
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : RevDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : SemiInnerProductSpace K S
X : Type ?u.221038
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.221049
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.221060
inst✝ : SemiInnerProductSpace K Z
x✝ : S
⊢ revDerivValM K get x✝ = (get >>= fun __do_lift => pure (__do_lift, fun ds => modify fun ds' => ds + ds')) x✝

State before:
case h
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : RevDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : SemiInnerProductSpace K S
X : Type ?u.221038
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.221049
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.221060
inst✝ : SemiInnerProductSpace K Z
x✝ : S
⊢ revDerivValM K get x✝ = (get >>= fun __do_lift => pure (__do_lift, fun ds => modify fun ds' => ds + ds')) x✝
Tactic:
simp[MonadState.get, getThe, MonadStateOf.get, StateT.get,revDerivValM, revDerivM, pure, StateT.pure, bind, StateT.bind, set, StateT.set, modifyThe, modify, MonadStateOf.modifyGet, StateT.modifyGet, modifyGet]
State after:
case h
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : RevDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : SemiInnerProductSpace K S
X : Type ?u.221038
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.221049
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.221060
inst✝ : SemiInnerProductSpace K Z
x✝ : S
⊢ (do
      let ysdf ← revDerivM K (fun xs => pure (xs.2, xs.2)) ((), x✝)
      pure ((ysdf.1.1, fun dx ds => ysdf.2 (dx, ds)), ysdf.1.2)) =
    pure ((x✝, fun ds => StateT.modifyGet fun s => (PUnit.unit, ds + s)), x✝)

State before:
case h
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : RevDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : SemiInnerProductSpace K S
X : Type ?u.221038
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.221049
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.221060
inst✝ : SemiInnerProductSpace K Z
x✝ : S
⊢ (do
      let ysdf ← revDerivM K (fun xs => pure (xs.2, xs.2)) ((), x✝)
      pure ((ysdf.1.1, fun dx ds => ysdf.2 (dx, ds)), ysdf.1.2)) =
    pure ((x✝, fun ds => StateT.modifyGet fun s => (PUnit.unit, ds + s)), x✝)
Tactic:
fun_trans
State after:
case h
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : RevDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : SemiInnerProductSpace K S
X : Type ?u.221038
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.221049
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.221060
inst✝ : SemiInnerProductSpace K Z
x✝ : S
⊢ pure ((x✝, fun dx ds => pure (PUnit.unit, dx + ds)), x✝) =
    pure ((x✝, fun ds => StateT.modifyGet fun s => (PUnit.unit, ds + s)), x✝)

State before:
case h
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : RevDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : SemiInnerProductSpace K S
X : Type ?u.221038
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.221049
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.221060
inst✝ : SemiInnerProductSpace K Z
x✝ : S
⊢ pure ((x✝, fun dx ds => pure (PUnit.unit, dx + ds)), x✝) =
    pure ((x✝, fun ds => StateT.modifyGet fun s => (PUnit.unit, ds + s)), x✝)
Tactic:
rfl
State after:
no goals