如何在Category
中提供HomCategory
中定义的符号?
Module Type Category.
Parameter Object : Type.
Parameter Arrow : Object -> Object -> Type.
Infix "~>" := Arrow (at level 25) : category_scope.
Open Scope category_scope.
Delimit Scope category_scope with category.
Bind Scope category_scope with Object Arrow.
Variable id : forall a : Object, a ~> a.
...
End Category.
Module HomCategory <: Category.
Definition Object := Type.
Definition Arrow(a b : Object) := a -> b.
Print Scope category_scope. (* Error: Scope category_scope is not declared. *)
...
End HomCategory.
答案 0 :(得分:2)
恐怕没有办法做到这一点。 Coq中模块的状态很奇怪,这意味着Module Type
和具有该类型的东西之间的唯一连接是Coq检查定义是否与签名兼容。模块中的Arrow
声明实际上并不是一流的实体。因此,不应该是在签名中定义的符号与实现之间建立连接的方法。我想到了两种选择:
每当您想要将它们用于新事物时,请重新声明您的注释。
不要将模块用于ad-hoc多态。对于规范结构或类型类,多态操作确实在理论中具有一流的状态,从而更容易定义这样的通用符号。例如,请参阅ssreflect ==
中eqtype
的{{1}}符号定义。