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

.vo文件是如何构造的,以便coqchk可以使用它?,coq,file-format,Coq,File Format,参考手册()指出coqchk将获取.vo文件的列表,并键入生成这些文件的.v文件中的任何内容。一个(可能)不太可靠的来源指出.vo文件不包含完整的证明术语。因此产生了这样的问题:vo文件包含什么?coqchk如何使用该信息进行类型检查 A.vo文件包含完整的定义和证明术语。我相信它还包括参考手册中提到的“非逻辑信息”(例如,符号和策略),以便在从coqtop加载库时使用 另一方面,.vio文件(由coqc-quick生成)只包含定义,而不包含完整的证明术语。.vo文件包含某些核心结构的“封送”视

参考手册()指出coqchk将获取.vo文件的列表,并键入生成这些文件的.v文件中的任何内容。一个(可能)不太可靠的来源指出.vo文件不包含完整的证明术语。因此产生了这样的问题:vo文件包含什么?coqchk如何使用该信息进行类型检查

A
.vo
文件包含完整的定义和证明术语。我相信它还包括参考手册中提到的“非逻辑信息”(例如,符号和策略),以便在从
coqtop
加载库时使用


另一方面,
.vio
文件(由
coqc-quick
生成)只包含定义,而不包含完整的证明术语。

.vo
文件包含某些核心结构的“封送”视图,主要是
Libobject
表的副本,其中包含任意模块级信息,如符号,声明等。。。是OCaml编译器提供的二进制级别的序列化格式,因此,
.vo
文件在不同的Coq版本之间往往不兼容。存储在
Libobject
中的任何次要数据结构中的任何细微更改都会产生问题

为了避免问题,使用校验和。OCaml编译器共享这种方法来生成其
.cmo
文件

要了解更多详细信息,我建议您查看负责保存
.vo
,在这里您可以跟踪写入磁盘的确切表。正如您所提到的,“不透明”校样经过特殊处理,因此确实可以保存一个
.vo
文件,而无需它们。这些是所谓的
.vio
文件

特别是,关键对象是
seg_lib
,包含模块携带的所有
lib.lib_对象。如前所述,
lib_对象
基本上是一个
Dyn.t
元素,因此实际上它只能由多态封送器写入/读取。这是Coq
vo
实施的一个弱点(但方便)。虽然使用
Marshal
可以让使用者不必定义繁琐的序列化函数,但另一方面,它的速度很慢,而且最重要的是,有许多对象是不可序列化的,但是类型系统不会发现这个问题

进入检查器后,它只需读取保存的术语,然后再次键入check。它需要与Coq中使用的内部表示保持同步。见:

因此,在这里您可以看到检查器输入了所有库信息,但忽略了相当多的数据类型。模块
Cic
中的类型是检查者将知道的类型,以及必须与Coq保持同步的类型

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