Theorem: modify.arg_f.fwdDerivM_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✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : Vec K S
X : Type
inst✝² : Vec K X
Y : Type ?u.68298
inst✝¹ : Vec K Y
Z : Type ?u.68309
inst✝ : Vec K Z
f : X → S → S
ha0 : CDifferentiable K fun xs => f xs.1 xs.2
⊢ (fwdDerivM K fun x => modify (f x)) = fun x dx => do
    modify fun sds =>
        let sds := fwdDeriv K (fun xs => f xs.1 xs.2) (x, sds.1) (dx, sds.2);
        sds
    pure ((), ())
Tactic:
funext
State after:
case h.h.h
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : Vec K S
X : Type
inst✝² : Vec K X
Y : Type ?u.68298
inst✝¹ : Vec K Y
Z : Type ?u.68309
inst✝ : Vec K Z
f : X → S → S
ha0 : CDifferentiable K fun xs => f xs.1 xs.2
x✝² x✝¹ : X
x✝ : S × S
⊢ fwdDerivM K (fun x => modify (f x)) x✝² x✝¹ x✝ =
    ((modify fun sds =>
          let sds := fwdDeriv K (fun xs => f xs.1 xs.2) (x✝², sds.1) (x✝¹, sds.2);
          sds) >>=
        fun x => pure ((), ()))
      x✝

State before:
case h.h.h
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : Vec K S
X : Type
inst✝² : Vec K X
Y : Type ?u.68298
inst✝¹ : Vec K Y
Z : Type ?u.68309
inst✝ : Vec K Z
f : X → S → S
ha0 : CDifferentiable K fun xs => f xs.1 xs.2
x✝² x✝¹ : X
x✝ : S × S
⊢ fwdDerivM K (fun x => modify (f x)) x✝² x✝¹ x✝ =
    ((modify fun sds =>
          let sds := fwdDeriv K (fun xs => f xs.1 xs.2) (x✝², sds.1) (x✝¹, sds.2);
          sds) >>=
        fun x => pure ((), ()))
      x✝
Tactic:
simp[modify, modifyGet, MonadStateOf.modifyGet, StateT.modifyGet,fwdDerivM,bind,Bind.bind, StateT.bind]
State after:
case h.h.h
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : Vec K S
X : Type
inst✝² : Vec K X
Y : Type ?u.68298
inst✝¹ : Vec K Y
Z : Type ?u.68309
inst✝ : Vec K Z
f : X → S → S
ha0 : CDifferentiable K fun xs => f xs.1 xs.2
x✝² x✝¹ : X
x✝ : S × S
⊢ (do
      let r ← fwdDerivM K (fun xs => pure (PUnit.unit, f xs.1 xs.2)) (x✝², x✝.1) (x✝¹, x✝.2)
      pure ((r.1.1, r.2.1), r.1.2, r.2.2)) =
    pure ((), ()) (fwdDeriv K (fun xs => f xs.1 xs.2) (x✝², x✝.1) (x✝¹, x✝.2))

State before:
case h.h.h
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : Vec K S
X : Type
inst✝² : Vec K X
Y : Type ?u.68298
inst✝¹ : Vec K Y
Z : Type ?u.68309
inst✝ : Vec K Z
f : X → S → S
ha0 : CDifferentiable K fun xs => f xs.1 xs.2
x✝² x✝¹ : X
x✝ : S × S
⊢ (do
      let r ← fwdDerivM K (fun xs => pure (PUnit.unit, f xs.1 xs.2)) (x✝², x✝.1) (x✝¹, x✝.2)
      pure ((r.1.1, r.2.1), r.1.2, r.2.2)) =
    pure ((), ()) (fwdDeriv K (fun xs => f xs.1 xs.2) (x✝², x✝.1) (x✝¹, x✝.2))
Tactic:
fun_trans
State after:
case h.h.h
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : Vec K S
X : Type
inst✝² : Vec K X
Y : Type ?u.68298
inst✝¹ : Vec K Y
Z : Type ?u.68309
inst✝ : Vec K Z
f : X → S → S
ha0 : CDifferentiable K fun xs => f xs.1 xs.2
x✝² x✝¹ : X
x✝ : S × S
⊢ pure ((PUnit.unit, PUnit.unit), fwdDeriv K (fun x => f x.1 x.2) (x✝², x✝.1) (x✝¹, x✝.2)) =
    pure ((), ()) (fwdDeriv K (fun x => f x.1 x.2) (x✝², x✝.1) (x✝¹, x✝.2))

State before:
case h.h.h
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : Vec K S
X : Type
inst✝² : Vec K X
Y : Type ?u.68298
inst✝¹ : Vec K Y
Z : Type ?u.68309
inst✝ : Vec K Z
f : X → S → S
ha0 : CDifferentiable K fun xs => f xs.1 xs.2
x✝² x✝¹ : X
x✝ : S × S
⊢ pure ((PUnit.unit, PUnit.unit), fwdDeriv K (fun x => f x.1 x.2) (x✝², x✝.1) (x✝¹, x✝.2)) =
    pure ((), ()) (fwdDeriv K (fun x => f x.1 x.2) (x✝², x✝.1) (x✝¹, x✝.2))
Tactic:
congr
State after:
no goals