Coq 在实现模块中从模块签名导入符号

Coq 在实现模块中从模块签名导入符号,coq,Coq,如何使类别中定义的符号在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 wit

如何使
类别中定义的符号在
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.
模块类型类别。
参数对象:类型。
参数箭头:对象->对象->类型。
中缀“~>”:=箭头(在25级):类别范围。
打开作用域类别\u作用域。
用类别分隔范围类别。
用对象箭头绑定范围类别\范围。
变量id:forall a:Object,a~>a。
...
最终类别。
模块HomCategory b。
打印范围类别\ U范围。(*错误:范围类别\未声明范围。*)
...
结束HomCategory。

恐怕真的没有办法做到这一点。Coq中模块的状态很奇怪,这意味着
模块类型
和该类型的东西之间的唯一联系是Coq检查定义是否与签名兼容。模块中的
箭头
声明实际上并不是一级实体。因此,在签名中定义的符号和实现之间不应该存在连接。我想到了两种选择:

  • 每次你想把你的符号用于新的东西时,都要重新声明它们

  • 不要将模块用于特殊多态性。对于规范结构或类型类,多态操作在理论上确实具有一流的地位,这使得定义此类泛型符号更加容易。例如,请查看ssreflect:中
    eqtype
    s的
    ==
    符号的定义