unfold revDeriv2
K : Type
inst✝⁴ : RCLike K
X : Type
inst✝³ : SemiInnerProductSpace K X
Y : Type
inst✝² : SemiInnerProductSpace K Y
Z : Type
inst✝¹ : SemiInnerProductSpace K Z
W : Type
inst✝ : SemiInnerProductSpace K W
g : W → X → Y
f : W → X → Z
hg : HasAdjDiff K fun x => g x.1 x.2
hf : HasAdjDiff K fun x => f x.1 x.2
⊢ (revDeriv2 K fun w x => (g w x, f w x)) = fun w x =>
    let ydg := revDeriv2 K g w x;
    let zdf :=
      revDeriv2 K
        (fun x x_1 =>
          match x with
          | (w, x) => f w x)
        (w, x) ();
    ((ydg.1, zdf.1), fun dyz dw =>
      let dwx := ydg.2 dyz.1 dw;
      (zdf.2 dyz.2 dwx).1)
K : Type
inst✝⁴ : RCLike K
X : Type
inst✝³ : SemiInnerProductSpace K X
Y : Type
inst✝² : SemiInnerProductSpace K Y
Z : Type
inst✝¹ : SemiInnerProductSpace K Z
W : Type
inst✝ : SemiInnerProductSpace K W
g : W → X → Y
f : W → X → Z
hg : HasAdjDiff K fun x => g x.1 x.2
hf : HasAdjDiff K fun x => f x.1 x.2
⊢ (fun w x =>
      ((fun w x => (g w x, f w x)) w x, fun dy =>
        match (motive := W × X → W → W × X)
          semiAdjoint K
            (cderiv K
              (fun x =>
                match x with
                | (w, x) => (fun w x => (g w x, f w x)) w x)
              (w, x))
            dy with
        | (dw, dx) => fun dw' => (dw' + dw, dx))) =
    fun w x =>
    let ydg :=
      (g w x, fun dy =>
        match (motive := W × X → W → W × X)
          semiAdjoint K
            (cderiv K
              (fun x =>
                match x with
                | (w, x) => g w x)
              (w, x))
            dy with
        | (dw, dx) => fun dw' => (dw' + dw, dx));
    let zdf :=
      ((fun x x_1 =>
            match x with
            | (w, x) => f w x)
          (w, x) (),
        fun dy =>
        match (motive := (W × X) × Unit → W × X → (W × X) × Unit)
          semiAdjoint K
            (cderiv K
              (fun x =>
                match x with
                | (w, x) =>
                  (fun x x_1 =>
                      match x with
                      | (w, x) => f w x)
                    w x)
              ((w, x), ()))
            dy with
        | (dw, dx) => fun dw' => (dw' + dw, dx));
    ((ydg.1, zdf.1), fun dyz dw =>
      let dwx := ydg.2 dyz.1 dw;
      (zdf.2 dyz.2 dwx).1)