internlm/Lean-Github huggingface dataset:
Theorem: Pure.pure.arg.CDifferentiableValM_rule
Proof state before:
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
Tactic:
fun_prop
Proof state after:
no goals
Theorem: Pure.pure.arg.fwdDerivValM_rule
Proof state before:
ι : Sort ?u.27390
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
⊢ fwdDerivValM K (pure x) = pure (x, 0)
Tactic:
unfold fwdDerivValM
Proof state after:
ι : Sort ?u.27390
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
⊢ fwdDerivM K (fun x_1 => pure x) () () = pure (x, 0)
Theorem: Pure.pure.arg.fwdDerivValM_rule
Proof state before:
ι : Sort ?u.27390
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
⊢ fwdDerivM K (fun x_1 => pure x) () () = pure (x, 0)
Tactic:
rw[FwdDerivMonad.fwdDerivM_pure]
Proof state after:
ι : Sort ?u.27390
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
⊢ (fun x_1 dx => pure (fwdDeriv K (fun x_2 => x) x_1 dx)) () () = pure (x, 0)

case hf
ι : Sort ?u.27390
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
Theorem: Pure.pure.arg.fwdDerivValM_rule
Proof state before:
ι : Sort ?u.27390
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
⊢ (fun x_1 dx => pure (fwdDeriv K (fun x_2 => x) x_1 dx)) () () = pure (x, 0)

case hf
ι : Sort ?u.27390
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
Tactic:
fun_trans
Proof state after:
case hf
ι : Sort ?u.27390
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
Theorem: Pure.pure.arg.fwdDerivValM_rule
Proof state before:
case hf
ι : Sort ?u.27390
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
Tactic:
fun_prop
Proof state after:
no goals
Theorem: Bind.bind.arg_a0a1.CDifferentiableM_rule
Proof state before:
ι : Sort ?u.29038
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
⊢ CDifferentiableM K fun x => a0 x >>= a1 x
Tactic:
let g := fun x => do
  let y ← a0 x
  pure (x,y)
Proof state after:
ι : Sort ?u.29038
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
⊢ CDifferentiableM K fun x => a0 x >>= a1 x
Theorem: Bind.bind.arg_a0a1.CDifferentiableM_rule
Proof state before:
ι : Sort ?u.29038
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
⊢ CDifferentiableM K fun x => a0 x >>= a1 x
Tactic:
let f := fun xy : X×Y => a1 xy.1 xy.2
Proof state after:
ι : Sort ?u.29038
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
⊢ CDifferentiableM K fun x => a0 x >>= a1 x
Theorem: Bind.bind.arg_a0a1.CDifferentiableM_rule
Proof state before:
ι : Sort ?u.29038
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
⊢ CDifferentiableM K fun x => a0 x >>= a1 x
Tactic:
rw[show (fun x => Bind.bind (a0 x) (a1 x))
        =
        fun x => g x >>= f by simp[f,g]]
Proof state after:
ι : Sort ?u.29038
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
⊢ CDifferentiableM K fun x => g x >>= f
Theorem: Bind.bind.arg_a0a1.CDifferentiableM_rule
Proof state before:
ι : Sort ?u.29038
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
⊢ CDifferentiableM K fun x => g x >>= f
Tactic:
have hg : CDifferentiableM K (fun x => do let y ← a0 x; pure (x,y)) :=
  by apply FwdDerivMonad.CDifferentiableM_pair a0 ha0
Proof state after:
ι : Sort ?u.29038
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
hg :
  CDifferentiableM K fun x => do
    let y ← a0 x
    pure (x, y)
⊢ CDifferentiableM K fun x => g x >>= f
Theorem: Bind.bind.arg_a0a1.CDifferentiableM_rule
Proof state before:
ι : Sort ?u.29038
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
hg :
  CDifferentiableM K fun x => do
    let y ← a0 x
    pure (x, y)
⊢ CDifferentiableM K fun x => g x >>= f
Tactic:
have hf : CDifferentiableM K f := by fun_prop
Proof state after:
ι : Sort ?u.29038
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
hg :
  CDifferentiableM K fun x => do
    let y ← a0 x
    pure (x, y)
hf : CDifferentiableM K f
⊢ CDifferentiableM K fun x => g x >>= f
Theorem: Bind.bind.arg_a0a1.CDifferentiableM_rule
Proof state before:
ι : Sort ?u.29038
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
hg :
  CDifferentiableM K fun x => do
    let y ← a0 x
    pure (x, y)
hf : CDifferentiableM K f
⊢ CDifferentiableM K fun x => g x >>= f
Tactic:
apply FwdDerivMonad.CDifferentiableM_bind _ _ hf hg
Proof state after:
no goals
Theorem: Bind.bind.arg_a0a1.CDifferentiableM_rule
Proof state before:
ι : Sort ?u.29038
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
⊢ (fun x => a0 x >>= a1 x) = fun x => g x >>= f
Tactic:
simp[f,g]
Proof state after:
no goals
Theorem: Bind.bind.arg_a0a1.CDifferentiableM_rule
Proof state before:
ι : Sort ?u.29038
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
⊢ CDifferentiableM K fun x => do
    let y ← a0 x
    pure (x, y)
Tactic:
apply FwdDerivMonad.CDifferentiableM_pair a0 ha0
Proof state after:
no goals
Theorem: Bind.bind.arg_a0a1.CDifferentiableM_rule
Proof state before:
ι : Sort ?u.29038
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
hg :
  CDifferentiableM K fun x => do
    let y ← a0 x
    pure (x, y)
⊢ CDifferentiableM K f
Tactic:
fun_prop
Proof state after:
no goals
Theorem: Bind.bind.arg_a0a1.fwdDerivM_rule
Proof state before:
ι : Sort ?u.34852
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
⊢ (fwdDerivM K fun x => a0 x >>= a1 x) = fun x dx => do
    let ydy ← fwdDerivM K a0 x dx
    fwdDerivM K (fun xy => a1 xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Tactic:
let g := fun x => do
  let y ← a0 x
  pure (x,y)
Proof state after:
ι : Sort ?u.34852
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
⊢ (fwdDerivM K fun x => a0 x >>= a1 x) = fun x dx => do
    let ydy ← fwdDerivM K a0 x dx
    fwdDerivM K (fun xy => a1 xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Theorem: Bind.bind.arg_a0a1.fwdDerivM_rule
Proof state before:
ι : Sort ?u.34852
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
⊢ (fwdDerivM K fun x => a0 x >>= a1 x) = fun x dx => do
    let ydy ← fwdDerivM K a0 x dx
    fwdDerivM K (fun xy => a1 xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Tactic:
let f := fun xy : X×Y => a1 xy.1 xy.2
Proof state after:
ι : Sort ?u.34852
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
⊢ (fwdDerivM K fun x => a0 x >>= a1 x) = fun x dx => do
    let ydy ← fwdDerivM K a0 x dx
    fwdDerivM K (fun xy => a1 xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Theorem: Bind.bind.arg_a0a1.fwdDerivM_rule
Proof state before:
ι : Sort ?u.34852
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
⊢ (fwdDerivM K fun x => a0 x >>= a1 x) = fun x dx => do
    let ydy ← fwdDerivM K a0 x dx
    fwdDerivM K (fun xy => a1 xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Tactic:
rw[show (fun x => Bind.bind (a0 x) (a1 x))
        =
        fun x => g x >>= f by simp[f,g]]
Proof state after:
ι : Sort ?u.34852
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
⊢ (fwdDerivM K fun x => g x >>= f) = fun x dx => do
    let ydy ← fwdDerivM K a0 x dx
    fwdDerivM K (fun xy => a1 xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Theorem: Bind.bind.arg_a0a1.fwdDerivM_rule
Proof state before:
ι : Sort ?u.34852
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
⊢ (fwdDerivM K fun x => g x >>= f) = fun x dx => do
    let ydy ← fwdDerivM K a0 x dx
    fwdDerivM K (fun xy => a1 xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Tactic:
have hg : CDifferentiableM K (fun x => do let y ← a0 x; pure (x,y)) :=
  by apply FwdDerivMonad.CDifferentiableM_pair a0 ha0
Proof state after:
ι : Sort ?u.34852
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
hg :
  CDifferentiableM K fun x => do
    let y ← a0 x
    pure (x, y)
⊢ (fwdDerivM K fun x => g x >>= f) = fun x dx => do
    let ydy ← fwdDerivM K a0 x dx
    fwdDerivM K (fun xy => a1 xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Theorem: Bind.bind.arg_a0a1.fwdDerivM_rule
Proof state before:
ι : Sort ?u.34852
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
hg :
  CDifferentiableM K fun x => do
    let y ← a0 x
    pure (x, y)
⊢ (fwdDerivM K fun x => g x >>= f) = fun x dx => do
    let ydy ← fwdDerivM K a0 x dx
    fwdDerivM K (fun xy => a1 xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Tactic:
have hf : CDifferentiableM K f := by fun_prop
Proof state after:
ι : Sort ?u.34852
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
hg :
  CDifferentiableM K fun x => do
    let y ← a0 x
    pure (x, y)
hf : CDifferentiableM K f
⊢ (fwdDerivM K fun x => g x >>= f) = fun x dx => do
    let ydy ← fwdDerivM K a0 x dx
    fwdDerivM K (fun xy => a1 xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Theorem: Bind.bind.arg_a0a1.fwdDerivM_rule
Proof state before:
ι : Sort ?u.34852
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
hg :
  CDifferentiableM K fun x => do
    let y ← a0 x
    pure (x, y)
hf : CDifferentiableM K f
⊢ (fwdDerivM K fun x => g x >>= f) = fun x dx => do
    let ydy ← fwdDerivM K a0 x dx
    fwdDerivM K (fun xy => a1 xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Tactic:
rw [FwdDerivMonad.fwdDerivM_bind _ _ hf hg]
Proof state after:
ι : Sort ?u.34852
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
hg :
  CDifferentiableM K fun x => do
    let y ← a0 x
    pure (x, y)
hf : CDifferentiableM K f
⊢ (fun x dx => do
      let ydy ←
        fwdDerivM K
            (fun x => do
              let y ← a0 x
              pure (x, y))
            x dx
      fwdDerivM K f ydy.1 ydy.2) =
    fun x dx => do
    let ydy ← fwdDerivM K a0 x dx
    fwdDerivM K (fun xy => a1 xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Theorem: Bind.bind.arg_a0a1.fwdDerivM_rule
Proof state before:
ι : Sort ?u.34852
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
hg :
  CDifferentiableM K fun x => do
    let y ← a0 x
    pure (x, y)
hf : CDifferentiableM K f
⊢ (fun x dx => do
      let ydy ←
        fwdDerivM K
            (fun x => do
              let y ← a0 x
              pure (x, y))
            x dx
      fwdDerivM K f ydy.1 ydy.2) =
    fun x dx => do
    let ydy ← fwdDerivM K a0 x dx
    fwdDerivM K (fun xy => a1 xy.1 xy.2) (x, ydy.1) (dx, ydy.2)
Tactic:
simp [FwdDerivMonad.fwdDerivM_pair a0 ha0]
Proof state after:
no goals
Theorem: Bind.bind.arg_a0a1.fwdDerivM_rule
Proof state before:
ι : Sort ?u.34852
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 → m Y
a1 : X → Y → m Z
ha0 : CDifferentiableM K a0
ha1 : CDifferentiableM K fun xy => a1 xy.1 xy.2
g : X → m (X × Y) :=
  fun x => do
    let y ← a0 x
    pure (x, y)
f : X × Y → m Z := fun xy => a1 xy.1 xy.2
⊢ (fun x => a0 x >>= a1 x) = fun x => g x >>= f
Tactic:
simp[f,g]
Proof state after:
no goals