Functional programming Agda中小于n^2情形的可判定等式?

Functional programming Agda中小于n^2情形的可判定等式?,functional-programming,metaprogramming,agda,dependent-type,theorem-proving,Functional Programming,Metaprogramming,Agda,Dependent Type,Theorem Proving,我有一个编程语言AST的数据类型,我想对此进行解释,但是AST有大约10个不同的构造函数 data Term : Set where UnitTerm : Term VarTerm : Var -> Term ... SeqTerm : Term -> Term -> Term 我正在尝试编写一个函数,该函数对于这种语言的语法树具有可判定的等式。理论上这很简单:没有什么太复杂的,只是简单的数据存储在AST中 问题是编写这样一个函数似乎需要大约100个案例:对于

我有一个编程语言AST的数据类型,我想对此进行解释,但是AST有大约10个不同的构造函数

data Term : Set where
  UnitTerm : Term
  VarTerm : Var -> Term
  ...
  SeqTerm : Term -> Term -> Term
我正在尝试编写一个函数,该函数对于这种语言的语法树具有可判定的等式。理论上这很简单:没有什么太复杂的,只是简单的数据存储在AST中

问题是编写这样一个函数似乎需要大约100个案例:对于每个构造函数,有10个案例

  eqDecide : (x : Term) -> (y : Term) -> Dec (x ≡ y)
  eqDecide UnitTerm UnitTerm = yes refl
  eqDecide UnitTerm (VarTerm x) = Generic.no (λ ())
  ...
  eqDecide UnitTerm (SeqTerm t1 t2) = Generic.no (λ ())
  EqDecide (VarTerm x) UnitTerm = Generic.no (λ ())
  ...
问题是,有很多多余的案例。在构造器匹配的第一个模式匹配之后,理想情况下,我可以使用下划线进行匹配,因为不可能有其他构造器可以统一,但我似乎不能这样做

我尝试过用它来推导等式,但失败了:我遇到了严格肯定性的问题,并且遇到了一些我很难调试的一般性错误。也有一些功能,但看起来很不成熟,缺少一些我需要的标准库的东西


人们如何在实践中实现可判定的平等?他们是把100个案子都写下来,还是我错过了一个把戏?这仅仅是一个语言的新奇之处吗?

如果您想避免使用反射,并且在线性数量的情况下仍然证明可判定的相等性,您可以尝试以下方法:

  • 定义函数
    embed:Term→ Nat
    (或其他更容易证明可判定等式的类型,如标记树)
  • 证明你的函数确实是内射的
  • 利用函数是内射函数以及结果类型上的可判定等式这一事实,得出
    s上的可判定等式(例如,请参见标准库中模块
    关系.Nullary.dedicatable
    中的
    通过注入

  • 您的
    术语
    类型看起来非常普通,我很惊讶
    通用
    包不能与之配合使用。你能发布更多关于它如何失败的细节吗?@Cactus,我想这些问题就是本期中描述的问题。jmite,如果还有其他问题,那么请打开更多问题,我很乐意尝试帮助您。你能解释一下为什么Ulf的前奏曲不适合你吗?此外,您可能会尝试请求在Prelude中添加缺少的功能,很可能只需从标准库中复制粘贴即可添加。至于您的问题本身,是的,人们只是倾向于手动编写所有样板文件或使用外部工具生成它。@user3237465:链接的问题是关于数据类型的,其中一些构造函数的参数是“间接归纳的”,对吗?因此,如果他有
    SeqTerm:List Term->Term
    ,那么这个问题就可以适用;但是问题中的例子在
    SeqTerm:Term->Term->Term
    @Cactus中是直接归纳的,是的,但是我假设提到具有严格正性的问题意味着确实存在一些像
    SeqTerm
    这样的非平凡构造函数。对于按原样提供的
    Term
    ,应该没有问题。这正是我在泛型库中所做的,除了
    Nat
    在那里被[描述]
    Term'
    ,所有内容都是自动派生的。另外,我没有找到一个方便的包装器来包装
    通过注入
    来处理命题等式,所以这里是有人感兴趣的例子。似乎我误解了一些东西,并且
    通过注入
    没有任何愚蠢的技巧。