Theorem: SciLean.CDifferentiableM.comp_rule (SciLean/Core/Monads/FwdDerivMonad.lean)

State before:
ι : Sort ?u.5269
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'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : Y → m Z
g : X → Y
hf : CDifferentiableM K f
hg : CDifferentiable K g
⊢ CDifferentiableM K fun x => f (g x)
Tactic:
rw[show ((fun x => f (g x))
         =
         fun x => pure (g x) >>= f) by simp]
State after:
ι : Sort ?u.5269
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'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : Y → m Z
g : X → Y
hf : CDifferentiableM K f
hg : CDifferentiable K g
⊢ CDifferentiableM K fun x => pure (g x) >>= f

State before:
ι : Sort ?u.5269
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'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : Y → m Z
g : X → Y
hf : CDifferentiableM K f
hg : CDifferentiable K g
⊢ CDifferentiableM K fun x => pure (g x) >>= f
Tactic:
apply CDifferentiableM_bind _ _ hf
State after:
ι : Sort ?u.5269
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'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : Y → m Z
g : X → Y
hf : CDifferentiableM K f
hg : CDifferentiable K g
⊢ CDifferentiableM K fun x => pure (g x)

State before:
ι : Sort ?u.5269
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'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : Y → m Z
g : X → Y
hf : CDifferentiableM K f
hg : CDifferentiable K g
⊢ CDifferentiableM K fun x => pure (g x)
Tactic:
apply CDifferentiableM_pure g hg
State after:
no goals

State before:
ι : Sort ?u.5269
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'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : Y → m Z
g : X → Y
hf : CDifferentiableM K f
hg : CDifferentiable K g
⊢ (fun x => f (g x)) = fun x => pure (g x) >>= f
Tactic:
simp
State after:
no goals