Theorem: getThe.arg.fwdDerivValM_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 ?u.39987
inst✝² : Vec K X
Y : Type ?u.39998
inst✝¹ : Vec K Y
Z : Type ?u.40009
inst✝ : Vec K Z
⊢ fwdDerivValM K (getThe S) = getThe (S × S)
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✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : Vec K S
X : Type ?u.39987
inst✝² : Vec K X
Y : Type ?u.39998
inst✝¹ : Vec K Y
Z : Type ?u.40009
inst✝ : Vec K Z
x✝ : S × S
⊢ fwdDerivValM K (getThe S) x✝ = getThe (S × 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✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : Vec K S
X : Type ?u.39987
inst✝² : Vec K X
Y : Type ?u.39998
inst✝¹ : Vec K Y
Z : Type ?u.40009
inst✝ : Vec K Z
x✝ : S × S
⊢ fwdDerivValM K (getThe S) x✝ = getThe (S × S) x✝
Tactic:
simp[getThe, MonadStateOf.get, StateT.get,fwdDerivValM, fwdDerivM, pure, StateT.pure]
State after:
case 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 ?u.39987
inst✝² : Vec K X
Y : Type ?u.39998
inst✝¹ : Vec K Y
Z : Type ?u.40009
inst✝ : Vec K Z
x✝ : S × S
⊢ (do
      let r ← fwdDerivM K (fun xs => pure (xs.2, xs.2)) ((), x✝.1) ((), x✝.2)
      pure ((r.1.1, r.2.1), r.1.2, r.2.2)) =
    pure (x✝, x✝)

State before:
case 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 ?u.39987
inst✝² : Vec K X
Y : Type ?u.39998
inst✝¹ : Vec K Y
Z : Type ?u.40009
inst✝ : Vec K Z
x✝ : S × S
⊢ (do
      let r ← fwdDerivM K (fun xs => pure (xs.2, xs.2)) ((), x✝.1) ((), x✝.2)
      pure ((r.1.1, r.2.1), r.1.2, r.2.2)) =
    pure (x✝, x✝)
Tactic:
fun_trans
State after:
no goals