Parameters 如何解决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

我想知道是否有人能解决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 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
来帮助生成辅助函数的类型。Write
isZero
但不填充正文,进入洞中,键入辅助函数的名称和希望应用它的参数,然后
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
生成此类辅助函数的类型