Functional programming Agda中小于n^2情形的可判定等式?
我有一个编程语言AST的数据类型,我想对此进行解释,但是AST有大约10个不同的构造函数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个案例:对于
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'
,所有内容都是自动派生的。另外,我没有找到一个方便的包装器来包装通过注入
来处理命题等式,所以这里是有人感兴趣的例子。似乎我误解了一些东西,并且通过注入
没有任何愚蠢的技巧。