internlm/Lean-Github huggingface dataset:
Theorem: SciLean.HasAdjDiffM.const_rule
Proof state before:
ι : Sort ?u.4270
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 => do
    pure ()
    y
Tactic:
apply HasAdjDiffM_bind
Proof state after:
case hf
ι : Sort ?u.4270
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.4270
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 ()
Theorem: SciLean.HasAdjDiffM.const_rule
Proof state before:
case hf
ι : Sort ?u.4270
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.4270
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:
apply hy
Proof state after:
case hg
ι : Sort ?u.4270
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 ()
Theorem: SciLean.HasAdjDiffM.const_rule
Proof state before:
case hg
ι : Sort ?u.4270
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:
apply HasAdjDiffM_pure
Proof state after:
case hg.hf
ι : Sort ?u.4270
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 => ()
Theorem: SciLean.HasAdjDiffM.const_rule
Proof state before:
case hg.hf
ι : Sort ?u.4270
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 => ()
Tactic:
fun_prop
Proof state after:
no goals
Theorem: SciLean.HasAdjDiffM.const_rule
Proof state before:
ι : Sort ?u.4270
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
⊢ (fun x => y) = fun x => do
    pure ()
    y
Tactic:
simp
Proof state after:
no goals
Theorem: SciLean.HasAdjDiffM.comp_rule
Proof state before:
ι : Sort ?u.6366
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)
f : Y → m Z
g : X → Y
hf : HasAdjDiffM K f
hg : HasAdjDiff K g
⊢ HasAdjDiffM K fun x => f (g x)
Tactic:
rw[show ((fun x => f (g x))
         =
         fun x => pure (g x) >>= f) by simp]
Proof state after:
ι : Sort ?u.6366
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)
f : Y → m Z
g : X → Y
hf : HasAdjDiffM K f
hg : HasAdjDiff K g
⊢ HasAdjDiffM K fun x => pure (g x) >>= f
Theorem: SciLean.HasAdjDiffM.comp_rule
Proof state before:
ι : Sort ?u.6366
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)
f : Y → m Z
g : X → Y
hf : HasAdjDiffM K f
hg : HasAdjDiff K g
⊢ HasAdjDiffM K fun x => pure (g x) >>= f
Tactic:
apply HasAdjDiffM_bind _ _ hf
Proof state after:
ι : Sort ?u.6366
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)
f : Y → m Z
g : X → Y
hf : HasAdjDiffM K f
hg : HasAdjDiff K g
⊢ HasAdjDiffM K fun x => pure (g x)
Theorem: SciLean.HasAdjDiffM.comp_rule
Proof state before:
ι : Sort ?u.6366
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)
f : Y → m Z
g : X → Y
hf : HasAdjDiffM K f
hg : HasAdjDiff K g
⊢ HasAdjDiffM K fun x => pure (g x)
Tactic:
apply HasAdjDiffM_pure g hg
Proof state after:
no goals
Theorem: SciLean.HasAdjDiffM.comp_rule
Proof state before:
ι : Sort ?u.6366
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)
f : Y → m Z
g : X → Y
hf : HasAdjDiffM K f
hg : HasAdjDiff K g
⊢ (fun x => f (g x)) = fun x => pure (g x) >>= f
Tactic:
simp
Proof state after:
no goals
Theorem: SciLean.HasAdjDiffM.let_rule
Proof state before:
ι : Sort ?u.8350
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)
f : X → Y → m Z
g : X → Y
hf : HasAdjDiffM K fun xy => f xy.1 xy.2
hg : HasAdjDiff K g
⊢ HasAdjDiffM K fun x =>
    let y := g x;
    f x y
Tactic:
let f' := (fun xy : X×Y => f xy.1 xy.2)
Proof state after:
ι : Sort ?u.8350
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)
f : X → Y → m Z
g : X → Y
hf : HasAdjDiffM K fun xy => f xy.1 xy.2
hg : HasAdjDiff K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
⊢ HasAdjDiffM K fun x =>
    let y := g x;
    f x y
Theorem: SciLean.HasAdjDiffM.let_rule
Proof state before:
ι : Sort ?u.8350
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)
f : X → Y → m Z
g : X → Y
hf : HasAdjDiffM K fun xy => f xy.1 xy.2
hg : HasAdjDiff K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
⊢ HasAdjDiffM K fun x =>
    let y := g x;
    f x y
Tactic:
let g' := (fun x => (x, g x))
Proof state after:
ι : Sort ?u.8350
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)
f : X → Y → m Z
g : X → Y
hf : HasAdjDiffM K fun xy => f xy.1 xy.2
hg : HasAdjDiff K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ HasAdjDiffM K fun x =>
    let y := g x;
    f x y
Theorem: SciLean.HasAdjDiffM.let_rule
Proof state before:
ι : Sort ?u.8350
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)
f : X → Y → m Z
g : X → Y
hf : HasAdjDiffM K fun xy => f xy.1 xy.2
hg : HasAdjDiff K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ HasAdjDiffM K fun x =>
    let y := g x;
    f x y
Tactic:
rw[show ((fun x => f x (g x))
         =
         fun x => pure (g' x) >>= f') by simp]
Proof state after:
ι : Sort ?u.8350
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)
f : X → Y → m Z
g : X → Y
hf : HasAdjDiffM K fun xy => f xy.1 xy.2
hg : HasAdjDiff K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ HasAdjDiffM K fun x => pure (g' x) >>= f'
Theorem: SciLean.HasAdjDiffM.let_rule
Proof state before:
ι : Sort ?u.8350
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)
f : X → Y → m Z
g : X → Y
hf : HasAdjDiffM K fun xy => f xy.1 xy.2
hg : HasAdjDiff K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ HasAdjDiffM K fun x => pure (g' x) >>= f'
Tactic:
apply HasAdjDiffM_bind _ _ hf
Proof state after:
ι : Sort ?u.8350
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)
f : X → Y → m Z
g : X → Y
hf : HasAdjDiffM K fun xy => f xy.1 xy.2
hg : HasAdjDiff K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ HasAdjDiffM K fun x => pure (g' x)
Theorem: SciLean.HasAdjDiffM.let_rule
Proof state before:
ι : Sort ?u.8350
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)
f : X → Y → m Z
g : X → Y
hf : HasAdjDiffM K fun xy => f xy.1 xy.2
hg : HasAdjDiff K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ HasAdjDiffM K fun x => pure (g' x)
Tactic:
apply HasAdjDiffM_pure g'
Proof state after:
ι : Sort ?u.8350
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)
f : X → Y → m Z
g : X → Y
hf : HasAdjDiffM K fun xy => f xy.1 xy.2
hg : HasAdjDiff K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ HasAdjDiff K g'
Theorem: SciLean.HasAdjDiffM.let_rule
Proof state before:
ι : Sort ?u.8350
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)
f : X → Y → m Z
g : X → Y
hf : HasAdjDiffM K fun xy => f xy.1 xy.2
hg : HasAdjDiff K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ HasAdjDiff K g'
Tactic:
fun_prop
Proof state after:
no goals
Theorem: SciLean.HasAdjDiffM.let_rule
Proof state before:
ι : Sort ?u.8350
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)
f : X → Y → m Z
g : X → Y
hf : HasAdjDiffM K fun xy => f xy.1 xy.2
hg : HasAdjDiff K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ (fun x => f x (g x)) = fun x => pure (g' x) >>= f'
Tactic:
simp
Proof state after:
no goals
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
⊢ (revDerivM K fun x => y) = 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)
Tactic:
have h : (fun _ : X => y)
         =
         fun _ : X => pure () >>= fun _ => y := by simp
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
⊢ (revDerivM K fun x => y) = 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)
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
⊢ (revDerivM K fun x => y) = 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)
Tactic:
rw[h]
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
⊢ (revDerivM K fun x => do
      pure ()
      y) =
    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)
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
⊢ (revDerivM K fun x => do
      pure ()
      y) =
    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)
Tactic:
rw[revDerivM_bind]
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 ← 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 ()