我可以在 Cubical Agda 中使用归纳类型族吗?
Can I use inductive type families in Cubical Agda?
我注意到 Cubical 标准库将 Fin
定义为依赖对而不是索引归纳类型。原因是 Cubical Agda 不完全支持索引归纳类型:https://github.com/agda/cubical/pull/104#discussion_r268476220
一个相关的问题指出模式匹配不适用于归纳族,因为 hcomp
和 transp
尚未在它们上定义:https://github.com/agda/cubical/pull/57#issuecomment-461174095
我定义了 Fin
和 Vec
并编写了一个模式匹配函数,它似乎工作正常:
{-# OPTIONS --cubical --safe #-}
open import Cubical.Foundations.Prelude
open import Cubical.Data.Nat using (ℕ; zero; suc)
private
variable
ℓ : Level
A : Type ℓ
n : ℕ
data Fin : ℕ → Type₀ where
fzero : Fin (suc n)
fsuc : Fin n → Fin (suc n)
data Vec (A : Type ℓ) : ℕ → Type ℓ where
[] : Vec A zero
_∷_ : A → Vec A n → Vec A (suc n)
_[_] : Vec A n → Fin n → A
(x ∷ _) [ fzero ] = x
(_ ∷ xs) [ fsuc n ] = xs [ n ]
p : (1 ∷ (2 ∷ [])) [ fzero ] ≡ 1
p = refl
然而这个问题仍然悬而未决:https://github.com/agda/agda/issues/3733
我想使用 Cubical Agda 以防万一我需要更高的归纳类型或函数扩展性,但我不想放弃 Vec
或 Fin
的索引定义。我不熟悉 Cubical Type Theory 的细节,所以我不知道 hcomp
和 transp
会在哪里被调用。 Cubical Agda 中归纳族的现状如何?如果我避免了某些操作,我还能使用它们吗?
在立方体 agda 中使用归纳族是很好的,模式匹配定义在它们为族的声明构造函数进行计算的意义上起作用。
https://github.com/agda/agda/issues/3733 将解决的限制如下:
像 subst Fin refl fzero
这样的术语不会计算为 fzero
或任何其他构造函数,这也意味着
(x ∷ _) [ subst Fin refl fzero ]
也不会计算为 x
。
我们仍然可以通过substRefl
从库中证明subst Fin refl fzero ≡ fzero
,所以我们也可以证明(x ∷ _) [ subst Fin refl fzero ] ≡ x
。
因此目前是在使用归纳族和处理 subst
和 transport
卡在它们之间的选择,或者以其他方式使用路径编码所有内容并失去良好的模式匹配。
我注意到 Cubical 标准库将 Fin
定义为依赖对而不是索引归纳类型。原因是 Cubical Agda 不完全支持索引归纳类型:https://github.com/agda/cubical/pull/104#discussion_r268476220
一个相关的问题指出模式匹配不适用于归纳族,因为 hcomp
和 transp
尚未在它们上定义:https://github.com/agda/cubical/pull/57#issuecomment-461174095
我定义了 Fin
和 Vec
并编写了一个模式匹配函数,它似乎工作正常:
{-# OPTIONS --cubical --safe #-}
open import Cubical.Foundations.Prelude
open import Cubical.Data.Nat using (ℕ; zero; suc)
private
variable
ℓ : Level
A : Type ℓ
n : ℕ
data Fin : ℕ → Type₀ where
fzero : Fin (suc n)
fsuc : Fin n → Fin (suc n)
data Vec (A : Type ℓ) : ℕ → Type ℓ where
[] : Vec A zero
_∷_ : A → Vec A n → Vec A (suc n)
_[_] : Vec A n → Fin n → A
(x ∷ _) [ fzero ] = x
(_ ∷ xs) [ fsuc n ] = xs [ n ]
p : (1 ∷ (2 ∷ [])) [ fzero ] ≡ 1
p = refl
然而这个问题仍然悬而未决:https://github.com/agda/agda/issues/3733
我想使用 Cubical Agda 以防万一我需要更高的归纳类型或函数扩展性,但我不想放弃 Vec
或 Fin
的索引定义。我不熟悉 Cubical Type Theory 的细节,所以我不知道 hcomp
和 transp
会在哪里被调用。 Cubical Agda 中归纳族的现状如何?如果我避免了某些操作,我还能使用它们吗?
在立方体 agda 中使用归纳族是很好的,模式匹配定义在它们为族的声明构造函数进行计算的意义上起作用。
https://github.com/agda/agda/issues/3733 将解决的限制如下:
像 subst Fin refl fzero
这样的术语不会计算为 fzero
或任何其他构造函数,这也意味着
(x ∷ _) [ subst Fin refl fzero ]
也不会计算为 x
。
我们仍然可以通过substRefl
从库中证明subst Fin refl fzero ≡ fzero
,所以我们也可以证明(x ∷ _) [ subst Fin refl fzero ] ≡ x
。
因此目前是在使用归纳族和处理 subst
和 transport
卡在它们之间的选择,或者以其他方式使用路径编码所有内容并失去良好的模式匹配。