1337xyz1337xyz/leandojo-benchmark4-v10 huggingface dataset:
Theorem: quadratic_eq_zero_iff
File: Mathlib/Algebra/QuadraticDiscriminant.lean

tactic: rw [quadratic_eq_zero_iff_discrim_eq_sq ha, h, sq, mul_self_eq_mul_self_iff]
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NeZero 2
a b c x✝ : K
ha : a ≠ 0
s : K
h : discrim a b c = s * s
x : K
⊢ a * x * x + b * x + c = 0 ↔ x = (-b + s) / (2 * a) ∨ x = (-b - s) / (2 * a)
state_after: K : Type u_1
inst✝¹ : Field K
inst✝ : NeZero 2
a b c x✝ : K
ha : a ≠ 0
s : K
h : discrim a b c = s * s
x : K
⊢ s = 2 * a * x + b ∨ s = -(2 * a * x + b) ↔ x = (-b + s) / (2 * a) ∨ x = (-b - s) / (2 * a)

tactic: field_simp
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NeZero 2
a b c x✝ : K
ha : a ≠ 0
s : K
h : discrim a b c = s * s
x : K
⊢ s = 2 * a * x + b ∨ s = -(2 * a * x + b) ↔ x = (-b + s) / (2 * a) ∨ x = (-b - s) / (2 * a)
state_after: K : Type u_1
inst✝¹ : Field K
inst✝ : NeZero 2
a b c x✝ : K
ha : a ≠ 0
s : K
h : discrim a b c = s * s
x : K
⊢ s = 2 * a * x + b ∨ s = -b + -(2 * a * x) ↔ x * (2 * a) = -b + s ∨ x * (2 * a) = -b - s

tactic: apply or_congr
state_before: K : Type u_1
inst✝¹ : Field K
inst✝ : NeZero 2
a b c x✝ : K
ha : a ≠ 0
s : K
h : discrim a b c = s * s
x : K
⊢ s = 2 * a * x + b ∨ s = -b + -(2 * a * x) ↔ x * (2 * a) = -b + s ∨ x * (2 * a) = -b - s
state_after: case h₁
K : Type u_1
inst✝¹ : Field K
inst✝ : NeZero 2
a b c x✝ : K
ha : a ≠ 0
s : K
h : discrim a b c = s * s
x : K
⊢ s = 2 * a * x + b ↔ x * (2 * a) = -b + s

case h₂
K : Type u_1
inst✝¹ : Field K
inst✝ : NeZero 2
a b c x✝ : K
ha : a ≠ 0
s : K
h : discrim a b c = s * s
x : K
⊢ s = -b + -(2 * a * x) ↔ x * (2 * a) = -b - s

tactic: constructor <;> intro h' <;> linear_combination -h'
state_before: case h₁
K : Type u_1
inst✝¹ : Field K
inst✝ : NeZero 2
a b c x✝ : K
ha : a ≠ 0
s : K
h : discrim a b c = s * s
x : K
⊢ s = 2 * a * x + b ↔ x * (2 * a) = -b + s
state_after: no goals

tactic: constructor <;> intro h' <;> linear_combination h'
state_before: case h₂
K : Type u_1
inst✝¹ : Field K
inst✝ : NeZero 2
a b c x✝ : K
ha : a ≠ 0
s : K
h : discrim a b c = s * s
x : K
⊢ s = -b + -(2 * a * x) ↔ x * (2 * a) = -b - s
state_after: no goals
Theorem: Filter.EventuallyLE.mul_nonneg
File: Mathlib/Order/Filter/Ring.lean

tactic: filter_upwards [hf, hg] with x using _root_.mul_nonneg
state_before: α : Type u
β : Type v
inst✝ : OrderedSemiring β
l : Filter α
f g : α → β
hf : 0 ≤ᶠ[l] f
hg : 0 ≤ᶠ[l] g
⊢ 0 ≤ᶠ[l] f * g
state_after: no goals
Theorem: ZMod.castHom_injective
File: Mathlib/Data/ZMod/Basic.lean

tactic: rw [injective_iff_map_eq_zero]
state_before: n : ℕ
R : Type u_1
inst✝¹ : Ring R
inst✝ : CharP R n
⊢ Injective ⇑(castHom ⋯ R)
state_after: n : ℕ
R : Type u_1
inst✝¹ : Ring R
inst✝ : CharP R n
⊢ ∀ (a : ZMod n), (castHom ⋯ R) a = 0 → a = 0

tactic: intro x
state_before: n : ℕ
R : Type u_1
inst✝¹ : Ring R
inst✝ : CharP R n
⊢ ∀ (a : ZMod n), (castHom ⋯ R) a = 0 → a = 0
state_after: n : ℕ
R : Type u_1
inst✝¹ : Ring R
inst✝ : CharP R n
x : ZMod n
⊢ (castHom ⋯ R) x = 0 → x = 0

tactic: obtain ⟨k, rfl⟩ := ZMod.intCast_surjective x
state_before: n : ℕ
R : Type u_1
inst✝¹ : Ring R
inst✝ : CharP R n
x : ZMod n
⊢ (castHom ⋯ R) x = 0 → x = 0
state_after: case intro
n : ℕ
R : Type u_1
inst✝¹ : Ring R
inst✝ : CharP R n
k : ℤ
⊢ (castHom ⋯ R) ↑k = 0 → ↑k = 0

tactic: rw [map_intCast, CharP.intCast_eq_zero_iff R n, CharP.intCast_eq_zero_iff (ZMod n) n]
state_before: case intro
n : ℕ
R : Type u_1
inst✝¹ : Ring R
inst✝ : CharP R n
k : ℤ
⊢ (castHom ⋯ R) ↑k = 0 → ↑k = 0
state_after: case intro
n : ℕ
R : Type u_1
inst✝¹ : Ring R
inst✝ : CharP R n
k : ℤ
⊢ ↑n ∣ k → ↑n ∣ k

tactic: exact id
state_before: case intro
n : ℕ
R : Type u_1
inst✝¹ : Ring R
inst✝ : CharP R n
k : ℤ
⊢ ↑n ∣ k → ↑n ∣ k
state_after: no goals
Theorem: Nat.coprime_zero_right
File: .lake/packages/batteries/Batteries/Data/Nat/Gcd.lean

tactic: simp [Coprime]
state_before: n : Nat
⊢ n.Coprime 0 ↔ n = 1
state_after: no goals
Theorem: LiouvilleWith.irrational
File: Mathlib/NumberTheory/Liouville/LiouvilleWith.lean

tactic: rintro ⟨r, rfl⟩
state_before: p q x y : ℝ
r : ℚ
m : ℤ
n : ℕ
h : LiouvilleWith p x
hp : 1 < p
⊢ Irrational x
state_after: case intro
p q y : ℝ
r✝ : ℚ
m : ℤ
n : ℕ
hp : 1 < p
r : ℚ
h : LiouvilleWith p ↑r
⊢ False

tactic: rcases eq_or_ne r 0 with (rfl | h0)
state_before: case intro
p q y : ℝ
r✝ : ℚ
m : ℤ
n : ℕ
hp : 1 < p
r : ℚ
h : LiouvilleWith p ↑r
⊢ False
state_after: case intro.inl
p q y : ℝ
r : ℚ
m : ℤ
n : ℕ
hp : 1 < p
h : LiouvilleWith p ↑0
⊢ False

case intro.inr
p q y : ℝ
r✝ : ℚ
m : ℤ
n : ℕ
hp : 1 < p
r : ℚ
h : LiouvilleWith p ↑r
h0 : r ≠ 0
⊢ False

tactic: refine h.ne_cast_int hp 0 ?_
state_before: case intro.inl
p q y : ℝ
r : ℚ
m : ℤ
n : ℕ
hp : 1 < p
h : LiouvilleWith p ↑0
⊢ False
state_after: case intro.inl
p q y : ℝ
r : ℚ
m : ℤ
n : ℕ
hp : 1 < p
h : LiouvilleWith p ↑0
⊢ ↑0 = ↑0

tactic: rw [Rat.cast_zero, Int.cast_zero]
state_before: case intro.inl
p q y : ℝ
r : ℚ
m : ℤ
n : ℕ
hp : 1 < p
h : LiouvilleWith p ↑0
⊢ ↑0 = ↑0
state_after: no goals

tactic: refine (h.mul_rat (inv_ne_zero h0)).ne_cast_int hp 1 ?_
state_before: case intro.inr
p q y : ℝ
r✝ : ℚ
m : ℤ
n : ℕ
hp : 1 < p
r : ℚ
h : LiouvilleWith p ↑r
h0 : r ≠ 0
⊢ False
state_after: case intro.inr
p q y : ℝ
r✝ : ℚ
m : ℤ
n : ℕ
hp : 1 < p
r : ℚ
h : LiouvilleWith p ↑r
h0 : r ≠ 0
⊢ ↑r * ↑r⁻¹ = ↑1

tactic: rw [Rat.cast_inv, mul_inv_cancel]
state_before: case intro.inr
p q y : ℝ
r✝ : ℚ
m : ℤ
n : ℕ
hp : 1 < p
r : ℚ
h : LiouvilleWith p ↑r
h0 : r ≠ 0
⊢ ↑r * ↑r⁻¹ = ↑1
state_after: case intro.inr
p q y : ℝ
r✝ : ℚ
m : ℤ
n : ℕ
hp : 1 < p
r : ℚ
h : LiouvilleWith p ↑r
h0 : r ≠ 0
⊢ 1 = ↑1

case intro.inr
p q y : ℝ
r✝ : ℚ
m : ℤ
n : ℕ
hp : 1 < p
r : ℚ
h : LiouvilleWith p ↑r
h0 : r ≠ 0
⊢ ↑r ≠ 0

tactic: exacts [Int.cast_one.symm, Rat.cast_ne_zero.mpr h0]
state_before: case intro.inr
p q y : ℝ
r✝ : ℚ
m : ℤ
n : ℕ
hp : 1 < p
r : ℚ
h : LiouvilleWith p ↑r
h0 : r ≠ 0
⊢ 1 = ↑1

case intro.inr
p q y : ℝ
r✝ : ℚ
m : ℤ
n : ℕ
hp : 1 < p
r : ℚ
h : LiouvilleWith p ↑r
h0 : r ≠ 0
⊢ ↑r ≠ 0
state_after: no goals
Theorem: Num.ofZNum_toNat
File: Mathlib/Data/Num/Lemmas.lean

tactic: rw [← PosNum.to_nat_to_int p]
state_before: α : Type u_1
p : PosNum
⊢ ↑(ofZNum (ZNum.pos p)) = (↑p).toNat
state_after: α : Type u_1
p : PosNum
⊢ ↑(ofZNum (ZNum.pos p)) = (↑↑p).toNat

tactic: rfl
state_before: α : Type u_1
p : PosNum
⊢ ↑(ofZNum (ZNum.pos p)) = (↑↑p).toNat
state_after: no goals

tactic: rw [← succ'_to_nat]
state_before: α : Type u_1
p : PosNum
⊢ ↑(↑p.pred' + 1) = ↑p
state_after: α : Type u_1
p : PosNum
⊢ ↑↑p.pred'.succ' = ↑p

tactic: simp
state_before: α : Type u_1
p : PosNum
⊢ ↑↑p.pred'.succ' = ↑p
state_after: no goals
Theorem: MulAction.orbitRel.Quotient.orbit_injective
File: Mathlib/GroupTheory/GroupAction/Basic.lean

tactic: intro x y h
state_before: G : Type u_1
α : Type u_2
β : Type u_3
inst✝² : Group G
inst✝¹ : MulAction G α
inst✝ : MulAction G β
⊢ Injective orbit
state_after: G : Type u_1
α : Type u_2
β : Type u_3
inst✝² : Group G
inst✝¹ : MulAction G α
inst✝ : MulAction G β
x y : Quotient G α
h : x.orbit = y.orbit
⊢ x = y

tactic: simp_rw [orbitRel.Quotient.orbit_eq_orbit_out _ Quotient.out_eq', orbit_eq_iff,
  ← orbitRel_r_apply] at h
state_before: G : Type u_1
α : Type u_2
β : Type u_3
inst✝² : Group G
inst✝¹ : MulAction G α
inst✝ : MulAction G β
x y : Quotient G α
h : x.orbit = y.orbit
⊢ x = y
state_after: G : Type u_1
α : Type u_2
β : Type u_3
inst✝² : Group G
inst✝¹ : MulAction G α
inst✝ : MulAction G β
x y : Quotient G α
h : Setoid.r (Quotient.out' x) (Quotient.out' y)
⊢ x = y

tactic: simpa [← Quotient.eq''] using h
state_before: G : Type u_1
α : Type u_2
β : Type u_3
inst✝² : Group G
inst✝¹ : MulAction G α
inst✝ : MulAction G β
x y : Quotient G α
h : Setoid.r (Quotient.out' x) (Quotient.out' y)
⊢ x = y
state_after: no goals
Theorem: AdicCompletion.transitionMap_comp_apply
File: Mathlib/RingTheory/AdicCompletion/Basic.lean

tactic: change (transitionMap I M hmn ∘ₗ transitionMap I M hnk) x = transitionMap I M (hmn.trans hnk) x
state_before: R : Type u_1
inst✝⁴ : CommRing R
I : Ideal R
M : Type u_2
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type u_3
inst✝¹ : AddCommGroup N
inst✝ : Module R N
m n k : ℕ
hmn : m ≤ n
hnk : n ≤ k
x : M ⧸ I ^ k • ⊤
⊢ (transitionMap I M hmn) ((transitionMap I M hnk) x) = (transitionMap I M ⋯) x
state_after: R : Type u_1
inst✝⁴ : CommRing R
I : Ideal R
M : Type u_2
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type u_3
inst✝¹ : AddCommGroup N
inst✝ : Module R N
m n k : ℕ
hmn : m ≤ n
hnk : n ≤ k
x : M ⧸ I ^ k • ⊤
⊢ (transitionMap I M hmn ∘ₗ transitionMap I M hnk) x = (transitionMap I M ⋯) x

tactic: simp
state_before: R : Type u_1
inst✝⁴ : CommRing R
I : Ideal R
M : Type u_2
inst✝³ : AddCommGroup M
inst✝² : Module R M
N : Type u_3
inst✝¹ : AddCommGroup N
inst✝ : Module R N
m n k : ℕ
hmn : m ≤ n
hnk : n ≤ k
x : M ⧸ I ^ k • ⊤
⊢ (transitionMap I M hmn ∘ₗ transitionMap I M hnk) x = (transitionMap I M ⋯) x
state_after: no goals
Theorem: Finset.coe_eq_pair
File: Mathlib/Data/Finset/Basic.lean

tactic: rw [← coe_pair, coe_inj]
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
inst✝ : DecidableEq α
s✝ t u v : Finset α
a✝ b✝ : α
s : Finset α
a b : α
⊢ ↑s = {a, b} ↔ s = {a, b}
state_after: no goals
Theorem: cauchySeq_iff_tendsto_dist_atTop_0
File: Mathlib/Topology/MetricSpace/Pseudo/Defs.lean

tactic: rw [cauchySeq_iff_tendsto, Metric.uniformity_eq_comap_nhds_zero, tendsto_comap_iff,
  Function.comp_def]
state_before: α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : β → α
⊢ CauchySeq u ↔ Tendsto (fun n => dist (u n.1) (u n.2)) atTop (𝓝 0)
state_after: α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : β → α
⊢ Tendsto (fun x => dist (Prod.map u u x).1 (Prod.map u u x).2) atTop (𝓝 0) ↔
    Tendsto (fun n => dist (u n.1) (u n.2)) atTop (𝓝 0)

tactic: simp_rw [Prod.map_fst, Prod.map_snd]
state_before: α : Type u
β : Type v
X : Type u_1
ι : Type u_2
inst✝² : PseudoMetricSpace α
inst✝¹ : Nonempty β
inst✝ : SemilatticeSup β
u : β → α
⊢ Tendsto (fun x => dist (Prod.map u u x).1 (Prod.map u u x).2) atTop (𝓝 0) ↔
    Tendsto (fun n => dist (u n.1) (u n.2)) atTop (𝓝 0)
state_after: no goals
Theorem: Matroid.coindep_iff_exists'
File: Mathlib/Data/Matroid/Dual.lean

tactic: simp_rw [Coindep, dual_indep_iff_exists', and_comm (a := _ ⊆ _), and_congr_left_iff, subset_diff]
state_before: α : Type u_1
M : Matroid α
I B X : Set α
⊢ M.Coindep X ↔ (∃ B, M.Base B ∧ B ⊆ M.E \ X) ∧ X ⊆ M.E
state_after: α : Type u_1
M : Matroid α
I B X : Set α
⊢ X ⊆ M.E → ((∃ B, M.Base B ∧ Disjoint X B) ↔ ∃ B, M.Base B ∧ B ⊆ M.E ∧ Disjoint B X)

tactic: exact fun _ ↦ ⟨fun ⟨B, hB, hXB⟩ ↦ ⟨B, hB, hB.subset_ground, hXB.symm⟩,
  fun ⟨B, hB, _, hBX⟩ ↦ ⟨B, hB, hBX.symm⟩⟩
state_before: α : Type u_1
M : Matroid α
I B X : Set α
⊢ X ⊆ M.E → ((∃ B, M.Base B ∧ Disjoint X B) ↔ ∃ B, M.Base B ∧ B ⊆ M.E ∧ Disjoint B X)
state_after: no goals
Theorem: Matrix.dotProduct_comm
File: Mathlib/Data/Matrix/Basic.lean

tactic: simp_rw [dotProduct, mul_comm]
state_before: l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
m' : o → Type u_5
n' : o → Type u_6
R : Type u_7
S : Type u_8
α : Type v
β : Type w
γ : Type u_9
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : AddCommMonoid α
inst✝ : CommSemigroup α
v w : m → α
⊢ v ⬝ᵥ w = w ⬝ᵥ v
state_after: no goals
Theorem: Batteries.RBNode.Path.ins_toList
File: .lake/packages/batteries/Batteries/Data/RBMap/Lemmas.lean

tactic: match p with
| .root | .left red .. | .right red .. | .left black .. | .right black .. =>
  simp [ins, ins_toList]
state_before: α : Type u_1
t : RBNode α
p : Path α
⊢ (p.ins t).toList = p.withList t.toList
state_after: no goals

tactic: simp [ins, ins_toList]
state_before: α : Type u_1
t : RBNode α
p : Path α
l✝ : RBNode α
v✝ : α
parent✝ : Path α
⊢ ((right black l✝ v✝ parent✝).ins t).toList = (right black l✝ v✝ parent✝).withList t.toList
state_after: no goals
Theorem: Subgroup.IsComplement.leftCosetEquivalence_equiv_fst
File: Mathlib/GroupTheory/Complement.lean

tactic: rw [equiv_fst_eq_mul_inv]
state_before: G : Type u_1
inst✝ : Group G
H K : Subgroup G
S T : Set G
hST : IsComplement S T
hHT : IsComplement (↑H) T
hSK : IsComplement S ↑K
g : G
⊢ LeftCosetEquivalence (↑K) g ↑(hSK.equiv g).1
state_after: G : Type u_1
inst✝ : Group G
H K : Subgroup G
S T : Set G
hST : IsComplement S T
hHT : IsComplement (↑H) T
hSK : IsComplement S ↑K
g : G
⊢ LeftCosetEquivalence (↑K) g (g * (↑(hSK.equiv g).2)⁻¹)

tactic: simp [LeftCosetEquivalence, leftCoset_eq_iff]
state_before: G : Type u_1
inst✝ : Group G
H K : Subgroup G
S T : Set G
hST : IsComplement S T
hHT : IsComplement (↑H) T
hSK : IsComplement S ↑K
g : G
⊢ LeftCosetEquivalence (↑K) g (g * (↑(hSK.equiv g).2)⁻¹)
state_after: no goals
Theorem: AffineSubspace.sSameSide_vadd_right_iff
File: Mathlib/Analysis/Convex/Side.lean

tactic: rw [sSameSide_comm, sSameSide_vadd_left_iff hv, sSameSide_comm]
state_before: R : Type u_1
V : Type u_2
V' : Type u_3
P : Type u_4
P' : Type u_5
inst✝⁶ : StrictOrderedCommRing R
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module R V
inst✝³ : AddTorsor V P
inst✝² : AddCommGroup V'
inst✝¹ : Module R V'
inst✝ : AddTorsor V' P'
s : AffineSubspace R P
x y : P
v : V
hv : v ∈ s.direction
⊢ s.SSameSide x (v +ᵥ y) ↔ s.SSameSide x y
state_after: no goals
Theorem: List.zip_unzip
File: Mathlib/Data/List/Zip.lean

tactic: simp only [unzip_cons, zip_cons_cons, zip_unzip l]
state_before: α : Type u
β : Type u_1
γ : Type u_2
δ : Type u_3
ε : Type u_4
a : α
b : β
l : List (α × β)
⊢ ((a, b) :: l).unzip.1.zip ((a, b) :: l).unzip.2 = (a, b) :: l
state_after: no goals
Theorem: mem_openSegment_of_ne_left_right
File: Mathlib/Analysis/Convex/Segment.lean

tactic: rw [← insert_endpoints_openSegment] at hz
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
ι : Type u_5
π : ι → Type u_6
inst✝² : OrderedSemiring 𝕜
inst✝¹ : AddCommMonoid E
inst✝ : Module 𝕜 E
s : Set E
x y z : E
hx : x ≠ z
hy : y ≠ z
hz : z ∈ [x-[𝕜]y]
⊢ z ∈ openSegment 𝕜 x y
state_after: 𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
ι : Type u_5
π : ι → Type u_6
inst✝² : OrderedSemiring 𝕜
inst✝¹ : AddCommMonoid E
inst✝ : Module 𝕜 E
s : Set E
x y z : E
hx : x ≠ z
hy : y ≠ z
hz : z ∈ insert x (insert y (openSegment 𝕜 x y))
⊢ z ∈ openSegment 𝕜 x y

tactic: exact (hz.resolve_left hx.symm).resolve_left hy.symm
state_before: 𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
ι : Type u_5
π : ι → Type u_6
inst✝² : OrderedSemiring 𝕜
inst✝¹ : AddCommMonoid E
inst✝ : Module 𝕜 E
s : Set E
x y z : E
hx : x ≠ z
hy : y ≠ z
hz : z ∈ insert x (insert y (openSegment 𝕜 x y))
⊢ z ∈ openSegment 𝕜 x y
state_after: no goals
Theorem: Finsupp.support_erase
File: Mathlib/Data/Finsupp/Defs.lean

tactic: classical
dsimp [erase]
congr; apply Subsingleton.elim
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
inst✝ : DecidableEq α
a : α
f : α →₀ M
⊢ (erase a f).support = f.support.erase a
state_after: no goals

tactic: dsimp [erase]
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
inst✝ : DecidableEq α
a : α
f : α →₀ M
⊢ (erase a f).support = f.support.erase a
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
inst✝ : DecidableEq α
a : α
f : α →₀ M
⊢ f.support.erase a = f.support.erase a

tactic: congr
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
inst✝ : DecidableEq α
a : α
f : α →₀ M
⊢ f.support.erase a = f.support.erase a
state_after: case h.e_2.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
inst✝ : DecidableEq α
a : α
f : α →₀ M
⊢ Classical.decEq α = inst✝

tactic: apply Subsingleton.elim
state_before: case h.e_2.h
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝¹ : Zero M
inst✝ : DecidableEq α
a : α
f : α →₀ M
⊢ Classical.decEq α = inst✝
state_after: no goals
Theorem: Sym2.rel_iff'
File: Mathlib/Data/Sym/Sym2.lean

tactic: aesop (rule_sets := [Sym2])
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
p q : α × α
⊢ Rel α p q ↔ p = q ∨ p = q.swap
state_after: no goals
Theorem: Real.Angle.toReal_coe_eq_self_add_two_pi_iff
File: Mathlib/Analysis/SpecialFunctions/Trigonometric/Angle.lean

tactic: convert @toReal_coe_eq_self_sub_two_mul_int_mul_pi_iff θ (-1) using 2 <;> norm_num
state_before: θ : ℝ
⊢ (↑θ).toReal = θ + 2 * π ↔ θ ∈ Set.Ioc (-3 * π) (-π)
state_after: no goals
Theorem: Ordinal.log_pos
File: Mathlib/SetTheory/Ordinal/Exponential.lean

tactic: rwa [← succ_le_iff, succ_zero, ← opow_le_iff_le_log hb ho, opow_one]
state_before: b o : Ordinal.{u_1}
hb : 1 < b
ho : o ≠ 0
hbo : b ≤ o
⊢ 0 < log b o
state_after: no goals
Theorem: HasDerivAt.clog
File: Mathlib/Analysis/SpecialFunctions/Complex/LogDeriv.lean

tactic: rw [div_eq_inv_mul]
state_before: α : Type u_1
inst✝² : TopologicalSpace α
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℂ E
f : ℂ → ℂ
f' x : ℂ
h₁ : HasDerivAt f f' x
h₂ : f x ∈ slitPlane
⊢ HasDerivAt (fun t => log (f t)) (f' / f x) x
state_after: α : Type u_1
inst✝² : TopologicalSpace α
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℂ E
f : ℂ → ℂ
f' x : ℂ
h₁ : HasDerivAt f f' x
h₂ : f x ∈ slitPlane
⊢ HasDerivAt (fun t => log (f t)) ((f x)⁻¹ * f') x

tactic: exact (hasStrictDerivAt_log h₂).hasDerivAt.comp x h₁
state_before: α : Type u_1
inst✝² : TopologicalSpace α
E : Type u_2
inst✝¹ : NormedAddCommGroup E
inst✝ : NormedSpace ℂ E
f : ℂ → ℂ
f' x : ℂ
h₁ : HasDerivAt f f' x
h₂ : f x ∈ slitPlane
⊢ HasDerivAt (fun t => log (f t)) ((f x)⁻¹ * f') x
state_after: no goals
Theorem: CategoryTheory.Adjunction.map_injective
File: Mathlib/CategoryTheory/Preadditive/Injective.lean

tactic: intro
state_before: C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u_1
inst✝¹ : Category.{u_2, u_1} D
F : C ⥤ D
G : D ⥤ C
adj : F ⊣ G
inst✝ : F.PreservesMonomorphisms
I : D
hI : Injective I
X Y : C
f : X ⟶ G.obj I
g : X ⟶ Y
⊢ ∀ [inst : Mono g], ∃ h, g ≫ h = f
state_after: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u_1
inst✝² : Category.{u_2, u_1} D
F : C ⥤ D
G : D ⥤ C
adj : F ⊣ G
inst✝¹ : F.PreservesMonomorphisms
I : D
hI : Injective I
X Y : C
f : X ⟶ G.obj I
g : X ⟶ Y
inst✝ : Mono g
⊢ ∃ h, g ≫ h = f

tactic: rcases hI.factors (F.map f ≫ adj.counit.app _) (F.map g) with ⟨w,h⟩
state_before: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u_1
inst✝² : Category.{u_2, u_1} D
F : C ⥤ D
G : D ⥤ C
adj : F ⊣ G
inst✝¹ : F.PreservesMonomorphisms
I : D
hI : Injective I
X Y : C
f : X ⟶ G.obj I
g : X ⟶ Y
inst✝ : Mono g
⊢ ∃ h, g ≫ h = f
state_after: case intro
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u_1
inst✝² : Category.{u_2, u_1} D
F : C ⥤ D
G : D ⥤ C
adj : F ⊣ G
inst✝¹ : F.PreservesMonomorphisms
I : D
hI : Injective I
X Y : C
f : X ⟶ G.obj I
g : X ⟶ Y
inst✝ : Mono g
w : F.obj Y ⟶ I
h : F.map g ≫ w = F.map f ≫ adj.counit.app I
⊢ ∃ h, g ≫ h = f

tactic: use adj.unit.app Y ≫ G.map w
state_before: case intro
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u_1
inst✝² : Category.{u_2, u_1} D
F : C ⥤ D
G : D ⥤ C
adj : F ⊣ G
inst✝¹ : F.PreservesMonomorphisms
I : D
hI : Injective I
X Y : C
f : X ⟶ G.obj I
g : X ⟶ Y
inst✝ : Mono g
w : F.obj Y ⟶ I
h : F.map g ≫ w = F.map f ≫ adj.counit.app I
⊢ ∃ h, g ≫ h = f
state_after: case h
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u_1
inst✝² : Category.{u_2, u_1} D
F : C ⥤ D
G : D ⥤ C
adj : F ⊣ G
inst✝¹ : F.PreservesMonomorphisms
I : D
hI : Injective I
X Y : C
f : X ⟶ G.obj I
g : X ⟶ Y
inst✝ : Mono g
w : F.obj Y ⟶ I
h : F.map g ≫ w = F.map f ≫ adj.counit.app I
⊢ g ≫ adj.unit.app Y ≫ G.map w = f

tactic: rw [← unit_naturality_assoc, ← G.map_comp, h]
state_before: case h
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u_1
inst✝² : Category.{u_2, u_1} D
F : C ⥤ D
G : D ⥤ C
adj : F ⊣ G
inst✝¹ : F.PreservesMonomorphisms
I : D
hI : Injective I
X Y : C
f : X ⟶ G.obj I
g : X ⟶ Y
inst✝ : Mono g
w : F.obj Y ⟶ I
h : F.map g ≫ w = F.map f ≫ adj.counit.app I
⊢ g ≫ adj.unit.app Y ≫ G.map w = f
state_after: case h
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u_1
inst✝² : Category.{u_2, u_1} D
F : C ⥤ D
G : D ⥤ C
adj : F ⊣ G
inst✝¹ : F.PreservesMonomorphisms
I : D
hI : Injective I
X Y : C
f : X ⟶ G.obj I
g : X ⟶ Y
inst✝ : Mono g
w : F.obj Y ⟶ I
h : F.map g ≫ w = F.map f ≫ adj.counit.app I
⊢ adj.unit.app X ≫ G.map (F.map f ≫ adj.counit.app I) = f

tactic: simp
state_before: case h
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u_1
inst✝² : Category.{u_2, u_1} D
F : C ⥤ D
G : D ⥤ C
adj : F ⊣ G
inst✝¹ : F.PreservesMonomorphisms
I : D
hI : Injective I
X Y : C
f : X ⟶ G.obj I
g : X ⟶ Y
inst✝ : Mono g
w : F.obj Y ⟶ I
h : F.map g ≫ w = F.map f ≫ adj.counit.app I
⊢ adj.unit.app X ≫ G.map (F.map f ≫ adj.counit.app I) = f
state_after: no goals
Theorem: dist_inf_sup_pi
File: Mathlib/Analysis/Normed/Order/UpperLower.lean

tactic: refine' congr_arg NNReal.toReal (Finset.sup_congr rfl fun i _ ↦ _)
state_before: α : Type u_1
ι : Type u_2
inst✝ : Fintype ι
s t : Set (ι → ℝ)
a₁ a₂ b₁ b₂ x✝ y✝ : ι → ℝ
δ : ℝ
x y : ι → ℝ
⊢ dist (x ⊓ y) (x ⊔ y) = dist x y
state_after: α : Type u_1
ι : Type u_2
inst✝ : Fintype ι
s t : Set (ι → ℝ)
a₁ a₂ b₁ b₂ x✝¹ y✝ : ι → ℝ
δ : ℝ
x y : ι → ℝ
i : ι
x✝ : i ∈ Finset.univ
⊢ nndist ((x ⊓ y) i) ((x ⊔ y) i) = nndist (x i) (y i)

tactic: simp only [Real.nndist_eq', sup_eq_max, inf_eq_min, max_sub_min_eq_abs, Pi.inf_apply,
  Pi.sup_apply, Real.nnabs_of_nonneg, abs_nonneg, Real.toNNReal_abs]
state_before: α : Type u_1
ι : Type u_2
inst✝ : Fintype ι
s t : Set (ι → ℝ)
a₁ a₂ b₁ b₂ x✝¹ y✝ : ι → ℝ
δ : ℝ
x y : ι → ℝ
i : ι
x✝ : i ∈ Finset.univ
⊢ nndist ((x ⊓ y) i) ((x ⊔ y) i) = nndist (x i) (y i)
state_after: no goals
Theorem: ext_nat''
File: Mathlib/Data/Nat/Cast/Basic.lean

tactic: apply DFunLike.ext
state_before: α : Type u_1
β : Type u_2
A : Type u_3
F : Type u_4
inst✝² : MulZeroOneClass A
inst✝¹ : FunLike F ℕ A
inst✝ : MonoidWithZeroHomClass F ℕ A
f g : F
h_pos : ∀ {n : ℕ}, 0 < n → f n = g n
⊢ f = g
state_after: case h
α : Type u_1
β : Type u_2
A : Type u_3
F : Type u_4
inst✝² : MulZeroOneClass A
inst✝¹ : FunLike F ℕ A
inst✝ : MonoidWithZeroHomClass F ℕ A
f g : F
h_pos : ∀ {n : ℕ}, 0 < n → f n = g n
⊢ ∀ (x : ℕ), f x = g x

tactic: rintro (_ | n)
state_before: case h
α : Type u_1
β : Type u_2
A : Type u_3
F : Type u_4
inst✝² : MulZeroOneClass A
inst✝¹ : FunLike F ℕ A
inst✝ : MonoidWithZeroHomClass F ℕ A
f g : F
h_pos : ∀ {n : ℕ}, 0 < n → f n = g n
⊢ ∀ (x : ℕ), f x = g x
state_after: case h.zero
α : Type u_1
β : Type u_2
A : Type u_3
F : Type u_4
inst✝² : MulZeroOneClass A
inst✝¹ : FunLike F ℕ A
inst✝ : MonoidWithZeroHomClass F ℕ A
f g : F
h_pos : ∀ {n : ℕ}, 0 < n → f n = g n
⊢ f 0 = g 0

case h.succ
α : Type u_1
β : Type u_2
A : Type u_3
F : Type u_4
inst✝² : MulZeroOneClass A
inst✝¹ : FunLike F ℕ A
inst✝ : MonoidWithZeroHomClass F ℕ A
f g : F
h_pos : ∀ {n : ℕ}, 0 < n → f n = g n
n : ℕ
⊢ f (n + 1) = g (n + 1)

tactic: simp [map_zero f, map_zero g]
state_before: case h.zero
α : Type u_1
β : Type u_2
A : Type u_3
F : Type u_4
inst✝² : MulZeroOneClass A
inst✝¹ : FunLike F ℕ A
inst✝ : MonoidWithZeroHomClass F ℕ A
f g : F
h_pos : ∀ {n : ℕ}, 0 < n → f n = g n
⊢ f 0 = g 0
state_after: no goals

tactic: exact h_pos n.succ_pos
state_before: case h.succ
α : Type u_1
β : Type u_2
A : Type u_3
F : Type u_4
inst✝² : MulZeroOneClass A
inst✝¹ : FunLike F ℕ A
inst✝ : MonoidWithZeroHomClass F ℕ A
f g : F
h_pos : ∀ {n : ℕ}, 0 < n → f n = g n
n : ℕ
⊢ f (n + 1) = g (n + 1)
state_after: no goals