我可以在 Cubical Agda 中使用归纳类型族吗?

Can I use inductive type families in Cubical Agda?

我注意到 Cubical 标准库将 Fin 定义为依赖对而不是索引归纳类型。原因是 Cubical Agda 不完全支持索引归纳类型:https://github.com/agda/cubical/pull/104#discussion_r268476220

一个相关的问题指出模式匹配不适用于归纳族,因为 hcomptransp 尚未在它们上定义:https://github.com/agda/cubical/pull/57#issuecomment-461174095

我定义了 FinVec 并编写了一个模式匹配函数,它似乎工作正常:

{-# 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 以防万一我需要更高的归纳类型或函数扩展性,但我不想放弃 VecFin 的索引定义。我不熟悉 Cubical Type Theory 的细节,所以我不知道 hcomptransp 会在哪里被调用。 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

因此目前是在使用归纳族和处理 substtransport 卡在它们之间的选择,或者以其他方式使用路径编码所有内容并失去良好的模式匹配。