我想知道是否有人在Agda中解决以下问题。我想将自然数n
作为参数传递给Agda模块。在这个模块中,我构造了一个带有Fin n
类型参数的函数。当模式与此函数的参数匹配时,我遇到n
可能是zero
的问题,因此类型Fin n
将为空。 Agda不接受Fin n。{/ p>的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
的其他参数。因此,执行需要提供n
作为参数。同时我还需要能够在Fin n
类型的对象上编写模式匹配的函数。任何人都有任何想法我会怎么做?
答案 0 :(得分:2)
Ulf今天一直致力于解决该特定问题。它应该很快落在主人身上。在此期间,您必须定义isZero₁
,其中有问题的变量已被推广,然后用于获取isZero₂
isZero₂ : Fin n → Bool
isZero₂ = isZero₁
因为为更一般的函数写下类型可能有点烦人,所以可以使用C-c C-h
来帮助您生成辅助函数的类型。写isZero
但不填写正文,进入洞中,键入辅助函数的名称以及您希望应用的参数,然后C-c C-h
将生成一个类型为了你。例如,给定源文件:
isZero : Fin n → Bool
isZero = {! auxiliary !}
如果你进入洞并输入C-c C-h
,你就会得到:
auxiliary : ∀ {n} → Fin n → Bool
在AgdaInfo
缓冲区中。