无法设置具有依赖类型的认证编程

Unable to set up Certified Programming with Dependent Types

我正在使用 Certified Programming with Dependent Types 这本书,但每次我都会发现不同的错误。在我看来,错误是由于 Proof General 的编译过程与本书来源的 makefile 之间的不匹配造成的。

  1. 如果我用 make 编译源代码并尝试 运行 例如 Subset.v 在 Proof-General 我得到:

Error: File /home/usuario/Desktop/Coq/cpdt/src/CpdtTactics.vo has bad magic number 81100 (expected 8600). It is corrupted or was compiled with another version of Coq.

  1. 如果我使用 make clean 清理 makefile 编译文件并尝试继续选项 Coq -> Auto Compilation -> Compile before require 那么它是行:

需要提取。

失败了。最初它因错误而失败:

Error: Unable to locate library Extraction.

但是使用上面的选项启用它会给出类似的东西:

echo "Require Extraction." > /tmp/ProofGeneral-coqQPJTf0.v coqdep -Q /home/usuario/Desktop/Coq/cpdt/src/ -R /home/usuario/Desktop/Coq/cpdt/src Cpdt /tmp/ProofGeneral-coqQPJTf0.v * Warning: in file /tmp/ProofGeneral-coqQPJTf0.v, library Extraction is required and has not been found in the loadpath! * Warning: in file /tmp/ProofGeneral-coqQPJTf0.v, library Extraction is required and has not been found in the loadpath! /tmp/ProofGeneral-coqQPJTf0.vo /tmp/ProofGeneral-coqQPJTf0.glob /tmp/ProofGeneral-coqQPJTf0.v.beautified: /tmp/ProofGeneral-coqQPJTf0.v /tmp/ProofGeneral-coqQPJTf0.vio: /tmp/ProofGeneral-coqQPJTf0.v

我该如何解决这个问题?

附带问题:您正在使用哪个 OS?你靠opam吗?

关于您得到的第一个错误,它肯定来自以下事实:

  • 在 proofgeneral 之外,coqc 二进制对应于 Coq 8.11,而在 ProofGeneral 中,coqtop 二进制对应于 Coq 8.6。可能是因为 PATH 变量在两个上下文中不相同。

  • 要确定找到了哪个二进制文件,您可以在终端 which coqtop 中执行,在 Emacs 中,M-! which coqtop RET 你应该得到不同的路径。

  • 有时,直接从终端 (emacs &) 打开 emacs 可以帮助解决此类问题。

  • 但是如果您想更改 ProofGeneral 中使用的 coqtop 二进制文件,您可以使用以下步骤之一设置 coq-prog-name 选项:

    • 以交互方式,键入 C-u C-c C-x(杀死 Coq),M-: (setq coq-prog-name ".../ coqtop")C-c C-n

    • 或者在项目根目录中创建一个 .dir-locals.el 文件(Emacs 的标准配置文件),其中包含:

      ((coq-mode . ((coq-prog-name . "…/coqtop"))))
      

      和 close/reopen ….v 文件处于危险之中(或者只执行 M-x 正常模式 RETC-x C-v RET 在已经打开的 ….v 缓冲区中)

关于你得到的第二个错误,我有点困惑 Require Extraction 触发了这个错误,因为这个库确实存在于 Coq 8.6 和 8.11 中。

乍一看,我建议用 Coq 8.11 重新测试自动编译,断言 From Coq Require Extraction.(而不仅仅是 Require Extraction.

不过PG的Auto Compilation -> Compile before require功能可能有bug;无论如何,如果需要,请随时在 PG 跟踪器中打开相关问题,非常欢迎错误报告和功能请求:https://github.com/ProofGeneral/PG/issues