Module docstring
{"# Bundled subsemirings
We define bundled subsemirings and some standard constructions: subtype and inclusion
ring homomorphisms.
"}
{"# Bundled subsemirings
We define bundled subsemirings and some standard constructions: subtype and inclusion
ring homomorphisms.
"}
AddSubmonoidWithOneClass
structure
(S : Type*) (R : outParam Type*) [AddMonoidWithOne R]
[SetLike S R] : Prop extends AddSubmonoidClass S R, OneMemClass S R
/-- `AddSubmonoidWithOneClass S R` says `S` is a type of subsets `s ≤ R` that contain `0`, `1`,
and are closed under `(+)` -/
class AddSubmonoidWithOneClass (S : Type*) (R : outParam Type*) [AddMonoidWithOne R]
[SetLike S R] : Prop extends AddSubmonoidClass S R, OneMemClass S R
natCast_mem
theorem
[AddSubmonoidWithOneClass S R] (n : ℕ) : (n : R) ∈ s
@[aesop safe apply (rule_sets := [SetLike])]
theorem natCast_mem [AddSubmonoidWithOneClass S R] (n : ℕ) : (n : R) ∈ s := by
induction n <;> simp [zero_mem, add_mem, one_mem, *]
ofNat_mem
theorem
[AddSubmonoidWithOneClass S R] (s : S) (n : ℕ) [n.AtLeastTwo] : ofNat(n) ∈ s
@[aesop safe apply (rule_sets := [SetLike])]
lemma ofNat_mem [AddSubmonoidWithOneClass S R] (s : S) (n : ℕ) [n.AtLeastTwo] :
ofNat(n)ofNat(n) ∈ s := by
rw [← Nat.cast_ofNat]; exact natCast_mem s n
AddSubmonoidWithOneClass.toAddMonoidWithOne
instance
[AddSubmonoidWithOneClass S R] : AddMonoidWithOne s
instance (priority := 74) AddSubmonoidWithOneClass.toAddMonoidWithOne
[AddSubmonoidWithOneClass S R] : AddMonoidWithOne s :=
{ AddSubmonoidClass.toAddMonoid s with
one := ⟨_, one_mem s⟩
natCast := fun n => ⟨n, natCast_mem s n⟩
natCast_zero := Subtype.ext Nat.cast_zero
natCast_succ := fun _ => Subtype.ext (Nat.cast_succ _) }
SubsemiringClass
structure
(S : Type*) (R : outParam (Type u)) [NonAssocSemiring R]
[SetLike S R] : Prop extends SubmonoidClass S R, AddSubmonoidClass S R
/-- `SubsemiringClass S R` states that `S` is a type of subsets `s ⊆ R` that
are both a multiplicative and an additive submonoid. -/
class SubsemiringClass (S : Type*) (R : outParam (Type u)) [NonAssocSemiring R]
[SetLike S R] : Prop extends SubmonoidClass S R, AddSubmonoidClass S R
SubsemiringClass.addSubmonoidWithOneClass
instance
(S : Type*) (R : Type u) {_ : NonAssocSemiring R} [SetLike S R] [h : SubsemiringClass S R] :
AddSubmonoidWithOneClass S R
instance (priority := 100) SubsemiringClass.addSubmonoidWithOneClass (S : Type*)
(R : Type u) {_ : NonAssocSemiring R} [SetLike S R] [h : SubsemiringClass S R] :
AddSubmonoidWithOneClass S R :=
{ h with }
SubsemiringClass.nonUnitalSubsemiringClass
instance
(S : Type*) (R : Type u) [NonAssocSemiring R] [SetLike S R] [SubsemiringClass S R] : NonUnitalSubsemiringClass S R
instance (priority := 100) SubsemiringClass.nonUnitalSubsemiringClass (S : Type*)
(R : Type u) [NonAssocSemiring R] [SetLike S R] [SubsemiringClass S R] :
NonUnitalSubsemiringClass S R where
mul_mem := mul_mem
SubsemiringClass.toNonAssocSemiring
instance
: NonAssocSemiring s
/-- A subsemiring of a `NonAssocSemiring` inherits a `NonAssocSemiring` structure -/
instance (priority := 75) toNonAssocSemiring : NonAssocSemiring s := fast_instance%
Subtype.coe_injective.nonAssocSemiring Subtype.val rfl rfl (fun _ _ => rfl) (fun _ _ => rfl)
(fun _ _ => rfl) fun _ => rfl
SubsemiringClass.nontrivial
instance
[Nontrivial R] : Nontrivial s
instance nontrivial [Nontrivial R] : Nontrivial s :=
nontrivial_of_ne 0 1 fun H => zero_ne_one (congr_arg Subtype.val H)
SubsemiringClass.noZeroDivisors
instance
[NoZeroDivisors R] : NoZeroDivisors s
instance noZeroDivisors [NoZeroDivisors R] : NoZeroDivisors s :=
Subtype.coe_injective.noZeroDivisors _ rfl fun _ _ => rfl
SubsemiringClass.subtype
definition
: s →+* R
/-- The natural ring hom from a subsemiring of semiring `R` to `R`. -/
def subtype : s →+* R :=
{ SubmonoidClass.subtype s, AddSubmonoidClass.subtype s with toFun := (↑) }
SubsemiringClass.coe_subtype
theorem
: (subtype s : s → R) = ((↑) : s → R)
@[simp]
theorem coe_subtype : (subtype s : s → R) = ((↑) : s → R) :=
rfl
SubsemiringClass.subtype_apply
theorem
(x : s) : SubsemiringClass.subtype s x = x
@[simp]
lemma subtype_apply (x : s) :
SubsemiringClass.subtype s x = x := rfl
SubsemiringClass.subtype_injective
theorem
: Function.Injective (SubsemiringClass.subtype s)
lemma subtype_injective :
Function.Injective (SubsemiringClass.subtype s) := fun _ ↦ by
simp
SubsemiringClass.toSemiring
instance
{R} [Semiring R] [SetLike S R] [SubsemiringClass S R] : Semiring s
/-- A subsemiring of a `Semiring` is a `Semiring`. -/
instance (priority := 75) toSemiring {R} [Semiring R] [SetLike S R] [SubsemiringClass S R] :
Semiring s := fast_instance%
Subtype.coe_injective.semiring Subtype.val rfl rfl (fun _ _ => rfl) (fun _ _ => rfl)
(fun _ _ => rfl) (fun _ _ => rfl) fun _ => rfl
SubsemiringClass.coe_pow
theorem
{R} [Monoid R] [SetLike S R] [SubmonoidClass S R] (x : s) (n : ℕ) : ((x ^ n : s) : R) = (x : R) ^ n
SubsemiringClass.toCommSemiring
instance
{R} [CommSemiring R] [SetLike S R] [SubsemiringClass S R] : CommSemiring s
/-- A subsemiring of a `CommSemiring` is a `CommSemiring`. -/
instance toCommSemiring {R} [CommSemiring R] [SetLike S R] [SubsemiringClass S R] :
CommSemiring s := fast_instance%
Subtype.coe_injective.commSemiring Subtype.val rfl rfl (fun _ _ => rfl) (fun _ _ => rfl)
(fun _ _ => rfl) (fun _ _ => rfl) fun _ => rfl
Subsemiring
structure
(R : Type u) [NonAssocSemiring R] extends Submonoid R, AddSubmonoid R
/-- A subsemiring of a semiring `R` is a subset `s` that is both a multiplicative and an additive
submonoid. -/
structure Subsemiring (R : Type u) [NonAssocSemiring R] extends Submonoid R, AddSubmonoid R
Subsemiring.instSetLike
instance
: SetLike (Subsemiring R) R
instance : SetLike (Subsemiring R) R where
coe s := s.carrier
coe_injective' p q h := by cases p; cases q; congr; exact SetLike.coe_injective' h
Subsemiring.ofClass
definition
{S R : Type*} [NonAssocSemiring R] [SetLike S R] [SubsemiringClass S R] (s : S) : Subsemiring R
/-- The actual `Subsemiring` obtained from an element of a `SubsemiringClass`. -/
@[simps]
def ofClass {S R : Type*} [NonAssocSemiring R] [SetLike S R] [SubsemiringClass S R]
(s : S) : Subsemiring R where
carrier := s
add_mem' := add_mem
zero_mem' := zero_mem _
mul_mem' := mul_mem
one_mem' := one_mem _
Subsemiring.instCanLiftSetCoeAndMemOfNatForallForallForallForallHAddForallForallForallForallHMul
instance
:
CanLift (Set R) (Subsemiring R) (↑)
(fun s ↦ 0 ∈ s ∧ (∀ {x y}, x ∈ s → y ∈ s → x + y ∈ s) ∧ 1 ∈ s ∧ ∀ {x y}, x ∈ s → y ∈ s → x * y ∈ s)
instance (priority := 100) : CanLift (Set R) (Subsemiring R) (↑)
(fun s ↦ 0 ∈ s0 ∈ s ∧ (∀ {x y}, x ∈ s → y ∈ s → x + y ∈ s) ∧ 1 ∈ s ∧
∀ {x y}, x ∈ s → y ∈ s → x * y ∈ s) where
prf s h :=
⟨ { carrier := s
zero_mem' := h.1
add_mem' := h.2.1
one_mem' := h.2.2.1
mul_mem' := h.2.2.2 },
rfl ⟩
Subsemiring.instSubsemiringClass
instance
: SubsemiringClass (Subsemiring R) R
instance : SubsemiringClass (Subsemiring R) R where
zero_mem := zero_mem'
add_mem {s} := AddSubsemigroup.add_mem' s.toAddSubmonoid.toAddSubsemigroup
one_mem {s} := Submonoid.one_mem' s.toSubmonoid
mul_mem {s} := Subsemigroup.mul_mem' s.toSubmonoid.toSubsemigroup
Subsemiring.toNonUnitalSubsemiring
definition
(S : Subsemiring R) : NonUnitalSubsemiring R
/-- Turn a `Subsemiring` into a `NonUnitalSubsemiring` by forgetting that it contains `1`. -/
def toNonUnitalSubsemiring (S : Subsemiring R) : NonUnitalSubsemiring R where __ := S
Subsemiring.mem_toSubmonoid
theorem
{s : Subsemiring R} {x : R} : x ∈ s.toSubmonoid ↔ x ∈ s
@[simp]
theorem mem_toSubmonoid {s : Subsemiring R} {x : R} : x ∈ s.toSubmonoidx ∈ s.toSubmonoid ↔ x ∈ s :=
Iff.rfl
Subsemiring.mem_toNonUnitalSubsemiring
theorem
{S : Subsemiring R} {x : R} : x ∈ S.toNonUnitalSubsemiring ↔ x ∈ S
@[simp]
lemma mem_toNonUnitalSubsemiring {S : Subsemiring R} {x : R} :
x ∈ S.toNonUnitalSubsemiringx ∈ S.toNonUnitalSubsemiring ↔ x ∈ S := .rfl
Subsemiring.mem_carrier
theorem
{s : Subsemiring R} {x : R} : x ∈ s.carrier ↔ x ∈ s
theorem mem_carrier {s : Subsemiring R} {x : R} : x ∈ s.carrierx ∈ s.carrier ↔ x ∈ s :=
Iff.rfl
Subsemiring.coe_toNonUnitalSubsemiring
theorem
(S : Subsemiring R) : (S.toNonUnitalSubsemiring : Set R) = S
@[simp]
lemma coe_toNonUnitalSubsemiring (S : Subsemiring R) : (S.toNonUnitalSubsemiring : Set R) = S := rfl
Subsemiring.ext
theorem
{S T : Subsemiring R} (h : ∀ x, x ∈ S ↔ x ∈ T) : S = T
/-- Two subsemirings are equal if they have the same elements. -/
@[ext]
theorem ext {S T : Subsemiring R} (h : ∀ x, x ∈ Sx ∈ S ↔ x ∈ T) : S = T :=
SetLike.ext h
Subsemiring.copy
definition
(S : Subsemiring R) (s : Set R) (hs : s = ↑S) : Subsemiring R
/-- Copy of a subsemiring with a new `carrier` equal to the old one. Useful to fix definitional
equalities. -/
@[simps coe toSubmonoid]
protected def copy (S : Subsemiring R) (s : Set R) (hs : s = ↑S) : Subsemiring R :=
{ S.toAddSubmonoid.copy s hs, S.toSubmonoid.copy s hs with carrier := s }
Subsemiring.copy_eq
theorem
(S : Subsemiring R) (s : Set R) (hs : s = ↑S) : S.copy s hs = S
theorem copy_eq (S : Subsemiring R) (s : Set R) (hs : s = ↑S) : S.copy s hs = S :=
SetLike.coe_injective hs
Subsemiring.toSubmonoid_injective
theorem
: Function.Injective (toSubmonoid : Subsemiring R → Submonoid R)
theorem toSubmonoid_injective : Function.Injective (toSubmonoid : Subsemiring R → Submonoid R)
| _, _, h => ext (SetLike.ext_iff.mp h :)
Subsemiring.toAddSubmonoid_injective
theorem
: Function.Injective (toAddSubmonoid : Subsemiring R → AddSubmonoid R)
theorem toAddSubmonoid_injective :
Function.Injective (toAddSubmonoid : Subsemiring R → AddSubmonoid R)
| _, _, h => ext (SetLike.ext_iff.mp h :)
Subsemiring.toNonUnitalSubsemiring_injective
theorem
: Function.Injective (toNonUnitalSubsemiring : Subsemiring R → _)
lemma toNonUnitalSubsemiring_injective :
Function.Injective (toNonUnitalSubsemiring : Subsemiring R → _) :=
fun S₁ S₂ h => SetLike.ext'_iff.2 (
show (S₁.toNonUnitalSubsemiring : Set R) = S₂ from SetLike.ext'_iff.1 h)
Subsemiring.toNonUnitalSubsemiring_inj
theorem
{S₁ S₂ : Subsemiring R} : S₁.toNonUnitalSubsemiring = S₂.toNonUnitalSubsemiring ↔ S₁ = S₂
@[simp]
lemma toNonUnitalSubsemiring_inj {S₁ S₂ : Subsemiring R} :
S₁.toNonUnitalSubsemiring = S₂.toNonUnitalSubsemiring ↔ S₁ = S₂ :=
toNonUnitalSubsemiring_injective.eq_iff
Subsemiring.one_mem_toNonUnitalSubsemiring
theorem
(S : Subsemiring R) : (1 : R) ∈ S.toNonUnitalSubsemiring
lemma one_mem_toNonUnitalSubsemiring (S : Subsemiring R) : (1 : R) ∈ S.toNonUnitalSubsemiring :=
S.one_mem
Subsemiring.mk'
definition
(s : Set R) (sm : Submonoid R) (hm : ↑sm = s) (sa : AddSubmonoid R) (ha : ↑sa = s) : Subsemiring R
/-- Construct a `Subsemiring R` from a set `s`, a submonoid `sm`, and an additive
submonoid `sa` such that `x ∈ s ↔ x ∈ sm ↔ x ∈ sa`. -/
@[simps coe]
protected def mk' (s : Set R) (sm : Submonoid R) (hm : ↑sm = s) (sa : AddSubmonoid R)
(ha : ↑sa = s) : Subsemiring R where
carrier := s
zero_mem' := by exact ha ▸ sa.zero_mem
one_mem' := by exact hm ▸ sm.one_mem
add_mem' {x y} := by simpa only [← ha] using sa.add_mem
mul_mem' {x y} := by simpa only [← hm] using sm.mul_mem
Subsemiring.mem_mk'
theorem
{s : Set R} {sm : Submonoid R} (hm : ↑sm = s) {sa : AddSubmonoid R} (ha : ↑sa = s) {x : R} :
x ∈ Subsemiring.mk' s sm hm sa ha ↔ x ∈ s
@[simp]
theorem mem_mk' {s : Set R} {sm : Submonoid R} (hm : ↑sm = s) {sa : AddSubmonoid R} (ha : ↑sa = s)
{x : R} : x ∈ Subsemiring.mk' s sm hm sa hax ∈ Subsemiring.mk' s sm hm sa ha ↔ x ∈ s :=
Iff.rfl
Subsemiring.mk'_toSubmonoid
theorem
{s : Set R} {sm : Submonoid R} (hm : ↑sm = s) {sa : AddSubmonoid R} (ha : ↑sa = s) :
(Subsemiring.mk' s sm hm sa ha).toSubmonoid = sm
@[simp]
theorem mk'_toSubmonoid {s : Set R} {sm : Submonoid R} (hm : ↑sm = s) {sa : AddSubmonoid R}
(ha : ↑sa = s) : (Subsemiring.mk' s sm hm sa ha).toSubmonoid = sm :=
SetLike.coe_injective hm.symm
Subsemiring.mk'_toAddSubmonoid
theorem
{s : Set R} {sm : Submonoid R} (hm : ↑sm = s) {sa : AddSubmonoid R} (ha : ↑sa = s) :
(Subsemiring.mk' s sm hm sa ha).toAddSubmonoid = sa
@[simp]
theorem mk'_toAddSubmonoid {s : Set R} {sm : Submonoid R} (hm : ↑sm = s) {sa : AddSubmonoid R}
(ha : ↑sa = s) : (Subsemiring.mk' s sm hm sa ha).toAddSubmonoid = sa :=
SetLike.coe_injective ha.symm
Subsemiring.one_mem
theorem
: (1 : R) ∈ s
/-- A subsemiring contains the semiring's 1. -/
protected theorem one_mem : (1 : R) ∈ s :=
one_mem s
Subsemiring.zero_mem
theorem
: (0 : R) ∈ s
/-- A subsemiring contains the semiring's 0. -/
protected theorem zero_mem : (0 : R) ∈ s :=
zero_mem s
Subsemiring.mul_mem
theorem
{x y : R} : x ∈ s → y ∈ s → x * y ∈ s
Subsemiring.add_mem
theorem
{x y : R} : x ∈ s → y ∈ s → x + y ∈ s
Subsemiring.toNonAssocSemiring
instance
: NonAssocSemiring s
/-- A subsemiring of a `NonAssocSemiring` inherits a `NonAssocSemiring` structure -/
instance toNonAssocSemiring : NonAssocSemiring s :=
SubsemiringClass.toNonAssocSemiring _
Subsemiring.coe_one
theorem
: ((1 : s) : R) = (1 : R)
Subsemiring.coe_zero
theorem
: ((0 : s) : R) = (0 : R)
Subsemiring.coe_add
theorem
(x y : s) : ((x + y : s) : R) = (x + y : R)
Subsemiring.coe_mul
theorem
(x y : s) : ((x * y : s) : R) = (x * y : R)
Subsemiring.nontrivial
instance
[Nontrivial R] : Nontrivial s
instance nontrivial [Nontrivial R] : Nontrivial s :=
nontrivial_of_ne 0 1 fun H => zero_ne_one (congr_arg Subtype.val H)
Subsemiring.pow_mem
theorem
{R : Type*} [Semiring R] (s : Subsemiring R) {x : R} (hx : x ∈ s) (n : ℕ) : x ^ n ∈ s
Subsemiring.noZeroDivisors
instance
[NoZeroDivisors R] : NoZeroDivisors s
instance noZeroDivisors [NoZeroDivisors R] : NoZeroDivisors s where
eq_zero_or_eq_zero_of_mul_eq_zero {_ _} h :=
(eq_zero_or_eq_zero_of_mul_eq_zero <| Subtype.ext_iff.mp h).imp Subtype.eq Subtype.eq
Subsemiring.toSemiring
instance
{R} [Semiring R] (s : Subsemiring R) : Semiring s
/-- A subsemiring of a `Semiring` is a `Semiring`. -/
instance toSemiring {R} [Semiring R] (s : Subsemiring R) : Semiring s :=
{ s.toNonAssocSemiring, s.toSubmonoid.toMonoid with }
Subsemiring.coe_pow
theorem
{R} [Semiring R] (s : Subsemiring R) (x : s) (n : ℕ) : ((x ^ n : s) : R) = (x : R) ^ n
@[simp, norm_cast]
theorem coe_pow {R} [Semiring R] (s : Subsemiring R) (x : s) (n : ℕ) :
((x ^ n : s) : R) = (x : R) ^ n := by
induction n with
| zero => simp
| succ n ih => simp [pow_succ, ih]
Subsemiring.toCommSemiring
instance
{R} [CommSemiring R] (s : Subsemiring R) : CommSemiring s
/-- A subsemiring of a `CommSemiring` is a `CommSemiring`. -/
instance toCommSemiring {R} [CommSemiring R] (s : Subsemiring R) : CommSemiring s :=
{ s.toSemiring with mul_comm := fun _ _ => Subtype.eq <| mul_comm _ _ }
Subsemiring.subtype
definition
: s →+* R
/-- The natural ring hom from a subsemiring of semiring `R` to `R`. -/
def subtype : s →+* R :=
{ s.toSubmonoid.subtype, s.toAddSubmonoid.subtype with toFun := (↑) }
Subsemiring.subtype_apply
theorem
(x : s) : s.subtype x = x
@[simp]
lemma subtype_apply (x : s) :
s.subtype x = x := rfl
Subsemiring.subtype_injective
theorem
: Function.Injective s.subtype
lemma subtype_injective :
Function.Injective s.subtype :=
Subtype.coe_injective
Subsemiring.coe_subtype
theorem
: ⇑s.subtype = ((↑) : s → R)
@[simp]
theorem coe_subtype : ⇑s.subtype = ((↑) : s → R) :=
rfl
Subsemiring.nsmul_mem
theorem
{x : R} (hx : x ∈ s) (n : ℕ) : n • x ∈ s
Subsemiring.coe_toSubmonoid
theorem
(s : Subsemiring R) : (s.toSubmonoid : Set R) = s
@[simp]
theorem coe_toSubmonoid (s : Subsemiring R) : (s.toSubmonoid : Set R) = s :=
rfl
Subsemiring.coe_carrier_toSubmonoid
theorem
(s : Subsemiring R) : (s.toSubmonoid.carrier : Set R) = s
@[simp]
theorem coe_carrier_toSubmonoid (s : Subsemiring R) : (s.toSubmonoid.carrier : Set R) = s :=
rfl
Subsemiring.mem_toAddSubmonoid
theorem
{s : Subsemiring R} {x : R} : x ∈ s.toAddSubmonoid ↔ x ∈ s
theorem mem_toAddSubmonoid {s : Subsemiring R} {x : R} : x ∈ s.toAddSubmonoidx ∈ s.toAddSubmonoid ↔ x ∈ s :=
Iff.rfl
Subsemiring.coe_toAddSubmonoid
theorem
(s : Subsemiring R) : (s.toAddSubmonoid : Set R) = s
theorem coe_toAddSubmonoid (s : Subsemiring R) : (s.toAddSubmonoid : Set R) = s :=
rfl
Subsemiring.instTop
instance
: Top (Subsemiring R)
/-- The subsemiring `R` of the semiring `R`. -/
instance : Top (Subsemiring R) :=
⟨{ (⊤ : Submonoid R), (⊤ : AddSubmonoid R) with }⟩
Subsemiring.mem_top
theorem
(x : R) : x ∈ (⊤ : Subsemiring R)
@[simp]
theorem mem_top (x : R) : x ∈ (⊤ : Subsemiring R) :=
Set.mem_univ x
Subsemiring.coe_top
theorem
: ((⊤ : Subsemiring R) : Set R) = Set.univ
Subsemiring.instMin
instance
: Min (Subsemiring R)
/-- The inf of two subsemirings is their intersection. -/
instance : Min (Subsemiring R) :=
⟨fun s t =>
{ s.toSubmonoid ⊓ t.toSubmonoid, s.toAddSubmonoid ⊓ t.toAddSubmonoid with carrier := s ∩ t }⟩
Subsemiring.coe_inf
theorem
(p p' : Subsemiring R) : ((p ⊓ p' : Subsemiring R) : Set R) = (p : Set R) ∩ p'
@[simp]
theorem coe_inf (p p' : Subsemiring R) : ((p ⊓ p' : Subsemiring R) : Set R) = (p : Set R) ∩ p' :=
rfl
Subsemiring.mem_inf
theorem
{p p' : Subsemiring R} {x : R} : x ∈ p ⊓ p' ↔ x ∈ p ∧ x ∈ p'
@[simp]
theorem mem_inf {p p' : Subsemiring R} {x : R} : x ∈ p ⊓ p'x ∈ p ⊓ p' ↔ x ∈ p ∧ x ∈ p' :=
Iff.rfl
RingHom.domRestrict
definition
(f : R →+* S) (s : σR) : s →+* S
/-- Restriction of a ring homomorphism to a subsemiring of the domain. -/
def domRestrict (f : R →+* S) (s : σR) : s →+* S :=
f.comp <| SubsemiringClass.subtype s
RingHom.restrict_apply
theorem
(f : R →+* S) {s : σR} (x : s) : f.domRestrict s x = f x
@[simp]
theorem restrict_apply (f : R →+* S) {s : σR} (x : s) : f.domRestrict s x = f x :=
rfl
RingHom.eqLocusS
definition
(f g : R →+* S) : Subsemiring R
/-- The subsemiring of elements `x : R` such that `f x = g x` -/
def eqLocusS (f g : R →+* S) : Subsemiring R :=
{ (f : R →* S).eqLocusM g, (f : R →+ S).eqLocusM g with carrier := { x | f x = g x } }
RingHom.eqLocusS_same
theorem
(f : R →+* S) : f.eqLocusS f = ⊤
@[simp]
theorem eqLocusS_same (f : R →+* S) : f.eqLocusS f = ⊤ :=
SetLike.ext fun _ => eq_self_iff_true _
NonUnitalSubsemiring.toSubsemiring
definition
(S : NonUnitalSubsemiring R) (h1 : 1 ∈ S) : Subsemiring R
/-- Turn a non-unital subsemiring containing `1` into a subsemiring. -/
def NonUnitalSubsemiring.toSubsemiring (S : NonUnitalSubsemiring R) (h1 : 1 ∈ S) :
Subsemiring R where
__ := S
one_mem' := h1
Subsemiring.toNonUnitalSubsemiring_toSubsemiring
theorem
(S : Subsemiring R) : S.toNonUnitalSubsemiring.toSubsemiring S.one_mem = S
lemma Subsemiring.toNonUnitalSubsemiring_toSubsemiring (S : Subsemiring R) :
S.toNonUnitalSubsemiring.toSubsemiring S.one_mem = S := rfl
NonUnitalSubsemiring.toSubsemiring_toNonUnitalSubsemiring
theorem
(S : NonUnitalSubsemiring R) (h1) : (NonUnitalSubsemiring.toSubsemiring S h1).toNonUnitalSubsemiring = S
lemma NonUnitalSubsemiring.toSubsemiring_toNonUnitalSubsemiring (S : NonUnitalSubsemiring R) (h1) :
(NonUnitalSubsemiring.toSubsemiring S h1).toNonUnitalSubsemiring = S := rfl