在Coq中假设名称空间

时间:2017-03-30 21:08:09

标签: coq agda

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

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

postulate assumeFoo : Foo ℕ
open Foo assumeFoo

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

在Coq中,我可以打开模块作为命名空间并假设记录的居民,但不知道如何做两个。这可能吗?

1 个答案:

答案 0 :(得分:3)

Coq中没有这个功能的确切类似物。你可以得到的最接近的是使用类型类。这解决了参数化问题,但没有提供相同的命名空间功能。你的例子将成为:

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

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

Section MySection.

Context {fooNat : Foo nat}.

Check bar.

Check baz bar.

End MySection.

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

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