[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
⊢ bind₁ X = AlgHom.id R (MvPolynomial σ R)
[PROOFSTEP]
ext1 i
[GOAL]
case hf
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
i : σ
⊢ ↑(bind₁ X) (X i) = ↑(AlgHom.id R (MvPolynomial σ R)) (X i)
[PROOFSTEP]
simp
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ f : σ → MvPolynomial τ R
x : R
⊢ ↑(bind₁ f) (↑C x) = ↑C x
[PROOFSTEP]
simp [bind₁, algebraMap_eq]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
⊢ bind₂ C = RingHom.id (MvPolynomial σ R)
[PROOFSTEP]
ext : 2
[GOAL]
case hC.a
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
x✝ : R
⊢ ↑(RingHom.comp (bind₂ C) C) x✝ = ↑(RingHom.comp (RingHom.id (MvPolynomial σ R)) C) x✝
[PROOFSTEP]
simp
[GOAL]
case hX.a
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
i✝ : σ
m✝ : σ →₀ ℕ
⊢ coeff m✝ (↑(bind₂ C) (X i✝)) = coeff m✝ (↑(RingHom.id (MvPolynomial σ R)) (X i✝))
[PROOFSTEP]
simp
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* MvPolynomial σ S
φ : MvPolynomial σ R
⊢ ↑join₂ (↑(map f) φ) = ↑(bind₂ f) φ
[PROOFSTEP]
simp only [join₂, bind₂, eval₂Hom_map_hom, RingHom.id_comp]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ f : σ → MvPolynomial τ R
p : MvPolynomial σ R
⊢ ↑(aeval id) (↑(rename f) p) = ↑(aeval f) p
[PROOFSTEP]
rw [aeval_rename, Function.comp.left_id]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
υ : Type u_6
f : σ → MvPolynomial τ R
g : τ → MvPolynomial υ R
φ : MvPolynomial σ R
⊢ ↑(bind₁ g) (↑(bind₁ f) φ) = ↑(bind₁ fun i => ↑(bind₁ g) (f i)) φ
[PROOFSTEP]
simp [bind₁, ← comp_aeval]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
υ : Type u_6
f : σ → MvPolynomial τ R
g : τ → MvPolynomial υ R
⊢ AlgHom.comp (bind₁ g) (bind₁ f) = bind₁ fun i => ↑(bind₁ g) (f i)
[PROOFSTEP]
ext1
[GOAL]
case hf
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
υ : Type u_6
f : σ → MvPolynomial τ R
g : τ → MvPolynomial υ R
i✝ : σ
⊢ ↑(AlgHom.comp (bind₁ g) (bind₁ f)) (X i✝) = ↑(bind₁ fun i => ↑(bind₁ g) (f i)) (X i✝)
[PROOFSTEP]
apply bind₁_bind₁
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* MvPolynomial σ S
g : S →+* MvPolynomial σ T
⊢ RingHom.comp (bind₂ g) (bind₂ f) = bind₂ (RingHom.comp (bind₂ g) f)
[PROOFSTEP]
ext : 2
[GOAL]
case hC.a
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* MvPolynomial σ S
g : S →+* MvPolynomial σ T
x✝ : R
⊢ ↑(RingHom.comp (RingHom.comp (bind₂ g) (bind₂ f)) C) x✝ = ↑(RingHom.comp (bind₂ (RingHom.comp (bind₂ g) f)) C) x✝
[PROOFSTEP]
simp
[GOAL]
case hX.a
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* MvPolynomial σ S
g : S →+* MvPolynomial σ T
i✝ : σ
m✝ : σ →₀ ℕ
⊢ coeff m✝ (↑(RingHom.comp (bind₂ g) (bind₂ f)) (X i✝)) = coeff m✝ (↑(bind₂ (RingHom.comp (bind₂ g) f)) (X i✝))
[PROOFSTEP]
simp
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
υ : Type u_6
f : σ → MvPolynomial τ R
g : τ → υ
⊢ AlgHom.comp (rename g) (bind₁ f) = bind₁ fun i => ↑(rename g) (f i)
[PROOFSTEP]
ext1 i
[GOAL]
case hf
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
υ : Type u_6
f : σ → MvPolynomial τ R
g : τ → υ
i : σ
⊢ ↑(AlgHom.comp (rename g) (bind₁ f)) (X i) = ↑(bind₁ fun i => ↑(rename g) (f i)) (X i)
[PROOFSTEP]
simp
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* MvPolynomial σ S
g : S →+* T
φ : MvPolynomial σ R
⊢ ↑(map g) (↑(bind₂ f) φ) = ↑(bind₂ (RingHom.comp (map g) f)) φ
[PROOFSTEP]
simp only [bind₂, eval₂_comp_right, coe_eval₂Hom, eval₂_map]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* MvPolynomial σ S
g : S →+* T
φ : MvPolynomial σ R
⊢ eval₂ (RingHom.comp (map g) f) (↑(map g) ∘ X) φ = eval₂ (RingHom.comp (map g) f) X φ
[PROOFSTEP]
congr 1 with : 1
[GOAL]
case e_g.h
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* MvPolynomial σ S
g : S →+* T
φ : MvPolynomial σ R
x✝ : σ
⊢ (↑(map g) ∘ X) x✝ = X x✝
[PROOFSTEP]
simp only [Function.comp_apply, map_X]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
υ : Type u_6
f : τ → MvPolynomial υ R
g : σ → τ
⊢ AlgHom.comp (bind₁ f) (rename g) = bind₁ (f ∘ g)
[PROOFSTEP]
ext1 i
[GOAL]
case hf
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
υ : Type u_6
f : τ → MvPolynomial υ R
g : σ → τ
i : σ
⊢ ↑(AlgHom.comp (bind₁ f) (rename g)) (X i) = ↑(bind₁ (f ∘ g)) (X i)
[PROOFSTEP]
simp
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : S →+* MvPolynomial σ T
g : R →+* S
φ : MvPolynomial σ R
⊢ ↑(bind₂ f) (↑(map g) φ) = ↑(bind₂ (RingHom.comp f g)) φ
[PROOFSTEP]
simp [bind₂]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* S
⊢ RingHom.comp (map f) C = RingHom.comp C f
[PROOFSTEP]
ext1
[GOAL]
case a
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* S
x✝ : R
⊢ ↑(RingHom.comp (map f) C) x✝ = ↑(RingHom.comp C f) x✝
[PROOFSTEP]
apply map_C
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : MvPolynomial τ R →+* S
g : σ → MvPolynomial τ R
φ : MvPolynomial σ R
⊢ ↑f (↑(bind₁ g) φ) = ↑(eval₂Hom (RingHom.comp f C) fun i => ↑f (g i)) φ
[PROOFSTEP]
rw [bind₁, map_aeval, algebraMap_eq]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* S
g : σ → MvPolynomial τ R
φ : MvPolynomial σ R
⊢ ↑(map f) (↑(bind₁ g) φ) = ↑(bind₁ fun i => ↑(map f) (g i)) (↑(map f) φ)
[PROOFSTEP]
rw [hom_bind₁, map_comp_C, ← eval₂Hom_map_hom]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* S
g : σ → MvPolynomial τ R
φ : MvPolynomial σ R
⊢ ↑(eval₂Hom C fun i => ↑(map f) (g i)) (↑(map f) φ) = ↑(bind₁ fun i => ↑(map f) (g i)) (↑(map f) φ)
[PROOFSTEP]
rfl
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* S
g : σ → S
⊢ RingHom.comp (eval₂Hom f g) C = f
[PROOFSTEP]
ext1 r
[GOAL]
case a
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* S
g : σ → S
r : R
⊢ ↑(RingHom.comp (eval₂Hom f g) C) r = ↑f r
[PROOFSTEP]
exact eval₂_C f g r
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* S
g : τ → S
h : σ → MvPolynomial τ R
φ : MvPolynomial σ R
⊢ ↑(eval₂Hom f g) (↑(bind₁ h) φ) = ↑(eval₂Hom f fun i => ↑(eval₂Hom f g) (h i)) φ
[PROOFSTEP]
rw [hom_bind₁, eval₂Hom_comp_C]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : Algebra R S
f : τ → S
g : σ → MvPolynomial τ R
⊢ AlgHom.comp (aeval f) (bind₁ g) = aeval fun i => ↑(aeval f) (g i)
[PROOFSTEP]
ext1
[GOAL]
case hf
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : Algebra R S
f : τ → S
g : σ → MvPolynomial τ R
i✝ : σ
⊢ ↑(AlgHom.comp (aeval f) (bind₁ g)) (X i✝) = ↑(aeval fun i => ↑(aeval f) (g i)) (X i✝)
[PROOFSTEP]
apply aeval_bind₁
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : S →+* T
g : σ → T
h : R →+* MvPolynomial σ S
⊢ RingHom.comp (eval₂Hom f g) (bind₂ h) = eval₂Hom (RingHom.comp (eval₂Hom f g) h) g
[PROOFSTEP]
ext : 2
[GOAL]
case hC.a
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : S →+* T
g : σ → T
h : R →+* MvPolynomial σ S
x✝ : R
⊢ ↑(RingHom.comp (RingHom.comp (eval₂Hom f g) (bind₂ h)) C) x✝ =
    ↑(RingHom.comp (eval₂Hom (RingHom.comp (eval₂Hom f g) h) g) C) x✝
[PROOFSTEP]
simp
[GOAL]
case hX
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : S →+* T
g : σ → T
h : R →+* MvPolynomial σ S
i✝ : σ
⊢ ↑(RingHom.comp (eval₂Hom f g) (bind₂ h)) (X i✝) = ↑(eval₂Hom (RingHom.comp (eval₂Hom f g) h) g) (X i✝)
[PROOFSTEP]
simp
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ f : σ → MvPolynomial τ R
d : σ →₀ ℕ
r : R
⊢ ↑(bind₁ f) (↑(monomial d) r) = ↑C r * ∏ i in d.support, f i ^ ↑d i
[PROOFSTEP]
simp only [monomial_eq, AlgHom.map_mul, bind₁_C_right, Finsupp.prod, AlgHom.map_prod, AlgHom.map_pow, bind₁_X_right]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* MvPolynomial σ S
d : σ →₀ ℕ
r : R
⊢ ↑(bind₂ f) (↑(monomial d) r) = ↑f r * ↑(monomial d) 1
[PROOFSTEP]
simp only [monomial_eq, RingHom.map_mul, bind₂_C_right, Finsupp.prod, map_prod, map_pow, bind₂_X_right, C_1, one_mul]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ : σ → MvPolynomial τ R
f : R →+* MvPolynomial σ S
d : σ →₀ ℕ
⊢ ↑(bind₂ f) (↑(monomial d) 1) = ↑(monomial d) 1
[PROOFSTEP]
rw [bind₂_monomial, f.map_one, one_mul]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : DecidableEq τ
f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
⊢ vars (↑(bind₁ f) φ) ⊆ Finset.biUnion (vars φ) fun i => vars (f i)
[PROOFSTEP]
calc
  (bind₁ f φ).vars = (φ.support.sum fun x : σ →₀ ℕ => (bind₁ f) (monomial x (coeff x φ))).vars := by
    rw [← AlgHom.map_sum, ← φ.as_sum]
  _ ≤ φ.support.biUnion fun i : σ →₀ ℕ => ((bind₁ f) (monomial i (coeff i φ))).vars := (vars_sum_subset _ _)
  _ = φ.support.biUnion fun d : σ →₀ ℕ => vars (C (coeff d φ) * ∏ i in d.support, f i ^ d i) := by
    simp only [bind₁_monomial]
  _ ≤ φ.support.biUnion fun d : σ →₀ ℕ => d.support.biUnion fun i => vars (f i) :=
    ?_
      -- proof below
  _ ≤ φ.vars.biUnion fun i : σ => vars (f i) :=
    ?_
      -- proof below
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : DecidableEq τ
f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
⊢ vars (↑(bind₁ f) φ) = vars (∑ x in support φ, ↑(bind₁ f) (↑(monomial x) (coeff x φ)))
[PROOFSTEP]
rw [← AlgHom.map_sum, ← φ.as_sum]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : DecidableEq τ
f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
⊢ (Finset.biUnion (support φ) fun i => vars (↑(bind₁ f) (↑(monomial i) (coeff i φ)))) =
    Finset.biUnion (support φ) fun d => vars (↑C (coeff d φ) * ∏ i in d.support, f i ^ ↑d i)
[PROOFSTEP]
simp only [bind₁_monomial]
[GOAL]
case calc_1
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : DecidableEq τ
f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
⊢ (Finset.biUnion (support φ) fun d => vars (↑C (coeff d φ) * ∏ i in d.support, f i ^ ↑d i)) ≤
    Finset.biUnion (support φ) fun d => Finset.biUnion d.support fun i => vars (f i)
[PROOFSTEP]
apply Finset.biUnion_mono
[GOAL]
case calc_1.h
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : DecidableEq τ
f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
⊢ ∀ (a : σ →₀ ℕ),
    a ∈ support φ → vars (↑C (coeff a φ) * ∏ i in a.support, f i ^ ↑a i) ⊆ Finset.biUnion a.support fun i => vars (f i)
[PROOFSTEP]
intro d _hd
[GOAL]
case calc_1.h
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : DecidableEq τ
f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
d : σ →₀ ℕ
_hd : d ∈ support φ
⊢ vars (↑C (coeff d φ) * ∏ i in d.support, f i ^ ↑d i) ⊆ Finset.biUnion d.support fun i => vars (f i)
[PROOFSTEP]
calc
  vars (C (coeff d φ) * ∏ i : σ in d.support, f i ^ d i) ≤
      (C (coeff d φ)).vars ∪ (∏ i : σ in d.support, f i ^ d i).vars :=
    vars_mul _ _
  _ ≤ (∏ i : σ in d.support, f i ^ d i).vars := by
    simp only [Finset.empty_union, vars_C, Finset.le_iff_subset, Finset.Subset.refl]
  _ ≤ d.support.biUnion fun i : σ => vars (f i ^ d i) := (vars_prod _)
  _ ≤ d.support.biUnion fun i : σ => (f i).vars := ?_
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : DecidableEq τ
f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
d : σ →₀ ℕ
_hd : d ∈ support φ
⊢ vars (↑C (coeff d φ)) ∪ vars (∏ i in d.support, f i ^ ↑d i) ≤ vars (∏ i in d.support, f i ^ ↑d i)
[PROOFSTEP]
simp only [Finset.empty_union, vars_C, Finset.le_iff_subset, Finset.Subset.refl]
[GOAL]
case calc_1.h
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : DecidableEq τ
f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
d : σ →₀ ℕ
_hd : d ∈ support φ
⊢ (Finset.biUnion d.support fun i => vars (f i ^ ↑d i)) ≤ Finset.biUnion d.support fun i => vars (f i)
[PROOFSTEP]
apply Finset.biUnion_mono
[GOAL]
case calc_1.h.h
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : DecidableEq τ
f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
d : σ →₀ ℕ
_hd : d ∈ support φ
⊢ ∀ (a : σ), a ∈ d.support → vars (f a ^ ↑d a) ⊆ vars (f a)
[PROOFSTEP]
intro i _hi
[GOAL]
case calc_1.h.h
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : DecidableEq τ
f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
d : σ →₀ ℕ
_hd : d ∈ support φ
i : σ
_hi : i ∈ d.support
⊢ vars (f i ^ ↑d i) ⊆ vars (f i)
[PROOFSTEP]
apply vars_pow
[GOAL]
case calc_2
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : DecidableEq τ
f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
⊢ (Finset.biUnion (support φ) fun d => Finset.biUnion d.support fun i => vars (f i)) ≤
    Finset.biUnion (vars φ) fun i => vars (f i)
[PROOFSTEP]
intro j
[GOAL]
case calc_2
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : DecidableEq τ
f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
j : τ
⊢ (j ∈ Finset.biUnion (support φ) fun d => Finset.biUnion d.support fun i => vars (f i)) →
    j ∈ Finset.biUnion (vars φ) fun i => vars (f i)
[PROOFSTEP]
simp_rw [Finset.mem_biUnion]
[GOAL]
case calc_2
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : DecidableEq τ
f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
j : τ
⊢ (∃ a, a ∈ support φ ∧ ∃ a_1, a_1 ∈ a.support ∧ j ∈ vars (f a_1)) → ∃ a, a ∈ vars φ ∧ j ∈ vars (f a)
[PROOFSTEP]
rintro ⟨d, hd, ⟨i, hi, hj⟩⟩
[GOAL]
case calc_2.intro.intro.intro.intro
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝³ : CommSemiring R
inst✝² : CommSemiring S
inst✝¹ : CommSemiring T
f✝ : σ → MvPolynomial τ R
inst✝ : DecidableEq τ
f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
j : τ
d : σ →₀ ℕ
hd : d ∈ support φ
i : σ
hi : i ∈ d.support
hj : j ∈ vars (f i)
⊢ ∃ a, a ∈ vars φ ∧ j ∈ vars (f a)
[PROOFSTEP]
exact ⟨i, (mem_vars _).mpr ⟨d, hd, hi⟩, hj⟩
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
j : τ
h : j ∈ vars (↑(bind₁ f) φ)
⊢ ∃ i, i ∈ vars φ ∧ j ∈ vars (f i)
[PROOFSTEP]
classical simpa only [exists_prop, Finset.mem_biUnion, mem_support_iff, Ne.def] using vars_bind₁ f φ h
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f✝ f : σ → MvPolynomial τ R
φ : MvPolynomial σ R
j : τ
h : j ∈ vars (↑(bind₁ f) φ)
⊢ ∃ i, i ∈ vars φ ∧ j ∈ vars (f i)
[PROOFSTEP]
simpa only [exists_prop, Finset.mem_biUnion, mem_support_iff, Ne.def] using vars_bind₁ f φ h
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
⊢ ∀ {α β : Type ?u.1605153}, Functor.mapConst = Functor.map ∘ Function.const β
[PROOFSTEP]
intros
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
α✝ β✝ : Type ?u.1605153
⊢ Functor.mapConst = Functor.map ∘ Function.const β✝
[PROOFSTEP]
rfl
  -- porting note: I guess `map_const` no longer has a default implementation?
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
⊢ ∀ {α : Type ?u.1605153} (x : MvPolynomial α R), id <$> x = x
[PROOFSTEP]
intros
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
α✝ : Type ?u.1605153
x✝ : MvPolynomial α✝ R
⊢ id <$> x✝ = x✝
[PROOFSTEP]
simp [(· <$> ·)]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
⊢ ∀ {α β γ : Type ?u.1605153} (g : α → β) (h : β → γ) (x : MvPolynomial α R), (h ∘ g) <$> x = h <$> g <$> x
[PROOFSTEP]
intros
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
α✝ β✝ γ✝ : Type ?u.1605153
g✝ : α✝ → β✝
h✝ : β✝ → γ✝
x✝ : MvPolynomial α✝ R
⊢ (h✝ ∘ g✝) <$> x✝ = h✝ <$> g✝ <$> x✝
[PROOFSTEP]
simp [(· <$> ·)]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
⊢ ∀ {α β : Type ?u.1607152} (x : MvPolynomial α R) (y : MvPolynomial β R),
    (SeqLeft.seqLeft x fun x => y) = Seq.seq (Function.const β <$> x) fun x => y
[PROOFSTEP]
intros
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
α✝ β✝ : Type ?u.1607152
x✝ : MvPolynomial α✝ R
y✝ : MvPolynomial β✝ R
⊢ (SeqLeft.seqLeft x✝ fun x => y✝) = Seq.seq (Function.const β✝ <$> x✝) fun x => y✝
[PROOFSTEP]
simp [SeqLeft.seqLeft, Seq.seq, (· <$> ·), bind₁_rename]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
α✝ β✝ : Type ?u.1607152
x✝ : MvPolynomial α✝ R
y✝ : MvPolynomial β✝ R
⊢ ↑(bind₁ fun a => ↑(bind₁ fun x => X a) y✝) x✝ = ↑(bind₁ ((fun y => ↑(rename y) y✝) ∘ Function.const β✝)) x✝
[PROOFSTEP]
rfl
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
⊢ ∀ {α β : Type ?u.1607152} (x : MvPolynomial α R) (y : MvPolynomial β R),
    (SeqRight.seqRight x fun x => y) = Seq.seq (Function.const α id <$> x) fun x => y
[PROOFSTEP]
intros
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
α✝ β✝ : Type ?u.1607152
x✝ : MvPolynomial α✝ R
y✝ : MvPolynomial β✝ R
⊢ (SeqRight.seqRight x✝ fun x => y✝) = Seq.seq (Function.const α✝ id <$> x✝) fun x => y✝
[PROOFSTEP]
simp [SeqRight.seqRight, Seq.seq, (· <$> ·), bind₁_rename]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
α✝ β✝ : Type ?u.1607152
x✝ : MvPolynomial α✝ R
y✝ : MvPolynomial β✝ R
⊢ ↑(bind₁ fun x => y✝) x✝ = ↑(bind₁ (Function.const α✝ y✝)) x✝
[PROOFSTEP]
rfl
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
⊢ ∀ {α β : Type ?u.1607152} (g : α → β) (x : MvPolynomial α R), (Seq.seq (pure g) fun x_1 => x) = g <$> x
[PROOFSTEP]
intros
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
α✝ β✝ : Type ?u.1607152
g✝ : α✝ → β✝
x✝ : MvPolynomial α✝ R
⊢ (Seq.seq (pure g✝) fun x => x✝) = g✝ <$> x✝
[PROOFSTEP]
simp [(· <$> ·), pure, Seq.seq]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
⊢ ∀ {α β : Type ?u.1607152} (f : α → β) (x : MvPolynomial α R),
    (do
        let a ← x
        pure (f a)) =
      f <$> x
[PROOFSTEP]
aesop
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
⊢ ∀ {α β : Type ?u.1607152} (f : MvPolynomial (α → β) R) (x : MvPolynomial α R),
    (do
        let x_1 ← f
        x_1 <$> x) =
      Seq.seq f fun x_1 => x
[PROOFSTEP]
aesop
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
⊢ ∀ {α β : Type ?u.1607152} (x : α) (f : α → MvPolynomial β R), pure x >>= f = f x
[PROOFSTEP]
intros
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
α✝ β✝ : Type ?u.1607152
x✝ : α✝
f✝ : α✝ → MvPolynomial β✝ R
⊢ pure x✝ >>= f✝ = f✝ x✝
[PROOFSTEP]
simp [pure, bind]
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
⊢ ∀ {α β γ : Type ?u.1607152} (x : MvPolynomial α R) (f : α → MvPolynomial β R) (g : β → MvPolynomial γ R),
    x >>= f >>= g = x >>= fun x => f x >>= g
[PROOFSTEP]
intros
[GOAL]
σ : Type u_1
τ : Type u_2
R : Type u_3
S : Type u_4
T : Type u_5
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S
inst✝ : CommSemiring T
f : σ → MvPolynomial τ R
α✝ β✝ γ✝ : Type ?u.1607152
x✝ : MvPolynomial α✝ R
f✝ : α✝ → MvPolynomial β✝ R
g✝ : β✝ → MvPolynomial γ✝ R
⊢ x✝ >>= f✝ >>= g✝ = x✝ >>= fun x => f✝ x >>= g✝
[PROOFSTEP]
simp [bind, ← bind₁_comp_bind₁]


[GOAL]
α : Sort u
β : Sort v
f g : α ↪ β
h : f.toFun = g.toFun
⊢ f = g
[PROOFSTEP]
{cases f; cases g; congr
}
[GOAL]
α : Sort u
β : Sort v
f g : α ↪ β
h : f.toFun = g.toFun
⊢ f = g
[PROOFSTEP]
cases f
[GOAL]
case mk
α : Sort u
β : Sort v
g : α ↪ β
toFun✝ : α → β
inj'✝ : Injective toFun✝
h : { toFun := toFun✝, inj' := inj'✝ }.toFun = g.toFun
⊢ { toFun := toFun✝, inj' := inj'✝ } = g
[PROOFSTEP]
cases g
[GOAL]
case mk.mk
α : Sort u
β : Sort v
toFun✝¹ : α → β
inj'✝¹ : Injective toFun✝¹
toFun✝ : α → β
inj'✝ : Injective toFun✝
h : { toFun := toFun✝¹, inj' := inj'✝¹ }.toFun = { toFun := toFun✝, inj' := inj'✝ }.toFun
⊢ { toFun := toFun✝¹, inj' := inj'✝¹ } = { toFun := toFun✝, inj' := inj'✝ }
[PROOFSTEP]
congr
[GOAL]
α : Sort u_1
β : Sort u_2
e : α ≃ β
⊢ Embedding.trans (Equiv.toEmbedding e) (Equiv.toEmbedding e.symm) = Embedding.refl α
[PROOFSTEP]
ext
[GOAL]
case h
α : Sort u_1
β : Sort u_2
e : α ≃ β
x✝ : α
⊢ ↑(Embedding.trans (Equiv.toEmbedding e) (Equiv.toEmbedding e.symm)) x✝ = ↑(Embedding.refl α) x✝
[PROOFSTEP]
simp
[GOAL]
α : Sort u_1
β : Sort u_2
e : α ≃ β
⊢ Embedding.trans (Equiv.toEmbedding e.symm) (Equiv.toEmbedding e) = Embedding.refl β
[PROOFSTEP]
ext
[GOAL]
case h
α : Sort u_1
β : Sort u_2
e : α ≃ β
x✝ : β
⊢ ↑(Embedding.trans (Equiv.toEmbedding e.symm) (Equiv.toEmbedding e)) x✝ = ↑(Embedding.refl β) x✝
[PROOFSTEP]
simp
[GOAL]
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
⊢ Injective fun a' => if a' = a then b else if ↑f a' = b then ↑f a else ↑f a'
[PROOFSTEP]
intro x y
  (h : ite _ _ _ = ite _ _ _)
    -- TODO: once we have `cc` we can avoid all the manual cases below by doing
        -- split_ifs at h <;> (try subst b) <;> (try simp only [f.injective.eq_iff] at *) <;> cc
[GOAL]
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h : (if x = a then b else if ↑f x = b then ↑f a else ↑f x) = if y = a then b else if ↑f y = b then ↑f a else ↑f y
⊢ x = y
[PROOFSTEP]
split_ifs at h  with h₁ h₂ _ _ h₅ h₆
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : x = a
h₂ : y = a
h : b = b
⊢ x = y
[PROOFSTEP]
try subst b
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : x = a
h₂ : y = a
h : b = b
⊢ x = y
[PROOFSTEP]
subst b
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : x = a
h₂ : ¬y = a
_ : ↑f y = b
h : b = ↑f a
⊢ x = y
[PROOFSTEP]
try subst b
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : x = a
h₂ : ¬y = a
_ : ↑f y = b
h : b = ↑f a
⊢ x = y
[PROOFSTEP]
subst b
[GOAL]
case neg
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : x = a
h₂ : ¬y = a
_ : ¬↑f y = b
h : b = ↑f y
⊢ x = y
[PROOFSTEP]
try subst b
[GOAL]
case neg
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : x = a
h₂ : ¬y = a
_ : ¬↑f y = b
h : b = ↑f y
⊢ x = y
[PROOFSTEP]
subst b
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ↑f x = b
h₅ : y = a
h : ↑f a = b
⊢ x = y
[PROOFSTEP]
try subst b
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ↑f x = b
h₅ : y = a
h : ↑f a = b
⊢ x = y
[PROOFSTEP]
subst b
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ↑f x = b
h₅ : ¬y = a
h₆ : ↑f y = b
h : ↑f a = ↑f a
⊢ x = y
[PROOFSTEP]
try subst b
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ↑f x = b
h₅ : ¬y = a
h₆ : ↑f y = b
h : ↑f a = ↑f a
⊢ x = y
[PROOFSTEP]
subst b
[GOAL]
case neg
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ↑f x = b
h₅ : ¬y = a
h₆ : ¬↑f y = b
h : ↑f a = ↑f y
⊢ x = y
[PROOFSTEP]
try subst b
[GOAL]
case neg
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ↑f x = b
h₅ : ¬y = a
h₆ : ¬↑f y = b
h : ↑f a = ↑f y
⊢ x = y
[PROOFSTEP]
subst b
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ¬↑f x = b
h✝ : y = a
h : ↑f x = b
⊢ x = y
[PROOFSTEP]
try subst b
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ¬↑f x = b
h✝ : y = a
h : ↑f x = b
⊢ x = y
[PROOFSTEP]
subst b
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ¬↑f x = b
h✝¹ : ¬y = a
h✝ : ↑f y = b
h : ↑f x = ↑f a
⊢ x = y
[PROOFSTEP]
try subst b
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ¬↑f x = b
h✝¹ : ¬y = a
h✝ : ↑f y = b
h : ↑f x = ↑f a
⊢ x = y
[PROOFSTEP]
subst b
[GOAL]
case neg
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ¬↑f x = b
h✝¹ : ¬y = a
h✝ : ¬↑f y = b
h : ↑f x = ↑f y
⊢ x = y
[PROOFSTEP]
try subst b
[GOAL]
case neg
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ¬↑f x = b
h✝¹ : ¬y = a
h✝ : ¬↑f y = b
h : ↑f x = ↑f y
⊢ x = y
[PROOFSTEP]
subst b
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : x = a
h₂ : y = a
h : b = b
⊢ x = y
[PROOFSTEP]
try simp only [f.injective.eq_iff] at *
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : x = a
h₂ : y = a
h : b = b
⊢ x = y
[PROOFSTEP]
simp only [f.injective.eq_iff] at *
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : x = a
h₂ : ¬y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f y)
h : ↑f y = ↑f a
⊢ x = y
[PROOFSTEP]
try simp only [f.injective.eq_iff] at *
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : x = a
h₂ : ¬y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f y)
h : ↑f y = ↑f a
⊢ x = y
[PROOFSTEP]
simp only [f.injective.eq_iff] at *
[GOAL]
case neg
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : x = a
h₂ : ¬y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f y)
_ : ¬↑f y = ↑f y
⊢ x = y
[PROOFSTEP]
try simp only [f.injective.eq_iff] at *
[GOAL]
case neg
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : x = a
h₂ : ¬y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f y)
_ : ¬↑f y = ↑f y
⊢ x = y
[PROOFSTEP]
simp only [f.injective.eq_iff] at *
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h₅ : y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f x)
h : ↑f a = ↑f x
⊢ x = y
[PROOFSTEP]
try simp only [f.injective.eq_iff] at *
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h₅ : y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f x)
h : ↑f a = ↑f x
⊢ x = y
[PROOFSTEP]
simp only [f.injective.eq_iff] at *
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h₅ : ¬y = a
h : ↑f a = ↑f a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f x)
h₆ : ↑f y = ↑f x
⊢ x = y
[PROOFSTEP]
try simp only [f.injective.eq_iff] at *
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h₅ : ¬y = a
h : ↑f a = ↑f a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f x)
h₆ : ↑f y = ↑f x
⊢ x = y
[PROOFSTEP]
simp only [f.injective.eq_iff] at *
[GOAL]
case neg
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h₅ : ¬y = a
h : ↑f a = ↑f y
inst✝ : (a' : α) → Decidable (↑f a' = ↑f x)
h₆ : ¬↑f y = ↑f x
⊢ x = y
[PROOFSTEP]
try simp only [f.injective.eq_iff] at *
[GOAL]
case neg
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h₅ : ¬y = a
h : ↑f a = ↑f y
inst✝ : (a' : α) → Decidable (↑f a' = ↑f x)
h₆ : ¬↑f y = ↑f x
⊢ x = y
[PROOFSTEP]
simp only [f.injective.eq_iff] at *
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h✝ : y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f x)
_ : ¬↑f x = ↑f x
⊢ x = y
[PROOFSTEP]
try simp only [f.injective.eq_iff] at *
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h✝ : y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f x)
_ : ¬↑f x = ↑f x
⊢ x = y
[PROOFSTEP]
simp only [f.injective.eq_iff] at *
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h✝ : ¬y = a
h : ↑f x = ↑f a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f y)
_ : ¬↑f x = ↑f y
⊢ x = y
[PROOFSTEP]
try simp only [f.injective.eq_iff] at *
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h✝ : ¬y = a
h : ↑f x = ↑f a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f y)
_ : ¬↑f x = ↑f y
⊢ x = y
[PROOFSTEP]
simp only [f.injective.eq_iff] at *
[GOAL]
case neg
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ¬↑f x = b
h✝¹ : ¬y = a
h✝ : ¬↑f y = b
h : ↑f x = ↑f y
⊢ x = y
[PROOFSTEP]
try simp only [f.injective.eq_iff] at *
[GOAL]
case neg
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ¬↑f x = b
h✝¹ : ¬y = a
h✝ : ¬↑f y = b
h : ↑f x = ↑f y
⊢ x = y
[PROOFSTEP]
simp only [f.injective.eq_iff] at *
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : x = a
h₂ : y = a
h : True
⊢ x = y
[PROOFSTEP]
rw [h₁, h₂]
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : x = a
h₂ : ¬y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f y)
h : y = a
⊢ x = y
[PROOFSTEP]
rw [h₁, h]
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h₅ : y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f x)
h : a = x
⊢ x = y
[PROOFSTEP]
rw [h₅, ← h]
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h₅ : ¬y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f x)
h : True
h₆ : y = x
⊢ x = y
[PROOFSTEP]
exact h₆.symm
[GOAL]
case neg
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h₅ : ¬y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f x)
h : a = y
h₆ : ¬y = x
⊢ x = y
[PROOFSTEP]
exfalso
[GOAL]
case neg.h
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h₅ : ¬y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f x)
h : a = y
h₆ : ¬y = x
⊢ False
[PROOFSTEP]
exact h₅ h.symm
[GOAL]
case pos
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h✝ : ¬y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f y)
h : x = a
_ : ¬x = y
⊢ x = y
[PROOFSTEP]
exfalso
[GOAL]
case pos.h
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
inst✝¹ : (a' : α) → Decidable (a' = a)
x y : α
h₁ : ¬x = a
h✝ : ¬y = a
inst✝ : (a' : α) → Decidable (↑f a' = ↑f y)
h : x = a
_ : ¬x = y
⊢ False
[PROOFSTEP]
exact h₁ h
[GOAL]
case neg
α : Sort ?u.14414
β : Sort ?u.14415
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
x y : α
h₁ : ¬x = a
_ : ¬↑f x = b
h✝¹ : ¬y = a
h✝ : ¬↑f y = b
h : x = y
⊢ x = y
[PROOFSTEP]
exact h
[GOAL]
α : Sort u_1
β : Sort u_2
f : α ↪ β
a : α
b : β
inst✝¹ : (a' : α) → Decidable (a' = a)
inst✝ : (a' : α) → Decidable (↑f a' = b)
⊢ ↑(setValue f a b) a = b
[PROOFSTEP]
simp [setValue]
[GOAL]
β : Sort u_1
b : β
⊢ Injective fun x => b
[PROOFSTEP]
rintro ⟨⟩ ⟨⟩ _
[GOAL]
case unit.unit
β : Sort u_1
b : β
a✝ : (fun x => b) PUnit.unit = (fun x => b) PUnit.unit
⊢ PUnit.unit = PUnit.unit
[PROOFSTEP]
rfl
[GOAL]
α : Sort u
β : Sort v
γ : Sort w
inst✝ : Inhabited γ
e : α ↪ β
f₁ f₂ : α → γ
h : (fun f => extend (↑e) f default) f₁ = (fun f => extend (↑e) f default) f₂
x : α
⊢ f₁ x = f₂ x
[PROOFSTEP]
simpa only [e.injective.extend_apply] using congr_fun h (e x)
[GOAL]
α : Sort u_1
β : Sort u_2
γ : Sort u_3
δ : Sort u_4
h : α ≃ β
h' : γ ≃ δ
x : α ↪ γ
⊢ (fun f => Embedding.congr h.symm h'.symm f) ((fun f => Embedding.congr h h' f) x) = x
[PROOFSTEP]
ext
[GOAL]
case h
α : Sort u_1
β : Sort u_2
γ : Sort u_3
δ : Sort u_4
h : α ≃ β
h' : γ ≃ δ
x : α ↪ γ
x✝ : α
⊢ ↑((fun f => Embedding.congr h.symm h'.symm f) ((fun f => Embedding.congr h h' f) x)) x✝ = ↑x x✝
[PROOFSTEP]
simp
[GOAL]
α : Sort u_1
β : Sort u_2
γ : Sort u_3
δ : Sort u_4
h : α ≃ β
h' : γ ≃ δ
x : β ↪ δ
⊢ (fun f => Embedding.congr h h' f) ((fun f => Embedding.congr h.symm h'.symm f) x) = x
[PROOFSTEP]
ext
[GOAL]
case h
α : Sort u_1
β : Sort u_2
γ : Sort u_3
δ : Sort u_4
h : α ≃ β
h' : γ ≃ δ
x : β ↪ δ
x✝ : β
⊢ ↑((fun f => Embedding.congr h h' f) ((fun f => Embedding.congr h.symm h'.symm f) x)) x✝ = ↑x x✝
[PROOFSTEP]
simp
[GOAL]
α₁ : Sort u_1
β₁ : Sort u_2
γ₁ : Sort u_3
α₂ : Sort u_4
β₂ : Sort u_5
γ₂ : Sort u_6
ea : α₁ ≃ α₂
eb : β₁ ≃ β₂
ec : γ₁ ≃ γ₂
f : α₁ ↪ β₁
g : β₁ ↪ γ₁
⊢ ↑(embeddingCongr ea ec) (Embedding.trans f g) =
    Embedding.trans (↑(embeddingCongr ea eb) f) (↑(embeddingCongr eb ec) g)
[PROOFSTEP]
ext
[GOAL]
case h
α₁ : Sort u_1
β₁ : Sort u_2
γ₁ : Sort u_3
α₂ : Sort u_4
β₂ : Sort u_5
γ₂ : Sort u_6
ea : α₁ ≃ α₂
eb : β₁ ≃ β₂
ec : γ₁ ≃ γ₂
f : α₁ ↪ β₁
g : β₁ ↪ γ₁
x✝ : α₂
⊢ ↑(↑(embeddingCongr ea ec) (Embedding.trans f g)) x✝ =
    ↑(Embedding.trans (↑(embeddingCongr ea eb) f) (↑(embeddingCongr eb ec) g)) x✝
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
p q : α → Prop
inst✝ : DecidablePred p
⊢ Function.Injective fun x =>
    if h : p ↑x then Sum.inl { val := ↑x, property := h } else Sum.inr { val := ↑x, property := (_ : q ↑x) }
[PROOFSTEP]
intro x y
[GOAL]
α : Type u_1
p q : α → Prop
inst✝ : DecidablePred p
x y : { x // p x ∨ q x }
⊢ (fun x => if h : p ↑x then Sum.inl { val := ↑x, property := h } else Sum.inr { val := ↑x, property := (_ : q ↑x) })
        x =
      (fun x =>
          if h : p ↑x then Sum.inl { val := ↑x, property := h } else Sum.inr { val := ↑x, property := (_ : q ↑x) })
        y →
    x = y
[PROOFSTEP]
dsimp only
[GOAL]
α : Type u_1
p q : α → Prop
inst✝ : DecidablePred p
x y : { x // p x ∨ q x }
⊢ ((if h : p ↑x then Sum.inl { val := ↑x, property := h } else Sum.inr { val := ↑x, property := (_ : q ↑x) }) =
      if h : p ↑y then Sum.inl { val := ↑y, property := h } else Sum.inr { val := ↑y, property := (_ : q ↑y) }) →
    x = y
[PROOFSTEP]
split_ifs
[GOAL]
case pos
α : Type u_1
p q : α → Prop
inst✝ : DecidablePred p
x y : { x // p x ∨ q x }
h✝¹ : p ↑x
h✝ : p ↑y
⊢ Sum.inl { val := ↑x, property := h✝¹ } = Sum.inl { val := ↑y, property := h✝ } → x = y
[PROOFSTEP]
simp [Subtype.ext_iff]
[GOAL]
case neg
α : Type u_1
p q : α → Prop
inst✝ : DecidablePred p
x y : { x // p x ∨ q x }
h✝¹ : p ↑x
h✝ : ¬p ↑y
⊢ False → x = y
[PROOFSTEP]
simp [Subtype.ext_iff]
[GOAL]
case pos
α : Type u_1
p q : α → Prop
inst✝ : DecidablePred p
x y : { x // p x ∨ q x }
h✝¹ : ¬p ↑x
h✝ : p ↑y
⊢ False → x = y
[PROOFSTEP]
simp [Subtype.ext_iff]
[GOAL]
case neg
α : Type u_1
p q : α → Prop
inst✝ : DecidablePred p
x y : { x // p x ∨ q x }
h✝¹ : ¬p ↑x
h✝ : ¬p ↑y
⊢ Sum.inr { val := ↑x, property := (_ : q ↑x) } = Sum.inr { val := ↑y, property := (_ : q ↑y) } → x = y
[PROOFSTEP]
simp [Subtype.ext_iff]
[GOAL]
α : Type u_1
p q : α → Prop
h : ∀ (x : α), p x → q x
x y : { x // p x }
⊢ (fun x => { val := ↑x, property := (_ : q ↑x) }) x = (fun x => { val := ↑x, property := (_ : q ↑x) }) y → x = y
[PROOFSTEP]
simp [Subtype.ext_iff]


[GOAL]
R : Type u
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
S : Set (HeightOneSpectrum R)
K : Type v
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
x✝ : K
⊢ x✝ ∈ {x | ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) x ≤ 1} ↔
    x✝ ∈
      ↑(⨅ (v : HeightOneSpectrum R) (_ : ¬v ∈ S),
          (Valuation.valuationSubring (HeightOneSpectrum.valuation v)).toSubring)
[PROOFSTEP]
simp [SetLike.mem_coe, Subring.mem_iInf]
[GOAL]
R : Type u
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
S : Set (HeightOneSpectrum R)
K : Type v
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
⊢ ↑(Subalgebra.toSubring (integer S K)) =
    ↑(⨅ (v : HeightOneSpectrum R) (_ : ¬v ∈ S), (Valuation.valuationSubring (HeightOneSpectrum.valuation v)).toSubring)
[PROOFSTEP]
ext
[GOAL]
case h
R : Type u
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
S : Set (HeightOneSpectrum R)
K : Type v
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
x✝ : K
⊢ x✝ ∈ ↑(Subalgebra.toSubring (integer S K)) ↔
    x✝ ∈
      ↑(⨅ (v : HeightOneSpectrum R) (_ : ¬v ∈ S),
          (Valuation.valuationSubring (HeightOneSpectrum.valuation v)).toSubring)
[PROOFSTEP]
simp
[GOAL]
R : Type u
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
S : Set (HeightOneSpectrum R)
K : Type v
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
x✝ : Kˣ
⊢ x✝ ∈ {x | ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑x = 1} ↔
    x✝ ∈
      ↑(⨅ (v : HeightOneSpectrum R) (_ : ¬v ∈ S),
          ValuationSubring.unitGroup (Valuation.valuationSubring (HeightOneSpectrum.valuation v)))
[PROOFSTEP]
simp only [mem_setOf, SetLike.mem_coe, Subgroup.mem_iInf, Valuation.mem_unitGroup_iff]
[GOAL]
R : Type u
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
S : Set (HeightOneSpectrum R)
K : Type v
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
x : { x // x ∈ integer S K }ˣ
v : HeightOneSpectrum R
hv : ¬v ∈ S
⊢ ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) * ↑(HeightOneSpectrum.valuation v) ↑x.inv = 1
[PROOFSTEP]
rw [Units.val_mk0, ← map_mul, Subtype.mk_eq_mk.mp x.val_inv, v.valuation.map_one]
[GOAL]
R : Type u
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
S : Set (HeightOneSpectrum R)
K : Type v
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
x✝ : { x // x ∈ unit S K }
⊢ (fun x =>
        { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
          property :=
            (_ :
              ∀ (v : HeightOneSpectrum R),
                ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
      ((fun x =>
          {
            val :=
              { val := ↑↑x,
                property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
            inv :=
              { val := ↑(↑x)⁻¹,
                property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
            val_inv :=
              (_ :
                { val := ↑↑x,
                      property :=
                        (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                    { val := ↑(↑x)⁻¹,
                      property :=
                        (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                  1),
            inv_val :=
              (_ :
                { val := ↑(↑x)⁻¹,
                      property :=
                        (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                    { val := ↑↑x,
                      property :=
                        (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                  1) })
        x✝) =
    x✝
[PROOFSTEP]
ext
[GOAL]
case a.a
R : Type u
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
S : Set (HeightOneSpectrum R)
K : Type v
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
x✝ : { x // x ∈ unit S K }
⊢ ↑↑((fun x =>
            { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
              property :=
                (_ :
                  ∀ (v : HeightOneSpectrum R),
                    ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
          ((fun x =>
              {
                val :=
                  { val := ↑↑x,
                    property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                inv :=
                  { val := ↑(↑x)⁻¹,
                    property :=
                      (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                val_inv :=
                  (_ :
                    { val := ↑↑x,
                          property :=
                            (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                        { val := ↑(↑x)⁻¹,
                          property :=
                            (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                      1),
                inv_val :=
                  (_ :
                    { val := ↑(↑x)⁻¹,
                          property :=
                            (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                        { val := ↑↑x,
                          property :=
                            (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                      1) })
            x✝)) =
    ↑↑x✝
[PROOFSTEP]
rfl
[GOAL]
R : Type u
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
S : Set (HeightOneSpectrum R)
K : Type v
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
x✝ : { x // x ∈ integer S K }ˣ
⊢ (fun x =>
        {
          val :=
            { val := ↑↑x,
              property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
          inv :=
            { val := ↑(↑x)⁻¹,
              property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
          val_inv :=
            (_ :
              { val := ↑↑x,
                    property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                  { val := ↑(↑x)⁻¹,
                    property :=
                      (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                1),
          inv_val :=
            (_ :
              { val := ↑(↑x)⁻¹,
                    property :=
                      (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                  { val := ↑↑x,
                    property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                1) })
      ((fun x =>
          { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
            property :=
              (_ :
                ∀ (v : HeightOneSpectrum R),
                  ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
        x✝) =
    x✝
[PROOFSTEP]
ext
[GOAL]
case a.a
R : Type u
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
S : Set (HeightOneSpectrum R)
K : Type v
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
x✝ : { x // x ∈ integer S K }ˣ
⊢ ↑↑((fun x =>
            {
              val :=
                { val := ↑↑x,
                  property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
              inv :=
                { val := ↑(↑x)⁻¹,
                  property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
              val_inv :=
                (_ :
                  { val := ↑↑x,
                        property :=
                          (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                      { val := ↑(↑x)⁻¹,
                        property :=
                          (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                    1),
              inv_val :=
                (_ :
                  { val := ↑(↑x)⁻¹,
                        property :=
                          (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                      { val := ↑↑x,
                        property :=
                          (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                    1) })
          ((fun x =>
              { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                property :=
                  (_ :
                    ∀ (v : HeightOneSpectrum R),
                      ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
            x✝)) =
    ↑↑x✝
[PROOFSTEP]
rfl
[GOAL]
R : Type u
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
S : Set (HeightOneSpectrum R)
K : Type v
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
x✝¹ x✝ : { x // x ∈ unit S K }
⊢ Equiv.toFun
      {
        toFun := fun x =>
          {
            val :=
              { val := ↑↑x,
                property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
            inv :=
              { val := ↑(↑x)⁻¹,
                property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
            val_inv :=
              (_ :
                { val := ↑↑x,
                      property :=
                        (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                    { val := ↑(↑x)⁻¹,
                      property :=
                        (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                  1),
            inv_val :=
              (_ :
                { val := ↑(↑x)⁻¹,
                      property :=
                        (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                    { val := ↑↑x,
                      property :=
                        (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                  1) },
        invFun := fun x =>
          { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
            property :=
              (_ :
                ∀ (v : HeightOneSpectrum R),
                  ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) },
        left_inv :=
          (_ :
            ∀ (x : { x // x ∈ unit S K }),
              (fun x =>
                    { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                      property :=
                        (_ :
                          ∀ (v : HeightOneSpectrum R),
                            ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
                  ((fun x =>
                      {
                        val :=
                          { val := ↑↑x,
                            property :=
                              (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                        inv :=
                          { val := ↑(↑x)⁻¹,
                            property :=
                              (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                        val_inv :=
                          (_ :
                            { val := ↑↑x,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R),
                                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                                { val := ↑(↑x)⁻¹,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R),
                                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                              1),
                        inv_val :=
                          (_ :
                            { val := ↑(↑x)⁻¹,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R),
                                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                                { val := ↑↑x,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R),
                                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                              1) })
                    x) =
                x),
        right_inv :=
          (_ :
            ∀ (x : { x // x ∈ integer S K }ˣ),
              (fun x =>
                    {
                      val :=
                        { val := ↑↑x,
                          property :=
                            (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                      inv :=
                        { val := ↑(↑x)⁻¹,
                          property :=
                            (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                      val_inv :=
                        (_ :
                          { val := ↑↑x,
                                property :=
                                  (_ :
                                    ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                              { val := ↑(↑x)⁻¹,
                                property :=
                                  (_ :
                                    ∀ (v : HeightOneSpectrum R),
                                      ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                            1),
                      inv_val :=
                        (_ :
                          { val := ↑(↑x)⁻¹,
                                property :=
                                  (_ :
                                    ∀ (v : HeightOneSpectrum R),
                                      ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                              { val := ↑↑x,
                                property :=
                                  (_ :
                                    ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                            1) })
                  ((fun x =>
                      { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                        property :=
                          (_ :
                            ∀ (v : HeightOneSpectrum R),
                              ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
                    x) =
                x) }
      (x✝¹ * x✝) =
    Equiv.toFun
        {
          toFun := fun x =>
            {
              val :=
                { val := ↑↑x,
                  property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
              inv :=
                { val := ↑(↑x)⁻¹,
                  property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
              val_inv :=
                (_ :
                  { val := ↑↑x,
                        property :=
                          (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                      { val := ↑(↑x)⁻¹,
                        property :=
                          (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                    1),
              inv_val :=
                (_ :
                  { val := ↑(↑x)⁻¹,
                        property :=
                          (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                      { val := ↑↑x,
                        property :=
                          (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                    1) },
          invFun := fun x =>
            { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
              property :=
                (_ :
                  ∀ (v : HeightOneSpectrum R),
                    ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) },
          left_inv :=
            (_ :
              ∀ (x : { x // x ∈ unit S K }),
                (fun x =>
                      { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                        property :=
                          (_ :
                            ∀ (v : HeightOneSpectrum R),
                              ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
                    ((fun x =>
                        {
                          val :=
                            { val := ↑↑x,
                              property :=
                                (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                          inv :=
                            { val := ↑(↑x)⁻¹,
                              property :=
                                (_ :
                                  ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                          val_inv :=
                            (_ :
                              { val := ↑↑x,
                                    property :=
                                      (_ :
                                        ∀ (v : HeightOneSpectrum R),
                                          ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                                  { val := ↑(↑x)⁻¹,
                                    property :=
                                      (_ :
                                        ∀ (v : HeightOneSpectrum R),
                                          ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                                1),
                          inv_val :=
                            (_ :
                              { val := ↑(↑x)⁻¹,
                                    property :=
                                      (_ :
                                        ∀ (v : HeightOneSpectrum R),
                                          ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                                  { val := ↑↑x,
                                    property :=
                                      (_ :
                                        ∀ (v : HeightOneSpectrum R),
                                          ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                                1) })
                      x) =
                  x),
          right_inv :=
            (_ :
              ∀ (x : { x // x ∈ integer S K }ˣ),
                (fun x =>
                      {
                        val :=
                          { val := ↑↑x,
                            property :=
                              (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                        inv :=
                          { val := ↑(↑x)⁻¹,
                            property :=
                              (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                        val_inv :=
                          (_ :
                            { val := ↑↑x,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R),
                                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                                { val := ↑(↑x)⁻¹,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R),
                                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                              1),
                        inv_val :=
                          (_ :
                            { val := ↑(↑x)⁻¹,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R),
                                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                                { val := ↑↑x,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R),
                                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                              1) })
                    ((fun x =>
                        { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                          property :=
                            (_ :
                              ∀ (v : HeightOneSpectrum R),
                                ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
                      x) =
                  x) }
        x✝¹ *
      Equiv.toFun
        {
          toFun := fun x =>
            {
              val :=
                { val := ↑↑x,
                  property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
              inv :=
                { val := ↑(↑x)⁻¹,
                  property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
              val_inv :=
                (_ :
                  { val := ↑↑x,
                        property :=
                          (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                      { val := ↑(↑x)⁻¹,
                        property :=
                          (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                    1),
              inv_val :=
                (_ :
                  { val := ↑(↑x)⁻¹,
                        property :=
                          (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                      { val := ↑↑x,
                        property :=
                          (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                    1) },
          invFun := fun x =>
            { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
              property :=
                (_ :
                  ∀ (v : HeightOneSpectrum R),
                    ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) },
          left_inv :=
            (_ :
              ∀ (x : { x // x ∈ unit S K }),
                (fun x =>
                      { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                        property :=
                          (_ :
                            ∀ (v : HeightOneSpectrum R),
                              ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
                    ((fun x =>
                        {
                          val :=
                            { val := ↑↑x,
                              property :=
                                (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                          inv :=
                            { val := ↑(↑x)⁻¹,
                              property :=
                                (_ :
                                  ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                          val_inv :=
                            (_ :
                              { val := ↑↑x,
                                    property :=
                                      (_ :
                                        ∀ (v : HeightOneSpectrum R),
                                          ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                                  { val := ↑(↑x)⁻¹,
                                    property :=
                                      (_ :
                                        ∀ (v : HeightOneSpectrum R),
                                          ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                                1),
                          inv_val :=
                            (_ :
                              { val := ↑(↑x)⁻¹,
                                    property :=
                                      (_ :
                                        ∀ (v : HeightOneSpectrum R),
                                          ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                                  { val := ↑↑x,
                                    property :=
                                      (_ :
                                        ∀ (v : HeightOneSpectrum R),
                                          ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                                1) })
                      x) =
                  x),
          right_inv :=
            (_ :
              ∀ (x : { x // x ∈ integer S K }ˣ),
                (fun x =>
                      {
                        val :=
                          { val := ↑↑x,
                            property :=
                              (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                        inv :=
                          { val := ↑(↑x)⁻¹,
                            property :=
                              (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                        val_inv :=
                          (_ :
                            { val := ↑↑x,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R),
                                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                                { val := ↑(↑x)⁻¹,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R),
                                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                              1),
                        inv_val :=
                          (_ :
                            { val := ↑(↑x)⁻¹,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R),
                                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                                { val := ↑↑x,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R),
                                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                              1) })
                    ((fun x =>
                        { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                          property :=
                            (_ :
                              ∀ (v : HeightOneSpectrum R),
                                ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
                      x) =
                  x) }
        x✝
[PROOFSTEP]
ext
[GOAL]
case a.a
R : Type u
inst✝⁵ : CommRing R
inst✝⁴ : IsDomain R
inst✝³ : IsDedekindDomain R
S : Set (HeightOneSpectrum R)
K : Type v
inst✝² : Field K
inst✝¹ : Algebra R K
inst✝ : IsFractionRing R K
x✝¹ x✝ : { x // x ∈ unit S K }
⊢ ↑↑(Equiv.toFun
          {
            toFun := fun x =>
              {
                val :=
                  { val := ↑↑x,
                    property := (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                inv :=
                  { val := ↑(↑x)⁻¹,
                    property :=
                      (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                val_inv :=
                  (_ :
                    { val := ↑↑x,
                          property :=
                            (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                        { val := ↑(↑x)⁻¹,
                          property :=
                            (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                      1),
                inv_val :=
                  (_ :
                    { val := ↑(↑x)⁻¹,
                          property :=
                            (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                        { val := ↑↑x,
                          property :=
                            (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                      1) },
            invFun := fun x =>
              { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                property :=
                  (_ :
                    ∀ (v : HeightOneSpectrum R),
                      ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) },
            left_inv :=
              (_ :
                ∀ (x : { x // x ∈ unit S K }),
                  (fun x =>
                        { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                          property :=
                            (_ :
                              ∀ (v : HeightOneSpectrum R),
                                ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
                      ((fun x =>
                          {
                            val :=
                              { val := ↑↑x,
                                property :=
                                  (_ :
                                    ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                            inv :=
                              { val := ↑(↑x)⁻¹,
                                property :=
                                  (_ :
                                    ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                            val_inv :=
                              (_ :
                                { val := ↑↑x,
                                      property :=
                                        (_ :
                                          ∀ (v : HeightOneSpectrum R),
                                            ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                                    { val := ↑(↑x)⁻¹,
                                      property :=
                                        (_ :
                                          ∀ (v : HeightOneSpectrum R),
                                            ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                                  1),
                            inv_val :=
                              (_ :
                                { val := ↑(↑x)⁻¹,
                                      property :=
                                        (_ :
                                          ∀ (v : HeightOneSpectrum R),
                                            ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                                    { val := ↑↑x,
                                      property :=
                                        (_ :
                                          ∀ (v : HeightOneSpectrum R),
                                            ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                                  1) })
                        x) =
                    x),
            right_inv :=
              (_ :
                ∀ (x : { x // x ∈ integer S K }ˣ),
                  (fun x =>
                        {
                          val :=
                            { val := ↑↑x,
                              property :=
                                (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                          inv :=
                            { val := ↑(↑x)⁻¹,
                              property :=
                                (_ :
                                  ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                          val_inv :=
                            (_ :
                              { val := ↑↑x,
                                    property :=
                                      (_ :
                                        ∀ (v : HeightOneSpectrum R),
                                          ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                                  { val := ↑(↑x)⁻¹,
                                    property :=
                                      (_ :
                                        ∀ (v : HeightOneSpectrum R),
                                          ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                                1),
                          inv_val :=
                            (_ :
                              { val := ↑(↑x)⁻¹,
                                    property :=
                                      (_ :
                                        ∀ (v : HeightOneSpectrum R),
                                          ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                                  { val := ↑↑x,
                                    property :=
                                      (_ :
                                        ∀ (v : HeightOneSpectrum R),
                                          ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                                1) })
                      ((fun x =>
                          { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                            property :=
                              (_ :
                                ∀ (v : HeightOneSpectrum R),
                                  ¬v ∈ S →
                                    ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
                        x) =
                    x) }
          (x✝¹ * x✝)) =
    ↑↑(Equiv.toFun
            {
              toFun := fun x =>
                {
                  val :=
                    { val := ↑↑x,
                      property :=
                        (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                  inv :=
                    { val := ↑(↑x)⁻¹,
                      property :=
                        (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                  val_inv :=
                    (_ :
                      { val := ↑↑x,
                            property :=
                              (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                          { val := ↑(↑x)⁻¹,
                            property :=
                              (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                        1),
                  inv_val :=
                    (_ :
                      { val := ↑(↑x)⁻¹,
                            property :=
                              (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                          { val := ↑↑x,
                            property :=
                              (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                        1) },
              invFun := fun x =>
                { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                  property :=
                    (_ :
                      ∀ (v : HeightOneSpectrum R),
                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) },
              left_inv :=
                (_ :
                  ∀ (x : { x // x ∈ unit S K }),
                    (fun x =>
                          { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                            property :=
                              (_ :
                                ∀ (v : HeightOneSpectrum R),
                                  ¬v ∈ S →
                                    ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
                        ((fun x =>
                            {
                              val :=
                                { val := ↑↑x,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                              inv :=
                                { val := ↑(↑x)⁻¹,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R),
                                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                              val_inv :=
                                (_ :
                                  { val := ↑↑x,
                                        property :=
                                          (_ :
                                            ∀ (v : HeightOneSpectrum R),
                                              ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                                      { val := ↑(↑x)⁻¹,
                                        property :=
                                          (_ :
                                            ∀ (v : HeightOneSpectrum R),
                                              ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                                    1),
                              inv_val :=
                                (_ :
                                  { val := ↑(↑x)⁻¹,
                                        property :=
                                          (_ :
                                            ∀ (v : HeightOneSpectrum R),
                                              ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                                      { val := ↑↑x,
                                        property :=
                                          (_ :
                                            ∀ (v : HeightOneSpectrum R),
                                              ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                                    1) })
                          x) =
                      x),
              right_inv :=
                (_ :
                  ∀ (x : { x // x ∈ integer S K }ˣ),
                    (fun x =>
                          {
                            val :=
                              { val := ↑↑x,
                                property :=
                                  (_ :
                                    ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                            inv :=
                              { val := ↑(↑x)⁻¹,
                                property :=
                                  (_ :
                                    ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                            val_inv :=
                              (_ :
                                { val := ↑↑x,
                                      property :=
                                        (_ :
                                          ∀ (v : HeightOneSpectrum R),
                                            ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                                    { val := ↑(↑x)⁻¹,
                                      property :=
                                        (_ :
                                          ∀ (v : HeightOneSpectrum R),
                                            ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                                  1),
                            inv_val :=
                              (_ :
                                { val := ↑(↑x)⁻¹,
                                      property :=
                                        (_ :
                                          ∀ (v : HeightOneSpectrum R),
                                            ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                                    { val := ↑↑x,
                                      property :=
                                        (_ :
                                          ∀ (v : HeightOneSpectrum R),
                                            ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                                  1) })
                        ((fun x =>
                            { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                              property :=
                                (_ :
                                  ∀ (v : HeightOneSpectrum R),
                                    ¬v ∈ S →
                                      ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
                          x) =
                      x) }
            x✝¹ *
          Equiv.toFun
            {
              toFun := fun x =>
                {
                  val :=
                    { val := ↑↑x,
                      property :=
                        (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                  inv :=
                    { val := ↑(↑x)⁻¹,
                      property :=
                        (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                  val_inv :=
                    (_ :
                      { val := ↑↑x,
                            property :=
                              (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                          { val := ↑(↑x)⁻¹,
                            property :=
                              (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                        1),
                  inv_val :=
                    (_ :
                      { val := ↑(↑x)⁻¹,
                            property :=
                              (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                          { val := ↑↑x,
                            property :=
                              (_ : ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                        1) },
              invFun := fun x =>
                { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                  property :=
                    (_ :
                      ∀ (v : HeightOneSpectrum R),
                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) },
              left_inv :=
                (_ :
                  ∀ (x : { x // x ∈ unit S K }),
                    (fun x =>
                          { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                            property :=
                              (_ :
                                ∀ (v : HeightOneSpectrum R),
                                  ¬v ∈ S →
                                    ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
                        ((fun x =>
                            {
                              val :=
                                { val := ↑↑x,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                              inv :=
                                { val := ↑(↑x)⁻¹,
                                  property :=
                                    (_ :
                                      ∀ (v : HeightOneSpectrum R),
                                        ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                              val_inv :=
                                (_ :
                                  { val := ↑↑x,
                                        property :=
                                          (_ :
                                            ∀ (v : HeightOneSpectrum R),
                                              ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                                      { val := ↑(↑x)⁻¹,
                                        property :=
                                          (_ :
                                            ∀ (v : HeightOneSpectrum R),
                                              ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                                    1),
                              inv_val :=
                                (_ :
                                  { val := ↑(↑x)⁻¹,
                                        property :=
                                          (_ :
                                            ∀ (v : HeightOneSpectrum R),
                                              ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                                      { val := ↑↑x,
                                        property :=
                                          (_ :
                                            ∀ (v : HeightOneSpectrum R),
                                              ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                                    1) })
                          x) =
                      x),
              right_inv :=
                (_ :
                  ∀ (x : { x // x ∈ integer S K }ˣ),
                    (fun x =>
                          {
                            val :=
                              { val := ↑↑x,
                                property :=
                                  (_ :
                                    ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) },
                            inv :=
                              { val := ↑(↑x)⁻¹,
                                property :=
                                  (_ :
                                    ∀ (v : HeightOneSpectrum R), ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) },
                            val_inv :=
                              (_ :
                                { val := ↑↑x,
                                      property :=
                                        (_ :
                                          ∀ (v : HeightOneSpectrum R),
                                            ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } *
                                    { val := ↑(↑x)⁻¹,
                                      property :=
                                        (_ :
                                          ∀ (v : HeightOneSpectrum R),
                                            ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } =
                                  1),
                            inv_val :=
                              (_ :
                                { val := ↑(↑x)⁻¹,
                                      property :=
                                        (_ :
                                          ∀ (v : HeightOneSpectrum R),
                                            ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x⁻¹ ≤ 1) } *
                                    { val := ↑↑x,
                                      property :=
                                        (_ :
                                          ∀ (v : HeightOneSpectrum R),
                                            ¬v ∈ S → ↑(HeightOneSpectrum.valuation v) ↑↑x ≤ 1) } =
                                  1) })
                        ((fun x =>
                            { val := Units.mk0 ↑↑x (_ : ↑↑x = 0 → False),
                              property :=
                                (_ :
                                  ∀ (v : HeightOneSpectrum R),
                                    ¬v ∈ S →
                                      ↑(HeightOneSpectrum.valuation v) ↑(Units.mk0 ↑↑x (_ : ↑↑x = 0 → False)) = 1) })
                          x) =
                      x) }
            x✝)
[PROOFSTEP]
rfl