我有一个编程语言的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 (λ ())
...
问题是,有一堆冗余案例。在构造函数匹配的第一个模式匹配之后,理想情况下我可以匹配下划线,因为没有可能的其他构造函数可以统一,但似乎我不能这样做。
我已经尝试过并且未能使用this library来获得相等性:我遇到严格积极性的问题,以及得到一些我很难调试的一般错误。 The Agda Prelude也有一些设施,但看起来很不成熟,缺少标准库所需的一些东西。
人们如何在实践中做出可判断的平等?他们吸吮它,只写了所有100个案例,还是有一个我不知道的伎俩?这只是一个语言新颖性的地方吗?
答案 0 :(得分:2)
如果您想避免使用反射并且仍然在线性数量的情况下证明可判定的相等,您可以尝试以下方法:
embed : Term → Nat
(或更容易证明可判定等式的其他类型,例如带标签的树)。Term
上的可判定的相等性(请参阅模块via-injection
中的Relation.Nullary.Decidable
}标准库)。