1337xyz1337xyz/leandojo-benchmark4-v10 huggingface dataset:
Theorem: Quiver.reverse_inj
File: Mathlib/Combinatorics/Quiver/Symmetric.lean

tactic: constructor
state_before: U : Type u_1
V : Type u_2
W : Type u_3
inst✝² : Quiver U
inst✝¹ : Quiver V
inst✝ : Quiver W
h : HasInvolutiveReverse V
a b : V
f g : a ⟶ b
⊢ reverse f = reverse g ↔ f = g
state_after: case mp
U : Type u_1
V : Type u_2
W : Type u_3
inst✝² : Quiver U
inst✝¹ : Quiver V
inst✝ : Quiver W
h : HasInvolutiveReverse V
a b : V
f g : a ⟶ b
⊢ reverse f = reverse g → f = g

case mpr
U : Type u_1
V : Type u_2
W : Type u_3
inst✝² : Quiver U
inst✝¹ : Quiver V
inst✝ : Quiver W
h : HasInvolutiveReverse V
a b : V
f g : a ⟶ b
⊢ f = g → reverse f = reverse g

tactic: rintro h
state_before: case mp
U : Type u_1
V : Type u_2
W : Type u_3
inst✝² : Quiver U
inst✝¹ : Quiver V
inst✝ : Quiver W
h : HasInvolutiveReverse V
a b : V
f g : a ⟶ b
⊢ reverse f = reverse g → f = g
state_after: case mp
U : Type u_1
V : Type u_2
W : Type u_3
inst✝² : Quiver U
inst✝¹ : Quiver V
inst✝ : Quiver W
h✝ : HasInvolutiveReverse V
a b : V
f g : a ⟶ b
h : reverse f = reverse g
⊢ f = g

tactic: simpa using congr_arg Quiver.reverse h
state_before: case mp
U : Type u_1
V : Type u_2
W : Type u_3
inst✝² : Quiver U
inst✝¹ : Quiver V
inst✝ : Quiver W
h✝ : HasInvolutiveReverse V
a b : V
f g : a ⟶ b
h : reverse f = reverse g
⊢ f = g
state_after: no goals

tactic: rintro h
state_before: case mpr
U : Type u_1
V : Type u_2
W : Type u_3
inst✝² : Quiver U
inst✝¹ : Quiver V
inst✝ : Quiver W
h : HasInvolutiveReverse V
a b : V
f g : a ⟶ b
⊢ f = g → reverse f = reverse g
state_after: case mpr
U : Type u_1
V : Type u_2
W : Type u_3
inst✝² : Quiver U
inst✝¹ : Quiver V
inst✝ : Quiver W
h✝ : HasInvolutiveReverse V
a b : V
f g : a ⟶ b
h : f = g
⊢ reverse f = reverse g

tactic: congr
state_before: case mpr
U : Type u_1
V : Type u_2
W : Type u_3
inst✝² : Quiver U
inst✝¹ : Quiver V
inst✝ : Quiver W
h✝ : HasInvolutiveReverse V
a b : V
f g : a ⟶ b
h : f = g
⊢ reverse f = reverse g
state_after: no goals
Theorem: WeierstrassCurve.natDegree_preΨ_pos
File: Mathlib/AlgebraicGeometry/EllipticCurve/DivisionPolynomial/Degree.lean

tactic: induction n using Int.negInduction with
| nat n => simpa only [preΨ_ofNat] using W.natDegree_preΨ'_pos hn <| by exact_mod_cast h
| neg n ih => simpa only [preΨ_neg, natDegree_neg]
      using ih (by rwa [← Int.natAbs_neg]) <| neg_ne_zero.mp <| by exact_mod_cast h
state_before: R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
n : ℤ
hn : 2 < n.natAbs
h : ↑n ≠ 0
⊢ 0 < (W.preΨ n).natDegree
state_after: no goals

tactic: simpa only [preΨ_ofNat] using W.natDegree_preΨ'_pos hn <| by exact_mod_cast h
state_before: case nat
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
n : ℕ
hn : 2 < (↑n).natAbs
h : ↑↑n ≠ 0
⊢ 0 < (W.preΨ ↑n).natDegree
state_after: no goals

tactic: exact_mod_cast h
state_before: R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
n : ℕ
hn : 2 < (↑n).natAbs
h : ↑↑n ≠ 0
⊢ ↑(↑n).natAbs ≠ 0
state_after: no goals

tactic: simpa only [preΨ_neg, natDegree_neg]
using ih (by rwa [← Int.natAbs_neg]) <| neg_ne_zero.mp <| by exact_mod_cast h
state_before: case neg
R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
n : ℕ
ih : 2 < (↑n).natAbs → ↑↑n ≠ 0 → 0 < (W.preΨ ↑n).natDegree
hn : 2 < (-↑n).natAbs
h : ↑(-↑n) ≠ 0
⊢ 0 < (W.preΨ (-↑n)).natDegree
state_after: no goals

tactic: rwa [← Int.natAbs_neg]
state_before: R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
n : ℕ
ih : 2 < (↑n).natAbs → ↑↑n ≠ 0 → 0 < (W.preΨ ↑n).natDegree
hn : 2 < (-↑n).natAbs
h : ↑(-↑n) ≠ 0
⊢ 2 < (↑n).natAbs
state_after: no goals

tactic: exact_mod_cast h
state_before: R : Type u
inst✝ : CommRing R
W : WeierstrassCurve R
n : ℕ
ih : 2 < (↑n).natAbs → ↑↑n ≠ 0 → 0 < (W.preΨ ↑n).natDegree
hn : 2 < (-↑n).natAbs
h : ↑(-↑n) ≠ 0
⊢ -↑↑n ≠ 0
state_after: no goals
Theorem: AffineIsometry.coe_toAffineMap
File: Mathlib/Analysis/NormedSpace/AffineIsometry.lean

tactic: rfl
state_before: 𝕜 : Type u_1
V : Type u_2
V₁ : Type u_3
V₁' : Type u_4
V₂ : Type u_5
V₃ : Type u_6
V₄ : Type u_7
P₁ : Type u_8
P₁' : Type u_9
P : Type u_10
P₂ : Type u_11
P₃ : Type u_12
P₄ : Type u_13
inst✝²⁴ : NormedField 𝕜
inst✝²³ : SeminormedAddCommGroup V
inst✝²² : NormedSpace 𝕜 V
inst✝²¹ : PseudoMetricSpace P
inst✝²⁰ : NormedAddTorsor V P
inst✝¹⁹ : SeminormedAddCommGroup V₁
inst✝¹⁸ : NormedSpace 𝕜 V₁
inst✝¹⁷ : PseudoMetricSpace P₁
inst✝¹⁶ : NormedAddTorsor V₁ P₁
inst✝¹⁵ : SeminormedAddCommGroup V₁'
inst✝¹⁴ : NormedSpace 𝕜 V₁'
inst✝¹³ : MetricSpace P₁'
inst✝¹² : NormedAddTorsor V₁' P₁'
inst✝¹¹ : SeminormedAddCommGroup V₂
inst✝¹⁰ : NormedSpace 𝕜 V₂
inst✝⁹ : PseudoMetricSpace P₂
inst✝⁸ : NormedAddTorsor V₂ P₂
inst✝⁷ : SeminormedAddCommGroup V₃
inst✝⁶ : NormedSpace 𝕜 V₃
inst✝⁵ : PseudoMetricSpace P₃
inst✝⁴ : NormedAddTorsor V₃ P₃
inst✝³ : SeminormedAddCommGroup V₄
inst✝² : NormedSpace 𝕜 V₄
inst✝¹ : PseudoMetricSpace P₄
inst✝ : NormedAddTorsor V₄ P₄
f : P →ᵃⁱ[𝕜] P₂
⊢ ⇑f.toAffineMap = ⇑f
state_after: no goals
Theorem: Quotient.finChoice_eq
File: Mathlib/Data/Fintype/Quotient.lean

tactic: dsimp only [Quotient.finChoice]
state_before: ι : Type u_1
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
α : ι → Type u_2
inst✝ : (i : ι) → Setoid (α i)
f : (i : ι) → α i
⊢ (finChoice fun i => ⟦f i⟧) = ⟦f⟧
state_after: ι : Type u_1
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
α : ι → Type u_2
inst✝ : (i : ι) → Setoid (α i)
f : (i : ι) → α i
⊢ (Quotient.recOn Finset.univ.val (fun l => finChoiceAux l fun i x => ⟦f i⟧) ⋯).liftOn (fun f => ⟦fun i => f i ⋯⟧) ⋯ =
    ⟦f⟧

tactic: conv_lhs =>
  enter [1]
  tactic =>
    change _ = ⟦fun i _ => f i⟧
    exact Quotient.inductionOn (@Finset.univ ι _).1 fun l => Quotient.finChoiceAux_eq _ _
state_before: ι : Type u_1
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
α : ι → Type u_2
inst✝ : (i : ι) → Setoid (α i)
f : (i : ι) → α i
⊢ (Quotient.recOn Finset.univ.val (fun l => finChoiceAux l fun i x => ⟦f i⟧) ⋯).liftOn (fun f => ⟦fun i => f i ⋯⟧) ⋯ =
    ⟦f⟧
state_after: ι : Type u_1
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
α : ι → Type u_2
inst✝ : (i : ι) → Setoid (α i)
f : (i : ι) → α i
⊢ ⟦fun i x => f i⟧.liftOn (fun f => ⟦fun i => f i ⋯⟧) ⋯ = ⟦f⟧

tactic: rfl
state_before: ι : Type u_1
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
α : ι → Type u_2
inst✝ : (i : ι) → Setoid (α i)
f : (i : ι) → α i
⊢ ⟦fun i x => f i⟧.liftOn (fun f => ⟦fun i => f i ⋯⟧) ⋯ = ⟦f⟧
state_after: no goals

tactic: change _ = ⟦fun i _ => f i⟧
state_before: ι : Type u_1
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
α : ι → Type u_2
inst✝ : (i : ι) → Setoid (α i)
f : (i : ι) → α i
⊢ Quotient.recOn Finset.univ.val (fun l => finChoiceAux l fun i x => ⟦f i⟧) ⋯ = ?m.7114
state_after: ι : Type u_1
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
α : ι → Type u_2
inst✝ : (i : ι) → Setoid (α i)
f : (i : ι) → α i
⊢ Quotient.recOn Finset.univ.val (fun l => finChoiceAux l fun i x => ⟦f i⟧) ⋯ = ⟦fun i x => f i⟧

tactic: exact Quotient.inductionOn (@Finset.univ ι _).1 fun l => Quotient.finChoiceAux_eq _ _
state_before: ι : Type u_1
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
α : ι → Type u_2
inst✝ : (i : ι) → Setoid (α i)
f : (i : ι) → α i
⊢ Quotient.recOn Finset.univ.val (fun l => finChoiceAux l fun i x => ⟦f i⟧) ⋯ = ⟦fun i x => f i⟧
state_after: no goals
Theorem: SetLike.list_prod_map_mem_graded
File: Mathlib/Algebra/GradedMonoid.lean

tactic: match l with
| [] =>
  rw [List.map_nil, List.map_nil, List.prod_nil, List.sum_nil]
  exact one_mem_graded _
| head::tail =>
  rw [List.map_cons, List.map_cons, List.prod_cons, List.sum_cons]
  exact
    mul_mem_graded (h _ <| List.mem_cons_self _ _)
      (list_prod_map_mem_graded tail _ _ fun j hj => h _ <| List.mem_cons_of_mem _ hj)
state_before: ι : Type u_1
R : Type u_2
S : Type u_3
inst✝³ : SetLike S R
inst✝² : Monoid R
inst✝¹ : AddMonoid ι
A : ι → S
inst✝ : GradedMonoid A
ι' : Type u_4
l : List ι'
i : ι' → ι
r : ι' → R
h : ∀ j ∈ l, r j ∈ A (i j)
⊢ (List.map r l).prod ∈ A (List.map i l).sum
state_after: no goals

tactic: rw [List.map_nil, List.map_nil, List.prod_nil, List.sum_nil]
state_before: ι : Type u_1
R : Type u_2
S : Type u_3
inst✝³ : SetLike S R
inst✝² : Monoid R
inst✝¹ : AddMonoid ι
A : ι → S
inst✝ : GradedMonoid A
ι' : Type u_4
l : List ι'
i : ι' → ι
r : ι' → R
h : ∀ j ∈ [], r j ∈ A (i j)
⊢ (List.map r []).prod ∈ A (List.map i []).sum
state_after: ι : Type u_1
R : Type u_2
S : Type u_3
inst✝³ : SetLike S R
inst✝² : Monoid R
inst✝¹ : AddMonoid ι
A : ι → S
inst✝ : GradedMonoid A
ι' : Type u_4
l : List ι'
i : ι' → ι
r : ι' → R
h : ∀ j ∈ [], r j ∈ A (i j)
⊢ 1 ∈ A 0

tactic: exact one_mem_graded _
state_before: ι : Type u_1
R : Type u_2
S : Type u_3
inst✝³ : SetLike S R
inst✝² : Monoid R
inst✝¹ : AddMonoid ι
A : ι → S
inst✝ : GradedMonoid A
ι' : Type u_4
l : List ι'
i : ι' → ι
r : ι' → R
h : ∀ j ∈ [], r j ∈ A (i j)
⊢ 1 ∈ A 0
state_after: no goals

tactic: rw [List.map_cons, List.map_cons, List.prod_cons, List.sum_cons]
state_before: ι : Type u_1
R : Type u_2
S : Type u_3
inst✝³ : SetLike S R
inst✝² : Monoid R
inst✝¹ : AddMonoid ι
A : ι → S
inst✝ : GradedMonoid A
ι' : Type u_4
l : List ι'
i : ι' → ι
r : ι' → R
head : ι'
tail : List ι'
h : ∀ j ∈ head :: tail, r j ∈ A (i j)
⊢ (List.map r (head :: tail)).prod ∈ A (List.map i (head :: tail)).sum
state_after: ι : Type u_1
R : Type u_2
S : Type u_3
inst✝³ : SetLike S R
inst✝² : Monoid R
inst✝¹ : AddMonoid ι
A : ι → S
inst✝ : GradedMonoid A
ι' : Type u_4
l : List ι'
i : ι' → ι
r : ι' → R
head : ι'
tail : List ι'
h : ∀ j ∈ head :: tail, r j ∈ A (i j)
⊢ r head * (List.map r tail).prod ∈ A (i head + (List.map i tail).sum)

tactic: exact
  mul_mem_graded (h _ <| List.mem_cons_self _ _)
    (list_prod_map_mem_graded tail _ _ fun j hj => h _ <| List.mem_cons_of_mem _ hj)
state_before: ι : Type u_1
R : Type u_2
S : Type u_3
inst✝³ : SetLike S R
inst✝² : Monoid R
inst✝¹ : AddMonoid ι
A : ι → S
inst✝ : GradedMonoid A
ι' : Type u_4
l : List ι'
i : ι' → ι
r : ι' → R
head : ι'
tail : List ι'
h : ∀ j ∈ head :: tail, r j ∈ A (i j)
⊢ r head * (List.map r tail).prod ∈ A (i head + (List.map i tail).sum)
state_after: no goals
Theorem: EuclideanGeometry.dist_left_midpoint_eq_dist_right_midpoint
File: Mathlib/Geometry/Euclidean/Basic.lean

tactic: rw [dist_left_midpoint (𝕜 := ℝ) p1 p2, dist_right_midpoint (𝕜 := ℝ) p1 p2]
state_before: V : Type u_1
P : Type u_2
inst✝³ : NormedAddCommGroup V
inst✝² : InnerProductSpace ℝ V
inst✝¹ : MetricSpace P
inst✝ : NormedAddTorsor V P
p1 p2 : P
⊢ dist p1 (midpoint ℝ p1 p2) = dist p2 (midpoint ℝ p1 p2)
state_after: no goals
Theorem: wbtw_smul_vadd_smul_vadd_of_nonpos_of_le
File: Mathlib/Analysis/Convex/Between.lean

tactic: convert wbtw_smul_vadd_smul_vadd_of_nonneg_of_le x (-v) (Left.nonneg_neg_iff.2 hr₁)
    (neg_le_neg_iff.2 hr₂) using 1 <;>
  rw [neg_smul_neg]
state_before: R : Type u_1
V : Type u_2
V' : Type u_3
P : Type u_4
P' : Type u_5
inst✝³ : LinearOrderedField R
inst✝² : AddCommGroup V
inst✝¹ : Module R V
inst✝ : AddTorsor V P
x : P
v : V
r₁ r₂ : R
hr₁ : r₁ ≤ 0
hr₂ : r₂ ≤ r₁
⊢ Wbtw R x (r₁ • v +ᵥ x) (r₂ • v +ᵥ x)
state_after: no goals
Theorem: WCovBy.Icc_eq
File: Mathlib/Order/Cover.lean

tactic: ext c
state_before: α : Type u_1
β : Type u_2
inst✝ : PartialOrder α
a b c : α
h : a ⩿ b
⊢ Icc a b = {a, b}
state_after: case h
α : Type u_1
β : Type u_2
inst✝ : PartialOrder α
a b c✝ : α
h : a ⩿ b
c : α
⊢ c ∈ Icc a b ↔ c ∈ {a, b}

tactic: exact h.le_and_le_iff
state_before: case h
α : Type u_1
β : Type u_2
inst✝ : PartialOrder α
a b c✝ : α
h : a ⩿ b
c : α
⊢ c ∈ Icc a b ↔ c ∈ {a, b}
state_after: no goals
Theorem: ValuationSubring.principal_units_le_units
File: Mathlib/RingTheory/Valuation/ValuationSubring.lean

tactic: simpa only [add_sub_cancel] using A.valuation.map_one_add_of_lt h
state_before: K : Type u
inst✝ : Field K
A : ValuationSubring K
a : Kˣ
h : a ∈ A.principalUnitGroup
⊢ a ∈ A.unitGroup
state_after: no goals
Theorem: Finset.coe_ssubset
File: Mathlib/Data/Finset/Basic.lean

tactic: simp only [Set.ssubset_def, Finset.coe_subset]
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
s t s₁ s₂ : Finset α
⊢ ↑s₁ ⊂ ↑s₂ ↔ s₁ ⊆ s₂ ∧ ¬s₂ ⊆ s₁
state_after: no goals
Theorem: Real.cos_pi_div_three
File: Mathlib/Analysis/SpecialFunctions/Trigonometric/Basic.lean

tactic: have h₁ : (2 * cos (π / 3) - 1) ^ 2 * (2 * cos (π / 3) + 2) = 0 := by
  have : cos (3 * (π / 3)) = cos π := by
    congr 1
    ring
  linarith [cos_pi, cos_three_mul (π / 3)]
state_before: x : ℝ
⊢ cos (π / 3) = 1 / 2
state_after: x : ℝ
h₁ : (2 * cos (π / 3) - 1) ^ 2 * (2 * cos (π / 3) + 2) = 0
⊢ cos (π / 3) = 1 / 2

tactic: cases' mul_eq_zero.mp h₁ with h h
state_before: x : ℝ
h₁ : (2 * cos (π / 3) - 1) ^ 2 * (2 * cos (π / 3) + 2) = 0
⊢ cos (π / 3) = 1 / 2
state_after: case inl
x : ℝ
h₁ : (2 * cos (π / 3) - 1) ^ 2 * (2 * cos (π / 3) + 2) = 0
h : (2 * cos (π / 3) - 1) ^ 2 = 0
⊢ cos (π / 3) = 1 / 2

case inr
x : ℝ
h₁ : (2 * cos (π / 3) - 1) ^ 2 * (2 * cos (π / 3) + 2) = 0
h : 2 * cos (π / 3) + 2 = 0
⊢ cos (π / 3) = 1 / 2

tactic: have : cos (3 * (π / 3)) = cos π := by
  congr 1
  ring
state_before: x : ℝ
⊢ (2 * cos (π / 3) - 1) ^ 2 * (2 * cos (π / 3) + 2) = 0
state_after: x : ℝ
this : cos (3 * (π / 3)) = cos π
⊢ (2 * cos (π / 3) - 1) ^ 2 * (2 * cos (π / 3) + 2) = 0

tactic: linarith [cos_pi, cos_three_mul (π / 3)]
state_before: x : ℝ
this : cos (3 * (π / 3)) = cos π
⊢ (2 * cos (π / 3) - 1) ^ 2 * (2 * cos (π / 3) + 2) = 0
state_after: no goals

tactic: congr 1
state_before: x : ℝ
⊢ cos (3 * (π / 3)) = cos π
state_after: case e_x
x : ℝ
⊢ 3 * (π / 3) = π

tactic: ring
state_before: case e_x
x : ℝ
⊢ 3 * (π / 3) = π
state_after: no goals

tactic: linarith [pow_eq_zero h]
state_before: case inl
x : ℝ
h₁ : (2 * cos (π / 3) - 1) ^ 2 * (2 * cos (π / 3) + 2) = 0
h : (2 * cos (π / 3) - 1) ^ 2 = 0
⊢ cos (π / 3) = 1 / 2
state_after: no goals

tactic: have : cos π < cos (π / 3) := by
  refine cos_lt_cos_of_nonneg_of_le_pi ?_ le_rfl ?_ <;> linarith [pi_pos]
state_before: case inr
x : ℝ
h₁ : (2 * cos (π / 3) - 1) ^ 2 * (2 * cos (π / 3) + 2) = 0
h : 2 * cos (π / 3) + 2 = 0
⊢ cos (π / 3) = 1 / 2
state_after: case inr
x : ℝ
h₁ : (2 * cos (π / 3) - 1) ^ 2 * (2 * cos (π / 3) + 2) = 0
h : 2 * cos (π / 3) + 2 = 0
this : cos π < cos (π / 3)
⊢ cos (π / 3) = 1 / 2

tactic: linarith [cos_pi]
state_before: case inr
x : ℝ
h₁ : (2 * cos (π / 3) - 1) ^ 2 * (2 * cos (π / 3) + 2) = 0
h : 2 * cos (π / 3) + 2 = 0
this : cos π < cos (π / 3)
⊢ cos (π / 3) = 1 / 2
state_after: no goals

tactic: refine cos_lt_cos_of_nonneg_of_le_pi ?_ le_rfl ?_ <;> linarith [pi_pos]
state_before: x : ℝ
h₁ : (2 * cos (π / 3) - 1) ^ 2 * (2 * cos (π / 3) + 2) = 0
h : 2 * cos (π / 3) + 2 = 0
⊢ cos π < cos (π / 3)
state_after: no goals
Theorem: Finset.Ico_eq_cons_Ioo
File: Mathlib/Order/Interval/Finset/Basic.lean

tactic: classical rw [cons_eq_insert, Ioo_insert_left h]
state_before: ι : Type u_1
α : Type u_2
inst✝¹ : PartialOrder α
inst✝ : LocallyFiniteOrder α
a b c : α
h : a < b
⊢ Ico a b = cons a (Ioo a b) ⋯
state_after: no goals

tactic: rw [cons_eq_insert, Ioo_insert_left h]
state_before: ι : Type u_1
α : Type u_2
inst✝¹ : PartialOrder α
inst✝ : LocallyFiniteOrder α
a b c : α
h : a < b
⊢ Ico a b = cons a (Ioo a b) ⋯
state_after: no goals
Theorem: Polynomial.Monic.mul_right_eq_zero_iff
File: Mathlib/Algebra/Polynomial/Monic.lean

tactic: by_cases hq : q = 0 <;> simp [h.mul_right_ne_zero, hq]
state_before: R : Type u
S : Type v
a b : R
m n : ℕ
ι : Type y
inst✝ : Semiring R
p : R[X]
h : p.Monic
q : R[X]
⊢ p * q = 0 ↔ q = 0
state_after: no goals
Theorem: CategoryTheory.Limits.colimitUncurryIsoColimitCompColim_ι_ι_inv
File: Mathlib/CategoryTheory/Limits/Fubini.lean

tactic: dsimp [colimitUncurryIsoColimitCompColim, IsColimit.coconePointUniqueUpToIso,
  IsColimit.uniqueUpToIso]
state_before: J K : Type v
inst✝⁵ : SmallCategory J
inst✝⁴ : SmallCategory K
C : Type u
inst✝³ : Category.{v, u} C
F : J ⥤ K ⥤ C
inst✝² : HasColimitsOfShape K C
inst✝¹ : HasColimit (uncurry.obj F)
inst✝ : HasColimit (F ⋙ colim)
j : J
k : K
⊢ colimit.ι (F.obj j) k ≫ colimit.ι (F ⋙ colim) j ≫ (colimitUncurryIsoColimitCompColim F).inv =
    colimit.ι (uncurry.obj F) (j, k)
state_after: J K : Type v
inst✝⁵ : SmallCategory J
inst✝⁴ : SmallCategory K
C : Type u
inst✝³ : Category.{v, u} C
F : J ⥤ K ⥤ C
inst✝² : HasColimitsOfShape K C
inst✝¹ : HasColimit (uncurry.obj F)
inst✝ : HasColimit (F ⋙ colim)
j : J
k : K
⊢ colimit.ι (F.obj j) k ≫
      colimit.ι (F ⋙ colim) j ≫
        colimit.desc (F ⋙ colim)
          (coconeOfCoconeUncurry (fun j => colimit.isColimit (F.obj j)) (colimit.cocone (uncurry.obj F))) =
    colimit.ι (uncurry.obj F) (j, k)

tactic: simp
state_before: J K : Type v
inst✝⁵ : SmallCategory J
inst✝⁴ : SmallCategory K
C : Type u
inst✝³ : Category.{v, u} C
F : J ⥤ K ⥤ C
inst✝² : HasColimitsOfShape K C
inst✝¹ : HasColimit (uncurry.obj F)
inst✝ : HasColimit (F ⋙ colim)
j : J
k : K
⊢ colimit.ι (F.obj j) k ≫
      colimit.ι (F ⋙ colim) j ≫
        colimit.desc (F ⋙ colim)
          (coconeOfCoconeUncurry (fun j => colimit.isColimit (F.obj j)) (colimit.cocone (uncurry.obj F))) =
    colimit.ι (uncurry.obj F) (j, k)
state_after: no goals
Theorem: padicValNat.maxPowDiv_eq_multiplicity_get
File: Mathlib/NumberTheory/Padics/PadicVal.lean

tactic: rw [PartENat.get_eq_iff_eq_coe.mpr]
state_before: p✝ p n : ℕ
hp : 1 < p
hn : 0 < n
h : multiplicity.Finite p n
⊢ p.maxPowDiv n = (multiplicity p n).get h
state_after: p✝ p n : ℕ
hp : 1 < p
hn : 0 < n
h : multiplicity.Finite p n
⊢ multiplicity p n = ↑(p.maxPowDiv n)

tactic: apply maxPowDiv_eq_multiplicity hp hn|>.symm
state_before: p✝ p n : ℕ
hp : 1 < p
hn : 0 < n
h : multiplicity.Finite p n
⊢ multiplicity p n = ↑(p.maxPowDiv n)
state_after: no goals
Theorem: le_of_inf_le_sup_le
File: Mathlib/Order/Lattice.lean

tactic: rw [sup_inf_right, sup_comm x]
state_before: α : Type u
β : Type v
inst✝ : DistribLattice α
x y z : α
h₁ : x ⊓ z ≤ y ⊓ z
h₂ : x ⊔ z ≤ y ⊔ z
⊢ y ⊓ z ⊔ x = (y ⊔ x) ⊓ (x ⊔ z)
state_after: no goals

tactic: rw [← sup_inf_left]
state_before: α : Type u
β : Type v
inst✝ : DistribLattice α
x y z : α
h₁ : x ⊓ z ≤ y ⊓ z
h₂ : x ⊔ z ≤ y ⊔ z
⊢ (y ⊔ x) ⊓ (y ⊔ z) = y ⊔ x ⊓ z
state_after: no goals
Theorem: CategoryTheory.ShortComplex.LeftHomologyMapData.congr_φH
File: Mathlib/Algebra/Homology/ShortComplex/LeftHomology.lean

tactic: rw [eq]
state_before: C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : S₁.LeftHomologyData
h₂ : S₂.LeftHomologyData
γ₁ γ₂ : LeftHomologyMapData φ h₁ h₂
eq : γ₁ = γ₂
⊢ γ₁.φH = γ₂.φH
state_after: no goals
Theorem: Stonean.effectiveEpi_tfae
File: Mathlib/Topology/Category/Stonean/EffectiveEpi.lean

tactic: tfae_have 1 → 2
state_before: B X : Stonean
π : X ⟶ B
⊢ [EffectiveEpi π, Epi π, Function.Surjective ⇑π].TFAE
state_after: case tfae_1_to_2
B X : Stonean
π : X ⟶ B
⊢ EffectiveEpi π → Epi π

B X : Stonean
π : X ⟶ B
tfae_1_to_2 : EffectiveEpi π → Epi π
⊢ [EffectiveEpi π, Epi π, Function.Surjective ⇑π].TFAE

tactic: tfae_have 2 ↔ 3
state_before: B X : Stonean
π : X ⟶ B
tfae_1_to_2 : EffectiveEpi π → Epi π
⊢ [EffectiveEpi π, Epi π, Function.Surjective ⇑π].TFAE
state_after: case tfae_2_iff_3
B X : Stonean
π : X ⟶ B
tfae_1_to_2 : EffectiveEpi π → Epi π
⊢ Epi π ↔ Function.Surjective ⇑π

B X : Stonean
π : X ⟶ B
tfae_1_to_2 : EffectiveEpi π → Epi π
tfae_2_iff_3 : Epi π ↔ Function.Surjective ⇑π
⊢ [EffectiveEpi π, Epi π, Function.Surjective ⇑π].TFAE

tactic: tfae_have 3 → 1
state_before: B X : Stonean
π : X ⟶ B
tfae_1_to_2 : EffectiveEpi π → Epi π
tfae_2_iff_3 : Epi π ↔ Function.Surjective ⇑π
⊢ [EffectiveEpi π, Epi π, Function.Surjective ⇑π].TFAE
state_after: case tfae_3_to_1
B X : Stonean
π : X ⟶ B
tfae_1_to_2 : EffectiveEpi π → Epi π
tfae_2_iff_3 : Epi π ↔ Function.Surjective ⇑π
⊢ Function.Surjective ⇑π → EffectiveEpi π

B X : Stonean
π : X ⟶ B
tfae_1_to_2 : EffectiveEpi π → Epi π
tfae_2_iff_3 : Epi π ↔ Function.Surjective ⇑π
tfae_3_to_1 : Function.Surjective ⇑π → EffectiveEpi π
⊢ [EffectiveEpi π, Epi π, Function.Surjective ⇑π].TFAE

tactic: tfae_finish
state_before: B X : Stonean
π : X ⟶ B
tfae_1_to_2 : EffectiveEpi π → Epi π
tfae_2_iff_3 : Epi π ↔ Function.Surjective ⇑π
tfae_3_to_1 : Function.Surjective ⇑π → EffectiveEpi π
⊢ [EffectiveEpi π, Epi π, Function.Surjective ⇑π].TFAE
state_after: no goals

tactic: intro
state_before: case tfae_1_to_2
B X : Stonean
π : X ⟶ B
⊢ EffectiveEpi π → Epi π
state_after: case tfae_1_to_2
B X : Stonean
π : X ⟶ B
a✝ : EffectiveEpi π
⊢ Epi π

tactic: infer_instance
state_before: case tfae_1_to_2
B X : Stonean
π : X ⟶ B
a✝ : EffectiveEpi π
⊢ Epi π
state_after: no goals

tactic: exact epi_iff_surjective π
state_before: case tfae_2_iff_3
B X : Stonean
π : X ⟶ B
tfae_1_to_2 : EffectiveEpi π → Epi π
⊢ Epi π ↔ Function.Surjective ⇑π
state_after: no goals

tactic: exact fun hπ ↦ ⟨⟨struct π hπ⟩⟩
state_before: case tfae_3_to_1
B X : Stonean
π : X ⟶ B
tfae_1_to_2 : EffectiveEpi π → Epi π
tfae_2_iff_3 : Epi π ↔ Function.Surjective ⇑π
⊢ Function.Surjective ⇑π → EffectiveEpi π
state_after: no goals
Theorem: CategoryTheory.Limits.limit.pre_post
File: Mathlib/CategoryTheory/Limits/HasLimits.lean

tactic: haveI : HasLimit (E ⋙ F ⋙ G) := h
state_before: J : Type u₁
inst✝⁶ : Category.{v₁, u₁} J
K : Type u₂
inst✝⁵ : Category.{v₂, u₂} K
C : Type u
inst✝⁴ : Category.{v, u} C
F✝ : J ⥤ C
D : Type u'
inst✝³ : Category.{v', u'} D
E : K ⥤ J
F : J ⥤ C
G : C ⥤ D
inst✝² : HasLimit F
inst✝¹ : HasLimit (E ⋙ F)
inst✝ : HasLimit (F ⋙ G)
h : HasLimit ((E ⋙ F) ⋙ G)
⊢ G.map (pre F E) ≫ post (E ⋙ F) G = post F G ≫ pre (F ⋙ G) E
state_after: J : Type u₁
inst✝⁶ : Category.{v₁, u₁} J
K : Type u₂
inst✝⁵ : Category.{v₂, u₂} K
C : Type u
inst✝⁴ : Category.{v, u} C
F✝ : J ⥤ C
D : Type u'
inst✝³ : Category.{v', u'} D
E : K ⥤ J
F : J ⥤ C
G : C ⥤ D
inst✝² : HasLimit F
inst✝¹ : HasLimit (E ⋙ F)
inst✝ : HasLimit (F ⋙ G)
h : HasLimit ((E ⋙ F) ⋙ G)
this : HasLimit (E ⋙ F ⋙ G)
⊢ G.map (pre F E) ≫ post (E ⋙ F) G = post F G ≫ pre (F ⋙ G) E

tactic: ext
state_before: J : Type u₁
inst✝⁶ : Category.{v₁, u₁} J
K : Type u₂
inst✝⁵ : Category.{v₂, u₂} K
C : Type u
inst✝⁴ : Category.{v, u} C
F✝ : J ⥤ C
D : Type u'
inst✝³ : Category.{v', u'} D
E : K ⥤ J
F : J ⥤ C
G : C ⥤ D
inst✝² : HasLimit F
inst✝¹ : HasLimit (E ⋙ F)
inst✝ : HasLimit (F ⋙ G)
h : HasLimit ((E ⋙ F) ⋙ G)
this : HasLimit (E ⋙ F ⋙ G)
⊢ G.map (pre F E) ≫ post (E ⋙ F) G = post F G ≫ pre (F ⋙ G) E
state_after: case w
J : Type u₁
inst✝⁶ : Category.{v₁, u₁} J
K : Type u₂
inst✝⁵ : Category.{v₂, u₂} K
C : Type u
inst✝⁴ : Category.{v, u} C
F✝ : J ⥤ C
D : Type u'
inst✝³ : Category.{v', u'} D
E : K ⥤ J
F : J ⥤ C
G : C ⥤ D
inst✝² : HasLimit F
inst✝¹ : HasLimit (E ⋙ F)
inst✝ : HasLimit (F ⋙ G)
h : HasLimit ((E ⋙ F) ⋙ G)
this : HasLimit (E ⋙ F ⋙ G)
j✝ : K
⊢ (G.map (pre F E) ≫ post (E ⋙ F) G) ≫ π ((E ⋙ F) ⋙ G) j✝ = (post F G ≫ pre (F ⋙ G) E) ≫ π ((E ⋙ F) ⋙ G) j✝

tactic: erw [assoc, limit.post_π, ← G.map_comp, limit.pre_π, assoc, limit.pre_π, limit.post_π]
state_before: case w
J : Type u₁
inst✝⁶ : Category.{v₁, u₁} J
K : Type u₂
inst✝⁵ : Category.{v₂, u₂} K
C : Type u
inst✝⁴ : Category.{v, u} C
F✝ : J ⥤ C
D : Type u'
inst✝³ : Category.{v', u'} D
E : K ⥤ J
F : J ⥤ C
G : C ⥤ D
inst✝² : HasLimit F
inst✝¹ : HasLimit (E ⋙ F)
inst✝ : HasLimit (F ⋙ G)
h : HasLimit ((E ⋙ F) ⋙ G)
this : HasLimit (E ⋙ F ⋙ G)
j✝ : K
⊢ (G.map (pre F E) ≫ post (E ⋙ F) G) ≫ π ((E ⋙ F) ⋙ G) j✝ = (post F G ≫ pre (F ⋙ G) E) ≫ π ((E ⋙ F) ⋙ G) j✝
state_after: no goals
Theorem: Finsupp.toMultiset_sup
File: Mathlib/Data/Finsupp/Multiset.lean

tactic: ext
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
inst✝ : DecidableEq α
f g : α →₀ ℕ
⊢ toMultiset (f ⊔ g) = toMultiset f ∪ toMultiset g
state_after: case a
α : Type u_1
β : Type u_2
ι : Type u_3
inst✝ : DecidableEq α
f g : α →₀ ℕ
a✝ : α
⊢ Multiset.count a✝ (toMultiset (f ⊔ g)) = Multiset.count a✝ (toMultiset f ∪ toMultiset g)

tactic: simp_rw [Multiset.count_union, Finsupp.count_toMultiset, Finsupp.sup_apply, sup_eq_max]
state_before: case a
α : Type u_1
β : Type u_2
ι : Type u_3
inst✝ : DecidableEq α
f g : α →₀ ℕ
a✝ : α
⊢ Multiset.count a✝ (toMultiset (f ⊔ g)) = Multiset.count a✝ (toMultiset f ∪ toMultiset g)
state_after: no goals