【问题标题】:How to get around Agda module parameter inflexibility?如何解决 Agda 模块参数不灵活的问题?
【发布时间】:2016-04-22 20:42:30
【问题描述】:

我想知道是否有人可以解决 Agda 中的以下问题。我想将一个自然数 n 作为参数传递给 Agda 模块。在这个模块中,我构造了一个接受Fin n 类型参数的函数。当模式与此函数的参数匹配时,我得到n 可能是zero 的问题,因此Fin n 类型将为空。 Agda 不会接受 Fin n 的 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 类型对象的函数。有人知道我该怎么做吗?

【问题讨论】:

  • 不能根据isZero₁ 定义isZero₂ 吗?
  • isZero₁ zero = ...isZero₁ {suc m} zero = ... 相同。你将如何以同样的方式重写isZero₂nisZero₂can't become non-free 中是免费的。
  • @user3237465 isZero₂ = isZero₁ {n}。我不知道你的实际代码是什么样的,这就是我问的原因。

标签: parameters module agda


【解决方案1】:

Ulf 今天一直在努力解决该特定问题。它应该很快就会登陆master。同时,您必须定义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 缓冲区中。

【讨论】:

  • 你也可以试试“isZero i with n”
  • 很高兴知道它正在开发中!我想我会按照您和@Vitus 的建议根据第一个定义第二个。这并不理想,因为由于所有额外的参数,isZero₁ 非常混乱,但现在可以了。谢谢!
  • @user2667523 我已经编辑了答案来解释如何使用C-c C-h来生成此类辅助函数的类型。 ;)
猜你喜欢
  • 2019-09-20
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
相关资源
最近更新 更多