Description
In the algebra hierarchy, we naturally have this diamond.
CommutativeRing (CR)
/ \
Ring (R) CommutativeSemiring (CSR)
\ /
Semiring (SR)
I shall abbreviate these CR, R, CSR, and SR.
In the standard library, the SR instance for CR comes from the CSR instance. CSR uses the commutativity property to cut down the number of fields of CSR, so we only have fields distribʳ
and zeroˡ
, and the versions on the opposite side follow by commutativity. Via R, this is not a possibility because of the lack of commutativity, so there are full distrib
and zero
fields.
This is causing trouble here. The required isRightSemimodule
field is of type IsRightSemimodule (Ring.semiring ring) m ℓm
, but the natural isRightSemimodule
definition to export is of type IsRightSemimodule (CommutativeSemiring.semiring commutativeSemiring) m ℓm
, because CommutativeRing.semiring = CommutativeSemiring.semiring ∘ CommutativeRing.commutativeSemiring
. These types are not definitionally equal.
I don't understand how conflicts like this are handled further down in the hierarchy (like at AbelianGroup
), but maybe that approach could be replicated successfully. My personal preference would be that the main structures in the hierarchy are unabbreviated, containing redundant lemmas, and we then have smart constructors to avoid explicit redundant proofs. Then, we would get hierarchies like this:
Ring...
|
/---/
|
| /== AbelianGroupˡ
AbelianGroup === AbelianGroupʳ
/ \
Group CommutativeMonoid === CommutativeMonoidˡ (has identityˡ)
\ / \== CommutativeMonoidʳ (has identityʳ)
Monoid
The ===
are where smart constructors go from the abbreviated structure (like CommutativeMonoidˡ
) to the canonical structure in the hierarchy. Abbreviated structures play no part in the hierarchy, and should not be used except from in the smart constructor.