我想签名,以便我可以为他们假设居民。在Agda中,它看起来像这样:
record Foo (A : Set) : Set where
field
bar : A
baz : A → A
postulate assumeFoo : Foo ℕ
open Foo assumeFoo
这种技术的优点是我们可以方便地组装和参数化大量的假设理论。
在Coq中,我可以打开模块作为命名空间并假设记录的居民,但不知道如何做两个。这可能吗?
答案 0 :(得分:3)
Coq中没有这个功能的确切类似物。你可以得到的最接近的是使用类型类。这解决了参数化问题,但没有提供相同的命名空间功能。你的例子将成为:
Class Foo (A : Type) := {
bar : A;
baz : A -> A
}.
这声明了包含两个字段bar
和baz
的记录。 Class
命令的特殊之处在于Coq有一种机制,用于在类型被声明为类时填充隐式参数。例如,以下是我们假设nat
的实例为Foo
的方式:
Section MySection.
Context {fooNat : Foo nat}.
Check bar.
Check baz bar.
End MySection.
一旦离开该部分,该部分内的任何定义都将获得额外的fooNat
参数。
您可以参考Coq manual获取有关类型类的更多参考资料。