Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Record 有没有更方便的方法来使用嵌套记录?_Record_Agda - Fatal编程技术网

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

Record 有没有更方便的方法来使用嵌套记录?,record,agda,Record,Agda,正如我所说的,我在一个图书馆里学习代数、矩阵和范畴论。我将代数结构分解为一个记录类型的“塔”,每个记录类型代表一个代数结构。例如,为了指定一个幺半群,我们首先定义一个半群,为了定义一个交换幺半群,我们使用幺半群定义,遵循与Agda标准库相同的模式 我的问题是,当我需要一个深入于另一个代数结构中的代数结构的属性时(例如,Monoid的属性,它是交换映射的一部分),我们需要使用一些与所需代数结构深度相等的投影 作为我的问题的一个例子,考虑下面的引理: 注意,为了访问幺半群的左恒等式属性,我需要从位于

正如我所说的,我在一个图书馆里学习代数、矩阵和范畴论。我将代数结构分解为一个记录类型的“塔”,每个记录类型代表一个代数结构。例如,为了指定一个幺半群,我们首先定义一个半群,为了定义一个交换幺半群,我们使用幺半群定义,遵循与Agda标准库相同的模式

我的问题是,当我需要一个深入于另一个代数结构中的代数结构的属性时(例如,
Monoid
的属性,它是
交换映射的一部分),我们需要使用一些与所需代数结构深度相等的投影

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

注意,为了访问幺半群的左恒等式属性,我需要从位于交换半环结构中的交换幺半群中的幺半群投影它

我担心的是,随着我添加越来越多的代数结构,这样的引理将变得不可读

我的问题是:是否有一种模式或技巧可以避免记录预测的“阶梯”


这方面的任何线索都是非常受欢迎的。

如果您查看Agda标准库,您会发现对于大多数专门化的代数结构,定义它们的
记录
具有不太专业化的结构
open public
。例如,在中国,我们有:

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
。反过来,
Group
中的
setoid
monoid
rawMonoid
来自类似的
openpublic
——从
monoid
重新导出这些字段

类似地,对于代数属性见证,它们会重新导出不太专业化的版本的字段,例如,在we have中

然后
IsGroup
重新导出
IsMonoid
IsMonoid
重新导出
IsSemigroup
,依此类推。因此,如果您打开了
isbeliangroup
,您仍然可以使用
assoc
(来自
IsSemigroup
),而不必手动写出它的整个路径

底线是您可以按如下方式编写函数:

open CommutativeSemiring CSR hiding (refl)
open import Function using (_⟨_⟩_)

zipWith-replicate-0# : ∀ {n}(xs : Vec Carrier n) → zipWith _+_ (replicate 0#) xs ≡ xs
zipWith-replicate-0# [] = refl
zipWith-replicate-0# (x ∷ xs) = proj₁ +-identity x ⟨ cong₂ _∷_ ⟩ zipWith-replicate-0# xs
record IsAbelianGroup
         {a ℓ} {A : Set a} (≈ : Rel A ℓ)
         (∙ : Op₂ A) (ε : A) (⁻¹ : Op₁ A) : Set (a ⊔ ℓ) where
  -- ... snip ...
  open IsGroup isGroup public
  -- ... snip ...
open CommutativeSemiring CSR hiding (refl)
open import Function using (_⟨_⟩_)

zipWith-replicate-0# : ∀ {n}(xs : Vec Carrier n) → zipWith _+_ (replicate 0#) xs ≡ xs
zipWith-replicate-0# [] = refl
zipWith-replicate-0# (x ∷ xs) = proj₁ +-identity x ⟨ cong₂ _∷_ ⟩ zipWith-replicate-0# xs