有没有更方便的方法来使用嵌套记录?

时间:2016-09-05 22:09:49

标签: record agda

正如我所说before,我在图书馆工作,关于代数,矩阵和范畴理论。我已经分解了塔中的代数结构"记录类型,每个记录类型代表一个代数结构。例如,为了指定一个monoid,我们首先定义一个半群并定义一个可交换的monoid,我们使用monoid定义,遵循与Agda标准库相同的模式。

我的麻烦在于,当我需要一个深入另一个属性的代数结构的属性时(例如属于Monoid的{​​{1}}的属性),我们需要使用一些预测等于所需的代数结构深度。

作为我的问题的一个例子,请考虑以下"引理":

CommutativeSemiring

注意,为了访问monoid的左侧身份属性,我需要从位于交换半环结构中的交换monoid内的monoid投影它。

我担心的是,随着我添加越来越多的代数结构,这样的引理会变得难以理解。

我的问题是:是否存在可以避免这种情况的模式或伎俩" ladder"记录预测?

对此非常欢迎。

1 个答案:

答案 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字段,还包括setoidsemigroupmonoid以及来自rawMonoid的{​​{1}}。反过来,Group中的setoidmonoidrawMonoid来自类似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 ... 重新导出IsGroupIsMonoid重新导出IsMonoid,依此类推。因此,如果您IsSemigroup打开,您仍然可以使用IsAbelianGroup(来自assoc),而无需手动写出整个路径。

最重要的是你可以按如下方式编写你的功能:

IsSemigroup