internlm/Lean-Github huggingface dataset:
Theorem: getThe.arg.revDerivValM_rule
Proof state before:
case 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 ?u.202023
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.202034
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.202045
inst✝ : SemiInnerProductSpace K Z
x✝ : S
⊢ pure ((x✝, fun dx ds => pure (PUnit.unit, dx + ds)), x✝) =
    pure ((x✝, fun ds => StateT.modifyGet fun s => (PUnit.unit, ds + s)), x✝)
Tactic:
rfl
Proof state after:
no goals
Theorem: MonadState.get.arg.HasAdjDiffValM_rule
Proof state before:
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 ?u.219494
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.219505
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.219516
inst✝ : SemiInnerProductSpace K Z
⊢ HasAdjDiffValM K get
Tactic:
simp[MonadState.get, getThe, MonadStateOf.get, StateT.get,HasAdjDiffValM,HasAdjDiffM]
Proof state after:
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 ?u.219494
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.219505
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.219516
inst✝ : SemiInnerProductSpace K Z
⊢ HasAdjDiffM K fun xs => pure (xs.2, xs.2)
Theorem: MonadState.get.arg.HasAdjDiffValM_rule
Proof state before:
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 ?u.219494
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.219505
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.219516
inst✝ : SemiInnerProductSpace K Z
⊢ HasAdjDiffM K fun xs => pure (xs.2, xs.2)
Tactic:
fun_prop
Proof state after:
no goals
Theorem: MonadState.get.arg.revDerivValM_rule
Proof state before:
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 ?u.221038
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.221049
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.221060
inst✝ : SemiInnerProductSpace K Z
⊢ revDerivValM K get = do
    let __do_lift ← get
    pure (__do_lift, fun ds => modify fun ds' => ds + ds')
Tactic:
funext
Proof state after:
case 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 ?u.221038
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.221049
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.221060
inst✝ : SemiInnerProductSpace K Z
x✝ : S
⊢ revDerivValM K get x✝ = (get >>= fun __do_lift => pure (__do_lift, fun ds => modify fun ds' => ds + ds')) x✝
Theorem: MonadState.get.arg.revDerivValM_rule
Proof state before:
case 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 ?u.221038
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.221049
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.221060
inst✝ : SemiInnerProductSpace K Z
x✝ : S
⊢ revDerivValM K get x✝ = (get >>= fun __do_lift => pure (__do_lift, fun ds => modify fun ds' => ds + ds')) x✝
Tactic:
simp[MonadState.get, getThe, MonadStateOf.get, StateT.get,revDerivValM, revDerivM, pure, StateT.pure, bind, StateT.bind, set, StateT.set, modifyThe, modify, MonadStateOf.modifyGet, StateT.modifyGet, modifyGet]
Proof state after:
case 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 ?u.221038
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.221049
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.221060
inst✝ : SemiInnerProductSpace K Z
x✝ : S
⊢ (do
      let ysdf ← revDerivM K (fun xs => pure (xs.2, xs.2)) ((), x✝)
      pure ((ysdf.1.1, fun dx ds => ysdf.2 (dx, ds)), ysdf.1.2)) =
    pure ((x✝, fun ds => StateT.modifyGet fun s => (PUnit.unit, ds + s)), x✝)
Theorem: MonadState.get.arg.revDerivValM_rule
Proof state before:
case 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 ?u.221038
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.221049
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.221060
inst✝ : SemiInnerProductSpace K Z
x✝ : S
⊢ (do
      let ysdf ← revDerivM K (fun xs => pure (xs.2, xs.2)) ((), x✝)
      pure ((ysdf.1.1, fun dx ds => ysdf.2 (dx, ds)), ysdf.1.2)) =
    pure ((x✝, fun ds => StateT.modifyGet fun s => (PUnit.unit, ds + s)), x✝)
Tactic:
fun_trans
Proof state after:
case 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 ?u.221038
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.221049
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.221060
inst✝ : SemiInnerProductSpace K Z
x✝ : S
⊢ pure ((x✝, fun dx ds => pure (PUnit.unit, dx + ds)), x✝) =
    pure ((x✝, fun ds => StateT.modifyGet fun s => (PUnit.unit, ds + s)), x✝)
Theorem: MonadState.get.arg.revDerivValM_rule
Proof state before:
case 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 ?u.221038
inst✝² : SemiInnerProductSpace K X
Y : Type ?u.221049
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.221060
inst✝ : SemiInnerProductSpace K Z
x✝ : S
⊢ pure ((x✝, fun dx ds => pure (PUnit.unit, dx + ds)), x✝) =
    pure ((x✝, fun ds => StateT.modifyGet fun s => (PUnit.unit, ds + s)), x✝)
Tactic:
rfl
Proof state after:
no goals
Theorem: MonadStateOf.set.arg_a0.HasAdjDiffM_rule
Proof state before:
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.238553
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.238564
inst✝ : SemiInnerProductSpace K Z
s : X → S
ha0 : HasAdjDiff K s
⊢ HasAdjDiffM K fun x => set (s x)
Tactic:
simp[set, StateT.set, HasAdjDiffValM, HasAdjDiffM]
Proof state after:
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.238553
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.238564
inst✝ : SemiInnerProductSpace K Z
s : X → S
ha0 : HasAdjDiff K s
⊢ HasAdjDiffM K fun xs => pure (PUnit.unit, s xs.1)
Theorem: MonadStateOf.set.arg_a0.HasAdjDiffM_rule
Proof state before:
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.238553
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.238564
inst✝ : SemiInnerProductSpace K Z
s : X → S
ha0 : HasAdjDiff K s
⊢ HasAdjDiffM K fun xs => pure (PUnit.unit, s xs.1)
Tactic:
fun_prop
Proof state after:
no goals
Theorem: MonadStateOf.set.arg_a0.revDerivM_rule
Proof state before:
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)
Tactic:
funext
Proof state after:
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✝
Theorem: MonadStateOf.set.arg_a0.revDerivM_rule
Proof state before:
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✝
Tactic:
simp[set, StateT.set, revDerivM, getThe, MonadStateOf.get, StateT.get, bind, StateT.bind, pure, StateT.pure, get]
Proof state after:
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
⊢ (do
      let ysdf ← revDerivM K (fun xs => pure (PUnit.unit, s xs.1)) (x✝¹, x✝)
      pure ((ysdf.1.1, fun dx ds => ysdf.2 (dx, ds)), ysdf.1.2)) =
    pure
      ((PUnit.unit, fun x =>
          StateT.bind StateT.get fun __do_lift =>
            StateT.bind (StateT.set 0) fun x => StateT.pure ((revDeriv K s x✝¹).2 __do_lift)),
        s x✝¹)
Theorem: MonadStateOf.set.arg_a0.revDerivM_rule
Proof state before:
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
⊢ (do
      let ysdf ← revDerivM K (fun xs => pure (PUnit.unit, s xs.1)) (x✝¹, x✝)
      pure ((ysdf.1.1, fun dx ds => ysdf.2 (dx, ds)), ysdf.1.2)) =
    pure
      ((PUnit.unit, fun x =>
          StateT.bind StateT.get fun __do_lift =>
            StateT.bind (StateT.set 0) fun x => StateT.pure ((revDeriv K s x✝¹).2 __do_lift)),
        s x✝¹)
Tactic:
fun_trans
Proof state after:
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
⊢ pure ((PUnit.unit, fun dx ds => pure ((revDeriv K (fun x0 => s x0) x✝¹).2 ds, 0)), s x✝¹) =
    pure
      ((PUnit.unit, fun x =>
          StateT.bind StateT.get fun __do_lift =>
            StateT.bind (StateT.set 0) fun x => StateT.pure ((revDeriv K s x✝¹).2 __do_lift)),
        s x✝¹)
Theorem: MonadStateOf.set.arg_a0.revDerivM_rule
Proof state before:
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
⊢ pure ((PUnit.unit, fun dx ds => pure ((revDeriv K (fun x0 => s x0) x✝¹).2 ds, 0)), s x✝¹) =
    pure
      ((PUnit.unit, fun x =>
          StateT.bind StateT.get fun __do_lift =>
            StateT.bind (StateT.set 0) fun x => StateT.pure ((revDeriv K s x✝¹).2 __do_lift)),
        s x✝¹)
Tactic:
congr
Proof state after:
case h.h.e_a.e_fst.e_snd
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
⊢ (fun dx ds => pure ((revDeriv K (fun x0 => s x0) x✝¹).2 ds, 0)) = fun x =>
    StateT.bind StateT.get fun __do_lift =>
      StateT.bind (StateT.set 0) fun x => StateT.pure ((revDeriv K s x✝¹).2 __do_lift)
Theorem: MonadStateOf.set.arg_a0.revDerivM_rule
Proof state before:
case h.h.e_a.e_fst.e_snd
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
⊢ (fun dx ds => pure ((revDeriv K (fun x0 => s x0) x✝¹).2 ds, 0)) = fun x =>
    StateT.bind StateT.get fun __do_lift =>
      StateT.bind (StateT.set 0) fun x => StateT.pure ((revDeriv K s x✝¹).2 __do_lift)
Tactic:
funext
Proof state after:
case h.h.e_a.e_fst.e_snd.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
x✝¹ : PUnit.{1}
x✝ : S
⊢ pure ((revDeriv K (fun x0 => s x0) x✝³).2 x✝, 0) =
    StateT.bind StateT.get
      (fun __do_lift => StateT.bind (StateT.set 0) fun x => StateT.pure ((revDeriv K s x✝³).2 __do_lift)) x✝
Theorem: MonadStateOf.set.arg_a0.revDerivM_rule
Proof state before:
case h.h.e_a.e_fst.e_snd.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
x✝¹ : PUnit.{1}
x✝ : S
⊢ pure ((revDeriv K (fun x0 => s x0) x✝³).2 x✝, 0) =
    StateT.bind StateT.get
      (fun __do_lift => StateT.bind (StateT.set 0) fun x => StateT.pure ((revDeriv K s x✝³).2 __do_lift)) x✝
Tactic:
simp[StateT.get, StateT.bind,StateT.set,StateT.pure]
Proof state after:
no goals
Theorem: modify.arg_f.HasAdjDiffM_rule
Proof state before:
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.263175
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.263186
inst✝ : SemiInnerProductSpace K Z
f : X → S → S
ha0 : HasAdjDiff K fun xs => f xs.1 xs.2
⊢ HasAdjDiffM K fun x => modify (f x)
Tactic:
simp[modify, modifyGet, MonadStateOf.modifyGet, StateT.modifyGet, HasAdjDiffValM, HasAdjDiffM]
Proof state after:
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.263175
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.263186
inst✝ : SemiInnerProductSpace K Z
f : X → S → S
ha0 : HasAdjDiff K fun xs => f xs.1 xs.2
⊢ HasAdjDiffM K fun xs => pure (PUnit.unit, f xs.1 xs.2)
Theorem: modify.arg_f.HasAdjDiffM_rule
Proof state before:
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.263175
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.263186
inst✝ : SemiInnerProductSpace K Z
f : X → S → S
ha0 : HasAdjDiff K fun xs => f xs.1 xs.2
⊢ HasAdjDiffM K fun xs => pure (PUnit.unit, f xs.1 xs.2)
Tactic:
fun_prop
Proof state after:
no goals
Theorem: modify.arg_f.revDerivM_rule
Proof state before:
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.264984
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.264995
inst✝ : SemiInnerProductSpace K Z
f : X → S → S
ha0 : HasAdjDiff K fun xs => f xs.1 xs.2
⊢ (revDerivM K fun x => modify (f x)) = fun x => do
    let __do_lift ← get
    let sdf : S × (S → X × S) := revDeriv K (fun xs => f xs.1 xs.2) (x, __do_lift)
    set sdf.1
    pure
        ((), fun x => do
          let __do_lift ← get
          let dxs : X × S := sdf.2 __do_lift
          set dxs.2
          pure dxs.1)
Tactic:
funext
Proof state after:
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.264984
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.264995
inst✝ : SemiInnerProductSpace K Z
f : X → S → S
ha0 : HasAdjDiff K fun xs => f xs.1 xs.2
x✝¹ : X
x✝ : S
⊢ revDerivM K (fun x => modify (f x)) x✝¹ x✝ =
    (get >>= fun __do_lift =>
        let sdf := revDeriv K (fun xs => f xs.1 xs.2) (x✝¹, __do_lift);
        do
        set sdf.1
        pure
            ((), fun x => do
              let __do_lift ← get
              let dxs : X × S := sdf.2 __do_lift
              set dxs.2
              pure dxs.1))
      x✝
Theorem: modify.arg_f.revDerivM_rule
Proof state before:
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.264984
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.264995
inst✝ : SemiInnerProductSpace K Z
f : X → S → S
ha0 : HasAdjDiff K fun xs => f xs.1 xs.2
x✝¹ : X
x✝ : S
⊢ revDerivM K (fun x => modify (f x)) x✝¹ x✝ =
    (get >>= fun __do_lift =>
        let sdf := revDeriv K (fun xs => f xs.1 xs.2) (x✝¹, __do_lift);
        do
        set sdf.1
        pure
            ((), fun x => do
              let __do_lift ← get
              let dxs : X × S := sdf.2 __do_lift
              set dxs.2
              pure dxs.1))
      x✝
Tactic:
simp[modifyThe, modifyGet, MonadStateOf.modifyGet, StateT.modifyGet,revDerivM, bind, StateT.bind, getThe, MonadStateOf.get, StateT.get, set, StateT.set, get, pure, StateT.pure, modify]
Proof state after:
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.264984
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.264995
inst✝ : SemiInnerProductSpace K Z
f : X → S → S
ha0 : HasAdjDiff K fun xs => f xs.1 xs.2
x✝¹ : X
x✝ : S
⊢ (do
      let ysdf ← revDerivM K (fun xs => pure (PUnit.unit, f xs.1 xs.2)) (x✝¹, x✝)
      pure ((ysdf.1.1, fun dx ds => ysdf.2 (dx, ds)), ysdf.1.2)) =
    pure
      (((), fun x =>
          StateT.bind StateT.get fun __do_lift =>
            StateT.bind (StateT.set ((revDeriv K (fun xs => f xs.1 xs.2) (x✝¹, x✝)).2 __do_lift).2) fun x =>
              StateT.pure ((revDeriv K (fun xs => f xs.1 xs.2) (x✝¹, x✝)).2 __do_lift).1),
        f x✝¹ x✝)
Theorem: modify.arg_f.revDerivM_rule
Proof state before:
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.264984
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.264995
inst✝ : SemiInnerProductSpace K Z
f : X → S → S
ha0 : HasAdjDiff K fun xs => f xs.1 xs.2
x✝¹ : X
x✝ : S
⊢ (do
      let ysdf ← revDerivM K (fun xs => pure (PUnit.unit, f xs.1 xs.2)) (x✝¹, x✝)
      pure ((ysdf.1.1, fun dx ds => ysdf.2 (dx, ds)), ysdf.1.2)) =
    pure
      (((), fun x =>
          StateT.bind StateT.get fun __do_lift =>
            StateT.bind (StateT.set ((revDeriv K (fun xs => f xs.1 xs.2) (x✝¹, x✝)).2 __do_lift).2) fun x =>
              StateT.pure ((revDeriv K (fun xs => f xs.1 xs.2) (x✝¹, x✝)).2 __do_lift).1),
        f x✝¹ x✝)
Tactic:
fun_trans
Proof state after:
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.264984
inst✝¹ : SemiInnerProductSpace K Y
Z : Type ?u.264995
inst✝ : SemiInnerProductSpace K Z
f : X → S → S
ha0 : HasAdjDiff K fun xs => f xs.1 xs.2
x✝¹ : X
x✝ : S
⊢ pure ((PUnit.unit, fun dx ds => pure ((revDeriv K (fun x => f x.1 x.2) (x✝¹, x✝)).2 ds)), f x✝¹ x✝) =
    pure
      (((), fun x =>
          StateT.bind StateT.get fun __do_lift =>
            StateT.bind (StateT.set ((revDeriv K (fun x => f x.1 x.2) (x✝¹, x✝)).2 __do_lift).2) fun x =>
              StateT.pure ((revDeriv K (fun x => f x.1 x.2) (x✝¹, x✝)).2 __do_lift).1),
        f x✝¹ x✝)