internlm/Lean-Github huggingface dataset:
Theorem: SciLean.fwdDerivM.pure_rule
Proof state before:
ι : Sort ?u.7237
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
⊢ (fwdDerivM K fun x => pure x) = fun x dx => pure (x, dx)
Tactic:
rw [fwdDerivM_pure _ (by fun_prop)]
Proof state after:
ι : Sort ?u.7237
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
⊢ (fun x dx => pure (fwdDeriv K (fun x => x) x dx)) = fun x dx => pure (x, dx)
Theorem: SciLean.fwdDerivM.pure_rule
Proof state before:
ι : Sort ?u.7237
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
⊢ (fun x dx => pure (fwdDeriv K (fun x => x) x dx)) = fun x dx => pure (x, dx)
Tactic:
fun_trans
Proof state after:
no goals
Theorem: SciLean.fwdDerivM.pure_rule
Proof state before:
ι : Sort ?u.7237
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
⊢ CDifferentiable K fun x => x
Tactic:
fun_prop
Proof state after:
no goals
Theorem: SciLean.fwdDerivM.const_rule
Proof state before:
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
⊢ (fwdDerivM K fun x => y) = fun x x => fwdDerivValM K y
Tactic:
have h : (fun _ : X => y)
         =
         fun _ : X => pure () >>= fun _ => y := by simp
Proof state after:
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ (fwdDerivM K fun x => y) = fun x x => fwdDerivValM K y
Theorem: SciLean.fwdDerivM.const_rule
Proof state before:
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ (fwdDerivM K fun x => y) = fun x x => fwdDerivValM K y
Tactic:
rw[h]
Proof state after:
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ (fwdDerivM K fun x => do
      pure ()
      y) =
    fun x x => fwdDerivValM K y
Theorem: SciLean.fwdDerivM.const_rule
Proof state before:
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ (fwdDerivM K fun x => do
      pure ()
      y) =
    fun x x => fwdDerivValM K y
Tactic:
rw[fwdDerivM_bind]
Proof state after:
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ (fun x dx => do
      let ydy ← fwdDerivM K (fun x => pure ()) x dx
      fwdDerivM K (fun x => y) ydy.1 ydy.2) =
    fun x x => fwdDerivValM K y

case hf
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ CDifferentiableM K fun x => y

case hg
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ CDifferentiableM K fun x => pure ()
Theorem: SciLean.fwdDerivM.const_rule
Proof state before:
case hf
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ CDifferentiable K fun x => ()

case hf
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ CDifferentiableM K fun x => y

case hg
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ CDifferentiableM K fun x => pure ()
Tactic:
fun_prop
Proof state after:
case hf
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ CDifferentiableM K fun x => y

case hg
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ CDifferentiableM K fun x => pure ()
Theorem: SciLean.fwdDerivM.const_rule
Proof state before:
case hf
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ CDifferentiableM K fun x => y

case hg
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ CDifferentiableM K fun x => pure ()
Tactic:
apply hy
Proof state after:
case hg
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ CDifferentiableM K fun x => pure ()
Theorem: SciLean.fwdDerivM.const_rule
Proof state before:
case hg
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ CDifferentiableM K fun x => pure ()
Tactic:
apply CDifferentiableM_pure
Proof state after:
case hg.hf
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ CDifferentiable K fun x => ()
Theorem: SciLean.fwdDerivM.const_rule
Proof state before:
case hg.hf
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
h :
  (fun x => y) = fun x => do
    pure ()
    y
⊢ CDifferentiable K fun x => ()
Tactic:
fun_prop
Proof state after:
no goals
Theorem: SciLean.fwdDerivM.const_rule
Proof state before:
ι : Sort ?u.8988
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
y : m Y
hy : CDifferentiableValM K y
⊢ (fun x => y) = fun x => do
    pure ()
    y
Tactic:
simp
Proof state after:
no goals
Theorem: SciLean.fwdDerivM.comp_rule
Proof state before:
ι : Sort ?u.15055
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : Y → m Z
g : X → Y
hf : CDifferentiableM K f
hg : CDifferentiable K g
⊢ (fwdDerivM K fun x => f (g x)) = fun x dx =>
    let ydy := fwdDeriv K g x dx;
    fwdDerivM K f ydy.1 ydy.2
Tactic:
conv =>
  lhs
  rw[show ((fun x => f (g x))
           =
           fun x => pure (g x) >>= f) by simp]
  rw[FwdDerivMonad.fwdDerivM_bind f (fun x => pure (g x))
       hf (FwdDerivMonad.CDifferentiableM_pure _ hg)]
  simp[FwdDerivMonad.fwdDerivM_pure g hg]
Proof state after:
no goals
Theorem: SciLean.fwdDerivM.comp_rule
Proof state before:
ι : Sort ?u.15055
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : Y → m Z
g : X → Y
hf : CDifferentiableM K f
hg : CDifferentiable K g
⊢ (fun x => f (g x)) = fun x => pure (g x) >>= f
Tactic:
simp
Proof state after:
no goals
Theorem: SciLean.fwdDerivM.let_rule
Proof state before:
ι : Sort ?u.19371
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : X → Y → m Z
g : X → Y
hf : CDifferentiableM K fun xy => f xy.1 xy.2
hg : CDifferentiable K g
⊢ (fwdDerivM K fun x =>
      let y := g x;
      f x y) =
    fun x dx =>
    let ydy := fwdDeriv K g x dx;
    fwdDerivM K (fun xy => f xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Tactic:
let f' := (fun xy : X×Y => f xy.1 xy.2)
Proof state after:
ι : Sort ?u.19371
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : X → Y → m Z
g : X → Y
hf : CDifferentiableM K fun xy => f xy.1 xy.2
hg : CDifferentiable K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
⊢ (fwdDerivM K fun x =>
      let y := g x;
      f x y) =
    fun x dx =>
    let ydy := fwdDeriv K g x dx;
    fwdDerivM K (fun xy => f xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Theorem: SciLean.fwdDerivM.let_rule
Proof state before:
ι : Sort ?u.19371
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : X → Y → m Z
g : X → Y
hf : CDifferentiableM K fun xy => f xy.1 xy.2
hg : CDifferentiable K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
⊢ (fwdDerivM K fun x =>
      let y := g x;
      f x y) =
    fun x dx =>
    let ydy := fwdDeriv K g x dx;
    fwdDerivM K (fun xy => f xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Tactic:
let g' := (fun x => (x,g x))
Proof state after:
ι : Sort ?u.19371
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : X → Y → m Z
g : X → Y
hf : CDifferentiableM K fun xy => f xy.1 xy.2
hg : CDifferentiable K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ (fwdDerivM K fun x =>
      let y := g x;
      f x y) =
    fun x dx =>
    let ydy := fwdDeriv K g x dx;
    fwdDerivM K (fun xy => f xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Theorem: SciLean.fwdDerivM.let_rule
Proof state before:
ι : Sort ?u.19371
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : X → Y → m Z
g : X → Y
hf : CDifferentiableM K fun xy => f xy.1 xy.2
hg : CDifferentiable K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ (fwdDerivM K fun x =>
      let y := g x;
      f x y) =
    fun x dx =>
    let ydy := fwdDeriv K g x dx;
    fwdDerivM K (fun xy => f xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Tactic:
have hg' : CDifferentiable K g' := by rw[show g' = (fun x => (x,g x)) by rfl]; fun_prop
Proof state after:
ι : Sort ?u.19371
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : X → Y → m Z
g : X → Y
hf : CDifferentiableM K fun xy => f xy.1 xy.2
hg : CDifferentiable K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
hg' : CDifferentiable K g'
⊢ (fwdDerivM K fun x =>
      let y := g x;
      f x y) =
    fun x dx =>
    let ydy := fwdDeriv K g x dx;
    fwdDerivM K (fun xy => f xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Theorem: SciLean.fwdDerivM.let_rule
Proof state before:
ι : Sort ?u.19371
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : X → Y → m Z
g : X → Y
hf : CDifferentiableM K fun xy => f xy.1 xy.2
hg : CDifferentiable K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
hg' : CDifferentiable K g'
⊢ (fwdDerivM K fun x =>
      let y := g x;
      f x y) =
    fun x dx =>
    let ydy := fwdDeriv K g x dx;
    fwdDerivM K (fun xy => f xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Tactic:
conv =>
  lhs
  rw[show ((fun x => f x (g x))
           =
           fun x => pure (g' x) >>= f') by simp]
  rw[fwdDerivM_bind f' (fun x => pure (g' x)) hf (CDifferentiableM_pure g' hg')]
  simp[fwdDerivM_pure (K:=K) g' hg']
  fun_trans; simp
Proof state after:
no goals
Theorem: SciLean.fwdDerivM.let_rule
Proof state before:
ι : Sort ?u.19371
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : X → Y → m Z
g : X → Y
hf : CDifferentiableM K fun xy => f xy.1 xy.2
hg : CDifferentiable K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ CDifferentiable K g'
Tactic:
rw[show g' = (fun x => (x,g x)) by rfl]
Proof state after:
ι : Sort ?u.19371
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : X → Y → m Z
g : X → Y
hf : CDifferentiableM K fun xy => f xy.1 xy.2
hg : CDifferentiable K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ CDifferentiable K fun x => (x, g x)
Theorem: SciLean.fwdDerivM.let_rule
Proof state before:
ι : Sort ?u.19371
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : X → Y → m Z
g : X → Y
hf : CDifferentiableM K fun xy => f xy.1 xy.2
hg : CDifferentiable K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ CDifferentiable K fun x => (x, g x)
Tactic:
fun_prop
Proof state after:
no goals
Theorem: SciLean.fwdDerivM.let_rule
Proof state before:
ι : Sort ?u.19371
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : X → Y → m Z
g : X → Y
hf : CDifferentiableM K fun xy => f xy.1 xy.2
hg : CDifferentiable K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
⊢ g' = fun x => (x, g x)
Tactic:
rfl
Proof state after:
no goals
Theorem: SciLean.fwdDerivM.let_rule
Proof state before:
ι : Sort ?u.19371
K : Type
inst✝⁹ : RCLike K
m : Type → Type
m' : outParam (Type → Type)
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
f : X → Y → m Z
g : X → Y
hf : CDifferentiableM K fun xy => f xy.1 xy.2
hg : CDifferentiable K g
f' : X × Y → m Z := fun xy => f xy.1 xy.2
g' : X → X × Y := fun x => (x, g x)
hg' : CDifferentiable K g'
⊢ (fun x => f x (g x)) = fun x => pure (g' x) >>= f'
Tactic:
simp
Proof state after:
no goals
Theorem: Pure.pure.arg_a0.CDifferentiableM_rule
Proof state before:
ι : Sort ?u.25588
K : Type
inst✝⁹ : RCLike K
m m' : Type → Type
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
a0 : X → Y
ha0 : CDifferentiable K a0
⊢ CDifferentiableM K fun x => pure (a0 x)
Tactic:
apply FwdDerivMonad.CDifferentiableM_pure a0 ha0
Proof state after:
no goals
Theorem: Pure.pure.arg_a0.fwdDerivM_rule
Proof state before:
ι : Sort ?u.26156
K : Type
inst✝⁹ : RCLike K
m m' : Type → Type
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
a0 : X → Y
ha0 : CDifferentiable K a0
⊢ (fwdDerivM K fun x => pure (a0 x)) = fun x dx => pure (fwdDeriv K a0 x dx)
Tactic:
apply FwdDerivMonad.fwdDerivM_pure a0 ha0
Proof state after:
no goals
Theorem: Pure.pure.arg.CDifferentiableValM_rule
Proof state before:
ι : Sort ?u.26884
K : Type
inst✝⁹ : RCLike K
m m' : Type → Type
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
x : X
⊢ CDifferentiableValM K (pure x)
Tactic:
unfold CDifferentiableValM
Proof state after:
ι : Sort ?u.26884
K : Type
inst✝⁹ : RCLike K
m m' : Type → Type
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
x : X
⊢ CDifferentiableM K fun x_1 => pure x
Theorem: Pure.pure.arg.CDifferentiableValM_rule
Proof state before:
ι : Sort ?u.26884
K : Type
inst✝⁹ : RCLike K
m m' : Type → Type
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
x : X
⊢ CDifferentiableM K fun x_1 => pure x
Tactic:
apply FwdDerivMonad.CDifferentiableM_pure
Proof state after:
case hf
ι : Sort ?u.26884
K : Type
inst✝⁹ : RCLike K
m m' : Type → Type
inst✝⁸ : Monad m
inst✝⁷ : Monad m'
inst✝⁶ : FwdDerivMonad K m m'
inst✝⁵ : LawfulMonad m
inst✝⁴ : LawfulMonad m'
X : Type
inst✝³ : Vec K X
Y : Type
inst✝² : Vec K Y
Z : Type
inst✝¹ : Vec K Z
E : ι → Type
inst✝ : (i : ι) → Vec K (E i)
x : X
⊢ CDifferentiable K fun x_1 => x