另一个模块中Include M1
的确切语义是什么,比方说M?它与在模块M中执行Import M1
有什么不同?更确切地说,以下命令的语义是什么:
Module Type M := M1 <+ M2 <+ M3.
答案 0 :(得分:5)
总结两种白话命令的语义:
Include M1
(可用于模块的定义或模块类型)要求Coq复制所有字段M1
。因此,它就像一个&#34;复制和粘贴&#34;环境模块内部M1
的内容(分别为模块类型)。Import M1
(也可用于模块或模块类型的定义,但另外需要M1
是一个模块)允许人们使用他们的短标识符来引用M1
的字段(即,无需使用限定标识符M1.field_name
)接下来,语法Module Type M := M1 <+ M2 <+ M3
是以下的快捷方式:
Module Type M.
Include M1.
Include M2.
Include M3.
End M.
Coq参考手册的相关部分为Sect. 2.5.1 (Include),Sect. 2.5.8 (Import),您可能还需要查看Export命令({{1}的变体}})。
如果在某些时候你在Import
和Include
之间犹豫不决,你应该首先尝试使用Import
,因为它会产生更轻的效果(它赢得了#39} ; t克隆指定模块的内容,但只定义较短的名称。)
最后,下面是两个综合示例,说明了Coq中模块,模块类型和仿函数的使用以及命令Import
和Include
:
Import
我记得Compute是(********************************************)
(* Example involving a parameterized module *)
(********************************************)
(* A signature *)
Module Type MT.
Parameter t : Type.
End MT.
(* A bigger signature *)
Module Type MT1.
Include MT.
Parameter u : t.
Parameter f : t -> t.
End MT1.
(* A parameterized module *)
Module F1 (M1 : MT1).
Import M1. (* => we can now write f rather than M1.f *)
Definition fu := f u.
End F1.
(* A module implementing MT1 *)
Module M1 <: MT1. (* => check the signature but don't make the module opaque *)
Definition t := nat.
Definition u := O.
Definition f := S.
End M1.
(* Instantiation *)
Module FM1 := F1 M1.
Compute FM1.fu.
Eval vm_compute in