[GOAL]
R : Type u_1
inst✝ : CommSemiring R
σ : Type u_2
f : σ → R
s : Finset σ
n : ℕ
⊢ esymm (map f s.val) n = ∑ t in Finset.powersetLen n s, Finset.prod t f
[PROOFSTEP]
simp only [esymm, powersetLen_map, ← Finset.map_val_val_powersetLen, map_map]
[GOAL]
R : Type u_1
inst✝ : CommSemiring R
σ : Type u_2
f : σ → R
s : Finset σ
n : ℕ
⊢ sum (map ((fun x => prod x) ∘ (fun x => map f x) ∘ Finset.val) (Finset.powersetLen n s).val) =
    ∑ t in Finset.powersetLen n s, Finset.prod t f
[PROOFSTEP]
rfl
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝ : CommSemiring R
a✝ b✝ : MvPolynomial σ R
ha : a✝ ∈ setOf IsSymmetric
hb : b✝ ∈ setOf IsSymmetric
e : Perm σ
⊢ ↑(rename ↑e) (a✝ * b✝) = a✝ * b✝
[PROOFSTEP]
rw [AlgHom.map_mul, ha, hb]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝ : CommSemiring R
a✝ b✝ : MvPolynomial σ R
ha :
  a✝ ∈
    {
          toSubsemigroup :=
            { carrier := setOf IsSymmetric,
              mul_mem' :=
                (_ :
                  ∀ {a b : MvPolynomial σ R},
                    a ∈ setOf IsSymmetric → b ∈ setOf IsSymmetric → ∀ (e : Perm σ), ↑(rename ↑e) (a * b) = a * b) },
          one_mem' := (_ : 1 ∈ setOf IsSymmetric) }.toSubsemigroup.carrier
hb :
  b✝ ∈
    {
          toSubsemigroup :=
            { carrier := setOf IsSymmetric,
              mul_mem' :=
                (_ :
                  ∀ {a b : MvPolynomial σ R},
                    a ∈ setOf IsSymmetric → b ∈ setOf IsSymmetric → ∀ (e : Perm σ), ↑(rename ↑e) (a * b) = a * b) },
          one_mem' := (_ : 1 ∈ setOf IsSymmetric) }.toSubsemigroup.carrier
e : Perm σ
⊢ ↑(rename ↑e) (a✝ + b✝) = a✝ + b✝
[PROOFSTEP]
rw [AlgHom.map_add, ha, hb]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S
φ ψ : MvPolynomial σ R
hφ : IsSymmetric φ
f : R →+* S
e : Perm σ
⊢ ↑(rename ↑e) (↑(MvPolynomial.map f) φ) = ↑(MvPolynomial.map f) φ
[PROOFSTEP]
rw [← map_rename, hφ]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : Fintype σ
inst✝ : Fintype τ
⊢ esymm σ R = Multiset.esymm (Multiset.map X univ.val)
[PROOFSTEP]
refine' funext fun n => (Finset.esymm_map_val X _ n).symm
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Algebra R S
f : σ → S
n : ℕ
⊢ ↑(aeval f) (esymm σ R n) = Multiset.esymm (Multiset.map f univ.val) n
[PROOFSTEP]
simp_rw [esymm, aeval_sum, aeval_prod, aeval_X, Finset.esymm_map_val]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : Fintype σ
inst✝ : Fintype τ
n : ℕ
⊢ esymm σ R n = ∑ t in powersetLen n univ, ↑(monomial (∑ i in t, Finsupp.single i 1)) 1
[PROOFSTEP]
simp_rw [monomial_sum_one]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : Fintype σ
inst✝ : Fintype τ
n : ℕ
⊢ esymm σ R n = ∑ x in powersetLen n univ, ∏ x in x, ↑(monomial (Finsupp.single x 1)) 1
[PROOFSTEP]
rfl
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : Fintype σ
inst✝ : Fintype τ
⊢ esymm σ R 0 = 1
[PROOFSTEP]
simp only [esymm, powersetLen_zero, sum_singleton, prod_empty]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : Fintype σ
inst✝ : Fintype τ
n : ℕ
f : R →+* S
⊢ ↑(map f) (esymm σ R n) = esymm σ S n
[PROOFSTEP]
simp_rw [esymm, map_sum, map_prod, map_X]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : Fintype σ
inst✝ : Fintype τ
n : ℕ
e : σ ≃ τ
⊢ ↑(rename ↑e) (esymm σ R n) = ∑ x in powersetLen n univ, ∏ i in x, X (↑e i)
[PROOFSTEP]
simp_rw [esymm, map_sum, map_prod, rename_X]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : Fintype σ
inst✝ : Fintype τ
n : ℕ
e : σ ≃ τ
⊢ ∑ x in powersetLen n univ, ∏ i in x, X (↑e i) =
    ∑ t in powersetLen n (Finset.map (Equiv.toEmbedding e) univ), ∏ i in t, X i
[PROOFSTEP]
simp [Finset.powersetLen_map, -Finset.map_univ_equiv]
  --Porting note: Why did `mapEmbedding_apply` not work?
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : Fintype σ
inst✝ : Fintype τ
n : ℕ
e : σ ≃ τ
⊢ ∑ x in powersetLen n univ, ∏ x in x, X (↑e x) =
    ∑ x in powersetLen n univ, ∏ i in ↑(mapEmbedding (Equiv.toEmbedding e)) x, X i
[PROOFSTEP]
dsimp [mapEmbedding, OrderEmbedding.ofMapLEIff]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : Fintype σ
inst✝ : Fintype τ
n : ℕ
e : σ ≃ τ
⊢ ∑ x in powersetLen n univ, ∏ x in x, X (↑e x) =
    ∑ x in powersetLen n univ, ∏ i in Finset.map (Equiv.toEmbedding e) x, X i
[PROOFSTEP]
simp
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : Fintype σ
inst✝ : Fintype τ
n : ℕ
e : σ ≃ τ
⊢ ∑ t in powersetLen n (Finset.map (Equiv.toEmbedding e) univ), ∏ i in t, X i = ∑ t in powersetLen n univ, ∏ i in t, X i
[PROOFSTEP]
rw [Finset.map_univ_equiv]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : Fintype σ
inst✝ : Fintype τ
n : ℕ
⊢ IsSymmetric (esymm σ R n)
[PROOFSTEP]
intro
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : Fintype σ
inst✝ : Fintype τ
n : ℕ
e✝ : Perm σ
⊢ ↑(rename ↑e✝) (esymm σ R n) = esymm σ R n
[PROOFSTEP]
rw [rename_esymm]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
⊢ support (esymm σ R n) =
    Finset.biUnion (powersetLen n univ) fun t => (Finsupp.single (∑ i in t, Finsupp.single i 1) 1).support
[PROOFSTEP]
rw [esymm_eq_sum_monomial]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
⊢ support (∑ t in powersetLen n univ, ↑(monomial (∑ i in t, Finsupp.single i 1)) 1) =
    Finset.biUnion (powersetLen n univ) fun t => (Finsupp.single (∑ i in t, Finsupp.single i 1) 1).support
[PROOFSTEP]
simp only [← single_eq_monomial]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
⊢ support (∑ x in powersetLen n univ, Finsupp.single (∑ i in x, Finsupp.single i 1) 1) =
    Finset.biUnion (powersetLen n univ) fun t => (Finsupp.single (∑ i in t, Finsupp.single i 1) 1).support
[PROOFSTEP]
refine' Finsupp.support_sum_eq_biUnion (powersetLen n (univ : Finset σ)) _
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
⊢ ∀ (i₁ i₂ : Finset σ),
    i₁ ≠ i₂ →
      Disjoint (Finsupp.single (∑ i in i₁, Finsupp.single i 1) 1).support
        (Finsupp.single (∑ i in i₂, Finsupp.single i 1) 1).support
[PROOFSTEP]
intro s t hst
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
⊢ Disjoint (Finsupp.single (∑ i in s, Finsupp.single i 1) 1).support
    (Finsupp.single (∑ i in t, Finsupp.single i 1) 1).support
[PROOFSTEP]
rw [Finset.disjoint_left, Finsupp.support_single_ne_zero _ one_ne_zero]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
⊢ ∀ ⦃a : σ →₀ ℕ⦄, a ∈ {∑ i in s, Finsupp.single i 1} → ¬a ∈ (Finsupp.single (∑ i in t, Finsupp.single i 1) 1).support
[PROOFSTEP]
rw [Finsupp.support_single_ne_zero _ one_ne_zero]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
⊢ ∀ ⦃a : σ →₀ ℕ⦄, a ∈ {∑ i in s, Finsupp.single i 1} → ¬a ∈ {∑ i in t, Finsupp.single i 1}
[PROOFSTEP]
simp only [one_ne_zero, mem_singleton, Finsupp.mem_support_iff]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
⊢ ∀ ⦃a : σ →₀ ℕ⦄, a = ∑ i in s, Finsupp.single i 1 → ¬a = ∑ i in t, Finsupp.single i 1
[PROOFSTEP]
rintro a h rfl
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
⊢ False
[PROOFSTEP]
have := congr_arg Finsupp.support h
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
⊢ False
[PROOFSTEP]
rw [Finsupp.support_sum_eq_biUnion, Finsupp.support_sum_eq_biUnion] at this
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝¹ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this✝ : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
this : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = Finset.biUnion s fun i => (Finsupp.single i 1).support
⊢ False
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
⊢ ∀ (i₁ i₂ : σ), i₁ ≠ i₂ → Disjoint (Finsupp.single i₁ 1).support (Finsupp.single i₂ 1).support
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
⊢ ∀ (i₁ i₂ : σ), i₁ ≠ i₂ → Disjoint (Finsupp.single i₁ 1).support (Finsupp.single i₂ 1).support
[PROOFSTEP]
have hsingle : ∀ s : Finset σ, ∀ x : σ, x ∈ s → (Finsupp.single x 1).support = { x } :=
  by
  intros _ x _
  rw [Finsupp.support_single_ne_zero x one_ne_zero]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝¹ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this✝ : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
this : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = Finset.biUnion s fun i => (Finsupp.single i 1).support
⊢ ∀ (s : Finset σ) (x : σ), x ∈ s → (Finsupp.single x 1).support = {x}
[PROOFSTEP]
intros _ x _
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝¹ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this✝ : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
this : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = Finset.biUnion s fun i => (Finsupp.single i 1).support
s✝ : Finset σ
x : σ
a✝ : x ∈ s✝
⊢ (Finsupp.single x 1).support = {x}
[PROOFSTEP]
rw [Finsupp.support_single_ne_zero x one_ne_zero]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝¹ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this✝ : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
this : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = Finset.biUnion s fun i => (Finsupp.single i 1).support
hsingle : ∀ (s : Finset σ) (x : σ), x ∈ s → (Finsupp.single x 1).support = {x}
⊢ False
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
⊢ ∀ (i₁ i₂ : σ), i₁ ≠ i₂ → Disjoint (Finsupp.single i₁ 1).support (Finsupp.single i₂ 1).support
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
⊢ ∀ (i₁ i₂ : σ), i₁ ≠ i₂ → Disjoint (Finsupp.single i₁ 1).support (Finsupp.single i₂ 1).support
[PROOFSTEP]
have hs := biUnion_congr (of_eq_true (eq_self s)) (hsingle s)
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝¹ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this✝ : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
this : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = Finset.biUnion s fun i => (Finsupp.single i 1).support
hsingle : ∀ (s : Finset σ) (x : σ), x ∈ s → (Finsupp.single x 1).support = {x}
hs : (Finset.biUnion s fun a => (Finsupp.single a 1).support) = Finset.biUnion s fun a => {a}
⊢ False
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
⊢ ∀ (i₁ i₂ : σ), i₁ ≠ i₂ → Disjoint (Finsupp.single i₁ 1).support (Finsupp.single i₂ 1).support
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
⊢ ∀ (i₁ i₂ : σ), i₁ ≠ i₂ → Disjoint (Finsupp.single i₁ 1).support (Finsupp.single i₂ 1).support
[PROOFSTEP]
have ht := biUnion_congr (of_eq_true (eq_self t)) (hsingle t)
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝¹ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this✝ : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
this : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = Finset.biUnion s fun i => (Finsupp.single i 1).support
hsingle : ∀ (s : Finset σ) (x : σ), x ∈ s → (Finsupp.single x 1).support = {x}
hs : (Finset.biUnion s fun a => (Finsupp.single a 1).support) = Finset.biUnion s fun a => {a}
ht : (Finset.biUnion t fun a => (Finsupp.single a 1).support) = Finset.biUnion t fun a => {a}
⊢ False
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
⊢ ∀ (i₁ i₂ : σ), i₁ ≠ i₂ → Disjoint (Finsupp.single i₁ 1).support (Finsupp.single i₂ 1).support
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
⊢ ∀ (i₁ i₂ : σ), i₁ ≠ i₂ → Disjoint (Finsupp.single i₁ 1).support (Finsupp.single i₂ 1).support
[PROOFSTEP]
rw [hs, ht] at this
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝¹ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this✝ : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
this : (Finset.biUnion t fun a => {a}) = Finset.biUnion s fun a => {a}
hsingle : ∀ (s : Finset σ) (x : σ), x ∈ s → (Finsupp.single x 1).support = {x}
hs : (Finset.biUnion s fun a => (Finsupp.single a 1).support) = Finset.biUnion s fun a => {a}
ht : (Finset.biUnion t fun a => (Finsupp.single a 1).support) = Finset.biUnion t fun a => {a}
⊢ False
[PROOFSTEP]
simp only [biUnion_singleton_eq_self] at this
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝¹ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this✝ : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
hsingle : ∀ (s : Finset σ) (x : σ), x ∈ s → (Finsupp.single x 1).support = {x}
hs : (Finset.biUnion s fun a => (Finsupp.single a 1).support) = Finset.biUnion s fun a => {a}
ht : (Finset.biUnion t fun a => (Finsupp.single a 1).support) = Finset.biUnion t fun a => {a}
this : t = s
⊢ False
[PROOFSTEP]
exact absurd this hst.symm
[GOAL]
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
⊢ ∀ (i₁ i₂ : σ), i₁ ≠ i₂ → Disjoint (Finsupp.single i₁ 1).support (Finsupp.single i₂ 1).support
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
⊢ ∀ (i₁ i₂ : σ), i₁ ≠ i₂ → Disjoint (Finsupp.single i₁ 1).support (Finsupp.single i₂ 1).support
[PROOFSTEP]
all_goals intro x y; simp [Finsupp.support_single_disjoint]
[GOAL]
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
⊢ ∀ (i₁ i₂ : σ), i₁ ≠ i₂ → Disjoint (Finsupp.single i₁ 1).support (Finsupp.single i₂ 1).support
[PROOFSTEP]
intro x y
[GOAL]
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this✝ : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
this : (Finset.biUnion t fun i => (Finsupp.single i 1).support) = (∑ i in s, Finsupp.single i 1).support
x y : σ
⊢ x ≠ y → Disjoint (Finsupp.single x 1).support (Finsupp.single y 1).support
[PROOFSTEP]
simp [Finsupp.support_single_disjoint]
[GOAL]
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
⊢ ∀ (i₁ i₂ : σ), i₁ ≠ i₂ → Disjoint (Finsupp.single i₁ 1).support (Finsupp.single i₂ 1).support
[PROOFSTEP]
intro x y
[GOAL]
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
s t : Finset σ
hst : s ≠ t
h : ∑ i in t, Finsupp.single i 1 = ∑ i in s, Finsupp.single i 1
this : (∑ i in t, Finsupp.single i 1).support = (∑ i in s, Finsupp.single i 1).support
x y : σ
⊢ x ≠ y → Disjoint (Finsupp.single x 1).support (Finsupp.single y 1).support
[PROOFSTEP]
simp [Finsupp.support_single_disjoint]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
⊢ support (esymm σ R n) = Finset.biUnion (powersetLen n univ) fun t => {∑ i in t, Finsupp.single i 1}
[PROOFSTEP]
rw [support_esymm'']
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
⊢ (Finset.biUnion (powersetLen n univ) fun t => (Finsupp.single (∑ i in t, Finsupp.single i 1) 1).support) =
    Finset.biUnion (powersetLen n univ) fun t => {∑ i in t, Finsupp.single i 1}
[PROOFSTEP]
congr
[GOAL]
case e_t
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
⊢ (fun t => (Finsupp.single (∑ i in t, Finsupp.single i 1) 1).support) = fun t => {∑ i in t, Finsupp.single i 1}
[PROOFSTEP]
funext
[GOAL]
case e_t.h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
x✝ : Finset σ
⊢ (Finsupp.single (∑ i in x✝, Finsupp.single i 1) 1).support = {∑ i in x✝, Finsupp.single i 1}
[PROOFSTEP]
exact Finsupp.support_single_ne_zero _ one_ne_zero
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
⊢ support (esymm σ R n) = image (fun t => ∑ i in t, Finsupp.single i 1) (powersetLen n univ)
[PROOFSTEP]
rw [support_esymm']
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S
inst✝³ : Fintype σ
inst✝² : Fintype τ
n : ℕ
inst✝¹ : DecidableEq σ
inst✝ : Nontrivial R
⊢ (Finset.biUnion (powersetLen n univ) fun t => {∑ i in t, Finsupp.single i 1}) =
    image (fun t => ∑ i in t, Finsupp.single i 1) (powersetLen n univ)
[PROOFSTEP]
exact biUnion_singleton
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Nontrivial R
n : ℕ
hpos : 0 < n
hn : n ≤ Fintype.card σ
⊢ degrees (esymm σ R n) = univ.val
[PROOFSTEP]
classical
have : (Finsupp.toMultiset ∘ fun t : Finset σ => ∑ i : σ in t, Finsupp.single i 1) = Finset.val :=
  by
  funext
  simp [Finsupp.toMultiset_sum_single]
rw [degrees_def, support_esymm, sup_image, this]
have : ((powersetLen n univ).sup (fun (x : Finset σ) => x)).val = sup (powersetLen n univ) val :=
  by
  refine' comp_sup_eq_sup_comp _ _ _
  · intros
    simp only [union_val, sup_eq_union]
    congr
  · rfl
rw [← this]
obtain ⟨k, rfl⟩ := Nat.exists_eq_succ_of_ne_zero hpos.ne'
simpa using powersetLen_sup _ _ (Nat.lt_of_succ_le hn)
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Nontrivial R
n : ℕ
hpos : 0 < n
hn : n ≤ Fintype.card σ
⊢ degrees (esymm σ R n) = univ.val
[PROOFSTEP]
have : (Finsupp.toMultiset ∘ fun t : Finset σ => ∑ i : σ in t, Finsupp.single i 1) = Finset.val :=
  by
  funext
  simp [Finsupp.toMultiset_sum_single]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Nontrivial R
n : ℕ
hpos : 0 < n
hn : n ≤ Fintype.card σ
⊢ (↑Finsupp.toMultiset ∘ fun t => ∑ i in t, Finsupp.single i 1) = val
[PROOFSTEP]
funext
[GOAL]
case h
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Nontrivial R
n : ℕ
hpos : 0 < n
hn : n ≤ Fintype.card σ
x✝ : Finset σ
⊢ (↑Finsupp.toMultiset ∘ fun t => ∑ i in t, Finsupp.single i 1) x✝ = x✝.val
[PROOFSTEP]
simp [Finsupp.toMultiset_sum_single]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Nontrivial R
n : ℕ
hpos : 0 < n
hn : n ≤ Fintype.card σ
this : (↑Finsupp.toMultiset ∘ fun t => ∑ i in t, Finsupp.single i 1) = val
⊢ degrees (esymm σ R n) = univ.val
[PROOFSTEP]
rw [degrees_def, support_esymm, sup_image, this]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Nontrivial R
n : ℕ
hpos : 0 < n
hn : n ≤ Fintype.card σ
this : (↑Finsupp.toMultiset ∘ fun t => ∑ i in t, Finsupp.single i 1) = val
⊢ sup (powersetLen n univ) val = univ.val
[PROOFSTEP]
have : ((powersetLen n univ).sup (fun (x : Finset σ) => x)).val = sup (powersetLen n univ) val :=
  by
  refine' comp_sup_eq_sup_comp _ _ _
  · intros
    simp only [union_val, sup_eq_union]
    congr
  · rfl
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Nontrivial R
n : ℕ
hpos : 0 < n
hn : n ≤ Fintype.card σ
this : (↑Finsupp.toMultiset ∘ fun t => ∑ i in t, Finsupp.single i 1) = val
⊢ (sup (powersetLen n univ) fun x => x).val = sup (powersetLen n univ) val
[PROOFSTEP]
refine' comp_sup_eq_sup_comp _ _ _
[GOAL]
case refine'_1
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Nontrivial R
n : ℕ
hpos : 0 < n
hn : n ≤ Fintype.card σ
this : (↑Finsupp.toMultiset ∘ fun t => ∑ i in t, Finsupp.single i 1) = val
⊢ ∀ (x y : Finset σ), (x ⊔ y).val = x.val ⊔ y.val
[PROOFSTEP]
intros
[GOAL]
case refine'_1
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Nontrivial R
n : ℕ
hpos : 0 < n
hn : n ≤ Fintype.card σ
this : (↑Finsupp.toMultiset ∘ fun t => ∑ i in t, Finsupp.single i 1) = val
x✝ y✝ : Finset σ
⊢ (x✝ ⊔ y✝).val = x✝.val ⊔ y✝.val
[PROOFSTEP]
simp only [union_val, sup_eq_union]
[GOAL]
case refine'_1
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Nontrivial R
n : ℕ
hpos : 0 < n
hn : n ≤ Fintype.card σ
this : (↑Finsupp.toMultiset ∘ fun t => ∑ i in t, Finsupp.single i 1) = val
x✝ y✝ : Finset σ
⊢ x✝.val ∪ y✝.val = x✝.val ⊔ y✝.val
[PROOFSTEP]
congr
[GOAL]
case refine'_2
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Nontrivial R
n : ℕ
hpos : 0 < n
hn : n ≤ Fintype.card σ
this : (↑Finsupp.toMultiset ∘ fun t => ∑ i in t, Finsupp.single i 1) = val
⊢ ⊥.val = ⊥
[PROOFSTEP]
rfl
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Nontrivial R
n : ℕ
hpos : 0 < n
hn : n ≤ Fintype.card σ
this✝ : (↑Finsupp.toMultiset ∘ fun t => ∑ i in t, Finsupp.single i 1) = val
this : (sup (powersetLen n univ) fun x => x).val = sup (powersetLen n univ) val
⊢ sup (powersetLen n univ) val = univ.val
[PROOFSTEP]
rw [← this]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Nontrivial R
n : ℕ
hpos : 0 < n
hn : n ≤ Fintype.card σ
this✝ : (↑Finsupp.toMultiset ∘ fun t => ∑ i in t, Finsupp.single i 1) = val
this : (sup (powersetLen n univ) fun x => x).val = sup (powersetLen n univ) val
⊢ (sup (powersetLen n univ) fun x => x).val = univ.val
[PROOFSTEP]
obtain ⟨k, rfl⟩ := Nat.exists_eq_succ_of_ne_zero hpos.ne'
[GOAL]
case intro
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S
inst✝² : Fintype σ
inst✝¹ : Fintype τ
inst✝ : Nontrivial R
this✝ : (↑Finsupp.toMultiset ∘ fun t => ∑ i in t, Finsupp.single i 1) = val
k : ℕ
hpos : 0 < Nat.succ k
hn : Nat.succ k ≤ Fintype.card σ
this : (sup (powersetLen (Nat.succ k) univ) fun x => x).val = sup (powersetLen (Nat.succ k) univ) val
⊢ (sup (powersetLen (Nat.succ k) univ) fun x => x).val = univ.val
[PROOFSTEP]
simpa using powersetLen_sup _ _ (Nat.lt_of_succ_le hn)
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Fintype σ
inst✝ : Fintype τ
⊢ psum σ R 0 = ↑(Fintype.card σ)
[PROOFSTEP]
simp only [psum, _root_.pow_zero, ← cast_card]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Fintype σ
inst✝ : Fintype τ
⊢ ↑(card univ) = ↑(Fintype.card σ)
[PROOFSTEP]
exact rfl
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Fintype σ
inst✝ : Fintype τ
⊢ psum σ R 1 = ∑ i : σ, X i
[PROOFSTEP]
simp only [psum, _root_.pow_one]
[GOAL]
σ : Type u_1
R : Type u_2
τ : Type u_3
S : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Fintype σ
inst✝ : Fintype τ
n : ℕ
e : σ ≃ τ
⊢ ↑(rename ↑e) (psum σ R n) = psum τ R n
[PROOFSTEP]
simp_rw [psum, map_sum, map_pow, rename_X, e.sum_comp (X · ^ n)]


[GOAL]
R : Type u_1
inst✝⁵ : Ring R
C : Type u_2
inst✝⁴ : Category.{?u.7905, u_2} C
inst✝³ : Abelian C
inst✝² : Linear R C
inst✝¹ : EnoughProjectives C
X Y : C
inst✝ : Projective X
n : ℕ
E : ((Functor.leftDerived ((linearYoneda R C).obj Y).rightOp (n + 1)).obj X).unop ≅ 0.unop :=
  (Iso.unop (Functor.leftDerivedObjProjectiveSucc ((linearYoneda R C).obj Y).rightOp n X)).symm
⊢ 0 ≫ 0 = 𝟙 0.unop
[PROOFSTEP]
let Z : (ModuleCat R)ᵒᵖ := 0
[GOAL]
R : Type u_1
inst✝⁵ : Ring R
C : Type u_2
inst✝⁴ : Category.{?u.7905, u_2} C
inst✝³ : Abelian C
inst✝² : Linear R C
inst✝¹ : EnoughProjectives C
X Y : C
inst✝ : Projective X
n : ℕ
E : ((Functor.leftDerived ((linearYoneda R C).obj Y).rightOp (n + 1)).obj X).unop ≅ 0.unop :=
  (Iso.unop (Functor.leftDerivedObjProjectiveSucc ((linearYoneda R C).obj Y).rightOp n X)).symm
Z : (ModuleCat R)ᵒᵖ := 0
⊢ 0 ≫ 0 = 𝟙 0.unop
[PROOFSTEP]
rw [← (0 : 0 ⟶ Z.unop).unop_op, ← (0 : Z.unop ⟶ 0).unop_op, ← unop_id, ← unop_comp]
[GOAL]
R : Type u_1
inst✝⁵ : Ring R
C : Type u_2
inst✝⁴ : Category.{?u.10674, u_2} C
inst✝³ : Abelian C
inst✝² : Linear R C
inst✝¹ : EnoughProjectives C
X Y : C
inst✝ : Projective X
n : ℕ
E : ((Functor.leftDerived ((linearYoneda R C).obj Y).rightOp (n + 1)).obj X).unop ≅ 0.unop :=
  (Iso.unop (Functor.leftDerivedObjProjectiveSucc ((linearYoneda R C).obj Y).rightOp n X)).symm
Z : (ModuleCat R)ᵒᵖ := 0
⊢ (0.op ≫ 0.op).unop = (𝟙 0).unop
[PROOFSTEP]
aesop


[GOAL]
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
⊢ FunctionField Fq F ↔ FiniteDimensional Fqt F
[PROOFSTEP]
let e := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
[GOAL]
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
⊢ FunctionField Fq F ↔ FiniteDimensional Fqt F
[PROOFSTEP]
have : ∀ (c) (x : F), e c • x = c • x := by
  intro c x
  rw [Algebra.smul_def, Algebra.smul_def]
  congr
  refine' congr_fun (f := fun c => algebraMap Fqt F (e c)) _ c
  refine' IsLocalization.ext (nonZeroDivisors Fq[X]) _ _ _ _ _ _ _ <;> intros <;>
    simp only [AlgEquiv.map_one, RingHom.map_one, AlgEquiv.map_mul, RingHom.map_mul, AlgEquiv.commutes, ←
      IsScalarTower.algebraMap_apply]
[GOAL]
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
⊢ ∀ (c : RatFunc Fq) (x : F), ↑e c • x = c • x
[PROOFSTEP]
intro c x
[GOAL]
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
c : RatFunc Fq
x : F
⊢ ↑e c • x = c • x
[PROOFSTEP]
rw [Algebra.smul_def, Algebra.smul_def]
[GOAL]
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
c : RatFunc Fq
x : F
⊢ ↑(algebraMap ((fun x => Fqt) c) F) (↑e c) * x = ↑(algebraMap (RatFunc Fq) F) c * x
[PROOFSTEP]
congr
[GOAL]
case e_a
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
c : RatFunc Fq
x : F
⊢ ↑(algebraMap ((fun x => Fqt) c) F) (↑e c) = ↑(algebraMap (RatFunc Fq) F) c
[PROOFSTEP]
refine' congr_fun (f := fun c => algebraMap Fqt F (e c)) _ c
[GOAL]
case e_a
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
c : RatFunc Fq
x : F
⊢ (fun c => ↑(algebraMap Fqt F) (↑e c)) = ↑(algebraMap (RatFunc Fq) F)
[PROOFSTEP]
refine' IsLocalization.ext (nonZeroDivisors Fq[X]) _ _ _ _ _ _ _
[GOAL]
case e_a.refine'_1
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
c : RatFunc Fq
x : F
⊢ ↑(algebraMap Fqt F) (↑e 1) = 1
[PROOFSTEP]
intros
[GOAL]
case e_a.refine'_2
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
c : RatFunc Fq
x : F
⊢ ↑(algebraMap (RatFunc Fq) F) 1 = 1
[PROOFSTEP]
intros
[GOAL]
case e_a.refine'_3
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
c : RatFunc Fq
x : F
⊢ ∀ (a b : RatFunc Fq), ↑(algebraMap Fqt F) (↑e (a * b)) = ↑(algebraMap Fqt F) (↑e a) * ↑(algebraMap Fqt F) (↑e b)
[PROOFSTEP]
intros
[GOAL]
case e_a.refine'_4
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
c : RatFunc Fq
x : F
⊢ ∀ (a b : RatFunc Fq),
    ↑(algebraMap (RatFunc Fq) F) (a * b) = ↑(algebraMap (RatFunc Fq) F) a * ↑(algebraMap (RatFunc Fq) F) b
[PROOFSTEP]
intros
[GOAL]
case e_a.refine'_5
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
c : RatFunc Fq
x : F
⊢ ∀ (a : Fq[X]),
    ↑(algebraMap Fqt F) (↑e (↑(algebraMap Fq[X] (RatFunc Fq)) a)) =
      ↑(algebraMap (RatFunc Fq) F) (↑(algebraMap Fq[X] (RatFunc Fq)) a)
[PROOFSTEP]
intros
[GOAL]
case e_a.refine'_1
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
c : RatFunc Fq
x : F
⊢ ↑(algebraMap Fqt F) (↑e 1) = 1
[PROOFSTEP]
simp only [AlgEquiv.map_one, RingHom.map_one, AlgEquiv.map_mul, RingHom.map_mul, AlgEquiv.commutes, ←
  IsScalarTower.algebraMap_apply]
[GOAL]
case e_a.refine'_2
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
c : RatFunc Fq
x : F
⊢ ↑(algebraMap (RatFunc Fq) F) 1 = 1
[PROOFSTEP]
simp only [AlgEquiv.map_one, RingHom.map_one, AlgEquiv.map_mul, RingHom.map_mul, AlgEquiv.commutes, ←
  IsScalarTower.algebraMap_apply]
[GOAL]
case e_a.refine'_3
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
c : RatFunc Fq
x : F
a✝ b✝ : RatFunc Fq
⊢ ↑(algebraMap Fqt F) (↑e (a✝ * b✝)) = ↑(algebraMap Fqt F) (↑e a✝) * ↑(algebraMap Fqt F) (↑e b✝)
[PROOFSTEP]
simp only [AlgEquiv.map_one, RingHom.map_one, AlgEquiv.map_mul, RingHom.map_mul, AlgEquiv.commutes, ←
  IsScalarTower.algebraMap_apply]
[GOAL]
case e_a.refine'_4
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
c : RatFunc Fq
x : F
a✝ b✝ : RatFunc Fq
⊢ ↑(algebraMap (RatFunc Fq) F) (a✝ * b✝) = ↑(algebraMap (RatFunc Fq) F) a✝ * ↑(algebraMap (RatFunc Fq) F) b✝
[PROOFSTEP]
simp only [AlgEquiv.map_one, RingHom.map_one, AlgEquiv.map_mul, RingHom.map_mul, AlgEquiv.commutes, ←
  IsScalarTower.algebraMap_apply]
[GOAL]
case e_a.refine'_5
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
c : RatFunc Fq
x : F
a✝ : Fq[X]
⊢ ↑(algebraMap Fqt F) (↑e (↑(algebraMap Fq[X] (RatFunc Fq)) a✝)) =
    ↑(algebraMap (RatFunc Fq) F) (↑(algebraMap Fq[X] (RatFunc Fq)) a✝)
[PROOFSTEP]
simp only [AlgEquiv.map_one, RingHom.map_one, AlgEquiv.map_mul, RingHom.map_mul, AlgEquiv.commutes, ←
  IsScalarTower.algebraMap_apply]
[GOAL]
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
this : ∀ (c : RatFunc Fq) (x : F), ↑e c • x = c • x
⊢ FunctionField Fq F ↔ FiniteDimensional Fqt F
[PROOFSTEP]
constructor
[GOAL]
case mp
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
this : ∀ (c : RatFunc Fq) (x : F), ↑e c • x = c • x
⊢ FunctionField Fq F → FiniteDimensional Fqt F
[PROOFSTEP]
intro h
[GOAL]
case mpr
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
this : ∀ (c : RatFunc Fq) (x : F), ↑e c • x = c • x
⊢ FiniteDimensional Fqt F → FunctionField Fq F
[PROOFSTEP]
intro h
[GOAL]
case mp
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
this : ∀ (c : RatFunc Fq) (x : F), ↑e c • x = c • x
h : FunctionField Fq F
⊢ FiniteDimensional Fqt F
[PROOFSTEP]
let b := FiniteDimensional.finBasis (RatFunc Fq) F
[GOAL]
case mp
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
this : ∀ (c : RatFunc Fq) (x : F), ↑e c • x = c • x
h : FunctionField Fq F
b : Basis (Fin (FiniteDimensional.finrank (RatFunc Fq) F)) (RatFunc Fq) F := FiniteDimensional.finBasis (RatFunc Fq) F
⊢ FiniteDimensional Fqt F
[PROOFSTEP]
exact FiniteDimensional.of_fintype_basis (b.mapCoeffs e this)
[GOAL]
case mpr
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
this : ∀ (c : RatFunc Fq) (x : F), ↑e c • x = c • x
h : FiniteDimensional Fqt F
⊢ FunctionField Fq F
[PROOFSTEP]
let b := FiniteDimensional.finBasis Fqt F
[GOAL]
case mpr
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
this : ∀ (c : RatFunc Fq) (x : F), ↑e c • x = c • x
h : FiniteDimensional Fqt F
b : Basis (Fin (FiniteDimensional.finrank Fqt F)) Fqt F := FiniteDimensional.finBasis Fqt F
⊢ FunctionField Fq F
[PROOFSTEP]
refine' FiniteDimensional.of_fintype_basis (b.mapCoeffs e.symm _)
[GOAL]
case mpr
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
this : ∀ (c : RatFunc Fq) (x : F), ↑e c • x = c • x
h : FiniteDimensional Fqt F
b : Basis (Fin (FiniteDimensional.finrank Fqt F)) Fqt F := FiniteDimensional.finBasis Fqt F
⊢ ∀ (c : Fqt) (x : F), ↑↑(AlgEquiv.symm e) c • x = c • x
[PROOFSTEP]
intro c x
[GOAL]
case mpr
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
this : ∀ (c : RatFunc Fq) (x : F), ↑e c • x = c • x
h : FiniteDimensional Fqt F
b : Basis (Fin (FiniteDimensional.finrank Fqt F)) Fqt F := FiniteDimensional.finBasis Fqt F
c : Fqt
x : F
⊢ ↑↑(AlgEquiv.symm e) c • x = c • x
[PROOFSTEP]
convert (this (e.symm c) x).symm
[GOAL]
case h.e'_3.h.e'_5
Fq F : Type
inst✝⁹ : Field Fq
inst✝⁸ : Field F
Fqt : Type u_1
inst✝⁷ : Field Fqt
inst✝⁶ : Algebra Fq[X] Fqt
inst✝⁵ : IsFractionRing Fq[X] Fqt
inst✝⁴ : Algebra (RatFunc Fq) F
inst✝³ : Algebra Fqt F
inst✝² : Algebra Fq[X] F
inst✝¹ : IsScalarTower Fq[X] Fqt F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
e : RatFunc Fq ≃ₐ[Fq[X]] Fqt := IsLocalization.algEquiv Fq[X]⁰ (RatFunc Fq) Fqt
this : ∀ (c : RatFunc Fq) (x : F), ↑e c • x = c • x
h : FiniteDimensional Fqt F
b : Basis (Fin (FiniteDimensional.finrank Fqt F)) Fqt F := FiniteDimensional.finBasis Fqt F
c : Fqt
x : F
⊢ c = ↑e (↑(AlgEquiv.symm e) c)
[PROOFSTEP]
simp only [e.apply_symm_apply]
[GOAL]
Fq F : Type
inst✝⁴ : Field Fq
inst✝³ : Field F
inst✝² : Algebra Fq[X] F
inst✝¹ : Algebra (RatFunc Fq) F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
⊢ Function.Injective ↑(algebraMap Fq[X] F)
[PROOFSTEP]
rw [IsScalarTower.algebraMap_eq Fq[X] (RatFunc Fq) F]
[GOAL]
Fq F : Type
inst✝⁴ : Field Fq
inst✝³ : Field F
inst✝² : Algebra Fq[X] F
inst✝¹ : Algebra (RatFunc Fq) F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
⊢ Function.Injective ↑(RingHom.comp (algebraMap (RatFunc Fq) F) (algebraMap Fq[X] (RatFunc Fq)))
[PROOFSTEP]
exact (algebraMap (RatFunc Fq) F).injective.comp (IsFractionRing.injective Fq[X] (RatFunc Fq))
[GOAL]
Fq F : Type
inst✝⁴ : Field Fq
inst✝³ : Field F
inst✝² : Algebra Fq[X] F
inst✝¹ : Algebra (RatFunc Fq) F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
⊢ Function.Injective ↑(algebraMap Fq[X] { x // x ∈ ringOfIntegers Fq F })
[PROOFSTEP]
have hinj : Function.Injective (⇑(algebraMap Fq[X] F)) :=
  by
  rw [IsScalarTower.algebraMap_eq Fq[X] (RatFunc Fq) F]
  exact (algebraMap (RatFunc Fq) F).injective.comp (IsFractionRing.injective Fq[X] (RatFunc Fq))
[GOAL]
Fq F : Type
inst✝⁴ : Field Fq
inst✝³ : Field F
inst✝² : Algebra Fq[X] F
inst✝¹ : Algebra (RatFunc Fq) F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
⊢ Function.Injective ↑(algebraMap Fq[X] F)
[PROOFSTEP]
rw [IsScalarTower.algebraMap_eq Fq[X] (RatFunc Fq) F]
[GOAL]
Fq F : Type
inst✝⁴ : Field Fq
inst✝³ : Field F
inst✝² : Algebra Fq[X] F
inst✝¹ : Algebra (RatFunc Fq) F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
⊢ Function.Injective ↑(RingHom.comp (algebraMap (RatFunc Fq) F) (algebraMap Fq[X] (RatFunc Fq)))
[PROOFSTEP]
exact (algebraMap (RatFunc Fq) F).injective.comp (IsFractionRing.injective Fq[X] (RatFunc Fq))
[GOAL]
Fq F : Type
inst✝⁴ : Field Fq
inst✝³ : Field F
inst✝² : Algebra Fq[X] F
inst✝¹ : Algebra (RatFunc Fq) F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
hinj : Function.Injective ↑(algebraMap Fq[X] F)
⊢ Function.Injective ↑(algebraMap Fq[X] { x // x ∈ ringOfIntegers Fq F })
[PROOFSTEP]
rw [injective_iff_map_eq_zero (algebraMap Fq[X] (↥(ringOfIntegers Fq F)))]
[GOAL]
Fq F : Type
inst✝⁴ : Field Fq
inst✝³ : Field F
inst✝² : Algebra Fq[X] F
inst✝¹ : Algebra (RatFunc Fq) F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
hinj : Function.Injective ↑(algebraMap Fq[X] F)
⊢ ∀ (a : Fq[X]), ↑(algebraMap Fq[X] { x // x ∈ ringOfIntegers Fq F }) a = 0 → a = 0
[PROOFSTEP]
intro p hp
[GOAL]
Fq F : Type
inst✝⁴ : Field Fq
inst✝³ : Field F
inst✝² : Algebra Fq[X] F
inst✝¹ : Algebra (RatFunc Fq) F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
hinj : Function.Injective ↑(algebraMap Fq[X] F)
p : Fq[X]
hp : ↑(algebraMap Fq[X] { x // x ∈ ringOfIntegers Fq F }) p = 0
⊢ p = 0
[PROOFSTEP]
rw [← Subtype.coe_inj, Subalgebra.coe_zero] at hp
[GOAL]
Fq F : Type
inst✝⁴ : Field Fq
inst✝³ : Field F
inst✝² : Algebra Fq[X] F
inst✝¹ : Algebra (RatFunc Fq) F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
hinj : Function.Injective ↑(algebraMap Fq[X] F)
p : Fq[X]
hp : ↑(↑(algebraMap Fq[X] { x // x ∈ ringOfIntegers Fq F }) p) = 0
⊢ p = 0
[PROOFSTEP]
rw [injective_iff_map_eq_zero (algebraMap Fq[X] F)] at hinj
[GOAL]
Fq F : Type
inst✝⁴ : Field Fq
inst✝³ : Field F
inst✝² : Algebra Fq[X] F
inst✝¹ : Algebra (RatFunc Fq) F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
hinj : ∀ (a : Fq[X]), ↑(algebraMap Fq[X] F) a = 0 → a = 0
p : Fq[X]
hp : ↑(↑(algebraMap Fq[X] { x // x ∈ ringOfIntegers Fq F }) p) = 0
⊢ p = 0
[PROOFSTEP]
exact hinj p hp
[GOAL]
Fq F : Type
inst✝⁴ : Field Fq
inst✝³ : Field F
inst✝² : Algebra Fq[X] F
inst✝¹ : Algebra (RatFunc Fq) F
inst✝ : IsScalarTower Fq[X] (RatFunc Fq) F
⊢ ¬IsField { x // x ∈ ringOfIntegers Fq F }
[PROOFSTEP]
simpa [← (IsIntegralClosure.isIntegral_algebra Fq[X] F).isField_iff_isField (algebraMap_injective Fq F)] using
  Polynomial.not_isField Fq
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
⊢ ↑(↑Multiplicative.ofAdd (RatFunc.intDegree 1)) = 1
[PROOFSTEP]
rw [RatFunc.intDegree_one, ofAdd_zero, WithZero.coe_one]
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
⊢ inftyValuationDef Fq (x * y) = inftyValuationDef Fq x * inftyValuationDef Fq y
[PROOFSTEP]
rw [inftyValuationDef, inftyValuationDef, inftyValuationDef]
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
⊢ (if x * y = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree (x * y)))) =
    (if x = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree x))) *
      if y = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree y))
[PROOFSTEP]
by_cases hx : x = 0
[GOAL]
case pos
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : x = 0
⊢ (if x * y = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree (x * y)))) =
    (if x = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree x))) *
      if y = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree y))
[PROOFSTEP]
rw [hx, zero_mul, if_pos (Eq.refl _), zero_mul]
[GOAL]
case neg
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
⊢ (if x * y = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree (x * y)))) =
    (if x = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree x))) *
      if y = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree y))
[PROOFSTEP]
by_cases hy : y = 0
[GOAL]
case pos
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
hy : y = 0
⊢ (if x * y = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree (x * y)))) =
    (if x = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree x))) *
      if y = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree y))
[PROOFSTEP]
rw [hy, mul_zero, if_pos (Eq.refl _), mul_zero]
[GOAL]
case neg
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
hy : ¬y = 0
⊢ (if x * y = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree (x * y)))) =
    (if x = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree x))) *
      if y = 0 then 0 else ↑(↑Multiplicative.ofAdd (RatFunc.intDegree y))
[PROOFSTEP]
rw [if_neg hx, if_neg hy, if_neg (mul_ne_zero hx hy), ← WithZero.coe_mul, WithZero.coe_inj, ← ofAdd_add,
  RatFunc.intDegree_mul hx hy]
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
⊢ inftyValuationDef Fq (x + y) ≤ max (inftyValuationDef Fq x) (inftyValuationDef Fq y)
[PROOFSTEP]
by_cases hx : x = 0
[GOAL]
case pos
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : x = 0
⊢ inftyValuationDef Fq (x + y) ≤ max (inftyValuationDef Fq x) (inftyValuationDef Fq y)
[PROOFSTEP]
rw [hx, zero_add]
[GOAL]
case pos
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : x = 0
⊢ inftyValuationDef Fq y ≤ max (inftyValuationDef Fq 0) (inftyValuationDef Fq y)
[PROOFSTEP]
conv_rhs => rw [inftyValuationDef, if_pos (Eq.refl _)]
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : x = 0
| max (inftyValuationDef Fq 0) (inftyValuationDef Fq y)
[PROOFSTEP]
rw [inftyValuationDef, if_pos (Eq.refl _)]
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : x = 0
| max (inftyValuationDef Fq 0) (inftyValuationDef Fq y)
[PROOFSTEP]
rw [inftyValuationDef, if_pos (Eq.refl _)]
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : x = 0
| max (inftyValuationDef Fq 0) (inftyValuationDef Fq y)
[PROOFSTEP]
rw [inftyValuationDef, if_pos (Eq.refl _)]
[GOAL]
case pos
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : x = 0
⊢ inftyValuationDef Fq y ≤ max 0 (inftyValuationDef Fq y)
[PROOFSTEP]
rw [max_eq_right (WithZero.zero_le (inftyValuationDef Fq y))]
[GOAL]
case neg
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
⊢ inftyValuationDef Fq (x + y) ≤ max (inftyValuationDef Fq x) (inftyValuationDef Fq y)
[PROOFSTEP]
by_cases hy : y = 0
[GOAL]
case pos
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
hy : y = 0
⊢ inftyValuationDef Fq (x + y) ≤ max (inftyValuationDef Fq x) (inftyValuationDef Fq y)
[PROOFSTEP]
rw [hy, add_zero]
[GOAL]
case pos
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
hy : y = 0
⊢ inftyValuationDef Fq x ≤ max (inftyValuationDef Fq x) (inftyValuationDef Fq 0)
[PROOFSTEP]
conv_rhs => rw [max_comm, inftyValuationDef, if_pos (Eq.refl _)]
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
hy : y = 0
| max (inftyValuationDef Fq x) (inftyValuationDef Fq 0)
[PROOFSTEP]
rw [max_comm, inftyValuationDef, if_pos (Eq.refl _)]
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
hy : y = 0
| max (inftyValuationDef Fq x) (inftyValuationDef Fq 0)
[PROOFSTEP]
rw [max_comm, inftyValuationDef, if_pos (Eq.refl _)]
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
hy : y = 0
| max (inftyValuationDef Fq x) (inftyValuationDef Fq 0)
[PROOFSTEP]
rw [max_comm, inftyValuationDef, if_pos (Eq.refl _)]
[GOAL]
case pos
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
hy : y = 0
⊢ inftyValuationDef Fq x ≤ max 0 (inftyValuationDef Fq x)
[PROOFSTEP]
rw [max_eq_right (WithZero.zero_le (inftyValuationDef Fq x))]
[GOAL]
case neg
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
hy : ¬y = 0
⊢ inftyValuationDef Fq (x + y) ≤ max (inftyValuationDef Fq x) (inftyValuationDef Fq y)
[PROOFSTEP]
by_cases hxy : x + y = 0
[GOAL]
case pos
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
hy : ¬y = 0
hxy : x + y = 0
⊢ inftyValuationDef Fq (x + y) ≤ max (inftyValuationDef Fq x) (inftyValuationDef Fq y)
[PROOFSTEP]
rw [inftyValuationDef, if_pos hxy]
[GOAL]
case pos
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
hy : ¬y = 0
hxy : x + y = 0
⊢ 0 ≤ max (inftyValuationDef Fq x) (inftyValuationDef Fq y)
[PROOFSTEP]
exact zero_le'
[GOAL]
case neg
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
hy : ¬y = 0
hxy : ¬x + y = 0
⊢ inftyValuationDef Fq (x + y) ≤ max (inftyValuationDef Fq x) (inftyValuationDef Fq y)
[PROOFSTEP]
rw [inftyValuationDef, inftyValuationDef, inftyValuationDef, if_neg hx, if_neg hy, if_neg hxy]
[GOAL]
case neg
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
hy : ¬y = 0
hxy : ¬x + y = 0
⊢ ↑(↑Multiplicative.ofAdd (RatFunc.intDegree (x + y))) ≤
    max ↑(↑Multiplicative.ofAdd (RatFunc.intDegree x)) ↑(↑Multiplicative.ofAdd (RatFunc.intDegree y))
[PROOFSTEP]
rw [le_max_iff, WithZero.coe_le_coe, Multiplicative.ofAdd_le, WithZero.coe_le_coe, Multiplicative.ofAdd_le, ←
  le_max_iff]
[GOAL]
case neg
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x y : RatFunc Fq
hx : ¬x = 0
hy : ¬y = 0
hxy : ¬x + y = 0
⊢ RatFunc.intDegree (x + y) ≤ max (RatFunc.intDegree x) (RatFunc.intDegree y)
[PROOFSTEP]
exact RatFunc.intDegree_add_le hy hxy
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
x : RatFunc Fq
hx : x ≠ 0
⊢ inftyValuationDef Fq x = ↑(↑Multiplicative.ofAdd (RatFunc.intDegree x))
[PROOFSTEP]
rw [inftyValuationDef, if_neg hx]
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
k : Fq
hk : k ≠ 0
⊢ inftyValuationDef Fq (↑RatFunc.C k) = ↑(↑Multiplicative.ofAdd 0)
[PROOFSTEP]
have hCk : RatFunc.C k ≠ 0 := (map_ne_zero _).mpr hk
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
k : Fq
hk : k ≠ 0
hCk : ↑RatFunc.C k ≠ 0
⊢ inftyValuationDef Fq (↑RatFunc.C k) = ↑(↑Multiplicative.ofAdd 0)
[PROOFSTEP]
rw [inftyValuationDef, if_neg hCk, RatFunc.intDegree_C]
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
⊢ inftyValuationDef Fq RatFunc.X = ↑(↑Multiplicative.ofAdd 1)
[PROOFSTEP]
rw [inftyValuationDef, if_neg RatFunc.X_ne_zero, RatFunc.intDegree_X]
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
p : Fq[X]
hp : p ≠ 0
⊢ inftyValuationDef Fq (↑(algebraMap Fq[X] (RatFunc Fq)) p) = ↑(↑Multiplicative.ofAdd ↑(Polynomial.natDegree p))
[PROOFSTEP]
have hp' : algebraMap Fq[X] (RatFunc Fq) p ≠ 0 := by rw [Ne.def, RatFunc.algebraMap_eq_zero_iff]; exact hp
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
p : Fq[X]
hp : p ≠ 0
⊢ ↑(algebraMap Fq[X] (RatFunc Fq)) p ≠ 0
[PROOFSTEP]
rw [Ne.def, RatFunc.algebraMap_eq_zero_iff]
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
p : Fq[X]
hp : p ≠ 0
⊢ ¬p = 0
[PROOFSTEP]
exact hp
[GOAL]
Fq F : Type
inst✝² : Field Fq
inst✝¹ : Field F
inst✝ : DecidableEq (RatFunc Fq)
p : Fq[X]
hp : p ≠ 0
hp' : ↑(algebraMap Fq[X] (RatFunc Fq)) p ≠ 0
⊢ inftyValuationDef Fq (↑(algebraMap Fq[X] (RatFunc Fq)) p) = ↑(↑Multiplicative.ofAdd ↑(Polynomial.natDegree p))
[PROOFSTEP]
rw [inftyValuationDef, if_neg hp', RatFunc.intDegree_polynomial]


[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
s : Set A
⊢ zeroLocus 𝒜 ↑(Ideal.span s) = zeroLocus 𝒜 s
[PROOFSTEP]
ext x
[GOAL]
case h
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
s : Set A
x : ProjectiveSpectrum 𝒜
⊢ x ∈ zeroLocus 𝒜 ↑(Ideal.span s) ↔ x ∈ zeroLocus 𝒜 s
[PROOFSTEP]
exact (Submodule.gi _ _).gc s x.asHomogeneousIdeal.toIdeal
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
⊢ ↑(vanishingIdeal t) = {f | ∀ (x : ProjectiveSpectrum 𝒜), x ∈ t → f ∈ x.asHomogeneousIdeal}
[PROOFSTEP]
ext f
[GOAL]
case h
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
f : A
⊢ f ∈ ↑(vanishingIdeal t) ↔ f ∈ {f | ∀ (x : ProjectiveSpectrum 𝒜), x ∈ t → f ∈ x.asHomogeneousIdeal}
[PROOFSTEP]
rw [vanishingIdeal, SetLike.mem_coe, ← HomogeneousIdeal.mem_iff, HomogeneousIdeal.toIdeal_iInf, Submodule.mem_iInf]
[GOAL]
case h
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
f : A
⊢ (∀ (i : ProjectiveSpectrum 𝒜), f ∈ HomogeneousIdeal.toIdeal (⨅ (_ : i ∈ t), i.asHomogeneousIdeal)) ↔
    f ∈ {f | ∀ (x : ProjectiveSpectrum 𝒜), x ∈ t → f ∈ x.asHomogeneousIdeal}
[PROOFSTEP]
refine' forall_congr' fun x => _
[GOAL]
case h
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
f : A
x : ProjectiveSpectrum 𝒜
⊢ f ∈ HomogeneousIdeal.toIdeal (⨅ (_ : x ∈ t), x.asHomogeneousIdeal) ↔ x ∈ t → f ∈ x.asHomogeneousIdeal
[PROOFSTEP]
rw [HomogeneousIdeal.toIdeal_iInf, Submodule.mem_iInf, HomogeneousIdeal.mem_iff]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
f : A
⊢ f ∈ vanishingIdeal t ↔ ∀ (x : ProjectiveSpectrum 𝒜), x ∈ t → f ∈ x.asHomogeneousIdeal
[PROOFSTEP]
rw [← SetLike.mem_coe, coe_vanishingIdeal, Set.mem_setOf_eq]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
x : ProjectiveSpectrum 𝒜
⊢ vanishingIdeal {x} = x.asHomogeneousIdeal
[PROOFSTEP]
simp [vanishingIdeal]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
⊢ GaloisConnection (fun s => zeroLocus 𝒜 s) fun t => ↑(vanishingIdeal t)
[PROOFSTEP]
have ideal_gc : GaloisConnection Ideal.span _ := (Submodule.gi A _).gc
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
ideal_gc : GaloisConnection Ideal.span SetLike.coe
⊢ GaloisConnection (fun s => zeroLocus 𝒜 s) fun t => ↑(vanishingIdeal t)
[PROOFSTEP]
simpa [zeroLocus_span, Function.comp] using GaloisConnection.compose ideal_gc (gc_ideal 𝒜)
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
I : HomogeneousIdeal 𝒜
t : (Set (ProjectiveSpectrum 𝒜))ᵒᵈ
⊢ (fun I => zeroLocus 𝒜 ↑I) I ≤ t ↔ I ≤ (fun t => vanishingIdeal t) t
[PROOFSTEP]
simpa [show I.toIdeal ≤ (vanishingIdeal t).toIdeal ↔ I ≤ vanishingIdeal t from Iff.rfl] using
  subset_zeroLocus_iff_le_vanishingIdeal t I.toIdeal
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
⊢ vanishingIdeal ∅ = ⊤
[PROOFSTEP]
simpa using (gc_ideal _).u_top
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t t' : Set (ProjectiveSpectrum 𝒜)
⊢ vanishingIdeal (t ∪ t') = vanishingIdeal t ⊓ vanishingIdeal t'
[PROOFSTEP]
ext1
[GOAL]
case h
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t t' : Set (ProjectiveSpectrum 𝒜)
⊢ HomogeneousIdeal.toIdeal (vanishingIdeal (t ∪ t')) = HomogeneousIdeal.toIdeal (vanishingIdeal t ⊓ vanishingIdeal t')
[PROOFSTEP]
exact (gc_ideal 𝒜).u_inf
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
s : Set (Set A)
⊢ zeroLocus 𝒜 (⋃ (s' : Set A) (_ : s' ∈ s), s') = ⋂ (s' : Set A) (_ : s' ∈ s), zeroLocus 𝒜 s'
[PROOFSTEP]
simp only [zeroLocus_iUnion]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
γ : Sort u_3
t : γ → Set (ProjectiveSpectrum 𝒜)
⊢ HomogeneousIdeal.toIdeal (vanishingIdeal (⋃ (i : γ), t i)) =
    HomogeneousIdeal.toIdeal (⨅ (i : γ), vanishingIdeal (t i))
[PROOFSTEP]
convert (gc_ideal 𝒜).u_iInf
[GOAL]
case h.e'_3
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
γ : Sort u_3
t : γ → Set (ProjectiveSpectrum 𝒜)
⊢ HomogeneousIdeal.toIdeal (⨅ (i : γ), vanishingIdeal (t i)) =
    ⨅ (i : γ), HomogeneousIdeal.toIdeal (vanishingIdeal (t i))
[PROOFSTEP]
exact HomogeneousIdeal.toIdeal_iInf _
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
s s' : Set A
⊢ zeroLocus 𝒜 s ∪ zeroLocus 𝒜 s' = zeroLocus 𝒜 ↑(Ideal.span s ⊓ Ideal.span s')
[PROOFSTEP]
rw [zeroLocus_inf]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
s s' : Set A
⊢ zeroLocus 𝒜 s ∪ zeroLocus 𝒜 s' = zeroLocus 𝒜 ↑(Ideal.span s) ∪ zeroLocus 𝒜 ↑(Ideal.span s')
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f g : A
x : ProjectiveSpectrum 𝒜
⊢ x ∈ zeroLocus 𝒜 {f * g} ↔ x ∈ zeroLocus 𝒜 {f} ∪ zeroLocus 𝒜 {g}
[PROOFSTEP]
simpa using x.isPrime.mul_mem_iff_mem_or_mem
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
n : ℕ
hn : 0 < n
x : ProjectiveSpectrum 𝒜
⊢ x ∈ zeroLocus 𝒜 {f ^ n} ↔ x ∈ zeroLocus 𝒜 {f}
[PROOFSTEP]
simpa using x.isPrime.pow_mem_iff_mem n hn
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t t' : Set (ProjectiveSpectrum 𝒜)
⊢ vanishingIdeal t ⊔ vanishingIdeal t' ≤ vanishingIdeal (t ∩ t')
[PROOFSTEP]
intro r
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t t' : Set (ProjectiveSpectrum 𝒜)
r : A
⊢ r ∈ vanishingIdeal t ⊔ vanishingIdeal t' → r ∈ vanishingIdeal (t ∩ t')
[PROOFSTEP]
rw [← HomogeneousIdeal.mem_iff, HomogeneousIdeal.toIdeal_sup, mem_vanishingIdeal, Submodule.mem_sup]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t t' : Set (ProjectiveSpectrum 𝒜)
r : A
⊢ (∃ y,
      y ∈ HomogeneousIdeal.toIdeal (vanishingIdeal t) ∧
        ∃ z, z ∈ HomogeneousIdeal.toIdeal (vanishingIdeal t') ∧ y + z = r) →
    ∀ (x : ProjectiveSpectrum 𝒜), x ∈ t ∩ t' → r ∈ x.asHomogeneousIdeal
[PROOFSTEP]
rintro ⟨f, hf, g, hg, rfl⟩ x ⟨hxt, hxt'⟩
[GOAL]
case intro.intro.intro.intro.intro
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t t' : Set (ProjectiveSpectrum 𝒜)
f : A
hf : f ∈ HomogeneousIdeal.toIdeal (vanishingIdeal t)
g : A
hg : g ∈ HomogeneousIdeal.toIdeal (vanishingIdeal t')
x : ProjectiveSpectrum 𝒜
hxt : x ∈ t
hxt' : x ∈ t'
⊢ f + g ∈ x.asHomogeneousIdeal
[PROOFSTEP]
erw [mem_vanishingIdeal] at hf hg
[GOAL]
case intro.intro.intro.intro.intro
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t t' : Set (ProjectiveSpectrum 𝒜)
f : A
hf : ∀ (x : ProjectiveSpectrum 𝒜), x ∈ t → f ∈ x.asHomogeneousIdeal
g : A
hg : ∀ (x : ProjectiveSpectrum 𝒜), x ∈ t' → g ∈ x.asHomogeneousIdeal
x : ProjectiveSpectrum 𝒜
hxt : x ∈ t
hxt' : x ∈ t'
⊢ f + g ∈ x.asHomogeneousIdeal
[PROOFSTEP]
apply Submodule.add_mem
[GOAL]
case intro.intro.intro.intro.intro.h₁
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t t' : Set (ProjectiveSpectrum 𝒜)
f : A
hf : ∀ (x : ProjectiveSpectrum 𝒜), x ∈ t → f ∈ x.asHomogeneousIdeal
g : A
hg : ∀ (x : ProjectiveSpectrum 𝒜), x ∈ t' → g ∈ x.asHomogeneousIdeal
x : ProjectiveSpectrum 𝒜
hxt : x ∈ t
hxt' : x ∈ t'
⊢ f ∈ HomogeneousIdeal.toIdeal x.asHomogeneousIdeal
[PROOFSTEP]
solve_by_elim
[GOAL]
case intro.intro.intro.intro.intro.h₂
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t t' : Set (ProjectiveSpectrum 𝒜)
f : A
hf : ∀ (x : ProjectiveSpectrum 𝒜), x ∈ t → f ∈ x.asHomogeneousIdeal
g : A
hg : ∀ (x : ProjectiveSpectrum 𝒜), x ∈ t' → g ∈ x.asHomogeneousIdeal
x : ProjectiveSpectrum 𝒜
hxt : x ∈ t
hxt' : x ∈ t'
⊢ g ∈ HomogeneousIdeal.toIdeal x.asHomogeneousIdeal
[PROOFSTEP]
solve_by_elim
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
I : ProjectiveSpectrum 𝒜
⊢ I ∈ (zeroLocus 𝒜 {f})ᶜ ↔ ¬f ∈ I.asHomogeneousIdeal
[PROOFSTEP]
rw [Set.mem_compl_iff, mem_zeroLocus, Set.singleton_subset_iff]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
I : ProjectiveSpectrum 𝒜
⊢ ¬f ∈ ↑I.asHomogeneousIdeal ↔ ¬f ∈ I.asHomogeneousIdeal
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
⊢ zeroLocus 𝒜 Set.univ = ∅
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
⊢ ∀ (A_1 : Set (Set (ProjectiveSpectrum 𝒜))), A_1 ⊆ Set.range (zeroLocus 𝒜) → ⋂₀ A_1 ∈ Set.range (zeroLocus 𝒜)
[PROOFSTEP]
intro Zs h
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
Zs : Set (Set (ProjectiveSpectrum 𝒜))
h : Zs ⊆ Set.range (zeroLocus 𝒜)
⊢ ⋂₀ Zs ∈ Set.range (zeroLocus 𝒜)
[PROOFSTEP]
rw [Set.sInter_eq_iInter]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
Zs : Set (Set (ProjectiveSpectrum 𝒜))
h : Zs ⊆ Set.range (zeroLocus 𝒜)
⊢ ⋂ (i : ↑Zs), ↑i ∈ Set.range (zeroLocus 𝒜)
[PROOFSTEP]
let f : Zs → Set _ := fun i => Classical.choose (h i.2)
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
Zs : Set (Set (ProjectiveSpectrum 𝒜))
h : Zs ⊆ Set.range (zeroLocus 𝒜)
f : ↑Zs → Set A := fun i => Classical.choose (_ : ↑i ∈ Set.range (zeroLocus 𝒜))
⊢ ⋂ (i : ↑Zs), ↑i ∈ Set.range (zeroLocus 𝒜)
[PROOFSTEP]
have H : (Set.iInter fun i ↦ zeroLocus 𝒜 (f i)) ∈ Set.range (zeroLocus 𝒜) := ⟨_, zeroLocus_iUnion 𝒜 _⟩
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
Zs : Set (Set (ProjectiveSpectrum 𝒜))
h : Zs ⊆ Set.range (zeroLocus 𝒜)
f : ↑Zs → Set A := fun i => Classical.choose (_ : ↑i ∈ Set.range (zeroLocus 𝒜))
H : ⋂ (i : ↑Zs), zeroLocus 𝒜 (f i) ∈ Set.range (zeroLocus 𝒜)
⊢ ⋂ (i : ↑Zs), ↑i ∈ Set.range (zeroLocus 𝒜)
[PROOFSTEP]
convert H using 2
[GOAL]
case h.e'_4.h.e'_3
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
Zs : Set (Set (ProjectiveSpectrum 𝒜))
h : Zs ⊆ Set.range (zeroLocus 𝒜)
f : ↑Zs → Set A := fun i => Classical.choose (_ : ↑i ∈ Set.range (zeroLocus 𝒜))
H : ⋂ (i : ↑Zs), zeroLocus 𝒜 (f i) ∈ Set.range (zeroLocus 𝒜)
⊢ (fun i => ↑i) = fun i => zeroLocus 𝒜 (f i)
[PROOFSTEP]
funext i
[GOAL]
case h.e'_4.h.e'_3.h
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
Zs : Set (Set (ProjectiveSpectrum 𝒜))
h : Zs ⊆ Set.range (zeroLocus 𝒜)
f : ↑Zs → Set A := fun i => Classical.choose (_ : ↑i ∈ Set.range (zeroLocus 𝒜))
H : ⋂ (i : ↑Zs), zeroLocus 𝒜 (f i) ∈ Set.range (zeroLocus 𝒜)
i : ↑Zs
⊢ ↑i = zeroLocus 𝒜 (f i)
[PROOFSTEP]
exact (Classical.choose_spec (h i.2)).symm
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
⊢ ∀ (A_1 : Set (ProjectiveSpectrum 𝒜)),
    A_1 ∈ Set.range (zeroLocus 𝒜) →
      ∀ (B : Set (ProjectiveSpectrum 𝒜)), B ∈ Set.range (zeroLocus 𝒜) → A_1 ∪ B ∈ Set.range (zeroLocus 𝒜)
[PROOFSTEP]
rintro _ ⟨s, rfl⟩ _ ⟨t, rfl⟩
[GOAL]
case intro.intro
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
s t : Set A
⊢ zeroLocus 𝒜 s ∪ zeroLocus 𝒜 t ∈ Set.range (zeroLocus 𝒜)
[PROOFSTEP]
exact ⟨_, (union_zeroLocus 𝒜 s t).symm⟩
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
U : Set (ProjectiveSpectrum 𝒜)
⊢ IsOpen U ↔ ∃ s, Uᶜ = zeroLocus 𝒜 s
[PROOFSTEP]
simp only [@eq_comm _ Uᶜ]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
U : Set (ProjectiveSpectrum 𝒜)
⊢ IsOpen U ↔ ∃ s, zeroLocus 𝒜 s = Uᶜ
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
Z : Set (ProjectiveSpectrum 𝒜)
⊢ IsClosed Z ↔ ∃ s, Z = zeroLocus 𝒜 s
[PROOFSTEP]
rw [← isOpen_compl_iff, isOpen_iff, compl_compl]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
s : Set A
⊢ IsClosed (zeroLocus 𝒜 s)
[PROOFSTEP]
rw [isClosed_iff_zeroLocus]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
s : Set A
⊢ ∃ s_1, zeroLocus 𝒜 s = zeroLocus 𝒜 s_1
[PROOFSTEP]
exact ⟨s, rfl⟩
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
⊢ zeroLocus 𝒜 ↑(vanishingIdeal t) = closure t
[PROOFSTEP]
apply Set.Subset.antisymm
[GOAL]
case h₁
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
⊢ zeroLocus 𝒜 ↑(vanishingIdeal t) ⊆ closure t
[PROOFSTEP]
rintro x hx t' ⟨ht', ht⟩
[GOAL]
case h₁.intro
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
x : ProjectiveSpectrum 𝒜
hx : x ∈ zeroLocus 𝒜 ↑(vanishingIdeal t)
t' : Set (ProjectiveSpectrum 𝒜)
ht' : IsClosed t'
ht : t ⊆ t'
⊢ x ∈ t'
[PROOFSTEP]
obtain ⟨fs, rfl⟩ : ∃ s, t' = zeroLocus 𝒜 s := by rwa [isClosed_iff_zeroLocus] at ht'
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
x : ProjectiveSpectrum 𝒜
hx : x ∈ zeroLocus 𝒜 ↑(vanishingIdeal t)
t' : Set (ProjectiveSpectrum 𝒜)
ht' : IsClosed t'
ht : t ⊆ t'
⊢ ∃ s, t' = zeroLocus 𝒜 s
[PROOFSTEP]
rwa [isClosed_iff_zeroLocus] at ht'
[GOAL]
case h₁.intro.intro
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
x : ProjectiveSpectrum 𝒜
hx : x ∈ zeroLocus 𝒜 ↑(vanishingIdeal t)
fs : Set A
ht' : IsClosed (zeroLocus 𝒜 fs)
ht : t ⊆ zeroLocus 𝒜 fs
⊢ x ∈ zeroLocus 𝒜 fs
[PROOFSTEP]
rw [subset_zeroLocus_iff_subset_vanishingIdeal] at ht
[GOAL]
case h₁.intro.intro
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
x : ProjectiveSpectrum 𝒜
hx : x ∈ zeroLocus 𝒜 ↑(vanishingIdeal t)
fs : Set A
ht' : IsClosed (zeroLocus 𝒜 fs)
ht : fs ⊆ ↑(vanishingIdeal t)
⊢ x ∈ zeroLocus 𝒜 fs
[PROOFSTEP]
exact Set.Subset.trans ht hx
[GOAL]
case h₂
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
⊢ closure t ⊆ zeroLocus 𝒜 ↑(vanishingIdeal t)
[PROOFSTEP]
rw [(isClosed_zeroLocus _ _).closure_subset_iff]
[GOAL]
case h₂
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
⊢ t ⊆ zeroLocus 𝒜 ↑(vanishingIdeal t)
[PROOFSTEP]
exact subset_zeroLocus_vanishingIdeal 𝒜 t
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
⊢ vanishingIdeal (closure t) = vanishingIdeal t
[PROOFSTEP]
have := (gc_ideal 𝒜).u_l_u_eq_u t
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
this :
  HomogeneousIdeal.toIdeal (vanishingIdeal (zeroLocus 𝒜 ↑(HomogeneousIdeal.toIdeal (vanishingIdeal t)))) =
    HomogeneousIdeal.toIdeal (vanishingIdeal t)
⊢ vanishingIdeal (closure t) = vanishingIdeal t
[PROOFSTEP]
ext1
[GOAL]
case h
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
this :
  HomogeneousIdeal.toIdeal (vanishingIdeal (zeroLocus 𝒜 ↑(HomogeneousIdeal.toIdeal (vanishingIdeal t)))) =
    HomogeneousIdeal.toIdeal (vanishingIdeal t)
⊢ HomogeneousIdeal.toIdeal (vanishingIdeal (closure t)) = HomogeneousIdeal.toIdeal (vanishingIdeal t)
[PROOFSTEP]
erw [zeroLocus_vanishingIdeal_eq_closure 𝒜 t] at this
[GOAL]
case h
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
t : Set (ProjectiveSpectrum 𝒜)
this : HomogeneousIdeal.toIdeal (vanishingIdeal (closure t)) = HomogeneousIdeal.toIdeal (vanishingIdeal t)
⊢ HomogeneousIdeal.toIdeal (vanishingIdeal (closure t)) = HomogeneousIdeal.toIdeal (vanishingIdeal t)
[PROOFSTEP]
exact this
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
r : A
x : ProjectiveSpectrum 𝒜
⊢ x ∈ ↑(basicOpen 𝒜 r) ↔ x ∈ (zeroLocus 𝒜 {r})ᶜ
[PROOFSTEP]
simp only [Set.mem_compl_iff, mem_zeroLocus, Set.singleton_subset_iff]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
r : A
x : ProjectiveSpectrum 𝒜
⊢ x ∈ ↑(basicOpen 𝒜 r) ↔ ¬r ∈ ↑x.asHomogeneousIdeal
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
⊢ ↑(basicOpen 𝒜 1) = ↑⊤
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
⊢ ↑(basicOpen 𝒜 0) = ↑⊥
[PROOFSTEP]
simp
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f g : A
⊢ ↑(basicOpen 𝒜 (f * g)) = ↑(basicOpen 𝒜 f ⊓ basicOpen 𝒜 g)
[PROOFSTEP]
simp [zeroLocus_singleton_mul]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f g : A
⊢ basicOpen 𝒜 (f * g) ≤ basicOpen 𝒜 f
[PROOFSTEP]
rw [basicOpen_mul 𝒜 f g]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f g : A
⊢ basicOpen 𝒜 f ⊓ basicOpen 𝒜 g ≤ basicOpen 𝒜 f
[PROOFSTEP]
exact inf_le_left
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f g : A
⊢ basicOpen 𝒜 (f * g) ≤ basicOpen 𝒜 g
[PROOFSTEP]
rw [basicOpen_mul 𝒜 f g]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f g : A
⊢ basicOpen 𝒜 f ⊓ basicOpen 𝒜 g ≤ basicOpen 𝒜 g
[PROOFSTEP]
exact inf_le_right
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
n : ℕ
hn : 0 < n
⊢ ↑(basicOpen 𝒜 (f ^ n)) = ↑(basicOpen 𝒜 f)
[PROOFSTEP]
simpa using zeroLocus_singleton_pow 𝒜 f n hn
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
z : ProjectiveSpectrum 𝒜
⊢ z ∈ ↑(basicOpen 𝒜 f) ↔ z ∈ ↑(⨆ (i : ℕ), basicOpen 𝒜 (↑(GradedAlgebra.proj 𝒜 i) f))
[PROOFSTEP]
erw [mem_coe_basicOpen, TopologicalSpace.Opens.mem_sSup]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
z : ProjectiveSpectrum 𝒜
⊢ ¬f ∈ z.asHomogeneousIdeal ↔ ∃ u, (u ∈ Set.range fun i => basicOpen 𝒜 (↑(GradedAlgebra.proj 𝒜 i) f)) ∧ z ∈ u
[PROOFSTEP]
constructor
[GOAL]
case mp
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
z : ProjectiveSpectrum 𝒜
⊢ ¬f ∈ z.asHomogeneousIdeal → ∃ u, (u ∈ Set.range fun i => basicOpen 𝒜 (↑(GradedAlgebra.proj 𝒜 i) f)) ∧ z ∈ u
[PROOFSTEP]
intro hz
[GOAL]
case mpr
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
z : ProjectiveSpectrum 𝒜
⊢ (∃ u, (u ∈ Set.range fun i => basicOpen 𝒜 (↑(GradedAlgebra.proj 𝒜 i) f)) ∧ z ∈ u) → ¬f ∈ z.asHomogeneousIdeal
[PROOFSTEP]
intro hz
[GOAL]
case mp
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
z : ProjectiveSpectrum 𝒜
hz : ¬f ∈ z.asHomogeneousIdeal
⊢ ∃ u, (u ∈ Set.range fun i => basicOpen 𝒜 (↑(GradedAlgebra.proj 𝒜 i) f)) ∧ z ∈ u
[PROOFSTEP]
rcases show ∃ i, GradedAlgebra.proj 𝒜 i f ∉ z.asHomogeneousIdeal
    by
    contrapose! hz with H
    classical
    rw [← DirectSum.sum_support_decompose 𝒜 f]
    apply Ideal.sum_mem _ fun i _ => H i with
  ⟨i, hi⟩
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
z : ProjectiveSpectrum 𝒜
hz : ¬f ∈ z.asHomogeneousIdeal
⊢ ∃ i, ¬↑(GradedAlgebra.proj 𝒜 i) f ∈ z.asHomogeneousIdeal
[PROOFSTEP]
contrapose! hz with H
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
z : ProjectiveSpectrum 𝒜
H : ∀ (i : ℕ), ↑(GradedAlgebra.proj 𝒜 i) f ∈ z.asHomogeneousIdeal
⊢ f ∈ z.asHomogeneousIdeal
[PROOFSTEP]
classical
rw [← DirectSum.sum_support_decompose 𝒜 f]
apply Ideal.sum_mem _ fun i _ => H i
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
z : ProjectiveSpectrum 𝒜
H : ∀ (i : ℕ), ↑(GradedAlgebra.proj 𝒜 i) f ∈ z.asHomogeneousIdeal
⊢ f ∈ z.asHomogeneousIdeal
[PROOFSTEP]
rw [← DirectSum.sum_support_decompose 𝒜 f]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
z : ProjectiveSpectrum 𝒜
H : ∀ (i : ℕ), ↑(GradedAlgebra.proj 𝒜 i) f ∈ z.asHomogeneousIdeal
⊢ ∑ i in DFinsupp.support (↑(decompose 𝒜) f), ↑(↑(↑(decompose 𝒜) f) i) ∈ z.asHomogeneousIdeal
[PROOFSTEP]
apply Ideal.sum_mem _ fun i _ => H i
[GOAL]
case mp.intro
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
z : ProjectiveSpectrum 𝒜
hz : ¬f ∈ z.asHomogeneousIdeal
i : ℕ
hi : ¬↑(GradedAlgebra.proj 𝒜 i) f ∈ z.asHomogeneousIdeal
⊢ ∃ u, (u ∈ Set.range fun i => basicOpen 𝒜 (↑(GradedAlgebra.proj 𝒜 i) f)) ∧ z ∈ u
[PROOFSTEP]
exact ⟨basicOpen 𝒜 (GradedAlgebra.proj 𝒜 i f), ⟨i, rfl⟩, by rwa [mem_basicOpen]⟩
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
z : ProjectiveSpectrum 𝒜
hz : ¬f ∈ z.asHomogeneousIdeal
i : ℕ
hi : ¬↑(GradedAlgebra.proj 𝒜 i) f ∈ z.asHomogeneousIdeal
⊢ z ∈ basicOpen 𝒜 (↑(GradedAlgebra.proj 𝒜 i) f)
[PROOFSTEP]
rwa [mem_basicOpen]
[GOAL]
case mpr
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
z : ProjectiveSpectrum 𝒜
hz : ∃ u, (u ∈ Set.range fun i => basicOpen 𝒜 (↑(GradedAlgebra.proj 𝒜 i) f)) ∧ z ∈ u
⊢ ¬f ∈ z.asHomogeneousIdeal
[PROOFSTEP]
obtain ⟨_, ⟨i, rfl⟩, hz⟩ := hz
[GOAL]
case mpr.intro.intro.intro
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
f : A
z : ProjectiveSpectrum 𝒜
i : ℕ
hz : z ∈ (fun i => basicOpen 𝒜 (↑(GradedAlgebra.proj 𝒜 i) f)) i
⊢ ¬f ∈ z.asHomogeneousIdeal
[PROOFSTEP]
exact fun rid => hz (z.1.2 i rid)
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
⊢ IsTopologicalBasis (Set.range fun r => ↑(basicOpen 𝒜 r))
[PROOFSTEP]
apply TopologicalSpace.isTopologicalBasis_of_open_of_nhds
[GOAL]
case h_open
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
⊢ ∀ (u : Set (ProjectiveSpectrum 𝒜)), (u ∈ Set.range fun r => ↑(basicOpen 𝒜 r)) → IsOpen u
[PROOFSTEP]
rintro _ ⟨r, rfl⟩
[GOAL]
case h_open.intro
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
r : A
⊢ IsOpen ((fun r => ↑(basicOpen 𝒜 r)) r)
[PROOFSTEP]
exact isOpen_basicOpen 𝒜
[GOAL]
case h_nhds
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
⊢ ∀ (a : ProjectiveSpectrum 𝒜) (u : Set (ProjectiveSpectrum 𝒜)),
    a ∈ u → IsOpen u → ∃ v, (v ∈ Set.range fun r => ↑(basicOpen 𝒜 r)) ∧ a ∈ v ∧ v ⊆ u
[PROOFSTEP]
rintro p U hp ⟨s, hs⟩
[GOAL]
case h_nhds.intro
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
p : ProjectiveSpectrum 𝒜
U : Set (ProjectiveSpectrum 𝒜)
hp : p ∈ U
s : Set A
hs : zeroLocus 𝒜 s = Uᶜ
⊢ ∃ v, (v ∈ Set.range fun r => ↑(basicOpen 𝒜 r)) ∧ p ∈ v ∧ v ⊆ U
[PROOFSTEP]
rw [← compl_compl U, Set.mem_compl_iff, ← hs, mem_zeroLocus, Set.not_subset] at hp
[GOAL]
case h_nhds.intro
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
p : ProjectiveSpectrum 𝒜
U : Set (ProjectiveSpectrum 𝒜)
s : Set A
hp : ∃ a, a ∈ s ∧ ¬a ∈ ↑p.asHomogeneousIdeal
hs : zeroLocus 𝒜 s = Uᶜ
⊢ ∃ v, (v ∈ Set.range fun r => ↑(basicOpen 𝒜 r)) ∧ p ∈ v ∧ v ⊆ U
[PROOFSTEP]
obtain ⟨f, hfs, hfp⟩ := hp
[GOAL]
case h_nhds.intro.intro.intro
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
p : ProjectiveSpectrum 𝒜
U : Set (ProjectiveSpectrum 𝒜)
s : Set A
hs : zeroLocus 𝒜 s = Uᶜ
f : A
hfs : f ∈ s
hfp : ¬f ∈ ↑p.asHomogeneousIdeal
⊢ ∃ v, (v ∈ Set.range fun r => ↑(basicOpen 𝒜 r)) ∧ p ∈ v ∧ v ⊆ U
[PROOFSTEP]
refine' ⟨basicOpen 𝒜 f, ⟨f, rfl⟩, hfp, _⟩
[GOAL]
case h_nhds.intro.intro.intro
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
p : ProjectiveSpectrum 𝒜
U : Set (ProjectiveSpectrum 𝒜)
s : Set A
hs : zeroLocus 𝒜 s = Uᶜ
f : A
hfs : f ∈ s
hfp : ¬f ∈ ↑p.asHomogeneousIdeal
⊢ ↑(basicOpen 𝒜 f) ⊆ U
[PROOFSTEP]
rw [← Set.compl_subset_compl, ← hs, basicOpen_eq_zeroLocus_compl, compl_compl]
[GOAL]
case h_nhds.intro.intro.intro
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
p : ProjectiveSpectrum 𝒜
U : Set (ProjectiveSpectrum 𝒜)
s : Set A
hs : zeroLocus 𝒜 s = Uᶜ
f : A
hfs : f ∈ s
hfp : ¬f ∈ ↑p.asHomogeneousIdeal
⊢ zeroLocus 𝒜 s ⊆ zeroLocus 𝒜 {f}
[PROOFSTEP]
exact zeroLocus_anti_mono 𝒜 (Set.singleton_subset_iff.mpr hfs)
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
x✝¹ x✝ : ProjectiveSpectrum 𝒜
asHomogeneousIdeal✝¹ : HomogeneousIdeal 𝒜
isPrime✝¹ : Ideal.IsPrime (HomogeneousIdeal.toIdeal asHomogeneousIdeal✝¹)
not_irrelevant_le✝¹ : ¬HomogeneousIdeal.irrelevant 𝒜 ≤ asHomogeneousIdeal✝¹
asHomogeneousIdeal✝ : HomogeneousIdeal 𝒜
isPrime✝ : Ideal.IsPrime (HomogeneousIdeal.toIdeal asHomogeneousIdeal✝)
not_irrelevant_le✝ : ¬HomogeneousIdeal.irrelevant 𝒜 ≤ asHomogeneousIdeal✝
⊢ { asHomogeneousIdeal := asHomogeneousIdeal✝¹, isPrime := isPrime✝¹,
          not_irrelevant_le := not_irrelevant_le✝¹ }.asHomogeneousIdeal =
      { asHomogeneousIdeal := asHomogeneousIdeal✝, isPrime := isPrime✝,
          not_irrelevant_le := not_irrelevant_le✝ }.asHomogeneousIdeal →
    { asHomogeneousIdeal := asHomogeneousIdeal✝¹, isPrime := isPrime✝¹, not_irrelevant_le := not_irrelevant_le✝¹ } =
      { asHomogeneousIdeal := asHomogeneousIdeal✝, isPrime := isPrime✝, not_irrelevant_le := not_irrelevant_le✝ }
[PROOFSTEP]
simp only [mk.injEq, imp_self]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
x y : ProjectiveSpectrum 𝒜
⊢ x ≤ y ↔ y ∈ closure {x}
[PROOFSTEP]
rw [← as_ideal_le_as_ideal, ← zeroLocus_vanishingIdeal_eq_closure, mem_zeroLocus, vanishingIdeal_singleton]
[GOAL]
R : Type u_1
A : Type u_2
inst✝³ : CommSemiring R
inst✝² : CommRing A
inst✝¹ : Algebra R A
𝒜 : ℕ → Submodule R A
inst✝ : GradedAlgebra 𝒜
x y : ProjectiveSpectrum 𝒜
⊢ x.asHomogeneousIdeal ≤ y.asHomogeneousIdeal ↔ ↑x.asHomogeneousIdeal ⊆ ↑y.asHomogeneousIdeal
[PROOFSTEP]
simp only [as_ideal_le_as_ideal, coe_subset_coe]