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

State before:
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : SemiInnerProductSpace K X
Y : Type u_3
inst✝¹ : SemiInnerProductSpace K Y
W : Type u_2
inst✝ : SemiInnerProductSpace K W
f : W → X
g : W → Y
hf : HasAdjDiff K f
hg : HasAdjDiff K g
⊢ (revDerivUpdate K fun w => { fst := f w, snd := g w }) = fun w =>
    let xdf' := revDerivUpdate K f w;
    let ydg' := revDerivUpdate K g w;
    ({ fst := xdf'.1, snd := ydg'.1 }, fun dxy dw => xdf'.2 dxy.fst (ydg'.2 dxy.snd dw))
Tactic:
unfold revDerivUpdate
State after:
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : SemiInnerProductSpace K X
Y : Type u_3
inst✝¹ : SemiInnerProductSpace K Y
W : Type u_2
inst✝ : SemiInnerProductSpace K W
f : W → X
g : W → Y
hf : HasAdjDiff K f
hg : HasAdjDiff K g
⊢ (fun x =>
      let ydf := revDeriv K (fun w => { fst := f w, snd := g w }) x;
      (ydf.1, fun dy dx => dx + ydf.2 dy)) =
    fun w =>
    let xdf' :=
      let ydf := revDeriv K f w;
      (ydf.1, fun dy dx => dx + ydf.2 dy);
    let ydg' :=
      let ydf := revDeriv K g w;
      (ydf.1, fun dy dx => dx + ydf.2 dy);
    ({ fst := xdf'.1, snd := ydg'.1 }, fun dxy dw => xdf'.2 dxy.fst (ydg'.2 dxy.snd dw))

State before:
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : SemiInnerProductSpace K X
Y : Type u_3
inst✝¹ : SemiInnerProductSpace K Y
W : Type u_2
inst✝ : SemiInnerProductSpace K W
f : W → X
g : W → Y
hf : HasAdjDiff K f
hg : HasAdjDiff K g
⊢ (fun x =>
      let ydf := revDeriv K (fun w => { fst := f w, snd := g w }) x;
      (ydf.1, fun dy dx => dx + ydf.2 dy)) =
    fun w =>
    let xdf' :=
      let ydf := revDeriv K f w;
      (ydf.1, fun dy dx => dx + ydf.2 dy);
    let ydg' :=
      let ydf := revDeriv K g w;
      (ydf.1, fun dy dx => dx + ydf.2 dy);
    ({ fst := xdf'.1, snd := ydg'.1 }, fun dxy dw => xdf'.2 dxy.fst (ydg'.2 dxy.snd dw))
Tactic:
fun_trans
State after:
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : SemiInnerProductSpace K X
Y : Type u_3
inst✝¹ : SemiInnerProductSpace K Y
W : Type u_2
inst✝ : SemiInnerProductSpace K W
f : W → X
g : W → Y
hf : HasAdjDiff K f
hg : HasAdjDiff K g
⊢ (fun x =>
      ({ fst := f x, snd := g x }, fun dy dx =>
        dx + ((revDeriv K (fun w => f w) x).2 dy.fst + (revDeriv K (fun w => g w) x).2 dy.snd))) =
    fun w => ({ fst := f w, snd := g w }, fun dxy dw => dw + (revDeriv K g w).2 dxy.snd + (revDeriv K f w).2 dxy.fst)

State before:
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : SemiInnerProductSpace K X
Y : Type u_3
inst✝¹ : SemiInnerProductSpace K Y
W : Type u_2
inst✝ : SemiInnerProductSpace K W
f : W → X
g : W → Y
hf : HasAdjDiff K f
hg : HasAdjDiff K g
⊢ (fun x =>
      ({ fst := f x, snd := g x }, fun dy dx =>
        dx + ((revDeriv K (fun w => f w) x).2 dy.fst + (revDeriv K (fun w => g w) x).2 dy.snd))) =
    fun w => ({ fst := f w, snd := g w }, fun dxy dw => dw + (revDeriv K g w).2 dxy.snd + (revDeriv K f w).2 dxy.fst)
Tactic:
funext x
State after:
case h
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : SemiInnerProductSpace K X
Y : Type u_3
inst✝¹ : SemiInnerProductSpace K Y
W : Type u_2
inst✝ : SemiInnerProductSpace K W
f : W → X
g : W → Y
hf : HasAdjDiff K f
hg : HasAdjDiff K g
x : W
⊢ ({ fst := f x, snd := g x }, fun dy dx =>
      dx + ((revDeriv K (fun w => f w) x).2 dy.fst + (revDeriv K (fun w => g w) x).2 dy.snd)) =
    ({ fst := f x, snd := g x }, fun dxy dw => dw + (revDeriv K g x).2 dxy.snd + (revDeriv K f x).2 dxy.fst)

State before:
case h
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : SemiInnerProductSpace K X
Y : Type u_3
inst✝¹ : SemiInnerProductSpace K Y
W : Type u_2
inst✝ : SemiInnerProductSpace K W
f : W → X
g : W → Y
hf : HasAdjDiff K f
hg : HasAdjDiff K g
x : W
⊢ ({ fst := f x, snd := g x }, fun dy dx =>
      dx + ((revDeriv K (fun w => f w) x).2 dy.fst + (revDeriv K (fun w => g w) x).2 dy.snd)) =
    ({ fst := f x, snd := g x }, fun dxy dw => dw + (revDeriv K g x).2 dxy.snd + (revDeriv K f x).2 dxy.fst)
Tactic:
simp
State after:
case h
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : SemiInnerProductSpace K X
Y : Type u_3
inst✝¹ : SemiInnerProductSpace K Y
W : Type u_2
inst✝ : SemiInnerProductSpace K W
f : W → X
g : W → Y
hf : HasAdjDiff K f
hg : HasAdjDiff K g
x : W
⊢ (fun dy dx => dx + ((revDeriv K (fun w => f w) x).2 dy.fst + (revDeriv K (fun w => g w) x).2 dy.snd)) = fun dxy dw =>
    dw + (revDeriv K g x).2 dxy.snd + (revDeriv K f x).2 dxy.fst

State before:
case h
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : SemiInnerProductSpace K X
Y : Type u_3
inst✝¹ : SemiInnerProductSpace K Y
W : Type u_2
inst✝ : SemiInnerProductSpace K W
f : W → X
g : W → Y
hf : HasAdjDiff K f
hg : HasAdjDiff K g
x : W
⊢ (fun dy dx => dx + ((revDeriv K (fun w => f w) x).2 dy.fst + (revDeriv K (fun w => g w) x).2 dy.snd)) = fun dxy dw =>
    dw + (revDeriv K g x).2 dxy.snd + (revDeriv K f x).2 dxy.fst
Tactic:
funext dy dx
State after:
case h.h.h
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : SemiInnerProductSpace K X
Y : Type u_3
inst✝¹ : SemiInnerProductSpace K Y
W : Type u_2
inst✝ : SemiInnerProductSpace K W
f : W → X
g : W → Y
hf : HasAdjDiff K f
hg : HasAdjDiff K g
x : W
dy : MProd X Y
dx : W
⊢ dx + ((revDeriv K (fun w => f w) x).2 dy.fst + (revDeriv K (fun w => g w) x).2 dy.snd) =
    dx + (revDeriv K g x).2 dy.snd + (revDeriv K f x).2 dy.fst

State before:
case h.h.h
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : SemiInnerProductSpace K X
Y : Type u_3
inst✝¹ : SemiInnerProductSpace K Y
W : Type u_2
inst✝ : SemiInnerProductSpace K W
f : W → X
g : W → Y
hf : HasAdjDiff K f
hg : HasAdjDiff K g
x : W
dy : MProd X Y
dx : W
⊢ dx + ((revDeriv K (fun w => f w) x).2 dy.fst + (revDeriv K (fun w => g w) x).2 dy.snd) =
    dx + (revDeriv K g x).2 dy.snd + (revDeriv K f x).2 dy.fst
Tactic:
simp[add_assoc]
State after:
case h.h.h
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : SemiInnerProductSpace K X
Y : Type u_3
inst✝¹ : SemiInnerProductSpace K Y
W : Type u_2
inst✝ : SemiInnerProductSpace K W
f : W → X
g : W → Y
hf : HasAdjDiff K f
hg : HasAdjDiff K g
x : W
dy : MProd X Y
dx : W
⊢ (revDeriv K (fun w => f w) x).2 dy.fst + (revDeriv K (fun w => g w) x).2 dy.snd =
    (revDeriv K g x).2 dy.snd + (revDeriv K f x).2 dy.fst

State before:
case h.h.h
K : Type u_1
inst✝³ : RCLike K
X : Type u_3
inst✝² : SemiInnerProductSpace K X
Y : Type u_3
inst✝¹ : SemiInnerProductSpace K Y
W : Type u_2
inst✝ : SemiInnerProductSpace K W
f : W → X
g : W → Y
hf : HasAdjDiff K f
hg : HasAdjDiff K g
x : W
dy : MProd X Y
dx : W
⊢ (revDeriv K (fun w => f w) x).2 dy.fst + (revDeriv K (fun w => g w) x).2 dy.snd =
    (revDeriv K g x).2 dy.snd + (revDeriv K f x).2 dy.fst
Tactic:
rw[add_comm]
State after:
no goals