Skip to content

Commit 7f3fb79

Browse files
committed
feat: def ofClass and CanLift instances for algebraic subobjects (#23708)
For each algebraic subobject, this creates an `ofClass` definition which takes an element of a `SetLike` with the appropriate hypotheses and turns it into a subobject of this type. This is *not* marked as a coercion (unlike for morphisms). In addition, we provide `CanLift` instances from `Set` to the various subobjects for use in proofs. We already have these declarations for `Submonoid` and `Subgroup`. In addition, there are two very minor housekeeping items that we fix which arose during the creation of this PR. 1. renaming an instance 2. protecting `StarSubalgebra.algebraMap_mem`
1 parent 8db69c0 commit 7f3fb79

File tree

14 files changed

+307
-39
lines changed

14 files changed

+307
-39
lines changed

Mathlib/Algebra/Algebra/NonUnitalSubalgebra.lean

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,29 @@ instance : SetLike (NonUnitalSubalgebra R A) A where
7575
coe s := s.carrier
7676
coe_injective' p q h := by cases p; cases q; congr; exact SetLike.coe_injective h
7777

78+
/-- The actual `NonUnitalSubalgebra` obtained from an element of a type satisfying
79+
`NonUnitalSubsemiringClass` and `SMulMemClass`. -/
80+
@[simps]
81+
def ofClass {S R A : Type*} [CommSemiring R] [NonUnitalNonAssocSemiring A] [Module R A]
82+
[SetLike S A] [NonUnitalSubsemiringClass S A] [SMulMemClass S R A]
83+
(s : S) : NonUnitalSubalgebra R A where
84+
carrier := s
85+
add_mem' := add_mem
86+
zero_mem' := zero_mem _
87+
mul_mem' := mul_mem
88+
smul_mem' := SMulMemClass.smul_mem
89+
90+
instance (priority := 100) : CanLift (Set A) (NonUnitalSubalgebra R A) (↑)
91+
(fun s ↦ 0 ∈ s ∧ (∀ {x y}, x ∈ s → y ∈ s → x + y ∈ s) ∧ (∀ {x y}, x ∈ s → y ∈ s → x * y ∈ s) ∧
92+
∀ (r : R) {x}, x ∈ s → r • x ∈ s) where
93+
prf s h :=
94+
⟨ { carrier := s
95+
zero_mem' := h.1
96+
add_mem' := h.2.1
97+
mul_mem' := h.2.2.1
98+
smul_mem' := h.2.2.2 },
99+
rfl ⟩
100+
78101
instance instNonUnitalSubsemiringClass :
79102
NonUnitalSubsemiringClass (NonUnitalSubalgebra R A) A where
80103
add_mem {s} := s.add_mem'

Mathlib/Algebra/Algebra/Subalgebra/Basic.lean

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,40 @@ instance : SetLike (Subalgebra R A) A where
3939
coe s := s.carrier
4040
coe_injective' p q h := by cases p; cases q; congr; exact SetLike.coe_injective' h
4141

42-
instance SubsemiringClass : SubsemiringClass (Subalgebra R A) A where
42+
initialize_simps_projections Subalgebra (carrier → coe, as_prefix coe)
43+
44+
/-- The actual `Subalgebra` obtained from an element of a type satisfying `SubsemiringClass` and
45+
`SMulMemClass`. -/
46+
@[simps]
47+
def ofClass {S R A : Type*} [CommSemiring R] [Semiring A] [Algebra R A]
48+
[SetLike S A] [SubsemiringClass S A] [SMulMemClass S R A] (s : S) :
49+
Subalgebra R A where
50+
carrier := s
51+
add_mem' := add_mem
52+
zero_mem' := zero_mem _
53+
mul_mem' := mul_mem
54+
one_mem' := one_mem _
55+
algebraMap_mem' r :=
56+
Algebra.algebraMap_eq_smul_one (A := A) r ▸ SMulMemClass.smul_mem r (one_mem s)
57+
58+
instance (priority := 100) : CanLift (Set A) (Subalgebra R A) (↑)
59+
(fun s ↦ (∀ {x y}, x ∈ s → y ∈ s → x + y ∈ s) ∧
60+
(∀ {x y}, x ∈ s → y ∈ s → x * y ∈ s) ∧ ∀ (r : R), algebraMap R A r ∈ s) where
61+
prf s h :=
62+
⟨ { carrier := s
63+
zero_mem' := by simpa using h.2.2 0
64+
add_mem' := h.1
65+
one_mem' := by simpa using h.2.2 1
66+
mul_mem' := h.2.1
67+
algebraMap_mem' := h.2.2 },
68+
rfl ⟩
69+
70+
instance : SubsemiringClass (Subalgebra R A) A where
4371
add_mem {s} := add_mem (s := s.toSubsemiring)
4472
mul_mem {s} := mul_mem (s := s.toSubsemiring)
4573
one_mem {s} := one_mem s.toSubsemiring
4674
zero_mem {s} := zero_mem s.toSubsemiring
4775

48-
initialize_simps_projections Subalgebra (carrier → coe, as_prefix coe)
49-
5076
@[simp]
5177
theorem mem_toSubsemiring {S : Subalgebra R A} {x} : x ∈ S.toSubsemiring ↔ x ∈ S :=
5278
Iff.rfl
@@ -157,7 +183,7 @@ lemma one_mem_toNonUnitalSubalgebra (S : Subalgebra R A) : (1 : A) ∈ S.toNonUn
157183
S.one_mem
158184

159185
instance {R A : Type*} [CommRing R] [Ring A] [Algebra R A] : SubringClass (Subalgebra R A) A :=
160-
{ Subalgebra.SubsemiringClass with
186+
{ Subalgebra.instSubsemiringClass with
161187
neg_mem := fun {S x} hx => neg_one_smul R x ▸ S.smul_mem hx _ }
162188

163189
protected theorem neg_mem {R : Type u} {A : Type v} [CommRing R] [Ring A] [Algebra R A]

Mathlib/Algebra/Group/Subgroup/Defs.lean

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -286,12 +286,6 @@ add_decl_doc AddSubgroup.toAddSubmonoid
286286

287287
namespace Subgroup
288288

289-
/-- The actual `Subgroup` obtained from an element of a `SubgroupClass` -/
290-
@[to_additive "The actual `AddSubgroup` obtained from an element of a `AddSubgroupClass`"]
291-
def ofClass {S G : Type*} [Group G] [SetLike S G] [SubgroupClass S G]
292-
(s : S) : Subgroup G :=
293-
⟨⟨⟨s, MulMemClass.mul_mem⟩, OneMemClass.one_mem s⟩, InvMemClass.inv_mem⟩
294-
295289
@[to_additive]
296290
instance : SetLike (Subgroup G) G where
297291
coe s := s.carrier
@@ -300,8 +294,18 @@ instance : SetLike (Subgroup G) G where
300294
obtain ⟨⟨⟨hq,_⟩,_⟩,_⟩ := q
301295
congr
302296

297+
initialize_simps_projections Subgroup (carrier → coe, as_prefix coe)
298+
initialize_simps_projections AddSubgroup (carrier → coe, as_prefix coe)
299+
300+
/-- The actual `Subgroup` obtained from an element of a `SubgroupClass` -/
301+
@[to_additive (attr := simps) "The actual `AddSubgroup` obtained from an element of a
302+
`AddSubgroupClass`"]
303+
def ofClass {S G : Type*} [Group G] [SetLike S G] [SubgroupClass S G]
304+
(s : S) : Subgroup G :=
305+
⟨⟨⟨s, MulMemClass.mul_mem⟩, OneMemClass.one_mem s⟩, InvMemClass.inv_mem⟩
306+
303307
@[to_additive]
304-
instance : CanLift (Set G) (Subgroup G) (↑)
308+
instance (priority := 100) : CanLift (Set G) (Subgroup G) (↑)
305309
(fun s ↦ 1 ∈ s ∧ (∀ {x y}, x ∈ s → y ∈ s → x * y ∈ s) ∧ ∀ {x}, x ∈ s → x⁻¹ ∈ s) where
306310
prf s h := ⟨{ carrier := s, one_mem' := h.1, mul_mem' := h.2.1, inv_mem' := h.2.2}, rfl⟩
307311

@@ -333,9 +337,6 @@ theorem mk_le_mk {s t : Set G} (h_one) (h_mul) (h_inv) (h_one') (h_mul') (h_inv'
333337
mk ⟨⟨s, h_one⟩, h_mul⟩ h_inv ≤ mk ⟨⟨t, h_one'⟩, h_mul'⟩ h_inv' ↔ s ⊆ t :=
334338
Iff.rfl
335339

336-
initialize_simps_projections Subgroup (carrier → coe, as_prefix coe)
337-
initialize_simps_projections AddSubgroup (carrier → coe, as_prefix coe)
338-
339340
@[to_additive (attr := simp)]
340341
theorem coe_toSubmonoid (K : Subgroup G) : (K.toSubmonoid : Set G) = K :=
341342
rfl

Mathlib/Algebra/Group/Submonoid/Defs.lean

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -122,18 +122,22 @@ theorem pow_mem {M A} [Monoid M] [SetLike A M] [SubmonoidClass A M] {S : A} {x :
122122

123123
namespace Submonoid
124124

125-
/-- The actual `Submonoid` obtained from an element of a `SubmonoidClass` -/
126-
@[to_additive "The actual `AddSubmonoid` obtained from an element of a `AddSubmonoidClass`"]
127-
def ofClass {S M : Type*} [Monoid M] [SetLike S M] [SubmonoidClass S M] (s : S) : Submonoid M :=
128-
⟨⟨s, MulMemClass.mul_mem⟩, OneMemClass.one_mem s⟩
129-
130125
@[to_additive]
131126
instance : SetLike (Submonoid M) M where
132127
coe s := s.carrier
133128
coe_injective' p q h := by cases p; cases q; congr; exact SetLike.coe_injective' h
134129

130+
initialize_simps_projections Submonoid (carrier → coe, as_prefix coe)
131+
initialize_simps_projections AddSubmonoid (carrier → coe, as_prefix coe)
132+
133+
/-- The actual `Submonoid` obtained from an element of a `SubmonoidClass` -/
134+
@[to_additive (attr := simps) "The actual `AddSubmonoid` obtained from an element of a
135+
`AddSubmonoidClass`"]
136+
def ofClass {S M : Type*} [Monoid M] [SetLike S M] [SubmonoidClass S M] (s : S) : Submonoid M :=
137+
⟨⟨s, MulMemClass.mul_mem⟩, OneMemClass.one_mem s⟩
138+
135139
@[to_additive]
136-
instance : CanLift (Set M) (Submonoid M) (↑)
140+
instance (priority := 100) : CanLift (Set M) (Submonoid M) (↑)
137141
(fun s ↦ 1 ∈ s ∧ ∀ {x y}, x ∈ s → y ∈ s → x * y ∈ s) where
138142
prf s h := ⟨{ carrier := s, one_mem' := h.1, mul_mem' := h.2 }, rfl⟩
139143

@@ -142,9 +146,6 @@ instance : SubmonoidClass (Submonoid M) M where
142146
one_mem := Submonoid.one_mem'
143147
mul_mem {s} := s.mul_mem'
144148

145-
initialize_simps_projections Submonoid (carrier → coe, as_prefix coe)
146-
initialize_simps_projections AddSubmonoid (carrier → coe, as_prefix coe)
147-
148149
@[to_additive (attr := simp)]
149150
theorem mem_toSubsemigroup {s : Submonoid M} {x : M} : x ∈ s.toSubsemigroup ↔ x ∈ s :=
150151
Iff.rfl

Mathlib/Algebra/Group/Subsemigroup/Defs.lean

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,23 @@ namespace Subsemigroup
9494
instance : SetLike (Subsemigroup M) M :=
9595
⟨Subsemigroup.carrier, fun p q h => by cases p; cases q; congr⟩
9696

97-
@[to_additive]
98-
instance : MulMemClass (Subsemigroup M) M where mul_mem := fun {_ _ _} => Subsemigroup.mul_mem' _
99-
10097
initialize_simps_projections Subsemigroup (carrier → coe, as_prefix coe)
10198
initialize_simps_projections AddSubsemigroup (carrier → coe, as_prefix coe)
10299

100+
/-- The actual `Subsemigroup` obtained from an element of a `MulMemClass`. -/
101+
@[to_additive (attr := simps) "The actual `AddSubsemigroup` obtained from an element of a
102+
`AddMemClass`"]
103+
def ofClass {S M : Type*} [Mul M] [SetLike S M] [MulMemClass S M] (s : S) : Subsemigroup M :=
104+
⟨s, MulMemClass.mul_mem⟩
105+
106+
@[to_additive]
107+
instance (priority := 100) : CanLift (Set M) (Subsemigroup M) (↑)
108+
(fun s ↦ ∀ {x y}, x ∈ s → y ∈ s → x * y ∈ s) where
109+
prf s h := ⟨{ carrier := s, mul_mem' := h }, rfl⟩
110+
111+
@[to_additive]
112+
instance : MulMemClass (Subsemigroup M) M where mul_mem := fun {_ _ _} => Subsemigroup.mul_mem' _
113+
103114
@[to_additive (attr := simp)]
104115
theorem mem_carrier {s : Subsemigroup M} {x : M} : x ∈ s.carrier ↔ x ∈ s :=
105116
Iff.rfl

Mathlib/Algebra/Module/Submodule/Defs.lean

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,33 @@ instance setLike : SetLike (Submodule R M) M where
5151
coe s := s.carrier
5252
coe_injective' p q h := by cases p; cases q; congr; exact SetLike.coe_injective' h
5353

54+
initialize_simps_projections Submodule (carrier → coe, as_prefix coe)
55+
56+
/-- The actual `Submodule` obtained from an element of a `SMulMemClass` and `AddSubmonoidClass`. -/
57+
@[simps]
58+
def ofClass {S R M : Type*} [Semiring R] [AddCommMonoid M] [Module R M] [SetLike S M]
59+
[AddSubmonoidClass S M] [SMulMemClass S R M] (s : S) : Submodule R M where
60+
carrier := s
61+
add_mem' := add_mem
62+
zero_mem' := zero_mem _
63+
smul_mem' := SMulMemClass.smul_mem
64+
65+
instance (priority := 100) : CanLift (Set M) (Submodule R M) (↑)
66+
(fun s ↦ 0 ∈ s ∧ (∀ {x y}, x ∈ s → y ∈ s → x + y ∈ s) ∧ ∀ (r : R) {x}, x ∈ s → r • x ∈ s) where
67+
prf s h :=
68+
⟨ { carrier := s
69+
zero_mem' := h.1
70+
add_mem' := h.2.1
71+
smul_mem' := h.2.2 },
72+
rfl ⟩
73+
5474
instance addSubmonoidClass : AddSubmonoidClass (Submodule R M) M where
5575
zero_mem _ := AddSubmonoid.zero_mem' _
5676
add_mem := AddSubsemigroup.add_mem' _
5777

5878
instance smulMemClass : SMulMemClass (Submodule R M) R M where
5979
smul_mem {s} c _ h := SubMulAction.smul_mem' s.toSubMulAction c h
6080

61-
initialize_simps_projections Submodule (carrier → coe, as_prefix coe)
62-
6381
@[simp]
6482
theorem mem_toAddSubmonoid (p : Submodule R M) (x : M) : x ∈ p.toAddSubmonoid ↔ x ∈ p :=
6583
Iff.rfl

Mathlib/Algebra/Ring/Subring/Defs.lean

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,15 +164,38 @@ instance : SetLike (Subring R) R where
164164
coe s := s.carrier
165165
coe_injective' p q h := by cases p; cases q; congr; exact SetLike.ext' h
166166

167+
initialize_simps_projections Subring (carrier → coe, as_prefix coe)
168+
169+
/-- The actual `Subring` obtained from an element of a `SubringClass`. -/
170+
@[simps]
171+
def ofClass {S R : Type*} [Ring R] [SetLike S R] [SubringClass S R]
172+
(s : S) : Subring R where
173+
carrier := s
174+
add_mem' := add_mem
175+
zero_mem' := zero_mem _
176+
mul_mem' := mul_mem
177+
neg_mem' := neg_mem
178+
one_mem' := one_mem _
179+
180+
instance (priority := 100) : CanLift (Set R) (Subring R) (↑)
181+
(fun s ↦ 0 ∈ s ∧ (∀ {x y}, x ∈ s → y ∈ s → x + y ∈ s) ∧ 1 ∈ s ∧
182+
(∀ {x y}, x ∈ s → y ∈ s → x * y ∈ s) ∧ ∀ {x}, x ∈ s → -x ∈ s) where
183+
prf s h :=
184+
⟨ { carrier := s
185+
zero_mem' := h.1
186+
add_mem' := h.2.1
187+
one_mem' := h.2.2.1
188+
mul_mem' := h.2.2.2.1
189+
neg_mem' := h.2.2.2.2 },
190+
rfl ⟩
191+
167192
instance : SubringClass (Subring R) R where
168193
zero_mem s := s.zero_mem'
169194
add_mem {s} := s.add_mem'
170195
one_mem s := s.one_mem'
171196
mul_mem {s} := s.mul_mem'
172197
neg_mem {s} := s.neg_mem'
173198

174-
initialize_simps_projections Subring (carrier → coe, as_prefix coe)
175-
176199
/-- Turn a `Subring` into a `NonUnitalSubring` by forgetting that it contains `1`. -/
177200
def toNonUnitalSubring (S : Subring R) : NonUnitalSubring R where __ := S
178201

Mathlib/Algebra/Ring/Subsemiring/Defs.lean

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,14 +139,35 @@ instance : SetLike (Subsemiring R) R where
139139
coe s := s.carrier
140140
coe_injective' p q h := by cases p; cases q; congr; exact SetLike.coe_injective' h
141141

142+
initialize_simps_projections Subsemiring (carrier → coe, as_prefix coe)
143+
144+
/-- The actual `Subsemiring` obtained from an element of a `SubsemiringClass`. -/
145+
@[simps]
146+
def ofClass {S R : Type*} [NonAssocSemiring R] [SetLike S R] [SubsemiringClass S R]
147+
(s : S) : Subsemiring R where
148+
carrier := s
149+
add_mem' := add_mem
150+
zero_mem' := zero_mem _
151+
mul_mem' := mul_mem
152+
one_mem' := one_mem _
153+
154+
instance (priority := 100) : CanLift (Set R) (Subsemiring R) (↑)
155+
(fun s ↦ 0 ∈ s ∧ (∀ {x y}, x ∈ s → y ∈ s → x + y ∈ s) ∧ 1 ∈ s ∧
156+
∀ {x y}, x ∈ s → y ∈ s → x * y ∈ s) where
157+
prf s h :=
158+
⟨ { carrier := s
159+
zero_mem' := h.1
160+
add_mem' := h.2.1
161+
one_mem' := h.2.2.1
162+
mul_mem' := h.2.2.2 },
163+
rfl ⟩
164+
142165
instance : SubsemiringClass (Subsemiring R) R where
143166
zero_mem := zero_mem'
144167
add_mem {s} := AddSubsemigroup.add_mem' s.toAddSubmonoid.toAddSubsemigroup
145168
one_mem {s} := Submonoid.one_mem' s.toSubmonoid
146169
mul_mem {s} := Subsemigroup.mul_mem' s.toSubmonoid.toSubsemigroup
147170

148-
initialize_simps_projections Subsemiring (carrier → coe, as_prefix coe)
149-
150171
/-- Turn a `Subsemiring` into a `NonUnitalSubsemiring` by forgetting that it contains `1`. -/
151172
def toNonUnitalSubsemiring (S : Subsemiring R) : NonUnitalSubsemiring R where __ := S
152173

Mathlib/Algebra/Star/NonUnitalSubalgebra.lean

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,31 @@ instance instSetLike : SetLike (NonUnitalStarSubalgebra R A) A where
115115
coe {s} := s.carrier
116116
coe_injective' p q h := by cases p; cases q; congr; exact SetLike.coe_injective h
117117

118+
/-- The actual `NonUnitalStarSubalgebra` obtained from an element of a type satisfying
119+
`NonUnitalSubsemiringClass`, `SMulMemClass` and `StarMemClass`. -/
120+
@[simps]
121+
def ofClass {S R A : Type*} [CommSemiring R] [NonUnitalNonAssocSemiring A] [Module R A] [Star A]
122+
[SetLike S A] [NonUnitalSubsemiringClass S A] [SMulMemClass S R A] [StarMemClass S A]
123+
(s : S) : NonUnitalStarSubalgebra R A where
124+
carrier := s
125+
add_mem' := add_mem
126+
zero_mem' := zero_mem _
127+
mul_mem' := mul_mem
128+
smul_mem' := SMulMemClass.smul_mem
129+
star_mem' := star_mem
130+
131+
instance (priority := 100) : CanLift (Set A) (NonUnitalStarSubalgebra R A) (↑)
132+
(fun s ↦ 0 ∈ s ∧ (∀ {x y}, x ∈ s → y ∈ s → x + y ∈ s) ∧ (∀ {x y}, x ∈ s → y ∈ s → x * y ∈ s) ∧
133+
(∀ (r : R) {x}, x ∈ s → r • x ∈ s) ∧ ∀ {x}, x ∈ s → star x ∈ s) where
134+
prf s h :=
135+
⟨ { carrier := s
136+
zero_mem' := h.1
137+
add_mem' := h.2.1
138+
mul_mem' := h.2.2.1
139+
smul_mem' := h.2.2.2.1
140+
star_mem' := h.2.2.2.2 },
141+
rfl ⟩
142+
118143
instance instNonUnitalSubsemiringClass :
119144
NonUnitalSubsemiringClass (NonUnitalStarSubalgebra R A) A where
120145
add_mem {s} := s.add_mem'

Mathlib/Algebra/Star/NonUnitalSubsemiring.lean

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,38 @@ section NonUnitalStarSubsemiring
4646

4747
namespace NonUnitalStarSubsemiring
4848

49-
variable {R : Type v} [NonUnitalNonAssocSemiring R] [StarRing R]
50-
51-
instance instSetLike : SetLike (NonUnitalStarSubsemiring R) R where
49+
instance instSetLike {R : Type v} [NonUnitalNonAssocSemiring R] [Star R] :
50+
SetLike (NonUnitalStarSubsemiring R) R where
5251
coe {s} := s.carrier
5352
coe_injective' p q h := by cases p; cases q; congr; exact SetLike.coe_injective h
5453

54+
initialize_simps_projections NonUnitalStarSubsemiring (carrier → coe, as_prefix coe)
55+
56+
variable {R : Type v} [NonUnitalNonAssocSemiring R] [StarRing R]
57+
58+
/-- The actual `NonUnitalStarSubsemiring` obtained from an element of a type satisfying
59+
`NonUnitalSubsemiringClass` and `StarMemClass`. -/
60+
@[simps]
61+
def ofClass {S R : Type*} [NonUnitalNonAssocSemiring R] [StarRing R] [SetLike S R]
62+
[NonUnitalSubsemiringClass S R] [StarMemClass S R] (s : S) : NonUnitalStarSubsemiring R where
63+
carrier := s
64+
add_mem' := add_mem
65+
zero_mem' := zero_mem _
66+
mul_mem' := mul_mem
67+
star_mem' := star_mem
68+
69+
instance (priority := 100) : CanLift (Set R) (NonUnitalStarSubsemiring R) (↑)
70+
(fun s ↦ 0 ∈ s ∧ (∀ {x y}, x ∈ s → y ∈ s → x + y ∈ s) ∧ (∀ {x y}, x ∈ s → y ∈ s → x * y ∈ s) ∧
71+
∀ {x}, x ∈ s → star x ∈ s)
72+
where
73+
prf s h :=
74+
⟨ { carrier := s
75+
zero_mem' := h.1
76+
add_mem' := h.2.1
77+
mul_mem' := h.2.2.1
78+
star_mem' := h.2.2.2 },
79+
rfl ⟩
80+
5581
instance instNonUnitalSubsemiringClass :
5682
NonUnitalSubsemiringClass (NonUnitalStarSubsemiring R) R where
5783
add_mem {s} := s.add_mem'

0 commit comments

Comments
 (0)