Theorem: MProd.mk.arg_fstsnd.fwdDeriv_rule (SciLean/Core/Monads/MProd.lean)

State before:
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : Vec K X
Y : Type u_3
inst✝¹ : Vec K Y
W : Type u_2
inst✝ : Vec K W
f : W → X
g : W → Y
hf : CDifferentiable K f
hg : CDifferentiable K g
⊢ (fwdDeriv K fun w => { fst := f w, snd := g w }) = fun w dw =>
    let xdx := fwdDeriv K f w dw;
    let ydy := fwdDeriv K g w dw;
    ({ fst := xdx.1, snd := ydy.1 }, { fst := xdx.2, snd := ydy.2 })
Tactic:
unfold fwdDeriv
State after:
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : Vec K X
Y : Type u_3
inst✝¹ : Vec K Y
W : Type u_2
inst✝ : Vec K W
f : W → X
g : W → Y
hf : CDifferentiable K f
hg : CDifferentiable K g
⊢ (fun x dx => ((fun w => { fst := f w, snd := g w }) x, cderiv K (fun w => { fst := f w, snd := g w }) x dx)) =
    fun w dw =>
    let xdx := (f w, cderiv K f w dw);
    let ydy := (g w, cderiv K g w dw);
    ({ fst := xdx.1, snd := ydy.1 }, { fst := xdx.2, snd := ydy.2 })

State before:
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : Vec K X
Y : Type u_3
inst✝¹ : Vec K Y
W : Type u_2
inst✝ : Vec K W
f : W → X
g : W → Y
hf : CDifferentiable K f
hg : CDifferentiable K g
⊢ (fun x dx => ((fun w => { fst := f w, snd := g w }) x, cderiv K (fun w => { fst := f w, snd := g w }) x dx)) =
    fun w dw =>
    let xdx := (f w, cderiv K f w dw);
    let ydy := (g w, cderiv K g w dw);
    ({ fst := xdx.1, snd := ydy.1 }, { fst := xdx.2, snd := ydy.2 })
Tactic:
fun_trans
State after:
no goals