参考手册(Section 14.4)表示coqchk将获取.vo文件列表并键入检查生成它们的.v文件中的内容。 (可能)不太可靠的来源表明.vo文件不包含完整的证明条款。因此问题:.vo文件包含什么? coqchk如何使用该信息执行类型检查?
答案 0 :(得分:5)
.vo
个文件包含" marshaled"查看某些核心结构,主要是Libobject
表的副本,其中包含任意模块级信息,如符号,声明等...... Marshaling是由二进制级序列化格式提供的因此,OCaml编译器.vo
文件往往在不同的Coq版本之间不兼容。存储在Libobject
中的任何次要数据结构的任何微小变化都会造成麻烦。
为避免出现问题,使用校验和。 OCaml编译器共享此方法以生成其.cmo
文件。
要了解更多详细信息,建议您查看负责保存.vo
的{{3}},您可以在此处跟踪写入磁盘的确切表。正如你所提到的,"不透明"证明给予了特殊处理,因此确实可以在没有它们的情况下保存.vo
文件。这些是所谓的.vio
文件。
特别是,关键对象是seg_lib
,包含模块所携带的所有Lib.lib_objects
。正如我们之前提到的,lib_object
基本上是Dyn.t
元素,因此事实上它只能由多态编组器编写/读取。这是IMVHO对Coq vo
实施的一个弱点(但很方便)的观点。虽然使用Marshal
使消费者不必定义麻烦的序列化函数,但另一方面,它很慢,最重要的是有许多对象不可序列化,但类型系统不会解决这个问题
进入检查程序后,它只会读取保存的术语并再次进行类型检查。它需要与Coq中使用的内部表示保持同步。见the actual code:
let ch = System.with_magic_number_check raw_intern_library f in
let (sd : Cic.summary_disk), _, digest = marshal_in_segment f ch in
let (md : Cic.library_disk), _, digest = marshal_in_segment f ch in
let (opaque_csts :'a option), _, udg = marshal_in_segment f ch in
let (discharging :'a option), _, _ = marshal_in_segment f ch in
let (tasks : 'a option), _, _ = marshal_in_segment f ch in
let (table : Cic.opaque_table), pos, checksum = marshal_in_segment f ch
所以在这里您可以看到检查器输入所有库信息,但忽略了很多数据类型。模块Cic
中的类型是检查器将要知道的类型,以及必须与Coq保持同步的类型。
答案 1 :(得分:1)
.vo
文件包含完整的定义和证明条款。我相信它还包括参考手册中提到的“非逻辑信息”(例如,符号和策略),以便在从coqtop
加载库时可以使用它。
另一方面,.vio
个文件(由coqc -quick
生成)仅包含定义而非完整的证据条款。