Types Coq中的类型封装

Types Coq中的类型封装,types,module,encapsulation,coq,Types,Module,Encapsulation,Coq,有没有一种方法可以在Coq模块中定义类型,但封装构造函数 我希望模块的客户机能够使用该类型,但不能构造该类型的成员,类似于在OCaml中使用抽象类型可以完成的操作。是。您可以在模块内定义类型并为其指定模块类型: Module Type FOO. Variable t : Type. End FOO. Module Foo : FOO. Inductive typ := | T : typ. Definition t := typ. End Foo. (* This fails *)

有没有一种方法可以在Coq模块中定义类型,但封装构造函数


我希望模块的客户机能够使用该类型,但不能构造该类型的成员,类似于在OCaml中使用抽象类型可以完成的操作。

是。您可以在模块内定义类型并为其指定模块类型:

Module Type FOO.

Variable t : Type.

End FOO.

Module Foo : FOO.

Inductive typ :=
| T : typ.

Definition t := typ.

End Foo.

(* This fails *)
Check Foo.T.
另一种可能是将模块类型声明为依赖记录,并通过适当的实现参数化您的开发,例如

Record FOO := { t : Type }.

Section Defs.

Variable Foo : FOO.

(* Code ... *)

End Defs.

(* Instantiate FOO *)

Definition Foo := {| t := nat |}.
严格地说,这不会隐藏类型的构造函数,但只要客户机只是使用接口编写定义,它们就无法引用您的具体实现