如何解决Agda模块参数不灵活?

时间:2016-04-21 16:03:24

标签: parameters module agda

我想知道是否有人在Agda中解决以下问题。我想将自然数n作为参数传递给Agda模块。在这个模块中,我构造了一个带有Fin n类型参数的函数。当模式与此函数的参数匹配时,我遇到n可能是zero的问题,因此类型Fin n将为空。 Agda不接受Fin n。{/ p>的zerosuc _构造函数

奇怪的是,当你在函数本身中引入原始自然数时,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类型的对象上编写模式匹配的函数。任何人都有任何想法我会怎么做?

1 个答案:

答案 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缓冲区中。