Theorem: isIntegral_of_mem_of_FG
File: Mathlib/RingTheory/IntegralClosure.lean

tactic: cases' HS with y hy
state_before: R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
HS : FG (↑Subalgebra.toSubmodule S)
x : A
hx : x ∈ S
⊢ IsIntegral R x

tactic: obtain ⟨lx, hlx1, hlx2⟩ :
  ∃ (l : A →₀ R), l ∈ Finsupp.supported R R ↑y ∧ (Finsupp.total A A R id) l = x := by
  rwa [← @Finsupp.mem_span_image_iff_total A A R _ _ _ id (↑y) x, Set.image_id (y : Set A), hy]
state_before: case intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
⊢ IsIntegral R x

tactic: have hyS : ∀ {p}, p ∈ y → p ∈ S := fun {p} hp =>
  show p ∈ Subalgebra.toSubmodule S by
    rw [← hy]
    exact subset_span hp
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R (?m.368651 lx)
hlx2 : ↑(Finsupp.total A A R id) lx = x
⊢ IsIntegral R x

tactic: have : ∀ jk : (y ×ˢ y : Finset (A × A)),
    jk.1.1 * jk.1.2 ∈ (Subalgebra.toSubmodule S) := fun jk =>
  S.mul_mem (hyS (Finset.mem_product.1 jk.2).1) (hyS (Finset.mem_product.1 jk.2).2)
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
⊢ IsIntegral R x

tactic: rw [← hy, ← Set.image_id (y : Set A)] at this
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
this : ∀ (jk : { x // x ∈ y ×ˢ y }), (↑jk).fst * (↑jk).snd ∈ ↑Subalgebra.toSubmodule S
⊢ IsIntegral R x

tactic: simp only [Finsupp.mem_span_image_iff_total] at this
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
this : ∀ (jk : { x // x ∈ y ×ˢ y }), (↑jk).fst * (↑jk).snd ∈ span R (id '' ↑y)
⊢ IsIntegral R x

tactic: choose ly hly1 hly2 using this
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
this :
  ∀ (jk : { x // x ∈ y ×ˢ y }), ∃ l, l ∈ Finsupp.supported R R ↑y ∧ ↑(Finsupp.total A A R id) l = (↑jk).fst * (↑jk).snd
⊢ IsIntegral R x

tactic: let S₀ : Subring R :=
  Subring.closure ↑(lx.frange ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
⊢ IsIntegral R x

tactic: refine' isIntegral_ofSubring S₀ _
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
⊢ IsIntegral R x

tactic: letI : CommRing S₀ := SubringClass.toCommRing S₀
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
⊢ IsIntegral { x // x ∈ S₀ } x

tactic: letI : Algebra S₀ A := Algebra.ofSubring S₀
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
⊢ IsIntegral { x // x ∈ S₀ } x

tactic: let S₁ : Subring A :=
  { carrier := span S₀ (insert 1 ↑y : Set A)
    one_mem' := subset_span <| Or.inl rfl
    mul_mem' := fun {p q} hp hq => this <| mul_mem_mul hp hq
    zero_mem' := (span S₀ (insert 1 ↑y : Set A)).zero_mem
    add_mem' := fun {_ _} => (span S₀ (insert 1 ↑y : Set A)).add_mem
    neg_mem' := fun {_} => (span S₀ (insert 1 ↑y : Set A)).neg_mem }
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝¹ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
⊢ IsIntegral { x // x ∈ S₀ } x

tactic: have foo : ∀ z, z ∈ S₁ ↔ z ∈ Algebra.adjoin (↥S₀) (y : Set A)
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝² : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝¹ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝ : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
⊢ IsIntegral { x // x ∈ S₀ } x

tactic: simp [this]
state_before: case foo
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝² : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝¹ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝ : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
⊢ ∀ (z : A), z ∈ S₁ ↔ z ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y

case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝² : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝¹ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝ : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
foo : ∀ (z : A), z ∈ S₁ ↔ z ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y
⊢ IsIntegral { x // x ∈ S₀ } x

tactic: haveI : IsNoetherianRing S₀ := is_noetherian_subring_closure _ (Finset.finite_toSet _)
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝² : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝¹ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝ : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
foo : ∀ (z : A), z ∈ S₁ ↔ z ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y
⊢ IsIntegral { x // x ∈ S₀ } x

tactic: refine'
  isIntegral_of_submodule_noetherian (Algebra.adjoin S₀ ↑y)
    (isNoetherian_of_fg_of_noetherian _
      ⟨insert 1 y, by
        rw [Finset.coe_insert]
        ext z
        simp only [Finset.coe_sort_coe, Finset.univ_eq_attach, Finset.mem_coe,
          Subalgebra.mem_toSubmodule]
        convert foo z⟩)
    _ _
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝³ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝² : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝¹ : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this✝ : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
foo : ∀ (z : A), z ∈ S₁ ↔ z ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y
this : IsNoetherianRing { x // x ∈ S₀ }
⊢ IsIntegral { x // x ∈ S₀ } x

tactic: rw [← hlx2, Finsupp.total_apply, Finsupp.sum]
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝³ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝² : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝¹ : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this✝ : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
foo : ∀ (z : A), z ∈ S₁ ↔ z ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y
this : IsNoetherianRing { x // x ∈ S₀ }
⊢ x ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y

tactic: refine' Subalgebra.sum_mem _ fun r hr => _
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝³ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝² : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝¹ : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this✝ : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
foo : ∀ (z : A), z ∈ S₁ ↔ z ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y
this : IsNoetherianRing { x // x ∈ S₀ }
⊢ ∑ a in lx.support, ↑lx a • id a ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y

tactic: have : lx r ∈ S₀ :=
  Subring.subset_closure (Finset.mem_union_left _ (Finset.mem_image_of_mem _ hr))
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝³ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝² : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝¹ : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this✝ : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
foo : ∀ (z : A), z ∈ S₁ ↔ z ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y
this : IsNoetherianRing { x // x ∈ S₀ }
r : A
hr : r ∈ lx.support
⊢ ↑lx r • id r ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y

tactic: change (⟨_, this⟩ : S₀) • r ∈ _
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝⁴ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝³ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝² : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this✝¹ : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
foo : ∀ (z : A), z ∈ S₁ ↔ z ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y
this✝ : IsNoetherianRing { x // x ∈ S₀ }
r : A
hr : r ∈ lx.support
this : ↑lx r ∈ S₀
⊢ ↑lx r • id r ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y

tactic: rw [Finsupp.mem_supported] at hlx1
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝⁴ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝³ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝² : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this✝¹ : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
foo : ∀ (z : A), z ∈ S₁ ↔ z ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y
this✝ : IsNoetherianRing { x // x ∈ S₀ }
r : A
hr : r ∈ lx.support
this : ↑lx r ∈ S₀
⊢ { val := ↑lx r, property := this } • r ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y

tactic: exact Subalgebra.smul_mem _ (Algebra.subset_adjoin <| hlx1 hr) _
state_before: case intro.intro.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : ↑lx.support ⊆ ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝⁴ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝³ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝² : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this✝¹ : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
foo : ∀ (z : A), z ∈ S₁ ↔ z ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y
this✝ : IsNoetherianRing { x // x ∈ S₀ }
r : A
hr : r ∈ lx.support
this : ↑lx r ∈ S₀
⊢ { val := ↑lx r, property := this } • r ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y

tactic: rwa [← @Finsupp.mem_span_image_iff_total A A R _ _ _ id (↑y) x, Set.image_id (y : Set A), hy]
state_before: R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
⊢ ∃ l, l ∈ Finsupp.supported R R ↑y ∧ ↑(Finsupp.total A A R id) l = x

tactic: rw [← hy]
state_before: R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
p : A
hp : p ∈ y
⊢ p ∈ ↑Subalgebra.toSubmodule S

tactic: exact subset_span hp
state_before: R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
p : A
hp : p ∈ y
⊢ p ∈ span R ↑y

tactic: rw [span_mul_span]
state_before: R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
⊢ span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)

tactic: refine' span_le.2 fun z hz => _
state_before: R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
⊢ span { x // x ∈ S₀ } (insert 1 ↑y * insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)

tactic: rcases Set.mem_mul.1 hz with ⟨p, q, rfl | hp, hq, rfl⟩
state_before: R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
z : A
hz : z ∈ insert 1 ↑y * insert 1 ↑y
⊢ z ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))

tactic: rcases hq with (rfl | hq)
state_before: case intro.intro.intro.inr.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
p q : A
hp : p ∈ ↑y
hq : q ∈ insert 1 ↑y
hz : p * q ∈ insert 1 ↑y * insert 1 ↑y
⊢ p * q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))

tactic: erw [← hly2 ⟨(p, q), Finset.mem_product.2 ⟨hp, hq⟩⟩]
state_before: case intro.intro.intro.inr.intro.inr
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
p q : A
hp : p ∈ ↑y
hz : p * q ∈ insert 1 ↑y * insert 1 ↑y
hq : q ∈ ↑y
⊢ p * q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))

tactic: rw [Finsupp.total_apply, Finsupp.sum]
state_before: case intro.intro.intro.inr.intro.inr
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
p q : A
hp : p ∈ ↑y
hz : p * q ∈ insert 1 ↑y * insert 1 ↑y
hq : q ∈ ↑y
⊢ ↑(Finsupp.total A A R id) (ly { val := (p, q), property := (_ : (p, q) ∈ y ×ˢ y) }) ∈
    ↑(span { x // x ∈ S₀ } (insert 1 ↑y))

tactic: refine' (span S₀ (insert 1 ↑y : Set A)).sum_mem fun t ht => _
state_before: case intro.intro.intro.inr.intro.inr
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
p q : A
hp : p ∈ ↑y
hz : p * q ∈ insert 1 ↑y * insert 1 ↑y
hq : q ∈ ↑y
⊢ ∑ a in (ly { val := (p, q), property := (_ : (p, q) ∈ y ×ˢ y) }).support,
      ↑(ly { val := (p, q), property := (_ : (p, q) ∈ y ×ˢ y) }) a • id a ∈
    ↑(span { x // x ∈ S₀ } (insert 1 ↑y))

tactic: have : ly ⟨(p, q), Finset.mem_product.2 ⟨hp, hq⟩⟩ t ∈ S₀ :=
  Subring.subset_closure
    (Finset.mem_union_right _ <|
      Finset.mem_biUnion.2
        ⟨⟨(p, q), Finset.mem_product.2 ⟨hp, hq⟩⟩, Finset.mem_univ _,
          Finsupp.mem_frange.2 ⟨Finsupp.mem_support_iff.1 ht, _, rfl⟩⟩)
state_before: case intro.intro.intro.inr.intro.inr
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
p q : A
hp : p ∈ ↑y
hz : p * q ∈ insert 1 ↑y * insert 1 ↑y
hq : q ∈ ↑y
t : A
ht : t ∈ (ly { val := (p, q), property := (_ : (p, q) ∈ y ×ˢ y) }).support
⊢ ↑(ly { val := (p, q), property := (_ : (p, q) ∈ y ×ˢ y) }) t • id t ∈ span { x // x ∈ S₀ } (insert 1 ↑y)

tactic: change (⟨_, this⟩ : S₀) • t ∈ _
state_before: case intro.intro.intro.inr.intro.inr
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝¹ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
p q : A
hp : p ∈ ↑y
hz : p * q ∈ insert 1 ↑y * insert 1 ↑y
hq : q ∈ ↑y
t : A
ht : t ∈ (ly { val := (p, q), property := (_ : (p, q) ∈ y ×ˢ y) }).support
this : ↑(ly { val := (p, q), property := (_ : (p, q) ∈ y ×ˢ y) }) t ∈ S₀
⊢ ↑(ly { val := (p, q), property := (_ : (p, q) ∈ y ×ˢ y) }) t • id t ∈ span { x // x ∈ S₀ } (insert 1 ↑y)

tactic: exact smul_mem _ _ (subset_span <| Or.inr <| hly1 _ ht)
state_before: case intro.intro.intro.inr.intro.inr
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝¹ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
p q : A
hp : p ∈ ↑y
hz : p * q ∈ insert 1 ↑y * insert 1 ↑y
hq : q ∈ ↑y
t : A
ht : t ∈ (ly { val := (p, q), property := (_ : (p, q) ∈ y ×ˢ y) }).support
this : ↑(ly { val := (p, q), property := (_ : (p, q) ∈ y ×ˢ y) }) t ∈ S₀
⊢ { val := ↑(ly { val := (p, q), property := (_ : (p, q) ∈ y ×ˢ y) }) t, property := this } • t ∈
    span { x // x ∈ S₀ } (insert 1 ↑y)

tactic: rw [one_mul]
state_before: case intro.intro.intro.inl.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
q : A
hq : q ∈ insert 1 ↑y
hz : 1 * q ∈ insert 1 ↑y * insert 1 ↑y
⊢ 1 * q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))

tactic: exact subset_span hq
state_before: case intro.intro.intro.inl.intro
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
q : A
hq : q ∈ insert 1 ↑y
hz : 1 * q ∈ insert 1 ↑y * insert 1 ↑y
⊢ q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))

tactic: rw [mul_one]
state_before: case intro.intro.intro.inr.intro.inl
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
p : A
hp : p ∈ ↑y
hz : p * 1 ∈ insert 1 ↑y * insert 1 ↑y
⊢ p * 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))

tactic: exact subset_span (Or.inr hp)
state_before: case intro.intro.intro.inr.intro.inl
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
p : A
hp : p ∈ ↑y
hz : p * 1 ∈ insert 1 ↑y * insert 1 ↑y
⊢ p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))

tactic: ext z
state_before: R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝¹ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
⊢ S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)

tactic: suffices
  z ∈ span (↥S₀) (insert 1 ↑y : Set A) ↔
    z ∈ Subalgebra.toSubmodule (Algebra.adjoin (↥S₀) (y : Set A)) by
  simpa
state_before: case h
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝¹ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
z : A
⊢ z ∈ S₁ ↔ z ∈ Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)

tactic: constructor <;> intro hz
state_before: case h
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝¹ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
z : A
⊢ z ∈ span { x // x ∈ S₀ } (insert 1 ↑y) ↔ z ∈ ↑Subalgebra.toSubmodule (Algebra.adjoin { x // x ∈ S₀ } ↑y)

tactic: simpa
state_before: R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝² : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝¹ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝ : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
z : A
this : z ∈ span { x // x ∈ S₀ } (insert 1 ↑y) ↔ z ∈ ↑Subalgebra.toSubmodule (Algebra.adjoin { x // x ∈ S₀ } ↑y)
⊢ z ∈ S₁ ↔ z ∈ Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)

tactic: exact
  (span_le.2
    (Set.insert_subset.2 ⟨(Algebra.adjoin S₀ (y : Set A)).one_mem, Algebra.subset_adjoin⟩)) hz
state_before: case h.mp
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝¹ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
z : A
hz : z ∈ span { x // x ∈ S₀ } (insert 1 ↑y)
⊢ z ∈ ↑Subalgebra.toSubmodule (Algebra.adjoin { x // x ∈ S₀ } ↑y)

tactic: rw [Subalgebra.mem_toSubmodule, Algebra.mem_adjoin_iff] at hz
state_before: case h.mpr
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝¹ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
z : A
hz : z ∈ ↑Subalgebra.toSubmodule (Algebra.adjoin { x // x ∈ S₀ } ↑y)
⊢ z ∈ span { x // x ∈ S₀ } (insert 1 ↑y)

tactic: suffices Subring.closure (Set.range (algebraMap (↥S₀) A) ∪ ↑y) ≤ S₁ by exact this hz
state_before: case h.mpr
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝¹ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
z : A
hz : z ∈ Subring.closure (Set.range ↑(algebraMap { x // x ∈ S₀ } A) ∪ ↑y)
⊢ z ∈ span { x // x ∈ S₀ } (insert 1 ↑y)

tactic: refine' Subring.closure_le.2 (Set.union_subset _ fun t ht => subset_span <| Or.inr ht)
state_before: case h.mpr
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝¹ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
z : A
hz : z ∈ Subring.closure (Set.range ↑(algebraMap { x // x ∈ S₀ } A) ∪ ↑y)
⊢ Subring.closure (Set.range ↑(algebraMap { x // x ∈ S₀ } A) ∪ ↑y) ≤ S₁

tactic: rw [Set.range_subset_iff]
state_before: case h.mpr
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝¹ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
z : A
hz : z ∈ Subring.closure (Set.range ↑(algebraMap { x // x ∈ S₀ } A) ∪ ↑y)
⊢ Set.range ↑(algebraMap { x // x ∈ S₀ } A) ⊆ ↑S₁

tactic: intro y'
state_before: case h.mpr
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝¹ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
z : A
hz : z ∈ Subring.closure (Set.range ↑(algebraMap { x // x ∈ S₀ } A) ∪ ↑y)
⊢ ∀ (y : { x // x ∈ S₀ }), ↑(algebraMap { x // x ∈ S₀ } A) y ∈ ↑S₁

tactic: rw [Algebra.algebraMap_eq_smul_one]
state_before: case h.mpr
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝¹ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
z : A
hz : z ∈ Subring.closure (Set.range ↑(algebraMap { x // x ∈ S₀ } A) ∪ ↑y)
y' : { x // x ∈ S₀ }
⊢ ↑(algebraMap { x // x ∈ S₀ } A) y' ∈ ↑S₁

tactic: exact smul_mem (span S₀ (insert (1 : A) (y : Set A))) y' (subset_span (Or.inl rfl))
state_before: case h.mpr
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝¹ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
z : A
hz : z ∈ Subring.closure (Set.range ↑(algebraMap { x // x ∈ S₀ } A) ∪ ↑y)
y' : { x // x ∈ S₀ }
⊢ y' • 1 ∈ ↑S₁

tactic: exact this hz
state_before: R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝² : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝¹ : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝ : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
z : A
hz : z ∈ Subring.closure (Set.range ↑(algebraMap { x // x ∈ S₀ } A) ∪ ↑y)
this : Subring.closure (Set.range ↑(algebraMap { x // x ∈ S₀ } A) ∪ ↑y) ≤ S₁
⊢ z ∈ span { x // x ∈ S₀ } (insert 1 ↑y)

tactic: rw [Finset.coe_insert]
state_before: R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝³ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝² : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝¹ : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this✝ : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
foo : ∀ (z : A), z ∈ S₁ ↔ z ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y
this : IsNoetherianRing { x // x ∈ S₀ }
⊢ span { x // x ∈ S₀ } ↑(insert 1 y) = ↑Subalgebra.toSubmodule (Algebra.adjoin { x // x ∈ S₀ } ↑y)

tactic: ext z
state_before: R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝³ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝² : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝¹ : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this✝ : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
foo : ∀ (z : A), z ∈ S₁ ↔ z ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y
this : IsNoetherianRing { x // x ∈ S₀ }
⊢ span { x // x ∈ S₀ } (insert 1 ↑y) = ↑Subalgebra.toSubmodule (Algebra.adjoin { x // x ∈ S₀ } ↑y)

tactic: simp only [Finset.coe_sort_coe, Finset.univ_eq_attach, Finset.mem_coe,
  Subalgebra.mem_toSubmodule]
state_before: case h
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝³ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝² : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝¹ : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this✝ : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
foo : ∀ (z : A), z ∈ S₁ ↔ z ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y
this : IsNoetherianRing { x // x ∈ S₀ }
z : A
⊢ z ∈ span { x // x ∈ S₀ } (insert 1 ↑y) ↔ z ∈ ↑Subalgebra.toSubmodule (Algebra.adjoin { x // x ∈ S₀ } ↑y)

tactic: convert foo z
state_before: case h
R : Type u_1
A : Type u_2
B : Type ?u.347819
S✝ : Type ?u.347822
inst✝⁵ : CommRing R
inst✝⁴ : CommRing A
inst✝³ : CommRing B
inst✝² : CommRing S✝
inst✝¹ : Algebra R A
inst✝ : Algebra R B
f : R →+* S✝
S : Subalgebra R A
x : A
hx : x ∈ S
y : Finset A
hy : span R ↑y = ↑Subalgebra.toSubmodule S
lx : A →₀ R
hlx1 : lx ∈ Finsupp.supported R R ↑y
hlx2 : ↑(Finsupp.total A A R id) lx = x
hyS : ∀ {p : A}, p ∈ y → p ∈ S
ly : { x // x ∈ y ×ˢ y } → A →₀ R
hly1 : ∀ (jk : { x // x ∈ y ×ˢ y }), ly jk ∈ Finsupp.supported R R ↑y
hly2 : ∀ (jk : { x // x ∈ y ×ˢ y }), ↑(Finsupp.total A A R id) (ly jk) = (↑jk).fst * (↑jk).snd
S₀ : Subring R := Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion Finset.univ (Finsupp.frange ∘ ly))
this✝³ : CommRing { x // x ∈ S₀ } := SubringClass.toCommRing S₀
this✝² : Algebra { x // x ∈ S₀ } A := Algebra.ofSubring S₀
this✝¹ : span { x // x ∈ S₀ } (insert 1 ↑y) * span { x // x ∈ S₀ } (insert 1 ↑y) ≤ span { x // x ∈ S₀ } (insert 1 ↑y)
S₁ : Subring A :=
  {
    toSubsemiring :=
      {
        toSubmonoid :=
          {
            toSubsemigroup :=
              { carrier := ↑(span { x // x ∈ S₀ } (insert 1 ↑y)),
                mul_mem' :=
                  (_ :
                    ∀ {p q : A},
                      p ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) →
                        q ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y)) → p * q ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
            one_mem' := (_ : 1 ∈ ↑(span { x // x ∈ S₀ } (insert 1 ↑y))) },
        add_mem' :=
          (_ :
            ∀ {x x_1 : A},
              x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) →
                x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → x + x_1 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)),
        zero_mem' := (_ : 0 ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) },
    neg_mem' := (_ : ∀ {x : A}, x ∈ span { x // x ∈ S₀ } (insert 1 ↑y) → -x ∈ span { x // x ∈ S₀ } (insert 1 ↑y)) }
this✝ : S₁ = Subalgebra.toSubring (Algebra.adjoin { x // x ∈ S₀ } ↑y)
foo : ∀ (z : A), z ∈ S₁ ↔ z ∈ Algebra.adjoin { x // x ∈ S₀ } ↑y
this : IsNoetherianRing { x // x ∈ S₀ }
z : A
⊢ z ∈
      span
        { x //
          x ∈ Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion (Finset.attach (y ×ˢ y)) (Finsupp.frange ∘ ly)) }
        (insert 1 ↑y) ↔
    z ∈
      Algebra.adjoin
        { x //
          x ∈ Subring.closure ↑(Finsupp.frange lx ∪ Finset.biUnion (Finset.attach (y ×ˢ y)) (Finsupp.frange ∘ ly)) }
        ↑y