fun_trans
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))
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)