[英]Decidable equality in Agda with less than n^2 cases?
我有一个要推理的编程语言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 (λ ())
...
问题是,有一堆多余的情况。 在构造函数匹配的第一个模式匹配之后,理想情况下,我可以与下划线匹配,因为其他任何构造函数都无法统一,但是看来我不能做到这一点。
我尝试使用该库来推导相等性失败,但失败了:我遇到了一些严格的正定性问题,并且遇到了一些我很难调试的常规错误。 Agda Prelude也为此提供了一些功能,但是看起来还很不成熟,并且缺少标准库中我需要的一些东西。
人们在实践中如何实现可判定的平等? 他们吸收了它,只写了全部100个案例,还是我想念的一个窍门? 这只是语言新颖性展现的地方吗?
如果要避免使用反射并仍然在线性情况下证明可判定的相等性,可以尝试以下方法:
embed : Term → Nat
的函数embed : Term → Nat
(或其他更容易证明可确定相等性的其他类型,例如带标签的树)。 Term
上可判定的相等性(例如via-injection
参见标准库中Relation.Nullary.Decidable
模块中的via-injection
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.