[GOAL]
α : Type u
β : Type u_1
inst✝⁷ : OrderedSemiring α
inst✝⁶ : Zero β
inst✝⁵ : One β
inst✝⁴ : Add β
inst✝³ : Mul β
inst✝² : Pow β ℕ
inst✝¹ : SMul ℕ β
inst✝ : NatCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
src✝¹ : OrderedAddCommMonoid β := orderedAddCommMonoid f hf zero add nsmul
src✝ : Semiring β := Injective.semiring f hf zero one add mul nsmul npow nat_cast
⊢ f 0 ≤ f 1
[PROOFSTEP]
simp only [zero, one, zero_le_one]
[GOAL]
α : Type u
β : Type u_1
inst✝⁷ : OrderedSemiring α
inst✝⁶ : Zero β
inst✝⁵ : One β
inst✝⁴ : Add β
inst✝³ : Mul β
inst✝² : Pow β ℕ
inst✝¹ : SMul ℕ β
inst✝ : NatCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
src✝¹ : OrderedAddCommMonoid β := orderedAddCommMonoid f hf zero add nsmul
src✝ : Semiring β := Injective.semiring f hf zero one add mul nsmul npow nat_cast
a b c : β
h : a ≤ b
hc : 0 ≤ c
⊢ f (c * a) ≤ f (c * b)
[PROOFSTEP]
rw [mul, mul]
[GOAL]
α : Type u
β : Type u_1
inst✝⁷ : OrderedSemiring α
inst✝⁶ : Zero β
inst✝⁵ : One β
inst✝⁴ : Add β
inst✝³ : Mul β
inst✝² : Pow β ℕ
inst✝¹ : SMul ℕ β
inst✝ : NatCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
src✝¹ : OrderedAddCommMonoid β := orderedAddCommMonoid f hf zero add nsmul
src✝ : Semiring β := Injective.semiring f hf zero one add mul nsmul npow nat_cast
a b c : β
h : a ≤ b
hc : 0 ≤ c
⊢ f c * f a ≤ f c * f b
[PROOFSTEP]
refine' mul_le_mul_of_nonneg_left h _
[GOAL]
α : Type u
β : Type u_1
inst✝⁷ : OrderedSemiring α
inst✝⁶ : Zero β
inst✝⁵ : One β
inst✝⁴ : Add β
inst✝³ : Mul β
inst✝² : Pow β ℕ
inst✝¹ : SMul ℕ β
inst✝ : NatCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
src✝¹ : OrderedAddCommMonoid β := orderedAddCommMonoid f hf zero add nsmul
src✝ : Semiring β := Injective.semiring f hf zero one add mul nsmul npow nat_cast
a b c : β
h : a ≤ b
hc : 0 ≤ c
⊢ 0 ≤ f c
[PROOFSTEP]
rwa [← zero]
[GOAL]
α : Type u
β : Type u_1
inst✝⁷ : OrderedSemiring α
inst✝⁶ : Zero β
inst✝⁵ : One β
inst✝⁴ : Add β
inst✝³ : Mul β
inst✝² : Pow β ℕ
inst✝¹ : SMul ℕ β
inst✝ : NatCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
src✝¹ : OrderedAddCommMonoid β := orderedAddCommMonoid f hf zero add nsmul
src✝ : Semiring β := Injective.semiring f hf zero one add mul nsmul npow nat_cast
a b c : β
h : a ≤ b
hc : 0 ≤ c
⊢ f (a * c) ≤ f (b * c)
[PROOFSTEP]
rw [mul, mul]
[GOAL]
α : Type u
β : Type u_1
inst✝⁷ : OrderedSemiring α
inst✝⁶ : Zero β
inst✝⁵ : One β
inst✝⁴ : Add β
inst✝³ : Mul β
inst✝² : Pow β ℕ
inst✝¹ : SMul ℕ β
inst✝ : NatCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
src✝¹ : OrderedAddCommMonoid β := orderedAddCommMonoid f hf zero add nsmul
src✝ : Semiring β := Injective.semiring f hf zero one add mul nsmul npow nat_cast
a b c : β
h : a ≤ b
hc : 0 ≤ c
⊢ f a * f c ≤ f b * f c
[PROOFSTEP]
refine' mul_le_mul_of_nonneg_right h _
[GOAL]
α : Type u
β : Type u_1
inst✝⁷ : OrderedSemiring α
inst✝⁶ : Zero β
inst✝⁵ : One β
inst✝⁴ : Add β
inst✝³ : Mul β
inst✝² : Pow β ℕ
inst✝¹ : SMul ℕ β
inst✝ : NatCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
src✝¹ : OrderedAddCommMonoid β := orderedAddCommMonoid f hf zero add nsmul
src✝ : Semiring β := Injective.semiring f hf zero one add mul nsmul npow nat_cast
a b c : β
h : a ≤ b
hc : 0 ≤ c
⊢ 0 ≤ f c
[PROOFSTEP]
rwa [← zero]
[GOAL]
α : Type u
β : Type u_1
inst✝¹¹ : OrderedRing α
inst✝¹⁰ : Zero β
inst✝⁹ : One β
inst✝⁸ : Add β
inst✝⁷ : Mul β
inst✝⁶ : Neg β
inst✝⁵ : Sub β
inst✝⁴ : SMul ℕ β
inst✝³ : SMul ℤ β
inst✝² : Pow β ℕ
inst✝¹ : NatCast β
inst✝ : IntCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
neg : ∀ (x : β), f (-x) = -f x
sub : ∀ (x y : β), f (x - y) = f x - f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
zsmul : ∀ (x : β) (n : ℤ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
int_cast : ∀ (n : ℤ), f ↑n = ↑n
src✝¹ : OrderedSemiring β := Injective.orderedSemiring f hf zero one add mul nsmul npow nat_cast
src✝ : Ring β := Injective.ring f hf zero one add mul neg sub nsmul zsmul npow nat_cast int_cast
a b : β
ha : 0 ≤ a
hb : 0 ≤ b
⊢ f 0 ≤ f (a * b)
[PROOFSTEP]
rw [zero, mul]
[GOAL]
α : Type u
β : Type u_1
inst✝¹¹ : OrderedRing α
inst✝¹⁰ : Zero β
inst✝⁹ : One β
inst✝⁸ : Add β
inst✝⁷ : Mul β
inst✝⁶ : Neg β
inst✝⁵ : Sub β
inst✝⁴ : SMul ℕ β
inst✝³ : SMul ℤ β
inst✝² : Pow β ℕ
inst✝¹ : NatCast β
inst✝ : IntCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
neg : ∀ (x : β), f (-x) = -f x
sub : ∀ (x y : β), f (x - y) = f x - f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
zsmul : ∀ (x : β) (n : ℤ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
int_cast : ∀ (n : ℤ), f ↑n = ↑n
src✝¹ : OrderedSemiring β := Injective.orderedSemiring f hf zero one add mul nsmul npow nat_cast
src✝ : Ring β := Injective.ring f hf zero one add mul neg sub nsmul zsmul npow nat_cast int_cast
a b : β
ha : 0 ≤ a
hb : 0 ≤ b
⊢ 0 ≤ f a * f b
[PROOFSTEP]
apply mul_nonneg
[GOAL]
case ha
α : Type u
β : Type u_1
inst✝¹¹ : OrderedRing α
inst✝¹⁰ : Zero β
inst✝⁹ : One β
inst✝⁸ : Add β
inst✝⁷ : Mul β
inst✝⁶ : Neg β
inst✝⁵ : Sub β
inst✝⁴ : SMul ℕ β
inst✝³ : SMul ℤ β
inst✝² : Pow β ℕ
inst✝¹ : NatCast β
inst✝ : IntCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
neg : ∀ (x : β), f (-x) = -f x
sub : ∀ (x y : β), f (x - y) = f x - f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
zsmul : ∀ (x : β) (n : ℤ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
int_cast : ∀ (n : ℤ), f ↑n = ↑n
src✝¹ : OrderedSemiring β := Injective.orderedSemiring f hf zero one add mul nsmul npow nat_cast
src✝ : Ring β := Injective.ring f hf zero one add mul neg sub nsmul zsmul npow nat_cast int_cast
a b : β
ha : 0 ≤ a
hb : 0 ≤ b
⊢ 0 ≤ f a
[PROOFSTEP]
rwa [← zero]
[GOAL]
case hb
α : Type u
β : Type u_1
inst✝¹¹ : OrderedRing α
inst✝¹⁰ : Zero β
inst✝⁹ : One β
inst✝⁸ : Add β
inst✝⁷ : Mul β
inst✝⁶ : Neg β
inst✝⁵ : Sub β
inst✝⁴ : SMul ℕ β
inst✝³ : SMul ℤ β
inst✝² : Pow β ℕ
inst✝¹ : NatCast β
inst✝ : IntCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
neg : ∀ (x : β), f (-x) = -f x
sub : ∀ (x y : β), f (x - y) = f x - f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
zsmul : ∀ (x : β) (n : ℤ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
int_cast : ∀ (n : ℤ), f ↑n = ↑n
src✝¹ : OrderedSemiring β := Injective.orderedSemiring f hf zero one add mul nsmul npow nat_cast
src✝ : Ring β := Injective.ring f hf zero one add mul neg sub nsmul zsmul npow nat_cast int_cast
a b : β
ha : 0 ≤ a
hb : 0 ≤ b
⊢ 0 ≤ f b
[PROOFSTEP]
rwa [← zero]
[GOAL]
α : Type u
β : Type u_1
inst✝⁷ : StrictOrderedSemiring α
inst✝⁶ : Zero β
inst✝⁵ : One β
inst✝⁴ : Add β
inst✝³ : Mul β
inst✝² : Pow β ℕ
inst✝¹ : SMul ℕ β
inst✝ : NatCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
src✝² : OrderedCancelAddCommMonoid β := orderedCancelAddCommMonoid f hf zero add nsmul
src✝¹ : OrderedSemiring β := Injective.orderedSemiring f hf zero one add mul nsmul npow nat_cast
src✝ : Nontrivial β := pullback_nonzero f zero one
a b c : β
h : a < b
hc : 0 < c
⊢ f (c * a) < f (c * b)
[PROOFSTEP]
simpa only [mul, zero] using mul_lt_mul_of_pos_left ‹f a < f b› (by rwa [← zero])
[GOAL]
α : Type u
β : Type u_1
inst✝⁷ : StrictOrderedSemiring α
inst✝⁶ : Zero β
inst✝⁵ : One β
inst✝⁴ : Add β
inst✝³ : Mul β
inst✝² : Pow β ℕ
inst✝¹ : SMul ℕ β
inst✝ : NatCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
src✝² : OrderedCancelAddCommMonoid β := orderedCancelAddCommMonoid f hf zero add nsmul
src✝¹ : OrderedSemiring β := Injective.orderedSemiring f hf zero one add mul nsmul npow nat_cast
src✝ : Nontrivial β := pullback_nonzero f zero one
a b c : β
h : a < b
hc : 0 < c
⊢ 0 < f c
[PROOFSTEP]
rwa [← zero]
[GOAL]
α : Type u
β : Type u_1
inst✝⁷ : StrictOrderedSemiring α
inst✝⁶ : Zero β
inst✝⁵ : One β
inst✝⁴ : Add β
inst✝³ : Mul β
inst✝² : Pow β ℕ
inst✝¹ : SMul ℕ β
inst✝ : NatCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
src✝² : OrderedCancelAddCommMonoid β := orderedCancelAddCommMonoid f hf zero add nsmul
src✝¹ : OrderedSemiring β := Injective.orderedSemiring f hf zero one add mul nsmul npow nat_cast
src✝ : Nontrivial β := pullback_nonzero f zero one
a b c : β
h : a < b
hc : 0 < c
⊢ f (a * c) < f (b * c)
[PROOFSTEP]
simpa only [mul, zero] using mul_lt_mul_of_pos_right ‹f a < f b› (by rwa [← zero])
[GOAL]
α : Type u
β : Type u_1
inst✝⁷ : StrictOrderedSemiring α
inst✝⁶ : Zero β
inst✝⁵ : One β
inst✝⁴ : Add β
inst✝³ : Mul β
inst✝² : Pow β ℕ
inst✝¹ : SMul ℕ β
inst✝ : NatCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
src✝² : OrderedCancelAddCommMonoid β := orderedCancelAddCommMonoid f hf zero add nsmul
src✝¹ : OrderedSemiring β := Injective.orderedSemiring f hf zero one add mul nsmul npow nat_cast
src✝ : Nontrivial β := pullback_nonzero f zero one
a b c : β
h : a < b
hc : 0 < c
⊢ 0 < f c
[PROOFSTEP]
rwa [← zero]
[GOAL]
α : Type u
β : Type u_1
inst✝¹¹ : StrictOrderedRing α
inst✝¹⁰ : Zero β
inst✝⁹ : One β
inst✝⁸ : Add β
inst✝⁷ : Mul β
inst✝⁶ : Neg β
inst✝⁵ : Sub β
inst✝⁴ : SMul ℕ β
inst✝³ : SMul ℤ β
inst✝² : Pow β ℕ
inst✝¹ : NatCast β
inst✝ : IntCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
neg : ∀ (x : β), f (-x) = -f x
sub : ∀ (x y : β), f (x - y) = f x - f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
zsmul : ∀ (x : β) (n : ℤ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
int_cast : ∀ (n : ℤ), f ↑n = ↑n
src✝¹ : StrictOrderedSemiring β := Injective.strictOrderedSemiring f hf zero one add mul nsmul npow nat_cast
src✝ : Ring β := Injective.ring f hf zero one add mul neg sub nsmul zsmul npow nat_cast int_cast
a b : β
a0 : 0 < a
b0 : 0 < b
⊢ f 0 < f (a * b)
[PROOFSTEP]
rw [zero, mul]
[GOAL]
α : Type u
β : Type u_1
inst✝¹¹ : StrictOrderedRing α
inst✝¹⁰ : Zero β
inst✝⁹ : One β
inst✝⁸ : Add β
inst✝⁷ : Mul β
inst✝⁶ : Neg β
inst✝⁵ : Sub β
inst✝⁴ : SMul ℕ β
inst✝³ : SMul ℤ β
inst✝² : Pow β ℕ
inst✝¹ : NatCast β
inst✝ : IntCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
neg : ∀ (x : β), f (-x) = -f x
sub : ∀ (x y : β), f (x - y) = f x - f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
zsmul : ∀ (x : β) (n : ℤ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
int_cast : ∀ (n : ℤ), f ↑n = ↑n
src✝¹ : StrictOrderedSemiring β := Injective.strictOrderedSemiring f hf zero one add mul nsmul npow nat_cast
src✝ : Ring β := Injective.ring f hf zero one add mul neg sub nsmul zsmul npow nat_cast int_cast
a b : β
a0 : 0 < a
b0 : 0 < b
⊢ 0 < f a * f b
[PROOFSTEP]
apply mul_pos
[GOAL]
case ha
α : Type u
β : Type u_1
inst✝¹¹ : StrictOrderedRing α
inst✝¹⁰ : Zero β
inst✝⁹ : One β
inst✝⁸ : Add β
inst✝⁷ : Mul β
inst✝⁶ : Neg β
inst✝⁵ : Sub β
inst✝⁴ : SMul ℕ β
inst✝³ : SMul ℤ β
inst✝² : Pow β ℕ
inst✝¹ : NatCast β
inst✝ : IntCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
neg : ∀ (x : β), f (-x) = -f x
sub : ∀ (x y : β), f (x - y) = f x - f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
zsmul : ∀ (x : β) (n : ℤ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
int_cast : ∀ (n : ℤ), f ↑n = ↑n
src✝¹ : StrictOrderedSemiring β := Injective.strictOrderedSemiring f hf zero one add mul nsmul npow nat_cast
src✝ : Ring β := Injective.ring f hf zero one add mul neg sub nsmul zsmul npow nat_cast int_cast
a b : β
a0 : 0 < a
b0 : 0 < b
⊢ 0 < f a
[PROOFSTEP]
rwa [← zero]
[GOAL]
case hb
α : Type u
β : Type u_1
inst✝¹¹ : StrictOrderedRing α
inst✝¹⁰ : Zero β
inst✝⁹ : One β
inst✝⁸ : Add β
inst✝⁷ : Mul β
inst✝⁶ : Neg β
inst✝⁵ : Sub β
inst✝⁴ : SMul ℕ β
inst✝³ : SMul ℤ β
inst✝² : Pow β ℕ
inst✝¹ : NatCast β
inst✝ : IntCast β
f : β → α
hf : Injective f
zero : f 0 = 0
one : f 1 = 1
add : ∀ (x y : β), f (x + y) = f x + f y
mul : ∀ (x y : β), f (x * y) = f x * f y
neg : ∀ (x : β), f (-x) = -f x
sub : ∀ (x y : β), f (x - y) = f x - f y
nsmul : ∀ (x : β) (n : ℕ), f (n • x) = n • f x
zsmul : ∀ (x : β) (n : ℤ), f (n • x) = n • f x
npow : ∀ (x : β) (n : ℕ), f (x ^ n) = f x ^ n
nat_cast : ∀ (n : ℕ), f ↑n = ↑n
int_cast : ∀ (n : ℤ), f ↑n = ↑n
src✝¹ : StrictOrderedSemiring β := Injective.strictOrderedSemiring f hf zero one add mul nsmul npow nat_cast
src✝ : Ring β := Injective.ring f hf zero one add mul neg sub nsmul zsmul npow nat_cast int_cast
a b : β
a0 : 0 < a
b0 : 0 < b
⊢ 0 < f b
[PROOFSTEP]
rwa [← zero]


[GOAL]
α✝ α : Type u
inst✝ : OrderedCommGroup α
a b c : α
bc : a * b ≤ a * c
⊢ b ≤ c
[PROOFSTEP]
simpa using mul_le_mul_left' bc a⁻¹
[GOAL]
α✝ α : Type u
inst✝ : OrderedCommGroup α
a b c : α
bc : swap (fun x x_1 => x * x_1) a b ≤ swap (fun x x_1 => x * x_1) a c
⊢ b ≤ c
[PROOFSTEP]
simpa using mul_le_mul_right' bc a⁻¹
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a⁻¹ ≤ 1 ↔ 1 ≤ a
[PROOFSTEP]
rw [← mul_le_mul_iff_left a]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a * a⁻¹ ≤ a * 1 ↔ 1 ≤ a
[PROOFSTEP]
simp
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ 1 ≤ a⁻¹ ↔ a ≤ 1
[PROOFSTEP]
rw [← mul_le_mul_iff_left a]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a * 1 ≤ a * a⁻¹ ↔ a ≤ 1
[PROOFSTEP]
simp
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ b ≤ a⁻¹ * c ↔ a * b ≤ c
[PROOFSTEP]
rw [← mul_le_mul_iff_left a]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a * b ≤ a * (a⁻¹ * c) ↔ a * b ≤ c
[PROOFSTEP]
simp
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ b⁻¹ * a ≤ c ↔ a ≤ b * c
[PROOFSTEP]
rw [← mul_le_mul_iff_left b, mul_inv_cancel_left]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a * a⁻¹ ≤ a * b ↔ 1 ≤ a * b
[PROOFSTEP]
rw [mul_inv_self]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ b * a ≤ b * b⁻¹ ↔ b * a ≤ 1
[PROOFSTEP]
rw [mul_inv_self]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ 1 ≤ b⁻¹ * a ↔ b ≤ a
[PROOFSTEP]
rw [← mul_le_mul_iff_left b, mul_one, mul_inv_cancel_left]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ b ≤ a * 1 ↔ b ≤ a
[PROOFSTEP]
rw [mul_one]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ 1 < a⁻¹ ↔ a < 1
[PROOFSTEP]
rw [← mul_lt_mul_iff_left a, mul_inv_self, mul_one]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ a⁻¹ < 1 ↔ 1 < a
[PROOFSTEP]
rw [← mul_lt_mul_iff_left a, mul_inv_self, mul_one]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ b < a⁻¹ * c ↔ a * b < c
[PROOFSTEP]
rw [← mul_lt_mul_iff_left a]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ a * b < a * (a⁻¹ * c) ↔ a * b < c
[PROOFSTEP]
simp
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ b⁻¹ * a < c ↔ a < b * c
[PROOFSTEP]
rw [← mul_lt_mul_iff_left b, mul_inv_cancel_left]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ a * a⁻¹ < a * b ↔ 1 < a * b
[PROOFSTEP]
rw [mul_inv_self]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ b * a < b * b⁻¹ ↔ b * a < 1
[PROOFSTEP]
rw [mul_inv_self]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ 1 < b⁻¹ * a ↔ b < a
[PROOFSTEP]
rw [← mul_lt_mul_iff_left b, mul_one, mul_inv_cancel_left]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ b < a * 1 ↔ b < a
[PROOFSTEP]
rw [mul_one]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c : α
⊢ a⁻¹ ≤ 1 ↔ 1 ≤ a
[PROOFSTEP]
rw [← mul_le_mul_iff_right a]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c : α
⊢ a⁻¹ * a ≤ 1 * a ↔ 1 ≤ a
[PROOFSTEP]
simp
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c : α
⊢ 1 ≤ a⁻¹ ↔ a ≤ 1
[PROOFSTEP]
rw [← mul_le_mul_iff_right a]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c : α
⊢ 1 * a ≤ a⁻¹ * a ↔ a ≤ 1
[PROOFSTEP]
simp
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c : α
⊢ a⁻¹ * a ≤ b * a ↔ 1 ≤ b * a
[PROOFSTEP]
rw [inv_mul_self]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c : α
⊢ a * b ≤ b⁻¹ * b ↔ a * b ≤ 1
[PROOFSTEP]
rw [inv_mul_self]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c : α
⊢ a * b⁻¹ * b ≤ c * b ↔ a ≤ c * b
[PROOFSTEP]
rw [inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c : α
⊢ c * b ≤ a * b⁻¹ * b ↔ c * b ≤ a
[PROOFSTEP]
rw [inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c : α
⊢ a ≤ 1 * b ↔ a ≤ b
[PROOFSTEP]
rw [one_mul]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c : α
⊢ 1 ≤ a * b⁻¹ ↔ b ≤ a
[PROOFSTEP]
rw [← mul_le_mul_iff_right b, one_mul, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c : α
⊢ b ≤ 1 * a ↔ b ≤ a
[PROOFSTEP]
rw [one_mul]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ a⁻¹ < 1 ↔ 1 < a
[PROOFSTEP]
rw [← mul_lt_mul_iff_right a, inv_mul_self, one_mul]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ 1 < a⁻¹ ↔ a < 1
[PROOFSTEP]
rw [← mul_lt_mul_iff_right a, inv_mul_self, one_mul]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ a⁻¹ * a < b * a ↔ 1 < b * a
[PROOFSTEP]
rw [inv_mul_self]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ a * b < b⁻¹ * b ↔ a * b < 1
[PROOFSTEP]
rw [inv_mul_self]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ a * b⁻¹ < c ↔ a < c * b
[PROOFSTEP]
rw [← mul_lt_mul_iff_right b, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ c * b < a * b⁻¹ * b ↔ c * b < a
[PROOFSTEP]
rw [inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ a * b⁻¹ < 1 ↔ a < b
[PROOFSTEP]
rw [← mul_lt_mul_iff_right b, inv_mul_cancel_right, one_mul]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ 1 < a * b⁻¹ ↔ b < a
[PROOFSTEP]
rw [← mul_lt_mul_iff_right b, one_mul, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ b < 1 * a ↔ b < a
[PROOFSTEP]
rw [one_mul]
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LE α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a⁻¹ ≤ b⁻¹ ↔ b ≤ a
[PROOFSTEP]
rw [← mul_le_mul_iff_left a, ← mul_le_mul_iff_right b]
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LE α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a * a⁻¹ * b ≤ a * b⁻¹ * b ↔ b ≤ a
[PROOFSTEP]
simp
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LE α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a * b⁻¹ ≤ d⁻¹ * c ↔ d * a ≤ c * b
[PROOFSTEP]
rw [← mul_le_mul_iff_left d, ← mul_le_mul_iff_right b, mul_inv_cancel_left, mul_assoc, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LE α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a✝ b✝ c d a b : α
⊢ a / b ≤ a ↔ 1 ≤ b
[PROOFSTEP]
simp [div_eq_mul_inv]
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LE α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a✝ b✝ c d a b : α
⊢ a ≤ a / b ↔ b ≤ 1
[PROOFSTEP]
simp [div_eq_mul_inv]
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LT α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ a⁻¹ < b⁻¹ ↔ b < a
[PROOFSTEP]
rw [← mul_lt_mul_iff_left a, ← mul_lt_mul_iff_right b]
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LT α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ a * a⁻¹ * b < a * b⁻¹ * b ↔ b < a
[PROOFSTEP]
simp
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LT α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ a⁻¹ < b ↔ b⁻¹ < a
[PROOFSTEP]
rw [← inv_lt_inv_iff, inv_inv]
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LT α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ a < b⁻¹ ↔ b < a⁻¹
[PROOFSTEP]
rw [← inv_lt_inv_iff, inv_inv]
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LT α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ a * b⁻¹ < d⁻¹ * c ↔ d * a < c * b
[PROOFSTEP]
rw [← mul_lt_mul_iff_left d, ← mul_lt_mul_iff_right b, mul_inv_cancel_left, mul_assoc, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LT α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a✝ b✝ c d a b : α
⊢ a / b < a ↔ 1 < b
[PROOFSTEP]
simp [div_eq_mul_inv]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ c⁻¹ * a ≤ b ↔ a ≤ b * c
[PROOFSTEP]
rw [inv_mul_le_iff_le_mul, mul_comm]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a * b⁻¹ ≤ c ↔ a ≤ b * c
[PROOFSTEP]
rw [← inv_mul_le_iff_le_mul, mul_comm]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a * b⁻¹ ≤ c * d⁻¹ ↔ a * d ≤ c * b
[PROOFSTEP]
rw [mul_comm c, mul_inv_le_inv_mul_iff, mul_comm]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ c⁻¹ * a < b ↔ a < b * c
[PROOFSTEP]
rw [inv_mul_lt_iff_lt_mul, mul_comm]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ a * b⁻¹ < c ↔ a < b * c
[PROOFSTEP]
rw [← inv_mul_lt_iff_lt_mul, mul_comm]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ a * b⁻¹ < c * d⁻¹ ↔ a * d < c * b
[PROOFSTEP]
rw [mul_comm c, mul_inv_lt_inv_mul_iff, mul_comm]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c✝ d c : α
⊢ a / c ≤ b / c ↔ a ≤ b
[PROOFSTEP]
simpa only [div_eq_mul_inv] using mul_le_mul_iff_right _
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ 1 ≤ a / b ↔ b ≤ a
[PROOFSTEP]
rw [← mul_le_mul_iff_right b, one_mul, div_eq_mul_inv, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a / b ≤ 1 ↔ a ≤ b
[PROOFSTEP]
rw [← mul_le_mul_iff_right b, one_mul, div_eq_mul_inv, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a ≤ c / b ↔ a * b ≤ c
[PROOFSTEP]
rw [← mul_le_mul_iff_right b, div_eq_mul_inv, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a / c ≤ b ↔ a ≤ b * c
[PROOFSTEP]
rw [← mul_le_mul_iff_right c, div_eq_mul_inv, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LE α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a✝ b c a : α
⊢ a / b ≤ a / c ↔ c ≤ b
[PROOFSTEP]
rw [div_eq_mul_inv, div_eq_mul_inv, ← mul_le_mul_iff_left a⁻¹, inv_mul_cancel_left, inv_mul_cancel_left, inv_le_inv_iff]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a / b ≤ c / d ↔ a * d ≤ c * b
[PROOFSTEP]
simpa only [div_eq_mul_inv] using mul_inv_le_mul_inv_iff'
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ b ≤ c / a ↔ a * b ≤ c
[PROOFSTEP]
rw [le_div_iff_mul_le, mul_comm]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a / b ≤ c ↔ a ≤ b * c
[PROOFSTEP]
rw [div_le_iff_le_mul, mul_comm]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
⊢ a⁻¹ ≤ b / c ↔ c ≤ a * b
[PROOFSTEP]
rw [inv_le_div_iff_le_mul, mul_comm]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : Preorder α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
hab : a ≤ b
hcd : c ≤ d
⊢ a / d ≤ b / c
[PROOFSTEP]
rw [div_eq_mul_inv, div_eq_mul_inv, mul_comm b, mul_inv_le_inv_mul_iff, mul_comm]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : Preorder α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c d : α
hab : a ≤ b
hcd : c ≤ d
⊢ a * c ≤ b * d
[PROOFSTEP]
exact mul_le_mul' hab hcd
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c✝ d c : α
⊢ a / c < b / c ↔ a < b
[PROOFSTEP]
simpa only [div_eq_mul_inv] using mul_lt_mul_iff_right _
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ 1 < a / b ↔ b < a
[PROOFSTEP]
rw [← mul_lt_mul_iff_right b, one_mul, div_eq_mul_inv, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ a / b < 1 ↔ a < b
[PROOFSTEP]
rw [← mul_lt_mul_iff_right b, one_mul, div_eq_mul_inv, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ a < c / b ↔ a * b < c
[PROOFSTEP]
rw [← mul_lt_mul_iff_right b, div_eq_mul_inv, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ a / c < b ↔ a < b * c
[PROOFSTEP]
rw [← mul_lt_mul_iff_right c, div_eq_mul_inv, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LT α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a✝ b c a : α
⊢ a / b < a / c ↔ c < b
[PROOFSTEP]
rw [div_eq_mul_inv, div_eq_mul_inv, ← mul_lt_mul_iff_left a⁻¹, inv_mul_cancel_left, inv_mul_cancel_left, inv_lt_inv_iff]
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LT α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c : α
⊢ a⁻¹ < b / c ↔ c < a * b
[PROOFSTEP]
rw [div_eq_mul_inv, lt_mul_inv_iff_mul_lt, inv_mul_lt_iff_lt_mul]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ a / b < c / d ↔ a * d < c * b
[PROOFSTEP]
simpa only [div_eq_mul_inv] using mul_inv_lt_mul_inv_iff'
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ b < c / a ↔ a * b < c
[PROOFSTEP]
rw [lt_div_iff_mul_lt, mul_comm]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
⊢ a / b < c ↔ a < b * c
[PROOFSTEP]
rw [div_lt_iff_lt_mul, mul_comm]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : Preorder α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
hab : a < b
hcd : c < d
⊢ a / d < b / c
[PROOFSTEP]
rw [div_eq_mul_inv, div_eq_mul_inv, mul_comm b, mul_inv_lt_inv_mul_iff, mul_comm]
[GOAL]
α : Type u
inst✝² : CommGroup α
inst✝¹ : Preorder α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x < x_1
a b c d : α
hab : a < b
hcd : c < d
⊢ a * c < b * d
[PROOFSTEP]
exact mul_lt_mul_of_lt_of_lt hab hcd
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LinearOrder α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b : α
⊢ cmp (a / b) 1 = cmp a b
[PROOFSTEP]
rw [← cmp_mul_right' _ _ b, one_mul, div_mul_cancel']
[GOAL]
α : Type u
inst✝² : Group α
inst✝¹ : LinearOrder α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c : α
h : ∀ (ε : α), 1 < ε → a < b * ε
h₁ : b < a
⊢ a < a
[PROOFSTEP]
simpa using h _ (lt_inv_mul_iff_lt.mpr h₁)
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LinearOrder α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c : α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
⊢ a / b ≤ a⁻¹ * b ↔ a ≤ b
[PROOFSTEP]
rw [div_eq_mul_inv, mul_inv_le_inv_mul_iff]
[GOAL]
α : Type u
inst✝³ : Group α
inst✝² : LinearOrder α
inst✝¹ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b c : α
inst✝ : CovariantClass α α (swap fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
⊢ a * a ≤ b * b ↔ a ≤ b
[PROOFSTEP]
exact ⟨fun h => not_lt.mp fun k => not_lt.mpr h (mul_lt_mul_of_lt_of_lt k k), fun h => mul_le_mul' h h⟩
[GOAL]
α✝ : Type u
inst✝⁵ : Group α✝
inst✝⁴ : LinearOrder α✝
inst✝³ : CovariantClass α✝ α✝ (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a✝ b✝ c : α✝
α : Type u_1
inst✝² : CommGroup α
inst✝¹ : LinearOrder α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b : α
⊢ a / b ≤ b / a ↔ a ≤ b
[PROOFSTEP]
rw [div_eq_mul_inv b, mul_comm]
[GOAL]
α✝ : Type u
inst✝⁵ : Group α✝
inst✝⁴ : LinearOrder α✝
inst✝³ : CovariantClass α✝ α✝ (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a✝ b✝ c : α✝
α : Type u_1
inst✝² : CommGroup α
inst✝¹ : LinearOrder α
inst✝ : CovariantClass α α (fun x x_1 => x * x_1) fun x x_1 => x ≤ x_1
a b : α
⊢ a / b ≤ a⁻¹ * b ↔ a ≤ b
[PROOFSTEP]
exact div_le_inv_mul_iff
[GOAL]
α : Type u
inst✝¹ : LinearOrderedCommGroup α
a b c : α
inst✝ : Nontrivial α
⊢ ∃ a, 1 < a
[PROOFSTEP]
obtain ⟨y, hy⟩ := Decidable.exists_ne (1 : α)
[GOAL]
case intro
α : Type u
inst✝¹ : LinearOrderedCommGroup α
a b c : α
inst✝ : Nontrivial α
y : α
hy : y ≠ 1
⊢ ∃ a, 1 < a
[PROOFSTEP]
obtain h | h := hy.lt_or_lt
[GOAL]
case intro.inl
α : Type u
inst✝¹ : LinearOrderedCommGroup α
a b c : α
inst✝ : Nontrivial α
y : α
hy : y ≠ 1
h : y < 1
⊢ ∃ a, 1 < a
[PROOFSTEP]
exact ⟨y⁻¹, one_lt_inv'.mpr h⟩
[GOAL]
case intro.inr
α : Type u
inst✝¹ : LinearOrderedCommGroup α
a b c : α
inst✝ : Nontrivial α
y : α
hy : y ≠ 1
h : 1 < y
⊢ ∃ a, 1 < a
[PROOFSTEP]
exact ⟨y, h⟩
[GOAL]
α : Type u
inst✝¹ : LinearOrderedCommGroup α
a b c : α
inst✝ : Nontrivial α
⊢ ∀ (a : α), ∃ b, a < b
[PROOFSTEP]
obtain ⟨y, hy⟩ : ∃ a : α, 1 < a := exists_one_lt'
[GOAL]
case intro
α : Type u
inst✝¹ : LinearOrderedCommGroup α
a b c : α
inst✝ : Nontrivial α
y : α
hy : 1 < y
⊢ ∀ (a : α), ∃ b, a < b
[PROOFSTEP]
exact fun a => ⟨a * y, lt_mul_of_one_lt_right' a hy⟩
[GOAL]
α : Type u
inst✝¹ : LinearOrderedCommGroup α
a b c : α
inst✝ : Nontrivial α
⊢ ∀ (a : α), ∃ b, b < a
[PROOFSTEP]
obtain ⟨y, hy⟩ : ∃ a : α, 1 < a := exists_one_lt'
[GOAL]
case intro
α : Type u
inst✝¹ : LinearOrderedCommGroup α
a b c : α
inst✝ : Nontrivial α
y : α
hy : 1 < y
⊢ ∀ (a : α), ∃ b, b < a
[PROOFSTEP]
exact fun a => ⟨a / y, (div_lt_self_iff a).mpr hy⟩
[GOAL]
α✝ : Type u
α : Type u_1
inst✝ : AddCommGroup α
C : PositiveCone α
src✝ : AddCommGroup α := inst✝
a : α
⊢ a ≤ a
[PROOFSTEP]
simp [C.zero_nonneg]
[GOAL]
α✝ : Type u
α : Type u_1
inst✝ : AddCommGroup α
C : PositiveCone α
src✝ : AddCommGroup α := inst✝
a b c : α
nab : a ≤ b
nbc : b ≤ c
⊢ a ≤ c
[PROOFSTEP]
simpa [← sub_add_sub_cancel] using C.add_nonneg nbc nab
[GOAL]
α✝ : Type u
α : Type u_1
inst✝ : AddCommGroup α
C : PositiveCone α
src✝ : AddCommGroup α := inst✝
a b : α
⊢ a < b ↔ a ≤ b ∧ ¬b ≤ a
[PROOFSTEP]
simp [C.pos_iff]
[GOAL]
α✝ : Type u
α : Type u_1
inst✝ : AddCommGroup α
C : PositiveCone α
src✝ : AddCommGroup α := inst✝
a b : α
nab : a ≤ b
nba : b ≤ a
⊢ PositiveCone.nonneg C (-(a - b))
[PROOFSTEP]
rwa [neg_sub]
[GOAL]
α✝ : Type u
α : Type u_1
inst✝ : AddCommGroup α
C : PositiveCone α
src✝ : AddCommGroup α := inst✝
a b : α
nab : a ≤ b
c : α
⊢ c + a ≤ c + b
[PROOFSTEP]
simpa using nab
[GOAL]
α✝ : Type u
α : Type u_1
inst✝ : AddCommGroup α
C : TotalPositiveCone α
src✝ : OrderedAddCommGroup α := OrderedAddCommGroup.mkOfPositiveCone C.toPositiveCone
a b : α
⊢ a ≤ b ∨ b ≤ a
[PROOFSTEP]
simpa [neg_sub] using C.nonneg_total (b - a)


[GOAL]
I : Type u
f : I → Type v
x y : (i : I) → f i
i : I
g : I → Type u_1
r : (i : I) → Semiring (f i)
m : (i : I) → AddCommMonoid (g i)
inst✝ : (i : I) → Module (f i) (g i)
⊢ ∀ (r_1 s : (i : I) → f i) (x : (i : I) → g i), (r_1 + s) • x = r_1 • x + s • x
[PROOFSTEP]
intros
[GOAL]
I : Type u
f : I → Type v
x y : (i : I) → f i
i : I
g : I → Type u_1
r : (i : I) → Semiring (f i)
m : (i : I) → AddCommMonoid (g i)
inst✝ : (i : I) → Module (f i) (g i)
r✝ s✝ : (i : I) → f i
x✝ : (i : I) → g i
⊢ (r✝ + s✝) • x✝ = r✝ • x✝ + s✝ • x✝
[PROOFSTEP]
ext1
[GOAL]
case h
I : Type u
f : I → Type v
x y : (i : I) → f i
i : I
g : I → Type u_1
r : (i : I) → Semiring (f i)
m : (i : I) → AddCommMonoid (g i)
inst✝ : (i : I) → Module (f i) (g i)
r✝ s✝ : (i : I) → f i
x✝¹ : (i : I) → g i
x✝ : I
⊢ ((r✝ + s✝) • x✝¹) x✝ = (r✝ • x✝¹ + s✝ • x✝¹) x✝
[PROOFSTEP]
apply add_smul
[GOAL]
I : Type u
f : I → Type v
x y : (i : I) → f i
i : I
g : I → Type u_1
r : (i : I) → Semiring (f i)
m : (i : I) → AddCommMonoid (g i)
inst✝ : (i : I) → Module (f i) (g i)
⊢ ∀ (x : (i : I) → g i), 0 • x = 0
[PROOFSTEP]
intros
[GOAL]
I : Type u
f : I → Type v
x y : (i : I) → f i
i : I
g : I → Type u_1
r : (i : I) → Semiring (f i)
m : (i : I) → AddCommMonoid (g i)
inst✝ : (i : I) → Module (f i) (g i)
x✝ : (i : I) → g i
⊢ 0 • x✝ = 0
[PROOFSTEP]
ext1
  -- Porting note: not sure why `apply zero_smul` fails here.
[GOAL]
case h
I : Type u
f : I → Type v
x y : (i : I) → f i
i : I
g : I → Type u_1
r : (i : I) → Semiring (f i)
m : (i : I) → AddCommMonoid (g i)
inst✝ : (i : I) → Module (f i) (g i)
x✝¹ : (i : I) → g i
x✝ : I
⊢ (0 • x✝¹) x✝ = OfNat.ofNat 0 x✝
[PROOFSTEP]
rw [zero_smul]


[GOAL]
p : ℕ
h : 1 < p
⊢ 0 < p ^ 0
[PROOFSTEP]
simp [zero_lt_one]
[GOAL]
n : ℕ
⊢ 1 < 2
[PROOFSTEP]
decide
[GOAL]
n m : ℕ
h : 0 < m
⊢ 1 ≤ m ^ n
[PROOFSTEP]
rw [← one_pow n]
[GOAL]
n m : ℕ
h : 0 < m
⊢ 1 ^ n ≤ m ^ n
[PROOFSTEP]
exact Nat.pow_le_pow_of_le_left h n
[GOAL]
n : ℕ
⊢ 0 < 2
[PROOFSTEP]
decide
[GOAL]
n m : ℕ
h₀ : 0 < n
h₁ : 1 < m
⊢ 1 < m ^ n
[PROOFSTEP]
rw [← one_pow n]
[GOAL]
n m : ℕ
h₀ : 0 < n
h₁ : 1 < m
⊢ 1 ^ n < m ^ n
[PROOFSTEP]
exact pow_lt_pow_of_lt_left h₁ h₀
[GOAL]
k n : ℕ
h : 0 ≠ k
⊢ 1 < n ^ k ↔ 1 < n
[PROOFSTEP]
rcases n with (rfl | n)
[GOAL]
case zero
k : ℕ
h : 0 ≠ k
⊢ 1 < zero ^ k ↔ 1 < zero
[PROOFSTEP]
cases k
[GOAL]
case zero.zero
h : 0 ≠ zero
⊢ 1 < zero ^ zero ↔ 1 < zero
[PROOFSTEP]
simp [zero_pow_eq]
[GOAL]
case zero.succ
n✝ : ℕ
h : 0 ≠ succ n✝
⊢ 1 < zero ^ succ n✝ ↔ 1 < zero
[PROOFSTEP]
simp [zero_pow_eq]
[GOAL]
case succ
k : ℕ
h : 0 ≠ k
n : ℕ
⊢ 1 < succ n ^ k ↔ 1 < succ n
[PROOFSTEP]
rcases n with (rfl | n)
[GOAL]
case succ.zero
k : ℕ
h : 0 ≠ k
⊢ 1 < succ zero ^ k ↔ 1 < succ zero
[PROOFSTEP]
rw [← Nat.one_eq_succ_zero, one_pow]
[GOAL]
case succ.succ
k : ℕ
h : 0 ≠ k
n : ℕ
⊢ 1 < succ (succ n) ^ k ↔ 1 < succ (succ n)
[PROOFSTEP]
refine' ⟨fun _ => one_lt_succ_succ n, fun _ => _⟩
[GOAL]
case succ.succ
k : ℕ
h : 0 ≠ k
n : ℕ
x✝ : 1 < succ (succ n)
⊢ 1 < succ (succ n) ^ k
[PROOFSTEP]
induction' k with k hk
[GOAL]
case succ.succ.zero
k : ℕ
h✝ : 0 ≠ k
n : ℕ
x✝ : 1 < succ (succ n)
h : 0 ≠ zero
⊢ 1 < succ (succ n) ^ zero
[PROOFSTEP]
exact absurd rfl h
[GOAL]
case succ.succ.succ
k✝ : ℕ
h✝ : 0 ≠ k✝
n : ℕ
x✝ : 1 < succ (succ n)
k : ℕ
hk : 0 ≠ k → 1 < succ (succ n) ^ k
h : 0 ≠ succ k
⊢ 1 < succ (succ n) ^ succ k
[PROOFSTEP]
rcases k with (rfl | k)
[GOAL]
case succ.succ.succ.zero
k : ℕ
h✝ : 0 ≠ k
n : ℕ
x✝ : 1 < succ (succ n)
hk : 0 ≠ zero → 1 < succ (succ n) ^ zero
h : 0 ≠ succ zero
⊢ 1 < succ (succ n) ^ succ zero
[PROOFSTEP]
simp [← Nat.one_eq_succ_zero]
[GOAL]
case succ.succ.succ.succ
k✝ : ℕ
h✝ : 0 ≠ k✝
n : ℕ
x✝ : 1 < succ (succ n)
k : ℕ
hk : 0 ≠ succ k → 1 < succ (succ n) ^ succ k
h : 0 ≠ succ (succ k)
⊢ 1 < succ (succ n) ^ succ (succ k)
[PROOFSTEP]
rw [pow_succ']
[GOAL]
case succ.succ.succ.succ
k✝ : ℕ
h✝ : 0 ≠ k✝
n : ℕ
x✝ : 1 < succ (succ n)
k : ℕ
hk : 0 ≠ succ k → 1 < succ (succ n) ^ succ k
h : 0 ≠ succ (succ k)
⊢ 1 < succ (succ n) * succ (succ n) ^ (k + 1)
[PROOFSTEP]
exact one_lt_mul (one_lt_succ_succ _).le (hk (succ_ne_zero k).symm)
[GOAL]
n : ℕ
h₀ : 0 < n
⊢ 1 < 2
[PROOFSTEP]
decide
[GOAL]
n : ℕ
⊢ 1 < 2
[PROOFSTEP]
decide
[GOAL]
n a q : ℕ
a0 : 0 < a
q1 : 1 < q
⊢ n * q < a * q ^ (n + 1)
[PROOFSTEP]
rw [pow_succ, ← mul_assoc, mul_lt_mul_right (zero_lt_one.trans q1)]
[GOAL]
n a q : ℕ
a0 : 0 < a
q1 : 1 < q
⊢ n < a * q ^ n
[PROOFSTEP]
exact lt_mul_of_one_le_of_lt (Nat.succ_le_iff.mpr a0) (Nat.lt_pow_self q1 n)
[GOAL]
a b : ℕ
⊢ a ^ 2 - b ^ 2 = (a + b) * (a - b)
[PROOFSTEP]
rw [sq, sq]
[GOAL]
a b : ℕ
⊢ a * a - b * b = (a + b) * (a - b)
[PROOFSTEP]
exact Nat.mul_self_sub_mul_self_eq a b
[GOAL]
a b n : ℕ
⊢ a ^ b % n = (a % n) ^ b % n
[PROOFSTEP]
induction' b with b ih
[GOAL]
case zero
a n : ℕ
⊢ a ^ zero % n = (a % n) ^ zero % n
case succ a n b : ℕ ih : a ^ b % n = (a % n) ^ b % n ⊢ a ^ succ b % n = (a % n) ^ succ b % n
[PROOFSTEP]
rfl
[GOAL]
case succ
a n b : ℕ
ih : a ^ b % n = (a % n) ^ b % n
⊢ a ^ succ b % n = (a % n) ^ succ b % n
[PROOFSTEP]
simp [pow_succ, Nat.mul_mod, ih]
[GOAL]
b w m : ℕ
⊢ m % b ^ succ w = b * (m / b % b ^ w) + m % b
[PROOFSTEP]
by_cases b_h : b = 0
[GOAL]
case pos
b w m : ℕ
b_h : b = 0
⊢ m % b ^ succ w = b * (m / b % b ^ w) + m % b
[PROOFSTEP]
simp [b_h, pow_succ]
[GOAL]
case neg
b w m : ℕ
b_h : ¬b = 0
⊢ m % b ^ succ w = b * (m / b % b ^ w) + m % b
[PROOFSTEP]
have b_pos := Nat.pos_of_ne_zero b_h
[GOAL]
case neg
b w m : ℕ
b_h : ¬b = 0
b_pos : 0 < b
⊢ m % b ^ succ w = b * (m / b % b ^ w) + m % b
[PROOFSTEP]
induction m using Nat.strong_induction_on with
| h p IH =>
  cases' lt_or_ge p (b ^ succ w) with h₁ h₁
  ·
    -- base case: p < b^succ w
    have h₂ : p / b < b ^ w := by
      rw [div_lt_iff_lt_mul b_pos]
      simpa [pow_succ] using h₁
    rw [mod_eq_of_lt h₁, mod_eq_of_lt h₂]
    simp [div_add_mod]
  ·
    -- step: p ≥ b^succ w
            -- Generate condition for induction hypothesis
    have h₂ : p - b ^ succ w < p :=
      tsub_lt_self ((pow_pos b_pos _).trans_le h₁)
        (pow_pos b_pos _)
          -- Apply induction
    rw [mod_eq_sub_mod h₁, IH _ h₂]
      -- Normalize goal and h1
    simp only [pow_succ']
    simp only [GE.ge, pow_succ'] at h₁
    rw [sub_mul_mod h₁, sub_mul_div _ _ _ h₁]
      -- Cancel subtraction inside mod b^w
    have p_b_ge : b ^ w ≤ p / b := by
      rw [le_div_iff_mul_le b_pos, mul_comm]
      exact h₁
    rw [Eq.symm (mod_eq_sub_mod p_b_ge)]
[GOAL]
case neg
b w m : ℕ
b_h : ¬b = 0
b_pos : 0 < b
⊢ m % b ^ succ w = b * (m / b % b ^ w) + m % b
[PROOFSTEP]
induction m using Nat.strong_induction_on with
| h p IH =>
  cases' lt_or_ge p (b ^ succ w) with h₁ h₁
  ·
    -- base case: p < b^succ w
    have h₂ : p / b < b ^ w := by
      rw [div_lt_iff_lt_mul b_pos]
      simpa [pow_succ] using h₁
    rw [mod_eq_of_lt h₁, mod_eq_of_lt h₂]
    simp [div_add_mod]
  ·
    -- step: p ≥ b^succ w
            -- Generate condition for induction hypothesis
    have h₂ : p - b ^ succ w < p :=
      tsub_lt_self ((pow_pos b_pos _).trans_le h₁)
        (pow_pos b_pos _)
          -- Apply induction
    rw [mod_eq_sub_mod h₁, IH _ h₂]
      -- Normalize goal and h1
    simp only [pow_succ']
    simp only [GE.ge, pow_succ'] at h₁
    rw [sub_mul_mod h₁, sub_mul_div _ _ _ h₁]
      -- Cancel subtraction inside mod b^w
    have p_b_ge : b ^ w ≤ p / b := by
      rw [le_div_iff_mul_le b_pos, mul_comm]
      exact h₁
    rw [Eq.symm (mod_eq_sub_mod p_b_ge)]
[GOAL]
case neg.h
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
⊢ p % b ^ succ w = b * (p / b % b ^ w) + p % b
[PROOFSTEP]

| h p IH =>
  cases' lt_or_ge p (b ^ succ w) with h₁ h₁
  ·
    -- base case: p < b^succ w
    have h₂ : p / b < b ^ w := by
      rw [div_lt_iff_lt_mul b_pos]
      simpa [pow_succ] using h₁
    rw [mod_eq_of_lt h₁, mod_eq_of_lt h₂]
    simp [div_add_mod]
  ·
    -- step: p ≥ b^succ w
            -- Generate condition for induction hypothesis
    have h₂ : p - b ^ succ w < p :=
      tsub_lt_self ((pow_pos b_pos _).trans_le h₁)
        (pow_pos b_pos _)
          -- Apply induction
    rw [mod_eq_sub_mod h₁, IH _ h₂]
      -- Normalize goal and h1
    simp only [pow_succ']
    simp only [GE.ge, pow_succ'] at h₁
    rw [sub_mul_mod h₁, sub_mul_div _ _ _ h₁]
      -- Cancel subtraction inside mod b^w
    have p_b_ge : b ^ w ≤ p / b := by
      rw [le_div_iff_mul_le b_pos, mul_comm]
      exact h₁
    rw [Eq.symm (mod_eq_sub_mod p_b_ge)]
[GOAL]
case neg.h
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
⊢ p % b ^ succ w = b * (p / b % b ^ w) + p % b
[PROOFSTEP]
cases' lt_or_ge p (b ^ succ w) with h₁ h₁
[GOAL]
case neg.h.inl
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
h₁ : p < b ^ succ w
⊢ p % b ^ succ w = b * (p / b % b ^ w) + p % b
[PROOFSTEP]
have h₂ : p / b < b ^ w := by
  rw [div_lt_iff_lt_mul b_pos]
  simpa [pow_succ] using h₁
[GOAL]
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
h₁ : p < b ^ succ w
⊢ p / b < b ^ w
[PROOFSTEP]
rw [div_lt_iff_lt_mul b_pos]
[GOAL]
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
h₁ : p < b ^ succ w
⊢ p < b ^ w * b
[PROOFSTEP]
simpa [pow_succ] using h₁
[GOAL]
case neg.h.inl
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
h₁ : p < b ^ succ w
h₂ : p / b < b ^ w
⊢ p % b ^ succ w = b * (p / b % b ^ w) + p % b
[PROOFSTEP]
rw [mod_eq_of_lt h₁, mod_eq_of_lt h₂]
[GOAL]
case neg.h.inl
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
h₁ : p < b ^ succ w
h₂ : p / b < b ^ w
⊢ p = b * (p / b) + p % b
[PROOFSTEP]
simp [div_add_mod]
[GOAL]
case neg.h.inr
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
h₁ : p ≥ b ^ succ w
⊢ p % b ^ succ w = b * (p / b % b ^ w) + p % b
[PROOFSTEP]
have h₂ : p - b ^ succ w < p :=
  tsub_lt_self ((pow_pos b_pos _).trans_le h₁)
    (pow_pos b_pos _)
      -- Apply induction
[GOAL]
case neg.h.inr
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
h₁ : p ≥ b ^ succ w
h₂ : p - b ^ succ w < p
⊢ p % b ^ succ w = b * (p / b % b ^ w) + p % b
[PROOFSTEP]
rw [mod_eq_sub_mod h₁, IH _ h₂]
  -- Normalize goal and h1
[GOAL]
case neg.h.inr
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
h₁ : p ≥ b ^ succ w
h₂ : p - b ^ succ w < p
⊢ b * ((p - b ^ succ w) / b % b ^ w) + (p - b ^ succ w) % b = b * (p / b % b ^ w) + p % b
[PROOFSTEP]
simp only [pow_succ']
[GOAL]
case neg.h.inr
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
h₁ : p ≥ b ^ succ w
h₂ : p - b ^ succ w < p
⊢ b * ((p - b * b ^ w) / b % b ^ w) + (p - b * b ^ w) % b = b * (p / b % b ^ w) + p % b
[PROOFSTEP]
simp only [GE.ge, pow_succ'] at h₁
[GOAL]
case neg.h.inr
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
h₂ : p - b ^ succ w < p
h₁ : b * b ^ w ≤ p
⊢ b * ((p - b * b ^ w) / b % b ^ w) + (p - b * b ^ w) % b = b * (p / b % b ^ w) + p % b
[PROOFSTEP]
rw [sub_mul_mod h₁, sub_mul_div _ _ _ h₁]
  -- Cancel subtraction inside mod b^w
[GOAL]
case neg.h.inr
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
h₂ : p - b ^ succ w < p
h₁ : b * b ^ w ≤ p
⊢ b * ((p / b - b ^ w) % b ^ w) + p % b = b * (p / b % b ^ w) + p % b
[PROOFSTEP]
have p_b_ge : b ^ w ≤ p / b := by
  rw [le_div_iff_mul_le b_pos, mul_comm]
  exact h₁
[GOAL]
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
h₂ : p - b ^ succ w < p
h₁ : b * b ^ w ≤ p
⊢ b ^ w ≤ p / b
[PROOFSTEP]
rw [le_div_iff_mul_le b_pos, mul_comm]
[GOAL]
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
h₂ : p - b ^ succ w < p
h₁ : b * b ^ w ≤ p
⊢ b * b ^ w ≤ p
[PROOFSTEP]
exact h₁
[GOAL]
case neg.h.inr
b w : ℕ
b_h : ¬b = 0
b_pos : 0 < b
p : ℕ
IH : ∀ (m : ℕ), m < p → m % b ^ succ w = b * (m / b % b ^ w) + m % b
h₂ : p - b ^ succ w < p
h₁ : b * b ^ w ≤ p
p_b_ge : b ^ w ≤ p / b
⊢ b * ((p / b - b ^ w) % b ^ w) + p % b = b * (p / b % b ^ w) + p % b
[PROOFSTEP]
rw [Eq.symm (mod_eq_sub_mod p_b_ge)]
[GOAL]
k l x : ℕ
w : 0 < x + 1
⊢ (x + 1) ^ k ∣ (x + 1) ^ l ↔ (x + 1) ^ k ≤ (x + 1) ^ l
[PROOFSTEP]
constructor
[GOAL]
case mp
k l x : ℕ
w : 0 < x + 1
⊢ (x + 1) ^ k ∣ (x + 1) ^ l → (x + 1) ^ k ≤ (x + 1) ^ l
[PROOFSTEP]
intro a
[GOAL]
case mp
k l x : ℕ
w : 0 < x + 1
a : (x + 1) ^ k ∣ (x + 1) ^ l
⊢ (x + 1) ^ k ≤ (x + 1) ^ l
[PROOFSTEP]
exact le_of_dvd (pow_pos (succ_pos x) l) a
[GOAL]
case mpr
k l x : ℕ
w : 0 < x + 1
⊢ (x + 1) ^ k ≤ (x + 1) ^ l → (x + 1) ^ k ∣ (x + 1) ^ l
[PROOFSTEP]
intro a
[GOAL]
case mpr
k l x : ℕ
w : 0 < x + 1
a : (x + 1) ^ k ≤ (x + 1) ^ l
⊢ (x + 1) ^ k ∣ (x + 1) ^ l
[PROOFSTEP]
cases' x with x
[GOAL]
case mpr.zero
k l : ℕ
w : 0 < zero + 1
a : (zero + 1) ^ k ≤ (zero + 1) ^ l
⊢ (zero + 1) ^ k ∣ (zero + 1) ^ l
[PROOFSTEP]
simp
[GOAL]
case mpr.succ
k l x : ℕ
w : 0 < succ x + 1
a : (succ x + 1) ^ k ≤ (succ x + 1) ^ l
⊢ (succ x + 1) ^ k ∣ (succ x + 1) ^ l
[PROOFSTEP]
have le := (pow_le_iff_le_right (Nat.le_add_left _ _)).mp a
[GOAL]
case mpr.succ
k l x : ℕ
w : 0 < succ x + 1
a : (succ x + 1) ^ k ≤ (succ x + 1) ^ l
le : k ≤ l
⊢ (succ x + 1) ^ k ∣ (succ x + 1) ^ l
[PROOFSTEP]
use(x + 2) ^ (l - k)
[GOAL]
case h
k l x : ℕ
w : 0 < succ x + 1
a : (succ x + 1) ^ k ≤ (succ x + 1) ^ l
le : k ≤ l
⊢ (succ x + 1) ^ l = (succ x + 1) ^ k * (x + 2) ^ (l - k)
[PROOFSTEP]
rw [← pow_add, add_comm k, tsub_add_cancel_of_le le]
[GOAL]
x k l : ℕ
w : 1 < x
⊢ x ^ k ∣ x ^ l ↔ k ≤ l
[PROOFSTEP]
rw [pow_dvd_pow_iff_pow_le_pow (lt_of_succ_lt w), pow_le_iff_le_right w]
[GOAL]
p k : ℕ
hp : 1 < succ p
hk : 1 < succ k
h : succ p ^ succ k ∣ succ p
⊢ succ p * succ p ^ k ∣ succ p * 1
[PROOFSTEP]
simpa [pow_succ'] using h
[GOAL]
p k : ℕ
hp : 1 < succ p
hk : 1 < succ k
h : succ p ^ succ k ∣ succ p
this✝¹ : succ p * succ p ^ k ∣ succ p * 1
this✝ : succ p ^ k ∣ 1
he : succ p ^ k = 1
this : k < succ p ^ k
⊢ k < 1
[PROOFSTEP]
rwa [he] at this
[GOAL]
p k : ℕ
hp : 1 < succ p
hk : 1 < succ k
h : succ p ^ succ k ∣ succ p
this✝³ : succ p * succ p ^ k ∣ succ p * 1
this✝² : succ p ^ k ∣ 1
he : succ p ^ k = 1
this✝¹ : k < succ p ^ k
this✝ : k < 1
this : k = 0
⊢ 1 < 1
[PROOFSTEP]
rwa [this] at hk
[GOAL]
p k : ℕ
hp : 1 < succ p
hk : 1 < succ k
h : succ p ^ succ k ∣ succ p
this✝⁴ : succ p * succ p ^ k ∣ succ p * 1
this✝³ : succ p ^ k ∣ 1
he : succ p ^ k = 1
this✝² : k < succ p ^ k
this✝¹ : k < 1
this✝ : k = 0
this : 1 < 1
⊢ ¬1 < 1
[PROOFSTEP]
decide
[GOAL]
p k m : ℕ
hk : 1 ≤ k
hpk : p ^ k ∣ m
⊢ p ∣ m
[PROOFSTEP]
rw [← pow_one p]
[GOAL]
p k m : ℕ
hk : 1 ≤ k
hpk : p ^ k ∣ m
⊢ p ^ 1 ∣ m
[PROOFSTEP]
exact pow_dvd_of_le_of_pow_dvd hk hpk
[GOAL]
x m n : ℕ
h : n ≤ m
hx : 0 < x
⊢ x ^ m / x ^ n = x ^ (m - n)
[PROOFSTEP]
rw [Nat.div_eq_iff_eq_mul_left (pow_pos hx n) (pow_dvd_pow _ h), pow_sub_mul_pow _ h]
[GOAL]
p i n : ℕ
hn : n ≠ 0
hp : 2 ≤ p
h : p ^ i ∣ n
⊢ i < n
[PROOFSTEP]
rw [← pow_lt_iff_lt_right hp]
[GOAL]
p i n : ℕ
hn : n ≠ 0
hp : 2 ≤ p
h : p ^ i ∣ n
⊢ p ^ i < p ^ n
[PROOFSTEP]
exact lt_of_le_of_lt (le_of_dvd hn.bot_lt h) (lt_pow_self (succ_le_iff.mp hp) n)


[GOAL]
G : Type u_1
inst✝⁴ : Group G
A : Type u_2
inst✝³ : AddGroup A
H✝ : Type u_3
inst✝² : Group H✝
inst✝¹ : IsSimpleGroup G
inst✝ : Nontrivial H✝
f : G →* H✝
hf : Function.Surjective ↑f
H : Subgroup H✝
iH : Normal H
⊢ H = ⊥ ∨ H = ⊤
[PROOFSTEP]
refine' (iH.comap f).eq_bot_or_eq_top.imp (fun h => _) fun h => _
[GOAL]
case refine'_1
G : Type u_1
inst✝⁴ : Group G
A : Type u_2
inst✝³ : AddGroup A
H✝ : Type u_3
inst✝² : Group H✝
inst✝¹ : IsSimpleGroup G
inst✝ : Nontrivial H✝
f : G →* H✝
hf : Function.Surjective ↑f
H : Subgroup H✝
iH : Normal H
h : comap f H = ⊥
⊢ H = ⊥
[PROOFSTEP]
rw [← map_bot f, ← h, map_comap_eq_self_of_surjective hf]
[GOAL]
case refine'_2
G : Type u_1
inst✝⁴ : Group G
A : Type u_2
inst✝³ : AddGroup A
H✝ : Type u_3
inst✝² : Group H✝
inst✝¹ : IsSimpleGroup G
inst✝ : Nontrivial H✝
f : G →* H✝
hf : Function.Surjective ↑f
H : Subgroup H✝
iH : Normal H
h : comap f H = ⊤
⊢ H = ⊤
[PROOFSTEP]
rw [← comap_top f] at h
[GOAL]
case refine'_2
G : Type u_1
inst✝⁴ : Group G
A : Type u_2
inst✝³ : AddGroup A
H✝ : Type u_3
inst✝² : Group H✝
inst✝¹ : IsSimpleGroup G
inst✝ : Nontrivial H✝
f : G →* H✝
hf : Function.Surjective ↑f
H : Subgroup H✝
iH : Normal H
h : comap f H = comap f ⊤
⊢ H = ⊤
[PROOFSTEP]
exact comap_injective hf h


[GOAL]
C : Type u₁
inst✝¹ : Category.{u_1, u₁} C
D : Type u₂
inst✝ : Category.{u_2, u₂} D
F : C ⥤ D
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
W : D
h : F.obj Z ⟶ W
⊢ F.map (f ≫ g) ≫ h = F.map f ≫ F.map g ≫ h
[PROOFSTEP]
rw [F.map_comp, Category.assoc]
[GOAL]
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
E : Type u₃
inst✝ : Category.{v₃, u₃} E
F : C ⥤ D
G : D ⥤ E
⊢ ∀ {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := fun X => G.obj (F.obj X), map := fun {X Y} f => G.map (F.map f) }.map (f ≫ g) =
      { obj := fun X => G.obj (F.obj X), map := fun {X Y} f => G.map (F.map f) }.map f ≫
        { obj := fun X => G.obj (F.obj X), map := fun {X Y} f => G.map (F.map f) }.map g
[PROOFSTEP]
intros
[GOAL]
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
E : Type u₃
inst✝ : Category.{v₃, u₃} E
F : C ⥤ D
G : D ⥤ E
X✝ Y✝ Z✝ : C
f✝ : X✝ ⟶ Y✝
g✝ : Y✝ ⟶ Z✝
⊢ { obj := fun X => G.obj (F.obj X), map := fun {X Y} f => G.map (F.map f) }.map (f✝ ≫ g✝) =
    { obj := fun X => G.obj (F.obj X), map := fun {X Y} f => G.map (F.map f) }.map f✝ ≫
      { obj := fun X => G.obj (F.obj X), map := fun {X Y} f => G.map (F.map f) }.map g✝
[PROOFSTEP]
dsimp
[GOAL]
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
E : Type u₃
inst✝ : Category.{v₃, u₃} E
F : C ⥤ D
G : D ⥤ E
X✝ Y✝ Z✝ : C
f✝ : X✝ ⟶ Y✝
g✝ : Y✝ ⟶ Z✝
⊢ G.map (F.map (f✝ ≫ g✝)) = G.map (F.map f✝) ≫ G.map (F.map g✝)
[PROOFSTEP]
rw [F.map_comp, G.map_comp]
[GOAL]
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
E : Type u₃
inst✝ : Category.{v₃, u₃} E
F : C ⥤ D
⊢ F ⋙ 𝟭 D = F
[PROOFSTEP]
cases F
[GOAL]
case mk
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
E : Type u₃
inst✝ : Category.{v₃, u₃} E
toPrefunctor✝ : C ⥤q D
map_id✝ : ∀ (X : C), toPrefunctor✝.map (𝟙 X) = 𝟙 (toPrefunctor✝.obj X)
map_comp✝ : ∀ {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z), toPrefunctor✝.map (f ≫ g) = toPrefunctor✝.map f ≫ toPrefunctor✝.map g
⊢ mk toPrefunctor✝ ⋙ 𝟭 D = mk toPrefunctor✝
[PROOFSTEP]
rfl
[GOAL]
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
E : Type u₃
inst✝ : Category.{v₃, u₃} E
F : C ⥤ D
⊢ 𝟭 C ⋙ F = F
[PROOFSTEP]
cases F
[GOAL]
case mk
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
E : Type u₃
inst✝ : Category.{v₃, u₃} E
toPrefunctor✝ : C ⥤q D
map_id✝ : ∀ (X : C), toPrefunctor✝.map (𝟙 X) = 𝟙 (toPrefunctor✝.obj X)
map_comp✝ : ∀ {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z), toPrefunctor✝.map (f ≫ g) = toPrefunctor✝.map f ≫ toPrefunctor✝.map g
⊢ 𝟭 C ⋙ mk toPrefunctor✝ = mk toPrefunctor✝
[PROOFSTEP]
rfl
[GOAL]
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u₃
inst✝¹ : Category.{v₃, u₃} E
F : C ⥤ D
X Y : C
P : Prop
inst✝ : Decidable P
f : P → (X ⟶ Y)
g : ¬P → (X ⟶ Y)
⊢ F.map (if h : P then f h else g h) = if h : P then F.map (f h) else F.map (g h)
[PROOFSTEP]
aesop_cat


[GOAL]
P : ℤ → Prop
inst✝ : DecidablePred P
Hbdd : ∃ b, ∀ (z : ℤ), P z → b ≤ z
Hinh : ∃ z, P z
⊢ ∃ lb, P lb ∧ ∀ (z : ℤ), P z → lb ≤ z
[PROOFSTEP]
let ⟨b, Hb⟩ := Hbdd
[GOAL]
P : ℤ → Prop
inst✝ : DecidablePred P
Hbdd : ∃ b, ∀ (z : ℤ), P z → b ≤ z
Hinh : ∃ z, P z
b : ℤ
Hb : ∀ (z : ℤ), P z → b ≤ z
⊢ ∃ lb, P lb ∧ ∀ (z : ℤ), P z → lb ≤ z
[PROOFSTEP]
let ⟨lb, H⟩ := leastOfBdd b Hb Hinh
[GOAL]
P : ℤ → Prop
inst✝ : DecidablePred P
Hbdd : ∃ b, ∀ (z : ℤ), P z → b ≤ z
Hinh : ∃ z, P z
b : ℤ
Hb : ∀ (z : ℤ), P z → b ≤ z
lb : ℤ
H : P lb ∧ ∀ (z : ℤ), P z → lb ≤ z
⊢ ∃ lb, P lb ∧ ∀ (z : ℤ), P z → lb ≤ z
[PROOFSTEP]
exact ⟨lb, H⟩
[GOAL]
P : ℤ → Prop
inst✝ : DecidablePred P
b b' : ℤ
Hb : ∀ (z : ℤ), P z → b ≤ z
Hb' : ∀ (z : ℤ), P z → b' ≤ z
Hinh : ∃ z, P z
⊢ ↑(leastOfBdd b Hb Hinh) = ↑(leastOfBdd b' Hb' Hinh)
[PROOFSTEP]
rcases leastOfBdd b Hb Hinh with ⟨n, hn, h2n⟩
[GOAL]
case mk.intro
P : ℤ → Prop
inst✝ : DecidablePred P
b b' : ℤ
Hb : ∀ (z : ℤ), P z → b ≤ z
Hb' : ∀ (z : ℤ), P z → b' ≤ z
Hinh : ∃ z, P z
n : ℤ
hn : P n
h2n : ∀ (z : ℤ), P z → n ≤ z
⊢ ↑{ val := n, property := (_ : P n ∧ ∀ (z : ℤ), P z → n ≤ z) } = ↑(leastOfBdd b' Hb' Hinh)
[PROOFSTEP]
rcases leastOfBdd b' Hb' Hinh with ⟨n', hn', h2n'⟩
[GOAL]
case mk.intro.mk.intro
P : ℤ → Prop
inst✝ : DecidablePred P
b b' : ℤ
Hb : ∀ (z : ℤ), P z → b ≤ z
Hb' : ∀ (z : ℤ), P z → b' ≤ z
Hinh : ∃ z, P z
n : ℤ
hn : P n
h2n : ∀ (z : ℤ), P z → n ≤ z
n' : ℤ
hn' : P n'
h2n' : ∀ (z : ℤ), P z → n' ≤ z
⊢ ↑{ val := n, property := (_ : P n ∧ ∀ (z : ℤ), P z → n ≤ z) } =
    ↑{ val := n', property := (_ : P n' ∧ ∀ (z : ℤ), P z → n' ≤ z) }
[PROOFSTEP]
exact le_antisymm (h2n _ hn') (h2n' _ hn)
[GOAL]
P : ℤ → Prop
inst✝ : DecidablePred P
b : ℤ
Hb : ∀ (z : ℤ), P z → z ≤ b
Hinh : ∃ z, P z
Hbdd' : ∀ (z : ℤ), P (-z) → -b ≤ z
elt : ℤ
Helt : P elt
⊢ P (- -elt)
[PROOFSTEP]
rw [neg_neg]
[GOAL]
P : ℤ → Prop
inst✝ : DecidablePred P
b : ℤ
Hb : ∀ (z : ℤ), P z → z ≤ b
Hinh : ∃ z, P z
Hbdd' : ∀ (z : ℤ), P (-z) → -b ≤ z
elt : ℤ
Helt : P elt
⊢ P elt
[PROOFSTEP]
exact Helt
[GOAL]
P : ℤ → Prop
inst✝ : DecidablePred P
b : ℤ
Hb : ∀ (z : ℤ), P z → z ≤ b
Hinh : ∃ z, P z
Hbdd' : ∀ (z : ℤ), P (-z) → -b ≤ z
Hinh' : ∃ z, P (-z)
lb : ℤ
Plb : P (-lb)
al : ∀ (z : ℤ), P (-z) → lb ≤ z
z : ℤ
h : P z
⊢ P (- -z)
[PROOFSTEP]
rwa [neg_neg]
[GOAL]
P : ℤ → Prop
inst✝ : DecidablePred P
Hbdd : ∃ b, ∀ (z : ℤ), P z → z ≤ b
Hinh : ∃ z, P z
⊢ ∃ ub, P ub ∧ ∀ (z : ℤ), P z → z ≤ ub
[PROOFSTEP]
let ⟨b, Hb⟩ := Hbdd
[GOAL]
P : ℤ → Prop
inst✝ : DecidablePred P
Hbdd : ∃ b, ∀ (z : ℤ), P z → z ≤ b
Hinh : ∃ z, P z
b : ℤ
Hb : ∀ (z : ℤ), P z → z ≤ b
⊢ ∃ ub, P ub ∧ ∀ (z : ℤ), P z → z ≤ ub
[PROOFSTEP]
let ⟨lb, H⟩ := greatestOfBdd b Hb Hinh
[GOAL]
P : ℤ → Prop
inst✝ : DecidablePred P
Hbdd : ∃ b, ∀ (z : ℤ), P z → z ≤ b
Hinh : ∃ z, P z
b : ℤ
Hb : ∀ (z : ℤ), P z → z ≤ b
lb : ℤ
H : P lb ∧ ∀ (z : ℤ), P z → z ≤ lb
⊢ ∃ ub, P ub ∧ ∀ (z : ℤ), P z → z ≤ ub
[PROOFSTEP]
exact ⟨lb, H⟩
[GOAL]
P : ℤ → Prop
inst✝ : DecidablePred P
b b' : ℤ
Hb : ∀ (z : ℤ), P z → z ≤ b
Hb' : ∀ (z : ℤ), P z → z ≤ b'
Hinh : ∃ z, P z
⊢ ↑(greatestOfBdd b Hb Hinh) = ↑(greatestOfBdd b' Hb' Hinh)
[PROOFSTEP]
rcases greatestOfBdd b Hb Hinh with ⟨n, hn, h2n⟩
[GOAL]
case mk.intro
P : ℤ → Prop
inst✝ : DecidablePred P
b b' : ℤ
Hb : ∀ (z : ℤ), P z → z ≤ b
Hb' : ∀ (z : ℤ), P z → z ≤ b'
Hinh : ∃ z, P z
n : ℤ
hn : P n
h2n : ∀ (z : ℤ), P z → z ≤ n
⊢ ↑{ val := n, property := (_ : P n ∧ ∀ (z : ℤ), P z → z ≤ n) } = ↑(greatestOfBdd b' Hb' Hinh)
[PROOFSTEP]
rcases greatestOfBdd b' Hb' Hinh with ⟨n', hn', h2n'⟩
[GOAL]
case mk.intro.mk.intro
P : ℤ → Prop
inst✝ : DecidablePred P
b b' : ℤ
Hb : ∀ (z : ℤ), P z → z ≤ b
Hb' : ∀ (z : ℤ), P z → z ≤ b'
Hinh : ∃ z, P z
n : ℤ
hn : P n
h2n : ∀ (z : ℤ), P z → z ≤ n
n' : ℤ
hn' : P n'
h2n' : ∀ (z : ℤ), P z → z ≤ n'
⊢ ↑{ val := n, property := (_ : P n ∧ ∀ (z : ℤ), P z → z ≤ n) } =
    ↑{ val := n', property := (_ : P n' ∧ ∀ (z : ℤ), P z → z ≤ n') }
[PROOFSTEP]
exact le_antisymm (h2n' _ hn) (h2n _ hn')


[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
f : α → β
⊢ Isometry f ↔ ∀ (x y : α), nndist (f x) (f y) = nndist x y
[PROOFSTEP]
simp only [Isometry, edist_nndist, ENNReal.coe_eq_coe]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
f : α → β
⊢ Isometry f ↔ ∀ (x y : α), dist (f x) (f y) = dist x y
[PROOFSTEP]
simp only [isometry_iff_nndist_eq, ← coe_nndist, NNReal.coe_eq]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
f : α → β
x✝ y✝ z : α
s : Set α
h : Isometry f
x y : α
⊢ edist x y ≤ ↑1 * edist (f x) (f y)
[PROOFSTEP]
simp only [h x y, ENNReal.coe_one, one_mul, le_refl]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝³ : PseudoEMetricSpace α
inst✝² : PseudoEMetricSpace β
inst✝¹ : PseudoEMetricSpace γ
f : α → β
x✝ y✝ z : α
s : Set α
inst✝ : Subsingleton α
x y : α
⊢ edist (f x) (f y) = edist x y
[PROOFSTEP]
rw [Subsingleton.elim x y]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝³ : PseudoEMetricSpace α
inst✝² : PseudoEMetricSpace β
inst✝¹ : PseudoEMetricSpace γ
f : α → β
x✝ y✝ z : α
s : Set α
inst✝ : Subsingleton α
x y : α
⊢ edist (f y) (f y) = edist y y
[PROOFSTEP]
simp
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝³ : PseudoEMetricSpace α
inst✝² : PseudoEMetricSpace β
inst✝¹ : PseudoEMetricSpace γ
f✝ : α → β
x✝ y✝ z : α
s : Set α
δ : Type u_2
inst✝ : PseudoEMetricSpace δ
f : α → β
g : γ → δ
hf : Isometry f
hg : Isometry g
x y : α × γ
⊢ edist (Prod.map f g x) (Prod.map f g y) = edist x y
[PROOFSTEP]
simp only [Prod.edist_eq, hf.edist_eq, hg.edist_eq, Prod_map]
[GOAL]
ι✝ : Type u_1
α✝ : Type u
β✝ : Type v
γ : Type w
inst✝⁵ : PseudoEMetricSpace α✝
inst✝⁴ : PseudoEMetricSpace β✝
inst✝³ : PseudoEMetricSpace γ
f✝ : α✝ → β✝
x✝ y✝ z : α✝
s : Set α✝
ι : Type u_4
inst✝² : Fintype ι
α : ι → Type u_2
β : ι → Type u_3
inst✝¹ : (i : ι) → PseudoEMetricSpace (α i)
inst✝ : (i : ι) → PseudoEMetricSpace (β i)
f : (i : ι) → α i → β i
hf : ∀ (i : ι), Isometry (f i)
x y : (i : ι) → α i
⊢ edist ((fun g i => f i (g i)) x) ((fun g i => f i (g i)) y) = edist x y
[PROOFSTEP]
simp only [edist_pi_def, (hf _).edist_eq]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
f✝ : α → β
x✝ y✝ z : α
s : Set α
f : α → β
g : β → α
h : Isometry f
hg : Function.RightInverse g f
x y : β
⊢ edist (g x) (g y) = edist x y
[PROOFSTEP]
rw [← h, hg _, hg _]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
f : α → β
x✝ y z : α
s : Set α
h : Isometry f
x : α
r : ℝ≥0∞
⊢ f ⁻¹' EMetric.closedBall (f x) r = EMetric.closedBall x r
[PROOFSTEP]
ext y
[GOAL]
case h
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
f : α → β
x✝ y✝ z : α
s : Set α
h : Isometry f
x : α
r : ℝ≥0∞
y : α
⊢ y ∈ f ⁻¹' EMetric.closedBall (f x) r ↔ y ∈ EMetric.closedBall x r
[PROOFSTEP]
simp [h.edist_eq]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
f : α → β
x✝ y z : α
s : Set α
h : Isometry f
x : α
r : ℝ≥0∞
⊢ f ⁻¹' EMetric.ball (f x) r = EMetric.ball x r
[PROOFSTEP]
ext y
[GOAL]
case h
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
f : α → β
x✝ y✝ z : α
s : Set α
h : Isometry f
x : α
r : ℝ≥0∞
y : α
⊢ y ∈ f ⁻¹' EMetric.ball (f x) r ↔ y ∈ EMetric.ball x r
[PROOFSTEP]
simp [h.edist_eq]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
f : α → β
x y z : α
s✝ : Set α
hf : Isometry f
s : Set α
d : ℝ≥0∞
⊢ EMetric.diam (f '' s) ≤ d ↔ EMetric.diam s ≤ d
[PROOFSTEP]
simp only [EMetric.diam_le_iff, ball_image_iff, hf.edist_eq]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
f : α → β
x y z : α
s : Set α
hf : Isometry f
⊢ EMetric.diam (range f) = EMetric.diam univ
[PROOFSTEP]
rw [← image_univ]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
f : α → β
x y z : α
s : Set α
hf : Isometry f
⊢ EMetric.diam (f '' univ) = EMetric.diam univ
[PROOFSTEP]
exact hf.ediam_image univ
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
f : α → β
hf : Isometry f
s : Set α
⊢ Metric.diam (f '' s) = Metric.diam s
[PROOFSTEP]
rw [Metric.diam, Metric.diam, hf.ediam_image]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
f : α → β
hf : Isometry f
⊢ Metric.diam (range f) = Metric.diam univ
[PROOFSTEP]
rw [← image_univ]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
f : α → β
hf : Isometry f
⊢ Metric.diam (f '' univ) = Metric.diam univ
[PROOFSTEP]
exact hf.diam_image univ
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
f : α → β
hf : Isometry f
x : α
p : ℝ → Prop
⊢ f ⁻¹' {y | p (dist y (f x))} = {y | p (dist y x)}
[PROOFSTEP]
ext y
[GOAL]
case h
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
f : α → β
hf : Isometry f
x : α
p : ℝ → Prop
y : α
⊢ y ∈ f ⁻¹' {y | p (dist y (f x))} ↔ y ∈ {y | p (dist y x)}
[PROOFSTEP]
simp [hf.dist_eq]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
h : α ≃ᵢ β
⊢ EMetric.diam univ = EMetric.diam univ
[PROOFSTEP]
rw [← h.range_eq_univ, h.isometry.ediam_range]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
h : α ≃ᵢ β
s : Set β
⊢ EMetric.diam (↑h ⁻¹' s) = EMetric.diam s
[PROOFSTEP]
rw [← image_symm, ediam_image]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
h : α ≃ᵢ β
x : β
r : ℝ≥0∞
⊢ ↑h ⁻¹' EMetric.ball x r = EMetric.ball (↑(IsometryEquiv.symm h) x) r
[PROOFSTEP]
rw [← h.isometry.preimage_emetric_ball (h.symm x) r, h.apply_symm_apply]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
h : α ≃ᵢ β
x : β
r : ℝ≥0∞
⊢ ↑h ⁻¹' EMetric.closedBall x r = EMetric.closedBall (↑(IsometryEquiv.symm h) x) r
[PROOFSTEP]
rw [← h.isometry.preimage_emetric_closedBall (h.symm x) r, h.apply_symm_apply]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
h : α ≃ᵢ β
x : α
r : ℝ≥0∞
⊢ ↑h '' EMetric.ball x r = EMetric.ball (↑h x) r
[PROOFSTEP]
rw [← h.preimage_symm, h.symm.preimage_emetric_ball, symm_symm]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
h : α ≃ᵢ β
x : α
r : ℝ≥0∞
⊢ ↑h '' EMetric.closedBall x r = EMetric.closedBall (↑h x) r
[PROOFSTEP]
rw [← h.preimage_symm, h.symm.preimage_emetric_closedBall, symm_symm]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝² : PseudoEMetricSpace α
inst✝¹ : PseudoEMetricSpace β
inst✝ : PseudoEMetricSpace γ
e : α ≃ᵢ β
⊢ CompleteSpace α ↔ CompleteSpace β
[PROOFSTEP]
simp only [completeSpace_iff_isComplete_univ, ← e.range_eq_univ, ← image_univ,
  isComplete_image_iff e.isometry.uniformInducing]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝⁴ : PseudoEMetricSpace α
inst✝³ : PseudoEMetricSpace β
inst✝² : PseudoEMetricSpace γ
inst✝¹ : Unique ι
inst✝ : Fintype ι
x hx : ι → α
⊢ edist (Equiv.toFun (Equiv.funUnique ι α) x) (Equiv.toFun (Equiv.funUnique ι α) hx) = edist x hx
[PROOFSTEP]
simp [edist_pi_def, Finset.univ_unique, Finset.sup_singleton]
[GOAL]
ι : Type u_1
α✝ : Type u
β : Type v
γ : Type w
inst✝³ : PseudoEMetricSpace α✝
inst✝² : PseudoEMetricSpace β
inst✝¹ : PseudoEMetricSpace γ
α : Fin 2 → Type u_2
inst✝ : (i : Fin 2) → PseudoEMetricSpace (α i)
x hx : (i : Fin 2) → α i
⊢ edist (Equiv.toFun (piFinTwoEquiv α) x) (Equiv.toFun (piFinTwoEquiv α) hx) = edist x hx
[PROOFSTEP]
simp [edist_pi_def, Fin.univ_succ, Prod.edist_eq]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
h : α ≃ᵢ β
s : Set β
⊢ Metric.diam (↑h ⁻¹' s) = Metric.diam s
[PROOFSTEP]
rw [← image_symm, diam_image]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
h✝ h : α ≃ᵢ β
x : β
r : ℝ
⊢ ↑h ⁻¹' Metric.ball x r = Metric.ball (↑(IsometryEquiv.symm h) x) r
[PROOFSTEP]
rw [← h.isometry.preimage_ball (h.symm x) r, h.apply_symm_apply]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
h✝ h : α ≃ᵢ β
x : β
r : ℝ
⊢ ↑h ⁻¹' Metric.sphere x r = Metric.sphere (↑(IsometryEquiv.symm h) x) r
[PROOFSTEP]
rw [← h.isometry.preimage_sphere (h.symm x) r, h.apply_symm_apply]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
h✝ h : α ≃ᵢ β
x : β
r : ℝ
⊢ ↑h ⁻¹' Metric.closedBall x r = Metric.closedBall (↑(IsometryEquiv.symm h) x) r
[PROOFSTEP]
rw [← h.isometry.preimage_closedBall (h.symm x) r, h.apply_symm_apply]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
h✝ h : α ≃ᵢ β
x : α
r : ℝ
⊢ ↑h '' Metric.ball x r = Metric.ball (↑h x) r
[PROOFSTEP]
rw [← h.preimage_symm, h.symm.preimage_ball, symm_symm]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
h✝ h : α ≃ᵢ β
x : α
r : ℝ
⊢ ↑h '' Metric.sphere x r = Metric.sphere (↑h x) r
[PROOFSTEP]
rw [← h.preimage_symm, h.symm.preimage_sphere, symm_symm]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
inst✝¹ : PseudoMetricSpace α
inst✝ : PseudoMetricSpace β
h✝ h : α ≃ᵢ β
x : α
r : ℝ
⊢ ↑h '' Metric.closedBall x r = Metric.closedBall (↑h x) r
[PROOFSTEP]
rw [← h.preimage_symm, h.symm.preimage_closedBall, symm_symm]


[GOAL]
α : Type u_1
inst✝ : AddCommMonoid α
k : α
n : ℕ
x a a' : α
h : k + a = a'
⊢ k + term n x a = term n x a'
[PROOFSTEP]
simp [h.symm, term, add_comm, add_assoc]
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
k : α
n : ℤ
x a a' : α
h : k + a = a'
⊢ k + termg n x a = termg n x a'
[PROOFSTEP]
simp [h.symm, termg, add_comm, add_assoc]
[GOAL]
α : Type u_1
inst✝ : AddCommMonoid α
n : ℕ
x a k a' : α
h : a + k = a'
⊢ term n x a + k = term n x a'
[PROOFSTEP]
simp [h.symm, term, add_assoc]
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
n : ℤ
x a k a' : α
h : a + k = a'
⊢ termg n x a + k = termg n x a'
[PROOFSTEP]
simp [h.symm, termg, add_assoc]
[GOAL]
α : Type u_1
inst✝ : AddCommMonoid α
n₁ : ℕ
x a₁ : α
n₂ : ℕ
a₂ : α
n' : ℕ
a' : α
h₁ : n₁ + n₂ = n'
h₂ : a₁ + a₂ = a'
⊢ term n₁ x a₁ + term n₂ x a₂ = term n' x a'
[PROOFSTEP]
simp [h₁.symm, h₂.symm, term, add_nsmul, add_assoc, add_left_comm]
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
n₁ : ℤ
x a₁ : α
n₂ : ℤ
a₂ : α
n' : ℤ
a' : α
h₁ : n₁ + n₂ = n'
h₂ : a₁ + a₂ = a'
⊢ termg n₁ x a₁ + termg n₂ x a₂ = termg n' x a'
[PROOFSTEP]
simp [h₁.symm, h₂.symm, termg, add_zsmul]
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
n₁ : ℤ
x a₁ : α
n₂ : ℤ
a₂ : α
n' : ℤ
a' : α
h₁ : n₁ + n₂ = n'
h₂ : a₁ + a₂ = a'
⊢ n₁ • x + a₁ + (n₂ • x + a₂) = n₁ • x + n₂ • x + (a₁ + a₂)
[PROOFSTEP]
exact add_add_add_comm (n₁ • x) a₁ (n₂ • x) a₂
[GOAL]
α : Type u_1
inst✝ : AddCommMonoid α
x a : α
⊢ term 0 x a = a
[PROOFSTEP]
simp [term, zero_nsmul, one_nsmul]
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
x a : α
⊢ termg 0 x a = a
[PROOFSTEP]
simp [termg, zero_zsmul]
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
n : ℤ
x a : α
n' : ℤ
a' : α
h₁ : -n = n'
h₂ : -a = a'
⊢ -termg n x a = termg n' x a'
[PROOFSTEP]
simp [h₂.symm, h₁.symm, termg]
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
n : ℤ
x a : α
n' : ℤ
a' : α
h₁ : -n = n'
h₂ : -a = a'
⊢ -a + -(n • x) = -(n • x) + -a
[PROOFSTEP]
exact add_comm _ _
[GOAL]
α : Type u_1
inst✝ : AddCommMonoid α
c : ℕ
⊢ smul c 0 = 0
[PROOFSTEP]
simp [smul, nsmul_zero]
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
c : ℤ
⊢ smulg c 0 = 0
[PROOFSTEP]
simp [smulg, zsmul_zero]
[GOAL]
α : Type u_1
inst✝ : AddCommMonoid α
c n : ℕ
x a : α
n' : ℕ
a' : α
h₁ : c * n = n'
h₂ : smul c a = a'
⊢ smul c (term n x a) = term n' x a'
[PROOFSTEP]
simp [h₂.symm, h₁.symm, term, smul, nsmul_add, mul_nsmul']
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
c n : ℤ
x a : α
n' : ℤ
a' : α
h₁ : c * n = n'
h₂ : smulg c a = a'
⊢ smulg c (termg n x a) = termg n' x a'
[PROOFSTEP]
simp [h₂.symm, h₁.symm, termg, smulg, zsmul_add, mul_zsmul]
[GOAL]
α : Type u_1
inst✝ : AddCommMonoid α
x : α
⊢ x = term 1 x 0
[PROOFSTEP]
simp [term]
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
x : α
⊢ x = termg 1 x 0
[PROOFSTEP]
simp [termg]
[GOAL]
α : Type u_1
inst✝ : AddCommMonoid α
x x' : α
h : x = x'
⊢ x = term 1 x' 0
[PROOFSTEP]
simp [term, h]
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
x x' : α
h : x = x'
⊢ x = termg 1 x' 0
[PROOFSTEP]
simp [termg, h]
[GOAL]
α : Type u_1
inst✝ : SubtractionMonoid α
a b c : α
h : a + -b = c
⊢ a - b = c
[PROOFSTEP]
rw [sub_eq_add_neg, h]
[GOAL]
α : Type u_1
inst✝ : AddCommMonoid α
l : ℕ
r : α
tl : ℕ
tr t : α
prl : l = tl
prr : r = tr
prt : smul tl tr = t
⊢ smul l r = t
[PROOFSTEP]
simp [prl, prr, prt]
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
l : ℤ
r : α
tl : ℤ
tr t : α
prl : l = tl
prr : r = tr
prt : smulg tl tr = t
⊢ smulg l r = t
[PROOFSTEP]
simp [prl, prr, prt]
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
l : ℕ
r : α
tl : ℕ
zl : ℤ
tr t : α
prl₁ : l = tl
prl₂ : ↑tl = zl
prr : r = tr
prt : smulg zl tr = t
⊢ smul l r = t
[PROOFSTEP]
simp [← prt, prl₁, ← prl₂, prr, smul, smulg, coe_nat_zsmul]
[GOAL]
α : Type u_1
inst✝ : AddCommMonoid α
l r tl tr t : α
prl : l = tl
prr : r = tr
prt : tl + tr = t
⊢ l + r = t
[PROOFSTEP]
rw [prl, prr, prt]
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
l r tl tr t : α
prl : l = tl
prr : r = tr
prt : tl + tr = t
⊢ l + r = t
[PROOFSTEP]
rw [prl, prr, prt]
[GOAL]
α : Type u_1
inst✝ : AddCommGroup α
a ta t : α
pra : a = ta
prt : -ta = t
⊢ -a = t
[PROOFSTEP]
simp [pra, prt]


[GOAL]
α : Type u_1
inst✝² : LinearOrder α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
a b c d : α
⊢ 𝓝ˢ (Ici a) = 𝓝 a ⊔ 𝓟 (Ioi a)
[PROOFSTEP]
rw [← Ioi_insert, nhdsSet_insert, nhdsSet_Ioi]
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
a b c d : α
h : a < b
⊢ 𝓝ˢ (Ico a b) = 𝓝 a ⊔ 𝓟 (Ioo a b)
[PROOFSTEP]
rw [← Ioo_insert_left h, nhdsSet_insert, nhdsSet_Ioo]
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
a b c d : α
h : a < b
⊢ 𝓝ˢ (Ioc a b) = 𝓝 b ⊔ 𝓟 (Ioo a b)
[PROOFSTEP]
rw [← Ioo_insert_right h, nhdsSet_insert, nhdsSet_Ioo]
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
a b c d : α
h : a ≤ b
⊢ 𝓝ˢ (Icc a b) = 𝓝 a ⊔ 𝓝 b ⊔ 𝓟 (Ioo a b)
[PROOFSTEP]
rcases h.eq_or_lt with rfl | hlt
[GOAL]
case inl
α : Type u_1
inst✝² : LinearOrder α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
a c d : α
h : a ≤ a
⊢ 𝓝ˢ (Icc a a) = 𝓝 a ⊔ 𝓝 a ⊔ 𝓟 (Ioo a a)
[PROOFSTEP]
simp
[GOAL]
case inr
α : Type u_1
inst✝² : LinearOrder α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
a b c d : α
h : a ≤ b
hlt : a < b
⊢ 𝓝ˢ (Icc a b) = 𝓝 a ⊔ 𝓝 b ⊔ 𝓟 (Ioo a b)
[PROOFSTEP]
rw [← Ioc_insert_left h, nhdsSet_insert, nhdsSet_Ioc hlt, sup_assoc]
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
a b c d : α
⊢ Ioi a ∈ 𝓝ˢ (Ici b) ↔ a < b
[PROOFSTEP]
rw [isOpen_Ioi.mem_nhdsSet, Ici_subset_Ioi]
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
a b c d : α
h : b ≤ c
⊢ Iio c ∈ 𝓝ˢ (Iio b)
[PROOFSTEP]
simpa
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
a b c d : α
h : a ≤ b
⊢ Ioi a ∈ 𝓝ˢ (Ioi b)
[PROOFSTEP]
simpa
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
inst✝¹ : TopologicalSpace α
inst✝ : OrderTopology α
a : α
h : Nonempty ↑(Ioi a)
⊢ HasBasis (𝓝ˢ (Iic a)) (fun x => a < x) Iio
[PROOFSTEP]
refine ⟨fun s ↦ ⟨fun hs ↦ ?_, fun ⟨b, hab, hb⟩ ↦ mem_of_superset (Iio_mem_nhdsSet_Iic hab) hb⟩⟩
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
inst✝¹ : TopologicalSpace α
inst✝ : OrderTopology α
a : α
h : Nonempty ↑(Ioi a)
s : Set α
hs : s ∈ 𝓝ˢ (Iic a)
⊢ ∃ i, a < i ∧ Iio i ⊆ s
[PROOFSTEP]
rw [nhdsSet_Iic, mem_sup, mem_principal] at hs
[GOAL]
α : Type u_1
inst✝² : LinearOrder α
inst✝¹ : TopologicalSpace α
inst✝ : OrderTopology α
a : α
h : Nonempty ↑(Ioi a)
s : Set α
hs : s ∈ 𝓝 a ∧ Iio a ⊆ s
⊢ ∃ i, a < i ∧ Iio i ⊆ s
[PROOFSTEP]
rcases exists_Ico_subset_of_mem_nhds hs.1 (Set.nonempty_coe_sort.1 h) with ⟨b, hab, hbs⟩
[GOAL]
case intro.intro
α : Type u_1
inst✝² : LinearOrder α
inst✝¹ : TopologicalSpace α
inst✝ : OrderTopology α
a : α
h : Nonempty ↑(Ioi a)
s : Set α
hs : s ∈ 𝓝 a ∧ Iio a ⊆ s
b : α
hab : a < b
hbs : Ico a b ⊆ s
⊢ ∃ i, a < i ∧ Iio i ⊆ s
[PROOFSTEP]
exact ⟨b, hab, Iio_subset_Iio_union_Ico.trans (union_subset hs.2 hbs)⟩
[GOAL]
α : Type u_1
inst✝³ : LinearOrder α
inst✝² : TopologicalSpace α
inst✝¹ : OrderTopology α
a : α
inst✝ : NeBot (𝓝[Ioi a] a)
⊢ HasBasis (𝓝ˢ (Iic a)) (fun x => a < x) Iic
[PROOFSTEP]
have : Nonempty (Ioi a) := (Filter.nonempty_of_mem (self_mem_nhdsWithin : Ioi a ∈ 𝓝[>] a)).to_subtype
[GOAL]
α : Type u_1
inst✝³ : LinearOrder α
inst✝² : TopologicalSpace α
inst✝¹ : OrderTopology α
a : α
inst✝ : NeBot (𝓝[Ioi a] a)
this : Nonempty ↑(Ioi a)
⊢ HasBasis (𝓝ˢ (Iic a)) (fun x => a < x) Iic
[PROOFSTEP]
refine (hasBasis_nhdsSet_Iic_Iio _).to_hasBasis (fun c hc ↦ ?_) (fun _ h ↦ ⟨_, h, Iio_subset_Iic_self⟩)
[GOAL]
α : Type u_1
inst✝³ : LinearOrder α
inst✝² : TopologicalSpace α
inst✝¹ : OrderTopology α
a : α
inst✝ : NeBot (𝓝[Ioi a] a)
this : Nonempty ↑(Ioi a)
c : α
hc : a < c
⊢ ∃ i', a < i' ∧ Iic i' ⊆ Iio c
[PROOFSTEP]
simpa only [Iic_subset_Iio] using (Filter.nonempty_of_mem <| Ioo_mem_nhdsWithin_Ioi' hc)


[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
u : M₀ˣ
a : M₀
h : a * ↑u = 0
⊢ a = 0
[PROOFSTEP]
simpa using mul_eq_zero_of_left h ↑u⁻¹
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
u : M₀ˣ
a : M₀
h : ↑u * a = 0
⊢ a = 0
[PROOFSTEP]
simpa using mul_eq_zero_of_right (↑u⁻¹) h
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
x✝ : IsUnit 0
a : M₀
a0 : 0 * a = 1
inv_val✝ : a * 0 = 1
⊢ 0 = 1
[PROOFSTEP]
rwa [zero_mul] at a0
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
u : M₀ˣ
⊢ inverse ↑u = ↑u⁻¹
[PROOFSTEP]
rw [inverse, dif_pos u.isUnit, IsUnit.unit_of_val_units]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
x : M₀
h : IsUnit x
⊢ x * inverse x = 1
[PROOFSTEP]
rcases h with ⟨u, rfl⟩
[GOAL]
case intro
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
u : M₀ˣ
⊢ ↑u * inverse ↑u = 1
[PROOFSTEP]
rw [inverse_unit, Units.mul_inv]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
x : M₀
h : IsUnit x
⊢ inverse x * x = 1
[PROOFSTEP]
rcases h with ⟨u, rfl⟩
[GOAL]
case intro
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
u : M₀ˣ
⊢ inverse ↑u * ↑u = 1
[PROOFSTEP]
rw [inverse_unit, Units.inv_mul]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
x y : M₀
h : IsUnit x
⊢ y * x * inverse x = y
[PROOFSTEP]
rw [mul_assoc, mul_inverse_cancel x h, mul_one]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
x y : M₀
h : IsUnit x
⊢ y * inverse x * x = y
[PROOFSTEP]
rw [mul_assoc, inverse_mul_cancel x h, mul_one]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
x y : M₀
h : IsUnit x
⊢ x * (inverse x * y) = y
[PROOFSTEP]
rw [← mul_assoc, mul_inverse_cancel x h, one_mul]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
x y : M₀
h : IsUnit x
⊢ inverse x * (x * y) = y
[PROOFSTEP]
rw [← mul_assoc, inverse_mul_cancel x h, one_mul]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
x y z : M₀
h : IsUnit x
h1 : inverse x * y = z
⊢ y = x * z
[PROOFSTEP]
rw [← h1, mul_inverse_cancel_left _ _ h]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
x y z : M₀
h : IsUnit x
h1 : y = x * z
⊢ inverse x * y = z
[PROOFSTEP]
rw [h1, inverse_mul_cancel_left _ _ h]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
x y z : M₀
h : IsUnit z
h1 : x = y * inverse z
⊢ x * z = y
[PROOFSTEP]
rw [h1, inverse_mul_cancel_right _ _ h]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
x y z : M₀
h : IsUnit z
h1 : x * z = y
⊢ x = y * inverse z
[PROOFSTEP]
rw [← h1, mul_inverse_cancel_right _ _ h]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
⊢ inverse 0 = 0
[PROOFSTEP]
nontriviality
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
✝ : Nontrivial M₀
⊢ inverse 0 = 0
[PROOFSTEP]
exact inverse_non_unit _ not_isUnit_zero
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
a : M₀
h : IsUnit (Ring.inverse a)
⊢ IsUnit a
[PROOFSTEP]
cases subsingleton_or_nontrivial M₀
[GOAL]
case inl
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
a : M₀
h : IsUnit (Ring.inverse a)
h✝ : Subsingleton M₀
⊢ IsUnit a
[PROOFSTEP]
convert h
[GOAL]
case inr
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
a : M₀
h : IsUnit (Ring.inverse a)
h✝ : Nontrivial M₀
⊢ IsUnit a
[PROOFSTEP]
contrapose h
[GOAL]
case inr
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
a : M₀
h✝ : Nontrivial M₀
h : ¬IsUnit a
⊢ ¬IsUnit (Ring.inverse a)
[PROOFSTEP]
rw [Ring.inverse_non_unit _ h]
[GOAL]
case inr
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝ : MonoidWithZero M₀
a : M₀
h✝ : Nontrivial M₀
h : ¬IsUnit a
⊢ ¬IsUnit 0
[PROOFSTEP]
exact not_isUnit_zero
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a b : G₀
h : optParam (1 ≠ 0) (_ : 1 ≠ 0)
⊢ mk0 1 h = 1
[PROOFSTEP]
ext
[GOAL]
case a
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a b : G₀
h : optParam (1 ≠ 0) (_ : 1 ≠ 0)
⊢ ↑(mk0 1 h) = ↑1
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a✝ b✝ a b : G₀
ha : a ≠ 0
hb : b ≠ 0
h : mk0 a ha = mk0 b hb
⊢ a = b
[PROOFSTEP]
injection h
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a b : G₀
p : (g : G₀) → g ≠ 0 → Prop
⊢ (∃ g hg, p g hg) ↔ ∃ g hg, p ↑(mk0 g hg) (_ : ↑(mk0 g hg) ≠ 0)
[PROOFSTEP]
simp_rw [val_mk0]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a b x : G₀
⊢ (∃ u, ↑u = x) ↔ x ≠ 0
[PROOFSTEP]
simp [exists0]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a✝ b a : G₀
⊢ a = 0 ∨ ∃ u, a = ↑u
[PROOFSTEP]
by_cases h : a = 0
[GOAL]
case pos
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a✝ b a : G₀
h : a = 0
⊢ a = 0 ∨ ∃ u, a = ↑u
[PROOFSTEP]
left
[GOAL]
case pos.h
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a✝ b a : G₀
h : a = 0
⊢ a = 0
[PROOFSTEP]
exact h
[GOAL]
case neg
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a✝ b a : G₀
h : ¬a = 0
⊢ a = 0 ∨ ∃ u, a = ↑u
[PROOFSTEP]
right
[GOAL]
case neg.h
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a✝ b a : G₀
h : ¬a = 0
⊢ ∃ u, a = ↑u
[PROOFSTEP]
simpa only [eq_comm] using Units.exists_iff_ne_zero.mpr h
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a✝ b✝ c : G₀
src✝ : GroupWithZero G₀ := inst✝
a b : G₀
h : a * b = 0
⊢ a = 0 ∨ b = 0
[PROOFSTEP]
contrapose! h
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a✝ b✝ c : G₀
src✝ : GroupWithZero G₀ := inst✝
a b : G₀
h : a ≠ 0 ∧ b ≠ 0
⊢ a * b ≠ 0
[PROOFSTEP]
exact (Units.mk0 a h.1 * Units.mk0 b h.2).ne_zero
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a b c x y : G₀
hxy : x * y ≠ 0
⊢ mk0 (x * y) hxy = mk0 x (_ : x ≠ 0) * mk0 y (_ : y ≠ 0)
[PROOFSTEP]
ext
[GOAL]
case a
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a b c x y : G₀
hxy : x * y ≠ 0
⊢ ↑(mk0 (x * y) hxy) = ↑(mk0 x (_ : x ≠ 0) * mk0 y (_ : y ≠ 0))
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a b c : G₀
ha : a ≠ 0
hb : b ≠ 0
⊢ a / b ≠ 0
[PROOFSTEP]
rw [div_eq_mul_inv]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a b c : G₀
ha : a ≠ 0
hb : b ≠ 0
⊢ a * b⁻¹ ≠ 0
[PROOFSTEP]
exact mul_ne_zero ha (inv_ne_zero hb)
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a b c : G₀
⊢ a / b = 0 ↔ a = 0 ∨ b = 0
[PROOFSTEP]
simp [div_eq_mul_inv]
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
⊢ inverse a = a⁻¹
[PROOFSTEP]
obtain rfl | ha := eq_or_ne a 0
[GOAL]
case inl
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a b c : G₀
⊢ inverse 0 = 0⁻¹
[PROOFSTEP]
simp
[GOAL]
case inr
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
inst✝ : GroupWithZero G₀
a✝ b c a : G₀
ha : a ≠ 0
⊢ inverse a = a⁻¹
[PROOFSTEP]
exact Ring.inverse_unit (Units.mk0 a ha)
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
M : Type u_8
inst✝ : Nontrivial M
hM : MonoidWithZero M
h : ∀ (a : M), IsUnit a ∨ a = 0
a : M
h0 : a ≠ 0
⊢ a * a⁻¹ = 1
[PROOFSTEP]
change (a * if h0 : a = 0 then 0 else ↑((h a).resolve_right h0).unit⁻¹) = 1
[GOAL]
α : Type u_1
M₀ : Type u_2
G₀ : Type u_3
M₀' : Type u_4
G₀' : Type u_5
F : Type u_6
F' : Type u_7
inst✝¹ : MonoidWithZero M₀
M : Type u_8
inst✝ : Nontrivial M
hM : MonoidWithZero M
h : ∀ (a : M), IsUnit a ∨ a = 0
a : M
h0 : a ≠ 0
⊢ (a * if h0 : a = 0 then 0 else ↑(IsUnit.unit (_ : IsUnit a))⁻¹) = 1
[PROOFSTEP]
rw [dif_neg h0, Units.mul_inv_eq_iff_eq_mul, one_mul, IsUnit.unit_spec]


[GOAL]
⊢ ∀ {X' X : SemigroupCat} {Y : MonCat} (f : X' ⟶ X) (g : X ⟶ (forget₂ MonCat SemigroupCat).obj Y),
    ↑((fun S M => WithOne.lift.symm) X' Y).symm (f ≫ g) = adjoinOne.map f ≫ ↑((fun S M => WithOne.lift.symm) X Y).symm g
[PROOFSTEP]
intro S T M f g
[GOAL]
S T : SemigroupCat
M : MonCat
f : S ⟶ T
g : T ⟶ (forget₂ MonCat SemigroupCat).obj M
⊢ ↑((fun S M => WithOne.lift.symm) S M).symm (f ≫ g) = adjoinOne.map f ≫ ↑((fun S M => WithOne.lift.symm) T M).symm g
[PROOFSTEP]
ext x
[GOAL]
case w
S T : SemigroupCat
M : MonCat
f : S ⟶ T
g : T ⟶ (forget₂ MonCat SemigroupCat).obj M
x : ↑(adjoinOne.obj S)
⊢ ↑(↑((fun S M => WithOne.lift.symm) S M).symm (f ≫ g)) x =
    ↑(adjoinOne.map f ≫ ↑((fun S M => WithOne.lift.symm) T M).symm g) x
[PROOFSTEP]
simp only [Equiv.symm_symm, adjoinOne_map, coe_comp]
[GOAL]
case w
S T : SemigroupCat
M : MonCat
f : S ⟶ T
g : T ⟶ (forget₂ MonCat SemigroupCat).obj M
x : ↑(adjoinOne.obj S)
⊢ ↑(↑WithOne.lift (f ≫ g)) x = ↑(WithOne.map f ≫ ↑WithOne.lift g) x
[PROOFSTEP]
simp_rw [WithOne.map]
[GOAL]
case w
S T : SemigroupCat
M : MonCat
f : S ⟶ T
g : T ⟶ (forget₂ MonCat SemigroupCat).obj M
x : ↑(adjoinOne.obj S)
⊢ ↑(↑WithOne.lift (f ≫ g)) x = ↑(↑WithOne.lift (MulHom.comp WithOne.coeMulHom f) ≫ ↑WithOne.lift g) x
[PROOFSTEP]
cases x
[GOAL]
case w.none
S T : SemigroupCat
M : MonCat
f : S ⟶ T
g : T ⟶ (forget₂ MonCat SemigroupCat).obj M
⊢ ↑(↑WithOne.lift (f ≫ g)) none = ↑(↑WithOne.lift (MulHom.comp WithOne.coeMulHom f) ≫ ↑WithOne.lift g) none
[PROOFSTEP]
rfl
[GOAL]
case w.some
S T : SemigroupCat
M : MonCat
f : S ⟶ T
g : T ⟶ (forget₂ MonCat SemigroupCat).obj M
val✝ : ↑S
⊢ ↑(↑WithOne.lift (f ≫ g)) (some val✝) =
    ↑(↑WithOne.lift (MulHom.comp WithOne.coeMulHom f) ≫ ↑WithOne.lift g) (some val✝)
[PROOFSTEP]
simp
[GOAL]
case w.some
S T : SemigroupCat
M : MonCat
f : S ⟶ T
g : T ⟶ (forget₂ MonCat SemigroupCat).obj M
val✝ : ↑S
⊢ ↑(↑WithOne.lift (f ≫ g)) (some val✝) =
    ↑(↑WithOne.lift g) (↑(↑WithOne.lift (MulHom.comp WithOne.coeMulHom f)) (some val✝))
[PROOFSTEP]
rfl