ruc-ai4math/mathlib_handler_benchmark_410 huggingface dataset:
Theorem: Polynomial.degree_pow_le_of_le
File: Mathlib/Algebra/Polynomial/Degree/Definitions.lean

Proof steps:
state_before: R : Type u
S : Type v
a✝ b✝ c d : R
n m : ℕ
inst✝ : Semiring R
p✝ p q : R[X]
ι : Type u_1
a : WithBot ℕ
b : ℕ
hp : p.degree ≤ a
⊢ (p ^ b).degree ≤ ↑b * a
state_after: no goals
tactic: induction b with
  | zero => simp [degree_one_le]
  | succ n hn =>
      rw [Nat.cast_succ, add_mul, one_mul, pow_succ]
      exact degree_mul_le_of_le hn hp
Theorem: MonoidAlgebra.support_single_mul_subset
File: Mathlib/Algebra/MonoidAlgebra/Support.lean

Proof steps:
state_before: k : Type u₁
G : Type u₂
inst✝² : Semiring k
inst✝¹ : DecidableEq G
inst✝ : Mul G
f : MonoidAlgebra k G
r : k
a : G
⊢ image₂ (fun x x_1 => x * x_1) {a} f.support ⊆ image (fun x => a * x) f.support
state_after: no goals
tactic: rw [Finset.image₂_singleton_left]
Theorem: Nat.pow_succ_le_ascFactorial
File: Mathlib/Data/Nat/Factorial/Basic.lean

Proof steps:
state_before: n : ℕ
⊢ n ^ 0 ≤ n.ascFactorial 0
state_after: no goals
tactic: rw [ascFactorial_zero, Nat.pow_zero]
state_before: n k : ℕ
⊢ n ^ (k + 1) ≤ n.ascFactorial (k + 1)
state_after: n k : ℕ
⊢ n * n ^ k ≤ n * n.succ.ascFactorial k
tactic: rw [Nat.pow_succ, Nat.mul_comm, ascFactorial_succ, ← succ_ascFactorial]
state_before: n k : ℕ
⊢ n * n ^ k ≤ n * n.succ.ascFactorial k
state_after: no goals
tactic: exact Nat.mul_le_mul (Nat.le_refl n)
      (Nat.le_trans (Nat.pow_le_pow_left (le_succ n) k) (pow_succ_le_ascFactorial n.succ k))
Theorem: Finset.sum_fin_eq_sum_range
File: Mathlib/Data/Fintype/BigOperators.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : CommMonoid β
n : ℕ
c : Fin n → β
⊢ ∏ i : Fin n, c i = ∏ i ∈ range n, if h : i < n then c ⟨i, h⟩ else 1
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : CommMonoid β
n : ℕ
c : Fin n → β
⊢ ∀ x ∈ univ, c x = if h : ↑x < n then c ⟨↑x, h⟩ else 1
tactic: rw [← Fin.prod_univ_eq_prod_range, Finset.prod_congr rfl]
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : CommMonoid β
n : ℕ
c : Fin n → β
⊢ ∀ x ∈ univ, c x = if h : ↑x < n then c ⟨↑x, h⟩ else 1
state_after: case mk
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : CommMonoid β
n : ℕ
c : Fin n → β
i : ℕ
hi : i < n
a✝ : ⟨i, hi⟩ ∈ univ
⊢ c ⟨i, hi⟩ = if h : ↑⟨i, hi⟩ < n then c ⟨↑⟨i, hi⟩, h⟩ else 1
tactic: rintro ⟨i, hi⟩ _
state_before: case mk
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : CommMonoid β
n : ℕ
c : Fin n → β
i : ℕ
hi : i < n
a✝ : ⟨i, hi⟩ ∈ univ
⊢ c ⟨i, hi⟩ = if h : ↑⟨i, hi⟩ < n then c ⟨↑⟨i, hi⟩, h⟩ else 1
state_after: no goals
tactic: simp only [hi, dif_pos]
Theorem: ContinuousLinearMap.norm_snd
File: Mathlib/Analysis/NormedSpace/OperatorNorm/Prod.lean

Proof steps:
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁵ : NontriviallyNormedField 𝕜
inst✝⁴ : SeminormedAddCommGroup E
inst✝³ : NormedSpace 𝕜 E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace 𝕜 F
inst✝ : Nontrivial F
⊢ ‖snd 𝕜 E F‖ = 1
state_after: 𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁵ : NontriviallyNormedField 𝕜
inst✝⁴ : SeminormedAddCommGroup E
inst✝³ : NormedSpace 𝕜 E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace 𝕜 F
inst✝ : Nontrivial F
⊢ 1 ≤ ‖snd 𝕜 E F‖
tactic: refine le_antisymm (norm_snd_le ..) ?_
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁵ : NontriviallyNormedField 𝕜
inst✝⁴ : SeminormedAddCommGroup E
inst✝³ : NormedSpace 𝕜 E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace 𝕜 F
inst✝ : Nontrivial F
⊢ 1 ≤ ‖snd 𝕜 E F‖
state_after: 𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁵ : NontriviallyNormedField 𝕜
inst✝⁴ : SeminormedAddCommGroup E
inst✝³ : NormedSpace 𝕜 E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace 𝕜 F
inst✝ : Nontrivial F
f : F
hf : f ≠ 0
⊢ 1 ≤ ‖snd 𝕜 E F‖
tactic: let ⟨f, hf⟩ := exists_ne (0 : F)
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁵ : NontriviallyNormedField 𝕜
inst✝⁴ : SeminormedAddCommGroup E
inst✝³ : NormedSpace 𝕜 E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace 𝕜 F
inst✝ : Nontrivial F
f : F
hf : f ≠ 0
⊢ 1 ≤ ‖snd 𝕜 E F‖
state_after: 𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁵ : NontriviallyNormedField 𝕜
inst✝⁴ : SeminormedAddCommGroup E
inst✝³ : NormedSpace 𝕜 E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace 𝕜 F
inst✝ : Nontrivial F
f : F
hf : f ≠ 0
this : ‖f‖ ≤ ‖snd 𝕜 E F‖ * max ‖0‖ ‖f‖
⊢ 1 ≤ ‖snd 𝕜 E F‖
tactic: have : ‖f‖ ≤ _ * max ‖(0 : E)‖ ‖f‖ := (snd 𝕜 E F).le_opNorm (0, f)
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁵ : NontriviallyNormedField 𝕜
inst✝⁴ : SeminormedAddCommGroup E
inst✝³ : NormedSpace 𝕜 E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace 𝕜 F
inst✝ : Nontrivial F
f : F
hf : f ≠ 0
this : ‖f‖ ≤ ‖snd 𝕜 E F‖ * max ‖0‖ ‖f‖
⊢ 1 ≤ ‖snd 𝕜 E F‖
state_after: 𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁵ : NontriviallyNormedField 𝕜
inst✝⁴ : SeminormedAddCommGroup E
inst✝³ : NormedSpace 𝕜 E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace 𝕜 F
inst✝ : Nontrivial F
f : F
hf : f ≠ 0
this : ‖f‖ ≤ ‖snd 𝕜 E F‖ * ‖f‖
⊢ 1 ≤ ‖snd 𝕜 E F‖
tactic: rw [norm_zero, max_eq_right (norm_nonneg f)] at this
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁵ : NontriviallyNormedField 𝕜
inst✝⁴ : SeminormedAddCommGroup E
inst✝³ : NormedSpace 𝕜 E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace 𝕜 F
inst✝ : Nontrivial F
f : F
hf : f ≠ 0
this : ‖f‖ ≤ ‖snd 𝕜 E F‖ * ‖f‖
⊢ 1 ≤ ‖snd 𝕜 E F‖
state_after: no goals
tactic: rwa [← mul_le_mul_iff_of_pos_right (norm_pos_iff.mpr hf), one_mul]
Theorem: finRotate_last'
File: Mathlib/Logic/Equiv/Fin.lean

Proof steps:
state_before: m n : ℕ
⊢ n < n + 1
state_after: no goals
tactic: omega
state_before: m n : ℕ
⊢ (finRotate (n + 1)) ⟨n, ⋯⟩ = ⟨0, ⋯⟩
state_after: m n : ℕ
⊢ Fin.cast ⋯ (finAddFlip ⟨n, ⋯⟩) = 0
tactic: dsimp [finRotate_succ]
state_before: m n : ℕ
⊢ Fin.cast ⋯ (finAddFlip ⟨n, ⋯⟩) = 0
state_after: m n : ℕ
⊢ Fin.cast ⋯ ⟨n - n, ⋯⟩ = 0
tactic: rw [finAddFlip_apply_mk_right le_rfl]
state_before: m n : ℕ
⊢ Fin.cast ⋯ ⟨n - n, ⋯⟩ = 0
state_after: no goals
tactic: simp
Theorem: RingHom.map_ite_zero_one
File: Mathlib/Algebra/Ring/Hom/Defs.lean

Proof steps:
state_before: F✝ : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
x✝¹ : NonAssocSemiring α
x✝ : NonAssocSemiring β
f✝ : α →+* β
x y : α
F : Type u_5
inst✝² : FunLike F α β
inst✝¹ : RingHomClass F α β
f : F
p : Prop
inst✝ : Decidable p
⊢ f (if p then 0 else 1) = if p then 0 else 1
state_after: no goals
tactic: split_ifs with h <;> simp [h]
Theorem: TendstoUniformlyOn.prod_map
File: Mathlib/Topology/UniformSpace/UniformConvergence.lean

Proof steps:
state_before: α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s'✝ : Set α
x : α
p : Filter ι
p'✝ : Filter α
g : ι → α
ι' : Type u_1
α' : Type u_2
β' : Type u_3
inst✝ : UniformSpace β'
F' : ι' → α' → β'
f' : α' → β'
p' : Filter ι'
s' : Set α'
h : TendstoUniformlyOn F f p s
h' : TendstoUniformlyOn F' f' p' s'
⊢ TendstoUniformlyOn (fun i => Prod.map (F i.1) (F' i.2)) (Prod.map f f') (p ×ˢ p') (s ×ˢ s')
state_after: α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s'✝ : Set α
x : α
p : Filter ι
p'✝ : Filter α
g : ι → α
ι' : Type u_1
α' : Type u_2
β' : Type u_3
inst✝ : UniformSpace β'
F' : ι' → α' → β'
f' : α' → β'
p' : Filter ι'
s' : Set α'
h : TendstoUniformlyOnFilter F f p (𝓟 s)
h' : TendstoUniformlyOnFilter F' f' p' (𝓟 s')
⊢ TendstoUniformlyOnFilter (fun i => Prod.map (F i.1) (F' i.2)) (Prod.map f f') (p ×ˢ p') (𝓟 (s ×ˢ s'))
tactic: rw [tendstoUniformlyOn_iff_tendstoUniformlyOnFilter] at h h' ⊢
state_before: α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s'✝ : Set α
x : α
p : Filter ι
p'✝ : Filter α
g : ι → α
ι' : Type u_1
α' : Type u_2
β' : Type u_3
inst✝ : UniformSpace β'
F' : ι' → α' → β'
f' : α' → β'
p' : Filter ι'
s' : Set α'
h : TendstoUniformlyOnFilter F f p (𝓟 s)
h' : TendstoUniformlyOnFilter F' f' p' (𝓟 s')
⊢ TendstoUniformlyOnFilter (fun i => Prod.map (F i.1) (F' i.2)) (Prod.map f f') (p ×ˢ p') (𝓟 (s ×ˢ s'))
state_after: no goals
tactic: simpa only [prod_principal_principal] using h.prod_map h'
Theorem: Nat.multinomial_insert_one
File: Mathlib/Data/Nat/Choose/Multinomial.lean

Proof steps:
state_before: α : Type u_1
s : Finset α
f : α → ℕ
a b : α
n : ℕ
inst✝ : DecidableEq α
h : a ∉ s
h₁ : f a = 1
⊢ multinomial (insert a s) f = (s.sum f).succ * multinomial s f
state_after: α : Type u_1
s : Finset α
f : α → ℕ
a b : α
n : ℕ
inst✝ : DecidableEq α
h : a ∉ s
h₁ : f a = 1
⊢ (∑ i ∈ insert a s, f i)! / ∏ i ∈ insert a s, (f i)! = (s.sum f).succ * ((∑ i ∈ s, f i)! / ∏ i ∈ s, (f i)!)
tactic: simp only [multinomial, one_mul, factorial]
state_before: α : Type u_1
s : Finset α
f : α → ℕ
a b : α
n : ℕ
inst✝ : DecidableEq α
h : a ∉ s
h₁ : f a = 1
⊢ (∑ i ∈ insert a s, f i)! / ∏ i ∈ insert a s, (f i)! = (s.sum f).succ * ((∑ i ∈ s, f i)! / ∏ i ∈ s, (f i)!)
state_after: α : Type u_1
s : Finset α
f : α → ℕ
a b : α
n : ℕ
inst✝ : DecidableEq α
h : a ∉ s
h₁ : f a = 1
⊢ (∑ x ∈ s, f x + 1) * (∑ x ∈ s, f x)! / (1! * ∏ x ∈ s, (f x)!) = (s.sum f).succ * ((∑ i ∈ s, f i)! / ∏ i ∈ s, (f i)!)
tactic: rw [Finset.sum_insert h, Finset.prod_insert h, h₁, add_comm, ← succ_eq_add_one, factorial_succ]
state_before: α : Type u_1
s : Finset α
f : α → ℕ
a b : α
n : ℕ
inst✝ : DecidableEq α
h : a ∉ s
h₁ : f a = 1
⊢ (∑ x ∈ s, f x + 1) * (∑ x ∈ s, f x)! / (1! * ∏ x ∈ s, (f x)!) = (s.sum f).succ * ((∑ i ∈ s, f i)! / ∏ i ∈ s, (f i)!)
state_after: α : Type u_1
s : Finset α
f : α → ℕ
a b : α
n : ℕ
inst✝ : DecidableEq α
h : a ∉ s
h₁ : f a = 1
⊢ (∑ x ∈ s, f x + 1) * (∑ x ∈ s, f x)! / ∏ x ∈ s, (f x)! = (s.sum f).succ * ((∑ x ∈ s, f x)! / ∏ x ∈ s, (f x)!)
tactic: simp only [factorial_one, one_mul, Function.comp_apply, factorial, mul_one, ← one_eq_succ_zero]
state_before: α : Type u_1
s : Finset α
f : α → ℕ
a b : α
n : ℕ
inst✝ : DecidableEq α
h : a ∉ s
h₁ : f a = 1
⊢ (∑ x ∈ s, f x + 1) * (∑ x ∈ s, f x)! / ∏ x ∈ s, (f x)! = (s.sum f).succ * ((∑ x ∈ s, f x)! / ∏ x ∈ s, (f x)!)
state_after: no goals
tactic: rw [Nat.mul_div_assoc _ (prod_factorial_dvd_factorial_sum _ _)]
Theorem: Path.range_reparam
File: Mathlib/Topology/Connected/PathConnected.lean

Proof steps:
state_before: X : Type u_1
Y : Type u_2
inst✝¹ : TopologicalSpace X
inst✝ : TopologicalSpace Y
x y z : X
ι : Type u_3
γ✝ γ : Path x y
f : ↑I → ↑I
hfcont : Continuous f
hf₀ : f 0 = 0
hf₁ : f 1 = 1
⊢ range ⇑(γ.reparam f hfcont hf₀ hf₁) = range ⇑γ
state_after: X : Type u_1
Y : Type u_2
inst✝¹ : TopologicalSpace X
inst✝ : TopologicalSpace Y
x y z : X
ι : Type u_3
γ✝ γ : Path x y
f : ↑I → ↑I
hfcont : Continuous f
hf₀ : f 0 = 0
hf₁ : f 1 = 1
⊢ range (⇑γ ∘ f) = range ⇑γ
tactic: change range (γ ∘ f) = range γ
state_before: X : Type u_1
Y : Type u_2
inst✝¹ : TopologicalSpace X
inst✝ : TopologicalSpace Y
x y z : X
ι : Type u_3
γ✝ γ : Path x y
f : ↑I → ↑I
hfcont : Continuous f
hf₀ : f 0 = 0
hf₁ : f 1 = 1
this : range f = univ
⊢ range (⇑γ ∘ f) = range ⇑γ
state_after: no goals
tactic: rw [range_comp, this, image_univ]
Theorem: PowerSeries.degree_trunc_lt
File: Mathlib/RingTheory/PowerSeries/Trunc.lean

Proof steps:
state_before: R : Type u_1
inst✝ : Semiring R
f : R⟦X⟧
n : ℕ
⊢ (trunc n f).degree < ↑n
state_after: R : Type u_1
inst✝ : Semiring R
f : R⟦X⟧
n : ℕ
⊢ ∀ (m : ℕ), n ≤ m → (trunc n f).coeff m = 0
tactic: rw [degree_lt_iff_coeff_zero]
state_before: R : Type u_1
inst✝ : Semiring R
f : R⟦X⟧
n : ℕ
⊢ ∀ (m : ℕ), n ≤ m → (trunc n f).coeff m = 0
state_after: R : Type u_1
inst✝ : Semiring R
f : R⟦X⟧
n m✝ : ℕ
a✝ : n ≤ m✝
⊢ (trunc n f).coeff m✝ = 0
tactic: intros
state_before: R : Type u_1
inst✝ : Semiring R
f : R⟦X⟧
n m✝ : ℕ
a✝ : n ≤ m✝
⊢ (trunc n f).coeff m✝ = 0
state_after: R : Type u_1
inst✝ : Semiring R
f : R⟦X⟧
n m✝ : ℕ
a✝ : n ≤ m✝
⊢ (if m✝ < n then (coeff R m✝) f else 0) = 0
tactic: rw [coeff_trunc]
state_before: R : Type u_1
inst✝ : Semiring R
f : R⟦X⟧
n m✝ : ℕ
a✝ : n ≤ m✝
⊢ (if m✝ < n then (coeff R m✝) f else 0) = 0
state_after: case pos
R : Type u_1
inst✝ : Semiring R
f : R⟦X⟧
n m✝ : ℕ
a✝ : n ≤ m✝
h : m✝ < n
⊢ (coeff R m✝) f = 0

case neg
R : Type u_1
inst✝ : Semiring R
f : R⟦X⟧
n m✝ : ℕ
a✝ : n ≤ m✝
h : ¬m✝ < n
⊢ 0 = 0
tactic: split_ifs with h
Theorem: Dilation.antilipschitz
File: Mathlib/Topology/MetricSpace/Dilation.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
F : Type u_4
G : Type u_5
inst✝⁶ : PseudoEMetricSpace α
inst✝⁵ : PseudoEMetricSpace β
inst✝⁴ : PseudoEMetricSpace γ
inst✝³ : FunLike F α β
inst✝² : DilationClass F α β
inst✝¹ : FunLike G β γ
inst✝ : DilationClass G β γ
f : F
g : G
x✝ y✝ z : α
s : Set α
x y : α
⊢ edist x y ≤ ↑(ratio f)⁻¹ * edist (f x) (f y)
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
F : Type u_4
G : Type u_5
inst✝⁶ : PseudoEMetricSpace α
inst✝⁵ : PseudoEMetricSpace β
inst✝⁴ : PseudoEMetricSpace γ
inst✝³ : FunLike F α β
inst✝² : DilationClass F α β
inst✝¹ : FunLike G β γ
inst✝ : DilationClass G β γ
f : F
g : G
x✝ y✝ z : α
s : Set α
x y : α
hr : ratio f ≠ 0
⊢ edist x y ≤ ↑(ratio f)⁻¹ * edist (f x) (f y)
tactic: have hr : ratio f ≠ 0 := ratio_ne_zero f
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
F : Type u_4
G : Type u_5
inst✝⁶ : PseudoEMetricSpace α
inst✝⁵ : PseudoEMetricSpace β
inst✝⁴ : PseudoEMetricSpace γ
inst✝³ : FunLike F α β
inst✝² : DilationClass F α β
inst✝¹ : FunLike G β γ
inst✝ : DilationClass G β γ
f : F
g : G
x✝ y✝ z : α
s : Set α
x y : α
hr : ratio f ≠ 0
⊢ edist x y ≤ ↑(ratio f)⁻¹ * edist (f x) (f y)
state_after: no goals
tactic: exact mod_cast
    (ENNReal.mul_le_iff_le_inv (ENNReal.coe_ne_zero.2 hr) ENNReal.coe_ne_top).1 (edist_eq f x y).ge
Theorem: RelSeries.head_smash
File: Mathlib/Order/RelSeries.lean

Proof steps:
state_before: α : Type u_1
r : Rel α α
β : Type u_2
s : Rel β β
p q : RelSeries r
h : p.last = q.head
⊢ (p.smash q h).head = p.head
state_after: α : Type u_1
r : Rel α α
β : Type u_2
s : Rel β β
p q : RelSeries r
h : p.last = q.head
⊢ { length := p.length + q.length,
          toFun := fun i => if H : ↑i < p.length then p.toFun ⟨↑i, ⋯⟩ else q.toFun ⟨↑i - p.length, ⋯⟩, step := ⋯ }.toFun
      0 =
    p.toFun 0
tactic: delta head smash
state_before: α : Type u_1
r : Rel α α
β : Type u_2
s : Rel β β
p q : RelSeries r
h : p.last = q.head
⊢ { length := p.length + q.length,
          toFun := fun i => if H : ↑i < p.length then p.toFun ⟨↑i, ⋯⟩ else q.toFun ⟨↑i - p.length, ⋯⟩, step := ⋯ }.toFun
      0 =
    p.toFun 0
state_after: α : Type u_1
r : Rel α α
β : Type u_2
s : Rel β β
p q : RelSeries r
h : p.last = q.head
⊢ p.length = 0 → q.toFun 0 = p.toFun 0
tactic: simp only [Fin.val_zero, Fin.zero_eta, zero_le, tsub_eq_zero_of_le, dite_eq_ite,
    ite_eq_left_iff, not_lt, nonpos_iff_eq_zero]
state_before: α : Type u_1
r : Rel α α
β : Type u_2
s : Rel β β
p q : RelSeries r
h : p.last = q.head
⊢ p.length = 0 → q.toFun 0 = p.toFun 0
state_after: α : Type u_1
r : Rel α α
β : Type u_2
s : Rel β β
p q : RelSeries r
h : p.last = q.head
H : p.length = 0
⊢ q.toFun 0 = p.toFun 0
tactic: intro H
state_before: α : Type u_1
r : Rel α α
β : Type u_2
s : Rel β β
p q : RelSeries r
h : p.last = q.head
H : p.length = 0
⊢ q.toFun 0 = p.toFun 0
state_after: case h.e'_3
α : Type u_1
r : Rel α α
β : Type u_2
s : Rel β β
p q : RelSeries r
h : p.last = q.head
H : p.length = 0
⊢ p.toFun 0 = p.last
tactic: convert h.symm
state_before: case h.e'_3
α : Type u_1
r : Rel α α
β : Type u_2
s : Rel β β
p q : RelSeries r
h : p.last = q.head
H : p.length = 0
⊢ p.toFun 0 = p.last
state_after: case h.e'_3.e_a
α : Type u_1
r : Rel α α
β : Type u_2
s : Rel β β
p q : RelSeries r
h : p.last = q.head
H : p.length = 0
⊢ 0 = Fin.last p.length
tactic: congr
state_before: case h.e'_3.e_a
α : Type u_1
r : Rel α α
β : Type u_2
s : Rel β β
p q : RelSeries r
h : p.last = q.head
H : p.length = 0
⊢ 0 = Fin.last p.length
state_after: no goals
tactic: aesop
Theorem: Filter.EventuallyEq.of_eventually_mem_of_forall_separating_mem_iff
File: Mathlib/Order/Filter/CountableSeparatingOn.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
l : Filter α
inst✝ : CountableInterFilter l
f g : α → β
p : Set β → Prop
s : Set β
h' : HasCountableSeparatingOn β p s
hf : ∀ᶠ (x : α) in l, f x ∈ s
hg : ∀ᶠ (x : α) in l, g x ∈ s
h : ∀ (U : Set β), p U → ∀ᶠ (x : α) in l, f x ∈ U ↔ g x ∈ U
⊢ f =ᶠ[l] g
state_after: case intro.intro.intro
α : Type u_1
β : Type u_2
l : Filter α
inst✝ : CountableInterFilter l
f g : α → β
p : Set β → Prop
s : Set β
h' : HasCountableSeparatingOn β p s
hf : ∀ᶠ (x : α) in l, f x ∈ s
hg : ∀ᶠ (x : α) in l, g x ∈ s
h : ∀ (U : Set β), p U → ∀ᶠ (x : α) in l, f x ∈ U ↔ g x ∈ U
S : Set (Set β)
hSc : S.Countable
hSp : ∀ s ∈ S, p s
hS : ∀ x ∈ s, ∀ y ∈ s, (∀ s ∈ S, x ∈ s ↔ y ∈ s) → x = y
⊢ f =ᶠ[l] g
tactic: rcases h'.1 with ⟨S, hSc, hSp, hS⟩
state_before: case intro.intro.intro
α : Type u_1
β : Type u_2
l : Filter α
inst✝ : CountableInterFilter l
f g : α → β
p : Set β → Prop
s : Set β
h' : HasCountableSeparatingOn β p s
hf : ∀ᶠ (x : α) in l, f x ∈ s
hg : ∀ᶠ (x : α) in l, g x ∈ s
h : ∀ (U : Set β), p U → ∀ᶠ (x : α) in l, f x ∈ U ↔ g x ∈ U
S : Set (Set β)
hSc : S.Countable
hSp : ∀ s ∈ S, p s
hS : ∀ x ∈ s, ∀ y ∈ s, (∀ s ∈ S, x ∈ s ↔ y ∈ s) → x = y
⊢ f =ᶠ[l] g
state_after: case intro.intro.intro
α : Type u_1
β : Type u_2
l : Filter α
inst✝ : CountableInterFilter l
f g : α → β
p : Set β → Prop
s : Set β
h' : HasCountableSeparatingOn β p s
hf : ∀ᶠ (x : α) in l, f x ∈ s
hg : ∀ᶠ (x : α) in l, g x ∈ s
h : ∀ (U : Set β), p U → ∀ᶠ (x : α) in l, f x ∈ U ↔ g x ∈ U
S : Set (Set β)
hSc : S.Countable
hSp : ∀ s ∈ S, p s
hS : ∀ x ∈ s, ∀ y ∈ s, (∀ s ∈ S, x ∈ s ↔ y ∈ s) → x = y
H : ∀ᶠ (x : α) in l, ∀ s ∈ S, f x ∈ s ↔ g x ∈ s
⊢ f =ᶠ[l] g
tactic: have H : ∀ᶠ x in l, ∀ s ∈ S, f x ∈ s ↔ g x ∈ s :=
    (eventually_countable_ball hSc).2 fun s hs ↦ (h _ (hSp _ hs))
state_before: case intro.intro.intro
α : Type u_1
β : Type u_2
l : Filter α
inst✝ : CountableInterFilter l
f g : α → β
p : Set β → Prop
s : Set β
h' : HasCountableSeparatingOn β p s
hf : ∀ᶠ (x : α) in l, f x ∈ s
hg : ∀ᶠ (x : α) in l, g x ∈ s
h : ∀ (U : Set β), p U → ∀ᶠ (x : α) in l, f x ∈ U ↔ g x ∈ U
S : Set (Set β)
hSc : S.Countable
hSp : ∀ s ∈ S, p s
hS : ∀ x ∈ s, ∀ y ∈ s, (∀ s ∈ S, x ∈ s ↔ y ∈ s) → x = y
H : ∀ᶠ (x : α) in l, ∀ s ∈ S, f x ∈ s ↔ g x ∈ s
⊢ f =ᶠ[l] g
state_after: no goals
tactic: filter_upwards [H, hf, hg] with x hx hxf hxg using hS _ hxf _ hxg hx
Theorem: Real.log_pow
File: Mathlib/Analysis/SpecialFunctions/Log/Basic.lean

Proof steps:
state_before: x✝ y x : ℝ
n : ℕ
⊢ log (x ^ n) = ↑n * log x
state_after: case zero
x✝ y x : ℝ
⊢ log (x ^ 0) = ↑0 * log x

case succ
x✝ y x : ℝ
n : ℕ
ih : log (x ^ n) = ↑n * log x
⊢ log (x ^ (n + 1)) = ↑(n + 1) * log x
tactic: induction' n with n ih
state_before: case succ
x✝ y x : ℝ
n : ℕ
ih : log (x ^ n) = ↑n * log x
⊢ log (x ^ (n + 1)) = ↑(n + 1) * log x
state_after: case succ.inl
x y : ℝ
n : ℕ
ih : log (0 ^ n) = ↑n * log 0
⊢ log (0 ^ (n + 1)) = ↑(n + 1) * log 0

case succ.inr
x✝ y x : ℝ
n : ℕ
ih : log (x ^ n) = ↑n * log x
hx : x ≠ 0
⊢ log (x ^ (n + 1)) = ↑(n + 1) * log x
tactic: rcases eq_or_ne x 0 with (rfl | hx)
state_before: case succ.inr
x✝ y x : ℝ
n : ℕ
ih : log (x ^ n) = ↑n * log x
hx : x ≠ 0
⊢ log (x ^ (n + 1)) = ↑(n + 1) * log x
state_after: no goals
tactic: rw [pow_succ, log_mul (pow_ne_zero _ hx) hx, ih, Nat.cast_succ, add_mul, one_mul]
Theorem: Subfield.mem_closure_iff
File: Mathlib/Algebra/Field/Subfield.lean

Proof steps:
state_before: K✝ : Type u
L : Type v
M : Type w
inst✝³ : DivisionRing K✝
inst✝² : DivisionRing L
inst✝¹ : DivisionRing M
s✝¹ : Set K✝
K : Type u
inst✝ : Field K
s✝ : Subfield K
s : Set K
x : K
⊢ x ∈ closure s ↔ ∃ y ∈ Subring.closure s, ∃ z ∈ Subring.closure s, y / z = x
state_after: K✝ : Type u
L : Type v
M : Type w
inst✝³ : DivisionRing K✝
inst✝² : DivisionRing L
inst✝¹ : DivisionRing M
s✝¹ : Set K✝
K : Type u
inst✝ : Field K
s✝ : Subfield K
s : Set K
x : K
⊢ x ∈ Subfield.commClosure s ↔ ∃ y ∈ Subring.closure s, ∃ z ∈ Subring.closure s, y / z = x
tactic: rw [← commClosure_eq_closure]
state_before: K✝ : Type u
L : Type v
M : Type w
inst✝³ : DivisionRing K✝
inst✝² : DivisionRing L
inst✝¹ : DivisionRing M
s✝¹ : Set K✝
K : Type u
inst✝ : Field K
s✝ : Subfield K
s : Set K
x : K
⊢ x ∈ Subfield.commClosure s ↔ ∃ y ∈ Subring.closure s, ∃ z ∈ Subring.closure s, y / z = x
state_after: no goals
tactic: rfl
Theorem: Set.preimage_add_left_zero
File: Mathlib/Data/Set/Pointwise/Basic.lean

Proof steps:
state_before: F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝ : Group α
s t : Set α
a b : α
⊢ (fun x => a * x) ⁻¹' 1 = {a⁻¹}
state_after: no goals
tactic: rw [← image_mul_left', image_one, mul_one]
Theorem: Matrix.IsHermitian.zpow
File: Mathlib/LinearAlgebra/Matrix/Hermitian.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
m : Type u_3
n : Type u_4
A✝ : Matrix n n α
inst✝³ : CommRing α
inst✝² : StarRing α
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m α
h : A.IsHermitian
k : ℤ
⊢ (A ^ k).IsHermitian
state_after: no goals
tactic: rw [IsHermitian, conjTranspose_zpow, h]
Theorem: ENNReal.monotone_truncateToReal
File: Mathlib/Topology/Instances/ENNReal.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
t : ℝ≥0∞
t_ne_top : t ≠ ⊤
⊢ Monotone t.truncateToReal
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
t : ℝ≥0∞
t_ne_top : t ≠ ⊤
x y : ℝ≥0∞
x_le_y : x ≤ y
⊢ t.truncateToReal x ≤ t.truncateToReal y
tactic: intro x y x_le_y
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
t : ℝ≥0∞
t_ne_top : t ≠ ⊤
x y : ℝ≥0∞
x_le_y : x ≤ y
⊢ t.truncateToReal x ≤ t.truncateToReal y
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
t : ℝ≥0∞
t_ne_top : t ≠ ⊤
x y : ℝ≥0∞
x_le_y : x ≤ y
obs_x : min t x ≠ ⊤
⊢ t.truncateToReal x ≤ t.truncateToReal y
tactic: have obs_x : min t x ≠ ∞ := by
    simp_all only [ne_eq, min_eq_top, false_and, not_false_eq_true]
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
t : ℝ≥0∞
t_ne_top : t ≠ ⊤
x y : ℝ≥0∞
x_le_y : x ≤ y
obs_x : min t x ≠ ⊤
⊢ t.truncateToReal x ≤ t.truncateToReal y
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
t : ℝ≥0∞
t_ne_top : t ≠ ⊤
x y : ℝ≥0∞
x_le_y : x ≤ y
obs_x : min t x ≠ ⊤
obs_y : min t y ≠ ⊤
⊢ t.truncateToReal x ≤ t.truncateToReal y
tactic: have obs_y : min t y ≠ ∞ := by
    simp_all only [ne_eq, min_eq_top, false_and, not_false_eq_true]
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
t : ℝ≥0∞
t_ne_top : t ≠ ⊤
x y : ℝ≥0∞
x_le_y : x ≤ y
obs_x : min t x ≠ ⊤
obs_y : min t y ≠ ⊤
⊢ t.truncateToReal x ≤ t.truncateToReal y
state_after: no goals
tactic: exact (ENNReal.toReal_le_toReal obs_x obs_y).mpr (min_le_min_left t x_le_y)
Theorem: ENNReal.iUnion_Ioo_coe_nat
File: Mathlib/Data/ENNReal/Basic.lean

Proof steps:
state_before: α : Type u_1
a b c d : ℝ≥0∞
r p q : ℝ≥0
⊢ ⋃ n, Ioo a ↑n = Ioi a \ {⊤}
state_after: no goals
tactic: simp only [← Ioi_inter_Iio, ← inter_iUnion, iUnion_Iio_coe_nat, diff_eq]
Theorem: eval_minpolyDiv_of_aeval_eq_zero
File: Mathlib/FieldTheory/Minpoly/MinpolyDiv.lean

Proof steps:
state_before: R : Type u_2
K : Type ?u.52420
L : Type ?u.52423
S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : Field K
inst✝⁵ : Field L
inst✝⁴ : CommRing S
inst✝³ : Algebra R S
inst✝² : Algebra K L
x : S
hx : IsIntegral R x
inst✝¹ : IsDomain S
inst✝ : DecidableEq S
y : S
hy : (aeval y) (minpoly R x) = 0
⊢ eval y (minpolyDiv R x) = if x = y then (aeval x) (derivative (minpoly R x)) else 0
state_after: case hy
R : Type u_2
K : Type ?u.52420
L : Type ?u.52423
S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : Field K
inst✝⁵ : Field L
inst✝⁴ : CommRing S
inst✝³ : Algebra R S
inst✝² : Algebra K L
x : S
hx : IsIntegral R x
inst✝¹ : IsDomain S
inst✝ : DecidableEq S
y : S
hy : (aeval y) (minpoly R x) = 0
⊢ eval₂ ((RingHom.id S).comp (algebraMap R S)) y (minpoly R x) = 0
tactic: rw [eval, eval₂_minpolyDiv_of_eval₂_eq_zero, RingHom.id_apply, RingHom.id_apply]
state_before: case hy
R : Type u_2
K : Type ?u.52420
L : Type ?u.52423
S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : Field K
inst✝⁵ : Field L
inst✝⁴ : CommRing S
inst✝³ : Algebra R S
inst✝² : Algebra K L
x : S
hx : IsIntegral R x
inst✝¹ : IsDomain S
inst✝ : DecidableEq S
y : S
hy : (aeval y) (minpoly R x) = 0
⊢ eval₂ ((RingHom.id S).comp (algebraMap R S)) y (minpoly R x) = 0
state_after: no goals
tactic: simpa [aeval_def] using hy