coq - 统一在 Coq 核心类型系统中的作用是什么?

标签 coq dependent-type type-systems theorem-proving unification

在对证明项进行类型检查时,在阐述归纳构造微积分的核心语言后,统一如何发挥作用?

具体来说,在处理传递性和对称性等等式的属性时,我发现在证明诸如 forall x y, x = y -> y = x 之类的语句时,理解变量的统一发生在哪里是很有挑战性的通过 refl x x 进行模式匹配。

附加上下文:我知道在 Coq 的扩展语言中统一是必要的,特别是在引入存在变量并隐式实例化它们时。然而,在查看 Coq 核心类型规则的文档时,我找不到任何明确提及统一的内容。

最佳答案

答案很简单:内核中没有统一。

在您提到的特定情况下,您可以查看一个证明术语,它看起来像这样

fun x y (e : x = y) =>
  match e as e' in _ = y' return y' = x with
    | eq_refl => eq_refl
  end

我特意包含了return子句:这就是有趣的事情发生的地方。该子句绑定(bind)多个变量:一个用于归纳类型的每个索引(这里,等式有一个索引,因此有一个绑定(bind)变量 y' ),另一个额外的变量(这里 e' )用于审查者(术语匹配)上,这里 e )。在每个分支中,这些绑定(bind)变量被给定构造函数的特定索引以及该构造函数本身所替换。例如,对于相等只有一个分支,其中 y'替换为 x (和 e'eq_refl )。如果每个分支都针对其 return 子句的“专用版本”进行类型检查,则整个模式匹配具有从 return 子句获得的类型,方法是将索引的变量替换为检查者的索引,最后一个替换为受审查者本身。

总而言之,这种机制可能看起来像统一,因为它涉及同一依赖类型的不同实例:分支中的一个,以及整个模式匹配的一个。但是,虽然在阐述过程中,Coq 可以使用统一来推断 return 子句(减少用户手动给出的麻烦),但一旦找到合适的子句,就不再有统一了。

关于coq - 统一在 Coq 核心类型系统中的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76561105/

相关文章:

functional-programming - Gallina 和 OCaml 之间是什么关系?

coq - 如何将 rhs 从 coq 中的相等性中拉出来

haskell - 是否可以在运行时分配 KnownNat?

dependent-type - 依赖类型 : enforcing global properties in inductive types

scala - 如何声明必须返回其参数之一的函数的签名? (任何语言*)

OCaml Printf.sprintf

Scala - 提取任一类型参数

coq - Inductive 和 CoInduction 之间的唯一区别是对其使用的格式良好性检查(在 Coq 中)吗?

coq - 有没有更优雅的方式来编写以下 Coq 代码?

scala - 找不到路径相关类型的值