Theorem: SciLean.revDeriv2.let_rule_has
Proof state before:
K I : Type
inst✝²¹ : RCLike K
W : Type
inst✝²⁰ : SemiInnerProductSpace K W
X : Type
inst✝¹⁹ : SemiInnerProductSpace K X
Y : Type
inst✝¹⁸ : SemiInnerProductSpace K Y
Z : Type
inst✝¹⁷ : SemiInnerProductSpace K Z
ι : Type
inst✝¹⁶ : IndexType ι
inst✝¹⁵ : LawfulIndexType ι
inst✝¹⁴ : DecidableEq ι
E : Type
EI : I → Type
inst✝¹³ : StructType E I EI
inst✝¹² : IndexType I
inst✝¹¹ : LawfulIndexType I
inst✝¹⁰ : DecidableEq I
inst✝⁹ : SemiInnerProductSpace K E
inst✝⁸ : (i : I) → SemiInnerProductSpace K (EI i)
XI : I → Type
inst✝⁷ : StructType X I XI
inst✝⁶ : (i : I) → SemiInnerProductSpace K (XI i)
YI : I → Type
inst✝⁵ : StructType Y I YI
inst✝⁴ : (i : I) → SemiInnerProductSpace K (YI i)
ZI : I → Type
inst✝³ : StructType Z I ZI
inst✝² : (i : I) → SemiInnerProductSpace K (ZI i)
WI : I → Type
inst✝¹ : StructType W I WI
inst✝ : (i : I) → SemiInnerProductSpace K (WI i)
w : W
x : X
g : W → X → Y
g' : Y × (Y → W × X → (W × X) × Unit)
hg :
  HasRevDeriv2At K
    (fun x x_1 =>
      match x with
      | (w, x) => g w x)
    g' (w, x) ()
f : W → X → Y → Z
f' : Z × (Z → W → W × X × Y)
hf :
  HasRevDeriv2At K
    (fun w x =>
      match x with
      | (x, y) => f w x y)
    f' w (x, g w x)
r : Z × (Z → W → W × X)
hr :
  r =
    (f'.1, fun dz dw =>
      let dwxy := f'.2 dz dw;
      let dxy := g'.2 dwxy.2.2 (dwxy.1, dwxy.2.1);
      dxy.1)
⊢ HasRevDeriv2At K (fun w x => f w x (g w x))
    (f'.1, fun dz dw =>
      let dwxy := f'.2 dz dw;
      let dxy := g'.2 dwxy.2.2 (dwxy.1, dwxy.2.1);
      dxy.1)
    w x
Tactic:
have : HasAdjDiffAt K (fun (w,x) => g w x) (w,x) := sorry_proof
Proof state after:
K I : Type
inst✝²¹ : RCLike K
W : Type
inst✝²⁰ : SemiInnerProductSpace K W
X : Type
inst✝¹⁹ : SemiInnerProductSpace K X
Y : Type
inst✝¹⁸ : SemiInnerProductSpace K Y
Z : Type
inst✝¹⁷ : SemiInnerProductSpace K Z
ι : Type
inst✝¹⁶ : IndexType ι
inst✝¹⁵ : LawfulIndexType ι
inst✝¹⁴ : DecidableEq ι
E : Type
EI : I → Type
inst✝¹³ : StructType E I EI
inst✝¹² : IndexType I
inst✝¹¹ : LawfulIndexType I
inst✝¹⁰ : DecidableEq I
inst✝⁹ : SemiInnerProductSpace K E
inst✝⁸ : (i : I) → SemiInnerProductSpace K (EI i)
XI : I → Type
inst✝⁷ : StructType X I XI
inst✝⁶ : (i : I) → SemiInnerProductSpace K (XI i)
YI : I → Type
inst✝⁵ : StructType Y I YI
inst✝⁴ : (i : I) → SemiInnerProductSpace K (YI i)
ZI : I → Type
inst✝³ : StructType Z I ZI
inst✝² : (i : I) → SemiInnerProductSpace K (ZI i)
WI : I → Type
inst✝¹ : StructType W I WI
inst✝ : (i : I) → SemiInnerProductSpace K (WI i)
w : W
x : X
g : W → X → Y
g' : Y × (Y → W × X → (W × X) × Unit)
hg :
  HasRevDeriv2At K
    (fun x x_1 =>
      match x with
      | (w, x) => g w x)
    g' (w, x) ()
f : W → X → Y → Z
f' : Z × (Z → W → W × X × Y)
hf :
  HasRevDeriv2At K
    (fun w x =>
      match x with
      | (x, y) => f w x y)
    f' w (x, g w x)
r : Z × (Z → W → W × X)
hr :
  r =
    (f'.1, fun dz dw =>
      let dwxy := f'.2 dz dw;
      let dxy := g'.2 dwxy.2.2 (dwxy.1, dwxy.2.1);
      dxy.1)
this :
  HasAdjDiffAt K
    (fun x =>
      match x with
      | (w, x) => g w x)
    (w, x)
⊢ HasRevDeriv2At K (fun w x => f w x (g w x))
    (f'.1, fun dz dw =>
      let dwxy := f'.2 dz dw;
      let dxy := g'.2 dwxy.2.2 (dwxy.1, dwxy.2.1);
      dxy.1)
    w x