[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
x✝¹ x✝ : HomogeneousIdeal 𝒜
x : Submodule A A
hx : Ideal.IsHomogeneous 𝒜 x
y : Submodule A A
hy : Ideal.IsHomogeneous 𝒜 y
h : x = y
⊢ { toSubmodule := x, is_homogeneous' := hx } = { toSubmodule := y, is_homogeneous' := hy }
[PROOFSTEP]
simp [h]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I✝ I : Ideal A
r x : A
hx₁ : Homogeneous 𝒜 x
hx₂ : x ∈ I
j : ι
⊢ ↑(GradedRing.proj 𝒜 j) (r * x) ∈ I
[PROOFSTEP]
classical
rw [← DirectSum.sum_support_decompose 𝒜 r, Finset.sum_mul, map_sum]
apply Ideal.sum_mem
intro k _
obtain ⟨i, hi⟩ := hx₁
have mem₁ : (DirectSum.decompose 𝒜 r k : A) * x ∈ 𝒜 (k + i) := GradedMul.mul_mem (SetLike.coe_mem _) hi
erw [GradedRing.proj_apply, DirectSum.decompose_of_mem 𝒜 mem₁, coe_of_apply]
split_ifs
· exact I.mul_mem_left _ hx₂
· exact I.zero_mem
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I✝ I : Ideal A
r x : A
hx₁ : Homogeneous 𝒜 x
hx₂ : x ∈ I
j : ι
⊢ ↑(GradedRing.proj 𝒜 j) (r * x) ∈ I
[PROOFSTEP]
rw [← DirectSum.sum_support_decompose 𝒜 r, Finset.sum_mul, map_sum]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I✝ I : Ideal A
r x : A
hx₁ : Homogeneous 𝒜 x
hx₂ : x ∈ I
j : ι
⊢ ∑ x_1 in DFinsupp.support (↑(decompose 𝒜) r), ↑(GradedRing.proj 𝒜 j) (↑(↑(↑(decompose 𝒜) r) x_1) * x) ∈ I
[PROOFSTEP]
apply Ideal.sum_mem
[GOAL]
case a
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I✝ I : Ideal A
r x : A
hx₁ : Homogeneous 𝒜 x
hx₂ : x ∈ I
j : ι
⊢ ∀ (c : ι), c ∈ DFinsupp.support (↑(decompose 𝒜) r) → ↑(GradedRing.proj 𝒜 j) (↑(↑(↑(decompose 𝒜) r) c) * x) ∈ I
[PROOFSTEP]
intro k _
[GOAL]
case a
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I✝ I : Ideal A
r x : A
hx₁ : Homogeneous 𝒜 x
hx₂ : x ∈ I
j k : ι
a✝ : k ∈ DFinsupp.support (↑(decompose 𝒜) r)
⊢ ↑(GradedRing.proj 𝒜 j) (↑(↑(↑(decompose 𝒜) r) k) * x) ∈ I
[PROOFSTEP]
obtain ⟨i, hi⟩ := hx₁
[GOAL]
case a.intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I✝ I : Ideal A
r x : A
hx₂ : x ∈ I
j k : ι
a✝ : k ∈ DFinsupp.support (↑(decompose 𝒜) r)
i : ι
hi : x ∈ 𝒜 i
⊢ ↑(GradedRing.proj 𝒜 j) (↑(↑(↑(decompose 𝒜) r) k) * x) ∈ I
[PROOFSTEP]
have mem₁ : (DirectSum.decompose 𝒜 r k : A) * x ∈ 𝒜 (k + i) := GradedMul.mul_mem (SetLike.coe_mem _) hi
[GOAL]
case a.intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I✝ I : Ideal A
r x : A
hx₂ : x ∈ I
j k : ι
a✝ : k ∈ DFinsupp.support (↑(decompose 𝒜) r)
i : ι
hi : x ∈ 𝒜 i
mem₁ : ↑(↑(↑(decompose 𝒜) r) k) * x ∈ 𝒜 (k + i)
⊢ ↑(GradedRing.proj 𝒜 j) (↑(↑(↑(decompose 𝒜) r) k) * x) ∈ I
[PROOFSTEP]
erw [GradedRing.proj_apply, DirectSum.decompose_of_mem 𝒜 mem₁, coe_of_apply]
[GOAL]
case a.intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I✝ I : Ideal A
r x : A
hx₂ : x ∈ I
j k : ι
a✝ : k ∈ DFinsupp.support (↑(decompose 𝒜) r)
i : ι
hi : x ∈ 𝒜 i
mem₁ : ↑(↑(↑(decompose 𝒜) r) k) * x ∈ 𝒜 (k + i)
⊢ ↑(if k + i = j then { val := ↑(↑(↑(decompose 𝒜) r) k) * x, property := mem₁ } else 0) ∈ I
[PROOFSTEP]
split_ifs
[GOAL]
case pos
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I✝ I : Ideal A
r x : A
hx₂ : x ∈ I
j k : ι
a✝ : k ∈ DFinsupp.support (↑(decompose 𝒜) r)
i : ι
hi : x ∈ 𝒜 i
mem₁ : ↑(↑(↑(decompose 𝒜) r) k) * x ∈ 𝒜 (k + i)
h✝ : k + i = j
⊢ ↑{ val := ↑(↑(↑(decompose 𝒜) r) k) * x, property := mem₁ } ∈ I
[PROOFSTEP]
exact I.mul_mem_left _ hx₂
[GOAL]
case neg
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I✝ I : Ideal A
r x : A
hx₂ : x ∈ I
j k : ι
a✝ : k ∈ DFinsupp.support (↑(decompose 𝒜) r)
i : ι
hi : x ∈ 𝒜 i
mem₁ : ↑(↑(↑(decompose 𝒜) r) k) * x ∈ 𝒜 (k + i)
h✝ : ¬k + i = j
⊢ ↑0 ∈ I
[PROOFSTEP]
exact I.zero_mem
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
s : Set A
h : ∀ (x : A), x ∈ s → Homogeneous 𝒜 x
⊢ IsHomogeneous 𝒜 (span s)
[PROOFSTEP]
rintro i r hr
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
s : Set A
h : ∀ (x : A), x ∈ s → Homogeneous 𝒜 x
i : ι
r : A
hr : r ∈ span s
⊢ ↑(↑(↑(decompose 𝒜) r) i) ∈ span s
[PROOFSTEP]
rw [Ideal.span, Finsupp.span_eq_range_total] at hr
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
s : Set A
h : ∀ (x : A), x ∈ s → Homogeneous 𝒜 x
i : ι
r : A
hr : r ∈ LinearMap.range (Finsupp.total (↑s) A A Subtype.val)
⊢ ↑(↑(↑(decompose 𝒜) r) i) ∈ span s
[PROOFSTEP]
rw [LinearMap.mem_range] at hr
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
s : Set A
h : ∀ (x : A), x ∈ s → Homogeneous 𝒜 x
i : ι
r : A
hr : ∃ y, ↑(Finsupp.total (↑s) A A Subtype.val) y = r
⊢ ↑(↑(↑(decompose 𝒜) r) i) ∈ span s
[PROOFSTEP]
obtain ⟨s, rfl⟩ := hr
[GOAL]
case intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
s✝ : Set A
h : ∀ (x : A), x ∈ s✝ → Homogeneous 𝒜 x
i : ι
s : ↑s✝ →₀ A
⊢ ↑(↑(↑(decompose 𝒜) (↑(Finsupp.total (↑s✝) A A Subtype.val) s)) i) ∈ span s✝
[PROOFSTEP]
rw [Finsupp.total_apply, Finsupp.sum, decompose_sum, DFinsupp.finset_sum_apply, AddSubmonoidClass.coe_finset_sum]
[GOAL]
case intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
s✝ : Set A
h : ∀ (x : A), x ∈ s✝ → Homogeneous 𝒜 x
i : ι
s : ↑s✝ →₀ A
⊢ ∑ i_1 in s.support, ↑(↑(↑(decompose 𝒜) (↑s i_1 • ↑i_1)) i) ∈ span s✝
[PROOFSTEP]
refine' Ideal.sum_mem _ _
[GOAL]
case intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
s✝ : Set A
h : ∀ (x : A), x ∈ s✝ → Homogeneous 𝒜 x
i : ι
s : ↑s✝ →₀ A
⊢ ∀ (c : ↑s✝), c ∈ s.support → ↑(↑(↑(decompose 𝒜) (↑s c • ↑c)) i) ∈ span s✝
[PROOFSTEP]
rintro z hz1
[GOAL]
case intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
s✝ : Set A
h : ∀ (x : A), x ∈ s✝ → Homogeneous 𝒜 x
i : ι
s : ↑s✝ →₀ A
z : ↑s✝
hz1 : z ∈ s.support
⊢ ↑(↑(↑(decompose 𝒜) (↑s z • ↑z)) i) ∈ span s✝
[PROOFSTEP]
rw [smul_eq_mul]
[GOAL]
case intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
s✝ : Set A
h : ∀ (x : A), x ∈ s✝ → Homogeneous 𝒜 x
i : ι
s : ↑s✝ →₀ A
z : ↑s✝
hz1 : z ∈ s.support
⊢ ↑(↑(↑(decompose 𝒜) (↑s z * ↑z)) i) ∈ span s✝
[PROOFSTEP]
refine' Ideal.mul_homogeneous_element_mem_of_mem 𝒜 (s z) z _ _ i
[GOAL]
case intro.refine'_1
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
s✝ : Set A
h : ∀ (x : A), x ∈ s✝ → Homogeneous 𝒜 x
i : ι
s : ↑s✝ →₀ A
z : ↑s✝
hz1 : z ∈ s.support
⊢ Homogeneous 𝒜 ↑z
[PROOFSTEP]
rcases z with ⟨z, hz2⟩
[GOAL]
case intro.refine'_1.mk
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
s✝ : Set A
h : ∀ (x : A), x ∈ s✝ → Homogeneous 𝒜 x
i : ι
s : ↑s✝ →₀ A
z : A
hz2 : z ∈ s✝
hz1 : { val := z, property := hz2 } ∈ s.support
⊢ Homogeneous 𝒜 ↑{ val := z, property := hz2 }
[PROOFSTEP]
apply h _ hz2
[GOAL]
case intro.refine'_2
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
s✝ : Set A
h : ∀ (x : A), x ∈ s✝ → Homogeneous 𝒜 x
i : ι
s : ↑s✝ →₀ A
z : ↑s✝
hz1 : z ∈ s.support
⊢ ↑z ∈ span s✝
[PROOFSTEP]
exact Ideal.subset_span z.2
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
h : IsHomogeneous 𝒜 I
⊢ HomogeneousIdeal.toIdeal (homogeneousCore 𝒜 I) = I
[PROOFSTEP]
apply le_antisymm (I.homogeneousCore'_le 𝒜) _
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
h : IsHomogeneous 𝒜 I
⊢ I ≤ homogeneousCore' 𝒜 I
[PROOFSTEP]
intro x hx
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
h : IsHomogeneous 𝒜 I
x : A
hx : x ∈ I
⊢ x ∈ homogeneousCore' 𝒜 I
[PROOFSTEP]
classical
rw [← DirectSum.sum_support_decompose 𝒜 x]
exact Ideal.sum_mem _ fun j _ => Ideal.subset_span ⟨⟨_, homogeneous_coe _⟩, h _ hx, rfl⟩
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
h : IsHomogeneous 𝒜 I
x : A
hx : x ∈ I
⊢ x ∈ homogeneousCore' 𝒜 I
[PROOFSTEP]
rw [← DirectSum.sum_support_decompose 𝒜 x]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
h : IsHomogeneous 𝒜 I
x : A
hx : x ∈ I
⊢ ∑ i in DFinsupp.support (↑(decompose 𝒜) x), ↑(↑(↑(decompose 𝒜) x) i) ∈ homogeneousCore' 𝒜 I
[PROOFSTEP]
exact Ideal.sum_mem _ fun j _ => Ideal.subset_span ⟨⟨_, homogeneous_coe _⟩, h _ hx, rfl⟩
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I✝ : Ideal A
I : HomogeneousIdeal 𝒜
⊢ Ideal.homogeneousCore 𝒜 (toIdeal I) = I
[PROOFSTEP]
ext1
[GOAL]
case h
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I✝ : Ideal A
I : HomogeneousIdeal 𝒜
⊢ toIdeal (Ideal.homogeneousCore 𝒜 (toIdeal I)) = toIdeal I
[PROOFSTEP]
convert Ideal.IsHomogeneous.toIdeal_homogeneousCore_eq_self I.isHomogeneous
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
⊢ IsHomogeneous 𝒜 I ↔ ∃ S, I = span (Subtype.val '' S)
[PROOFSTEP]
rw [Ideal.IsHomogeneous.iff_eq, eq_comm]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : SetLike σ A
inst✝³ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝² : DecidableEq ι
inst✝¹ : AddMonoid ι
inst✝ : GradedRing 𝒜
I : Ideal A
⊢ I = HomogeneousIdeal.toIdeal (homogeneousCore 𝒜 I) ↔ ∃ S, I = span (Subtype.val '' S)
[PROOFSTEP]
exact ((Set.image_preimage.compose (Submodule.gi _ _).gc).exists_eq_l _).symm
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
i : ι
r : A
hr : r ∈ ⊥
⊢ ↑(↑(↑(decompose 𝒜) r) i) ∈ ⊥
[PROOFSTEP]
simp only [Ideal.mem_bot] at hr
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
i : ι
r : A
hr : r = 0
⊢ ↑(↑(↑(decompose 𝒜) r) i) ∈ ⊥
[PROOFSTEP]
rw [hr, decompose_zero, zero_apply]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
i : ι
r : A
hr : r = 0
⊢ ↑0 ∈ ⊥
[PROOFSTEP]
apply Ideal.zero_mem
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
i : ι
r : A
x✝ : r ∈ ⊤
⊢ ↑(↑(↑(decompose 𝒜) r) i) ∈ ⊤
[PROOFSTEP]
simp only [Submodule.mem_top]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I J : Ideal A
HI : IsHomogeneous 𝒜 I
HJ : IsHomogeneous 𝒜 J
⊢ IsHomogeneous 𝒜 (I ⊔ J)
[PROOFSTEP]
rw [iff_exists] at HI HJ ⊢
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I J : Ideal A
HI : ∃ S, I = span (Subtype.val '' S)
HJ : ∃ S, J = span (Subtype.val '' S)
⊢ ∃ S, I ⊔ J = span (Subtype.val '' S)
[PROOFSTEP]
obtain ⟨⟨s₁, rfl⟩, ⟨s₂, rfl⟩⟩ := HI, HJ
[GOAL]
case intro.intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
s₁ s₂ : Set { x // x ∈ homogeneousSubmonoid 𝒜 }
⊢ ∃ S, span (Subtype.val '' s₁) ⊔ span (Subtype.val '' s₂) = span (Subtype.val '' S)
[PROOFSTEP]
refine' ⟨s₁ ∪ s₂, _⟩
[GOAL]
case intro.intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
s₁ s₂ : Set { x // x ∈ homogeneousSubmonoid 𝒜 }
⊢ span (Subtype.val '' s₁) ⊔ span (Subtype.val '' s₂) = span (Subtype.val '' (s₁ ∪ s₂))
[PROOFSTEP]
rw [Set.image_union]
[GOAL]
case intro.intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
s₁ s₂ : Set { x // x ∈ homogeneousSubmonoid 𝒜 }
⊢ span (Subtype.val '' s₁) ⊔ span (Subtype.val '' s₂) = span (Subtype.val '' s₁ ∪ Subtype.val '' s₂)
[PROOFSTEP]
exact (Submodule.span_union _ _).symm
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
κ : Sort u_5
f : κ → Ideal A
h : ∀ (i : κ), IsHomogeneous 𝒜 (f i)
⊢ IsHomogeneous 𝒜 (⨆ (i : κ), f i)
[PROOFSTEP]
simp_rw [iff_exists] at h ⊢
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
κ : Sort u_5
f : κ → Ideal A
h : ∀ (i : κ), ∃ S, f i = span (Subtype.val '' S)
⊢ ∃ S, ⨆ (i : κ), f i = span (Subtype.val '' S)
[PROOFSTEP]
choose s hs using h
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
κ : Sort u_5
f : κ → Ideal A
s : κ → Set { x // x ∈ homogeneousSubmonoid 𝒜 }
hs : ∀ (i : κ), f i = span (Subtype.val '' s i)
⊢ ∃ S, ⨆ (i : κ), f i = span (Subtype.val '' S)
[PROOFSTEP]
refine' ⟨⋃ i, s i, _⟩
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
κ : Sort u_5
f : κ → Ideal A
s : κ → Set { x // x ∈ homogeneousSubmonoid 𝒜 }
hs : ∀ (i : κ), f i = span (Subtype.val '' s i)
⊢ ⨆ (i : κ), f i = span (Subtype.val '' ⋃ (i : κ), s i)
[PROOFSTEP]
simp_rw [Set.image_iUnion, Ideal.span_iUnion]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
κ : Sort u_5
f : κ → Ideal A
s : κ → Set { x // x ∈ homogeneousSubmonoid 𝒜 }
hs : ∀ (i : κ), f i = span (Subtype.val '' s i)
⊢ ⨆ (i : κ), f i = ⨆ (i : κ), span (Subtype.val '' s i)
[PROOFSTEP]
congr
[GOAL]
case e_s
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
κ : Sort u_5
f : κ → Ideal A
s : κ → Set { x // x ∈ homogeneousSubmonoid 𝒜 }
hs : ∀ (i : κ), f i = span (Subtype.val '' s i)
⊢ (fun i => f i) = fun i => span (Subtype.val '' s i)
[PROOFSTEP]
exact funext hs
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
κ : Sort u_5
f : κ → Ideal A
h : ∀ (i : κ), IsHomogeneous 𝒜 (f i)
⊢ IsHomogeneous 𝒜 (⨅ (i : κ), f i)
[PROOFSTEP]
intro i x hx
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
κ : Sort u_5
f : κ → Ideal A
h : ∀ (i : κ), IsHomogeneous 𝒜 (f i)
i : ι
x : A
hx : x ∈ ⨅ (i : κ), f i
⊢ ↑(↑(↑(decompose 𝒜) x) i) ∈ ⨅ (i : κ), f i
[PROOFSTEP]
simp only [Ideal.mem_iInf] at hx ⊢
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
κ : Sort u_5
f : κ → Ideal A
h : ∀ (i : κ), IsHomogeneous 𝒜 (f i)
i : ι
x : A
hx : ∀ (i : κ), x ∈ f i
⊢ ∀ (i_1 : κ), ↑(↑(↑(decompose 𝒜) x) i) ∈ f i_1
[PROOFSTEP]
exact fun j => h _ _ (hx j)
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
ℐ : Set (Ideal A)
h : ∀ (I : Ideal A), I ∈ ℐ → IsHomogeneous 𝒜 I
⊢ IsHomogeneous 𝒜 (SupSet.sSup ℐ)
[PROOFSTEP]
rw [sSup_eq_iSup]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
ℐ : Set (Ideal A)
h : ∀ (I : Ideal A), I ∈ ℐ → IsHomogeneous 𝒜 I
⊢ IsHomogeneous 𝒜 (⨆ (a : Ideal A) (_ : a ∈ ℐ), a)
[PROOFSTEP]
exact iSup₂ h
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
ℐ : Set (Ideal A)
h : ∀ (I : Ideal A), I ∈ ℐ → IsHomogeneous 𝒜 I
⊢ IsHomogeneous 𝒜 (InfSet.sInf ℐ)
[PROOFSTEP]
rw [sInf_eq_iInf]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
ℐ : Set (Ideal A)
h : ∀ (I : Ideal A), I ∈ ℐ → IsHomogeneous 𝒜 I
⊢ IsHomogeneous 𝒜 (⨅ (a : Ideal A) (_ : a ∈ ℐ), a)
[PROOFSTEP]
exact iInf₂ h
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
κ : Sort u_5
s : κ → HomogeneousIdeal 𝒜
⊢ toIdeal (⨆ (i : κ), s i) = ⨆ (i : κ), toIdeal (s i)
[PROOFSTEP]
rw [iSup, toIdeal_sSup, iSup_range]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
κ : Sort u_5
s : κ → HomogeneousIdeal 𝒜
⊢ toIdeal (⨅ (i : κ), s i) = ⨅ (i : κ), toIdeal (s i)
[PROOFSTEP]
rw [iInf, toIdeal_sInf, iInf_range]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
κ : Sort u_5
κ' : κ → Sort u_6
s : (i : κ) → κ' i → HomogeneousIdeal 𝒜
⊢ toIdeal (⨆ (i : κ) (j : κ' i), s i j) = ⨆ (i : κ) (j : κ' i), toIdeal (s i j)
[PROOFSTEP]
simp_rw [toIdeal_iSup]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
κ : Sort u_5
κ' : κ → Sort u_6
s : (i : κ) → κ' i → HomogeneousIdeal 𝒜
⊢ toIdeal (⨅ (i : κ) (j : κ' i), s i j) = ⨅ (i : κ) (j : κ' i), toIdeal (s i j)
[PROOFSTEP]
simp_rw [toIdeal_iInf]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : CommSemiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I✝ I J : Ideal A
HI : IsHomogeneous 𝒜 I
HJ : IsHomogeneous 𝒜 J
⊢ IsHomogeneous 𝒜 (I * J)
[PROOFSTEP]
rw [Ideal.IsHomogeneous.iff_exists] at HI HJ ⊢
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : CommSemiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I✝ I J : Ideal A
HI : ∃ S, I = span (Subtype.val '' S)
HJ : ∃ S, J = span (Subtype.val '' S)
⊢ ∃ S, I * J = span (Subtype.val '' S)
[PROOFSTEP]
obtain ⟨⟨s₁, rfl⟩, ⟨s₂, rfl⟩⟩ := HI, HJ
[GOAL]
case intro.intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : CommSemiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
s₁ s₂ : Set { x // x ∈ homogeneousSubmonoid 𝒜 }
⊢ ∃ S, span (Subtype.val '' s₁) * span (Subtype.val '' s₂) = span (Subtype.val '' S)
[PROOFSTEP]
rw [Ideal.span_mul_span']
[GOAL]
case intro.intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : CommSemiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
s₁ s₂ : Set { x // x ∈ homogeneousSubmonoid 𝒜 }
⊢ ∃ S, span (Subtype.val '' s₁ * Subtype.val '' s₂) = span (Subtype.val '' S)
[PROOFSTEP]
exact ⟨s₁ * s₂, congr_arg _ <| (Set.image_mul (homogeneousSubmonoid 𝒜).subtype).symm⟩
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
⊢ homogeneousCore' 𝒜 I = sSup {J | IsHomogeneous 𝒜 J ∧ J ≤ I}
[PROOFSTEP]
refine' (IsLUB.sSup_eq _).symm
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
⊢ IsLUB {J | IsHomogeneous 𝒜 J ∧ J ≤ I} (homogeneousCore' 𝒜 I)
[PROOFSTEP]
apply IsGreatest.isLUB
[GOAL]
case h
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
⊢ IsGreatest {J | IsHomogeneous 𝒜 J ∧ J ≤ I} (homogeneousCore' 𝒜 I)
[PROOFSTEP]
have coe_mono : Monotone (toIdeal : HomogeneousIdeal 𝒜 → Ideal A) := fun x y => id
[GOAL]
case h
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
coe_mono : Monotone toIdeal
⊢ IsGreatest {J | IsHomogeneous 𝒜 J ∧ J ≤ I} (homogeneousCore' 𝒜 I)
[PROOFSTEP]
convert coe_mono.map_isGreatest (Ideal.homogeneousCore.gc 𝒜).isGreatest_u using 1
[GOAL]
case h.e'_3
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
coe_mono : Monotone toIdeal
⊢ {J | IsHomogeneous 𝒜 J ∧ J ≤ I} = toIdeal '' {a | toIdeal a ≤ I}
[PROOFSTEP]
ext x
[GOAL]
case h.e'_3.h
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
coe_mono : Monotone toIdeal
x : Ideal A
⊢ x ∈ {J | IsHomogeneous 𝒜 J ∧ J ≤ I} ↔ x ∈ toIdeal '' {a | toIdeal a ≤ I}
[PROOFSTEP]
rw [mem_image, mem_setOf_eq]
[GOAL]
case h.e'_3.h
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
coe_mono : Monotone toIdeal
x : Ideal A
⊢ IsHomogeneous 𝒜 x ∧ x ≤ I ↔ ∃ x_1, x_1 ∈ {a | toIdeal a ≤ I} ∧ toIdeal x_1 = x
[PROOFSTEP]
refine' ⟨fun hI => ⟨⟨x, hI.1⟩, ⟨hI.2, rfl⟩⟩, _⟩
[GOAL]
case h.e'_3.h
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
coe_mono : Monotone toIdeal
x : Ideal A
⊢ (∃ x_1, x_1 ∈ {a | toIdeal a ≤ I} ∧ toIdeal x_1 = x) → IsHomogeneous 𝒜 x ∧ x ≤ I
[PROOFSTEP]
rintro ⟨x, ⟨hx, rfl⟩⟩
[GOAL]
case h.e'_3.h.intro.intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
coe_mono : Monotone toIdeal
x : HomogeneousIdeal 𝒜
hx : x ∈ {a | toIdeal a ≤ I}
⊢ IsHomogeneous 𝒜 (toIdeal x) ∧ toIdeal x ≤ I
[PROOFSTEP]
exact ⟨x.isHomogeneous, hx⟩
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
⊢ IsHomogeneous 𝒜 (span {r | ∃ i x, ↑(↑(↑(decompose 𝒜) ↑x) i) = r})
[PROOFSTEP]
refine' Ideal.homogeneous_span _ _ fun x hx => _
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
x : A
hx : x ∈ {r | ∃ i x, ↑(↑(↑(decompose 𝒜) ↑x) i) = r}
⊢ Homogeneous 𝒜 x
[PROOFSTEP]
obtain ⟨i, x, rfl⟩ := hx
[GOAL]
case intro.intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
i : ι
x : { x // x ∈ I }
⊢ Homogeneous 𝒜 ↑(↑(↑(decompose 𝒜) ↑x) i)
[PROOFSTEP]
apply SetLike.homogeneous_coe
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
⊢ I ≤ toIdeal (homogeneousHull 𝒜 I)
[PROOFSTEP]
intro r hr
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
r : A
hr : r ∈ I
⊢ r ∈ toIdeal (homogeneousHull 𝒜 I)
[PROOFSTEP]
classical
rw [← DirectSum.sum_support_decompose 𝒜 r]
refine' Ideal.sum_mem _ _
intro j _
apply Ideal.subset_span
use j
use⟨r, hr⟩
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
r : A
hr : r ∈ I
⊢ r ∈ toIdeal (homogeneousHull 𝒜 I)
[PROOFSTEP]
rw [← DirectSum.sum_support_decompose 𝒜 r]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
r : A
hr : r ∈ I
⊢ ∑ i in DFinsupp.support (↑(decompose 𝒜) r), ↑(↑(↑(decompose 𝒜) r) i) ∈ toIdeal (homogeneousHull 𝒜 I)
[PROOFSTEP]
refine' Ideal.sum_mem _ _
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
r : A
hr : r ∈ I
⊢ ∀ (c : ι), c ∈ DFinsupp.support (↑(decompose 𝒜) r) → ↑(↑(↑(decompose 𝒜) r) c) ∈ toIdeal (homogeneousHull 𝒜 I)
[PROOFSTEP]
intro j _
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
r : A
hr : r ∈ I
j : ι
a✝ : j ∈ DFinsupp.support (↑(decompose 𝒜) r)
⊢ ↑(↑(↑(decompose 𝒜) r) j) ∈ toIdeal (homogeneousHull 𝒜 I)
[PROOFSTEP]
apply Ideal.subset_span
[GOAL]
case a
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
r : A
hr : r ∈ I
j : ι
a✝ : j ∈ DFinsupp.support (↑(decompose 𝒜) r)
⊢ ↑(↑(↑(decompose 𝒜) r) j) ∈ {r | ∃ i x, ↑(↑(↑(decompose 𝒜) ↑x) i) = r}
[PROOFSTEP]
use j
[GOAL]
case h
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
r : A
hr : r ∈ I
j : ι
a✝ : j ∈ DFinsupp.support (↑(decompose 𝒜) r)
⊢ ∃ x, ↑(↑(↑(decompose 𝒜) ↑x) j) = ↑(↑(↑(decompose 𝒜) r) j)
[PROOFSTEP]
use⟨r, hr⟩
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I✝ I J : Ideal A
I_le_J : I ≤ J
⊢ homogeneousHull 𝒜 I ≤ homogeneousHull 𝒜 J
[PROOFSTEP]
apply Ideal.span_mono
[GOAL]
case a
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I✝ I J : Ideal A
I_le_J : I ≤ J
⊢ {r | ∃ i x, ↑(↑(↑(decompose 𝒜) ↑x) i) = r} ⊆ {r | ∃ i x, ↑(↑(↑(decompose 𝒜) ↑x) i) = r}
[PROOFSTEP]
rintro r ⟨hr1, ⟨x, hx⟩, rfl⟩
[GOAL]
case a.intro.intro.mk
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I✝ I J : Ideal A
I_le_J : I ≤ J
hr1 : ι
x : A
hx : x ∈ I
⊢ ↑(↑(↑(decompose 𝒜) ↑{ val := x, property := hx }) hr1) ∈ {r | ∃ i x, ↑(↑(↑(decompose 𝒜) ↑x) i) = r}
[PROOFSTEP]
refine' ⟨hr1, ⟨⟨x, I_le_J hx⟩, rfl⟩⟩
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
h : IsHomogeneous 𝒜 I
⊢ toIdeal (homogeneousHull 𝒜 I) = I
[PROOFSTEP]
apply le_antisymm _ (Ideal.le_toIdeal_homogeneousHull _ _)
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
h : IsHomogeneous 𝒜 I
⊢ toIdeal (homogeneousHull 𝒜 I) ≤ I
[PROOFSTEP]
apply Ideal.span_le.2
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
h : IsHomogeneous 𝒜 I
⊢ {r | ∃ i x, ↑(↑(↑(decompose 𝒜) ↑x) i) = r} ⊆ ↑I
[PROOFSTEP]
rintro _ ⟨i, x, rfl⟩
[GOAL]
case intro.intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
h : IsHomogeneous 𝒜 I
i : ι
x : { x // x ∈ I }
⊢ ↑(↑(↑(decompose 𝒜) ↑x) i) ∈ ↑I
[PROOFSTEP]
exact h _ x.prop
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
⊢ toIdeal (homogeneousHull 𝒜 I) = ⨆ (i : ι), span (↑(GradedRing.proj 𝒜 i) '' ↑I)
[PROOFSTEP]
rw [← Ideal.span_iUnion]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
⊢ toIdeal (homogeneousHull 𝒜 I) = span (⋃ (i : ι), ↑(GradedRing.proj 𝒜 i) '' ↑I)
[PROOFSTEP]
apply congr_arg Ideal.span _
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
⊢ {r | ∃ i x, ↑(↑(↑(decompose 𝒜) ↑x) i) = r} = ⋃ (i : ι), ↑(GradedRing.proj 𝒜 i) '' ↑I
[PROOFSTEP]
ext1
[GOAL]
case h
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
x✝ : A
⊢ x✝ ∈ {r | ∃ i x, ↑(↑(↑(decompose 𝒜) ↑x) i) = r} ↔ x✝ ∈ ⋃ (i : ι), ↑(GradedRing.proj 𝒜 i) '' ↑I
[PROOFSTEP]
simp only [Set.mem_iUnion, Set.mem_image, mem_setOf_eq, GradedRing.proj_apply, SetLike.exists, exists_prop,
  Subtype.coe_mk, SetLike.mem_coe]
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
i : ι
⊢ ∀ (x : A), x ∈ ↑(GradedRing.proj 𝒜 i) '' ↑I → Homogeneous 𝒜 x
[PROOFSTEP]
rintro _ ⟨x, -, rfl⟩
[GOAL]
case intro.intro
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
i : ι
x : A
⊢ Homogeneous 𝒜 (↑(GradedRing.proj 𝒜 i) x)
[PROOFSTEP]
apply SetLike.homogeneous_coe
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
⊢ homogeneousHull 𝒜 I =
    ⨆ (i : ι),
      { toSubmodule := span (↑(GradedRing.proj 𝒜 i) '' ↑I),
        is_homogeneous' := (_ : IsHomogeneous 𝒜 (span (↑(GradedRing.proj 𝒜 i) '' ↑I))) }
[PROOFSTEP]
ext1
[GOAL]
case h
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
⊢ toIdeal (homogeneousHull 𝒜 I) =
    toIdeal
      (⨆ (i : ι),
        { toSubmodule := span (↑(GradedRing.proj 𝒜 i) '' ↑I),
          is_homogeneous' := (_ : IsHomogeneous 𝒜 (span (↑(GradedRing.proj 𝒜 i) '' ↑I))) })
[PROOFSTEP]
rw [Ideal.toIdeal_homogeneousHull_eq_iSup, toIdeal_iSup]
[GOAL]
case h
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : AddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
I : Ideal A
⊢ ⨆ (i : ι), span (↑(GradedRing.proj 𝒜 i) '' ↑I) =
    ⨆ (i : ι),
      toIdeal
        { toSubmodule := span (↑(GradedRing.proj 𝒜 i) '' ↑I),
          is_homogeneous' := (_ : IsHomogeneous 𝒜 (span (↑(GradedRing.proj 𝒜 i) '' ↑I))) }
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : CanonicallyOrderedAddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
i : ι
r : A
hr : ↑(↑(↑(decompose 𝒜) r) 0) = 0
⊢ ↑(↑(↑(decompose 𝒜) r) i) ∈ RingHom.ker (projZeroRingHom 𝒜)
[PROOFSTEP]
change (decompose 𝒜 (decompose 𝒜 r _ : A) 0 : A) = 0
[GOAL]
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : CanonicallyOrderedAddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
i : ι
r : A
hr : ↑(↑(↑(decompose 𝒜) r) 0) = 0
⊢ ↑(↑(↑(decompose 𝒜) ↑(↑(↑(decompose 𝒜) r) i)) 0) = 0
[PROOFSTEP]
by_cases h : i = 0
[GOAL]
case pos
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : CanonicallyOrderedAddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
i : ι
r : A
hr : ↑(↑(↑(decompose 𝒜) r) 0) = 0
h : i = 0
⊢ ↑(↑(↑(decompose 𝒜) ↑(↑(↑(decompose 𝒜) r) i)) 0) = 0
[PROOFSTEP]
rw [h, hr, decompose_zero, zero_apply, ZeroMemClass.coe_zero]
[GOAL]
case neg
ι : Type u_1
σ : Type u_2
R : Type u_3
A : Type u_4
inst✝⁵ : Semiring A
inst✝⁴ : DecidableEq ι
inst✝³ : CanonicallyOrderedAddMonoid ι
inst✝² : SetLike σ A
inst✝¹ : AddSubmonoidClass σ A
𝒜 : ι → σ
inst✝ : GradedRing 𝒜
i : ι
r : A
hr : ↑(↑(↑(decompose 𝒜) r) 0) = 0
h : ¬i = 0
⊢ ↑(↑(↑(decompose 𝒜) ↑(↑(↑(decompose 𝒜) r) i)) 0) = 0
[PROOFSTEP]
rw [decompose_of_mem_ne 𝒜 (SetLike.coe_mem _) h]


[GOAL]
α : Type u
β : Type v
inst✝ : Add α
a✝ b c d : WithTop α
x y : α
a : WithTop α
⊢ a + ⊤ = ⊤
[PROOFSTEP]
cases a
[GOAL]
case none
α : Type u
β : Type v
inst✝ : Add α
a b c d : WithTop α
x y : α
⊢ none + ⊤ = ⊤
[PROOFSTEP]
rfl
[GOAL]
case some
α : Type u
β : Type v
inst✝ : Add α
a b c d : WithTop α
x y val✝ : α
⊢ Option.some val✝ + ⊤ = ⊤
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
inst✝ : Add α
a b c d : WithTop α
x y : α
⊢ a + b = ⊤ ↔ a = ⊤ ∨ b = ⊤
[PROOFSTEP]
cases a
[GOAL]
case none
α : Type u
β : Type v
inst✝ : Add α
b c d : WithTop α
x y : α
⊢ none + b = ⊤ ↔ none = ⊤ ∨ b = ⊤
[PROOFSTEP]
cases b
[GOAL]
case some
α : Type u
β : Type v
inst✝ : Add α
b c d : WithTop α
x y val✝ : α
⊢ Option.some val✝ + b = ⊤ ↔ Option.some val✝ = ⊤ ∨ b = ⊤
[PROOFSTEP]
cases b
[GOAL]
case none.none
α : Type u
β : Type v
inst✝ : Add α
c d : WithTop α
x y : α
⊢ none + none = ⊤ ↔ none = ⊤ ∨ none = ⊤
[PROOFSTEP]
simp [none_eq_top, some_eq_coe, ← WithTop.coe_add]
[GOAL]
case none.some
α : Type u
β : Type v
inst✝ : Add α
c d : WithTop α
x y val✝ : α
⊢ none + Option.some val✝ = ⊤ ↔ none = ⊤ ∨ Option.some val✝ = ⊤
[PROOFSTEP]
simp [none_eq_top, some_eq_coe, ← WithTop.coe_add]
[GOAL]
case some.none
α : Type u
β : Type v
inst✝ : Add α
c d : WithTop α
x y val✝ : α
⊢ Option.some val✝ + none = ⊤ ↔ Option.some val✝ = ⊤ ∨ none = ⊤
[PROOFSTEP]
simp [none_eq_top, some_eq_coe, ← WithTop.coe_add]
[GOAL]
case some.some
α : Type u
β : Type v
inst✝ : Add α
c d : WithTop α
x y val✝¹ val✝ : α
⊢ Option.some val✝¹ + Option.some val✝ = ⊤ ↔ Option.some val✝¹ = ⊤ ∨ Option.some val✝ = ⊤
[PROOFSTEP]
simp [none_eq_top, some_eq_coe, ← WithTop.coe_add]
[GOAL]
α : Type u
β : Type v
inst✝¹ : Add α
a✝ b✝ c d : WithTop α
x y : α
inst✝ : LT α
a b : WithTop α
⊢ a + b < ⊤ ↔ a < ⊤ ∧ b < ⊤
[PROOFSTEP]
simp_rw [WithTop.lt_top_iff_ne_top, add_ne_top]
[GOAL]
α : Type u
β : Type v
inst✝ : Add α
a b✝ c✝ d : WithTop α
x y : α
b : WithTop α
c : α
⊢ none + b = ↑c ↔ ∃ a' b', ↑a' = none ∧ ↑b' = b ∧ a' + b' = c
[PROOFSTEP]
simp [none_eq_top]
[GOAL]
α : Type u
β : Type v
inst✝ : Add α
a✝ b c✝ d : WithTop α
x y a c : α
⊢ Option.some a + none = ↑c ↔ ∃ a' b', ↑a' = Option.some a ∧ ↑b' = none ∧ a' + b' = c
[PROOFSTEP]
simp [none_eq_top]
[GOAL]
α : Type u
β : Type v
inst✝ : Add α
a✝ b✝ c✝ d : WithTop α
x y a b c : α
⊢ Option.some a + Option.some b = ↑c ↔ ∃ a' b', ↑a' = Option.some a ∧ ↑b' = Option.some b ∧ a' + b' = c
[PROOFSTEP]
simp only [some_eq_coe, ← coe_add, coe_eq_coe, exists_and_left, exists_eq_left]
[GOAL]
α : Type u
β : Type v
inst✝ : Add α
a b c d : WithTop α
x✝ y✝ : α
x : WithTop α
y : α
⊢ x + ↑y = ⊤ ↔ x = ⊤
[PROOFSTEP]
induction x using WithTop.recTopCoe
[GOAL]
case top
α : Type u
β : Type v
inst✝ : Add α
a b c d : WithTop α
x y✝ y : α
⊢ ⊤ + ↑y = ⊤ ↔ ⊤ = ⊤
[PROOFSTEP]
simp [← coe_add]
[GOAL]
case coe
α : Type u
β : Type v
inst✝ : Add α
a b c d : WithTop α
x y✝ y a✝ : α
⊢ ↑a✝ + ↑y = ⊤ ↔ ↑a✝ = ⊤
[PROOFSTEP]
simp [← coe_add]
[GOAL]
α : Type u
β : Type v
inst✝ : Add α
a b c d : WithTop α
x y✝ : α
y : WithTop α
⊢ ↑x + y = ⊤ ↔ y = ⊤
[PROOFSTEP]
induction y using WithTop.recTopCoe
[GOAL]
case top
α : Type u
β : Type v
inst✝ : Add α
a b c d : WithTop α
x y : α
⊢ ↑x + ⊤ = ⊤ ↔ ⊤ = ⊤
[PROOFSTEP]
simp [← coe_add]
[GOAL]
case coe
α : Type u
β : Type v
inst✝ : Add α
a b c d : WithTop α
x y a✝ : α
⊢ ↑x + ↑a✝ = ⊤ ↔ ↑a✝ = ⊤
[PROOFSTEP]
simp [← coe_add]
[GOAL]
α : Type u
β : Type v
inst✝¹ : Add α
a b c d : WithTop α
x y : α
inst✝ : IsRightCancelAdd α
ha : a ≠ ⊤
⊢ b + a = c + a ↔ b = c
[PROOFSTEP]
lift a to α using ha
[GOAL]
case intro
α : Type u
β : Type v
inst✝¹ : Add α
b c d : WithTop α
x y : α
inst✝ : IsRightCancelAdd α
a : α
⊢ b + ↑a = c + ↑a ↔ b = c
[PROOFSTEP]
obtain rfl | hb := (eq_or_ne b ⊤)
[GOAL]
case intro.inl
α : Type u
β : Type v
inst✝¹ : Add α
c d : WithTop α
x y : α
inst✝ : IsRightCancelAdd α
a : α
⊢ ⊤ + ↑a = c + ↑a ↔ ⊤ = c
[PROOFSTEP]
rw [top_add, eq_comm, WithTop.add_coe_eq_top_iff, eq_comm]
[GOAL]
case intro.inr
α : Type u
β : Type v
inst✝¹ : Add α
b c d : WithTop α
x y : α
inst✝ : IsRightCancelAdd α
a : α
hb : b ≠ ⊤
⊢ b + ↑a = c + ↑a ↔ b = c
[PROOFSTEP]
lift b to α using hb
[GOAL]
case intro.inr.intro
α : Type u
β : Type v
inst✝¹ : Add α
c d : WithTop α
x y : α
inst✝ : IsRightCancelAdd α
a b : α
⊢ ↑b + ↑a = c + ↑a ↔ ↑b = c
[PROOFSTEP]
simp_rw [← WithTop.coe_add, eq_comm, WithTop.add_eq_coe, coe_eq_coe, exists_and_left, exists_eq_left, add_left_inj,
  exists_eq_right, eq_comm]
[GOAL]
α : Type u
β : Type v
inst✝¹ : Add α
a b c d : WithTop α
x y : α
inst✝ : IsLeftCancelAdd α
ha : a ≠ ⊤
⊢ a + b = a + c ↔ b = c
[PROOFSTEP]
lift a to α using ha
[GOAL]
case intro
α : Type u
β : Type v
inst✝¹ : Add α
b c d : WithTop α
x y : α
inst✝ : IsLeftCancelAdd α
a : α
⊢ ↑a + b = ↑a + c ↔ b = c
[PROOFSTEP]
obtain rfl | hb := (eq_or_ne b ⊤)
[GOAL]
case intro.inl
α : Type u
β : Type v
inst✝¹ : Add α
c d : WithTop α
x y : α
inst✝ : IsLeftCancelAdd α
a : α
⊢ ↑a + ⊤ = ↑a + c ↔ ⊤ = c
[PROOFSTEP]
rw [add_top, eq_comm, WithTop.coe_add_eq_top_iff, eq_comm]
[GOAL]
case intro.inr
α : Type u
β : Type v
inst✝¹ : Add α
b c d : WithTop α
x y : α
inst✝ : IsLeftCancelAdd α
a : α
hb : b ≠ ⊤
⊢ ↑a + b = ↑a + c ↔ b = c
[PROOFSTEP]
lift b to α using hb
[GOAL]
case intro.inr.intro
α : Type u
β : Type v
inst✝¹ : Add α
c d : WithTop α
x y : α
inst✝ : IsLeftCancelAdd α
a b : α
⊢ ↑a + ↑b = ↑a + c ↔ ↑b = c
[PROOFSTEP]
simp_rw [← WithTop.coe_add, eq_comm, WithTop.add_eq_coe, eq_comm, coe_eq_coe, exists_and_left, exists_eq_left',
  add_right_inj, exists_eq_right']
[GOAL]
α : Type u
β : Type v
inst✝² : Add α
a✝ b✝ c✝ d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
a b c : WithTop α
h : b ≤ c
⊢ a + b ≤ a + c
[PROOFSTEP]
cases a
[GOAL]
case none
α : Type u
β : Type v
inst✝² : Add α
a b✝ c✝ d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b c : WithTop α
h : b ≤ c
⊢ none + b ≤ none + c
[PROOFSTEP]
cases c
[GOAL]
case some
α : Type u
β : Type v
inst✝² : Add α
a b✝ c✝ d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b c : WithTop α
h : b ≤ c
val✝ : α
⊢ Option.some val✝ + b ≤ Option.some val✝ + c
[PROOFSTEP]
cases c
[GOAL]
case none.none
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
h : b ≤ none
⊢ none + b ≤ none + none
[PROOFSTEP]
try exact le_top
[GOAL]
case none.none
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
h : b ≤ none
⊢ none + b ≤ none + none
[PROOFSTEP]
exact le_top
[GOAL]
case none.some
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
val✝ : α
h : b ≤ Option.some val✝
⊢ none + b ≤ none + Option.some val✝
[PROOFSTEP]
try exact le_top
[GOAL]
case none.some
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
val✝ : α
h : b ≤ Option.some val✝
⊢ none + b ≤ none + Option.some val✝
[PROOFSTEP]
exact le_top
[GOAL]
case some.none
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
val✝ : α
h : b ≤ none
⊢ Option.some val✝ + b ≤ Option.some val✝ + none
[PROOFSTEP]
try exact le_top
[GOAL]
case some.none
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
val✝ : α
h : b ≤ none
⊢ Option.some val✝ + b ≤ Option.some val✝ + none
[PROOFSTEP]
exact le_top
[GOAL]
case some.some
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
val✝¹ val✝ : α
h : b ≤ Option.some val✝
⊢ Option.some val✝¹ + b ≤ Option.some val✝¹ + Option.some val✝
[PROOFSTEP]
try exact le_top
[GOAL]
case some.some
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
val✝¹ val✝ : α
h : b ≤ Option.some val✝
⊢ Option.some val✝¹ + b ≤ Option.some val✝¹ + Option.some val✝
[PROOFSTEP]
exact le_top
[GOAL]
case some.some
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
val✝¹ val✝ : α
h : b ≤ Option.some val✝
⊢ Option.some val✝¹ + b ≤ Option.some val✝¹ + Option.some val✝
[PROOFSTEP]
rcases le_coe_iff.1 h with ⟨b, rfl, _⟩
[GOAL]
case some.some.intro.intro
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
val✝¹ val✝ b : α
right✝ : b ≤ val✝
h : ↑b ≤ Option.some val✝
⊢ Option.some val✝¹ + ↑b ≤ Option.some val✝¹ + Option.some val✝
[PROOFSTEP]
exact coe_le_coe.2 (add_le_add_left (coe_le_coe.1 h) _)
[GOAL]
α : Type u
β : Type v
inst✝² : Add α
a✝ b✝ c✝ d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
a b c : WithTop α
h : b ≤ c
⊢ swap (fun x x_1 => x + x_1) a b ≤ swap (fun x x_1 => x + x_1) a c
[PROOFSTEP]
cases a
[GOAL]
case none
α : Type u
β : Type v
inst✝² : Add α
a b✝ c✝ d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b c : WithTop α
h : b ≤ c
⊢ swap (fun x x_1 => x + x_1) none b ≤ swap (fun x x_1 => x + x_1) none c
[PROOFSTEP]
cases c
[GOAL]
case some
α : Type u
β : Type v
inst✝² : Add α
a b✝ c✝ d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b c : WithTop α
h : b ≤ c
val✝ : α
⊢ swap (fun x x_1 => x + x_1) (Option.some val✝) b ≤ swap (fun x x_1 => x + x_1) (Option.some val✝) c
[PROOFSTEP]
cases c
[GOAL]
case none.none
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
h : b ≤ none
⊢ swap (fun x x_1 => x + x_1) none b ≤ swap (fun x x_1 => x + x_1) none none
[PROOFSTEP]
try exact le_top
[GOAL]
case none.none
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
h : b ≤ none
⊢ swap (fun x x_1 => x + x_1) none b ≤ swap (fun x x_1 => x + x_1) none none
[PROOFSTEP]
exact le_top
[GOAL]
case none.some
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
val✝ : α
h : b ≤ Option.some val✝
⊢ swap (fun x x_1 => x + x_1) none b ≤ swap (fun x x_1 => x + x_1) none (Option.some val✝)
[PROOFSTEP]
try exact le_top
[GOAL]
case none.some
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
val✝ : α
h : b ≤ Option.some val✝
⊢ swap (fun x x_1 => x + x_1) none b ≤ swap (fun x x_1 => x + x_1) none (Option.some val✝)
[PROOFSTEP]
exact le_top
[GOAL]
case some.none
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
val✝ : α
h : b ≤ none
⊢ swap (fun x x_1 => x + x_1) (Option.some val✝) b ≤ swap (fun x x_1 => x + x_1) (Option.some val✝) none
[PROOFSTEP]
try exact le_top
[GOAL]
case some.none
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
val✝ : α
h : b ≤ none
⊢ swap (fun x x_1 => x + x_1) (Option.some val✝) b ≤ swap (fun x x_1 => x + x_1) (Option.some val✝) none
[PROOFSTEP]
exact le_top
[GOAL]
case some.some
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
val✝¹ val✝ : α
h : b ≤ Option.some val✝
⊢ swap (fun x x_1 => x + x_1) (Option.some val✝¹) b ≤ swap (fun x x_1 => x + x_1) (Option.some val✝¹) (Option.some val✝)
[PROOFSTEP]
try exact le_top
[GOAL]
case some.some
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
val✝¹ val✝ : α
h : b ≤ Option.some val✝
⊢ swap (fun x x_1 => x + x_1) (Option.some val✝¹) b ≤ swap (fun x x_1 => x + x_1) (Option.some val✝¹) (Option.some val✝)
[PROOFSTEP]
exact le_top
[GOAL]
case some.some
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
b : WithTop α
val✝¹ val✝ : α
h : b ≤ Option.some val✝
⊢ swap (fun x x_1 => x + x_1) (Option.some val✝¹) b ≤ swap (fun x x_1 => x + x_1) (Option.some val✝¹) (Option.some val✝)
[PROOFSTEP]
rcases le_coe_iff.1 h with ⟨b, rfl, _⟩
[GOAL]
case some.some.intro.intro
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
val✝¹ val✝ b : α
right✝ : b ≤ val✝
h : ↑b ≤ Option.some val✝
⊢ swap (fun x x_1 => x + x_1) (Option.some val✝¹) ↑b ≤
    swap (fun x x_1 => x + x_1) (Option.some val✝¹) (Option.some val✝)
[PROOFSTEP]
exact coe_le_coe.2 (add_le_add_right (coe_le_coe.1 h) _)
[GOAL]
α : Type u
β : Type v
inst✝² : Add α
a✝ b✝ c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1
a b c : WithTop α
h : a + b < a + c
⊢ b < c
[PROOFSTEP]
induction a using WithTop.recTopCoe
[GOAL]
case top
α : Type u
β : Type v
inst✝² : Add α
a b✝ c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1
b c : WithTop α
h : ⊤ + b < ⊤ + c
⊢ b < c
[PROOFSTEP]
exact (not_none_lt _ h).elim
[GOAL]
case coe
α : Type u
β : Type v
inst✝² : Add α
a b✝ c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1
b c : WithTop α
a✝ : α
h : ↑a✝ + b < ↑a✝ + c
⊢ b < c
[PROOFSTEP]
induction b using WithTop.recTopCoe
[GOAL]
case coe.top
α : Type u
β : Type v
inst✝² : Add α
a b c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1
c : WithTop α
a✝ : α
h : ↑a✝ + ⊤ < ↑a✝ + c
⊢ ⊤ < c
[PROOFSTEP]
exact (not_none_lt _ h).elim
[GOAL]
case coe.coe
α : Type u
β : Type v
inst✝² : Add α
a b c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1
c : WithTop α
a✝¹ a✝ : α
h : ↑a✝¹ + ↑a✝ < ↑a✝¹ + c
⊢ ↑a✝ < c
[PROOFSTEP]
induction c using WithTop.recTopCoe
[GOAL]
case coe.coe.top
α : Type u
β : Type v
inst✝² : Add α
a b c d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1
a✝¹ a✝ : α
h : ↑a✝¹ + ↑a✝ < ↑a✝¹ + ⊤
⊢ ↑a✝ < ⊤
[PROOFSTEP]
exact coe_lt_top _
[GOAL]
case coe.coe.coe
α : Type u
β : Type v
inst✝² : Add α
a b c d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1
a✝² a✝¹ a✝ : α
h : ↑a✝² + ↑a✝¹ < ↑a✝² + ↑a✝
⊢ ↑a✝¹ < ↑a✝
[PROOFSTEP]
exact coe_lt_coe.2 (lt_of_add_lt_add_left <| coe_lt_coe.1 h)
[GOAL]
α : Type u
β : Type v
inst✝² : Add α
a✝ b✝ c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
a b c : WithTop α
h : swap (fun x x_1 => x + x_1) a b < swap (fun x x_1 => x + x_1) a c
⊢ b < c
[PROOFSTEP]
cases a
[GOAL]
case none
α : Type u
β : Type v
inst✝² : Add α
a b✝ c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
b c : WithTop α
h : swap (fun x x_1 => x + x_1) none b < swap (fun x x_1 => x + x_1) none c
⊢ b < c
[PROOFSTEP]
cases b
[GOAL]
case some
α : Type u
β : Type v
inst✝² : Add α
a b✝ c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
b c : WithTop α
val✝ : α
h : swap (fun x x_1 => x + x_1) (Option.some val✝) b < swap (fun x x_1 => x + x_1) (Option.some val✝) c
⊢ b < c
[PROOFSTEP]
cases b
[GOAL]
case none.none
α : Type u
β : Type v
inst✝² : Add α
a b c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
c : WithTop α
h : swap (fun x x_1 => x + x_1) none none < swap (fun x x_1 => x + x_1) none c
⊢ none < c
[PROOFSTEP]
try exact (not_none_lt _ h).elim
[GOAL]
case none.none
α : Type u
β : Type v
inst✝² : Add α
a b c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
c : WithTop α
h : swap (fun x x_1 => x + x_1) none none < swap (fun x x_1 => x + x_1) none c
⊢ none < c
[PROOFSTEP]
exact (not_none_lt _ h).elim
[GOAL]
case none.some
α : Type u
β : Type v
inst✝² : Add α
a b c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
c : WithTop α
val✝ : α
h : swap (fun x x_1 => x + x_1) none (Option.some val✝) < swap (fun x x_1 => x + x_1) none c
⊢ Option.some val✝ < c
[PROOFSTEP]
try exact (not_none_lt _ h).elim
[GOAL]
case none.some
α : Type u
β : Type v
inst✝² : Add α
a b c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
c : WithTop α
val✝ : α
h : swap (fun x x_1 => x + x_1) none (Option.some val✝) < swap (fun x x_1 => x + x_1) none c
⊢ Option.some val✝ < c
[PROOFSTEP]
exact (not_none_lt _ h).elim
[GOAL]
case some.none
α : Type u
β : Type v
inst✝² : Add α
a b c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
c : WithTop α
val✝ : α
h : swap (fun x x_1 => x + x_1) (Option.some val✝) none < swap (fun x x_1 => x + x_1) (Option.some val✝) c
⊢ none < c
[PROOFSTEP]
try exact (not_none_lt _ h).elim
[GOAL]
case some.none
α : Type u
β : Type v
inst✝² : Add α
a b c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
c : WithTop α
val✝ : α
h : swap (fun x x_1 => x + x_1) (Option.some val✝) none < swap (fun x x_1 => x + x_1) (Option.some val✝) c
⊢ none < c
[PROOFSTEP]
exact (not_none_lt _ h).elim
[GOAL]
case some.some
α : Type u
β : Type v
inst✝² : Add α
a b c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
c : WithTop α
val✝¹ val✝ : α
h :
  swap (fun x x_1 => x + x_1) (Option.some val✝¹) (Option.some val✝) < swap (fun x x_1 => x + x_1) (Option.some val✝¹) c
⊢ Option.some val✝ < c
[PROOFSTEP]
try exact (not_none_lt _ h).elim
[GOAL]
case some.some
α : Type u
β : Type v
inst✝² : Add α
a b c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
c : WithTop α
val✝¹ val✝ : α
h :
  swap (fun x x_1 => x + x_1) (Option.some val✝¹) (Option.some val✝) < swap (fun x x_1 => x + x_1) (Option.some val✝¹) c
⊢ Option.some val✝ < c
[PROOFSTEP]
exact (not_none_lt _ h).elim
[GOAL]
case some.some
α : Type u
β : Type v
inst✝² : Add α
a b c✝ d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
c : WithTop α
val✝¹ val✝ : α
h :
  swap (fun x x_1 => x + x_1) (Option.some val✝¹) (Option.some val✝) < swap (fun x x_1 => x + x_1) (Option.some val✝¹) c
⊢ Option.some val✝ < c
[PROOFSTEP]
cases c
[GOAL]
case some.some.none
α : Type u
β : Type v
inst✝² : Add α
a b c d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
val✝¹ val✝ : α
h :
  swap (fun x x_1 => x + x_1) (Option.some val✝¹) (Option.some val✝) <
    swap (fun x x_1 => x + x_1) (Option.some val✝¹) none
⊢ Option.some val✝ < none
[PROOFSTEP]
exact coe_lt_top _
[GOAL]
case some.some.some
α : Type u
β : Type v
inst✝² : Add α
a b c d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
val✝² val✝¹ val✝ : α
h :
  swap (fun x x_1 => x + x_1) (Option.some val✝²) (Option.some val✝¹) <
    swap (fun x x_1 => x + x_1) (Option.some val✝²) (Option.some val✝)
⊢ Option.some val✝¹ < Option.some val✝
[PROOFSTEP]
exact coe_lt_coe.2 (lt_of_add_lt_add_right <| coe_lt_coe.1 h)
[GOAL]
α : Type u
β : Type v
inst✝² : Add α
a b c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
ha : a ≠ ⊤
h : a + b ≤ a + c
⊢ b ≤ c
[PROOFSTEP]
lift a to α using ha
[GOAL]
case intro
α : Type u
β : Type v
inst✝² : Add α
b c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
a : α
h : ↑a + b ≤ ↑a + c
⊢ b ≤ c
[PROOFSTEP]
induction c using WithTop.recTopCoe
[GOAL]
case intro.top
α : Type u
β : Type v
inst✝² : Add α
b d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
a : α
h : ↑a + b ≤ ↑a + ⊤
⊢ b ≤ ⊤
[PROOFSTEP]
exact le_top
[GOAL]
case intro.coe
α : Type u
β : Type v
inst✝² : Add α
b d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
a a✝ : α
h : ↑a + b ≤ ↑a + ↑a✝
⊢ b ≤ ↑a✝
[PROOFSTEP]
induction b using WithTop.recTopCoe
[GOAL]
case intro.coe.top
α : Type u
β : Type v
inst✝² : Add α
d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
a a✝ : α
h : ↑a + ⊤ ≤ ↑a + ↑a✝
⊢ ⊤ ≤ ↑a✝
[PROOFSTEP]
exact (not_top_le_coe _ h).elim
[GOAL]
case intro.coe.coe
α : Type u
β : Type v
inst✝² : Add α
d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
a a✝¹ a✝ : α
h : ↑a + ↑a✝ ≤ ↑a + ↑a✝¹
⊢ ↑a✝ ≤ ↑a✝¹
[PROOFSTEP]
simp only [← coe_add, coe_le_coe] at h ⊢
[GOAL]
case intro.coe.coe
α : Type u
β : Type v
inst✝² : Add α
d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : ContravariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
a a✝¹ a✝ : α
h : a + a✝ ≤ a + a✝¹
⊢ a✝ ≤ a✝¹
[PROOFSTEP]
exact le_of_add_le_add_left h
[GOAL]
α : Type u
β : Type v
inst✝² : Add α
a b c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
ha : a ≠ ⊤
h : b + a ≤ c + a
⊢ b ≤ c
[PROOFSTEP]
lift a to α using ha
[GOAL]
case intro
α : Type u
β : Type v
inst✝² : Add α
b c d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
a : α
h : b + ↑a ≤ c + ↑a
⊢ b ≤ c
[PROOFSTEP]
cases c
[GOAL]
case intro.none
α : Type u
β : Type v
inst✝² : Add α
b d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
a : α
h : b + ↑a ≤ none + ↑a
⊢ b ≤ none
[PROOFSTEP]
exact le_top
[GOAL]
case intro.some
α : Type u
β : Type v
inst✝² : Add α
b d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
a val✝ : α
h : b + ↑a ≤ Option.some val✝ + ↑a
⊢ b ≤ Option.some val✝
[PROOFSTEP]
cases b
[GOAL]
case intro.some.none
α : Type u
β : Type v
inst✝² : Add α
d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
a val✝ : α
h : none + ↑a ≤ Option.some val✝ + ↑a
⊢ none ≤ Option.some val✝
[PROOFSTEP]
exact (not_top_le_coe _ h).elim
[GOAL]
case intro.some.some
α : Type u
β : Type v
inst✝² : Add α
d : WithTop α
x y : α
inst✝¹ : LE α
inst✝ : ContravariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x ≤ x_1
a val✝¹ val✝ : α
h : Option.some val✝ + ↑a ≤ Option.some val✝¹ + ↑a
⊢ Option.some val✝ ≤ Option.some val✝¹
[PROOFSTEP]
exact coe_le_coe.2 (le_of_add_le_add_right <| coe_le_coe.1 h)
[GOAL]
α : Type u
β : Type v
inst✝² : Add α
a b c d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1
ha : a ≠ ⊤
h : b < c
⊢ a + b < a + c
[PROOFSTEP]
lift a to α using ha
[GOAL]
case intro
α : Type u
β : Type v
inst✝² : Add α
b c d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1
h : b < c
a : α
⊢ ↑a + b < ↑a + c
[PROOFSTEP]
rcases lt_iff_exists_coe.1 h with ⟨b, rfl, h'⟩
[GOAL]
case intro.intro.intro
α : Type u
β : Type v
inst✝² : Add α
c d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1
a b : α
h' h : ↑b < c
⊢ ↑a + ↑b < ↑a + c
[PROOFSTEP]
cases c
[GOAL]
case intro.intro.intro.none
α : Type u
β : Type v
inst✝² : Add α
d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1
a b : α
h' h : ↑b < none
⊢ ↑a + ↑b < ↑a + none
[PROOFSTEP]
exact coe_lt_top _
[GOAL]
case intro.intro.intro.some
α : Type u
β : Type v
inst✝² : Add α
d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : CovariantClass α α (fun x x_1 => x + x_1) fun x x_1 => x < x_1
a b val✝ : α
h' h : ↑b < Option.some val✝
⊢ ↑a + ↑b < ↑a + Option.some val✝
[PROOFSTEP]
exact coe_lt_coe.2 (add_lt_add_left (coe_lt_coe.1 h) _)
[GOAL]
α : Type u
β : Type v
inst✝² : Add α
a b c d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
ha : a ≠ ⊤
h : b < c
⊢ b + a < c + a
[PROOFSTEP]
lift a to α using ha
[GOAL]
case intro
α : Type u
β : Type v
inst✝² : Add α
b c d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
h : b < c
a : α
⊢ b + ↑a < c + ↑a
[PROOFSTEP]
rcases lt_iff_exists_coe.1 h with ⟨b, rfl, h'⟩
[GOAL]
case intro.intro.intro
α : Type u
β : Type v
inst✝² : Add α
c d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
a b : α
h' h : ↑b < c
⊢ ↑b + ↑a < c + ↑a
[PROOFSTEP]
cases c
[GOAL]
case intro.intro.intro.none
α : Type u
β : Type v
inst✝² : Add α
d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
a b : α
h' h : ↑b < none
⊢ ↑b + ↑a < none + ↑a
[PROOFSTEP]
exact coe_lt_top _
[GOAL]
case intro.intro.intro.some
α : Type u
β : Type v
inst✝² : Add α
d : WithTop α
x y : α
inst✝¹ : LT α
inst✝ : CovariantClass α α (swap fun x x_1 => x + x_1) fun x x_1 => x < x_1
a b val✝ : α
h' h : ↑b < Option.some val✝
⊢ ↑b + ↑a < Option.some val✝ + ↑a
[PROOFSTEP]
exact coe_lt_coe.2 (add_lt_add_right (coe_lt_coe.1 h) _)
[GOAL]
α : Type u
β : Type v
inst✝² : Add α
a✝ b✝ c d : WithTop α
x y : α
F : Type u_1
inst✝¹ : Add β
inst✝ : AddHomClass F α β
f : F
a b : WithTop α
⊢ map (↑f) (a + b) = map (↑f) a + map (↑f) b
[PROOFSTEP]
induction a using WithTop.recTopCoe
[GOAL]
case top
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
F : Type u_1
inst✝¹ : Add β
inst✝ : AddHomClass F α β
f : F
b : WithTop α
⊢ map (↑f) (⊤ + b) = map ↑f ⊤ + map (↑f) b
[PROOFSTEP]
exact (top_add _).symm
[GOAL]
case coe
α : Type u
β : Type v
inst✝² : Add α
a b✝ c d : WithTop α
x y : α
F : Type u_1
inst✝¹ : Add β
inst✝ : AddHomClass F α β
f : F
b : WithTop α
a✝ : α
⊢ map (↑f) (↑a✝ + b) = map ↑f ↑a✝ + map (↑f) b
[PROOFSTEP]
induction b using WithTop.recTopCoe
[GOAL]
case coe.top
α : Type u
β : Type v
inst✝² : Add α
a b c d : WithTop α
x y : α
F : Type u_1
inst✝¹ : Add β
inst✝ : AddHomClass F α β
f : F
a✝ : α
⊢ map (↑f) (↑a✝ + ⊤) = map ↑f ↑a✝ + map ↑f ⊤
[PROOFSTEP]
exact (add_top _).symm
[GOAL]
case coe.coe
α : Type u
β : Type v
inst✝² : Add α
a b c d : WithTop α
x y : α
F : Type u_1
inst✝¹ : Add β
inst✝ : AddHomClass F α β
f : F
a✝¹ a✝ : α
⊢ map (↑f) (↑a✝¹ + ↑a✝) = map ↑f ↑a✝¹ + map ↑f ↑a✝
[PROOFSTEP]
rw [map_coe, map_coe, ← coe_add, ← coe_add, ← map_add]
[GOAL]
case coe.coe
α : Type u
β : Type v
inst✝² : Add α
a b c d : WithTop α
x y : α
F : Type u_1
inst✝¹ : Add β
inst✝ : AddHomClass F α β
f : F
a✝¹ a✝ : α
⊢ map ↑f ↑(a✝¹ + a✝) = ↑(↑f (a✝¹ + a✝))
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
inst✝ : AddMonoidWithOne α
src✝¹ : One (WithTop α) := one
src✝ : AddMonoid (WithTop α) := addMonoid
⊢ NatCast.natCast 0 = 0
[PROOFSTEP]
simp only
  -- Porting note: Had to add this...?
[GOAL]
α : Type u
β : Type v
inst✝ : AddMonoidWithOne α
src✝¹ : One (WithTop α) := one
src✝ : AddMonoid (WithTop α) := addMonoid
⊢ ↑↑0 = 0
[PROOFSTEP]
rw [Nat.cast_zero, WithTop.coe_zero]
[GOAL]
α : Type u
β : Type v
inst✝ : AddMonoidWithOne α
src✝¹ : One (WithTop α) := one
src✝ : AddMonoid (WithTop α) := addMonoid
n : ℕ
⊢ NatCast.natCast (n + 1) = NatCast.natCast n + 1
[PROOFSTEP]
simp only
  -- Porting note: Had to add this...?
[GOAL]
α : Type u
β : Type v
inst✝ : AddMonoidWithOne α
src✝¹ : One (WithTop α) := one
src✝ : AddMonoid (WithTop α) := addMonoid
n : ℕ
⊢ ↑↑(n + 1) = ↑↑n + 1
[PROOFSTEP]
rw [Nat.cast_add_one, WithTop.coe_add, WithTop.coe_one]
[GOAL]
α : Type u
β : Type v
inst✝ : OrderedAddCommMonoid α
src✝¹ : PartialOrder (WithTop α) := partialOrder
src✝ : AddCommMonoid (WithTop α) := addCommMonoid
⊢ ∀ (a b : WithTop α), a ≤ b → ∀ (c : WithTop α), c + a ≤ c + b
[PROOFSTEP]
rintro a b h (_ | c)
[GOAL]
case none
α : Type u
β : Type v
inst✝ : OrderedAddCommMonoid α
src✝¹ : PartialOrder (WithTop α) := partialOrder
src✝ : AddCommMonoid (WithTop α) := addCommMonoid
a b : WithTop α
h : a ≤ b
⊢ none + a ≤ none + b
[PROOFSTEP]
simp [none_eq_top]
[GOAL]
case some
α : Type u
β : Type v
inst✝ : OrderedAddCommMonoid α
src✝¹ : PartialOrder (WithTop α) := partialOrder
src✝ : AddCommMonoid (WithTop α) := addCommMonoid
a b : WithTop α
h : a ≤ b
c : α
⊢ Option.some c + a ≤ Option.some c + b
[PROOFSTEP]
rcases b with (_ | b)
[GOAL]
case some.none
α : Type u
β : Type v
inst✝ : OrderedAddCommMonoid α
src✝¹ : PartialOrder (WithTop α) := partialOrder
src✝ : AddCommMonoid (WithTop α) := addCommMonoid
a : WithTop α
c : α
h : a ≤ none
⊢ Option.some c + a ≤ Option.some c + none
[PROOFSTEP]
simp [none_eq_top]
[GOAL]
case some.some
α : Type u
β : Type v
inst✝ : OrderedAddCommMonoid α
src✝¹ : PartialOrder (WithTop α) := partialOrder
src✝ : AddCommMonoid (WithTop α) := addCommMonoid
a : WithTop α
c b : α
h : a ≤ Option.some b
⊢ Option.some c + a ≤ Option.some c + Option.some b
[PROOFSTEP]
rcases le_coe_iff.1 h with ⟨a, rfl, _⟩
[GOAL]
case some.some.intro.intro
α : Type u
β : Type v
inst✝ : OrderedAddCommMonoid α
src✝¹ : PartialOrder (WithTop α) := partialOrder
src✝ : AddCommMonoid (WithTop α) := addCommMonoid
c b a : α
right✝ : a ≤ b
h : ↑a ≤ Option.some b
⊢ Option.some c + ↑a ≤ Option.some c + Option.some b
[PROOFSTEP]
simp only [some_eq_coe, ← coe_add, coe_le_coe] at h ⊢
[GOAL]
case some.some.intro.intro
α : Type u
β : Type v
inst✝ : OrderedAddCommMonoid α
src✝¹ : PartialOrder (WithTop α) := partialOrder
src✝ : AddCommMonoid (WithTop α) := addCommMonoid
c b a : α
right✝ h : a ≤ b
⊢ c + a ≤ c + b
[PROOFSTEP]
exact add_le_add_left h c
[GOAL]
α : Type u
β : Type v
inst✝² : LE α
inst✝¹ : Add α
inst✝ : ExistsAddOfLE α
a b : WithTop α
⊢ ⊤ ≤ ⊤ → ∃ c, ⊤ = ⊤ + c
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
inst✝² : LE α
inst✝¹ : Add α
inst✝ : ExistsAddOfLE α
a✝ b✝ : WithTop α
a b : α
h : ↑a ≤ ↑b
⊢ ∃ c, ↑b = ↑a + c
[PROOFSTEP]
obtain ⟨c, rfl⟩ := exists_add_of_le (WithTop.coe_le_coe.1 h)
[GOAL]
case intro
α : Type u
β : Type v
inst✝² : LE α
inst✝¹ : Add α
inst✝ : ExistsAddOfLE α
a✝ b : WithTop α
a c : α
h : ↑a ≤ ↑(a + c)
⊢ ∃ c_1, ↑(a + c) = ↑a + c_1
[PROOFSTEP]
exact ⟨c, rfl⟩
[GOAL]
α : Type u
β : Type v
M : Type u_1
N : Type u_2
inst✝¹ : One M
inst✝ : One N
f : OneHom M N
⊢ map (↑f) 1 = 1
[PROOFSTEP]
rw [WithTop.map_one, map_one, coe_one]
[GOAL]
α : Type u
β : Type v
inst✝ : Add α
a✝ b c d : WithBot α
x y : α
a : WithBot α
⊢ a + ⊥ = ⊥
[PROOFSTEP]
cases a
[GOAL]
case none
α : Type u
β : Type v
inst✝ : Add α
a b c d : WithBot α
x y : α
⊢ none + ⊥ = ⊥
[PROOFSTEP]
rfl
[GOAL]
case some
α : Type u
β : Type v
inst✝ : Add α
a b c d : WithBot α
x y val✝ : α
⊢ Option.some val✝ + ⊥ = ⊥
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
inst✝² : Add α
a b c d : WithBot α
x y : α
M : Type u_1
N : Type u_2
inst✝¹ : One M
inst✝ : One N
f : OneHom M N
⊢ map (↑f) 1 = 1
[PROOFSTEP]
rw [WithBot.map_one, map_one, coe_one]


[GOAL]
α : Type u_1
β : Type u_2
M : Type u_3
E : Type u_4
inst✝ : One M
s t : Set α
f g : α → M
a : α
l : Filter α
hf : f =ᶠ[l ⊓ 𝓟 s] g
hs : s =ᶠ[l] t
x : α
hst : x ∈ s ↔ x ∈ t
hfg : x ∈ s → f x = g x
hxs : x ∈ s
⊢ mulIndicator s f x = mulIndicator t g x
[PROOFSTEP]
simp only [*, hst.1 hxs, mulIndicator_of_mem]
[GOAL]
α : Type u_1
β : Type u_2
M : Type u_3
E : Type u_4
inst✝ : One M
s t : Set α
f g : α → M
a : α
l : Filter α
hf : f =ᶠ[l ⊓ 𝓟 s] g
hs : s =ᶠ[l] t
x : α
hst : x ∈ s ↔ x ∈ t
hfg : x ∈ s → f x = g x
hxs : ¬x ∈ s
⊢ mulIndicator s f x = mulIndicator t g x
[PROOFSTEP]
simp only [mulIndicator_of_not_mem, hxs, mt hst.2 hxs]
[GOAL]
α : Type u_1
β : Type u_2
M : Type u_3
E : Type u_4
ι : Type u_5
inst✝¹ : Preorder ι
inst✝ : One β
s : ι → Set α
hs : Monotone s
f : α → β
a : α
⊢ (fun i => mulIndicator (s i) f a) =ᶠ[atTop] fun x => mulIndicator (⋃ (i : ι), s i) f a
[PROOFSTEP]
classical exact hs.piecewise_eventually_eq_iUnion f 1 a
[GOAL]
α : Type u_1
β : Type u_2
M : Type u_3
E : Type u_4
ι : Type u_5
inst✝¹ : Preorder ι
inst✝ : One β
s : ι → Set α
hs : Monotone s
f : α → β
a : α
⊢ (fun i => mulIndicator (s i) f a) =ᶠ[atTop] fun x => mulIndicator (⋃ (i : ι), s i) f a
[PROOFSTEP]
exact hs.piecewise_eventually_eq_iUnion f 1 a
[GOAL]
α : Type u_1
β : Type u_2
M : Type u_3
E : Type u_4
ι : Type u_5
inst✝¹ : Preorder ι
inst✝ : One β
s : ι → Set α
hs : Antitone s
f : α → β
a : α
⊢ (fun i => mulIndicator (s i) f a) =ᶠ[atTop] fun x => mulIndicator (⋂ (i : ι), s i) f a
[PROOFSTEP]
classical exact hs.piecewise_eventually_eq_iInter f 1 a
[GOAL]
α : Type u_1
β : Type u_2
M : Type u_3
E : Type u_4
ι : Type u_5
inst✝¹ : Preorder ι
inst✝ : One β
s : ι → Set α
hs : Antitone s
f : α → β
a : α
⊢ (fun i => mulIndicator (s i) f a) =ᶠ[atTop] fun x => mulIndicator (⋂ (i : ι), s i) f a
[PROOFSTEP]
exact hs.piecewise_eventually_eq_iInter f 1 a
[GOAL]
α : Type u_1
β : Type u_2
M : Type u_3
E : Type u_4
ι : Type u_5
inst✝ : One β
s : ι → Set α
f : α → β
a : α
⊢ (fun n => mulIndicator (⋃ (i : ι) (_ : i ∈ n), s i) f a) =ᶠ[atTop] fun x => mulIndicator (iUnion s) f a
[PROOFSTEP]
rw [iUnion_eq_iUnion_finset s]
[GOAL]
α : Type u_1
β : Type u_2
M : Type u_3
E : Type u_4
ι : Type u_5
inst✝ : One β
s : ι → Set α
f : α → β
a : α
⊢ (fun n => mulIndicator (⋃ (i : ι) (_ : i ∈ n), s i) f a) =ᶠ[atTop] fun x =>
    mulIndicator (⋃ (t : Finset ι) (i : ι) (_ : i ∈ t), s i) f a
[PROOFSTEP]
apply Monotone.mulIndicator_eventuallyEq_iUnion
[GOAL]
case hs
α : Type u_1
β : Type u_2
M : Type u_3
E : Type u_4
ι : Type u_5
inst✝ : One β
s : ι → Set α
f : α → β
a : α
⊢ Monotone fun i => ⋃ (i_1 : ι) (_ : i_1 ∈ i), s i_1
[PROOFSTEP]
exact fun _ _ ↦ biUnion_subset_biUnion_left
[GOAL]
α : Type u_1
β : Type u_2
M : Type u_3
E : Type u_4
inst✝ : One β
l : Filter α
f : α → β
s : Set α
hf : f =ᶠ[l] 1
⊢ mulIndicator s 1 =ᶠ[l] 1
[PROOFSTEP]
rw [mulIndicator_one']
[GOAL]
α : Type u_1
β : Type u_2
M : Type u_3
E : Type u_4
inst✝ : One β
l : Filter α
f : α → β
hf : ∀ᶠ (x : α) in l, f x ≠ 1
s t : Set α
h : mulIndicator s f =ᶠ[l] mulIndicator t f
⊢ s =ᶠ[l] t
[PROOFSTEP]
have : ∀ {s : Set α}, Function.mulSupport (s.mulIndicator f) =ᶠ[l] s := fun {s} ↦
  by
  rw [mulSupport_mulIndicator]
  exact (hf.mono fun x hx ↦ and_iff_left hx).set_eq
[GOAL]
α : Type u_1
β : Type u_2
M : Type u_3
E : Type u_4
inst✝ : One β
l : Filter α
f : α → β
hf : ∀ᶠ (x : α) in l, f x ≠ 1
s✝ t : Set α
h : mulIndicator s✝ f =ᶠ[l] mulIndicator t f
s : Set α
⊢ Function.mulSupport (mulIndicator s f) =ᶠ[l] s
[PROOFSTEP]
rw [mulSupport_mulIndicator]
[GOAL]
α : Type u_1
β : Type u_2
M : Type u_3
E : Type u_4
inst✝ : One β
l : Filter α
f : α → β
hf : ∀ᶠ (x : α) in l, f x ≠ 1
s✝ t : Set α
h : mulIndicator s✝ f =ᶠ[l] mulIndicator t f
s : Set α
⊢ s ∩ Function.mulSupport f =ᶠ[l] s
[PROOFSTEP]
exact (hf.mono fun x hx ↦ and_iff_left hx).set_eq
[GOAL]
α : Type u_1
β : Type u_2
M : Type u_3
E : Type u_4
inst✝ : One β
l : Filter α
f : α → β
hf : ∀ᶠ (x : α) in l, f x ≠ 1
s t : Set α
h : mulIndicator s f =ᶠ[l] mulIndicator t f
this : ∀ {s : Set α}, Function.mulSupport (mulIndicator s f) =ᶠ[l] s
⊢ s =ᶠ[l] t
[PROOFSTEP]
exact this.symm.trans <| h.mulSupport.trans this