正如我所说before,我在图书馆工作,关于代数,矩阵和范畴理论。我已经分解了塔中的代数结构"记录类型,每个记录类型代表一个代数结构。例如,为了指定一个monoid,我们首先定义一个半群并定义一个可交换的monoid,我们使用monoid定义,遵循与Agda标准库相同的模式。
我的麻烦在于,当我需要一个深入另一个属性的代数结构的属性时(例如属于Monoid
的{{1}}的属性),我们需要使用一些预测等于所需的代数结构深度。
作为我的问题的一个例子,请考虑以下"引理":
CommutativeSemiring
注意,为了访问monoid的左侧身份属性,我需要从位于交换半环结构中的交换monoid内的monoid投影它。
我担心的是,随着我添加越来越多的代数结构,这样的引理会变得难以理解。
我的问题是:是否存在可以避免这种情况的模式或伎俩" ladder"记录预测?
对此非常欢迎。
答案 0 :(得分:5)
如果你看一下Agda标准库,你会发现对于大多数专业代数结构来说,定义它们的record
具有不太专业化的结构open public
。例如。在Algebra.AbelianGroup
中,我们有:
record AbelianGroup c ℓ : Set (suc (c ⊔ ℓ)) where
-- ... snip ...
open IsAbelianGroup isAbelianGroup public
group : Group _ _
group = record { isGroup = isGroup }
open Group group public using (setoid; semigroup; monoid; rawMonoid)
-- ... snip ...
因此,AbelianGroup
记录不仅包含可用的AbelianGroup
/ IsAbelianGroup
字段,还包括setoid
,semigroup
和monoid
以及来自rawMonoid
的{{1}}。反过来,Group
中的setoid
,monoid
和rawMonoid
来自类似Group
- 从open public
重新导出这些字段。
同样,对于代数财产证人,他们会重新导出较不专业的版本字段,例如:在IsAbelianGroup
我们有
Monoid
然后record IsAbelianGroup
{a ℓ} {A : Set a} (≈ : Rel A ℓ)
(∙ : Op₂ A) (ε : A) (⁻¹ : Op₁ A) : Set (a ⊔ ℓ) where
-- ... snip ...
open IsGroup isGroup public
-- ... snip ...
重新导出IsGroup
,IsMonoid
重新导出IsMonoid
,依此类推。因此,如果您IsSemigroup
打开,您仍然可以使用IsAbelianGroup
(来自assoc
),而无需手动写出整个路径。
最重要的是你可以按如下方式编写你的功能:
IsSemigroup