funext
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : RevDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : SemiInnerProductSpace K S
X : Type
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.240155
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.240166
inst✝ : SemiInnerProductSpace K Z
s : X → S
ha0 : HasAdjDiff K s
⊢ (revDerivM K fun x => set (s x)) = fun x =>
    let sds := revDeriv K s x;
    do
    let __do_lift ← set sds.1
    pure
        (__do_lift, fun x => do
          let __do_lift ← get
          let dx : X := sds.2 __do_lift
          set 0
          pure dx)
case h.h
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : RevDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
S : Type
inst✝³ : SemiInnerProductSpace K S
X : Type
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.240155
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.240166
inst✝ : SemiInnerProductSpace K Z
s : X → S
ha0 : HasAdjDiff K s
x✝¹ : X
x✝ : S
⊢ revDerivM K (fun x => set (s x)) x✝¹ x✝ =
    (let sds := revDeriv K s x✝¹;
      do
      let __do_lift ← set sds.1
      pure
          (__do_lift, fun x => do
            let __do_lift ← get
            let dx : X := sds.2 __do_lift
            set 0
            pure dx))
      x✝