.vo文件是如何构建的,以便coqchk可以使用它?

时间:2018-02-18 06:30:02

标签: coq file-format

参考手册(Section 14.4)表示coqchk将获取.vo文件列表并键入检查生成它们的.v文件中的内容。 (可能)不太可靠的来源表明.vo文件不包含完整的证明条款。因此问题:.vo文件包含什么? coqchk如何使用该信息执行类型检查?

2 个答案:

答案 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生成)仅包含定义而非完整的证据条款。