在 Coq 中假设命名空间

Postulating namespaces in Coq

我想要签名,这样我就可以为他们假设居民。在 Agda 中它看起来像这样:

record Foo (A : Set) : Set where
  field
    bar : A
    baz : A → A

postulate assumeFoo : Foo ℕ
open Foo assumeFoo

这种技术的优点是我们可以方便地 assemble 和参数化大量假设理论。

在 Coq 中,我可以将模块作为命名空间打开并假定记录的居民,但我不知道如何对两者进行 both。这可能吗?

Coq 中没有此功能的精确模拟。最接近的是使用类型class。这解决了参数化问题,但不提供相同的命名空间功能。您的示例将变为:

Class Foo (A : Type) := {
  bar : A;
  baz : A -> A
}.

这声明了一个包含两个字段 barbaz 的记录。 Class 命令的特别之处在于 Coq 有一种机制,可以在隐式参数的类型声明为 class 时填充隐式参数。例如,这里是我们如何假设 nat 有一个 Foo 的实例:

Section MySection.

Context {fooNat : Foo nat}.

Check bar.

Check baz bar.

End MySection.

一旦您离开该部分,该部分内的任何定义都会获得一个额外的 fooNat 参数。

您可以参考 Coq manual 以获取更多关于类型classes 的参考资料。