Theorem: SciLean.Scalar.sin.arg_x.fwdDeriv_rule (SciLean/Core/Functions/Trigonometric.lean)

State before:
R : Type u_3
C : Type u_1
inst✝² : Scalar R C
W : Type u_2
inst✝¹ : Vec C W
U : Type ?u.725
inst✝ : SemiInnerProductSpace C U
x : W → C
hx : CDifferentiable C x
⊢ (fwdDeriv C fun w => sin (x w)) = fun w dw =>
    let xdx := fwdDeriv C x w dw;
    let s := sin xdx.1;
    let c := cos xdx.1;
    (s, xdx.2 * c)
Tactic:
unfold fwdDeriv
State after:
R : Type u_3
C : Type u_1
inst✝² : Scalar R C
W : Type u_2
inst✝¹ : Vec C W
U : Type ?u.725
inst✝ : SemiInnerProductSpace C U
x : W → C
hx : CDifferentiable C x
⊢ (fun x_1 dx => ((fun w => sin (x w)) x_1, cderiv C (fun w => sin (x w)) x_1 dx)) = fun w dw =>
    let xdx := (x w, cderiv C x w dw);
    let s := sin xdx.1;
    let c := cos xdx.1;
    (s, xdx.2 * c)

State before:
R : Type u_3
C : Type u_1
inst✝² : Scalar R C
W : Type u_2
inst✝¹ : Vec C W
U : Type ?u.725
inst✝ : SemiInnerProductSpace C U
x : W → C
hx : CDifferentiable C x
⊢ (fun x_1 dx => ((fun w => sin (x w)) x_1, cderiv C (fun w => sin (x w)) x_1 dx)) = fun w dw =>
    let xdx := (x w, cderiv C x w dw);
    let s := sin xdx.1;
    let c := cos xdx.1;
    (s, xdx.2 * c)
Tactic:
fun_trans
State after:
R : Type u_3
C : Type u_1
inst✝² : Scalar R C
W : Type u_2
inst✝¹ : Vec C W
U : Type ?u.725
inst✝ : SemiInnerProductSpace C U
x : W → C
hx : CDifferentiable C x
⊢ (fun x_1 dx => (sin (x x_1), (fwdDeriv C (fun w => x w) x_1 dx).2 * cos (fwdDeriv C (fun w => x w) x_1 dx).1)) =
    fun w dw => (sin (x w), cderiv C x w dw * cos (x w))

State before:
R : Type u_3
C : Type u_1
inst✝² : Scalar R C
W : Type u_2
inst✝¹ : Vec C W
U : Type ?u.725
inst✝ : SemiInnerProductSpace C U
x : W → C
hx : CDifferentiable C x
⊢ (fun x_1 dx => (sin (x x_1), (fwdDeriv C (fun w => x w) x_1 dx).2 * cos (fwdDeriv C (fun w => x w) x_1 dx).1)) =
    fun w dw => (sin (x w), cderiv C x w dw * cos (x w))
Tactic:
rfl
State after:
no goals