在 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
}.
这声明了一个包含两个字段 bar
和 baz
的记录。 Class
命令的特别之处在于 Coq 有一种机制,可以在隐式参数的类型声明为 class 时填充隐式参数。例如,这里是我们如何假设 nat
有一个 Foo
的实例:
Section MySection.
Context {fooNat : Foo nat}.
Check bar.
Check baz bar.
End MySection.
一旦您离开该部分,该部分内的任何定义都会获得一个额外的 fooNat
参数。
您可以参考 Coq manual 以获取更多关于类型classes 的参考资料。
我想要签名,这样我就可以为他们假设居民。在 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
}.
这声明了一个包含两个字段 bar
和 baz
的记录。 Class
命令的特别之处在于 Coq 有一种机制,可以在隐式参数的类型声明为 class 时填充隐式参数。例如,这里是我们如何假设 nat
有一个 Foo
的实例:
Section MySection.
Context {fooNat : Foo nat}.
Check bar.
Check baz bar.
End MySection.
一旦您离开该部分,该部分内的任何定义都会获得一个额外的 fooNat
参数。
您可以参考 Coq manual 以获取更多关于类型classes 的参考资料。