Theorem: SciLean.revDerivM.const_rule
Proof state before:
ι : Sort ?u.10563
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'
X : Type
inst✝³ : SemiInnerProductSpace K X
Y : Type
inst✝² : SemiInnerProductSpace K Y
Z : Type
inst✝¹ : SemiInnerProductSpace K Z
E : ι → Type
inst✝ : (i : ι) → SemiInnerProductSpace K (E i)
y : m Y
hy : HasAdjDiffValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ (fun x => do
      let ydg ← revDerivM K (fun x => pure ()) x
      let zdf ← revDerivM K (fun x => y) ydg.1
      pure (zdf.1, fun dz => zdf.2 dz >>= ydg.2)) =
    fun x => do
    let ydy ← revDerivValM K y
    pure
        (ydy.1, fun dy' => do
          let __discr ← ydy.2 dy'
          let x : Unit := __discr
          pure 0)

case hf
ι : Sort ?u.10563
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'
X : Type
inst✝³ : SemiInnerProductSpace K X
Y : Type
inst✝² : SemiInnerProductSpace K Y
Z : Type
inst✝¹ : SemiInnerProductSpace K Z
E : ι → Type
inst✝ : (i : ι) → SemiInnerProductSpace K (E i)
y : m Y
hy : HasAdjDiffValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ HasAdjDiffM K fun x => y

case hg
ι : Sort ?u.10563
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'
X : Type
inst✝³ : SemiInnerProductSpace K X
Y : Type
inst✝² : SemiInnerProductSpace K Y
Z : Type
inst✝¹ : SemiInnerProductSpace K Z
E : ι → Type
inst✝ : (i : ι) → SemiInnerProductSpace K (E i)
y : m Y
hy : HasAdjDiffValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ HasAdjDiffM K fun x => pure ()
Tactic:
rw[revDerivM_pure]
Proof state after:
ι : Sort ?u.10563
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'
X : Type
inst✝³ : SemiInnerProductSpace K X
Y : Type
inst✝² : SemiInnerProductSpace K Y
Z : Type
inst✝¹ : SemiInnerProductSpace K Z
E : ι → Type
inst✝ : (i : ι) → SemiInnerProductSpace K (E i)
y : m Y
hy : HasAdjDiffValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ (fun x => do
      let ydg ←
        (fun x =>
              let ydf := revDeriv K (fun x => ()) x;
              pure (ydf.1, fun dy => pure (ydf.2 dy)))
            x
      let zdf ← revDerivM K (fun x => y) ydg.1
      pure (zdf.1, fun dz => zdf.2 dz >>= ydg.2)) =
    fun x => do
    let ydy ← revDerivValM K y
    pure
        (ydy.1, fun dy' => do
          let __discr ← ydy.2 dy'
          let x : Unit := __discr
          pure 0)

case hf
ι : Sort ?u.10563
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'
X : Type
inst✝³ : SemiInnerProductSpace K X
Y : Type
inst✝² : SemiInnerProductSpace K Y
Z : Type
inst✝¹ : SemiInnerProductSpace K Z
E : ι → Type
inst✝ : (i : ι) → SemiInnerProductSpace K (E i)
y : m Y
hy : HasAdjDiffValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ HasAdjDiff K fun x => ()

case hf
ι : Sort ?u.10563
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'
X : Type
inst✝³ : SemiInnerProductSpace K X
Y : Type
inst✝² : SemiInnerProductSpace K Y
Z : Type
inst✝¹ : SemiInnerProductSpace K Z
E : ι → Type
inst✝ : (i : ι) → SemiInnerProductSpace K (E i)
y : m Y
hy : HasAdjDiffValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ HasAdjDiffM K fun x => y

case hg
ι : Sort ?u.10563
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'
X : Type
inst✝³ : SemiInnerProductSpace K X
Y : Type
inst✝² : SemiInnerProductSpace K Y
Z : Type
inst✝¹ : SemiInnerProductSpace K Z
E : ι → Type
inst✝ : (i : ι) → SemiInnerProductSpace K (E i)
y : m Y
hy : HasAdjDiffValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ HasAdjDiffM K fun x => pure ()