为什么一些不相交和详尽的模式不能表示为定义上的等式?

Why can some disjoint and exhaustive patterns not be represented as definitional equalities?

提问人:user11718766 提问时间:10/27/2023 更新时间:10/27/2023 访问量:63

问:

我目前正在阅读 Ulf Norell 的博士论文,他在论文中描述了 Agda 的实现。

在第 2.2 章(第 41 页)中,他关注的是与依赖类型的模式匹配,他指出,有些模式——即使它们是不相交的和详尽的——也不能表示为底层核心类型理论中的定义等式。他用下面的例子来说明这一点:

maj : Bool → Bool → Bool → Bool
maj true  true  true  = true
maj true  false z     = z
maj false y     true  = y
maj x     true  false = x
maj false false false = false

不幸的是,他没有证明或激励这一说法。凭直觉,我认为这是真的,因为我们可能无法真正使用核心理论来“计数”,但我没有找到任何适当的论据来说服我这个陈述的真实性。

这里有人可以解释一下,为什么某些不相交和详尽的模式不能表示为定义等式——也许使用上面的例子?

函数编程 模式匹配 AGDA 依赖类型 理论

评论

1赞 Naïm Favier 10/27/2023
你必须首先在三个参数中的一个上分裂,此时三个中间子句中的一个在定义上将不成立。
0赞 user11718766 10/27/2023
非常感谢您的评论。很抱歉,在理解到底发生了什么方面有点慢。所以你说,当试图证明我们有定义的平等时,我们必须分裂,对吧?所以,假设我们分裂了.然后我们得到 和 .难道不能证明两者在基础类型系统中都是定义相等的吗?如果没有,为什么不呢?xyzmaj true false z = zzmaj true false true = truemaj true false false = false
1赞 Naïm Favier 10/27/2023
不,我的意思是在为函数定义案例树时必须拆分。请看 Jesper 的回答。
1赞 Naïm Favier 10/27/2023
你得到的两个定义等式不足以暗示 ,因为 可能无法计算为 或 。maj true false z = zztruefalse
0赞 user11718766 10/27/2023
哦,我明白。这是有道理的。谢谢:)

答:

1赞 Jesper 10/27/2023 #1

我们在 ESOP 2014 (https://jesper.cx/files/overlapping-and-order-independent-patterns.pdf) 的论文“重叠和顺序无关模式”中对此示例进行了广泛的讨论。

基本上,大多数证明助手通过模式匹配将定义转换为案例树(有时甚至进一步转换为消除器),但是没有办法将函数忠实地表示为案例树。这样做的原因是,案例树迫使你决定首先匹配哪个参数,但是一旦你匹配任何参数,该参数是变量的等式就不再具有定义相等性。maj