Theorem: SciLean.Scalar.tanh.arg_x.revDeriv_rule (SciLean/Core/Functions/Trigonometric.lean)

State before:
R : Type u_3
C : Type u_1
inst✝² : Scalar R C
W : Type ?u.24680
inst✝¹ : Vec C W
U : Type u_2
inst✝ : SemiInnerProductSpace C U
x : U → C
hx : HasAdjDiff C x
⊢ (revDeriv C fun u => tanh (x u)) = fun u =>
    let xdx := revDeriv C x u;
    (tanh xdx.1, fun dy => xdx.2 ((starRingEnd C) (1 - tanh xdx.1 ^ 2) * dy))
Tactic:
unfold revDeriv
State after:
R : Type u_3
C : Type u_1
inst✝² : Scalar R C
W : Type ?u.24680
inst✝¹ : Vec C W
U : Type u_2
inst✝ : SemiInnerProductSpace C U
x : U → C
hx : HasAdjDiff C x
⊢ (fun x_1 => ((fun u => tanh (x u)) x_1, semiAdjoint C (cderiv C (fun u => tanh (x u)) x_1))) = fun u =>
    let xdx := (x u, semiAdjoint C (cderiv C x u));
    (tanh xdx.1, fun dy => xdx.2 ((starRingEnd C) (1 - tanh xdx.1 ^ 2) * dy))

State before:
R : Type u_3
C : Type u_1
inst✝² : Scalar R C
W : Type ?u.24680
inst✝¹ : Vec C W
U : Type u_2
inst✝ : SemiInnerProductSpace C U
x : U → C
hx : HasAdjDiff C x
⊢ (fun x_1 => ((fun u => tanh (x u)) x_1, semiAdjoint C (cderiv C (fun u => tanh (x u)) x_1))) = fun u =>
    let xdx := (x u, semiAdjoint C (cderiv C x u));
    (tanh xdx.1, fun dy => xdx.2 ((starRingEnd C) (1 - tanh xdx.1 ^ 2) * dy))
Tactic:
fun_trans only [fwdDeriv, smul_push, ftrans_simp]
State after:
no goals