Parameters 如何解决Agda模块参数不灵活的问题?
我想知道是否有人能解决Agda中的以下问题。我想将自然数Parameters 如何解决Agda模块参数不灵活的问题?,parameters,module,agda,Parameters,Module,Agda,我想知道是否有人能解决Agda中的以下问题。我想将自然数n作为参数传递给Agda模块。在这个模块中,我构造了一个函数,该函数采用Fin n类型的参数。当模式匹配此函数的参数时,我遇到了一个问题,n可能是0,因此类型Fin n将为空。Agda将不接受Fin n n的zero和suc构造函数 奇怪的是,当您在函数本身中引入原始自然数时,Agda似乎没有这个问题,并且函数编译得很好 下面是一个简单的例子: open import Data.Nat open import Data.Fin open i
n
作为参数传递给Agda模块。在这个模块中,我构造了一个函数,该函数采用Fin n
类型的参数。当模式匹配此函数的参数时,我遇到了一个问题,n
可能是0
,因此类型Fin n
将为空。Agda将不接受Fin n n的zero
和suc
构造函数
奇怪的是,当您在函数本身中引入原始自然数时,Agda似乎没有这个问题,并且函数编译得很好
下面是一个简单的例子:
open import Data.Nat
open import Data.Fin
open import Data.Bool
module Test (n : ℕ) where
-- Compiles
isZero₁ : ∀ {m : ℕ} → Fin m → Bool
isZero₁ zero = true
isZero₁ (suc _) = false
-- Does not compile with error: "suc n₁ != n of
-- type ℕ when checking that the pattern zero has type Fin n"
isZero₂ : Fin n → Bool
isZero₂ zero = true
isZero₂ (suc _) = false
在实际模块中,我传入5个其他参数,这些参数取决于n
。因此,Ido需要提供n
作为参数。同时,我还需要能够在类型为finn
的对象上编写模式匹配的函数。有人知道我该怎么做吗?今天一直在为那个特定的问题制定解决方案。它很快就会降落到主人那里。同时,您必须将定义为零₁
其中所讨论的变量已泛化,然后用于获取为零₂代码>
isZero₂ : Fin n → Bool
isZero₂ = isZero₁
因为为更一般的函数写下类型可能有点烦人,所以可以使用C-C-h
来帮助生成辅助函数的类型。WriteisZero
但不填充正文,进入洞中,键入辅助函数的名称和希望应用它的参数,然后C-C-h
将为您生成一个类型。例如,给定源文件:
isZero : Fin n → Bool
isZero = {! auxiliary !}
如果您进入孔中并键入C-C-h
,您将得到:
auxiliary : ∀ {n} → Fin n → Bool
在AgdaInfo
缓冲区中。正在定义为零₂就而言,code>为零₁代码>不是选项?为零₁ 零=…
与为零相同₁ {suc m}zero=…
。你将如何重写isZero₂代码>以同样的方式<代码>n
在为零时是免费的₂代码>和。@user3237465为零₂ = 零₁ {n}
。我不知道你的实际代码是什么样子,这就是我为什么要问的。你也可以试试“isZero I with n”很高兴知道它正在开发中!我想我会按照你和@Vitus的建议,用第一个来定义第二个。由于所有额外的参数,都是零,所以它并不理想₁代码>非常混乱,但现在就可以了。谢谢@user2667523我编辑了答案,解释了如何使用C-C-h
生成此类辅助函数的类型