.vo文件是如何构造的,以便coqchk可以使用它?
参考手册()指出coqchk将获取.vo文件的列表,并键入生成这些文件的.v文件中的任何内容。一个(可能)不太可靠的来源指出.vo文件不包含完整的证明术语。因此产生了这样的问题:vo文件包含什么?coqchk如何使用该信息进行类型检查 A.vo文件是如何构造的,以便coqchk可以使用它?,coq,file-format,Coq,File Format,参考手册()指出coqchk将获取.vo文件的列表,并键入生成这些文件的.v文件中的任何内容。一个(可能)不太可靠的来源指出.vo文件不包含完整的证明术语。因此产生了这样的问题:vo文件包含什么?coqchk如何使用该信息进行类型检查 A.vo文件包含完整的定义和证明术语。我相信它还包括参考手册中提到的“非逻辑信息”(例如,符号和策略),以便在从coqtop加载库时使用 另一方面,.vio文件(由coqc-quick生成)只包含定义,而不包含完整的证明术语。.vo文件包含某些核心结构的“封送”视
.vo
文件包含完整的定义和证明术语。我相信它还包括参考手册中提到的“非逻辑信息”(例如,符号和策略),以便在从coqtop
加载库时使用
另一方面,
.vio
文件(由coqc-quick
生成)只包含定义,而不包含完整的证明术语。.vo
文件包含某些核心结构的“封送”视图,主要是Libobject
表的副本,其中包含任意模块级信息,如符号,声明等。。。是OCaml编译器提供的二进制级别的序列化格式,因此,.vo
文件在不同的Coq版本之间往往不兼容。存储在Libobject
中的任何次要数据结构中的任何细微更改都会产生问题
为了避免问题,使用校验和。OCaml编译器共享这种方法来生成其.cmo
文件
要了解更多详细信息,我建议您查看负责保存.vo
,在这里您可以跟踪写入磁盘的确切表。正如您所提到的,“不透明”校样经过特殊处理,因此确实可以保存一个.vo
文件,而无需它们。这些是所谓的.vio
文件
特别是,关键对象是seg_lib
,包含模块携带的所有lib.lib_对象。如前所述,lib_对象
基本上是一个Dyn.t
元素,因此实际上它只能由多态封送器写入/读取。这是Coqvo
实施的一个弱点(但方便)。虽然使用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