[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : AddGroup A
s : Set G
hs : IsSubgroup s
x y : G
hx : x ∈ s
hy : y ∈ s
⊢ x / y ∈ s
[PROOFSTEP]
simpa only [div_eq_mul_inv] using hs.mul_mem hx (hs.inv_mem hy)
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : AddGroup A
s : Set G
⊢ IsAddSubgroup s → IsSubgroup s
[PROOFSTEP]
rintro ⟨⟨h₁, h₂⟩, h₃⟩
[GOAL]
case mk.mk
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : AddGroup A
s : Set G
h₃ : ∀ {a : Additive G}, a ∈ s → -a ∈ s
h₁ : 0 ∈ s
h₂ : ∀ {a b : Additive G}, a ∈ s → b ∈ s → a + b ∈ s
⊢ IsSubgroup s
[PROOFSTEP]
exact @IsSubgroup.mk G _ _ ⟨h₁, @h₂⟩ @h₃
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : AddGroup A
s : Set A
⊢ IsSubgroup s → IsAddSubgroup s
[PROOFSTEP]
rintro ⟨⟨h₁, h₂⟩, h₃⟩
[GOAL]
case mk.mk
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : AddGroup A
s : Set A
h₃ : ∀ {a : Multiplicative A}, a ∈ s → a⁻¹ ∈ s
h₁ : 1 ∈ s
h₂ : ∀ {a b : Multiplicative A}, a ∈ s → b ∈ s → a * b ∈ s
⊢ IsAddSubgroup s
[PROOFSTEP]
exact @IsAddSubgroup.mk A _ _ ⟨h₁, @h₂⟩ @h₃
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : AddGroup A
s : Set G
one_mem : 1 ∈ s
div_mem : ∀ {a b : G}, a ∈ s → b ∈ s → a * b⁻¹ ∈ s
a : G
ha : a ∈ s
⊢ a⁻¹ ∈ s
[PROOFSTEP]
have : 1 * a⁻¹ ∈ s := div_mem one_mem ha
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : AddGroup A
s : Set G
one_mem : 1 ∈ s
div_mem : ∀ {a b : G}, a ∈ s → b ∈ s → a * b⁻¹ ∈ s
a : G
ha : a ∈ s
this : 1 * a⁻¹ ∈ s
⊢ a⁻¹ ∈ s
[PROOFSTEP]
convert this using 1
[GOAL]
case h.e'_4
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : AddGroup A
s : Set G
one_mem : 1 ∈ s
div_mem : ∀ {a b : G}, a ∈ s → b ∈ s → a * b⁻¹ ∈ s
a : G
ha : a ∈ s
this : 1 * a⁻¹ ∈ s
⊢ a⁻¹ = 1 * a⁻¹
[PROOFSTEP]
rw [one_mul]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : AddGroup A
s : Set G
one_mem : 1 ∈ s
div_mem : ∀ {a b : G}, a ∈ s → b ∈ s → a * b⁻¹ ∈ s
inv_mem : ∀ (a : G), a ∈ s → a⁻¹ ∈ s
a b : G
ha : a ∈ s
hb : b ∈ s
⊢ a * b ∈ s
[PROOFSTEP]
have : a * b⁻¹⁻¹ ∈ s := div_mem ha (inv_mem b hb)
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : AddGroup A
s : Set G
one_mem : 1 ∈ s
div_mem : ∀ {a b : G}, a ∈ s → b ∈ s → a * b⁻¹ ∈ s
inv_mem : ∀ (a : G), a ∈ s → a⁻¹ ∈ s
a b : G
ha : a ∈ s
hb : b ∈ s
this : a * b⁻¹⁻¹ ∈ s
⊢ a * b ∈ s
[PROOFSTEP]
convert this
[GOAL]
case h.e'_4.h.e'_6
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : AddGroup A
s : Set G
one_mem : 1 ∈ s
div_mem : ∀ {a b : G}, a ∈ s → b ∈ s → a * b⁻¹ ∈ s
inv_mem : ∀ (a : G), a ∈ s → a⁻¹ ∈ s
a b : G
ha : a ∈ s
hb : b ∈ s
this : a * b⁻¹⁻¹ ∈ s
⊢ b = b⁻¹⁻¹
[PROOFSTEP]
rw [inv_inv]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : AddGroup A
s : Set A
zero_mem : 0 ∈ s
sub_mem : ∀ {a b : A}, a ∈ s → b ∈ s → a - b ∈ s
x y : A
hx : x ∈ s
hy : y ∈ s
⊢ x + -y ∈ s
[PROOFSTEP]
simpa only [sub_eq_add_neg] using sub_mem hx hy
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
s : Set G
hs : IsSubgroup s
h : a⁻¹ ∈ s
⊢ a ∈ s
[PROOFSTEP]
simpa using hs.inv_mem h
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
s : Set G
hs : IsSubgroup s
h : a ∈ s
hba : b * a ∈ s
⊢ b ∈ s
[PROOFSTEP]
simpa using hs.mul_mem hba (hs.inv_mem h)
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
s : Set G
hs : IsSubgroup s
h : a ∈ s
hab : a * b ∈ s
⊢ b ∈ s
[PROOFSTEP]
simpa using hs.mul_mem (hs.inv_mem h) hab
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : CommGroup G
s : Set G
hs : IsSubgroup s
n : G
hn : n ∈ s
g : G
⊢ g * n * g⁻¹ ∈ s
[PROOFSTEP]
rwa [mul_right_comm, mul_right_inv, one_mul]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
s : Set G
⊢ IsNormalAddSubgroup s → IsNormalSubgroup s
[PROOFSTEP]
rintro ⟨h₁, h₂⟩
[GOAL]
case mk
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
s : Set G
h₁ : IsAddSubgroup s
h₂ : ∀ (n : Additive G), n ∈ s → ∀ (g : Additive G), g + n + -g ∈ s
⊢ IsNormalSubgroup s
[PROOFSTEP]
exact @IsNormalSubgroup.mk G _ _ (Additive.isAddSubgroup_iff.1 h₁) @h₂
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : AddGroup A
s : Set A
⊢ IsNormalSubgroup s → IsNormalAddSubgroup s
[PROOFSTEP]
rintro ⟨h₁, h₂⟩
[GOAL]
case mk
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : AddGroup A
s : Set A
h₁ : IsSubgroup s
h₂ : ∀ (n : Multiplicative A), n ∈ s → ∀ (g : Multiplicative A), g * n * g⁻¹ ∈ s
⊢ IsNormalAddSubgroup s
[PROOFSTEP]
exact @IsNormalAddSubgroup.mk A _ _ (Multiplicative.isSubgroup_iff.1 h₁) @h₂
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝ : Group G
s : Set G
hs : IsNormalSubgroup s
a b : G
hab : a * b ∈ s
⊢ b * a ∈ s
[PROOFSTEP]
have h : a⁻¹ * (a * b) * a⁻¹⁻¹ ∈ s := hs.normal (a * b) hab a⁻¹
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝ : Group G
s : Set G
hs : IsNormalSubgroup s
a b : G
hab : a * b ∈ s
h : a⁻¹ * (a * b) * a⁻¹⁻¹ ∈ s
⊢ b * a ∈ s
[PROOFSTEP]
simp at h
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝ : Group G
s : Set G
hs : IsNormalSubgroup s
a b : G
hab : a * b ∈ s
h : b * a ∈ s
⊢ b * a ∈ s
[PROOFSTEP]
exact h
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
⊢ IsNormalSubgroup (trivial G)
[PROOFSTEP]
refine' { .. }
[GOAL]
case refine'_1
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
⊢ 1 ∈ trivial G
[PROOFSTEP]
simp (config := { contextual := true }) [trivial]
[GOAL]
case refine'_2
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
⊢ ∀ {a b : G}, a ∈ trivial G → b ∈ trivial G → a * b ∈ trivial G
[PROOFSTEP]
simp (config := { contextual := true }) [trivial]
[GOAL]
case refine'_3
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
⊢ ∀ {a : G}, a ∈ trivial G → a⁻¹ ∈ trivial G
[PROOFSTEP]
simp (config := { contextual := true }) [trivial]
[GOAL]
case refine'_4
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
⊢ ∀ (n : G), n ∈ trivial G → ∀ (g : G), g * n * g⁻¹ ∈ trivial G
[PROOFSTEP]
simp (config := { contextual := true }) [trivial]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
s : Set G
hs : IsSubgroup s
⊢ s = trivial G ↔ ∀ (x : G), x ∈ s → x = 1
[PROOFSTEP]
simp only [Set.ext_iff, IsSubgroup.mem_trivial]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
s : Set G
hs : IsSubgroup s
⊢ (∀ (x : G), x ∈ s ↔ x = 1) ↔ ∀ (x : G), x ∈ s → x = 1
[PROOFSTEP]
exact ⟨fun h x => (h x).1, fun h x => ⟨h x, fun hx => hx.symm ▸ hs.toIsSubmonoid.one_mem⟩⟩
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
⊢ IsNormalSubgroup univ
[PROOFSTEP]
refine' { .. }
[GOAL]
case refine'_1
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
⊢ 1 ∈ univ
[PROOFSTEP]
simp
[GOAL]
case refine'_2
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
⊢ ∀ {a b : G}, a ∈ univ → b ∈ univ → a * b ∈ univ
[PROOFSTEP]
simp
[GOAL]
case refine'_3
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
⊢ ∀ {a : G}, a ∈ univ → a⁻¹ ∈ univ
[PROOFSTEP]
simp
[GOAL]
case refine'_4
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
⊢ ∀ (n : G), n ∈ univ → ∀ (g : G), g * n * g⁻¹ ∈ univ
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
⊢ 1 ∈ center G
[PROOFSTEP]
simp [center]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
a✝ b✝ : G
ha : a✝ ∈ center G
hb : b✝ ∈ center G
g : G
⊢ g * (a✝ * b✝) = a✝ * b✝ * g
[PROOFSTEP]
rw [← mul_assoc, mem_center.2 ha g, mul_assoc, mem_center.2 hb g, ← mul_assoc]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
inst✝ : Group G
a : G
ha : a ∈ center G
g : G
⊢ g * a⁻¹ = a⁻¹ * (g * a) * a⁻¹
[PROOFSTEP]
simp [ha g]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
inst✝ : Group G
a : G
ha : a ∈ center G
g : G
⊢ a⁻¹ * (g * a) * a⁻¹ = a⁻¹ * g
[PROOFSTEP]
rw [← mul_assoc, mul_assoc]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
inst✝ : Group G
a : G
ha : a ∈ center G
g : G
⊢ a⁻¹ * g * (a * a⁻¹) = a⁻¹ * g
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
n : G
ha : n ∈ center G
g h : G
⊢ h * (g * n * g⁻¹) = h * n
[PROOFSTEP]
simp [ha g, mul_assoc]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
n : G
ha : n ∈ center G
g h : G
⊢ h * n = g * g⁻¹ * n * h
[PROOFSTEP]
rw [ha h]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
n : G
ha : n ∈ center G
g h : G
⊢ n * h = g * g⁻¹ * n * h
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
n : G
ha : n ∈ center G
g h : G
⊢ g * g⁻¹ * n * h = g * n * g⁻¹ * h
[PROOFSTEP]
rw [mul_assoc g, ha g⁻¹, ← mul_assoc]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
s : Set G
⊢ 1 ∈ normalizer s
[PROOFSTEP]
simp [normalizer]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝ : Group G
s : Set G
a b : G
ha : ∀ (n : G), n ∈ s ↔ a * n * a⁻¹ ∈ s
hb : ∀ (n : G), n ∈ s ↔ b * n * b⁻¹ ∈ s
n : G
⊢ n ∈ s ↔ a * b * n * (a * b)⁻¹ ∈ s
[PROOFSTEP]
rw [mul_inv_rev, ← mul_assoc, mul_assoc a, mul_assoc a, ← ha, ← hb]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
inst✝ : Group G
s : Set G
a : G
ha : ∀ (n : G), n ∈ s ↔ a * n * a⁻¹ ∈ s
n : G
⊢ n ∈ s ↔ a⁻¹ * n * a⁻¹⁻¹ ∈ s
[PROOFSTEP]
rw [ha (a⁻¹ * n * a⁻¹⁻¹)]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
inst✝ : Group G
s : Set G
a : G
ha : ∀ (n : G), n ∈ s ↔ a * n * a⁻¹ ∈ s
n : G
⊢ n ∈ s ↔ a * (a⁻¹ * n * a⁻¹⁻¹) * a⁻¹ ∈ s
[PROOFSTEP]
simp [mul_assoc]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
s : Set G
hs : IsSubgroup s
g : G
hg : g ∈ s
n : G
⊢ n ∈ s ↔ g * n * g⁻¹ ∈ s
[PROOFSTEP]
rw [IsSubgroup.mul_mem_cancel_right hs ((IsSubgroup.inv_mem_iff hs).2 hg), IsSubgroup.mul_mem_cancel_left hs hg]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
h : f (a * b⁻¹) = 1
⊢ f a = f b
[PROOFSTEP]
rw [hf.map_mul, hf.map_inv] at h
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
h : f a * (f b)⁻¹ = 1
⊢ f a = f b
[PROOFSTEP]
rw [← inv_inv (f b), eq_inv_of_mul_eq_one_left h]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
h : f (a⁻¹ * b) = 1
⊢ f a = f b
[PROOFSTEP]
rw [hf.map_mul, hf.map_inv] at h
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
h : (f a)⁻¹ * f b = 1
⊢ f a = f b
[PROOFSTEP]
apply inv_injective
[GOAL]
case a
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
h : (f a)⁻¹ * f b = 1
⊢ (f a)⁻¹ = (f b)⁻¹
[PROOFSTEP]
rw [eq_inv_of_mul_eq_one_left h]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
h : f a = f b
⊢ f (a * b⁻¹) = 1
[PROOFSTEP]
have : f a * (f b)⁻¹ = 1 := by rw [h, mul_right_inv]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
h : f a = f b
⊢ f a * (f b)⁻¹ = 1
[PROOFSTEP]
rw [h, mul_right_inv]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
h : f a = f b
this : f a * (f b)⁻¹ = 1
⊢ f (a * b⁻¹) = 1
[PROOFSTEP]
rwa [← hf.map_inv, ← hf.map_mul] at this
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
h : f a = f b
⊢ f (a⁻¹ * b) = 1
[PROOFSTEP]
have : (f a)⁻¹ * f b = 1 := by rw [h, mul_left_inv]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
h : f a = f b
⊢ (f a)⁻¹ * f b = 1
[PROOFSTEP]
rw [h, mul_left_inv]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
h : f a = f b
this : (f a)⁻¹ * f b = 1
⊢ f (a⁻¹ * b) = 1
[PROOFSTEP]
rwa [← hf.map_inv, ← hf.map_mul] at this
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
⊢ f a = f b ↔ a * b⁻¹ ∈ ker f
[PROOFSTEP]
rw [mem_ker]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
⊢ f a = f b ↔ f (a * b⁻¹) = 1
[PROOFSTEP]
exact one_iff_ker_inv hf _ _
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
⊢ f a = f b ↔ a⁻¹ * b ∈ ker f
[PROOFSTEP]
rw [mem_ker]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a b : G
⊢ f a = f b ↔ f (a⁻¹ * b) = 1
[PROOFSTEP]
exact one_iff_ker_inv' hf _ _
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁✝ a₂✝ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
hs : IsSubgroup s
a₁ a₂ : H
x✝¹ : a₁ ∈ f '' s
x✝ : a₂ ∈ f '' s
b₁ : G
hb₁ : b₁ ∈ s
eq₁ : f b₁ = a₁
b₂ : G
hb₂ : b₂ ∈ s
eq₂ : f b₂ = a₂
⊢ f (b₁ * b₂) = a₁ * a₂
[PROOFSTEP]
simp [eq₁, eq₂, hf.map_mul]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
hs : IsSubgroup s
a : H
x✝ : a ∈ f '' s
b : G
hb : b ∈ s
Eq : f b = a
⊢ f b⁻¹ = a⁻¹
[PROOFSTEP]
rw [hf.map_inv]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b✝ c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
hs : IsSubgroup s
a : H
x✝ : a ∈ f '' s
b : G
hb : b ∈ s
Eq : f b = a
⊢ (f b)⁻¹ = a⁻¹
[PROOFSTEP]
simp [*]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set H
hs : IsSubgroup s
⊢ IsSubgroup (f ⁻¹' s)
[PROOFSTEP]
refine' { .. }
[GOAL]
case refine'_1
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set H
hs : IsSubgroup s
⊢ 1 ∈ f ⁻¹' s
[PROOFSTEP]
simp (config := { contextual := true }) [hs.one_mem, hs.mul_mem, hs.inv_mem, hf.map_mul, hf.map_one, hf.map_inv,
  InvMemClass.inv_mem]
[GOAL]
case refine'_2
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set H
hs : IsSubgroup s
⊢ ∀ {a b : G}, a ∈ f ⁻¹' s → b ∈ f ⁻¹' s → a * b ∈ f ⁻¹' s
[PROOFSTEP]
simp (config := { contextual := true }) [hs.one_mem, hs.mul_mem, hs.inv_mem, hf.map_mul, hf.map_one, hf.map_inv,
  InvMemClass.inv_mem]
[GOAL]
case refine'_3
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set H
hs : IsSubgroup s
⊢ ∀ {a : G}, a ∈ f ⁻¹' s → a⁻¹ ∈ f ⁻¹' s
[PROOFSTEP]
simp (config := { contextual := true }) [hs.one_mem, hs.mul_mem, hs.inv_mem, hf.map_mul, hf.map_one, hf.map_inv,
  InvMemClass.inv_mem]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set H
hs : IsNormalSubgroup s
⊢ 1 ∈ f ⁻¹' s
[PROOFSTEP]
simp [hf.map_one, hs.toIsSubgroup.one_mem]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set H
hs : IsNormalSubgroup s
⊢ ∀ {a b : G}, a ∈ f ⁻¹' s → b ∈ f ⁻¹' s → a * b ∈ f ⁻¹' s
[PROOFSTEP]
simp (config := { contextual := true }) [hf.map_mul, hs.toIsSubgroup.mul_mem]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set H
hs : IsNormalSubgroup s
⊢ ∀ {a : G}, a ∈ f ⁻¹' s → a⁻¹ ∈ f ⁻¹' s
[PROOFSTEP]
simp (config := { contextual := true }) [hf.map_inv, hs.toIsSubgroup.inv_mem]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set H
hs : IsNormalSubgroup s
⊢ ∀ (n : G), n ∈ f ⁻¹' s → ∀ (g : G), g * n * g⁻¹ ∈ f ⁻¹' s
[PROOFSTEP]
simp (config := { contextual := true }) [hs.normal, hf.map_mul, hf.map_inv]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
h : ker f = IsSubgroup.trivial G
⊢ Injective f
[PROOFSTEP]
intro a₁ a₂ hfa
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁✝ a₂✝ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
h : ker f = IsSubgroup.trivial G
a₁ a₂ : G
hfa : f a₁ = f a₂
⊢ a₁ = a₂
[PROOFSTEP]
simp [ext_iff, ker, IsSubgroup.trivial] at h
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁✝ a₂✝ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a₁ a₂ : G
hfa : f a₁ = f a₂
h : ∀ (x : G), f x = 1 ↔ x = 1
⊢ a₁ = a₂
[PROOFSTEP]
have ha : a₁ * a₂⁻¹ = 1 := by rw [← h]; exact hf.inv_ker_one hfa
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁✝ a₂✝ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a₁ a₂ : G
hfa : f a₁ = f a₂
h : ∀ (x : G), f x = 1 ↔ x = 1
⊢ a₁ * a₂⁻¹ = 1
[PROOFSTEP]
rw [← h]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁✝ a₂✝ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a₁ a₂ : G
hfa : f a₁ = f a₂
h : ∀ (x : G), f x = 1 ↔ x = 1
⊢ f (a₁ * a₂⁻¹) = 1
[PROOFSTEP]
exact hf.inv_ker_one hfa
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁✝ a₂✝ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
a₁ a₂ : G
hfa : f a₁ = f a₂
h : ∀ (x : G), f x = 1 ↔ x = 1
ha : a₁ * a₂⁻¹ = 1
⊢ a₁ = a₂
[PROOFSTEP]
rw [eq_inv_of_mul_eq_one_left ha, inv_inv a₂]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
h : Injective f
x : G
hx : x ∈ ker f
⊢ x ∈ IsSubgroup.trivial G
[PROOFSTEP]
suffices f x = f 1 by simpa using h this
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
h : Injective f
x : G
hx : x ∈ ker f
this : f x = f 1
⊢ x ∈ IsSubgroup.trivial G
[PROOFSTEP]
simpa using h this
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
h : Injective f
x : G
hx : x ∈ ker f
⊢ f x = f 1
[PROOFSTEP]
simp [hf.map_one]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
h : Injective f
x : G
hx : x ∈ ker f
⊢ f x = 1
[PROOFSTEP]
rwa [mem_ker] at hx
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
h : Injective f
x : G
⊢ x ∈ IsSubgroup.trivial G → x ∈ ker f
[PROOFSTEP]
simp (config := { contextual := true }) [mem_ker, hf.map_one]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
⊢ ker f = IsSubgroup.trivial G ↔ ∀ (x : G), f x = 1 → x = 1
[PROOFSTEP]
rw [Set.ext_iff]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
⊢ (∀ (x : G), x ∈ ker f ↔ x ∈ IsSubgroup.trivial G) ↔ ∀ (x : G), f x = 1 → x = 1
[PROOFSTEP]
simp [ker]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
⊢ (∀ (x : G), f x = 1 ↔ x = 1) ↔ ∀ (x : G), f x = 1 → x = 1
[PROOFSTEP]
exact ⟨fun h x hx => (h x).1 hx, fun h x => ⟨h x, fun hx => by rw [hx, hf.map_one]⟩⟩
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
h : ∀ (x : G), f x = 1 → x = 1
x : G
hx : x = 1
⊢ f x = 1
[PROOFSTEP]
rw [hx, hf.map_one]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
inst✝ : Group G
s✝ s t : Set G
ht : IsSubgroup t
h : s ⊆ t
a : G
ha : a ∈ closure s
⊢ a ∈ t
[PROOFSTEP]
induction ha
[GOAL]
case basic
G : Type u_1
H : Type u_2
A : Type u_3
a✝² a₁ a₂ b c : G
inst✝ : Group G
s✝ s t : Set G
ht : IsSubgroup t
h : s ⊆ t
a a✝¹ : G
a✝ : a✝¹ ∈ s
⊢ a✝¹ ∈ t
[PROOFSTEP]
simp [h _, *, ht.one_mem, ht.mul_mem, IsSubgroup.inv_mem_iff]
[GOAL]
case one
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
inst✝ : Group G
s✝ s t : Set G
ht : IsSubgroup t
h : s ⊆ t
a : G
⊢ 1 ∈ t
[PROOFSTEP]
simp [h _, *, ht.one_mem, ht.mul_mem, IsSubgroup.inv_mem_iff]
[GOAL]
case inv
G : Type u_1
H : Type u_2
A : Type u_3
a✝² a₁ a₂ b c : G
inst✝ : Group G
s✝ s t : Set G
ht : IsSubgroup t
h : s ⊆ t
a a✝¹ : G
a✝ : InClosure s a✝¹
a_ih✝ : a✝¹ ∈ t
⊢ a✝¹⁻¹ ∈ t
[PROOFSTEP]
simp [h _, *, ht.one_mem, ht.mul_mem, IsSubgroup.inv_mem_iff]
[GOAL]
case mul
G : Type u_1
H : Type u_2
A : Type u_3
a✝³ a₁ a₂ b c : G
inst✝ : Group G
s✝ s t : Set G
ht : IsSubgroup t
h : s ⊆ t
a a✝² b✝ : G
a✝¹ : InClosure s a✝²
a✝ : InClosure s b✝
a_ih✝¹ : a✝² ∈ t
a_ih✝ : b✝ ∈ t
⊢ a✝² * b✝ ∈ t
[PROOFSTEP]
simp [h _, *, ht.one_mem, ht.mul_mem, IsSubgroup.inv_mem_iff]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
inst✝ : Group G
s✝ s : Set G
a : G
h : a ∈ closure s
x✝² : G
x✝¹ : InClosure s x✝²
x✝ : ∃ l, (∀ (x : G), x ∈ l → x ∈ s ∨ x⁻¹ ∈ s) ∧ List.prod l = x✝²
L : List G
HL1 : ∀ (x : G), x ∈ L → x ∈ s ∨ x⁻¹ ∈ s
HL2 : List.prod L = x✝²
x : G
hx : x ∈ List.map Inv.inv (List.reverse L)
y : G
hy1 : y ∈ List.reverse L
hy2 : y⁻¹ = x
⊢ y ∈ s → y⁻¹⁻¹ ∈ s
[PROOFSTEP]
rw [inv_inv]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
inst✝ : Group G
s✝ s : Set G
a : G
h : a ∈ closure s
x✝² : G
x✝¹ : InClosure s x✝²
x✝ : ∃ l, (∀ (x : G), x ∈ l → x ∈ s ∨ x⁻¹ ∈ s) ∧ List.prod l = x✝²
L : List G
HL1 : ∀ (x : G), x ∈ L → x ∈ s ∨ x⁻¹ ∈ s
HL2 : List.prod L = x✝²
x : G
hx : x ∈ List.map Inv.inv (List.reverse L)
y : G
hy1 : y ∈ List.reverse L
hy2 : y⁻¹ = x
⊢ y ∈ s → y ∈ s
[PROOFSTEP]
exact id
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
inst✝ : Group G
s✝ s : Set G
a : G
h : a ∈ closure s
x : G
x✝¹ : InClosure s x
x✝ : ∃ l, (∀ (x : G), x ∈ l → x ∈ s ∨ x⁻¹ ∈ s) ∧ List.prod l = x
L : List G
HL1 : ∀ (x : G), x ∈ L → x ∈ s ∨ x⁻¹ ∈ s
HL2 : List.prod L = x
hd : G
tl : List G
ih : List.prod (List.map Inv.inv (List.reverse tl)) = (List.prod tl)⁻¹
⊢ List.prod (List.map Inv.inv (List.reverse (hd :: tl))) = (List.prod (hd :: tl))⁻¹
[PROOFSTEP]
rw [List.reverse_cons, List.map_append, List.prod_append, ih, List.map_singleton, List.prod_cons, List.prod_nil,
  mul_one, List.prod_cons, mul_inv_rev]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
inst✝ : Group G
s✝ s : Set G
a : G
h : a ∈ closure s
x y : G
x✝³ : InClosure s x
x✝² : InClosure s y
x✝¹ : ∃ l, (∀ (x : G), x ∈ l → x ∈ s ∨ x⁻¹ ∈ s) ∧ List.prod l = x
x✝ : ∃ l, (∀ (x : G), x ∈ l → x ∈ s ∨ x⁻¹ ∈ s) ∧ List.prod l = y
L1 : List G
HL1 : ∀ (x : G), x ∈ L1 → x ∈ s ∨ x⁻¹ ∈ s
HL2 : List.prod L1 = x
L2 : List G
HL3 : ∀ (x : G), x ∈ L2 → x ∈ s ∨ x⁻¹ ∈ s
HL4 : List.prod L2 = y
⊢ List.prod (L1 ++ L2) = x * y
[PROOFSTEP]
rw [List.prod_append, HL2, HL4]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
⊢ f '' closure s ≤ closure (f '' s)
[PROOFSTEP]
rintro _ ⟨x, hx, rfl⟩
[GOAL]
case intro.intro
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
⊢ f x ∈ closure (f '' s)
[PROOFSTEP]
exact
  InClosure.recOn hx (by intros _ ha; exact subset_closure (mem_image_of_mem f ha))
    (by
      rw [hf.map_one]
      apply IsSubmonoid.one_mem (closure.isSubgroup _).toIsSubmonoid)
    (by
      intros _ _
      rw [hf.map_inv]
      apply IsSubgroup.inv_mem (closure.isSubgroup _))
    (by
      intros _ _ _ _ ha hb
      rw [hf.map_mul]
      exact (closure.isSubgroup (f '' s)).toIsSubmonoid.mul_mem ha hb)
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
⊢ ∀ {a : G}, a ∈ s → f a ∈ closure (f '' s)
[PROOFSTEP]
intros _ ha
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝ : G
ha : a✝ ∈ s
⊢ f a✝ ∈ closure (f '' s)
[PROOFSTEP]
exact subset_closure (mem_image_of_mem f ha)
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
⊢ f 1 ∈ closure (f '' s)
[PROOFSTEP]
rw [hf.map_one]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
⊢ 1 ∈ closure (f '' s)
[PROOFSTEP]
apply IsSubmonoid.one_mem (closure.isSubgroup _).toIsSubmonoid
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
⊢ ∀ {a : G}, InClosure s a → f a ∈ closure (f '' s) → f a⁻¹ ∈ closure (f '' s)
[PROOFSTEP]
intros _ _
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝¹ : G
a✝ : InClosure s a✝¹
⊢ f a✝¹ ∈ closure (f '' s) → f a✝¹⁻¹ ∈ closure (f '' s)
[PROOFSTEP]
rw [hf.map_inv]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝¹ : G
a✝ : InClosure s a✝¹
⊢ f a✝¹ ∈ closure (f '' s) → (f a✝¹)⁻¹ ∈ closure (f '' s)
[PROOFSTEP]
apply IsSubgroup.inv_mem (closure.isSubgroup _)
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
⊢ ∀ {a b : G},
    InClosure s a → InClosure s b → f a ∈ closure (f '' s) → f b ∈ closure (f '' s) → f (a * b) ∈ closure (f '' s)
[PROOFSTEP]
intros _ _ _ _ ha hb
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝² b✝ : G
a✝¹ : InClosure s a✝²
a✝ : InClosure s b✝
ha : f a✝² ∈ closure (f '' s)
hb : f b✝ ∈ closure (f '' s)
⊢ f (a✝² * b✝) ∈ closure (f '' s)
[PROOFSTEP]
rw [hf.map_mul]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝¹ : Group G
s✝ : Set G
inst✝ : Group H
f : G → H
hf : IsGroupHom f
s : Set G
x : G
hx : x ∈ closure s
a✝² b✝ : G
a✝¹ : InClosure s a✝²
a✝ : InClosure s b✝
ha : f a✝² ∈ closure (f '' s)
hb : f b✝ ∈ closure (f '' s)
⊢ f a✝² * f b✝ ∈ closure (f '' s)
[PROOFSTEP]
exact (closure.isSubgroup (f '' s)).toIsSubmonoid.mul_mem ha hb
[GOAL]
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
x : G
⊢ x ∈ closure (s ∪ t) ↔ ∃ y, y ∈ closure s ∧ ∃ z, z ∈ closure t ∧ y * z = x
[PROOFSTEP]
simp only [closure_eq_mclosure, Monoid.mem_closure_union_iff, exists_prop, preimage_union]
[GOAL]
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
x : G
⊢ (∃ y,
      (∃ y_1, y_1 ∈ Monoid.Closure s ∧ ∃ z, z ∈ Monoid.Closure t ∧ y_1 * z = y) ∧
        ∃ z,
          (∃ y, y ∈ Monoid.Closure (Inv.inv ⁻¹' s) ∧ ∃ z_1, z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t) ∧ y * z_1 = z) ∧
            y * z = x) ↔
    ∃ y,
      (∃ y_1, y_1 ∈ Monoid.Closure s ∧ ∃ z, z ∈ Monoid.Closure (Inv.inv ⁻¹' s) ∧ y_1 * z = y) ∧
        ∃ z, (∃ y, y ∈ Monoid.Closure t ∧ ∃ z_1, z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t) ∧ y * z_1 = z) ∧ y * z = x
[PROOFSTEP]
constructor
[GOAL]
case mp
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
x : G
⊢ (∃ y,
      (∃ y_1, y_1 ∈ Monoid.Closure s ∧ ∃ z, z ∈ Monoid.Closure t ∧ y_1 * z = y) ∧
        ∃ z,
          (∃ y, y ∈ Monoid.Closure (Inv.inv ⁻¹' s) ∧ ∃ z_1, z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t) ∧ y * z_1 = z) ∧
            y * z = x) →
    ∃ y,
      (∃ y_1, y_1 ∈ Monoid.Closure s ∧ ∃ z, z ∈ Monoid.Closure (Inv.inv ⁻¹' s) ∧ y_1 * z = y) ∧
        ∃ z, (∃ y, y ∈ Monoid.Closure t ∧ ∃ z_1, z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t) ∧ y * z_1 = z) ∧ y * z = x
[PROOFSTEP]
rintro ⟨_, ⟨ys, hys, yt, hyt, rfl⟩, _, ⟨zs, hzs, zt, hzt, rfl⟩, rfl⟩
[GOAL]
case mp.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
ys : G
hys : ys ∈ Monoid.Closure s
yt : G
hyt : yt ∈ Monoid.Closure t
zs : G
hzs : zs ∈ Monoid.Closure (Inv.inv ⁻¹' s)
zt : G
hzt : zt ∈ Monoid.Closure (Inv.inv ⁻¹' t)
⊢ ∃ y,
    (∃ y_1, y_1 ∈ Monoid.Closure s ∧ ∃ z, z ∈ Monoid.Closure (Inv.inv ⁻¹' s) ∧ y_1 * z = y) ∧
      ∃ z,
        (∃ y, y ∈ Monoid.Closure t ∧ ∃ z_1, z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t) ∧ y * z_1 = z) ∧
          y * z = ys * yt * (zs * zt)
[PROOFSTEP]
refine' ⟨_, ⟨_, hys, _, hzs, rfl⟩, _, ⟨_, hyt, _, hzt, rfl⟩, _⟩
[GOAL]
case mp.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
ys : G
hys : ys ∈ Monoid.Closure s
yt : G
hyt : yt ∈ Monoid.Closure t
zs : G
hzs : zs ∈ Monoid.Closure (Inv.inv ⁻¹' s)
zt : G
hzt : zt ∈ Monoid.Closure (Inv.inv ⁻¹' t)
⊢ ys * zs * (yt * zt) = ys * yt * (zs * zt)
[PROOFSTEP]
rw [mul_assoc, mul_assoc, mul_left_comm zs]
[GOAL]
case mpr
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
x : G
⊢ (∃ y,
      (∃ y_1, y_1 ∈ Monoid.Closure s ∧ ∃ z, z ∈ Monoid.Closure (Inv.inv ⁻¹' s) ∧ y_1 * z = y) ∧
        ∃ z, (∃ y, y ∈ Monoid.Closure t ∧ ∃ z_1, z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t) ∧ y * z_1 = z) ∧ y * z = x) →
    ∃ y,
      (∃ y_1, y_1 ∈ Monoid.Closure s ∧ ∃ z, z ∈ Monoid.Closure t ∧ y_1 * z = y) ∧
        ∃ z,
          (∃ y, y ∈ Monoid.Closure (Inv.inv ⁻¹' s) ∧ ∃ z_1, z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t) ∧ y * z_1 = z) ∧
            y * z = x
[PROOFSTEP]
rintro ⟨_, ⟨ys, hys, zs, hzs, rfl⟩, _, ⟨yt, hyt, zt, hzt, rfl⟩, rfl⟩
[GOAL]
case mpr.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
ys : G
hys : ys ∈ Monoid.Closure s
zs : G
hzs : zs ∈ Monoid.Closure (Inv.inv ⁻¹' s)
yt : G
hyt : yt ∈ Monoid.Closure t
zt : G
hzt : zt ∈ Monoid.Closure (Inv.inv ⁻¹' t)
⊢ ∃ y,
    (∃ y_1, y_1 ∈ Monoid.Closure s ∧ ∃ z, z ∈ Monoid.Closure t ∧ y_1 * z = y) ∧
      ∃ z,
        (∃ y, y ∈ Monoid.Closure (Inv.inv ⁻¹' s) ∧ ∃ z_1, z_1 ∈ Monoid.Closure (Inv.inv ⁻¹' t) ∧ y * z_1 = z) ∧
          y * z = ys * zs * (yt * zt)
[PROOFSTEP]
refine' ⟨_, ⟨ys, hys, yt, hyt, rfl⟩, _, ⟨zs, hzs, zt, hzt, rfl⟩, _⟩
[GOAL]
case mpr.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
G✝ : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G✝
inst✝¹ : Group G✝
s✝ : Set G✝
G : Type u_4
inst✝ : CommGroup G
s t : Set G
ys : G
hys : ys ∈ Monoid.Closure s
zs : G
hzs : zs ∈ Monoid.Closure (Inv.inv ⁻¹' s)
yt : G
hyt : yt ∈ Monoid.Closure t
zt : G
hzt : zt ∈ Monoid.Closure (Inv.inv ⁻¹' t)
⊢ ys * yt * (zs * zt) = ys * zs * (yt * zt)
[PROOFSTEP]
rw [mul_assoc, mul_assoc, mul_left_comm yt]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
⊢ trivial G ⊆ Group.closure ∅
[PROOFSTEP]
simp [Set.subset_def, (Group.closure.isSubgroup _).one_mem]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
inst✝ : Group G
⊢ ∅ ⊆ trivial G
[PROOFSTEP]
simp
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
s : Set G
inst✝ : Group G
t : Set G
ht : IsNormalSubgroup t
a : G
h : a ∈ t
x : G
hc : x ∈ conjugatesOf a
⊢ x ∈ t
[PROOFSTEP]
obtain ⟨c, w⟩ := isConj_iff.1 hc
[GOAL]
case intro
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c✝ : G
s : Set G
inst✝ : Group G
t : Set G
ht : IsNormalSubgroup t
a : G
h : a ∈ t
x : G
hc : x ∈ conjugatesOf a
c : G
w : c * a * c⁻¹ = x
⊢ x ∈ t
[PROOFSTEP]
have H := IsNormalSubgroup.normal ht a h c
[GOAL]
case intro
G : Type u_1
H✝ : Type u_2
A : Type u_3
a✝ a₁ a₂ b c✝ : G
s : Set G
inst✝ : Group G
t : Set G
ht : IsNormalSubgroup t
a : G
h : a ∈ t
x : G
hc : x ∈ conjugatesOf a
c : G
w : c * a * c⁻¹ = x
H : c * a * c⁻¹ ∈ t
⊢ x ∈ t
[PROOFSTEP]
rwa [← w]
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
s : Set G
inst✝ : Group G
src✝ : IsSubgroup (normalClosure s) := isSubgroup s
n : G
h : n ∈ normalClosure s
g : G
⊢ g * n * g⁻¹ ∈ normalClosure s
[PROOFSTEP]
induction' h with x hx x hx ihx x y hx hy ihx ihy
[GOAL]
case basic
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
s : Set G
inst✝ : Group G
src✝ : IsSubgroup (normalClosure s) := isSubgroup s
n g x : G
hx : x ∈ conjugatesOfSet s
⊢ g * x * g⁻¹ ∈ normalClosure s
[PROOFSTEP]
exact conjugatesOfSet_subset_normalClosure (conj_mem_conjugatesOfSet hx)
[GOAL]
case one
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
s : Set G
inst✝ : Group G
src✝ : IsSubgroup (normalClosure s) := isSubgroup s
n g : G
⊢ g * 1 * g⁻¹ ∈ normalClosure s
[PROOFSTEP]
simpa using (normalClosure.isSubgroup s).one_mem
[GOAL]
case inv
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
s : Set G
inst✝ : Group G
src✝ : IsSubgroup (normalClosure s) := isSubgroup s
n g x : G
hx : InClosure (conjugatesOfSet s) x
ihx : g * x * g⁻¹ ∈ normalClosure s
⊢ g * x⁻¹ * g⁻¹ ∈ normalClosure s
[PROOFSTEP]
rw [← conj_inv]
[GOAL]
case inv
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
s : Set G
inst✝ : Group G
src✝ : IsSubgroup (normalClosure s) := isSubgroup s
n g x : G
hx : InClosure (conjugatesOfSet s) x
ihx : g * x * g⁻¹ ∈ normalClosure s
⊢ (g * x * g⁻¹)⁻¹ ∈ normalClosure s
[PROOFSTEP]
exact (normalClosure.isSubgroup _).inv_mem ihx
[GOAL]
case mul
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
s : Set G
inst✝ : Group G
src✝ : IsSubgroup (normalClosure s) := isSubgroup s
n g x y : G
hx : InClosure (conjugatesOfSet s) x
hy : InClosure (conjugatesOfSet s) y
ihx : g * x * g⁻¹ ∈ normalClosure s
ihy : g * y * g⁻¹ ∈ normalClosure s
⊢ g * (x * y) * g⁻¹ ∈ normalClosure s
[PROOFSTEP]
rw [← conj_mul]
[GOAL]
case mul
G : Type u_1
H : Type u_2
A : Type u_3
a a₁ a₂ b c : G
s : Set G
inst✝ : Group G
src✝ : IsSubgroup (normalClosure s) := isSubgroup s
n g x y : G
hx : InClosure (conjugatesOfSet s) x
hy : InClosure (conjugatesOfSet s) y
ihx : g * x * g⁻¹ ∈ normalClosure s
ihy : g * y * g⁻¹ ∈ normalClosure s
⊢ g * x * g⁻¹ * (g * y * g⁻¹) ∈ normalClosure s
[PROOFSTEP]
exact (normalClosure.isSubgroup _).toIsSubmonoid.mul_mem ihx ihy
[GOAL]
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
s✝ : Set G
inst✝ : Group G
s t : Set G
ht : IsNormalSubgroup t
h : s ⊆ t
a : G
w : a ∈ normalClosure s
⊢ a ∈ t
[PROOFSTEP]
induction' w with x hx x _ ihx x y _ _ ihx ihy
[GOAL]
case basic
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
s✝ : Set G
inst✝ : Group G
s t : Set G
ht : IsNormalSubgroup t
h : s ⊆ t
a x : G
hx : x ∈ conjugatesOfSet s
⊢ x ∈ t
[PROOFSTEP]
exact conjugatesOfSet_subset' ht h <| hx
[GOAL]
case one
G : Type u_1
H : Type u_2
A : Type u_3
a✝ a₁ a₂ b c : G
s✝ : Set G
inst✝ : Group G
s t : Set G
ht : IsNormalSubgroup t
h : s ⊆ t
a : G
⊢ 1 ∈ t
[PROOFSTEP]
exact ht.toIsSubgroup.toIsSubmonoid.one_mem
[GOAL]
case inv
G : Type u_1
H : Type u_2
A : Type u_3
a✝¹ a₁ a₂ b c : G
s✝ : Set G
inst✝ : Group G
s t : Set G
ht : IsNormalSubgroup t
h : s ⊆ t
a x : G
a✝ : InClosure (conjugatesOfSet s) x
ihx : x ∈ t
⊢ x⁻¹ ∈ t
[PROOFSTEP]
exact ht.toIsSubgroup.inv_mem ihx
[GOAL]
case mul
G : Type u_1
H : Type u_2
A : Type u_3
a✝² a₁ a₂ b c : G
s✝ : Set G
inst✝ : Group G
s t : Set G
ht : IsNormalSubgroup t
h : s ⊆ t
a x y : G
a✝¹ : InClosure (conjugatesOfSet s) x
a✝ : InClosure (conjugatesOfSet s) y
ihx : x ∈ t
ihy : y ∈ t
⊢ x * y ∈ t
[PROOFSTEP]
exact ht.toIsSubgroup.toIsSubmonoid.mul_mem ihx ihy


[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝¹ : Monoid α
inst✝ : HasDistribNeg α
a b : α
u : αˣ
⊢ -↑u * -↑u⁻¹ = 1
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝¹ : Monoid α
inst✝ : HasDistribNeg α
a b : α
u : αˣ
⊢ -↑u⁻¹ * -↑u = 1
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝¹ : Monoid α
inst✝ : HasDistribNeg α
a✝ b a : α
u : αˣ
⊢ -(a /ₚ u) = -a /ₚ u
[PROOFSTEP]
simp only [divp, neg_mul]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝ : Ring α
a✝ b✝ a b : α
u : αˣ
⊢ a /ₚ u + b /ₚ u = (a + b) /ₚ u
[PROOFSTEP]
simp only [divp, add_mul]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝ : Ring α
a✝ b✝ a b : α
u : αˣ
⊢ a /ₚ u - b /ₚ u = (a - b) /ₚ u
[PROOFSTEP]
rw [sub_eq_add_neg, sub_eq_add_neg, neg_divp, divp_add_divp_same]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝ : Ring α
a✝ b✝ a b : α
u : αˣ
⊢ a + b /ₚ u = (a * ↑u + b) /ₚ u
[PROOFSTEP]
simp only [divp, add_mul, Units.mul_inv_cancel_right]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝ : Ring α
a✝ b✝ a b : α
u : αˣ
⊢ a - b /ₚ u = (a * ↑u - b) /ₚ u
[PROOFSTEP]
simp only [divp, sub_mul, Units.mul_inv_cancel_right]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝ : Ring α
a✝ b✝ a b : α
u : αˣ
⊢ a /ₚ u + b = (a + b * ↑u) /ₚ u
[PROOFSTEP]
simp only [divp, add_mul, Units.mul_inv_cancel_right]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝ : Ring α
a✝ b✝ a b : α
u : αˣ
⊢ a /ₚ u - b = (a - b * ↑u) /ₚ u
[PROOFSTEP]
simp only [divp, sub_mul, sub_right_inj]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝ : Ring α
a✝ b✝ a b : α
u : αˣ
⊢ b = b * ↑u * ↑u⁻¹
[PROOFSTEP]
rw [mul_assoc, Units.mul_inv, mul_one]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝ : CommRing α
a b : α
u₁ u₂ : αˣ
⊢ a /ₚ u₁ + b /ₚ u₂ = (a * ↑u₂ + ↑u₁ * b) /ₚ (u₁ * u₂)
[PROOFSTEP]
simp only [divp, add_mul, mul_inv_rev, val_mul]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝ : CommRing α
a b : α
u₁ u₂ : αˣ
⊢ a * ↑u₁⁻¹ + b * ↑u₂⁻¹ = a * ↑u₂ * (↑u₂⁻¹ * ↑u₁⁻¹) + ↑u₁ * b * (↑u₂⁻¹ * ↑u₁⁻¹)
[PROOFSTEP]
rw [mul_comm (↑u₁ * b), mul_comm b]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝ : CommRing α
a b : α
u₁ u₂ : αˣ
⊢ a * ↑u₁⁻¹ + ↑u₂⁻¹ * b = a * ↑u₂ * (↑u₂⁻¹ * ↑u₁⁻¹) + ↑u₂⁻¹ * ↑u₁⁻¹ * (↑u₁ * b)
[PROOFSTEP]
rw [← mul_assoc, ← mul_assoc, mul_assoc a, mul_assoc (↑u₂⁻¹ : α), mul_inv, inv_mul, mul_one, mul_one]
  -- porting note: `assoc_rw` not ported: `assoc_rw [mul_inv, mul_inv, mul_one, mul_one]`
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝ : CommRing α
a b : α
u₁ u₂ : αˣ
⊢ a /ₚ u₁ - b /ₚ u₂ = (a * ↑u₂ - ↑u₁ * b) /ₚ (u₁ * u₂)
[PROOFSTEP]
simp only [sub_eq_add_neg, neg_divp, divp_add_divp, mul_neg]
[GOAL]
α : Type u
β : Type v
γ : Type w
R : Type x
inst✝ : Semiring R
a : Rˣ
b : R
⊢ ↑a + b = ↑a * (1 + ↑a⁻¹ * b)
[PROOFSTEP]
rw [mul_add, mul_one, ← mul_assoc, Units.mul_inv, one_mul]


[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝³ : OrderedSemiring R
inst✝² : OrderedAddCommMonoid M
inst✝¹ : SMulWithZero R M
inst✝ : OrderedSMul R M
s : Set M
a b : M
c : R
h₁ : a ≤ b
h₂ : 0 ≤ c
⊢ c • a ≤ c • b
[PROOFSTEP]
rcases h₁.eq_or_lt with (rfl | hab)
[GOAL]
case inl
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝³ : OrderedSemiring R
inst✝² : OrderedAddCommMonoid M
inst✝¹ : SMulWithZero R M
inst✝ : OrderedSMul R M
s : Set M
a : M
c : R
h₂ : 0 ≤ c
h₁ : a ≤ a
⊢ c • a ≤ c • a
[PROOFSTEP]
rfl
[GOAL]
case inr
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝³ : OrderedSemiring R
inst✝² : OrderedAddCommMonoid M
inst✝¹ : SMulWithZero R M
inst✝ : OrderedSMul R M
s : Set M
a b : M
c : R
h₁ : a ≤ b
h₂ : 0 ≤ c
hab : a < b
⊢ c • a ≤ c • b
[PROOFSTEP]
rcases h₂.eq_or_lt with (rfl | hc)
[GOAL]
case inr.inl
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝³ : OrderedSemiring R
inst✝² : OrderedAddCommMonoid M
inst✝¹ : SMulWithZero R M
inst✝ : OrderedSMul R M
s : Set M
a b : M
h₁ : a ≤ b
hab : a < b
h₂ : 0 ≤ 0
⊢ 0 • a ≤ 0 • b
[PROOFSTEP]
rw [zero_smul, zero_smul]
[GOAL]
case inr.inr
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝³ : OrderedSemiring R
inst✝² : OrderedAddCommMonoid M
inst✝¹ : SMulWithZero R M
inst✝ : OrderedSMul R M
s : Set M
a b : M
c : R
h₁ : a ≤ b
h₂ : 0 ≤ c
hab : a < b
hc : 0 < c
⊢ c • a ≤ c • b
[PROOFSTEP]
exact (smul_lt_smul_of_pos hab hc).le
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝³ : OrderedSemiring R
inst✝² : OrderedAddCommMonoid M
inst✝¹ : SMulWithZero R M
inst✝ : OrderedSMul R M
s : Set M
a b : M
c : R
h : c • a < c • b
hc✝ : 0 ≤ c
hc : 0 = c
⊢ 0 < 0
[PROOFSTEP]
rwa [← hc, zero_smul, zero_smul] at h
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝³ : OrderedSemiring R
inst✝² : OrderedAddCommMonoid M
inst✝¹ : SMulWithZero R M
inst✝ : OrderedSMul R M
s : Set M
a b : M
c : R
hc : 0 < c
⊢ 0 < c • a ↔ c • 0 < c • a
[PROOFSTEP]
rw [smul_zero]
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedCancelAddCommMonoid M
n : ℕ
hn : 0 < n
a b : M
hab : a < b
⊢ (fun a => n • a) a < (fun a => n • a) b
[PROOFSTEP]
cases n with
| zero => cases hn
| succ n =>
  induction n with
  | zero => dsimp; rwa [one_nsmul, one_nsmul]
  | succ n ih => simp only [succ_nsmul _ n.succ, _root_.add_lt_add hab (ih n.succ_pos)]
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedCancelAddCommMonoid M
n : ℕ
hn : 0 < n
a b : M
hab : a < b
⊢ (fun a => n • a) a < (fun a => n • a) b
[PROOFSTEP]
cases n with
| zero => cases hn
| succ n =>
  induction n with
  | zero => dsimp; rwa [one_nsmul, one_nsmul]
  | succ n ih => simp only [succ_nsmul _ n.succ, _root_.add_lt_add hab (ih n.succ_pos)]
[GOAL]
case zero
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedCancelAddCommMonoid M
a b : M
hab : a < b
hn : 0 < zero
⊢ (fun a => zero • a) a < (fun a => zero • a) b
[PROOFSTEP]

| zero => cases hn
[GOAL]
case zero
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedCancelAddCommMonoid M
a b : M
hab : a < b
hn : 0 < zero
⊢ (fun a => zero • a) a < (fun a => zero • a) b
[PROOFSTEP]
cases hn
[GOAL]
case succ
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedCancelAddCommMonoid M
a b : M
hab : a < b
n : ℕ
hn : 0 < succ n
⊢ (fun a => succ n • a) a < (fun a => succ n • a) b
[PROOFSTEP]

| succ n =>
  induction n with
  | zero => dsimp; rwa [one_nsmul, one_nsmul]
  | succ n ih => simp only [succ_nsmul _ n.succ, _root_.add_lt_add hab (ih n.succ_pos)]
[GOAL]
case succ
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedCancelAddCommMonoid M
a b : M
hab : a < b
n : ℕ
hn : 0 < succ n
⊢ (fun a => succ n • a) a < (fun a => succ n • a) b
[PROOFSTEP]
induction n with
| zero => dsimp; rwa [one_nsmul, one_nsmul]
| succ n ih => simp only [succ_nsmul _ n.succ, _root_.add_lt_add hab (ih n.succ_pos)]
[GOAL]
case succ
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedCancelAddCommMonoid M
a b : M
hab : a < b
n : ℕ
hn : 0 < succ n
⊢ (fun a => succ n • a) a < (fun a => succ n • a) b
[PROOFSTEP]
induction n with
| zero => dsimp; rwa [one_nsmul, one_nsmul]
| succ n ih => simp only [succ_nsmul _ n.succ, _root_.add_lt_add hab (ih n.succ_pos)]
[GOAL]
case succ.zero
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedCancelAddCommMonoid M
a b : M
hab : a < b
hn : 0 < succ zero
⊢ (fun a => succ zero • a) a < (fun a => succ zero • a) b
[PROOFSTEP]

| zero => dsimp; rwa [one_nsmul, one_nsmul]
[GOAL]
case succ.zero
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedCancelAddCommMonoid M
a b : M
hab : a < b
hn : 0 < succ zero
⊢ (fun a => succ zero • a) a < (fun a => succ zero • a) b
[PROOFSTEP]
dsimp
[GOAL]
case succ.zero
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedCancelAddCommMonoid M
a b : M
hab : a < b
hn : 0 < succ zero
⊢ succ 0 • a < succ 0 • b
[PROOFSTEP]
rwa [one_nsmul, one_nsmul]
[GOAL]
case succ.succ
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedCancelAddCommMonoid M
a b : M
hab : a < b
n : ℕ
ih : 0 < succ n → (fun a => succ n • a) a < (fun a => succ n • a) b
hn : 0 < succ (succ n)
⊢ (fun a => succ (succ n) • a) a < (fun a => succ (succ n) • a) b
[PROOFSTEP]

| succ n ih => simp only [succ_nsmul _ n.succ, _root_.add_lt_add hab (ih n.succ_pos)]
[GOAL]
case succ.succ
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedCancelAddCommMonoid M
a b : M
hab : a < b
n : ℕ
ih : 0 < succ n → (fun a => succ n • a) a < (fun a => succ n • a) b
hn : 0 < succ (succ n)
⊢ (fun a => succ (succ n) • a) a < (fun a => succ (succ n) • a) b
[PROOFSTEP]
simp only [succ_nsmul _ n.succ, _root_.add_lt_add hab (ih n.succ_pos)]
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedAddCommGroup M
n : ℤ
hn : 0 < n
⊢ StrictMono fun a => n • a
[PROOFSTEP]
cases n
[GOAL]
case ofNat
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedAddCommGroup M
a✝ : ℕ
hn : 0 < ofNat a✝
⊢ StrictMono fun a => ofNat a✝ • a
[PROOFSTEP]
simp only [Int.ofNat_eq_coe, Int.coe_nat_pos, coe_nat_zsmul] at hn ⊢
[GOAL]
case ofNat
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedAddCommGroup M
a✝ : ℕ
hn : 0 < a✝
⊢ StrictMono fun a => a✝ • a
[PROOFSTEP]
exact strictMono_smul_left hn
[GOAL]
case negSucc
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝ : LinearOrderedAddCommGroup M
a✝ : ℕ
hn : 0 < -[a✝+1]
⊢ StrictMono fun a => -[a✝+1] • a
[PROOFSTEP]
cases (Int.negSucc_not_pos _).1 hn
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : LinearOrderedSemifield 𝕜
inst✝³ : OrderedAddCommMonoid M
inst✝² : OrderedAddCommMonoid N
inst✝¹ : MulActionWithZero 𝕜 M
inst✝ : MulActionWithZero 𝕜 N
h : ∀ ⦃a b : M⦄ ⦃c : 𝕜⦄, a < b → 0 < c → c • a ≤ c • b
⊢ OrderedSMul 𝕜 M
[PROOFSTEP]
have hlt' : ∀ (a b : M) (c : 𝕜), a < b → 0 < c → c • a < c • b :=
  by
  refine' fun a b c hab hc => (h hab hc).lt_of_ne _
  rw [Ne.def, hc.ne'.isUnit.smul_left_cancel]
  exact hab.ne
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : LinearOrderedSemifield 𝕜
inst✝³ : OrderedAddCommMonoid M
inst✝² : OrderedAddCommMonoid N
inst✝¹ : MulActionWithZero 𝕜 M
inst✝ : MulActionWithZero 𝕜 N
h : ∀ ⦃a b : M⦄ ⦃c : 𝕜⦄, a < b → 0 < c → c • a ≤ c • b
⊢ ∀ (a b : M) (c : 𝕜), a < b → 0 < c → c • a < c • b
[PROOFSTEP]
refine' fun a b c hab hc => (h hab hc).lt_of_ne _
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : LinearOrderedSemifield 𝕜
inst✝³ : OrderedAddCommMonoid M
inst✝² : OrderedAddCommMonoid N
inst✝¹ : MulActionWithZero 𝕜 M
inst✝ : MulActionWithZero 𝕜 N
h : ∀ ⦃a b : M⦄ ⦃c : 𝕜⦄, a < b → 0 < c → c • a ≤ c • b
a b : M
c : 𝕜
hab : a < b
hc : 0 < c
⊢ c • a ≠ c • b
[PROOFSTEP]
rw [Ne.def, hc.ne'.isUnit.smul_left_cancel]
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : LinearOrderedSemifield 𝕜
inst✝³ : OrderedAddCommMonoid M
inst✝² : OrderedAddCommMonoid N
inst✝¹ : MulActionWithZero 𝕜 M
inst✝ : MulActionWithZero 𝕜 N
h : ∀ ⦃a b : M⦄ ⦃c : 𝕜⦄, a < b → 0 < c → c • a ≤ c • b
a b : M
c : 𝕜
hab : a < b
hc : 0 < c
⊢ ¬a = b
[PROOFSTEP]
exact hab.ne
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : LinearOrderedSemifield 𝕜
inst✝³ : OrderedAddCommMonoid M
inst✝² : OrderedAddCommMonoid N
inst✝¹ : MulActionWithZero 𝕜 M
inst✝ : MulActionWithZero 𝕜 N
h : ∀ ⦃a b : M⦄ ⦃c : 𝕜⦄, a < b → 0 < c → c • a ≤ c • b
hlt' : ∀ (a b : M) (c : 𝕜), a < b → 0 < c → c • a < c • b
⊢ OrderedSMul 𝕜 M
[PROOFSTEP]
refine' { smul_lt_smul_of_pos := fun {a b c} => hlt' a b c .. }
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : LinearOrderedSemifield 𝕜
inst✝³ : OrderedAddCommMonoid M
inst✝² : OrderedAddCommMonoid N
inst✝¹ : MulActionWithZero 𝕜 M
inst✝ : MulActionWithZero 𝕜 N
h : ∀ ⦃a b : M⦄ ⦃c : 𝕜⦄, a < b → 0 < c → c • a ≤ c • b
hlt' : ∀ (a b : M) (c : 𝕜), a < b → 0 < c → c • a < c • b
⊢ ∀ {a b : M} {c : 𝕜}, c • a < c • b → 0 < c → a < b
[PROOFSTEP]
intro a b c hab hc
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : LinearOrderedSemifield 𝕜
inst✝³ : OrderedAddCommMonoid M
inst✝² : OrderedAddCommMonoid N
inst✝¹ : MulActionWithZero 𝕜 M
inst✝ : MulActionWithZero 𝕜 N
h : ∀ ⦃a b : M⦄ ⦃c : 𝕜⦄, a < b → 0 < c → c • a ≤ c • b
hlt' : ∀ (a b : M) (c : 𝕜), a < b → 0 < c → c • a < c • b
a b : M
c : 𝕜
hab : c • a < c • b
hc : 0 < c
⊢ a < b
[PROOFSTEP]
obtain ⟨c, rfl⟩ := hc.ne'.isUnit
[GOAL]
case intro
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : LinearOrderedSemifield 𝕜
inst✝³ : OrderedAddCommMonoid M
inst✝² : OrderedAddCommMonoid N
inst✝¹ : MulActionWithZero 𝕜 M
inst✝ : MulActionWithZero 𝕜 N
h : ∀ ⦃a b : M⦄ ⦃c : 𝕜⦄, a < b → 0 < c → c • a ≤ c • b
hlt' : ∀ (a b : M) (c : 𝕜), a < b → 0 < c → c • a < c • b
a b : M
c : 𝕜ˣ
hab : ↑c • a < ↑c • b
hc : 0 < ↑c
⊢ a < b
[PROOFSTEP]
rw [← inv_smul_smul c a, ← inv_smul_smul c b]
[GOAL]
case intro
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : LinearOrderedSemifield 𝕜
inst✝³ : OrderedAddCommMonoid M
inst✝² : OrderedAddCommMonoid N
inst✝¹ : MulActionWithZero 𝕜 M
inst✝ : MulActionWithZero 𝕜 N
h : ∀ ⦃a b : M⦄ ⦃c : 𝕜⦄, a < b → 0 < c → c • a ≤ c • b
hlt' : ∀ (a b : M) (c : 𝕜), a < b → 0 < c → c • a < c • b
a b : M
c : 𝕜ˣ
hab : ↑c • a < ↑c • b
hc : 0 < ↑c
⊢ c⁻¹ • c • a < c⁻¹ • c • b
[PROOFSTEP]
refine' hlt' _ _ _ hab (pos_of_mul_pos_right _ hc.le)
[GOAL]
case intro
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : LinearOrderedSemifield 𝕜
inst✝³ : OrderedAddCommMonoid M
inst✝² : OrderedAddCommMonoid N
inst✝¹ : MulActionWithZero 𝕜 M
inst✝ : MulActionWithZero 𝕜 N
h : ∀ ⦃a b : M⦄ ⦃c : 𝕜⦄, a < b → 0 < c → c • a ≤ c • b
hlt' : ∀ (a b : M) (c : 𝕜), a < b → 0 < c → c • a < c • b
a b : M
c : 𝕜ˣ
hab : ↑c • a < ↑c • b
hc : 0 < ↑c
⊢ 0 < ↑c * ↑c⁻¹
[PROOFSTEP]
simp only [c.mul_inv, zero_lt_one]
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝⁵ : LinearOrderedSemifield 𝕜
inst✝⁴ : OrderedAddCommMonoid M
inst✝³ : OrderedAddCommMonoid N
inst✝² : MulActionWithZero 𝕜 M
inst✝¹ : MulActionWithZero 𝕜 N
inst✝ : OrderedSMul 𝕜 M
s : Set M
a b : M
c : 𝕜
h : 0 < c
⊢ c⁻¹ • a ≤ b ↔ a ≤ c • b
[PROOFSTEP]
rw [← smul_le_smul_iff_of_pos h, smul_inv_smul₀ h.ne']
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝⁵ : LinearOrderedSemifield 𝕜
inst✝⁴ : OrderedAddCommMonoid M
inst✝³ : OrderedAddCommMonoid N
inst✝² : MulActionWithZero 𝕜 M
inst✝¹ : MulActionWithZero 𝕜 N
inst✝ : OrderedSMul 𝕜 M
s : Set M
a b : M
c : 𝕜
h : 0 < c
⊢ c⁻¹ • a < b ↔ a < c • b
[PROOFSTEP]
rw [← smul_lt_smul_iff_of_pos h, smul_inv_smul₀ h.ne']
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝⁵ : LinearOrderedSemifield 𝕜
inst✝⁴ : OrderedAddCommMonoid M
inst✝³ : OrderedAddCommMonoid N
inst✝² : MulActionWithZero 𝕜 M
inst✝¹ : MulActionWithZero 𝕜 N
inst✝ : OrderedSMul 𝕜 M
s : Set M
a b : M
c : 𝕜
h : 0 < c
⊢ a ≤ c⁻¹ • b ↔ c • a ≤ b
[PROOFSTEP]
rw [← smul_le_smul_iff_of_pos h, smul_inv_smul₀ h.ne']
[GOAL]
ι : Type u_1
𝕜 : Type u_2
R : Type u_3
M : Type u_4
N : Type u_5
inst✝⁵ : LinearOrderedSemifield 𝕜
inst✝⁴ : OrderedAddCommMonoid M
inst✝³ : OrderedAddCommMonoid N
inst✝² : MulActionWithZero 𝕜 M
inst✝¹ : MulActionWithZero 𝕜 N
inst✝ : OrderedSMul 𝕜 M
s : Set M
a b : M
c : 𝕜
h : 0 < c
⊢ a < c⁻¹ • b ↔ c • a < b
[PROOFSTEP]
rw [← smul_lt_smul_iff_of_pos h, smul_inv_smul₀ h.ne']


[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionSemiring α
a✝ b✝ c✝ d a b c : α
⊢ (a + b) / c = a / c + b / c
[PROOFSTEP]
simp_rw [div_eq_mul_inv, add_mul]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionSemiring α
a b c d : α
h : b ≠ 0
⊢ (b + a) / b = 1 + a / b
[PROOFSTEP]
rw [← div_self h, add_div]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionSemiring α
a b c d : α
h : b ≠ 0
⊢ (a + b) / b = a / b + 1
[PROOFSTEP]
rw [← div_self h, add_div]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionSemiring α
a b c d : α
ha : a ≠ 0
hb : b ≠ 0
⊢ 1 / a * (a + b) * (1 / b) = 1 / a + 1 / b
[PROOFSTEP]
rw [mul_add, one_div_mul_cancel ha, add_mul, one_mul, mul_assoc, mul_one_div_cancel hb, mul_one, add_comm]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionSemiring α
a✝ b✝ c d a b : α
hc : c ≠ 0
⊢ (a + b / c) * c = a * c + b
[PROOFSTEP]
rw [right_distrib, div_mul_cancel _ hc]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionSemiring α
a✝ b✝ c✝ d a b c : α
hc : c ≠ 0
⊢ b + a / c = (b * c + a) / c
[PROOFSTEP]
rw [add_div, mul_div_cancel _ hc]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionSemiring α
a✝ b✝ c✝ d a b c : α
hc : c ≠ 0
⊢ a / c + b = (a + b * c) / c
[PROOFSTEP]
rwa [add_comm, add_div', add_comm]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionSemiring α
a b c d : α
hbc : Commute b c
hbd : Commute b d
hb : b ≠ 0
hd : d ≠ 0
⊢ a / b + c / d = (a * d + b * c) / (b * d)
[PROOFSTEP]
rw [add_div, mul_div_mul_right _ b hd, hbc.eq, hbd.eq, mul_div_mul_right c d hb]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionSemiring α
a b c d : α
hab : Commute a b
ha : a ≠ 0
hb : b ≠ 0
⊢ 1 / a + 1 / b = (a + b) / (a * b)
[PROOFSTEP]
rw [(Commute.one_right a).div_add_div hab ha hb, one_mul, mul_one, add_comm]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionSemiring α
a b c d : α
hab : Commute a b
ha : a ≠ 0
hb : b ≠ 0
⊢ a⁻¹ + b⁻¹ = (a + b) / (a * b)
[PROOFSTEP]
rw [inv_eq_one_div, inv_eq_one_div, hab.one_div_add_one_div ha hb]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a b : K
⊢ -1 * -1 = 1
[PROOFSTEP]
rw [neg_mul_neg, one_mul]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a✝ b a : K
⊢ 1 / -a = 1 / (-1 * a)
[PROOFSTEP]
rw [neg_eq_neg_one_mul]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a✝ b a : K
⊢ 1 / (-1 * a) = 1 / a * (1 / -1)
[PROOFSTEP]
rw [one_div_mul_one_div_rev]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a✝ b a : K
⊢ 1 / a * (1 / -1) = 1 / a * -1
[PROOFSTEP]
rw [one_div_neg_one_eq_neg_one]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a✝ b a : K
⊢ 1 / a * -1 = -(1 / a)
[PROOFSTEP]
rw [mul_neg, mul_one]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a✝ b✝ a b : K
⊢ b / -a = b * (1 / -a)
[PROOFSTEP]
rw [← inv_eq_one_div, division_def]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a✝ b✝ a b : K
⊢ b * (1 / -a) = b * -(1 / a)
[PROOFSTEP]
rw [one_div_neg_eq_neg_one_div]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a✝ b✝ a b : K
⊢ b * -(1 / a) = -(b * (1 / a))
[PROOFSTEP]
rw [neg_mul_eq_mul_neg]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a✝ b✝ a b : K
⊢ -(b * (1 / a)) = -(b / a)
[PROOFSTEP]
rw [mul_one_div]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a✝ b✝ a b : K
⊢ -b / a = -(b / a)
[PROOFSTEP]
rw [neg_eq_neg_one_mul, mul_div_assoc, ← neg_eq_neg_one_mul]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a✝ b✝ a b : K
⊢ -(b / a) = -b / a
[PROOFSTEP]
simp [neg_div]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a✝ b✝ a b : K
⊢ -a / -b = a / b
[PROOFSTEP]
rw [div_neg_eq_neg_div, neg_div, neg_neg]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a b : K
⊢ -a⁻¹ = (-a)⁻¹
[PROOFSTEP]
rw [inv_eq_one_div, inv_eq_one_div, div_neg_eq_neg_div]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a✝ b a : K
⊢ a / -b = -(a / b)
[PROOFSTEP]
rw [← div_neg_eq_neg_div]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a b : K
⊢ (-a)⁻¹ = -a⁻¹
[PROOFSTEP]
rw [neg_inv]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹ : DivisionMonoid K
inst✝ : HasDistribNeg K
a b : K
⊢ (-1)⁻¹ = -1
[PROOFSTEP]
rw [← neg_inv, inv_one]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionRing K
a✝ b c d a : K
h : a ≠ 0
⊢ a / -a = -1
[PROOFSTEP]
rw [div_neg_eq_neg_div, div_self h]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionRing K
a✝ b c d a : K
h : a ≠ 0
⊢ -a / a = -1
[PROOFSTEP]
rw [neg_div, div_self h]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionRing K
a✝ b✝ c✝ d a b c : K
⊢ a / c - b / c = (a - b) / c
[PROOFSTEP]
rw [sub_eq_add_neg, ← neg_div, div_add_div_same, sub_eq_add_neg]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionRing K
a✝ b✝ c d a b : K
h : b ≠ 0
⊢ (b - a) / b = 1 - a / b
[PROOFSTEP]
simpa only [← @div_self _ _ b h] using (div_sub_div_same b a b).symm
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionRing K
a✝ b✝ c d a b : K
h : b ≠ 0
⊢ (a - b) / b = a / b - 1
[PROOFSTEP]
simpa only [← @div_self _ _ b h] using (div_sub_div_same a b b).symm
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionRing K
a✝ b✝ c d a b : K
ha : a ≠ 0
hb : b ≠ 0
⊢ a⁻¹ - b⁻¹ = a⁻¹ * (b - a) * b⁻¹
[PROOFSTEP]
rw [mul_sub, sub_mul, mul_inv_cancel_right₀ hb, inv_mul_cancel ha, one_mul]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionRing K
a b c d : K
ha : a ≠ 0
hb : b ≠ 0
⊢ 1 / a * (b - a) * (1 / b) = 1 / a - 1 / b
[PROOFSTEP]
rw [mul_sub_left_distrib (1 / a), one_div_mul_cancel ha, mul_sub_right_distrib, one_mul, mul_assoc,
  mul_one_div_cancel hb, mul_one]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionRing K
a b c d : K
hbc : Commute b c
hbd : Commute b d
hb : b ≠ 0
hd : d ≠ 0
⊢ a / b - c / d = (a * d - b * c) / (b * d)
[PROOFSTEP]
simpa only [mul_neg, neg_div, ← sub_eq_add_neg] using hbc.neg_right.div_add_div hbd hb hd
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : DivisionRing K
a b c d : K
hab : Commute a b
ha : a ≠ 0
hb : b ≠ 0
⊢ a⁻¹ - b⁻¹ = (b - a) / (a * b)
[PROOFSTEP]
simp only [inv_eq_one_div, (Commute.one_right a).div_sub_div hab ha hb, one_mul, mul_one]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : Field K
a b : K
ha : a ≠ 0
hb : b ≠ 0
⊢ a⁻¹ - b⁻¹ = (b - a) / (a * b)
[PROOFSTEP]
rw [inv_eq_one_div, inv_eq_one_div, div_sub_div _ _ ha hb, one_mul, mul_one]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : Field K
a b c : K
hc : c ≠ 0
⊢ b - a / c = (b * c - a) / c
[PROOFSTEP]
simpa using div_sub_div b a one_ne_zero hc
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝ : Field K
a b c : K
hc : c ≠ 0
⊢ a / c - b = (a - c * b) / c
[PROOFSTEP]
simpa using div_sub_div a b hc one_ne_zero
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹⁶ : DivisionRing K
K' : Type ?u.52132
inst✝¹⁵ : Zero K'
inst✝¹⁴ : One K'
inst✝¹³ : Add K'
inst✝¹² : Mul K'
inst✝¹¹ : Neg K'
inst✝¹⁰ : Sub K'
inst✝⁹ : Inv K'
inst✝⁸ : Div K'
inst✝⁷ : SMul ℕ K'
inst✝⁶ : SMul ℤ K'
inst✝⁵ : SMul ℚ K'
inst✝⁴ : Pow K' ℕ
inst✝³ : Pow K' ℤ
inst✝² : NatCast K'
inst✝¹ : IntCast K'
inst✝ : RatCast K'
f : K' → K
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : K'), f (x + y) = f x + f y
mul : ∀ (x y : K'), f (x * y) = f x * f y
neg : ∀ (x : K'), f (-x) = -f x
sub : ∀ (x y : K'), f (x - y) = f x - f y
inv : ∀ (x : K'), f x⁻¹ = (f x)⁻¹
div : ∀ (x y : K'), f (x / y) = f x / f y
nsmul : ∀ (x : K') (n : ℕ), f (n • x) = n • f x
zsmul : ∀ (x : K') (n : ℤ), f (n • x) = n • f x
qsmul : ∀ (x : K') (n : ℚ), f (n • x) = n • f x
npow : ∀ (x : K') (n : ℕ), f (x ^ n) = f x ^ n
zpow : ∀ (x : K') (n : ℤ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
int_cast : ∀ (n : ℤ), f ↑n = ↑n
rat_cast : ∀ (n : ℚ), f ↑n = ↑n
src✝¹ : GroupWithZero K' := Injective.groupWithZero f hf zero one mul inv div npow zpow
src✝ : Ring K' := Injective.ring f hf zero one add mul neg sub nsmul zsmul npow nat_cast int_cast
a : ℤ
b : ℕ
h1 : b ≠ 0
h2 : Nat.coprime (Int.natAbs a) b
⊢ f ↑(Rat.mk' a b) = f (↑a * (↑b)⁻¹)
[PROOFSTEP]
erw [rat_cast, mul, inv, int_cast, nat_cast]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹⁶ : DivisionRing K
K' : Type ?u.52132
inst✝¹⁵ : Zero K'
inst✝¹⁴ : One K'
inst✝¹³ : Add K'
inst✝¹² : Mul K'
inst✝¹¹ : Neg K'
inst✝¹⁰ : Sub K'
inst✝⁹ : Inv K'
inst✝⁸ : Div K'
inst✝⁷ : SMul ℕ K'
inst✝⁶ : SMul ℤ K'
inst✝⁵ : SMul ℚ K'
inst✝⁴ : Pow K' ℕ
inst✝³ : Pow K' ℤ
inst✝² : NatCast K'
inst✝¹ : IntCast K'
inst✝ : RatCast K'
f : K' → K
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : K'), f (x + y) = f x + f y
mul : ∀ (x y : K'), f (x * y) = f x * f y
neg : ∀ (x : K'), f (-x) = -f x
sub : ∀ (x y : K'), f (x - y) = f x - f y
inv : ∀ (x : K'), f x⁻¹ = (f x)⁻¹
div : ∀ (x y : K'), f (x / y) = f x / f y
nsmul : ∀ (x : K') (n : ℕ), f (n • x) = n • f x
zsmul : ∀ (x : K') (n : ℤ), f (n • x) = n • f x
qsmul : ∀ (x : K') (n : ℚ), f (n • x) = n • f x
npow : ∀ (x : K') (n : ℕ), f (x ^ n) = f x ^ n
zpow : ∀ (x : K') (n : ℤ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
int_cast : ∀ (n : ℤ), f ↑n = ↑n
rat_cast : ∀ (n : ℚ), f ↑n = ↑n
src✝¹ : GroupWithZero K' := Injective.groupWithZero f hf zero one mul inv div npow zpow
src✝ : Ring K' := Injective.ring f hf zero one add mul neg sub nsmul zsmul npow nat_cast int_cast
a : ℤ
b : ℕ
h1 : b ≠ 0
h2 : Nat.coprime (Int.natAbs a) b
⊢ ↑(Rat.mk' a b) = ↑a * (↑b)⁻¹
[PROOFSTEP]
exact DivisionRing.ratCast_mk a b h1 h2
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹⁶ : DivisionRing K
K' : Type ?u.52132
inst✝¹⁵ : Zero K'
inst✝¹⁴ : One K'
inst✝¹³ : Add K'
inst✝¹² : Mul K'
inst✝¹¹ : Neg K'
inst✝¹⁰ : Sub K'
inst✝⁹ : Inv K'
inst✝⁸ : Div K'
inst✝⁷ : SMul ℕ K'
inst✝⁶ : SMul ℤ K'
inst✝⁵ : SMul ℚ K'
inst✝⁴ : Pow K' ℕ
inst✝³ : Pow K' ℤ
inst✝² : NatCast K'
inst✝¹ : IntCast K'
inst✝ : RatCast K'
f : K' → K
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : K'), f (x + y) = f x + f y
mul : ∀ (x y : K'), f (x * y) = f x * f y
neg : ∀ (x : K'), f (-x) = -f x
sub : ∀ (x y : K'), f (x - y) = f x - f y
inv : ∀ (x : K'), f x⁻¹ = (f x)⁻¹
div : ∀ (x y : K'), f (x / y) = f x / f y
nsmul : ∀ (x : K') (n : ℕ), f (n • x) = n • f x
zsmul : ∀ (x : K') (n : ℤ), f (n • x) = n • f x
qsmul : ∀ (x : K') (n : ℚ), f (n • x) = n • f x
npow : ∀ (x : K') (n : ℕ), f (x ^ n) = f x ^ n
zpow : ∀ (x : K') (n : ℤ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
int_cast : ∀ (n : ℤ), f ↑n = ↑n
rat_cast : ∀ (n : ℚ), f ↑n = ↑n
src✝¹ : GroupWithZero K' := Injective.groupWithZero f hf zero one mul inv div npow zpow
src✝ : Ring K' := Injective.ring f hf zero one add mul neg sub nsmul zsmul npow nat_cast int_cast
a : ℚ
x : K'
⊢ f ((fun x x_1 => x • x_1) a x) = f (↑a * x)
[PROOFSTEP]
erw [qsmul, mul, Rat.smul_def, rat_cast]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹⁶ : Field K
K' : Type ?u.64255
inst✝¹⁵ : Zero K'
inst✝¹⁴ : Mul K'
inst✝¹³ : Add K'
inst✝¹² : Neg K'
inst✝¹¹ : Sub K'
inst✝¹⁰ : One K'
inst✝⁹ : Inv K'
inst✝⁸ : Div K'
inst✝⁷ : SMul ℕ K'
inst✝⁶ : SMul ℤ K'
inst✝⁵ : SMul ℚ K'
inst✝⁴ : Pow K' ℕ
inst✝³ : Pow K' ℤ
inst✝² : NatCast K'
inst✝¹ : IntCast K'
inst✝ : RatCast K'
f : K' → K
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : K'), f (x + y) = f x + f y
mul : ∀ (x y : K'), f (x * y) = f x * f y
neg : ∀ (x : K'), f (-x) = -f x
sub : ∀ (x y : K'), f (x - y) = f x - f y
inv : ∀ (x : K'), f x⁻¹ = (f x)⁻¹
div : ∀ (x y : K'), f (x / y) = f x / f y
nsmul : ∀ (x : K') (n : ℕ), f (n • x) = n • f x
zsmul : ∀ (x : K') (n : ℤ), f (n • x) = n • f x
qsmul : ∀ (x : K') (n : ℚ), f (n • x) = n • f x
npow : ∀ (x : K') (n : ℕ), f (x ^ n) = f x ^ n
zpow : ∀ (x : K') (n : ℤ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
int_cast : ∀ (n : ℤ), f ↑n = ↑n
rat_cast : ∀ (n : ℚ), f ↑n = ↑n
src✝¹ : CommGroupWithZero K' := Injective.commGroupWithZero f hf zero one mul inv div npow zpow
src✝ : CommRing K' := Injective.commRing f hf zero one add mul neg sub nsmul zsmul npow nat_cast int_cast
a : ℤ
b : ℕ
h1 : b ≠ 0
h2 : Nat.coprime (Int.natAbs a) b
⊢ f ↑(Rat.mk' a b) = f (↑a * (↑b)⁻¹)
[PROOFSTEP]
erw [rat_cast, mul, inv, int_cast, nat_cast]
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹⁶ : Field K
K' : Type ?u.64255
inst✝¹⁵ : Zero K'
inst✝¹⁴ : Mul K'
inst✝¹³ : Add K'
inst✝¹² : Neg K'
inst✝¹¹ : Sub K'
inst✝¹⁰ : One K'
inst✝⁹ : Inv K'
inst✝⁸ : Div K'
inst✝⁷ : SMul ℕ K'
inst✝⁶ : SMul ℤ K'
inst✝⁵ : SMul ℚ K'
inst✝⁴ : Pow K' ℕ
inst✝³ : Pow K' ℤ
inst✝² : NatCast K'
inst✝¹ : IntCast K'
inst✝ : RatCast K'
f : K' → K
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : K'), f (x + y) = f x + f y
mul : ∀ (x y : K'), f (x * y) = f x * f y
neg : ∀ (x : K'), f (-x) = -f x
sub : ∀ (x y : K'), f (x - y) = f x - f y
inv : ∀ (x : K'), f x⁻¹ = (f x)⁻¹
div : ∀ (x y : K'), f (x / y) = f x / f y
nsmul : ∀ (x : K') (n : ℕ), f (n • x) = n • f x
zsmul : ∀ (x : K') (n : ℤ), f (n • x) = n • f x
qsmul : ∀ (x : K') (n : ℚ), f (n • x) = n • f x
npow : ∀ (x : K') (n : ℕ), f (x ^ n) = f x ^ n
zpow : ∀ (x : K') (n : ℤ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
int_cast : ∀ (n : ℤ), f ↑n = ↑n
rat_cast : ∀ (n : ℚ), f ↑n = ↑n
src✝¹ : CommGroupWithZero K' := Injective.commGroupWithZero f hf zero one mul inv div npow zpow
src✝ : CommRing K' := Injective.commRing f hf zero one add mul neg sub nsmul zsmul npow nat_cast int_cast
a : ℤ
b : ℕ
h1 : b ≠ 0
h2 : Nat.coprime (Int.natAbs a) b
⊢ ↑(Rat.mk' a b) = ↑a * (↑b)⁻¹
[PROOFSTEP]
exact DivisionRing.ratCast_mk a b h1 h2
[GOAL]
α : Type u_1
β : Type u_2
K : Type u_3
inst✝¹⁶ : Field K
K' : Type ?u.64255
inst✝¹⁵ : Zero K'
inst✝¹⁴ : Mul K'
inst✝¹³ : Add K'
inst✝¹² : Neg K'
inst✝¹¹ : Sub K'
inst✝¹⁰ : One K'
inst✝⁹ : Inv K'
inst✝⁸ : Div K'
inst✝⁷ : SMul ℕ K'
inst✝⁶ : SMul ℤ K'
inst✝⁵ : SMul ℚ K'
inst✝⁴ : Pow K' ℕ
inst✝³ : Pow K' ℤ
inst✝² : NatCast K'
inst✝¹ : IntCast K'
inst✝ : RatCast K'
f : K' → K
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : K'), f (x + y) = f x + f y
mul : ∀ (x y : K'), f (x * y) = f x * f y
neg : ∀ (x : K'), f (-x) = -f x
sub : ∀ (x y : K'), f (x - y) = f x - f y
inv : ∀ (x : K'), f x⁻¹ = (f x)⁻¹
div : ∀ (x y : K'), f (x / y) = f x / f y
nsmul : ∀ (x : K') (n : ℕ), f (n • x) = n • f x
zsmul : ∀ (x : K') (n : ℤ), f (n • x) = n • f x
qsmul : ∀ (x : K') (n : ℚ), f (n • x) = n • f x
npow : ∀ (x : K') (n : ℕ), f (x ^ n) = f x ^ n
zpow : ∀ (x : K') (n : ℤ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
int_cast : ∀ (n : ℤ), f ↑n = ↑n
rat_cast : ∀ (n : ℚ), f ↑n = ↑n
src✝¹ : CommGroupWithZero K' := Injective.commGroupWithZero f hf zero one mul inv div npow zpow
src✝ : CommRing K' := Injective.commRing f hf zero one add mul neg sub nsmul zsmul npow nat_cast int_cast
a : ℚ
x : K'
⊢ f ((fun x x_1 => x • x_1) a x) = f (↑a * x)
[PROOFSTEP]
erw [qsmul, mul, Rat.smul_def, rat_cast]


[GOAL]
α : Sort ?u.352
p q : Prop
s : α → Prop
⊢ ¬p ∧ q ∨ ¬¬p ∧ ¬q ↔ p ∧ ¬q ∨ ¬p ∧ q
[PROOFSTEP]
rw [not_not, or_comm]


[GOAL]
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f : X → Y
s : Set X
t : Set Y
h : ∀ (x : X), x ∈ s → ∃ e, x ∈ e.source ∧ ∀ (y : X), y ∈ e.source → f y = ↑e y
⊢ IsLocallyHomeomorphOn f s
[PROOFSTEP]
intro x hx
[GOAL]
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f : X → Y
s : Set X
t : Set Y
h : ∀ (x : X), x ∈ s → ∃ e, x ∈ e.source ∧ ∀ (y : X), y ∈ e.source → f y = ↑e y
x : X
hx : x ∈ s
⊢ ∃ e, x ∈ e.source ∧ f = ↑e
[PROOFSTEP]
obtain ⟨e, hx, he⟩ := h x hx
[GOAL]
case intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f : X → Y
s : Set X
t : Set Y
h : ∀ (x : X), x ∈ s → ∃ e, x ∈ e.source ∧ ∀ (y : X), y ∈ e.source → f y = ↑e y
x : X
hx✝ : x ∈ s
e : LocalHomeomorph X Y
hx : x ∈ e.source
he : ∀ (y : X), y ∈ e.source → f y = ↑e y
⊢ ∃ e, x ∈ e.source ∧ f = ↑e
[PROOFSTEP]
exact
  ⟨{ e with
      toFun := f
      map_source' := fun x hx => by rw [he x hx]; exact e.map_source' hx
      left_inv' := fun x hx => by rw [he x hx]; exact e.left_inv' hx
      right_inv' := fun y hy => by rw [he _ (e.map_target' hy)]; exact e.right_inv' hy
      continuous_toFun := (continuousOn_congr he).mpr e.continuous_toFun },
    hx, rfl⟩
[GOAL]
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f : X → Y
s : Set X
t : Set Y
h : ∀ (x : X), x ∈ s → ∃ e, x ∈ e.source ∧ ∀ (y : X), y ∈ e.source → f y = ↑e y
x✝ : X
hx✝¹ : x✝ ∈ s
e : LocalHomeomorph X Y
hx✝ : x✝ ∈ e.source
he : ∀ (y : X), y ∈ e.source → f y = ↑e y
x : X
hx : x ∈ e.source
⊢ f x ∈ e.target
[PROOFSTEP]
rw [he x hx]
[GOAL]
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f : X → Y
s : Set X
t : Set Y
h : ∀ (x : X), x ∈ s → ∃ e, x ∈ e.source ∧ ∀ (y : X), y ∈ e.source → f y = ↑e y
x✝ : X
hx✝¹ : x✝ ∈ s
e : LocalHomeomorph X Y
hx✝ : x✝ ∈ e.source
he : ∀ (y : X), y ∈ e.source → f y = ↑e y
x : X
hx : x ∈ e.source
⊢ ↑e x ∈ e.target
[PROOFSTEP]
exact e.map_source' hx
[GOAL]
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f : X → Y
s : Set X
t : Set Y
h : ∀ (x : X), x ∈ s → ∃ e, x ∈ e.source ∧ ∀ (y : X), y ∈ e.source → f y = ↑e y
x✝ : X
hx✝¹ : x✝ ∈ s
e : LocalHomeomorph X Y
hx✝ : x✝ ∈ e.source
he : ∀ (y : X), y ∈ e.source → f y = ↑e y
x : X
hx : x ∈ e.source
⊢ LocalEquiv.invFun e.toLocalEquiv (f x) = x
[PROOFSTEP]
rw [he x hx]
[GOAL]
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f : X → Y
s : Set X
t : Set Y
h : ∀ (x : X), x ∈ s → ∃ e, x ∈ e.source ∧ ∀ (y : X), y ∈ e.source → f y = ↑e y
x✝ : X
hx✝¹ : x✝ ∈ s
e : LocalHomeomorph X Y
hx✝ : x✝ ∈ e.source
he : ∀ (y : X), y ∈ e.source → f y = ↑e y
x : X
hx : x ∈ e.source
⊢ LocalEquiv.invFun e.toLocalEquiv (↑e x) = x
[PROOFSTEP]
exact e.left_inv' hx
[GOAL]
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f : X → Y
s : Set X
t : Set Y
h : ∀ (x : X), x ∈ s → ∃ e, x ∈ e.source ∧ ∀ (y : X), y ∈ e.source → f y = ↑e y
x : X
hx✝ : x ∈ s
e : LocalHomeomorph X Y
hx : x ∈ e.source
he : ∀ (y : X), y ∈ e.source → f y = ↑e y
y : Y
hy : y ∈ e.target
⊢ f (LocalEquiv.invFun e.toLocalEquiv y) = y
[PROOFSTEP]
rw [he _ (e.map_target' hy)]
[GOAL]
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f : X → Y
s : Set X
t : Set Y
h : ∀ (x : X), x ∈ s → ∃ e, x ∈ e.source ∧ ∀ (y : X), y ∈ e.source → f y = ↑e y
x : X
hx✝ : x ∈ s
e : LocalHomeomorph X Y
hx : x ∈ e.source
he : ∀ (y : X), y ∈ e.source → f y = ↑e y
y : Y
hy : y ∈ e.target
⊢ ↑e (LocalEquiv.invFun e.toLocalEquiv y) = y
[PROOFSTEP]
exact e.right_inv' hy
[GOAL]
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f : X → Y
s : Set X
t : Set Y
hg : IsLocallyHomeomorphOn g t
hf : IsLocallyHomeomorphOn f s
h : Set.MapsTo f s t
⊢ IsLocallyHomeomorphOn (g ∘ f) s
[PROOFSTEP]
intro x hx
[GOAL]
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f : X → Y
s : Set X
t : Set Y
hg : IsLocallyHomeomorphOn g t
hf : IsLocallyHomeomorphOn f s
h : Set.MapsTo f s t
x : X
hx : x ∈ s
⊢ ∃ e, x ∈ e.source ∧ g ∘ f = ↑e
[PROOFSTEP]
obtain ⟨eg, hxg, rfl⟩ := hg (f x) (h hx)
[GOAL]
case intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : X → Y
s : Set X
t : Set Y
hf : IsLocallyHomeomorphOn f s
h : Set.MapsTo f s t
x : X
hx : x ∈ s
eg : LocalHomeomorph Y Z
hxg : f x ∈ eg.source
hg : IsLocallyHomeomorphOn (↑eg) t
⊢ ∃ e, x ∈ e.source ∧ ↑eg ∘ f = ↑e
[PROOFSTEP]
obtain ⟨ef, hxf, rfl⟩ := hf x hx
[GOAL]
case intro.intro.intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
s : Set X
t : Set Y
x : X
hx : x ∈ s
eg : LocalHomeomorph Y Z
hg : IsLocallyHomeomorphOn (↑eg) t
ef : LocalHomeomorph X Y
hxf : x ∈ ef.source
hf : IsLocallyHomeomorphOn (↑ef) s
h : Set.MapsTo (↑ef) s t
hxg : ↑ef x ∈ eg.source
⊢ ∃ e, x ∈ e.source ∧ ↑eg ∘ ↑ef = ↑e
[PROOFSTEP]
exact ⟨ef.trans eg, ⟨hxf, hxg⟩, rfl⟩
[GOAL]
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f : X → Y
s : Set X
t : Set Y
⊢ IsLocallyHomeomorph f ↔ IsLocallyHomeomorphOn f Set.univ
[PROOFSTEP]
simp only [IsLocallyHomeomorph, IsLocallyHomeomorphOn, Set.mem_univ, forall_true_left]


[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝¹ : LinearOrderedRing α
inst✝ : FloorRing α
b : ℤ
⊢ b ≤ ⌊↑(b + 1)⌋
[PROOFSTEP]
rw [floor_intCast]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝¹ : LinearOrderedRing α
inst✝ : FloorRing α
b : ℤ
⊢ b ≤ b + 1
[PROOFSTEP]
exact (lt_add_one _).le
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝¹ : LinearOrderedRing α
inst✝ : FloorRing α
b : ℤ
⊢ ⌈↑(b - 1)⌉ ≤ b
[PROOFSTEP]
rw [ceil_intCast]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝¹ : LinearOrderedRing α
inst✝ : FloorRing α
b : ℤ
⊢ b - 1 ≤ b
[PROOFSTEP]
exact (sub_one_lt _).le
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
n : ℤ
⊢ Tendsto floor (𝓝[Ici ↑n] ↑n) (pure n)
[PROOFSTEP]
simpa only [floor_intCast] using
  tendsto_floor_right_pure_floor
    (n : α)
      -- porting note: new theorem
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
n : ℤ
⊢ Tendsto ceil (𝓝[Iic ↑n] ↑n) (pure n)
[PROOFSTEP]
simpa only [ceil_intCast] using
  tendsto_ceil_left_pure_ceil
    (n : α)
      -- porting note: new theorem
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
x : α
⊢ ↑(⌈x⌉ - 1) < x
[PROOFSTEP]
rw [cast_sub, cast_one, sub_lt_iff_lt_add]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
x : α
⊢ ↑⌈x⌉ < x + 1
[PROOFSTEP]
exact ceil_lt_add_one _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
x : α
h₁ : ↑(⌈x⌉ - 1) < x
⊢ x ≤ ↑(⌈x⌉ - 1) + 1
[PROOFSTEP]
rw [cast_sub, cast_one, sub_add_cancel]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
x : α
h₁ : ↑(⌈x⌉ - 1) < x
⊢ x ≤ ↑⌈x⌉
[PROOFSTEP]
exact le_ceil _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
n : ℤ
⊢ Tendsto floor (𝓝[Iio ↑n] ↑n) (pure (n - 1))
[PROOFSTEP]
simpa only [ceil_intCast] using
  tendsto_floor_left_pure_ceil_sub_one
    (n : α)
      -- porting note: new theorem
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
x : α
⊢ ↑(⌊x⌋ + 1) - 1 ≤ x
[PROOFSTEP]
rw [cast_add, cast_one, add_sub_cancel]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
x : α
⊢ ↑⌊x⌋ ≤ x
[PROOFSTEP]
exact floor_le _
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
n : ℤ
⊢ Tendsto ceil (𝓝[Ioi ↑n] ↑n) (pure (n + 1))
[PROOFSTEP]
simpa only [floor_intCast] using tendsto_ceil_right_pure_floor_add_one (n : α)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
n : ℤ
⊢ pure (IntCast.intCast (n - 1)) ≤ 𝓝[Iic (↑n - 1)] (↑n - 1)
[PROOFSTEP]
rw [← @cast_one α, ← cast_sub]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
n : ℤ
⊢ pure (IntCast.intCast (n - 1)) ≤ 𝓝[Iic ↑(n - 1)] ↑(n - 1)
[PROOFSTEP]
exact pure_le_nhdsWithin le_rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
n : ℤ
⊢ pure (IntCast.intCast (n + 1)) ≤ 𝓝[Ici (↑n + 1)] (↑n + 1)
[PROOFSTEP]
rw [← @cast_one α, ← cast_add]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : LinearOrderedRing α
inst✝² : FloorRing α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
n : ℤ
⊢ pure (IntCast.intCast (n + 1)) ≤ 𝓝[Ici ↑(n + 1)] ↑(n + 1)
[PROOFSTEP]
exact pure_le_nhdsWithin le_rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁴ : LinearOrderedRing α
inst✝³ : FloorRing α
inst✝² : TopologicalSpace α
inst✝¹ : OrderClosedTopology α
inst✝ : TopologicalAddGroup α
n : ℤ
⊢ Tendsto fract (𝓝[Iio ↑n] ↑n) (𝓝 1)
[PROOFSTEP]
rw [← sub_sub_cancel (n : α) 1]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁴ : LinearOrderedRing α
inst✝³ : FloorRing α
inst✝² : TopologicalSpace α
inst✝¹ : OrderClosedTopology α
inst✝ : TopologicalAddGroup α
n : ℤ
⊢ Tendsto fract (𝓝[Iio ↑n] ↑n) (𝓝 (↑n - (↑n - 1)))
[PROOFSTEP]
refine (tendsto_id.mono_left nhdsWithin_le_nhds).sub ?_
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁴ : LinearOrderedRing α
inst✝³ : FloorRing α
inst✝² : TopologicalSpace α
inst✝¹ : OrderClosedTopology α
inst✝ : TopologicalAddGroup α
n : ℤ
⊢ Tendsto (fun x => ↑⌊x⌋) (𝓝[Iio ↑n] ↑n) (𝓝 (↑n - 1))
[PROOFSTEP]
exact tendsto_floor_left' n
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
⊢ Continuous fun st => f st.fst (fract st.snd)
[PROOFSTEP]
change Continuous (uncurry f ∘ Prod.map id fract)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
⊢ Continuous (uncurry f ∘ Prod.map id fract)
[PROOFSTEP]
rw [continuous_iff_continuousAt]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
⊢ ∀ (x : β × α), ContinuousAt (uncurry f ∘ Prod.map id fract) x
[PROOFSTEP]
rintro ⟨s, t⟩
[GOAL]
case mk
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
s : β
t : α
⊢ ContinuousAt (uncurry f ∘ Prod.map id fract) (s, t)
[PROOFSTEP]
rcases em (∃ n : ℤ, t = n) with (⟨n, rfl⟩ | ht)
[GOAL]
case mk.inl.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
s : β
n : ℤ
⊢ ContinuousAt (uncurry f ∘ Prod.map id fract) (s, ↑n)
[PROOFSTEP]
rw [ContinuousAt, nhds_prod_eq, ← nhds_left'_sup_nhds_right (n : α), prod_sup, tendsto_sup]
[GOAL]
case mk.inl.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
s : β
n : ℤ
⊢ Tendsto (uncurry f ∘ Prod.map id fract) (𝓝 s ×ˢ 𝓝[Iio ↑n] ↑n) (𝓝 ((uncurry f ∘ Prod.map id fract) (s, ↑n))) ∧
    Tendsto (uncurry f ∘ Prod.map id fract) (𝓝 s ×ˢ 𝓝[Ici ↑n] ↑n) (𝓝 ((uncurry f ∘ Prod.map id fract) (s, ↑n)))
[PROOFSTEP]
constructor
[GOAL]
case mk.inl.intro.left
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
s : β
n : ℤ
⊢ Tendsto (uncurry f ∘ Prod.map id fract) (𝓝 s ×ˢ 𝓝[Iio ↑n] ↑n) (𝓝 ((uncurry f ∘ Prod.map id fract) (s, ↑n)))
[PROOFSTEP]
refine
  (((h (s, 1) ⟨trivial, zero_le_one, le_rfl⟩).tendsto.mono_left ?_).comp
        (tendsto_id.prod_map (tendsto_fract_left _))).mono_right
    (le_of_eq ?_)
[GOAL]
case mk.inl.intro.left.refine_1
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
s : β
n : ℤ
⊢ 𝓝 s ×ˢ 𝓝[Iio 1] 1 ≤ 𝓝[univ ×ˢ Icc 0 1] (s, 1)
[PROOFSTEP]
rw [nhdsWithin_prod_eq, nhdsWithin_univ, ← nhdsWithin_Ico_eq_nhdsWithin_Iio one_pos]
[GOAL]
case mk.inl.intro.left.refine_1
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
s : β
n : ℤ
⊢ 𝓝 s ×ˢ 𝓝[Ico 0 1] 1 ≤ 𝓝 s ×ˢ 𝓝[Icc 0 1] 1
[PROOFSTEP]
exact Filter.prod_mono le_rfl (nhdsWithin_mono _ Ico_subset_Icc_self)
[GOAL]
case mk.inl.intro.left.refine_2
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
s : β
n : ℤ
⊢ 𝓝 (uncurry f (s, 1)) = 𝓝 ((uncurry f ∘ Prod.map id fract) (s, ↑n))
[PROOFSTEP]
simp [hf]
[GOAL]
case mk.inl.intro.right
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
s : β
n : ℤ
⊢ Tendsto (uncurry f ∘ Prod.map id fract) (𝓝 s ×ˢ 𝓝[Ici ↑n] ↑n) (𝓝 ((uncurry f ∘ Prod.map id fract) (s, ↑n)))
[PROOFSTEP]
refine
  (((h (s, 0) ⟨trivial, le_rfl, zero_le_one⟩).tendsto.mono_left <| le_of_eq ?_).comp
        (tendsto_id.prod_map (tendsto_fract_right _))).mono_right
    (le_of_eq ?_)
[GOAL]
case mk.inl.intro.right.refine_1
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
s : β
n : ℤ
⊢ 𝓝 s ×ˢ 𝓝[Ici 0] 0 = 𝓝[univ ×ˢ Icc 0 1] (s, 0)
[PROOFSTEP]
simp [nhdsWithin_prod_eq, nhdsWithin_univ]
[GOAL]
case mk.inl.intro.right.refine_2
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
s : β
n : ℤ
⊢ 𝓝 (uncurry f (s, 0)) = 𝓝 ((uncurry f ∘ Prod.map id fract) (s, ↑n))
[PROOFSTEP]
simp [nhdsWithin_prod_eq, nhdsWithin_univ]
[GOAL]
case mk.inr
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
s : β
t : α
ht : ¬∃ n, t = ↑n
⊢ ContinuousAt (uncurry f ∘ Prod.map id fract) (s, t)
[PROOFSTEP]
replace ht : t ≠ ⌊t⌋ := fun ht' => ht ⟨_, ht'⟩
[GOAL]
case mk.inr
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
s : β
t : α
ht : t ≠ ↑⌊t⌋
⊢ ContinuousAt (uncurry f ∘ Prod.map id fract) (s, t)
[PROOFSTEP]
refine (h.continuousAt ?_).comp (continuousAt_id.prod_map (continuousAt_fract ht))
[GOAL]
case mk.inr
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : LinearOrderedRing α
inst✝⁴ : FloorRing α
inst✝³ : TopologicalSpace α
inst✝² : OrderTopology α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : β → α → γ
h : ContinuousOn (uncurry f) (univ ×ˢ Icc 0 1)
hf : ∀ (s : β), f s 0 = f s 1
s : β
t : α
ht : t ≠ ↑⌊t⌋
⊢ univ ×ˢ Icc 0 1 ∈ 𝓝 (Prod.map id fract (s, t))
[PROOFSTEP]
exact prod_mem_nhds univ_mem (Icc_mem_nhds (fract_pos.2 ht) (fract_lt_one _))


[GOAL]
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
⊢ IsNoetherian K V ↔ Module.rank K V < ℵ₀
[PROOFSTEP]
let b := Basis.ofVectorSpace K V
[GOAL]
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
b : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
⊢ IsNoetherian K V ↔ Module.rank K V < ℵ₀
[PROOFSTEP]
rw [← b.mk_eq_rank'', lt_aleph0_iff_set_finite]
[GOAL]
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
b : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
⊢ IsNoetherian K V ↔ Set.Finite (Basis.ofVectorSpaceIndex K V)
[PROOFSTEP]
constructor
[GOAL]
case mp
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
b : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
⊢ IsNoetherian K V → Set.Finite (Basis.ofVectorSpaceIndex K V)
[PROOFSTEP]
intro
[GOAL]
case mp
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
b : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
a✝ : IsNoetherian K V
⊢ Set.Finite (Basis.ofVectorSpaceIndex K V)
[PROOFSTEP]
exact finite_of_linearIndependent (Basis.ofVectorSpaceIndex.linearIndependent K V)
[GOAL]
case mpr
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
b : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
⊢ Set.Finite (Basis.ofVectorSpaceIndex K V) → IsNoetherian K V
[PROOFSTEP]
intro hbfinite
[GOAL]
case mpr
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
b : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hbfinite : Set.Finite (Basis.ofVectorSpaceIndex K V)
⊢ IsNoetherian K V
[PROOFSTEP]
refine' @isNoetherian_of_linearEquiv K (⊤ : Submodule K V) V _ _ _ _ _ (LinearEquiv.ofTop _ rfl) (id _)
[GOAL]
case mpr
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
b : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hbfinite : Set.Finite (Basis.ofVectorSpaceIndex K V)
⊢ IsNoetherian K { x // x ∈ ⊤ }
[PROOFSTEP]
refine' isNoetherian_of_fg_of_noetherian _ ⟨Set.Finite.toFinset hbfinite, _⟩
[GOAL]
case mpr
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
b : Basis (↑(Basis.ofVectorSpaceIndex K V)) K V := Basis.ofVectorSpace K V
hbfinite : Set.Finite (Basis.ofVectorSpaceIndex K V)
⊢ span K ↑(Set.Finite.toFinset hbfinite) = ⊤
[PROOFSTEP]
rw [Set.Finite.coe_toFinset, ← b.span_eq, Basis.coe_ofVectorSpace, Subtype.range_coe]
[GOAL]
K : Type u
V : Type v
inst✝³ : DivisionRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : IsNoetherian K V
⊢ ↑(Basis.ofVectorSpaceIndex K V) ≃ { x // x ∈ finsetBasisIndex K V }
[PROOFSTEP]
rw [coeSort_finsetBasisIndex]
[GOAL]
K : Type u
V : Type v
inst✝³ : DivisionRing K
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : IsNoetherian K V
⊢ Set.range ↑(finsetBasis K V) = Basis.ofVectorSpaceIndex K V
[PROOFSTEP]
rw [finsetBasis, Basis.range_reindex, Basis.range_ofVectorSpace]
[GOAL]
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
⊢ IsNoetherian K V ↔ Module.Finite K V
[PROOFSTEP]
constructor
[GOAL]
case mp
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
⊢ IsNoetherian K V → Module.Finite K V
[PROOFSTEP]
intro h
[GOAL]
case mp
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
h : IsNoetherian K V
⊢ Module.Finite K V
[PROOFSTEP]
exact
  ⟨⟨finsetBasisIndex K V, by
      convert (finsetBasis K V).span_eq
      simp⟩⟩
[GOAL]
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
h : IsNoetherian K V
⊢ span K ↑(finsetBasisIndex K V) = ⊤
[PROOFSTEP]
convert (finsetBasis K V).span_eq
[GOAL]
case h.e'_2.h.e'_6
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
h : IsNoetherian K V
⊢ ↑(finsetBasisIndex K V) = Set.range ↑(finsetBasis K V)
[PROOFSTEP]
simp
[GOAL]
case mpr
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
⊢ Module.Finite K V → IsNoetherian K V
[PROOFSTEP]
rintro ⟨s, hs⟩
[GOAL]
case mpr.mk.intro
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
s : Finset V
hs : span K ↑s = ⊤
⊢ IsNoetherian K V
[PROOFSTEP]
rw [IsNoetherian.iff_rank_lt_aleph0, ← rank_top, ← hs]
[GOAL]
case mpr.mk.intro
K : Type u
V : Type v
inst✝² : DivisionRing K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
s : Finset V
hs : span K ↑s = ⊤
⊢ Module.rank K { x // x ∈ span K ↑s } < ℵ₀
[PROOFSTEP]
exact lt_of_le_of_lt (rank_span_le _) s.finite_toSet.lt_aleph0