ruc-ai4math/mathlib_handler_benchmark_410 huggingface dataset:
Theorem: LowerSemicontinuousAt.add'
File: Mathlib/Topology/Semicontinuous.lean

Proof steps:
state_before: α : Type u_1
inst✝⁴ : TopologicalSpace α
β : Type u_2
inst✝³ : Preorder β
f✝ g✝ : α → β
x : α
s t : Set α
y z : β
ι : Type u_3
γ : Type u_4
inst✝² : LinearOrderedAddCommMonoid γ
inst✝¹ : TopologicalSpace γ
inst✝ : OrderTopology γ
f g : α → γ
hf : LowerSemicontinuousAt f x
hg : LowerSemicontinuousAt g x
hcont : ContinuousAt (fun p => p.1 + p.2) (f x, g x)
⊢ LowerSemicontinuousAt (fun z => f z + g z) x
state_after: α : Type u_1
inst✝⁴ : TopologicalSpace α
β : Type u_2
inst✝³ : Preorder β
f✝ g✝ : α → β
x : α
s t : Set α
y z : β
ι : Type u_3
γ : Type u_4
inst✝² : LinearOrderedAddCommMonoid γ
inst✝¹ : TopologicalSpace γ
inst✝ : OrderTopology γ
f g : α → γ
hcont : ContinuousAt (fun p => p.1 + p.2) (f x, g x)
hf : LowerSemicontinuousWithinAt f univ x
hg : LowerSemicontinuousWithinAt g univ x
⊢ LowerSemicontinuousWithinAt (fun z => f z + g z) univ x
tactic: simp_rw [← lowerSemicontinuousWithinAt_univ_iff] at *
state_before: α : Type u_1
inst✝⁴ : TopologicalSpace α
β : Type u_2
inst✝³ : Preorder β
f✝ g✝ : α → β
x : α
s t : Set α
y z : β
ι : Type u_3
γ : Type u_4
inst✝² : LinearOrderedAddCommMonoid γ
inst✝¹ : TopologicalSpace γ
inst✝ : OrderTopology γ
f g : α → γ
hcont : ContinuousAt (fun p => p.1 + p.2) (f x, g x)
hf : LowerSemicontinuousWithinAt f univ x
hg : LowerSemicontinuousWithinAt g univ x
⊢ LowerSemicontinuousWithinAt (fun z => f z + g z) univ x
state_after: no goals
tactic: exact hf.add' hg hcont
Theorem: SetTheory.PGame.nim_birthday
File: Mathlib/SetTheory/Game/Nim.lean

Proof steps:
state_before: o : Ordinal.{u_1}
⊢ (nim o).birthday = o
state_after: case h
o : Ordinal.{u_1}
IH : ∀ k < o, (nim k).birthday = k
⊢ (nim o).birthday = o
tactic: induction' o using Ordinal.induction with o IH
state_before: case h
o : Ordinal.{u_1}
IH : ∀ k < o, (nim k).birthday = k
⊢ (nim o).birthday = o
state_after: case h
o : Ordinal.{u_1}
IH : ∀ k < o, (nim k).birthday = k
⊢ max
      (lsub fun i =>
        ((mk (Quotient.out o).α (Quotient.out o).α (fun o₂ => nim (typein (fun x x_1 => x < x_1) o₂)) fun o₂ =>
                nim (typein (fun x x_1 => x < x_1) o₂)).moveLeft
            i).birthday)
      (lsub fun i =>
        ((mk (Quotient.out o).α (Quotient.out o).α (fun o₂ => nim (typein (fun x x_1 => x < x_1) o₂)) fun o₂ =>
                nim (typein (fun x x_1 => x < x_1) o₂)).moveRight
            i).birthday) =
    o
tactic: rw [nim_def, birthday_def]
state_before: case h
o : Ordinal.{u_1}
IH : ∀ k < o, (nim k).birthday = k
⊢ max
      (lsub fun i =>
        ((mk (Quotient.out o).α (Quotient.out o).α (fun o₂ => nim (typein (fun x x_1 => x < x_1) o₂)) fun o₂ =>
                nim (typein (fun x x_1 => x < x_1) o₂)).moveLeft
            i).birthday)
      (lsub fun i =>
        ((mk (Quotient.out o).α (Quotient.out o).α (fun o₂ => nim (typein (fun x x_1 => x < x_1) o₂)) fun o₂ =>
                nim (typein (fun x x_1 => x < x_1) o₂)).moveRight
            i).birthday) =
    o
state_after: case h
o : Ordinal.{u_1}
IH : ∀ k < o, (nim k).birthday = k
⊢ max (lsub fun i => (nim (typein (fun x x_1 => x < x_1) i)).birthday)
      (lsub fun i => (nim (typein (fun x x_1 => x < x_1) i)).birthday) =
    o
tactic: dsimp
state_before: case h
o : Ordinal.{u_1}
IH : ∀ k < o, (nim k).birthday = k
⊢ max (lsub fun i => (nim (typein (fun x x_1 => x < x_1) i)).birthday)
      (lsub fun i => (nim (typein (fun x x_1 => x < x_1) i)).birthday) =
    o
state_after: case h
o : Ordinal.{u_1}
IH : ∀ k < o, (nim k).birthday = k
⊢ (lsub fun i => (nim (typein (fun x x_1 => x < x_1) i)).birthday) = o
tactic: rw [max_eq_right le_rfl]
state_before: case h
o : Ordinal.{u_1}
IH : ∀ k < o, (nim k).birthday = k
⊢ (lsub fun i => (nim (typein (fun x x_1 => x < x_1) i)).birthday) = o
state_after: case h.e'_2.h.e'_2.h
o : Ordinal.{u_1}
IH : ∀ k < o, (nim k).birthday = k
i : (Quotient.out o).α
⊢ (nim (typein (fun x x_1 => x < x_1) i)).birthday = typein (fun x x_1 => x < x_1) i
tactic: convert lsub_typein o with i
state_before: case h.e'_2.h.e'_2.h
o : Ordinal.{u_1}
IH : ∀ k < o, (nim k).birthday = k
i : (Quotient.out o).α
⊢ (nim (typein (fun x x_1 => x < x_1) i)).birthday = typein (fun x x_1 => x < x_1) i
state_after: no goals
tactic: exact IH _ (typein_lt_self i)
Theorem: RatFunc.denom_algebraMap
File: Mathlib/FieldTheory/RatFunc/Basic.lean

Proof steps:
state_before: K : Type u
inst✝ : Field K
p : K[X]
⊢ ((algebraMap K[X] (RatFunc K)) p).denom = 1
state_after: no goals
tactic: convert denom_div p one_ne_zero <;> simp
Theorem: tsub_pos_iff_lt
File: Mathlib/Algebra/Order/Sub/Canonical.lean

Proof steps:
state_before: α : Type u_1
inst✝² : CanonicallyLinearOrderedAddCommMonoid α
inst✝¹ : Sub α
inst✝ : OrderedSub α
a b c d : α
⊢ 0 < a - b ↔ b < a
state_after: no goals
tactic: rw [tsub_pos_iff_not_le, not_le]
Theorem: continuousAt_of_locally_uniform_approx_of_continuousAt
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 : ι → α
inst✝ : TopologicalSpace α
L : ∀ u ∈ 𝓤 β, ∃ t ∈ 𝓝 x, ∃ F, ContinuousAt F x ∧ ∀ y ∈ t, (f y, F y) ∈ u
⊢ ContinuousAt f x
state_after: α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s' : Set α
x : α
p : Filter ι
p' : Filter α
g : ι → α
inst✝ : TopologicalSpace α
L : ∀ u ∈ 𝓤 β, ∃ t ∈ 𝓝 x, ∃ F, ContinuousAt F x ∧ ∀ y ∈ t, (f y, F y) ∈ u
⊢ ContinuousWithinAt f univ x
tactic: rw [← continuousWithinAt_univ]
state_before: α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s' : Set α
x : α
p : Filter ι
p' : Filter α
g : ι → α
inst✝ : TopologicalSpace α
L : ∀ u ∈ 𝓤 β, ∃ t ∈ 𝓝 x, ∃ F, ContinuousAt F x ∧ ∀ y ∈ t, (f y, F y) ∈ u
⊢ ContinuousWithinAt f univ x
state_after: α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s' : Set α
x : α
p : Filter ι
p' : Filter α
g : ι → α
inst✝ : TopologicalSpace α
L : ∀ u ∈ 𝓤 β, ∃ t ∈ 𝓝 x, ∃ F, ContinuousAt F x ∧ ∀ y ∈ t, (f y, F y) ∈ u
⊢ ∀ u ∈ 𝓤 β, ∃ t ∈ 𝓝[univ] x, ∃ F, ContinuousWithinAt F univ x ∧ ∀ y ∈ t, (f y, F y) ∈ u
tactic: apply continuousWithinAt_of_locally_uniform_approx_of_continuousWithinAt (mem_univ _) _
state_before: α : Type u
β : Type v
γ : Type w
ι : Type x
inst✝¹ : UniformSpace β
F : ι → α → β
f : α → β
s s' : Set α
x : α
p : Filter ι
p' : Filter α
g : ι → α
inst✝ : TopologicalSpace α
L : ∀ u ∈ 𝓤 β, ∃ t ∈ 𝓝 x, ∃ F, ContinuousAt F x ∧ ∀ y ∈ t, (f y, F y) ∈ u
⊢ ∀ u ∈ 𝓤 β, ∃ t ∈ 𝓝[univ] x, ∃ F, ContinuousWithinAt F univ x ∧ ∀ y ∈ t, (f y, F y) ∈ u
state_after: no goals
tactic: simpa only [exists_prop, nhdsWithin_univ, continuousWithinAt_univ] using L
Theorem: finrank_real_of_complex
File: Mathlib/Data/Complex/FiniteDimensional.lean

Proof steps:
state_before: E : Type u_1
inst✝¹ : AddCommGroup E
inst✝ : Module ℂ E
⊢ finrank ℝ E = 2 * finrank ℂ E
state_after: no goals
tactic: rw [← FiniteDimensional.finrank_mul_finrank ℝ ℂ E, Complex.finrank_real_complex]
Theorem: WithTop.sub_top
File: Mathlib/Algebra/Order/Sub/WithTop.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
inst✝¹ : Sub α
inst✝ : Bot α
a : WithTop α
⊢ a - ⊤ = ↑⊥
state_after: no goals
tactic: cases a <;> rfl
Theorem: Ideal.finset_inf_span_singleton
File: Mathlib/RingTheory/Ideal/Operations.lean

Proof steps:
state_before: R : Type u
ι✝ : Type u_1
inst✝ : CommSemiring R
I✝ J K L : Ideal R
ι : Type u_2
s : Finset ι
I : ι → R
hI : (↑s).Pairwise (IsCoprime on I)
⊢ (s.inf fun i => span {I i}) = span {∏ i ∈ s, I i}
state_after: case h
R : Type u
ι✝ : Type u_1
inst✝ : CommSemiring R
I✝ J K L : Ideal R
ι : Type u_2
s : Finset ι
I : ι → R
hI : (↑s).Pairwise (IsCoprime on I)
x : R
⊢ (x ∈ s.inf fun i => span {I i}) ↔ x ∈ span {∏ i ∈ s, I i}
tactic: ext x
state_before: case h
R : Type u
ι✝ : Type u_1
inst✝ : CommSemiring R
I✝ J K L : Ideal R
ι : Type u_2
s : Finset ι
I : ι → R
hI : (↑s).Pairwise (IsCoprime on I)
x : R
⊢ (x ∈ s.inf fun i => span {I i}) ↔ x ∈ span {∏ i ∈ s, I i}
state_after: case h
R : Type u
ι✝ : Type u_1
inst✝ : CommSemiring R
I✝ J K L : Ideal R
ι : Type u_2
s : Finset ι
I : ι → R
hI : (↑s).Pairwise (IsCoprime on I)
x : R
⊢ (∀ i ∈ s, I i ∣ x) ↔ ∏ i ∈ s, I i ∣ x
tactic: simp only [Submodule.mem_finset_inf, Ideal.mem_span_singleton]
state_before: case h
R : Type u
ι✝ : Type u_1
inst✝ : CommSemiring R
I✝ J K L : Ideal R
ι : Type u_2
s : Finset ι
I : ι → R
hI : (↑s).Pairwise (IsCoprime on I)
x : R
⊢ (∀ i ∈ s, I i ∣ x) ↔ ∏ i ∈ s, I i ∣ x
state_after: no goals
tactic: exact ⟨Finset.prod_dvd_of_coprime hI, fun h i hi => (Finset.dvd_prod_of_mem _ hi).trans h⟩
Theorem: Nat.factoredNumbers_compl
File: Mathlib/NumberTheory/SmoothNumbers.lean

Proof steps:
state_before: N : ℕ
s : Finset ℕ
h : N.primesBelow ≤ s
⊢ (factoredNumbers s)ᶜ \ {0} ⊆ {n | N ≤ n}
state_after: N : ℕ
s : Finset ℕ
h : N.primesBelow ≤ s
n : ℕ
hn : n ∈ (factoredNumbers s)ᶜ \ {0}
⊢ n ∈ {n | N ≤ n}
tactic: intro n hn
state_before: N : ℕ
s : Finset ℕ
h : N.primesBelow ≤ s
n : ℕ
hn : n ∈ (factoredNumbers s)ᶜ \ {0}
⊢ n ∈ {n | N ≤ n}
state_after: N : ℕ
s : Finset ℕ
h : N.primesBelow ≤ s
n : ℕ
hn : (¬n = 0 → ∃ x ∈ n.primeFactorsList, x ∉ s) ∧ ¬n = 0
⊢ n ∈ {n | N ≤ n}
tactic: simp only [Set.mem_compl_iff, mem_factoredNumbers, Set.mem_diff, ne_eq, not_and, not_forall,
    not_lt, exists_prop, Set.mem_singleton_iff] at hn
state_before: N : ℕ
s : Finset ℕ
h : N.primesBelow ≤ s
n : ℕ
hn : (¬n = 0 → ∃ x ∈ n.primeFactorsList, x ∉ s) ∧ ¬n = 0
⊢ n ∈ {n | N ≤ n}
state_after: N : ℕ
s : Finset ℕ
h : N.primesBelow ≤ s
n : ℕ
hn : (¬n = 0 → ∃ x ∈ n.primeFactorsList, x ∉ s) ∧ ¬n = 0
⊢ N ≤ n
tactic: simp only [Set.mem_setOf_eq]
state_before: N : ℕ
s : Finset ℕ
h : N.primesBelow ≤ s
n : ℕ
hn : (¬n = 0 → ∃ x ∈ n.primeFactorsList, x ∉ s) ∧ ¬n = 0
⊢ N ≤ n
state_after: case intro.intro
N : ℕ
s : Finset ℕ
h : N.primesBelow ≤ s
n : ℕ
hn : (¬n = 0 → ∃ x ∈ n.primeFactorsList, x ∉ s) ∧ ¬n = 0
p : ℕ
hp₁ : p ∈ n.primeFactorsList
hp₂ : p ∉ s
⊢ N ≤ n
tactic: obtain ⟨p, hp₁, hp₂⟩ := hn.1 hn.2
state_before: case intro.intro
N : ℕ
s : Finset ℕ
h : N.primesBelow ≤ s
n : ℕ
hn : (¬n = 0 → ∃ x ∈ n.primeFactorsList, x ∉ s) ∧ ¬n = 0
p : ℕ
hp₁ : p ∈ n.primeFactorsList
hp₂ : p ∉ s
⊢ N ≤ n
state_after: case intro.intro
N : ℕ
s : Finset ℕ
h : N.primesBelow ≤ s
n : ℕ
hn : (¬n = 0 → ∃ x ∈ n.primeFactorsList, x ∉ s) ∧ ¬n = 0
p : ℕ
hp₁ : p ∈ n.primeFactorsList
hp₂ : p ∉ s
this : N ≤ p
⊢ N ≤ n
tactic: have : N ≤ p := by
    contrapose! hp₂
    exact h <| mem_primesBelow.mpr ⟨hp₂, prime_of_mem_primeFactorsList hp₁⟩
state_before: case intro.intro
N : ℕ
s : Finset ℕ
h : N.primesBelow ≤ s
n : ℕ
hn : (¬n = 0 → ∃ x ∈ n.primeFactorsList, x ∉ s) ∧ ¬n = 0
p : ℕ
hp₁ : p ∈ n.primeFactorsList
hp₂ : p ∉ s
this : N ≤ p
⊢ N ≤ n
state_after: no goals
tactic: exact this.trans <| le_of_mem_primeFactorsList hp₁
Theorem: List.chain'_map
File: Mathlib/Data/List/Chain.lean

Proof steps:
state_before: α : Type u
β : Type v
R r : α → α → Prop
l✝ l₁ l₂ : List α
a b : α
f : β → α
l : List β
⊢ Chain' R (map f l) ↔ Chain' (fun a b => R (f a) (f b)) l
state_after: no goals
tactic: cases l <;> [rfl; exact chain_map _]
Theorem: CategoryTheory.MorphismProperty.IsInvertedBy.iff_map_le_isomorphisms
File: Mathlib/CategoryTheory/MorphismProperty/IsInvertedBy.lean

Proof steps:
state_before: C : Type u
inst✝¹ : Category.{v, u} C
D : Type u'
inst✝ : Category.{v', u'} D
W : MorphismProperty C
F : C ⥤ D
⊢ W.IsInvertedBy F ↔ W.map F ≤ isomorphisms D
state_after: no goals
tactic: rw [iff_le_inverseImage_isomorphisms, map_le_iff]
Theorem: Set.inv_smul_set_distrib₀
File: Mathlib/Data/Set/Pointwise/SMul.lean

Proof steps:
state_before: F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝¹ : GroupWithZero α
inst✝ : MulAction α β
s✝ t : Set β
a✝ a : α
s : Set α
⊢ (a • s)⁻¹ = op a⁻¹ • s⁻¹
state_after: case inl
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝¹ : GroupWithZero α
inst✝ : MulAction α β
s✝ t : Set β
a : α
s : Set α
⊢ (0 • s)⁻¹ = op 0⁻¹ • s⁻¹

case inr
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝¹ : GroupWithZero α
inst✝ : MulAction α β
s✝ t : Set β
a✝ a : α
s : Set α
ha : a ≠ 0
⊢ (a • s)⁻¹ = op a⁻¹ • s⁻¹
tactic: obtain rfl | ha := eq_or_ne a 0
Theorem: convexHull_exists_dist_ge2
File: Mathlib/Analysis/Convex/Normed.lean

Proof steps:
state_before: ι : Type u_1
E : Type u_2
P : Type u_3
inst✝³ : SeminormedAddCommGroup E
inst✝² : NormedSpace ℝ E
inst✝¹ : PseudoMetricSpace P
inst✝ : NormedAddTorsor E P
s✝ t✝ s t : Set E
x y : E
hx : x ∈ (convexHull ℝ) s
hy : y ∈ (convexHull ℝ) t
⊢ ∃ x' ∈ s, ∃ y' ∈ t, dist x y ≤ dist x' y'
state_after: case intro.intro
ι : Type u_1
E : Type u_2
P : Type u_3
inst✝³ : SeminormedAddCommGroup E
inst✝² : NormedSpace ℝ E
inst✝¹ : PseudoMetricSpace P
inst✝ : NormedAddTorsor E P
s✝ t✝ s t : Set E
x y : E
hx : x ∈ (convexHull ℝ) s
hy : y ∈ (convexHull ℝ) t
x' : E
hx' : x' ∈ s
Hx' : dist x y ≤ dist x' y
⊢ ∃ x' ∈ s, ∃ y' ∈ t, dist x y ≤ dist x' y'
tactic: rcases convexHull_exists_dist_ge hx y with ⟨x', hx', Hx'⟩
state_before: case intro.intro
ι : Type u_1
E : Type u_2
P : Type u_3
inst✝³ : SeminormedAddCommGroup E
inst✝² : NormedSpace ℝ E
inst✝¹ : PseudoMetricSpace P
inst✝ : NormedAddTorsor E P
s✝ t✝ s t : Set E
x y : E
hx : x ∈ (convexHull ℝ) s
hy : y ∈ (convexHull ℝ) t
x' : E
hx' : x' ∈ s
Hx' : dist x y ≤ dist x' y
⊢ ∃ x' ∈ s, ∃ y' ∈ t, dist x y ≤ dist x' y'
state_after: case intro.intro.intro.intro
ι : Type u_1
E : Type u_2
P : Type u_3
inst✝³ : SeminormedAddCommGroup E
inst✝² : NormedSpace ℝ E
inst✝¹ : PseudoMetricSpace P
inst✝ : NormedAddTorsor E P
s✝ t✝ s t : Set E
x y : E
hx : x ∈ (convexHull ℝ) s
hy : y ∈ (convexHull ℝ) t
x' : E
hx' : x' ∈ s
Hx' : dist x y ≤ dist x' y
y' : E
hy' : y' ∈ t
Hy' : dist y x' ≤ dist y' x'
⊢ ∃ x' ∈ s, ∃ y' ∈ t, dist x y ≤ dist x' y'
tactic: rcases convexHull_exists_dist_ge hy x' with ⟨y', hy', Hy'⟩
state_before: case intro.intro.intro.intro
ι : Type u_1
E : Type u_2
P : Type u_3
inst✝³ : SeminormedAddCommGroup E
inst✝² : NormedSpace ℝ E
inst✝¹ : PseudoMetricSpace P
inst✝ : NormedAddTorsor E P
s✝ t✝ s t : Set E
x y : E
hx : x ∈ (convexHull ℝ) s
hy : y ∈ (convexHull ℝ) t
x' : E
hx' : x' ∈ s
Hx' : dist x y ≤ dist x' y
y' : E
hy' : y' ∈ t
Hy' : dist y x' ≤ dist y' x'
⊢ ∃ x' ∈ s, ∃ y' ∈ t, dist x y ≤ dist x' y'
state_after: case right
ι : Type u_1
E : Type u_2
P : Type u_3
inst✝³ : SeminormedAddCommGroup E
inst✝² : NormedSpace ℝ E
inst✝¹ : PseudoMetricSpace P
inst✝ : NormedAddTorsor E P
s✝ t✝ s t : Set E
x y : E
hx : x ∈ (convexHull ℝ) s
hy : y ∈ (convexHull ℝ) t
x' : E
hx' : x' ∈ s
Hx' : dist x y ≤ dist x' y
y' : E
hy' : y' ∈ t
Hy' : dist y x' ≤ dist y' x'
⊢ dist x y ≤ dist x' y'
tactic: use x', hx', y', hy'
state_before: case right
ι : Type u_1
E : Type u_2
P : Type u_3
inst✝³ : SeminormedAddCommGroup E
inst✝² : NormedSpace ℝ E
inst✝¹ : PseudoMetricSpace P
inst✝ : NormedAddTorsor E P
s✝ t✝ s t : Set E
x y : E
hx : x ∈ (convexHull ℝ) s
hy : y ∈ (convexHull ℝ) t
x' : E
hx' : x' ∈ s
Hx' : dist x y ≤ dist x' y
y' : E
hy' : y' ∈ t
Hy' : dist y x' ≤ dist y' x'
⊢ dist x y ≤ dist x' y'
state_after: no goals
tactic: exact le_trans Hx' (dist_comm y x' ▸ dist_comm y' x' ▸ Hy')
Theorem: Complex.sin_sq
File: Mathlib/Data/Complex/Exponential.lean

Proof steps:
state_before: x y : ℂ
⊢ sin x ^ 2 = 1 - cos x ^ 2
state_after: no goals
tactic: rw [← sin_sq_add_cos_sq x, add_sub_cancel_right]
Theorem: sub_eq_of_eq_add
File: Mathlib/Algebra/Group/Basic.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
G : Type u_3
M : Type u_4
inst✝ : Group G
a b c d : G
n : ℤ
h : a = c * b
⊢ a / b = c
state_after: no goals
tactic: simp [h]
Theorem: AlgebraicGeometry.HasRingHomProperty.iff_appLE
File: Mathlib/AlgebraicGeometry/Morphisms/RingHomProperties.lean

Proof steps:
state_before: P : MorphismProperty Scheme
Q : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
inst✝ : HasRingHomProperty P Q
X Y Z : Scheme
f : X ⟶ Y
g : Y ⟶ Z
⊢ P f ↔ ∀ (U : ↑Y.affineOpens) (V : ↑X.affineOpens) (e : ↑V ≤ f ⁻¹ᵁ ↑U), Q (Scheme.Hom.appLE f (↑U) (↑V) e)
state_after: no goals
tactic: rw [eq_affineLocally P, affineLocally_iff_affineOpens_le]
Theorem: Cardinal.one_lt_lift_iff
File: Mathlib/SetTheory/Cardinal/Basic.lean

Proof steps:
state_before: α β : Type u
a : Cardinal.{u}
⊢ 1 < lift.{v, u} a ↔ 1 < a
state_after: no goals
tactic: simpa using nat_lt_lift_iff (n := 1)
Theorem: Nat.bit_ne_zero
File: Mathlib/Data/Nat/Bits.lean

Proof steps:
state_before: m n✝ : ℕ
b : Bool
n : ℕ
h : n ≠ 0
⊢ bit b n ≠ 0
state_after: no goals
tactic: cases b <;> dsimp [bit] <;> omega
Theorem: Rat.cast_nnratCast
File: Mathlib/Data/Rat/Cast/Lemmas.lean

Proof steps:
state_before: α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
⊢ ↑↑q = ↑q
state_after: α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
⊢ ↑(↑q.num / ↑q.den).num / ↑(↑q.num / ↑q.den).den = ↑q.num / ↑q.den
tactic: rw [Rat.cast_def, NNRat.cast_def, NNRat.cast_def]
state_before: α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
⊢ ↑(↑q.num / ↑q.den).num / ↑(↑q.num / ↑q.den).den = ↑q.num / ↑q.den
state_after: α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
hn : (↑↑q.num / ↑↑q.den).num = ↑q.num
⊢ ↑(↑q.num / ↑q.den).num / ↑(↑q.num / ↑q.den).den = ↑q.num / ↑q.den

case hdp
α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
⊢ 0 < ↑q.den
tactic: have hn := @num_div_eq_of_coprime q.num q.den ?hdp q.coprime_num_den
state_before: α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
hn : (↑↑q.num / ↑↑q.den).num = ↑q.num
⊢ ↑(↑q.num / ↑q.den).num / ↑(↑q.num / ↑q.den).den = ↑q.num / ↑q.den

case hdp
α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
⊢ 0 < ↑q.den
state_after: α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
hn : (↑↑q.num / ↑↑q.den).num = ↑q.num
hd : ↑(↑↑q.num / ↑↑q.den).den = ↑q.den
⊢ ↑(↑q.num / ↑q.den).num / ↑(↑q.num / ↑q.den).den = ↑q.num / ↑q.den

case hdp
α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
⊢ 0 < ↑q.den
tactic: on_goal 1 => have hd := @den_div_eq_of_coprime q.num q.den ?hdp q.coprime_num_den
state_before: α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
hn : (↑↑q.num / ↑↑q.den).num = ↑q.num
hd : ↑(↑↑q.num / ↑↑q.den).den = ↑q.den
⊢ ↑(↑q.num / ↑q.den).num / ↑(↑q.num / ↑q.den).den = ↑q.num / ↑q.den

case hdp
α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
⊢ 0 < ↑q.den
state_after: α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
hn : (↑↑q.num / ↑↑q.den).num = ↑q.num
hd : ↑(↑↑q.num / ↑↑q.den).den = ↑q.den
⊢ ↑(↑q.num / ↑q.den).num / ↑(↑q.num / ↑q.den).den = ↑q.num / ↑q.den
tactic: case hdp => simpa only [Nat.cast_pos] using q.den_pos
state_before: α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
hn : (↑↑q.num / ↑↑q.den).num = ↑q.num
hd : ↑(↑↑q.num / ↑↑q.den).den = ↑q.den
⊢ ↑(↑q.num / ↑q.den).num / ↑(↑q.num / ↑q.den).den = ↑q.num / ↑q.den
state_after: α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
hn : (↑q.num / ↑q.den).num = ↑q.num
hd : (↑q.num / ↑q.den).den = q.den
⊢ ↑(↑q.num / ↑q.den).num / ↑(↑q.num / ↑q.den).den = ↑q.num / ↑q.den
tactic: simp only [Int.cast_natCast, Nat.cast_inj] at hn hd
state_before: α : Type u_1
inst✝¹ : DivisionRing α
K : Type u_2
inst✝ : DivisionRing K
q : ℚ≥0
hn : (↑q.num / ↑q.den).num = ↑q.num
hd : (↑q.num / ↑q.den).den = q.den
⊢ ↑(↑q.num / ↑q.den).num / ↑(↑q.num / ↑q.den).den = ↑q.num / ↑q.den
state_after: no goals
tactic: rw [hn, hd, Int.cast_natCast]
Theorem: ENNReal.ofReal_natCast
File: Mathlib/Data/ENNReal/Basic.lean

Proof steps:
state_before: α : Type u_1
a b c d : ℝ≥0∞
r p q : ℝ≥0
n : ℕ
⊢ ENNReal.ofReal ↑n = ↑n
state_after: no goals
tactic: simp [ENNReal.ofReal]
Theorem: Submodule.ne_bot_iff
File: Mathlib/Algebra/Module/Submodule/Lattice.lean

Proof steps:
state_before: R : Type u_1
S : Type u_2
M : Type u_3
inst✝⁶ : Semiring R
inst✝⁵ : Semiring S
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Module S M
inst✝¹ : SMul S R
inst✝ : IsScalarTower S R M
p✝ q p : Submodule R M
⊢ p ≠ ⊥ ↔ ∃ x ∈ p, x ≠ 0
state_after: no goals
tactic: simp only [ne_eq, p.eq_bot_iff, not_forall, exists_prop]
Theorem: mod_card_nsmul
File: Mathlib/GroupTheory/OrderOfElement.lean

Proof steps:
state_before: G : Type u_1
H : Type u_2
A : Type u_3
α : Type u_4
β : Type u_5
inst✝¹ : Group G
inst✝ : Fintype G
x : G
n✝ : ℕ
a : G
n : ℕ
⊢ a ^ (n % card G) = a ^ n
state_after: no goals
tactic: rw [eq_comm, ← pow_mod_orderOf, ← Nat.mod_mod_of_dvd n orderOf_dvd_card, pow_mod_orderOf]
Theorem: Interval.coe_iInf₂
File: Mathlib/Order/Interval/Basic.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
ι : Sort u_5
κ : ι → Sort u_6
inst✝¹ : CompleteLattice α
inst✝ : DecidableRel fun x x_1 => x ≤ x_1
f : (i : ι) → κ i → Interval α
⊢ ↑(⨅ i, ⨅ j, f i j) = ⋂ i, ⋂ j, ↑(f i j)
state_after: no goals
tactic: simp_rw [coe_iInf]
Theorem: CategoryTheory.MonoidalCategory.prodMonoidal_leftUnitor_inv_fst
File: Mathlib/CategoryTheory/Monoidal/Category.lean

Proof steps:
state_before: C : Type u
𝒞 : Category.{v, u} C
inst✝⁴ : MonoidalCategory C
C₁ : Type u₁
inst✝³ : Category.{v₁, u₁} C₁
inst✝² : MonoidalCategory C₁
C₂ : Type u₂
inst✝¹ : Category.{v₂, u₂} C₂
inst✝ : MonoidalCategory C₂
X : C₁ × C₂
⊢ (λ_ X).inv.1 = (λ_ X.1).inv
state_after: case mk
C : Type u
𝒞 : Category.{v, u} C
inst✝⁴ : MonoidalCategory C
C₁ : Type u₁
inst✝³ : Category.{v₁, u₁} C₁
inst✝² : MonoidalCategory C₁
C₂ : Type u₂
inst✝¹ : Category.{v₂, u₂} C₂
inst✝ : MonoidalCategory C₂
fst✝ : C₁
snd✝ : C₂
⊢ (λ_ (fst✝, snd✝)).inv.1 = (λ_ (fst✝, snd✝).1).inv
tactic: cases X
state_before: case mk
C : Type u
𝒞 : Category.{v, u} C
inst✝⁴ : MonoidalCategory C
C₁ : Type u₁
inst✝³ : Category.{v₁, u₁} C₁
inst✝² : MonoidalCategory C₁
C₂ : Type u₂
inst✝¹ : Category.{v₂, u₂} C₂
inst✝ : MonoidalCategory C₂
fst✝ : C₁
snd✝ : C₂
⊢ (λ_ (fst✝, snd✝)).inv.1 = (λ_ (fst✝, snd✝).1).inv
state_after: no goals
tactic: rfl
Theorem: BooleanRing.sup_inf_self
File: Mathlib/Algebra/Ring/BooleanRing.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : BooleanRing α
inst✝¹ : BooleanRing β
inst✝ : BooleanRing γ
a b : α
⊢ a + a * b + a * (a * b) = a
state_after: no goals
tactic: rw [← mul_assoc, mul_self, add_assoc, add_self, add_zero]
Theorem: Finpartition.existsUnique_mem
File: Mathlib/Order/Partition/Finpartition.lean

Proof steps:
state_before: α : Type u_1
inst✝ : DecidableEq α
s t u : Finset α
P : Finpartition s
a : α
ha : a ∈ s
⊢ ∃! t, t ∈ P.parts ∧ a ∈ t
state_after: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
s t✝ u : Finset α
P : Finpartition s
a : α
ha : a ∈ s
t : Finset α
ht : t ∈ P.parts
ht' : a ∈ t
⊢ ∃! t, t ∈ P.parts ∧ a ∈ t
tactic: obtain ⟨t, ht, ht'⟩ := P.exists_mem ha
state_before: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
s t✝ u : Finset α
P : Finpartition s
a : α
ha : a ∈ s
t : Finset α
ht : t ∈ P.parts
ht' : a ∈ t
⊢ ∃! t, t ∈ P.parts ∧ a ∈ t
state_after: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
s t✝ u : Finset α
P : Finpartition s
a : α
ha : a ∈ s
t : Finset α
ht : t ∈ P.parts
ht' : a ∈ t
⊢ ∀ (y : Finset α), (fun t => t ∈ P.parts ∧ a ∈ t) y → y = t
tactic: refine ⟨t, ⟨ht, ht'⟩, ?_⟩
state_before: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
s t✝ u : Finset α
P : Finpartition s
a : α
ha : a ∈ s
t : Finset α
ht : t ∈ P.parts
ht' : a ∈ t
⊢ ∀ (y : Finset α), (fun t => t ∈ P.parts ∧ a ∈ t) y → y = t
state_after: case intro.intro.intro
α : Type u_1
inst✝ : DecidableEq α
s t✝ u✝ : Finset α
P : Finpartition s
a : α
ha : a ∈ s
t : Finset α
ht : t ∈ P.parts
ht' : a ∈ t
u : Finset α
hu : u ∈ P.parts
hu' : a ∈ u
⊢ u = t
tactic: rintro u ⟨hu, hu'⟩
state_before: case intro.intro.intro
α : Type u_1
inst✝ : DecidableEq α
s t✝ u✝ : Finset α
P : Finpartition s
a : α
ha : a ∈ s
t : Finset α
ht : t ∈ P.parts
ht' : a ∈ t
u : Finset α
hu : u ∈ P.parts
hu' : a ∈ u
⊢ u = t
state_after: no goals
tactic: exact P.eq_of_mem_parts hu ht hu' ht'