[GOAL]
α : Type u_1
M : Type u_2
inst✝ : CommMonoid M
f : Option α → M
s : Finset α
⊢ ∏ x in ↑insertNone s, f x = f none * ∏ x in s, f (some x)
[PROOFSTEP]
simp [insertNone]
[GOAL]
α : Type u_1
M : Type u_2
inst✝ : CommMonoid M
f : α → M
s : Finset (Option α)
⊢ ∏ x in ↑eraseNone s, f x = ∏ x in s, Option.elim' 1 f x
[PROOFSTEP]
classical calc
  ∏ x in eraseNone s, f x = ∏ x in (eraseNone s).map Embedding.some, Option.elim' 1 f x :=
    (prod_map (eraseNone s) Embedding.some <| Option.elim' 1 f).symm
  _ = ∏ x in s.erase none, Option.elim' 1 f x := by rw [map_some_eraseNone]
  _ = ∏ x in s, Option.elim' 1 f x := prod_erase _ rfl
[GOAL]
α : Type u_1
M : Type u_2
inst✝ : CommMonoid M
f : α → M
s : Finset (Option α)
⊢ ∏ x in ↑eraseNone s, f x = ∏ x in s, Option.elim' 1 f x
[PROOFSTEP]
calc
  ∏ x in eraseNone s, f x = ∏ x in (eraseNone s).map Embedding.some, Option.elim' 1 f x :=
    (prod_map (eraseNone s) Embedding.some <| Option.elim' 1 f).symm
  _ = ∏ x in s.erase none, Option.elim' 1 f x := by rw [map_some_eraseNone]
  _ = ∏ x in s, Option.elim' 1 f x := prod_erase _ rfl
[GOAL]
α : Type u_1
M : Type u_2
inst✝ : CommMonoid M
f : α → M
s : Finset (Option α)
⊢ ∏ x in map Embedding.some (↑eraseNone s), Option.elim' 1 f x = ∏ x in erase s none, Option.elim' 1 f x
[PROOFSTEP]
rw [map_some_eraseNone]


[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
S : Type ?u.27
inst✝² : Mul R
inst✝¹ : Add R
inst✝ : Distrib S
f : R → S
hf : Injective f
add : ∀ (x y : R), f (x + y) = f x + f y
mul : ∀ (x y : R), f (x * y) = f x * f y
x y z : R
⊢ f (x * (y + z)) = f (x * y + x * z)
[PROOFSTEP]
simp only [*, left_distrib]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
S : Type ?u.27
inst✝² : Mul R
inst✝¹ : Add R
inst✝ : Distrib S
f : R → S
hf : Injective f
add : ∀ (x y : R), f (x + y) = f x + f y
mul : ∀ (x y : R), f (x * y) = f x * f y
x y z : R
⊢ f ((x + y) * z) = f (x * z + y * z)
[PROOFSTEP]
simp only [*, right_distrib]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
S : Type ?u.1511
inst✝² : Distrib R
inst✝¹ : Add S
inst✝ : Mul S
f : R → S
hf : Surjective f
add : ∀ (x y : R), f (x + y) = f x + f y
mul : ∀ (x y : R), f (x * y) = f x * f y
x y z : R
⊢ f x * (f y + f z) = f x * f y + f x * f z
[PROOFSTEP]
simp only [← add, ← mul, left_distrib]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
S : Type ?u.1511
inst✝² : Distrib R
inst✝¹ : Add S
inst✝ : Mul S
f : R → S
hf : Surjective f
add : ∀ (x y : R), f (x + y) = f x + f y
mul : ∀ (x y : R), f (x * y) = f x * f y
x y z : R
⊢ (f x + f y) * f z = f x * f z + f y * f z
[PROOFSTEP]
simp only [← add, ← mul, right_distrib]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝³ : Mul α
inst✝² : HasDistribNeg α
inst✝¹ : Neg β
inst✝ : Mul β
f : β → α
hf : Injective f
neg : ∀ (a : β), f (-a) = -f a
mul : ∀ (a b : β), f (a * b) = f a * f b
src✝¹ : InvolutiveNeg β := Injective.involutiveNeg f hf neg
src✝ : Mul β := inst✝
x y : β
⊢ f (-x * y) = f (-(x * y))
[PROOFSTEP]
erw [neg, mul, neg, neg_mul, mul]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝³ : Mul α
inst✝² : HasDistribNeg α
inst✝¹ : Neg β
inst✝ : Mul β
f : β → α
hf : Injective f
neg : ∀ (a : β), f (-a) = -f a
mul : ∀ (a b : β), f (a * b) = f a * f b
src✝¹ : InvolutiveNeg β := Injective.involutiveNeg f hf neg
src✝ : Mul β := inst✝
x y : β
⊢ f (x * -y) = f (-(x * y))
[PROOFSTEP]
erw [neg, mul, neg, mul_neg, mul]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝³ : Mul α
inst✝² : HasDistribNeg α
inst✝¹ : Neg β
inst✝ : Mul β
f : α → β
hf : Surjective f
neg : ∀ (a : α), f (-a) = -f a
mul : ∀ (a b : α), f (a * b) = f a * f b
src✝¹ : InvolutiveNeg β := Surjective.involutiveNeg f hf neg
src✝ : Mul β := inst✝
x y : α
⊢ -f x * f y = -(f x * f y)
[PROOFSTEP]
erw [← neg, ← mul, neg_mul, neg, mul]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝³ : Mul α
inst✝² : HasDistribNeg α
inst✝¹ : Neg β
inst✝ : Mul β
f : α → β
hf : Surjective f
neg : ∀ (a : α), f (-a) = -f a
mul : ∀ (a b : α), f (a * b) = f a * f b
src✝¹ : InvolutiveNeg β := Surjective.involutiveNeg f hf neg
src✝ : Mul β := inst✝
x y : α
⊢ f x * -f y = -(f x * f y)
[PROOFSTEP]
erw [← neg, ← mul, mul_neg, neg, mul]


[GOAL]
u : ℤˣ
⊢ natAbs ↑u * natAbs ↑u⁻¹ = 1
[PROOFSTEP]
rw [← natAbs_mul, Units.mul_inv]
[GOAL]
u : ℤˣ
⊢ natAbs 1 = 1
[PROOFSTEP]
rfl
[GOAL]
u : ℤˣ
⊢ natAbs ↑u⁻¹ * natAbs ↑u = 1
[PROOFSTEP]
rw [← natAbs_mul, Units.inv_mul]
[GOAL]
u : ℤˣ
⊢ natAbs 1 = 1
[PROOFSTEP]
rfl
[GOAL]
u : ℤˣ
⊢ u = 1 ∨ u = -1
[PROOFSTEP]
simpa only [Units.ext_iff, units_natAbs] using natAbs_eq u
[GOAL]
a : ℤ
⊢ IsUnit a ↔ a = 1 ∨ a = -1
[PROOFSTEP]
refine' ⟨fun h => isUnit_eq_one_or h, fun h => _⟩
[GOAL]
a : ℤ
h : a = 1 ∨ a = -1
⊢ IsUnit a
[PROOFSTEP]
rcases h with (rfl | rfl)
[GOAL]
case inl
⊢ IsUnit 1
[PROOFSTEP]
exact isUnit_one
[GOAL]
case inr
⊢ IsUnit (-1)
[PROOFSTEP]
exact isUnit_one.neg
[GOAL]
a b : ℤ
ha : IsUnit a
hb : IsUnit b
⊢ a = b ∨ a = -b
[PROOFSTEP]
rcases isUnit_eq_one_or hb with (rfl | rfl)
[GOAL]
case inl
a : ℤ
ha : IsUnit a
hb : IsUnit 1
⊢ a = 1 ∨ a = -1
[PROOFSTEP]
exact isUnit_eq_one_or ha
[GOAL]
case inr
a : ℤ
ha : IsUnit a
hb : IsUnit (-1)
⊢ a = -1 ∨ a = - -1
[PROOFSTEP]
rwa [or_comm, neg_neg, ← isUnit_iff]
[GOAL]
z w : ℤ
h : z * w = 1
⊢ z = 1 ∧ w = 1 ∨ z = -1 ∧ w = -1
[PROOFSTEP]
have h' : w * z = 1 := mul_comm z w ▸ h
[GOAL]
z w : ℤ
h : z * w = 1
h' : w * z = 1
⊢ z = 1 ∧ w = 1 ∨ z = -1 ∧ w = -1
[PROOFSTEP]
rcases eq_one_or_neg_one_of_mul_eq_one h with (rfl | rfl)
[GOAL]
case inl
w : ℤ
h : 1 * w = 1
h' : w * 1 = 1
⊢ 1 = 1 ∧ w = 1 ∨ 1 = -1 ∧ w = -1
[PROOFSTEP]
rcases eq_one_or_neg_one_of_mul_eq_one h' with (rfl | rfl)
[GOAL]
case inr
w : ℤ
h : -1 * w = 1
h' : w * -1 = 1
⊢ -1 = 1 ∧ w = 1 ∨ -1 = -1 ∧ w = -1
[PROOFSTEP]
rcases eq_one_or_neg_one_of_mul_eq_one h' with (rfl | rfl)
[GOAL]
case inl.inl
h h' : 1 * 1 = 1
⊢ 1 = 1 ∧ 1 = 1 ∨ 1 = -1 ∧ 1 = -1
[PROOFSTEP]
tauto
[GOAL]
case inl.inr
h : 1 * -1 = 1
h' : -1 * 1 = 1
⊢ 1 = 1 ∧ -1 = 1 ∨ 1 = -1 ∧ -1 = -1
[PROOFSTEP]
tauto
[GOAL]
case inr.inl
h : -1 * 1 = 1
h' : 1 * -1 = 1
⊢ -1 = 1 ∧ 1 = 1 ∨ -1 = -1 ∧ 1 = -1
[PROOFSTEP]
tauto
[GOAL]
case inr.inr
h h' : -1 * -1 = 1
⊢ -1 = 1 ∧ -1 = 1 ∨ -1 = -1 ∧ -1 = -1
[PROOFSTEP]
tauto
[GOAL]
z w : ℤ
⊢ z * w = 1 ↔ z = 1 ∧ w = 1 ∨ z = -1 ∧ w = -1
[PROOFSTEP]
refine' ⟨eq_one_or_neg_one_of_mul_eq_one', fun h => Or.elim h (fun H => _) fun H => _⟩
[GOAL]
case refine'_1
z w : ℤ
h : z = 1 ∧ w = 1 ∨ z = -1 ∧ w = -1
H : z = 1 ∧ w = 1
⊢ z * w = 1
[PROOFSTEP]
rcases H with ⟨rfl, rfl⟩
[GOAL]
case refine'_2
z w : ℤ
h : z = 1 ∧ w = 1 ∨ z = -1 ∧ w = -1
H : z = -1 ∧ w = -1
⊢ z * w = 1
[PROOFSTEP]
rcases H with ⟨rfl, rfl⟩
[GOAL]
case refine'_1.intro
h : 1 = 1 ∧ 1 = 1 ∨ 1 = -1 ∧ 1 = -1
⊢ 1 * 1 = 1
[PROOFSTEP]
rfl
[GOAL]
case refine'_2.intro
h : -1 = 1 ∧ -1 = 1 ∨ -1 = -1 ∧ -1 = -1
⊢ -1 * -1 = 1
[PROOFSTEP]
rfl
[GOAL]
z w : ℤ
h : z * w = -1
⊢ z = 1 ∧ w = -1 ∨ z = -1 ∧ w = 1
[PROOFSTEP]
rcases isUnit_eq_one_or (IsUnit.mul_iff.mp (Int.isUnit_iff.mpr (Or.inr h))).1 with (rfl | rfl)
[GOAL]
case inl
w : ℤ
h : 1 * w = -1
⊢ 1 = 1 ∧ w = -1 ∨ 1 = -1 ∧ w = 1
[PROOFSTEP]
exact Or.inl ⟨rfl, one_mul w ▸ h⟩
[GOAL]
case inr
w : ℤ
h : -1 * w = -1
⊢ -1 = 1 ∧ w = -1 ∨ -1 = -1 ∧ w = 1
[PROOFSTEP]
exact Or.inr ⟨rfl, neg_inj.mp (neg_one_mul w ▸ h)⟩
[GOAL]
z w : ℤ
⊢ z * w = -1 ↔ z = 1 ∧ w = -1 ∨ z = -1 ∧ w = 1
[PROOFSTEP]
refine' ⟨eq_one_or_neg_one_of_mul_eq_neg_one', fun h => Or.elim h (fun H => _) fun H => _⟩
[GOAL]
case refine'_1
z w : ℤ
h : z = 1 ∧ w = -1 ∨ z = -1 ∧ w = 1
H : z = 1 ∧ w = -1
⊢ z * w = -1
[PROOFSTEP]
rcases H with ⟨rfl, rfl⟩
[GOAL]
case refine'_2
z w : ℤ
h : z = 1 ∧ w = -1 ∨ z = -1 ∧ w = 1
H : z = -1 ∧ w = 1
⊢ z * w = -1
[PROOFSTEP]
rcases H with ⟨rfl, rfl⟩
[GOAL]
case refine'_1.intro
h : 1 = 1 ∧ -1 = -1 ∨ 1 = -1 ∧ -1 = 1
⊢ 1 * -1 = -1
[PROOFSTEP]
rfl
[GOAL]
case refine'_2.intro
h : -1 = 1 ∧ 1 = -1 ∨ -1 = -1 ∧ 1 = 1
⊢ -1 * 1 = -1
[PROOFSTEP]
rfl
[GOAL]
n : ℤ
⊢ IsUnit n ↔ natAbs n = 1
[PROOFSTEP]
simp [natAbs_eq_iff, isUnit_iff, Nat.cast_zero]
[GOAL]
n : ℕ
⊢ IsUnit ↑n ↔ IsUnit n
[PROOFSTEP]
simp [isUnit_iff_natAbs_eq]
[GOAL]
a b c d : ℤ
ha : IsUnit a
hb : IsUnit b
hc : IsUnit c
hd : IsUnit d
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
rw [isUnit_iff] at ha hb hc hd
[GOAL]
a b c d : ℤ
ha : a = 1 ∨ a = -1
hb : b = 1 ∨ b = -1
hc : c = 1 ∨ c = -1
hd : d = 1 ∨ d = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases ha
[GOAL]
case inl
a b c d : ℤ
hb : b = 1 ∨ b = -1
hc : c = 1 ∨ c = -1
hd : d = 1 ∨ d = -1
h✝ : a = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases hb
[GOAL]
case inr
a b c d : ℤ
hb : b = 1 ∨ b = -1
hc : c = 1 ∨ c = -1
hd : d = 1 ∨ d = -1
h✝ : a = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases hb
[GOAL]
case inl.inl
a b c d : ℤ
hc : c = 1 ∨ c = -1
hd : d = 1 ∨ d = -1
h✝¹ : a = 1
h✝ : b = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases hc
[GOAL]
case inl.inr
a b c d : ℤ
hc : c = 1 ∨ c = -1
hd : d = 1 ∨ d = -1
h✝¹ : a = 1
h✝ : b = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases hc
[GOAL]
case inr.inl
a b c d : ℤ
hc : c = 1 ∨ c = -1
hd : d = 1 ∨ d = -1
h✝¹ : a = -1
h✝ : b = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases hc
[GOAL]
case inr.inr
a b c d : ℤ
hc : c = 1 ∨ c = -1
hd : d = 1 ∨ d = -1
h✝¹ : a = -1
h✝ : b = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases hc
[GOAL]
case inl.inl.inl
a b c d : ℤ
hd : d = 1 ∨ d = -1
h✝² : a = 1
h✝¹ : b = 1
h✝ : c = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases hd
[GOAL]
case inl.inl.inr
a b c d : ℤ
hd : d = 1 ∨ d = -1
h✝² : a = 1
h✝¹ : b = 1
h✝ : c = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases hd
[GOAL]
case inl.inr.inl
a b c d : ℤ
hd : d = 1 ∨ d = -1
h✝² : a = 1
h✝¹ : b = -1
h✝ : c = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases hd
[GOAL]
case inl.inr.inr
a b c d : ℤ
hd : d = 1 ∨ d = -1
h✝² : a = 1
h✝¹ : b = -1
h✝ : c = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases hd
[GOAL]
case inr.inl.inl
a b c d : ℤ
hd : d = 1 ∨ d = -1
h✝² : a = -1
h✝¹ : b = 1
h✝ : c = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases hd
[GOAL]
case inr.inl.inr
a b c d : ℤ
hd : d = 1 ∨ d = -1
h✝² : a = -1
h✝¹ : b = 1
h✝ : c = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases hd
[GOAL]
case inr.inr.inl
a b c d : ℤ
hd : d = 1 ∨ d = -1
h✝² : a = -1
h✝¹ : b = -1
h✝ : c = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases hd
[GOAL]
case inr.inr.inr
a b c d : ℤ
hd : d = 1 ∨ d = -1
h✝² : a = -1
h✝¹ : b = -1
h✝ : c = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
cases hd
[GOAL]
case inl.inl.inl.inl
a b c d : ℤ
h✝³ : a = 1
h✝² : b = 1
h✝¹ : c = 1
h✝ : d = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inl.inl.inl.inr
a b c d : ℤ
h✝³ : a = 1
h✝² : b = 1
h✝¹ : c = 1
h✝ : d = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inl.inl.inr.inl
a b c d : ℤ
h✝³ : a = 1
h✝² : b = 1
h✝¹ : c = -1
h✝ : d = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inl.inl.inr.inr
a b c d : ℤ
h✝³ : a = 1
h✝² : b = 1
h✝¹ : c = -1
h✝ : d = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inl.inr.inl.inl
a b c d : ℤ
h✝³ : a = 1
h✝² : b = -1
h✝¹ : c = 1
h✝ : d = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inl.inr.inl.inr
a b c d : ℤ
h✝³ : a = 1
h✝² : b = -1
h✝¹ : c = 1
h✝ : d = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inl.inr.inr.inl
a b c d : ℤ
h✝³ : a = 1
h✝² : b = -1
h✝¹ : c = -1
h✝ : d = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inl.inr.inr.inr
a b c d : ℤ
h✝³ : a = 1
h✝² : b = -1
h✝¹ : c = -1
h✝ : d = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inr.inl.inl.inl
a b c d : ℤ
h✝³ : a = -1
h✝² : b = 1
h✝¹ : c = 1
h✝ : d = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inr.inl.inl.inr
a b c d : ℤ
h✝³ : a = -1
h✝² : b = 1
h✝¹ : c = 1
h✝ : d = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inr.inl.inr.inl
a b c d : ℤ
h✝³ : a = -1
h✝² : b = 1
h✝¹ : c = -1
h✝ : d = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inr.inl.inr.inr
a b c d : ℤ
h✝³ : a = -1
h✝² : b = 1
h✝¹ : c = -1
h✝ : d = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inr.inr.inl.inl
a b c d : ℤ
h✝³ : a = -1
h✝² : b = -1
h✝¹ : c = 1
h✝ : d = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inr.inr.inl.inr
a b c d : ℤ
h✝³ : a = -1
h✝² : b = -1
h✝¹ : c = 1
h✝ : d = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inr.inr.inr.inl
a b c d : ℤ
h✝³ : a = -1
h✝² : b = -1
h✝¹ : c = -1
h✝ : d = 1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inr.inr.inr.inr
a b c d : ℤ
h✝³ : a = -1
h✝² : b = -1
h✝¹ : c = -1
h✝ : d = -1
⊢ a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
[PROOFSTEP]
subst a
[GOAL]
case inl.inl.inl.inl
b c d : ℤ
h✝² : b = 1
h✝¹ : c = 1
h✝ : d = 1
⊢ 1 + b = c + d ↔ 1 = c ∧ b = d ∨ 1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inl.inl.inl.inr
b c d : ℤ
h✝² : b = 1
h✝¹ : c = 1
h✝ : d = -1
⊢ 1 + b = c + d ↔ 1 = c ∧ b = d ∨ 1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inl.inl.inr.inl
b c d : ℤ
h✝² : b = 1
h✝¹ : c = -1
h✝ : d = 1
⊢ 1 + b = c + d ↔ 1 = c ∧ b = d ∨ 1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inl.inl.inr.inr
b c d : ℤ
h✝² : b = 1
h✝¹ : c = -1
h✝ : d = -1
⊢ 1 + b = c + d ↔ 1 = c ∧ b = d ∨ 1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inl.inr.inl.inl
b c d : ℤ
h✝² : b = -1
h✝¹ : c = 1
h✝ : d = 1
⊢ 1 + b = c + d ↔ 1 = c ∧ b = d ∨ 1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inl.inr.inl.inr
b c d : ℤ
h✝² : b = -1
h✝¹ : c = 1
h✝ : d = -1
⊢ 1 + b = c + d ↔ 1 = c ∧ b = d ∨ 1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inl.inr.inr.inl
b c d : ℤ
h✝² : b = -1
h✝¹ : c = -1
h✝ : d = 1
⊢ 1 + b = c + d ↔ 1 = c ∧ b = d ∨ 1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inl.inr.inr.inr
b c d : ℤ
h✝² : b = -1
h✝¹ : c = -1
h✝ : d = -1
⊢ 1 + b = c + d ↔ 1 = c ∧ b = d ∨ 1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inr.inl.inl.inl
b c d : ℤ
h✝² : b = 1
h✝¹ : c = 1
h✝ : d = 1
⊢ -1 + b = c + d ↔ -1 = c ∧ b = d ∨ -1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inr.inl.inl.inr
b c d : ℤ
h✝² : b = 1
h✝¹ : c = 1
h✝ : d = -1
⊢ -1 + b = c + d ↔ -1 = c ∧ b = d ∨ -1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inr.inl.inr.inl
b c d : ℤ
h✝² : b = 1
h✝¹ : c = -1
h✝ : d = 1
⊢ -1 + b = c + d ↔ -1 = c ∧ b = d ∨ -1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inr.inl.inr.inr
b c d : ℤ
h✝² : b = 1
h✝¹ : c = -1
h✝ : d = -1
⊢ -1 + b = c + d ↔ -1 = c ∧ b = d ∨ -1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inr.inr.inl.inl
b c d : ℤ
h✝² : b = -1
h✝¹ : c = 1
h✝ : d = 1
⊢ -1 + b = c + d ↔ -1 = c ∧ b = d ∨ -1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inr.inr.inl.inr
b c d : ℤ
h✝² : b = -1
h✝¹ : c = 1
h✝ : d = -1
⊢ -1 + b = c + d ↔ -1 = c ∧ b = d ∨ -1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inr.inr.inr.inl
b c d : ℤ
h✝² : b = -1
h✝¹ : c = -1
h✝ : d = 1
⊢ -1 + b = c + d ↔ -1 = c ∧ b = d ∨ -1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inr.inr.inr.inr
b c d : ℤ
h✝² : b = -1
h✝¹ : c = -1
h✝ : d = -1
⊢ -1 + b = c + d ↔ -1 = c ∧ b = d ∨ -1 = d ∧ b = c
[PROOFSTEP]
subst b
[GOAL]
case inl.inl.inl.inl
c d : ℤ
h✝¹ : c = 1
h✝ : d = 1
⊢ 1 + 1 = c + d ↔ 1 = c ∧ 1 = d ∨ 1 = d ∧ 1 = c
[PROOFSTEP]
subst c
[GOAL]
case inl.inl.inl.inr
c d : ℤ
h✝¹ : c = 1
h✝ : d = -1
⊢ 1 + 1 = c + d ↔ 1 = c ∧ 1 = d ∨ 1 = d ∧ 1 = c
[PROOFSTEP]
subst c
[GOAL]
case inl.inl.inr.inl
c d : ℤ
h✝¹ : c = -1
h✝ : d = 1
⊢ 1 + 1 = c + d ↔ 1 = c ∧ 1 = d ∨ 1 = d ∧ 1 = c
[PROOFSTEP]
subst c
[GOAL]
case inl.inl.inr.inr
c d : ℤ
h✝¹ : c = -1
h✝ : d = -1
⊢ 1 + 1 = c + d ↔ 1 = c ∧ 1 = d ∨ 1 = d ∧ 1 = c
[PROOFSTEP]
subst c
[GOAL]
case inl.inr.inl.inl
c d : ℤ
h✝¹ : c = 1
h✝ : d = 1
⊢ 1 + -1 = c + d ↔ 1 = c ∧ -1 = d ∨ 1 = d ∧ -1 = c
[PROOFSTEP]
subst c
[GOAL]
case inl.inr.inl.inr
c d : ℤ
h✝¹ : c = 1
h✝ : d = -1
⊢ 1 + -1 = c + d ↔ 1 = c ∧ -1 = d ∨ 1 = d ∧ -1 = c
[PROOFSTEP]
subst c
[GOAL]
case inl.inr.inr.inl
c d : ℤ
h✝¹ : c = -1
h✝ : d = 1
⊢ 1 + -1 = c + d ↔ 1 = c ∧ -1 = d ∨ 1 = d ∧ -1 = c
[PROOFSTEP]
subst c
[GOAL]
case inl.inr.inr.inr
c d : ℤ
h✝¹ : c = -1
h✝ : d = -1
⊢ 1 + -1 = c + d ↔ 1 = c ∧ -1 = d ∨ 1 = d ∧ -1 = c
[PROOFSTEP]
subst c
[GOAL]
case inr.inl.inl.inl
c d : ℤ
h✝¹ : c = 1
h✝ : d = 1
⊢ -1 + 1 = c + d ↔ -1 = c ∧ 1 = d ∨ -1 = d ∧ 1 = c
[PROOFSTEP]
subst c
[GOAL]
case inr.inl.inl.inr
c d : ℤ
h✝¹ : c = 1
h✝ : d = -1
⊢ -1 + 1 = c + d ↔ -1 = c ∧ 1 = d ∨ -1 = d ∧ 1 = c
[PROOFSTEP]
subst c
[GOAL]
case inr.inl.inr.inl
c d : ℤ
h✝¹ : c = -1
h✝ : d = 1
⊢ -1 + 1 = c + d ↔ -1 = c ∧ 1 = d ∨ -1 = d ∧ 1 = c
[PROOFSTEP]
subst c
[GOAL]
case inr.inl.inr.inr
c d : ℤ
h✝¹ : c = -1
h✝ : d = -1
⊢ -1 + 1 = c + d ↔ -1 = c ∧ 1 = d ∨ -1 = d ∧ 1 = c
[PROOFSTEP]
subst c
[GOAL]
case inr.inr.inl.inl
c d : ℤ
h✝¹ : c = 1
h✝ : d = 1
⊢ -1 + -1 = c + d ↔ -1 = c ∧ -1 = d ∨ -1 = d ∧ -1 = c
[PROOFSTEP]
subst c
[GOAL]
case inr.inr.inl.inr
c d : ℤ
h✝¹ : c = 1
h✝ : d = -1
⊢ -1 + -1 = c + d ↔ -1 = c ∧ -1 = d ∨ -1 = d ∧ -1 = c
[PROOFSTEP]
subst c
[GOAL]
case inr.inr.inr.inl
c d : ℤ
h✝¹ : c = -1
h✝ : d = 1
⊢ -1 + -1 = c + d ↔ -1 = c ∧ -1 = d ∨ -1 = d ∧ -1 = c
[PROOFSTEP]
subst c
[GOAL]
case inr.inr.inr.inr
c d : ℤ
h✝¹ : c = -1
h✝ : d = -1
⊢ -1 + -1 = c + d ↔ -1 = c ∧ -1 = d ∨ -1 = d ∧ -1 = c
[PROOFSTEP]
subst c
[GOAL]
case inl.inl.inl.inl
d : ℤ
h✝ : d = 1
⊢ 1 + 1 = 1 + d ↔ 1 = 1 ∧ 1 = d ∨ 1 = d ∧ 1 = 1
[PROOFSTEP]
subst d
[GOAL]
case inl.inl.inl.inr
d : ℤ
h✝ : d = -1
⊢ 1 + 1 = 1 + d ↔ 1 = 1 ∧ 1 = d ∨ 1 = d ∧ 1 = 1
[PROOFSTEP]
subst d
[GOAL]
case inl.inl.inr.inl
d : ℤ
h✝ : d = 1
⊢ 1 + 1 = -1 + d ↔ 1 = -1 ∧ 1 = d ∨ 1 = d ∧ 1 = -1
[PROOFSTEP]
subst d
[GOAL]
case inl.inl.inr.inr
d : ℤ
h✝ : d = -1
⊢ 1 + 1 = -1 + d ↔ 1 = -1 ∧ 1 = d ∨ 1 = d ∧ 1 = -1
[PROOFSTEP]
subst d
[GOAL]
case inl.inr.inl.inl
d : ℤ
h✝ : d = 1
⊢ 1 + -1 = 1 + d ↔ 1 = 1 ∧ -1 = d ∨ 1 = d ∧ -1 = 1
[PROOFSTEP]
subst d
[GOAL]
case inl.inr.inl.inr
d : ℤ
h✝ : d = -1
⊢ 1 + -1 = 1 + d ↔ 1 = 1 ∧ -1 = d ∨ 1 = d ∧ -1 = 1
[PROOFSTEP]
subst d
[GOAL]
case inl.inr.inr.inl
d : ℤ
h✝ : d = 1
⊢ 1 + -1 = -1 + d ↔ 1 = -1 ∧ -1 = d ∨ 1 = d ∧ -1 = -1
[PROOFSTEP]
subst d
[GOAL]
case inl.inr.inr.inr
d : ℤ
h✝ : d = -1
⊢ 1 + -1 = -1 + d ↔ 1 = -1 ∧ -1 = d ∨ 1 = d ∧ -1 = -1
[PROOFSTEP]
subst d
[GOAL]
case inr.inl.inl.inl
d : ℤ
h✝ : d = 1
⊢ -1 + 1 = 1 + d ↔ -1 = 1 ∧ 1 = d ∨ -1 = d ∧ 1 = 1
[PROOFSTEP]
subst d
[GOAL]
case inr.inl.inl.inr
d : ℤ
h✝ : d = -1
⊢ -1 + 1 = 1 + d ↔ -1 = 1 ∧ 1 = d ∨ -1 = d ∧ 1 = 1
[PROOFSTEP]
subst d
[GOAL]
case inr.inl.inr.inl
d : ℤ
h✝ : d = 1
⊢ -1 + 1 = -1 + d ↔ -1 = -1 ∧ 1 = d ∨ -1 = d ∧ 1 = -1
[PROOFSTEP]
subst d
[GOAL]
case inr.inl.inr.inr
d : ℤ
h✝ : d = -1
⊢ -1 + 1 = -1 + d ↔ -1 = -1 ∧ 1 = d ∨ -1 = d ∧ 1 = -1
[PROOFSTEP]
subst d
[GOAL]
case inr.inr.inl.inl
d : ℤ
h✝ : d = 1
⊢ -1 + -1 = 1 + d ↔ -1 = 1 ∧ -1 = d ∨ -1 = d ∧ -1 = 1
[PROOFSTEP]
subst d
[GOAL]
case inr.inr.inl.inr
d : ℤ
h✝ : d = -1
⊢ -1 + -1 = 1 + d ↔ -1 = 1 ∧ -1 = d ∨ -1 = d ∧ -1 = 1
[PROOFSTEP]
subst d
[GOAL]
case inr.inr.inr.inl
d : ℤ
h✝ : d = 1
⊢ -1 + -1 = -1 + d ↔ -1 = -1 ∧ -1 = d ∨ -1 = d ∧ -1 = -1
[PROOFSTEP]
subst d
[GOAL]
case inr.inr.inr.inr
d : ℤ
h✝ : d = -1
⊢ -1 + -1 = -1 + d ↔ -1 = -1 ∧ -1 = d ∨ -1 = d ∧ -1 = -1
[PROOFSTEP]
subst d
[GOAL]
case inl.inl.inl.inl
⊢ 1 + 1 = 1 + 1 ↔ 1 = 1 ∧ 1 = 1 ∨ 1 = 1 ∧ 1 = 1
[PROOFSTEP]
simp
[GOAL]
case inl.inl.inl.inr
⊢ 1 + 1 = 1 + -1 ↔ 1 = 1 ∧ 1 = -1 ∨ 1 = -1 ∧ 1 = 1
[PROOFSTEP]
simp
[GOAL]
case inl.inl.inr.inl
⊢ 1 + 1 = -1 + 1 ↔ 1 = -1 ∧ 1 = 1 ∨ 1 = 1 ∧ 1 = -1
[PROOFSTEP]
simp
[GOAL]
case inl.inl.inr.inr
⊢ 1 + 1 = -1 + -1 ↔ 1 = -1 ∧ 1 = -1 ∨ 1 = -1 ∧ 1 = -1
[PROOFSTEP]
simp
[GOAL]
case inl.inr.inl.inl
⊢ 1 + -1 = 1 + 1 ↔ 1 = 1 ∧ -1 = 1 ∨ 1 = 1 ∧ -1 = 1
[PROOFSTEP]
simp
[GOAL]
case inl.inr.inl.inr
⊢ 1 + -1 = 1 + -1 ↔ 1 = 1 ∧ -1 = -1 ∨ 1 = -1 ∧ -1 = 1
[PROOFSTEP]
simp
[GOAL]
case inl.inr.inr.inl
⊢ 1 + -1 = -1 + 1 ↔ 1 = -1 ∧ -1 = 1 ∨ 1 = 1 ∧ -1 = -1
[PROOFSTEP]
simp
[GOAL]
case inl.inr.inr.inr
⊢ 1 + -1 = -1 + -1 ↔ 1 = -1 ∧ -1 = -1 ∨ 1 = -1 ∧ -1 = -1
[PROOFSTEP]
simp
[GOAL]
case inr.inl.inl.inl
⊢ -1 + 1 = 1 + 1 ↔ -1 = 1 ∧ 1 = 1 ∨ -1 = 1 ∧ 1 = 1
[PROOFSTEP]
simp
[GOAL]
case inr.inl.inl.inr
⊢ -1 + 1 = 1 + -1 ↔ -1 = 1 ∧ 1 = -1 ∨ -1 = -1 ∧ 1 = 1
[PROOFSTEP]
simp
[GOAL]
case inr.inl.inr.inl
⊢ -1 + 1 = -1 + 1 ↔ -1 = -1 ∧ 1 = 1 ∨ -1 = 1 ∧ 1 = -1
[PROOFSTEP]
simp
[GOAL]
case inr.inl.inr.inr
⊢ -1 + 1 = -1 + -1 ↔ -1 = -1 ∧ 1 = -1 ∨ -1 = -1 ∧ 1 = -1
[PROOFSTEP]
simp
[GOAL]
case inr.inr.inl.inl
⊢ -1 + -1 = 1 + 1 ↔ -1 = 1 ∧ -1 = 1 ∨ -1 = 1 ∧ -1 = 1
[PROOFSTEP]
simp
[GOAL]
case inr.inr.inl.inr
⊢ -1 + -1 = 1 + -1 ↔ -1 = 1 ∧ -1 = -1 ∨ -1 = -1 ∧ -1 = 1
[PROOFSTEP]
simp
[GOAL]
case inr.inr.inr.inl
⊢ -1 + -1 = -1 + 1 ↔ -1 = -1 ∧ -1 = 1 ∨ -1 = 1 ∧ -1 = -1
[PROOFSTEP]
simp
[GOAL]
case inr.inr.inr.inr
⊢ -1 + -1 = -1 + -1 ↔ -1 = -1 ∧ -1 = -1 ∨ -1 = -1 ∧ -1 = -1
[PROOFSTEP]
simp


[GOAL]
z w : ℂ
⊢ z < w ↔ z ≤ w ∧ ¬w ≤ z
[PROOFSTEP]
dsimp
[GOAL]
z w : ℂ
⊢ z.re < w.re ∧ z.im = w.im ↔ (z.re ≤ w.re ∧ z.im = w.im) ∧ ¬(w.re ≤ z.re ∧ w.im = z.im)
[PROOFSTEP]
rw [lt_iff_le_not_le]
[GOAL]
z w : ℂ
⊢ (z.re ≤ w.re ∧ ¬w.re ≤ z.re) ∧ z.im = w.im ↔ (z.re ≤ w.re ∧ z.im = w.im) ∧ ¬(w.re ≤ z.re ∧ w.im = z.im)
[PROOFSTEP]
tauto
[GOAL]
x y : ℝ
⊢ ↑x ≤ ↑y ↔ x ≤ y
[PROOFSTEP]
simp [le_def, ofReal']
[GOAL]
x y : ℝ
⊢ ↑x < ↑y ↔ x < y
[PROOFSTEP]
simp [lt_def, ofReal']
[GOAL]
z w : ℂ
⊢ ¬z ≤ w ↔ w.re < z.re ∨ z.im ≠ w.im
[PROOFSTEP]
rw [le_def, not_and_or, not_le]
[GOAL]
z w : ℂ
⊢ ¬z < w ↔ w.re ≤ z.re ∨ z.im ≠ w.im
[PROOFSTEP]
rw [lt_def, not_and_or, not_lt]
[GOAL]
r : ℝ
z : ℂ
hz : ↑r ≤ z
⊢ z = ↑z.re
[PROOFSTEP]
ext
[GOAL]
case a
r : ℝ
z : ℂ
hz : ↑r ≤ z
⊢ z.re = (↑z.re).re
case a r : ℝ z : ℂ hz : ↑r ≤ z ⊢ z.im = (↑z.re).im
[PROOFSTEP]
rfl
[GOAL]
case a
r : ℝ
z : ℂ
hz : ↑r ≤ z
⊢ z.im = (↑z.re).im
[PROOFSTEP]
simp only [← (Complex.le_def.1 hz).2, Complex.zero_im, Complex.ofReal_im]


[GOAL]
B : Type u_1
F : Type u_2
Z : Type u_3
inst✝³ : TopologicalSpace B
inst✝² : TopologicalSpace F
inst✝¹ : TopologicalSpace Z
proj : Z → B
inst✝ : Nonempty F
h : IsHomeomorphicTrivialFiberBundle F proj
⊢ Function.Surjective proj
[PROOFSTEP]
obtain ⟨e, rfl⟩ := h.proj_eq
[GOAL]
case intro
B : Type u_1
F : Type u_2
Z : Type u_3
inst✝³ : TopologicalSpace B
inst✝² : TopologicalSpace F
inst✝¹ : TopologicalSpace Z
inst✝ : Nonempty F
e : Z ≃ₜ B × F
h : IsHomeomorphicTrivialFiberBundle F (Prod.fst ∘ ↑e)
⊢ Function.Surjective (Prod.fst ∘ ↑e)
[PROOFSTEP]
exact Prod.fst_surjective.comp e.surjective
[GOAL]
B : Type u_1
F : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace B
inst✝¹ : TopologicalSpace F
inst✝ : TopologicalSpace Z
proj : Z → B
h : IsHomeomorphicTrivialFiberBundle F proj
⊢ Continuous proj
[PROOFSTEP]
obtain ⟨e, rfl⟩ := h.proj_eq
[GOAL]
case intro
B : Type u_1
F : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace B
inst✝¹ : TopologicalSpace F
inst✝ : TopologicalSpace Z
e : Z ≃ₜ B × F
h : IsHomeomorphicTrivialFiberBundle F (Prod.fst ∘ ↑e)
⊢ Continuous (Prod.fst ∘ ↑e)
[PROOFSTEP]
exact continuous_fst.comp e.continuous
[GOAL]
B : Type u_1
F : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace B
inst✝¹ : TopologicalSpace F
inst✝ : TopologicalSpace Z
proj : Z → B
h : IsHomeomorphicTrivialFiberBundle F proj
⊢ IsOpenMap proj
[PROOFSTEP]
obtain ⟨e, rfl⟩ := h.proj_eq
[GOAL]
case intro
B : Type u_1
F : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace B
inst✝¹ : TopologicalSpace F
inst✝ : TopologicalSpace Z
e : Z ≃ₜ B × F
h : IsHomeomorphicTrivialFiberBundle F (Prod.fst ∘ ↑e)
⊢ IsOpenMap (Prod.fst ∘ ↑e)
[PROOFSTEP]
exact isOpenMap_fst.comp e.isOpenMap


[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : Semiring A
inst✝¹ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
p : ℕ
inst✝ : CharP R p
x : ℕ
⊢ ↑x = 0 ↔ p ∣ x
[PROOFSTEP]
rw [← CharP.cast_eq_zero_iff R p x]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : Semiring A
inst✝¹ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
p : ℕ
inst✝ : CharP R p
x : ℕ
⊢ ↑x = 0 ↔ ↑x = 0
[PROOFSTEP]
change algebraMap ℕ A x = 0 ↔ algebraMap ℕ R x = 0
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : Semiring A
inst✝¹ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
p : ℕ
inst✝ : CharP R p
x : ℕ
⊢ ↑(algebraMap ℕ A) x = 0 ↔ ↑(algebraMap ℕ R) x = 0
[PROOFSTEP]
rw [IsScalarTower.algebraMap_apply ℕ R A x]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : Semiring A
inst✝¹ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
p : ℕ
inst✝ : CharP R p
x : ℕ
⊢ ↑(algebraMap R A) (↑(algebraMap ℕ R) x) = 0 ↔ ↑(algebraMap ℕ R) x = 0
[PROOFSTEP]
refine' Iff.trans _ h.eq_iff
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : Semiring A
inst✝¹ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
p : ℕ
inst✝ : CharP R p
x : ℕ
⊢ ↑(algebraMap R A) (↑(algebraMap ℕ R) x) = 0 ↔ ↑(algebraMap R A) (↑(algebraMap ℕ R) x) = ↑(algebraMap R A) 0
[PROOFSTEP]
rw [RingHom.map_zero]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : Semiring A
inst✝¹ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
inst✝ : CharZero R
x y : ℕ
hxy : ↑x = ↑y
⊢ x = y
[PROOFSTEP]
change algebraMap ℕ A x = algebraMap ℕ A y at hxy
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : Semiring A
inst✝¹ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
inst✝ : CharZero R
x y : ℕ
hxy : ↑(algebraMap ℕ A) x = ↑(algebraMap ℕ A) y
⊢ x = y
[PROOFSTEP]
rw [IsScalarTower.algebraMap_apply ℕ R A x] at hxy
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : Semiring A
inst✝¹ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
inst✝ : CharZero R
x y : ℕ
hxy : ↑(algebraMap R A) (↑(algebraMap ℕ R) x) = ↑(algebraMap ℕ A) y
⊢ x = y
[PROOFSTEP]
rw [IsScalarTower.algebraMap_apply ℕ R A y] at hxy
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : Semiring A
inst✝¹ : Algebra R A
h : Function.Injective ↑(algebraMap R A)
inst✝ : CharZero R
x y : ℕ
hxy : ↑(algebraMap R A) (↑(algebraMap ℕ R) x) = ↑(algebraMap R A) (↑(algebraMap ℕ R) y)
⊢ x = y
[PROOFSTEP]
exact CharZero.cast_injective (h hxy)
[GOAL]
K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : CommSemiring L
inst✝¹ : Nontrivial L
inst✝ : Algebra K L
⊢ ringChar K = ringChar L
[PROOFSTEP]
rw [ringChar.eq_iff, Algebra.charP_iff K L]
[GOAL]
K : Type u_1
L : Type u_2
inst✝³ : Field K
inst✝² : CommSemiring L
inst✝¹ : Nontrivial L
inst✝ : Algebra K L
⊢ CharP L (ringChar L)
[PROOFSTEP]
apply ringChar.charP


[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
⊢ ⁅g₁, g₂⁆ = 1 ↔ g₁ * g₂ = g₂ * g₁
[PROOFSTEP]
rw [commutatorElement_def, mul_inv_eq_one, mul_inv_eq_iff_eq_mul]
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
⊢ ⁅g₁, g₂⁆⁻¹ = ⁅g₂, g₁⁆
[PROOFSTEP]
simp_rw [commutatorElement_def, mul_inv_rev, inv_inv, mul_assoc]
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
⊢ ↑f ⁅g₁, g₂⁆ = ⁅↑f g₁, ↑f g₂⁆
[PROOFSTEP]
simp_rw [commutatorElement_def, map_mul f, map_inv f]
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
⊢ ⁅H₁, H₂⁆ = ⊥ ↔ H₁ ≤ centralizer ↑H₂
[PROOFSTEP]
rw [eq_bot_iff, commutator_le]
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
⊢ (∀ (g₁ : G), g₁ ∈ H₁ → ∀ (g₂ : G), g₂ ∈ H₂ → ⁅g₁, g₂⁆ ∈ ⊥) ↔ H₁ ≤ centralizer ↑H₂
[PROOFSTEP]
refine' forall_congr' fun p => forall_congr' fun _hp => forall_congr' fun q => forall_congr' fun hq => _
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
p : G
_hp : p ∈ H₁
q : G
hq : q ∈ H₂
⊢ ⁅p, q⁆ ∈ ⊥ ↔ q * p = p * q
[PROOFSTEP]
rw [mem_bot, commutatorElement_eq_one_iff_mul_comm, eq_comm]
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h1 : ⁅⁅H₂, H₃⁆, H₁⁆ = ⊥
h2 : ⁅⁅H₃, H₁⁆, H₂⁆ = ⊥
⊢ ⁅⁅H₁, H₂⁆, H₃⁆ = ⊥
[PROOFSTEP]
simp_rw [commutator_eq_bot_iff_le_centralizer, commutator_le, mem_centralizer_iff_commutator_eq_one, ←
  commutatorElement_def] at h1 h2 ⊢
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h1 : ∀ (g₁ : G), g₁ ∈ H₂ → ∀ (g₂ : G), g₂ ∈ H₃ → ∀ (h : G), h ∈ ↑H₁ → ⁅h, ⁅g₁, g₂⁆⁆ = 1
h2 : ∀ (g₁ : G), g₁ ∈ H₃ → ∀ (g₂ : G), g₂ ∈ H₁ → ∀ (h : G), h ∈ ↑H₂ → ⁅h, ⁅g₁, g₂⁆⁆ = 1
⊢ ∀ (g₁ : G), g₁ ∈ H₁ → ∀ (g₂ : G), g₂ ∈ H₂ → ∀ (h : G), h ∈ ↑H₃ → ⁅h, ⁅g₁, g₂⁆⁆ = 1
[PROOFSTEP]
intro x hx y hy z hz
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h1 : ∀ (g₁ : G), g₁ ∈ H₂ → ∀ (g₂ : G), g₂ ∈ H₃ → ∀ (h : G), h ∈ ↑H₁ → ⁅h, ⁅g₁, g₂⁆⁆ = 1
h2 : ∀ (g₁ : G), g₁ ∈ H₃ → ∀ (g₂ : G), g₂ ∈ H₁ → ∀ (h : G), h ∈ ↑H₂ → ⁅h, ⁅g₁, g₂⁆⁆ = 1
x : G
hx : x ∈ H₁
y : G
hy : y ∈ H₂
z : G
hz : z ∈ ↑H₃
⊢ ⁅z, ⁅x, y⁆⁆ = 1
[PROOFSTEP]
trans x * z * ⁅y, ⁅z⁻¹, x⁻¹⁆⁆⁻¹ * z⁻¹ * y * ⁅x⁻¹, ⁅y⁻¹, z⁆⁆⁻¹ * y⁻¹ * x⁻¹
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h1 : ∀ (g₁ : G), g₁ ∈ H₂ → ∀ (g₂ : G), g₂ ∈ H₃ → ∀ (h : G), h ∈ ↑H₁ → ⁅h, ⁅g₁, g₂⁆⁆ = 1
h2 : ∀ (g₁ : G), g₁ ∈ H₃ → ∀ (g₂ : G), g₂ ∈ H₁ → ∀ (h : G), h ∈ ↑H₂ → ⁅h, ⁅g₁, g₂⁆⁆ = 1
x : G
hx : x ∈ H₁
y : G
hy : y ∈ H₂
z : G
hz : z ∈ ↑H₃
⊢ ⁅z, ⁅x, y⁆⁆ = x * z * ⁅y, ⁅z⁻¹, x⁻¹⁆⁆⁻¹ * z⁻¹ * y * ⁅x⁻¹, ⁅y⁻¹, z⁆⁆⁻¹ * y⁻¹ * x⁻¹
[PROOFSTEP]
group
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h1 : ∀ (g₁ : G), g₁ ∈ H₂ → ∀ (g₂ : G), g₂ ∈ H₃ → ∀ (h : G), h ∈ ↑H₁ → ⁅h, ⁅g₁, g₂⁆⁆ = 1
h2 : ∀ (g₁ : G), g₁ ∈ H₃ → ∀ (g₂ : G), g₂ ∈ H₁ → ∀ (h : G), h ∈ ↑H₂ → ⁅h, ⁅g₁, g₂⁆⁆ = 1
x : G
hx : x ∈ H₁
y : G
hy : y ∈ H₂
z : G
hz : z ∈ ↑H₃
⊢ x * z * ⁅y, ⁅z⁻¹, x⁻¹⁆⁆⁻¹ * z⁻¹ * y * ⁅x⁻¹, ⁅y⁻¹, z⁆⁆⁻¹ * y⁻¹ * x⁻¹ = 1
[PROOFSTEP]
rw [h1 _ (H₂.inv_mem hy) _ hz _ (H₁.inv_mem hx), h2 _ (H₃.inv_mem hz) _ (H₁.inv_mem hx) _ hy]
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h1 : ∀ (g₁ : G), g₁ ∈ H₂ → ∀ (g₂ : G), g₂ ∈ H₃ → ∀ (h : G), h ∈ ↑H₁ → ⁅h, ⁅g₁, g₂⁆⁆ = 1
h2 : ∀ (g₁ : G), g₁ ∈ H₃ → ∀ (g₂ : G), g₂ ∈ H₁ → ∀ (h : G), h ∈ ↑H₂ → ⁅h, ⁅g₁, g₂⁆⁆ = 1
x : G
hx : x ∈ H₁
y : G
hy : y ∈ H₂
z : G
hz : z ∈ ↑H₃
⊢ x * z * 1⁻¹ * z⁻¹ * y * 1⁻¹ * y⁻¹ * x⁻¹ = 1
[PROOFSTEP]
group
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h₁ : Normal H₁
h₂ : Normal H₂
⊢ Normal ⁅H₁, H₂⁆
[PROOFSTEP]
let base : Set G := {x | ∃ g₁ ∈ H₁, ∃ g₂ ∈ H₂, ⁅g₁, g₂⁆ = x}
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h₁ : Normal H₁
h₂ : Normal H₂
base : Set G := {x | ∃ g₁, g₁ ∈ H₁ ∧ ∃ g₂, g₂ ∈ H₂ ∧ ⁅g₁, g₂⁆ = x}
⊢ Normal ⁅H₁, H₂⁆
[PROOFSTEP]
change (closure base).Normal
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h₁ : Normal H₁
h₂ : Normal H₂
base : Set G := {x | ∃ g₁, g₁ ∈ H₁ ∧ ∃ g₂, g₂ ∈ H₂ ∧ ⁅g₁, g₂⁆ = x}
⊢ Normal (closure base)
[PROOFSTEP]
suffices h_base : base = Group.conjugatesOfSet base
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h₁ : Normal H₁
h₂ : Normal H₂
base : Set G := {x | ∃ g₁, g₁ ∈ H₁ ∧ ∃ g₂, g₂ ∈ H₂ ∧ ⁅g₁, g₂⁆ = x}
h_base : base = Group.conjugatesOfSet base
⊢ Normal (closure base)
[PROOFSTEP]
rw [h_base]
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h₁ : Normal H₁
h₂ : Normal H₂
base : Set G := {x | ∃ g₁, g₁ ∈ H₁ ∧ ∃ g₂, g₂ ∈ H₂ ∧ ⁅g₁, g₂⁆ = x}
h_base : base = Group.conjugatesOfSet base
⊢ Normal (closure (Group.conjugatesOfSet base))
[PROOFSTEP]
exact Subgroup.normalClosure_normal
[GOAL]
case h_base
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h₁ : Normal H₁
h₂ : Normal H₂
base : Set G := {x | ∃ g₁, g₁ ∈ H₁ ∧ ∃ g₂, g₂ ∈ H₂ ∧ ⁅g₁, g₂⁆ = x}
⊢ base = Group.conjugatesOfSet base
[PROOFSTEP]
refine' Set.Subset.antisymm Group.subset_conjugatesOfSet fun a h => _
[GOAL]
case h_base
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h₁ : Normal H₁
h₂ : Normal H₂
base : Set G := {x | ∃ g₁, g₁ ∈ H₁ ∧ ∃ g₂, g₂ ∈ H₂ ∧ ⁅g₁, g₂⁆ = x}
a : G
h : a ∈ Group.conjugatesOfSet base
⊢ a ∈ base
[PROOFSTEP]
simp_rw [Group.mem_conjugatesOfSet_iff, isConj_iff] at h
[GOAL]
case h_base
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h₁ : Normal H₁
h₂ : Normal H₂
base : Set G := {x | ∃ g₁, g₁ ∈ H₁ ∧ ∃ g₂, g₂ ∈ H₂ ∧ ⁅g₁, g₂⁆ = x}
a : G
h : ∃ a_1, a_1 ∈ {x | ∃ g₁, g₁ ∈ H₁ ∧ ∃ g₂, g₂ ∈ H₂ ∧ ⁅g₁, g₂⁆ = x} ∧ ∃ c, c * a_1 * c⁻¹ = a
⊢ a ∈ base
[PROOFSTEP]
rcases h with ⟨b, ⟨c, hc, e, he, rfl⟩, d, rfl⟩
[GOAL]
case h_base.intro.intro.intro.intro.intro.intro.intro
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
h₁ : Normal H₁
h₂ : Normal H₂
base : Set G := {x | ∃ g₁, g₁ ∈ H₁ ∧ ∃ g₂, g₂ ∈ H₂ ∧ ⁅g₁, g₂⁆ = x}
c : G
hc : c ∈ H₁
e : G
he : e ∈ H₂
d : G
⊢ d * ⁅c, e⁆ * d⁻¹ ∈ base
[PROOFSTEP]
exact ⟨_, h₁.conj_mem c hc d, _, h₂.conj_mem e he d, (conjugate_commutatorElement c e d).symm⟩
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f✝ : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
f : G →* G'
⊢ map f ⁅H₁, H₂⁆ = ⁅map f H₁, map f H₂⁆
[PROOFSTEP]
simp_rw [le_antisymm_iff, map_le_iff_le_comap, commutator_le, mem_comap, map_commutatorElement]
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f✝ : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
f : G →* G'
⊢ (∀ (g₁ : G), g₁ ∈ H₁ → ∀ (g₂ : G), g₂ ∈ H₂ → ⁅↑f g₁, ↑f g₂⁆ ∈ ⁅map f H₁, map f H₂⁆) ∧
    ∀ (g₁ : G'), g₁ ∈ map f H₁ → ∀ (g₂ : G'), g₂ ∈ map f H₂ → ⁅g₁, g₂⁆ ∈ map f ⁅H₁, H₂⁆
[PROOFSTEP]
constructor
[GOAL]
case left
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f✝ : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
f : G →* G'
⊢ ∀ (g₁ : G), g₁ ∈ H₁ → ∀ (g₂ : G), g₂ ∈ H₂ → ⁅↑f g₁, ↑f g₂⁆ ∈ ⁅map f H₁, map f H₂⁆
[PROOFSTEP]
intro p hp q hq
[GOAL]
case left
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f✝ : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
f : G →* G'
p : G
hp : p ∈ H₁
q : G
hq : q ∈ H₂
⊢ ⁅↑f p, ↑f q⁆ ∈ ⁅map f H₁, map f H₂⁆
[PROOFSTEP]
exact commutator_mem_commutator (mem_map_of_mem _ hp) (mem_map_of_mem _ hq)
[GOAL]
case right
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f✝ : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
f : G →* G'
⊢ ∀ (g₁ : G'), g₁ ∈ map f H₁ → ∀ (g₂ : G'), g₂ ∈ map f H₂ → ⁅g₁, g₂⁆ ∈ map f ⁅H₁, H₂⁆
[PROOFSTEP]
rintro _ ⟨p, hp, rfl⟩ _ ⟨q, hq, rfl⟩
[GOAL]
case right.intro.intro.intro.intro
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f✝ : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
f : G →* G'
p : G
hp : p ∈ ↑H₁
q : G
hq : q ∈ ↑H₂
⊢ ⁅↑f p, ↑f q⁆ ∈ map f ⁅H₁, H₂⁆
[PROOFSTEP]
rw [← map_commutatorElement]
[GOAL]
case right.intro.intro.intro.intro
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f✝ : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
f : G →* G'
p : G
hp : p ∈ ↑H₁
q : G
hq : q ∈ ↑H₂
⊢ ↑f ⁅p, q⁆ ∈ map f ⁅H₁, H₂⁆
[PROOFSTEP]
exact mem_map_of_mem _ (commutator_mem_commutator hp hq)
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁✝ K₂✝ : Subgroup G
K₁ K₂ : Subgroup G'
⊢ ⁅prod H₁ K₁, prod H₂ K₂⁆ = prod ⁅H₁, H₂⁆ ⁅K₁, K₂⁆
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁✝ K₂✝ : Subgroup G
K₁ K₂ : Subgroup G'
⊢ ⁅prod H₁ K₁, prod H₂ K₂⁆ ≤ prod ⁅H₁, H₂⁆ ⁅K₁, K₂⁆
[PROOFSTEP]
rw [commutator_le]
[GOAL]
case a
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁✝ K₂✝ : Subgroup G
K₁ K₂ : Subgroup G'
⊢ ∀ (g₁ : G × G'), g₁ ∈ prod H₁ K₁ → ∀ (g₂ : G × G'), g₂ ∈ prod H₂ K₂ → ⁅g₁, g₂⁆ ∈ prod ⁅H₁, H₂⁆ ⁅K₁, K₂⁆
[PROOFSTEP]
rintro ⟨p₁, p₂⟩ ⟨hp₁, hp₂⟩ ⟨q₁, q₂⟩ ⟨hq₁, hq₂⟩
[GOAL]
case a.mk.intro.mk.intro
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁✝ K₂✝ : Subgroup G
K₁ K₂ : Subgroup G'
p₁ : G
p₂ : G'
hp₁ : (p₁, p₂).fst ∈ ↑H₁.toSubmonoid
hp₂ : (p₁, p₂).snd ∈ ↑K₁.toSubmonoid
q₁ : G
q₂ : G'
hq₁ : (q₁, q₂).fst ∈ ↑H₂.toSubmonoid
hq₂ : (q₁, q₂).snd ∈ ↑K₂.toSubmonoid
⊢ ⁅(p₁, p₂), (q₁, q₂)⁆ ∈ prod ⁅H₁, H₂⁆ ⁅K₁, K₂⁆
[PROOFSTEP]
exact ⟨commutator_mem_commutator hp₁ hq₁, commutator_mem_commutator hp₂ hq₂⟩
[GOAL]
case a
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁✝ K₂✝ : Subgroup G
K₁ K₂ : Subgroup G'
⊢ prod ⁅H₁, H₂⁆ ⁅K₁, K₂⁆ ≤ ⁅prod H₁ K₁, prod H₂ K₂⁆
[PROOFSTEP]
rw [prod_le_iff]
[GOAL]
case a
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁✝ K₂✝ : Subgroup G
K₁ K₂ : Subgroup G'
⊢ map (MonoidHom.inl G G') ⁅H₁, H₂⁆ ≤ ⁅prod H₁ K₁, prod H₂ K₂⁆ ∧
    map (MonoidHom.inr G G') ⁅K₁, K₂⁆ ≤ ⁅prod H₁ K₁, prod H₂ K₂⁆
[PROOFSTEP]
constructor
[GOAL]
case a.left
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁✝ K₂✝ : Subgroup G
K₁ K₂ : Subgroup G'
⊢ map (MonoidHom.inl G G') ⁅H₁, H₂⁆ ≤ ⁅prod H₁ K₁, prod H₂ K₂⁆
[PROOFSTEP]
rw [map_commutator]
[GOAL]
case a.left
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁✝ K₂✝ : Subgroup G
K₁ K₂ : Subgroup G'
⊢ ⁅map (MonoidHom.inl G G') H₁, map (MonoidHom.inl G G') H₂⁆ ≤ ⁅prod H₁ K₁, prod H₂ K₂⁆
[PROOFSTEP]
apply commutator_mono
[GOAL]
case a.left.h₁
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁✝ K₂✝ : Subgroup G
K₁ K₂ : Subgroup G'
⊢ map (MonoidHom.inl G G') H₁ ≤ prod H₁ K₁
[PROOFSTEP]
simp [le_prod_iff, map_map, MonoidHom.fst_comp_inl, MonoidHom.snd_comp_inl, MonoidHom.fst_comp_inr,
  MonoidHom.snd_comp_inr]
[GOAL]
case a.left.h₂
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁✝ K₂✝ : Subgroup G
K₁ K₂ : Subgroup G'
⊢ map (MonoidHom.inl G G') H₂ ≤ prod H₂ K₂
[PROOFSTEP]
simp [le_prod_iff, map_map, MonoidHom.fst_comp_inl, MonoidHom.snd_comp_inl, MonoidHom.fst_comp_inr,
  MonoidHom.snd_comp_inr]
[GOAL]
case a.right
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁✝ K₂✝ : Subgroup G
K₁ K₂ : Subgroup G'
⊢ map (MonoidHom.inr G G') ⁅K₁, K₂⁆ ≤ ⁅prod H₁ K₁, prod H₂ K₂⁆
[PROOFSTEP]
rw [map_commutator]
[GOAL]
case a.right
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁✝ K₂✝ : Subgroup G
K₁ K₂ : Subgroup G'
⊢ ⁅map (MonoidHom.inr G G') K₁, map (MonoidHom.inr G G') K₂⁆ ≤ ⁅prod H₁ K₁, prod H₂ K₂⁆
[PROOFSTEP]
apply commutator_mono
[GOAL]
case a.right.h₁
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁✝ K₂✝ : Subgroup G
K₁ K₂ : Subgroup G'
⊢ map (MonoidHom.inr G G') K₁ ≤ prod H₁ K₁
[PROOFSTEP]
simp [le_prod_iff, map_map, MonoidHom.fst_comp_inl, MonoidHom.snd_comp_inl, MonoidHom.fst_comp_inr,
  MonoidHom.snd_comp_inr]
[GOAL]
case a.right.h₂
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝² : Group G
inst✝¹ : Group G'
inst✝ : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁✝ K₂✝ : Subgroup G
K₁ K₂ : Subgroup G'
⊢ map (MonoidHom.inr G G') K₂ ≤ prod H₂ K₂
[PROOFSTEP]
simp [le_prod_iff, map_map, MonoidHom.fst_comp_inl, MonoidHom.snd_comp_inl, MonoidHom.fst_comp_inr,
  MonoidHom.snd_comp_inr]
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
⊢ ⁅pi Set.univ H, pi Set.univ K⁆ = pi Set.univ fun i => ⁅H i, K i⁆
[PROOFSTEP]
classical
apply le_antisymm (commutator_pi_pi_le H K)
· rw [pi_le_iff]
  intro i hi
  rw [map_commutator]
  apply commutator_mono <;>
    · rw [le_pi_iff]
      intro j _hj
      rintro _ ⟨_, ⟨x, hx, rfl⟩, rfl⟩
      by_cases h : j = i
      · subst h
        simpa using hx
      · simp [h, one_mem]
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
⊢ ⁅pi Set.univ H, pi Set.univ K⁆ = pi Set.univ fun i => ⁅H i, K i⁆
[PROOFSTEP]
apply le_antisymm (commutator_pi_pi_le H K)
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
⊢ (pi Set.univ fun i => ⁅H i, K i⁆) ≤ ⁅pi Set.univ H, pi Set.univ K⁆
[PROOFSTEP]
rw [pi_le_iff]
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
⊢ ∀ (i : η), map (MonoidHom.single (fun i => Gs i) i) ⁅H i, K i⁆ ≤ ⁅pi Set.univ H, pi Set.univ K⁆
[PROOFSTEP]
intro i hi
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
i : η
hi : (i : η) → Gs i
⊢ hi ∈ map (MonoidHom.single (fun i => Gs i) i) ⁅H i, K i⁆ → hi ∈ ⁅pi Set.univ H, pi Set.univ K⁆
[PROOFSTEP]
rw [map_commutator]
[GOAL]
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
i : η
hi : (i : η) → Gs i
⊢ hi ∈ ⁅map (MonoidHom.single (fun i => Gs i) i) (H i), map (MonoidHom.single (fun i => Gs i) i) (K i)⁆ →
    hi ∈ ⁅pi Set.univ H, pi Set.univ K⁆
[PROOFSTEP]
apply commutator_mono
[GOAL]
case h₁
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
i : η
hi : (i : η) → Gs i
⊢ map (MonoidHom.single (fun i => Gs i) i) (H i) ≤ pi Set.univ H
[PROOFSTEP]
rw [le_pi_iff]
[GOAL]
case h₁
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
i : η
hi : (i : η) → Gs i
⊢ ∀ (i_1 : η),
    i_1 ∈ Set.univ → map (Pi.evalMonoidHom (fun i => Gs i) i_1) (map (MonoidHom.single (fun i => Gs i) i) (H i)) ≤ H i_1
[PROOFSTEP]
intro j _hj
[GOAL]
case h₁
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
i : η
hi : (i : η) → Gs i
j : η
_hj : j ∈ Set.univ
⊢ map (Pi.evalMonoidHom (fun i => Gs i) j) (map (MonoidHom.single (fun i => Gs i) i) (H i)) ≤ H j
[PROOFSTEP]
rintro _ ⟨_, ⟨x, hx, rfl⟩, rfl⟩
[GOAL]
case h₁.intro.intro.intro.intro
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
i : η
hi : (i : η) → Gs i
j : η
_hj : j ∈ Set.univ
x : Gs i
hx : x ∈ ↑(H i)
⊢ ↑(Pi.evalMonoidHom (fun i => Gs i) j) (↑(MonoidHom.single (fun i => Gs i) i) x) ∈ H j
[PROOFSTEP]
by_cases h : j = i
[GOAL]
case pos
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
i : η
hi : (i : η) → Gs i
j : η
_hj : j ∈ Set.univ
x : Gs i
hx : x ∈ ↑(H i)
h : j = i
⊢ ↑(Pi.evalMonoidHom (fun i => Gs i) j) (↑(MonoidHom.single (fun i => Gs i) i) x) ∈ H j
[PROOFSTEP]
subst h
[GOAL]
case pos
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
hi : (i : η) → Gs i
j : η
_hj : j ∈ Set.univ
x : Gs j
hx : x ∈ ↑(H j)
⊢ ↑(Pi.evalMonoidHom (fun i => Gs i) j) (↑(MonoidHom.single (fun i => Gs i) j) x) ∈ H j
[PROOFSTEP]
simpa using hx
[GOAL]
case neg
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
i : η
hi : (i : η) → Gs i
j : η
_hj : j ∈ Set.univ
x : Gs i
hx : x ∈ ↑(H i)
h : ¬j = i
⊢ ↑(Pi.evalMonoidHom (fun i => Gs i) j) (↑(MonoidHom.single (fun i => Gs i) i) x) ∈ H j
[PROOFSTEP]
simp [h, one_mem]
[GOAL]
case h₂
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
i : η
hi : (i : η) → Gs i
⊢ map (MonoidHom.single (fun i => Gs i) i) (K i) ≤ pi Set.univ K
[PROOFSTEP]
rw [le_pi_iff]
[GOAL]
case h₂
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
i : η
hi : (i : η) → Gs i
⊢ ∀ (i_1 : η),
    i_1 ∈ Set.univ → map (Pi.evalMonoidHom (fun i => Gs i) i_1) (map (MonoidHom.single (fun i => Gs i) i) (K i)) ≤ K i_1
[PROOFSTEP]
intro j _hj
[GOAL]
case h₂
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
i : η
hi : (i : η) → Gs i
j : η
_hj : j ∈ Set.univ
⊢ map (Pi.evalMonoidHom (fun i => Gs i) j) (map (MonoidHom.single (fun i => Gs i) i) (K i)) ≤ K j
[PROOFSTEP]
rintro _ ⟨_, ⟨x, hx, rfl⟩, rfl⟩
[GOAL]
case h₂.intro.intro.intro.intro
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
i : η
hi : (i : η) → Gs i
j : η
_hj : j ∈ Set.univ
x : Gs i
hx : x ∈ ↑(K i)
⊢ ↑(Pi.evalMonoidHom (fun i => Gs i) j) (↑(MonoidHom.single (fun i => Gs i) i) x) ∈ K j
[PROOFSTEP]
by_cases h : j = i
[GOAL]
case pos
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
i : η
hi : (i : η) → Gs i
j : η
_hj : j ∈ Set.univ
x : Gs i
hx : x ∈ ↑(K i)
h : j = i
⊢ ↑(Pi.evalMonoidHom (fun i => Gs i) j) (↑(MonoidHom.single (fun i => Gs i) i) x) ∈ K j
[PROOFSTEP]
subst h
[GOAL]
case pos
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
hi : (i : η) → Gs i
j : η
_hj : j ∈ Set.univ
x : Gs j
hx : x ∈ ↑(K j)
⊢ ↑(Pi.evalMonoidHom (fun i => Gs i) j) (↑(MonoidHom.single (fun i => Gs i) j) x) ∈ K j
[PROOFSTEP]
simpa using hx
[GOAL]
case neg
G : Type u_1
G' : Type u_2
F : Type u_3
inst✝⁴ : Group G
inst✝³ : Group G'
inst✝² : MonoidHomClass F G G'
f : F
g₁ g₂ g₃ g : G
H₁ H₂ H₃ K₁ K₂ : Subgroup G
η : Type u_4
inst✝¹ : Finite η
Gs : η → Type u_5
inst✝ : (i : η) → Group (Gs i)
H K : (i : η) → Subgroup (Gs i)
i : η
hi : (i : η) → Gs i
j : η
_hj : j ∈ Set.univ
x : Gs i
hx : x ∈ ↑(K i)
h : ¬j = i
⊢ ↑(Pi.evalMonoidHom (fun i => Gs i) j) (↑(MonoidHom.single (fun i => Gs i) i) x) ∈ K j
[PROOFSTEP]
simp [h, one_mem]


[GOAL]
α : Type u_1
𝕜 : Type u_2
inst✝¹ : Fintype α
inst✝ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
hε : FarFromTriangleFree G ε
h : δ ≤ ε
⊢ δ * ↑(Fintype.card α ^ 2) ≤ ε * ↑(Fintype.card α ^ 2)
[PROOFSTEP]
gcongr
[GOAL]
α : Type u_1
𝕜 : Type u_2
inst✝² : Fintype α
inst✝¹ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝ : Nonempty α
h₀ : FarFromTriangleFree G ε
h₁ : CliqueFree G 3
⊢ ε ≤ 0
[PROOFSTEP]
have := h₀ (empty_subset _)
[GOAL]
α : Type u_1
𝕜 : Type u_2
inst✝² : Fintype α
inst✝¹ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝ : Nonempty α
h₀ : FarFromTriangleFree G ε
h₁ : CliqueFree G 3
this : (fun H => CliqueFree H 3) (deleteEdges G ↑∅) → ε * ↑(Fintype.card α ^ 2) ≤ ↑(Finset.card ∅)
⊢ ε ≤ 0
[PROOFSTEP]
rw [coe_empty, Finset.card_empty, cast_zero, deleteEdges_empty_eq] at this
[GOAL]
α : Type u_1
𝕜 : Type u_2
inst✝² : Fintype α
inst✝¹ : LinearOrderedField 𝕜
G H : SimpleGraph α
ε δ : 𝕜
n : ℕ
s : Finset α
inst✝ : Nonempty α
h₀ : FarFromTriangleFree G ε
h₁ : CliqueFree G 3
this : (fun H => CliqueFree H 3) G → ε * ↑(Fintype.card α ^ 2) ≤ 0
⊢ ε ≤ 0
[PROOFSTEP]
exact nonpos_of_mul_nonpos_left (this h₁) (cast_pos.2 <| sq_pos_of_pos Fintype.card_pos)


[GOAL]
α : Type u
inst✝ : MulZeroClass α
x✝ : ULift α
⊢ ↑Equiv.ulift (0 * x✝) = ↑Equiv.ulift 0
[PROOFSTEP]
simp
[GOAL]
α : Type u
inst✝ : MulZeroClass α
x✝ : ULift α
⊢ ↑Equiv.ulift (x✝ * 0) = ↑Equiv.ulift 0
[PROOFSTEP]
simp
[GOAL]
α : Type u
inst✝ : Distrib α
x✝² x✝¹ x✝ : ULift α
⊢ ↑Equiv.ulift (x✝² * (x✝¹ + x✝)) = ↑Equiv.ulift (x✝² * x✝¹ + x✝² * x✝)
[PROOFSTEP]
simp [left_distrib]
[GOAL]
α : Type u
inst✝ : Distrib α
x✝² x✝¹ x✝ : ULift α
⊢ ↑Equiv.ulift ((x✝² + x✝¹) * x✝) = ↑Equiv.ulift (x✝² * x✝ + x✝¹ * x✝)
[PROOFSTEP]
simp [right_distrib]


[GOAL]
lo hi a : ℕ
h : Nat.succ lo ≤ a ∧ a ≤ hi
⊢ Nat.succ (Nat.pred a) ≤ hi
[PROOFSTEP]
rw [Nat.succ_pred_eq_of_pos]
[GOAL]
lo hi a : ℕ
h : Nat.succ lo ≤ a ∧ a ≤ hi
⊢ a ≤ hi
lo hi a : ℕ h : Nat.succ lo ≤ a ∧ a ≤ hi ⊢ 0 < a
[PROOFSTEP]
exact h.right
[GOAL]
lo hi a : ℕ
h : Nat.succ lo ≤ a ∧ a ≤ hi
⊢ 0 < a
[PROOFSTEP]
exact lt_of_le_of_lt (Nat.zero_le lo) h.left


[GOAL]
M : Type u_1
inst✝² : Monoid M
R : Type u_2
inst✝¹ : Semiring R
inst✝ : MulSemiringAction M R
m : M
⊢ HSMul.hSMul m = map (MulSemiringAction.toRingHom M R m)
[PROOFSTEP]
suffices DistribMulAction.toAddMonoidHom R[X] m = (mapRingHom (MulSemiringAction.toRingHom M R m)).toAddMonoidHom
  by
  ext1 r
  exact FunLike.congr_fun this r
[GOAL]
M : Type u_1
inst✝² : Monoid M
R : Type u_2
inst✝¹ : Semiring R
inst✝ : MulSemiringAction M R
m : M
this : DistribMulAction.toAddMonoidHom R[X] m = RingHom.toAddMonoidHom (mapRingHom (MulSemiringAction.toRingHom M R m))
⊢ HSMul.hSMul m = map (MulSemiringAction.toRingHom M R m)
[PROOFSTEP]
ext1 r
[GOAL]
case h
M : Type u_1
inst✝² : Monoid M
R : Type u_2
inst✝¹ : Semiring R
inst✝ : MulSemiringAction M R
m : M
this : DistribMulAction.toAddMonoidHom R[X] m = RingHom.toAddMonoidHom (mapRingHom (MulSemiringAction.toRingHom M R m))
r : R[X]
⊢ m • r = map (MulSemiringAction.toRingHom M R m) r
[PROOFSTEP]
exact FunLike.congr_fun this r
[GOAL]
M : Type u_1
inst✝² : Monoid M
R : Type u_2
inst✝¹ : Semiring R
inst✝ : MulSemiringAction M R
m : M
⊢ DistribMulAction.toAddMonoidHom R[X] m = RingHom.toAddMonoidHom (mapRingHom (MulSemiringAction.toRingHom M R m))
[PROOFSTEP]
ext n r : 2
[GOAL]
case h.h
M : Type u_1
inst✝² : Monoid M
R : Type u_2
inst✝¹ : Semiring R
inst✝ : MulSemiringAction M R
m : M
n : ℕ
r : R
⊢ ↑(AddMonoidHom.comp (DistribMulAction.toAddMonoidHom R[X] m) (LinearMap.toAddMonoidHom (monomial n))) r =
    ↑(AddMonoidHom.comp (RingHom.toAddMonoidHom (mapRingHom (MulSemiringAction.toRingHom M R m)))
          (LinearMap.toAddMonoidHom (monomial n)))
      r
[PROOFSTEP]
change m • monomial n r = map (MulSemiringAction.toRingHom M R m) (monomial n r)
[GOAL]
case h.h
M : Type u_1
inst✝² : Monoid M
R : Type u_2
inst✝¹ : Semiring R
inst✝ : MulSemiringAction M R
m : M
n : ℕ
r : R
⊢ m • ↑(monomial n) r = map (MulSemiringAction.toRingHom M R m) (↑(monomial n) r)
[PROOFSTEP]
rw [Polynomial.map_monomial, Polynomial.smul_monomial, MulSemiringAction.toRingHom_apply]
[GOAL]
M : Type u_1
inst✝⁴ : Monoid M
R : Type u_2
inst✝³ : Semiring R
inst✝² : MulSemiringAction M R
S : Type u_3
inst✝¹ : CommSemiring S
inst✝ : MulSemiringAction M S
m : M
f : S[X]
x r : S
⊢ eval (m • x) (m • ↑C r) = m • eval x (↑C r)
[PROOFSTEP]
rw [smul_C, eval_C, eval_C]
[GOAL]
M : Type u_1
inst✝⁴ : Monoid M
R : Type u_2
inst✝³ : Semiring R
inst✝² : MulSemiringAction M R
S : Type u_3
inst✝¹ : CommSemiring S
inst✝ : MulSemiringAction M S
m : M
f✝ : S[X]
x : S
f g : S[X]
ihf : eval (m • x) (m • f) = m • eval x f
ihg : eval (m • x) (m • g) = m • eval x g
⊢ eval (m • x) (m • (f + g)) = m • eval x (f + g)
[PROOFSTEP]
rw [smul_add, eval_add, ihf, ihg, eval_add, smul_add]
[GOAL]
M : Type u_1
inst✝⁴ : Monoid M
R : Type u_2
inst✝³ : Semiring R
inst✝² : MulSemiringAction M R
S : Type u_3
inst✝¹ : CommSemiring S
inst✝ : MulSemiringAction M S
m : M
f : S[X]
x : S
n : ℕ
r : S
x✝ : eval (m • x) (m • (↑C r * X ^ n)) = m • eval x (↑C r * X ^ n)
⊢ eval (m • x) (m • (↑C r * X ^ (n + 1))) = m • eval x (↑C r * X ^ (n + 1))
[PROOFSTEP]
rw [smul_mul', smul_pow', smul_C, smul_X, eval_mul, eval_C, eval_pow, eval_X, eval_mul, eval_C, eval_pow, eval_X,
  smul_mul', smul_pow']
[GOAL]
M : Type u_1
inst✝⁶ : Monoid M
R : Type u_2
inst✝⁵ : Semiring R
inst✝⁴ : MulSemiringAction M R
S : Type u_3
inst✝³ : CommSemiring S
inst✝² : MulSemiringAction M S
G : Type u_4
inst✝¹ : Group G
inst✝ : MulSemiringAction G S
g : G
f : S[X]
x : S
⊢ eval (g • x) f = g • eval x (g⁻¹ • f)
[PROOFSTEP]
rw [← smul_eval_smul, smul_inv_smul]
[GOAL]
M : Type u_1
inst✝⁶ : Monoid M
R : Type u_2
inst✝⁵ : Semiring R
inst✝⁴ : MulSemiringAction M R
S : Type u_3
inst✝³ : CommSemiring S
inst✝² : MulSemiringAction M S
G : Type u_4
inst✝¹ : Group G
inst✝ : MulSemiringAction G S
g : G
f : S[X]
x : S
⊢ eval x (g • f) = g • eval (g⁻¹ • x) f
[PROOFSTEP]
rw [← smul_eval_smul, smul_inv_smul]
[GOAL]
M : Type u_1
inst✝⁴ : Monoid M
G : Type u_2
inst✝³ : Group G
inst✝² : Fintype G
R : Type u_3
inst✝¹ : CommRing R
inst✝ : MulSemiringAction G R
x : R
⊢ ↑↑↑(aeval x) (X - ↑C (ofQuotientStabilizer G x ↑1)) = 0
[PROOFSTEP]
simp
[GOAL]
M : Type u_1
inst✝⁴ : Monoid M
G : Type u_2
inst✝³ : Group G
inst✝² : Fintype G
R : Type u_3
inst✝¹ : CommRing R
inst✝ : MulSemiringAction G R
x : R
g : G
g' : G ⧸ stabilizer G x
⊢ g • (X - ↑C (ofQuotientStabilizer G x g')) = X - ↑C (ofQuotientStabilizer G x ((fun x_1 x_2 => x_1 • x_2) g g'))
[PROOFSTEP]
rw [ofQuotientStabilizer_smul, smul_sub, Polynomial.smul_X, Polynomial.smul_C]
[GOAL]
M : Type u_1
inst✝⁴ : Monoid M
G : Type u_2
inst✝³ : Group G
inst✝² : Fintype G
R : Type u_3
inst✝¹ : CommRing R
inst✝ : MulSemiringAction G R
x : R
g : G
n : ℕ
⊢ g • Polynomial.coeff (prodXSubSmul G R x) n = Polynomial.coeff (prodXSubSmul G R x) n
[PROOFSTEP]
rw [← Polynomial.coeff_smul, prodXSubSmul.smul]
[GOAL]
M : Type u_1
inst✝⁴ : Monoid M
P : Type u_2
inst✝³ : CommSemiring P
inst✝² : MulSemiringAction M P
Q : Type u_3
inst✝¹ : CommSemiring Q
inst✝ : MulSemiringAction M Q
g : P →+*[M] Q
m : M
p : P[X]
b : P
⊢ map (↑g) (m • ↑C b) = m • map (↑g) (↑C b)
[PROOFSTEP]
rw [smul_C, map_C, coe_fn_coe, g.map_smul, map_C, coe_fn_coe, smul_C]
[GOAL]
M : Type u_1
inst✝⁴ : Monoid M
P : Type u_2
inst✝³ : CommSemiring P
inst✝² : MulSemiringAction M P
Q : Type u_3
inst✝¹ : CommSemiring Q
inst✝ : MulSemiringAction M Q
g : P →+*[M] Q
m : M
p✝ p q : P[X]
ihp : map (↑g) (m • p) = m • map (↑g) p
ihq : map (↑g) (m • q) = m • map (↑g) q
⊢ map (↑g) (m • (p + q)) = m • map (↑g) (p + q)
[PROOFSTEP]
rw [smul_add, Polynomial.map_add, ihp, ihq, Polynomial.map_add, smul_add]
[GOAL]
M : Type u_1
inst✝⁴ : Monoid M
P : Type u_2
inst✝³ : CommSemiring P
inst✝² : MulSemiringAction M P
Q : Type u_3
inst✝¹ : CommSemiring Q
inst✝ : MulSemiringAction M Q
g : P →+*[M] Q
m : M
p : P[X]
n : ℕ
b : P
x✝ : map (↑g) (m • (↑C b * X ^ n)) = m • map (↑g) (↑C b * X ^ n)
⊢ map (↑g) (m • (↑C b * X ^ (n + 1))) = m • map (↑g) (↑C b * X ^ (n + 1))
[PROOFSTEP]
rw [smul_mul', smul_C, smul_pow', smul_X, Polynomial.map_mul, map_C, Polynomial.map_pow, map_X, coe_fn_coe, g.map_smul,
  Polynomial.map_mul, map_C, Polynomial.map_pow, map_X, smul_mul', smul_C, smul_pow', smul_X, coe_fn_coe]
  -- porting note: added `.toRingHom`


[GOAL]
p : ℕ → Prop
x : ℕ
h : p x
⊢ WellFounded (Upto.GT p)
[PROOFSTEP]
suffices Upto.GT p = InvImage (· < ·) fun y : Nat.Upto p => x - y.val
  by
  rw [this]
  exact (measure _).wf
[GOAL]
p : ℕ → Prop
x : ℕ
h : p x
this : Upto.GT p = InvImage (fun x x_1 => x < x_1) fun y => x - ↑y
⊢ WellFounded (Upto.GT p)
[PROOFSTEP]
rw [this]
[GOAL]
p : ℕ → Prop
x : ℕ
h : p x
this : Upto.GT p = InvImage (fun x x_1 => x < x_1) fun y => x - ↑y
⊢ WellFounded (InvImage (fun x x_1 => x < x_1) fun y => x - ↑y)
[PROOFSTEP]
exact (measure _).wf
[GOAL]
p : ℕ → Prop
x : ℕ
h : p x
⊢ Upto.GT p = InvImage (fun x x_1 => x < x_1) fun y => x - ↑y
[PROOFSTEP]
ext ⟨a, ha⟩ ⟨b, _⟩
[GOAL]
case h.mk.h.mk.a
p : ℕ → Prop
x : ℕ
h : p x
a : ℕ
ha : ∀ (j : ℕ), j < a → ¬p j
b : ℕ
property✝ : ∀ (j : ℕ), j < b → ¬p j
⊢ Upto.GT p { val := a, property := ha } { val := b, property := property✝ } ↔
    InvImage (fun x x_1 => x < x_1) (fun y => x - ↑y) { val := a, property := ha } { val := b, property := property✝ }
[PROOFSTEP]
dsimp [InvImage, Upto.GT]
[GOAL]
case h.mk.h.mk.a
p : ℕ → Prop
x : ℕ
h : p x
a : ℕ
ha : ∀ (j : ℕ), j < a → ¬p j
b : ℕ
property✝ : ∀ (j : ℕ), j < b → ¬p j
⊢ a > b ↔ x - a < x - b
[PROOFSTEP]
rw [tsub_lt_tsub_iff_left_of_le (le_of_not_lt fun h' => ha _ h' h)]
[GOAL]
p : ℕ → Prop
x : Upto p
h : ¬p ↑x
j : ℕ
h' : j < Nat.succ ↑x
⊢ ¬p j
[PROOFSTEP]
rcases Nat.lt_succ_iff_lt_or_eq.1 h' with (h' | rfl) <;> [exact x.2 _ h'; exact h]
[GOAL]
p : ℕ → Prop
x : Upto p
h : ¬p ↑x
j : ℕ
h' : j < Nat.succ ↑x
⊢ ¬p j
[PROOFSTEP]
rcases Nat.lt_succ_iff_lt_or_eq.1 h' with (h' | rfl)
[GOAL]
case inl
p : ℕ → Prop
x : Upto p
h : ¬p ↑x
j : ℕ
h'✝ : j < Nat.succ ↑x
h' : j < ↑x
⊢ ¬p j
[PROOFSTEP]
exact x.2 _ h'
[GOAL]
case inr
p : ℕ → Prop
x : Upto p
h : ¬p ↑x
h' : ↑x < Nat.succ ↑x
⊢ ¬p ↑x
[PROOFSTEP]
exact h


[GOAL]
ι : Type u_1
A : ι → Type u_2
inst✝¹ : AddMonoid ι
inst✝ : GMonoid A
i : ι
a : A i
n : ℕ
⊢ mk i a ^ n = mk (n • i) (GMonoid.gnpow n a)
[PROOFSTEP]
match n with
| 0 =>
  rw [pow_zero]
  exact (GMonoid.gnpow_zero' ⟨_, a⟩).symm
| n + 1 =>
  rw [pow_succ, mk_pow a n, mk_mul_mk]
  exact (GMonoid.gnpow_succ' n ⟨_, a⟩).symm
[GOAL]
ι : Type u_1
A : ι → Type u_2
inst✝¹ : AddMonoid ι
inst✝ : GMonoid A
i : ι
a : A i
n : ℕ
⊢ mk i a ^ 0 = mk (0 • i) (GMonoid.gnpow 0 a)
[PROOFSTEP]
rw [pow_zero]
[GOAL]
ι : Type u_1
A : ι → Type u_2
inst✝¹ : AddMonoid ι
inst✝ : GMonoid A
i : ι
a : A i
n : ℕ
⊢ 1 = mk (0 • i) (GMonoid.gnpow 0 a)
[PROOFSTEP]
exact (GMonoid.gnpow_zero' ⟨_, a⟩).symm
[GOAL]
ι : Type u_1
A : ι → Type u_2
inst✝¹ : AddMonoid ι
inst✝ : GMonoid A
i : ι
a : A i
n✝ n : ℕ
⊢ mk i a ^ (n + 1) = mk ((n + 1) • i) (GMonoid.gnpow (n + 1) a)
[PROOFSTEP]
rw [pow_succ, mk_pow a n, mk_mul_mk]
[GOAL]
ι : Type u_1
A : ι → Type u_2
inst✝¹ : AddMonoid ι
inst✝ : GMonoid A
i : ι
a : A i
n✝ n : ℕ
⊢ mk (i + n • i) (GMul.mul a (GMonoid.gnpow n a)) = mk ((n + 1) • i) (GMonoid.gnpow (n + 1) a)
[PROOFSTEP]
exact (GMonoid.gnpow_succ' n ⟨_, a⟩).symm
[GOAL]
ι : Type u_1
α : Type u_2
A : ι → Type u_3
inst✝¹ : AddMonoid ι
inst✝ : GradedMonoid.GMonoid A
l : List α
fι : α → ι
⊢ dProdIndex l fι = sum (map fι l)
[PROOFSTEP]
match l with
| [] => simp
| head :: tail => simp [List.dProdIndex_eq_map_sum tail fι]
[GOAL]
ι : Type u_1
α : Type u_2
A : ι → Type u_3
inst✝¹ : AddMonoid ι
inst✝ : GradedMonoid.GMonoid A
l : List α
fι : α → ι
⊢ dProdIndex [] fι = sum (map fι [])
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α : Type u_2
A : ι → Type u_3
inst✝¹ : AddMonoid ι
inst✝ : GradedMonoid.GMonoid A
l : List α
fι : α → ι
head : α
tail : List α
⊢ dProdIndex (head :: tail) fι = sum (map fι (head :: tail))
[PROOFSTEP]
simp [List.dProdIndex_eq_map_sum tail fι]
[GOAL]
ι : Type u_1
α : Type u_2
A : ι → Type u_3
inst✝¹ : AddMonoid ι
inst✝ : GMonoid A
l : List α
fι : α → ι
fA : (a : α) → A (fι a)
⊢ mk (List.dProdIndex l fι) (List.dProd l fι fA) = List.prod (List.map (fun a => mk (fι a) (fA a)) l)
[PROOFSTEP]
match l with
| [] => simp; rfl
| head :: tail => simp [← GradedMonoid.mk_list_dProd tail _ _, GradedMonoid.mk_mul_mk, List.prod_cons]
[GOAL]
ι : Type u_1
α : Type u_2
A : ι → Type u_3
inst✝¹ : AddMonoid ι
inst✝ : GMonoid A
l : List α
fι : α → ι
fA : (a : α) → A (fι a)
⊢ mk (List.dProdIndex [] fι) (List.dProd [] fι fA) = List.prod (List.map (fun a => mk (fι a) (fA a)) [])
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α : Type u_2
A : ι → Type u_3
inst✝¹ : AddMonoid ι
inst✝ : GMonoid A
l : List α
fι : α → ι
fA : (a : α) → A (fι a)
⊢ mk 0 GOne.one = 1
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
α : Type u_2
A : ι → Type u_3
inst✝¹ : AddMonoid ι
inst✝ : GMonoid A
l : List α
fι : α → ι
fA : (a : α) → A (fι a)
head : α
tail : List α
⊢ mk (List.dProdIndex (head :: tail) fι) (List.dProd (head :: tail) fι fA) =
    List.prod (List.map (fun a => mk (fι a) (fA a)) (head :: tail))
[PROOFSTEP]
simp [← GradedMonoid.mk_list_dProd tail _ _, GradedMonoid.mk_mul_mk, List.prod_cons]
[GOAL]
ι : Type u_1
α : Type u_2
A : ι → Type u_3
inst✝¹ : AddMonoid ι
inst✝ : GMonoid A
l : List α
f : α → GradedMonoid A
⊢ List.prod (List.map f l) =
    mk (List.dProdIndex l fun i => (f i).fst) (List.dProd l (fun i => (f i).fst) fun i => (f i).snd)
[PROOFSTEP]
rw [GradedMonoid.mk_list_dProd, GradedMonoid.mk]
[GOAL]
ι : Type u_1
α : Type u_2
A : ι → Type u_3
inst✝¹ : AddMonoid ι
inst✝ : GMonoid A
l : List α
f : α → GradedMonoid A
⊢ List.prod (List.map f l) = List.prod (List.map (fun a => { fst := (f a).fst, snd := (f a).snd }) l)
[PROOFSTEP]
simp_rw [Sigma.eta]
[GOAL]
ι : Type u_1
α : Type u_2
A : ι → Type u_3
inst✝¹ : AddMonoid ι
inst✝ : GMonoid A
n : ℕ
f : Fin n → GradedMonoid A
⊢ List.prod (List.ofFn f) =
    mk (List.dProdIndex (List.finRange n) fun i => (f i).fst)
      (List.dProd (List.finRange n) (fun i => (f i).fst) fun i => (f i).snd)
[PROOFSTEP]
rw [List.ofFn_eq_map, GradedMonoid.list_prod_map_eq_dProd]
[GOAL]
ι : Type u_1
R : Type u_2
α : Type u_3
inst✝¹ : AddMonoid ι
inst✝ : Monoid R
l : List α
fι : α → ι
fA : α → R
⊢ dProd l fι fA = prod (map fA l)
[PROOFSTEP]
match l with
| [] =>
  rw [List.dProd_nil, List.map_nil, List.prod_nil]
  rfl
| head :: tail =>
  rw [List.dProd_cons, List.map_cons, List.prod_cons, List.dProd_monoid tail _ _]
  rfl
[GOAL]
ι : Type u_1
R : Type u_2
α : Type u_3
inst✝¹ : AddMonoid ι
inst✝ : Monoid R
l : List α
fι : α → ι
fA : α → R
⊢ dProd [] fι fA = prod (map fA [])
[PROOFSTEP]
rw [List.dProd_nil, List.map_nil, List.prod_nil]
[GOAL]
ι : Type u_1
R : Type u_2
α : Type u_3
inst✝¹ : AddMonoid ι
inst✝ : Monoid R
l : List α
fι : α → ι
fA : α → R
⊢ GradedMonoid.GOne.one = 1
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
R : Type u_2
α : Type u_3
inst✝¹ : AddMonoid ι
inst✝ : Monoid R
l : List α
fι : α → ι
fA : α → R
head : α
tail : List α
⊢ dProd (head :: tail) fι fA = prod (map fA (head :: tail))
[PROOFSTEP]
rw [List.dProd_cons, List.map_cons, List.prod_cons, List.dProd_monoid tail _ _]
[GOAL]
ι : Type u_1
R : Type u_2
α : Type u_3
inst✝¹ : AddMonoid ι
inst✝ : Monoid R
l : List α
fι : α → ι
fA : α → R
head : α
tail : List α
⊢ GradedMonoid.GMul.mul (fA head) (prod (map fA tail)) = fA head * prod (map fA tail)
[PROOFSTEP]
rfl
[GOAL]
ι : 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
n : ℕ
r : R
i : ι
h : r ∈ A i
⊢ r ^ n ∈ A (n • i)
[PROOFSTEP]
match n with
| 0 =>
  rw [pow_zero, zero_nsmul]
  exact one_mem_graded _
| n + 1 =>
  rw [pow_succ', succ_nsmul']
  exact mul_mem_graded (pow_mem_graded n h) h
[GOAL]
ι : 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
n : ℕ
r : R
i : ι
h : r ∈ A i
⊢ r ^ 0 ∈ A (0 • i)
[PROOFSTEP]
rw [pow_zero, zero_nsmul]
[GOAL]
ι : 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
n : ℕ
r : R
i : ι
h : r ∈ A i
⊢ 1 ∈ A 0
[PROOFSTEP]
exact one_mem_graded _
[GOAL]
ι : 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
n✝ : ℕ
r : R
i : ι
h : r ∈ A i
n : ℕ
⊢ r ^ (n + 1) ∈ A ((n + 1) • i)
[PROOFSTEP]
rw [pow_succ', succ_nsmul']
[GOAL]
ι : 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
n✝ : ℕ
r : R
i : ι
h : r ∈ A i
n : ℕ
⊢ r ^ n * r ∈ A (n • i + i)
[PROOFSTEP]
exact mul_mem_graded (pow_mem_graded n h) h
[GOAL]
ι : 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 : ι'), j ∈ l → r j ∈ A (i j)
⊢ List.prod (List.map r l) ∈ A (List.sum (List.map i l))
[PROOFSTEP]
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)
[GOAL]
ι : 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 : ι'), j ∈ [] → r j ∈ A (i j)
⊢ List.prod (List.map r []) ∈ A (List.sum (List.map i []))
[PROOFSTEP]
rw [List.map_nil, List.map_nil, List.prod_nil, List.sum_nil]
[GOAL]
ι : 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 : ι'), j ∈ [] → r j ∈ A (i j)
⊢ 1 ∈ A 0
[PROOFSTEP]
exact one_mem_graded _
[GOAL]
ι : 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 : ι'), j ∈ head :: tail → r j ∈ A (i j)
⊢ List.prod (List.map r (head :: tail)) ∈ A (List.sum (List.map i (head :: tail)))
[PROOFSTEP]
rw [List.map_cons, List.map_cons, List.prod_cons, List.sum_cons]
[GOAL]
ι : 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 : ι'), j ∈ head :: tail → r j ∈ A (i j)
⊢ r head * List.prod (List.map r tail) ∈ A (i head + List.sum (List.map i tail))
[PROOFSTEP]
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)
[GOAL]
ι : 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
n : ℕ
i : Fin n → ι
r : Fin n → R
h : ∀ (j : Fin n), r j ∈ A (i j)
⊢ List.prod (List.ofFn r) ∈ A (List.sum (List.ofFn i))
[PROOFSTEP]
rw [List.ofFn_eq_map, List.ofFn_eq_map]
[GOAL]
ι : 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
n : ℕ
i : Fin n → ι
r : Fin n → R
h : ∀ (j : Fin n), r j ∈ A (i j)
⊢ List.prod (List.map r (List.finRange n)) ∈ A (List.sum (List.map i (List.finRange n)))
[PROOFSTEP]
exact list_prod_map_mem_graded _ _ _ fun _ _ => h _
[GOAL]
ι : Type u_1
R : Type u_2
α : Type u_3
S : Type u_4
inst✝³ : SetLike S R
inst✝² : Monoid R
inst✝¹ : AddMonoid ι
A : ι → S
inst✝ : GradedMonoid A
fι : α → ι
fA : (a : α) → { x // x ∈ A (fι a) }
l : List α
⊢ ↑(List.dProd l fι fA) = List.prod (List.map (fun a => ↑(fA a)) l)
[PROOFSTEP]
match l with
| [] => rw [List.dProd_nil, coe_gOne, List.map_nil, List.prod_nil]
| head :: tail => rw [List.dProd_cons, coe_gMul, List.map_cons, List.prod_cons, SetLike.coe_list_dProd _ _ _ tail]
[GOAL]
ι : Type u_1
R : Type u_2
α : Type u_3
S : Type u_4
inst✝³ : SetLike S R
inst✝² : Monoid R
inst✝¹ : AddMonoid ι
A : ι → S
inst✝ : GradedMonoid A
fι : α → ι
fA : (a : α) → { x // x ∈ A (fι a) }
l : List α
⊢ ↑(List.dProd [] fι fA) = List.prod (List.map (fun a => ↑(fA a)) [])
[PROOFSTEP]
rw [List.dProd_nil, coe_gOne, List.map_nil, List.prod_nil]
[GOAL]
ι : Type u_1
R : Type u_2
α : Type u_3
S : Type u_4
inst✝³ : SetLike S R
inst✝² : Monoid R
inst✝¹ : AddMonoid ι
A : ι → S
inst✝ : GradedMonoid A
fι : α → ι
fA : (a : α) → { x // x ∈ A (fι a) }
l : List α
head : α
tail : List α
⊢ ↑(List.dProd (head :: tail) fι fA) = List.prod (List.map (fun a => ↑(fA a)) (head :: tail))
[PROOFSTEP]
rw [List.dProd_cons, coe_gMul, List.map_cons, List.prod_cons, SetLike.coe_list_dProd _ _ _ tail]


[GOAL]
α : Type u_1
G : Type u_2
inst✝ : Group G
f : α → G
rels : Set (FreeGroup α)
h : ∀ (r : FreeGroup α), r ∈ rels → ↑(↑FreeGroup.lift f) r = 1
g : PresentedGroup rels →* G
hg : ∀ (x : α), ↑g (PresentedGroup.of x) = f x
⊢ ∀ {x : PresentedGroup rels}, ↑g x = ↑(toGroup h) x
[PROOFSTEP]
intro x
[GOAL]
α : Type u_1
G : Type u_2
inst✝ : Group G
f : α → G
rels : Set (FreeGroup α)
h : ∀ (r : FreeGroup α), r ∈ rels → ↑(↑FreeGroup.lift f) r = 1
g : PresentedGroup rels →* G
hg : ∀ (x : α), ↑g (PresentedGroup.of x) = f x
x : PresentedGroup rels
⊢ ↑g x = ↑(toGroup h) x
[PROOFSTEP]
refine' QuotientGroup.induction_on x _
[GOAL]
α : Type u_1
G : Type u_2
inst✝ : Group G
f : α → G
rels : Set (FreeGroup α)
h : ∀ (r : FreeGroup α), r ∈ rels → ↑(↑FreeGroup.lift f) r = 1
g : PresentedGroup rels →* G
hg : ∀ (x : α), ↑g (PresentedGroup.of x) = f x
x : PresentedGroup rels
⊢ ∀ (z : FreeGroup α), ↑g ↑z = ↑(toGroup h) ↑z
[PROOFSTEP]
exact fun _ ↦ FreeGroup.lift.unique (g.comp (QuotientGroup.mk' _)) hg


[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
⊢ ∀ (a b c : F ⟶ G), a + b + c = a + (b + c)
[PROOFSTEP]
intros
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
a✝ b✝ c✝ : F ⟶ G
⊢ a✝ + b✝ + c✝ = a✝ + (b✝ + c✝)
[PROOFSTEP]
ext
[GOAL]
case w.h
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
a✝ b✝ c✝ : F ⟶ G
x✝ : C
⊢ NatTrans.app (a✝ + b✝ + c✝) x✝ = NatTrans.app (a✝ + (b✝ + c✝)) x✝
[PROOFSTEP]
apply add_assoc
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
⊢ ∀ (a : F ⟶ G), 0 + a = a
[PROOFSTEP]
intros
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
a✝ : F ⟶ G
⊢ 0 + a✝ = a✝
[PROOFSTEP]
ext
[GOAL]
case w.h
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
a✝ : F ⟶ G
x✝ : C
⊢ NatTrans.app (0 + a✝) x✝ = NatTrans.app a✝ x✝
[PROOFSTEP]
apply zero_add
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
⊢ ∀ (a : F ⟶ G), a + 0 = a
[PROOFSTEP]
intros
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
a✝ : F ⟶ G
⊢ a✝ + 0 = a✝
[PROOFSTEP]
ext
[GOAL]
case w.h
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
a✝ : F ⟶ G
x✝ : C
⊢ NatTrans.app (a✝ + 0) x✝ = NatTrans.app a✝ x✝
[PROOFSTEP]
apply add_zero
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
⊢ ∀ (a b : F ⟶ G), a - b = a + -b
[PROOFSTEP]
intros
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
a✝ b✝ : F ⟶ G
⊢ a✝ - b✝ = a✝ + -b✝
[PROOFSTEP]
ext
[GOAL]
case w.h
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
a✝ b✝ : F ⟶ G
x✝ : C
⊢ NatTrans.app (a✝ - b✝) x✝ = NatTrans.app (a✝ + -b✝) x✝
[PROOFSTEP]
apply sub_eq_add_neg
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
⊢ ∀ (a : F ⟶ G), -a + a = 0
[PROOFSTEP]
intros
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
a✝ : F ⟶ G
⊢ -a✝ + a✝ = 0
[PROOFSTEP]
ext
[GOAL]
case w.h
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
a✝ : F ⟶ G
x✝ : C
⊢ NatTrans.app (-a✝ + a✝) x✝ = NatTrans.app 0 x✝
[PROOFSTEP]
apply add_left_neg
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
⊢ ∀ (a b : F ⟶ G), a + b = b + a
[PROOFSTEP]
intros
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
a✝ b✝ : F ⟶ G
⊢ a✝ + b✝ = b✝ + a✝
[PROOFSTEP]
ext
[GOAL]
case w.h
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
a✝ b✝ : F ⟶ G
x✝ : C
⊢ NatTrans.app (a✝ + b✝) x✝ = NatTrans.app (b✝ + a✝) x✝
[PROOFSTEP]
apply add_comm
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
⊢ ∀ (P Q R : C ⥤ D) (f f' : P ⟶ Q) (g : Q ⟶ R), (f + f') ≫ g = f ≫ g + f' ≫ g
[PROOFSTEP]
intros
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
P✝ Q✝ R✝ : C ⥤ D
f✝ f'✝ : P✝ ⟶ Q✝
g✝ : Q✝ ⟶ R✝
⊢ (f✝ + f'✝) ≫ g✝ = f✝ ≫ g✝ + f'✝ ≫ g✝
[PROOFSTEP]
ext
[GOAL]
case w.h
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
P✝ Q✝ R✝ : C ⥤ D
f✝ f'✝ : P✝ ⟶ Q✝
g✝ : Q✝ ⟶ R✝
x✝ : C
⊢ NatTrans.app ((f✝ + f'✝) ≫ g✝) x✝ = NatTrans.app (f✝ ≫ g✝ + f'✝ ≫ g✝) x✝
[PROOFSTEP]
apply add_comp
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
⊢ ∀ (P Q R : C ⥤ D) (f : P ⟶ Q) (g g' : Q ⟶ R), f ≫ (g + g') = f ≫ g + f ≫ g'
[PROOFSTEP]
intros
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
P✝ Q✝ R✝ : C ⥤ D
f✝ : P✝ ⟶ Q✝
g✝ g'✝ : Q✝ ⟶ R✝
⊢ f✝ ≫ (g✝ + g'✝) = f✝ ≫ g✝ + f✝ ≫ g'✝
[PROOFSTEP]
ext
[GOAL]
case w.h
C : Type u_1
D : Type u_2
inst✝² : Category.{?u.38, u_1} C
inst✝¹ : Category.{?u.42, u_2} D
inst✝ : Preadditive D
P✝ Q✝ R✝ : C ⥤ D
f✝ : P✝ ⟶ Q✝
g✝ g'✝ : Q✝ ⟶ R✝
x✝ : C
⊢ NatTrans.app (f✝ ≫ (g✝ + g'✝)) x✝ = NatTrans.app (f✝ ≫ g✝ + f✝ ≫ g'✝) x✝
[PROOFSTEP]
apply comp_add
[GOAL]
C : Type u_1
D : Type u_2
inst✝² : Category.{u_5, u_1} C
inst✝¹ : Category.{u_4, u_2} D
inst✝ : Preadditive D
F G : C ⥤ D
ι : Type u_3
s : Finset ι
X : C
α : ι → (F ⟶ G)
⊢ app (∑ i in s, α i) X = ∑ i in s, app (α i) X
[PROOFSTEP]
simp only [← appHom_apply, map_sum]


[GOAL]
n a b n' a' b' : ℕ
H : IsFibAux n a b
hn : 2 * n = n'
h1 : a * (2 * b - a) = a'
h2 : a * a + b * b = b'
⊢ fib n' = a'
[PROOFSTEP]
rw [← hn, fib_two_mul, H.1, H.2, ← h1]
[GOAL]
n a b n' a' b' : ℕ
H : IsFibAux n a b
hn : 2 * n = n'
h1 : a * (2 * b - a) = a'
h2 : a * a + b * b = b'
⊢ fib (n' + 1) = b'
[PROOFSTEP]
rw [← hn, fib_two_mul_add_one, H.1, H.2, pow_two, pow_two, add_comm, h2]
[GOAL]
n a b n' a' b' : ℕ
H : IsFibAux n a b
hn : 2 * n + 1 = n'
h1 : a * a + b * b = a'
h2 : b * (2 * a + b) = b'
⊢ fib n' = a'
[PROOFSTEP]
rw [← hn, fib_two_mul_add_one, H.1, H.2, pow_two, pow_two, add_comm, h1]
[GOAL]
n a b n' a' b' : ℕ
H : IsFibAux n a b
hn : 2 * n + 1 = n'
h1 : a * a + b * b = a'
h2 : b * (2 * a + b) = b'
⊢ fib (n' + 1) = b'
[PROOFSTEP]
rw [← hn, fib_two_mul_add_two, H.1, H.2, h2]