Coq:使用子目录管理项目中的加载路径
我有一个Coq项目,它的库被组织成子目录,比如:Coq:使用子目录管理项目中的加载路径,coq,Coq,我有一个Coq项目,它的库被组织成子目录,比如: …/MyProj/Auxiliary/Aux.v …/MyProj/Main/Main.v (imports Auxiliary/Aux.v) 当我编译文件时,我希望从工作目录MyProj(通过makefile)编译。但是我还想使用Proof General/Coqtop处理文件,在这种情况下,工作目录默认为文件所在的目录 但这意味着两个上下文之间的加载路径不同,因此库导入所需的逻辑路径也不同如何设置coqc调用、加载路径和导入声明,使它们在
…/MyProj/Auxiliary/Aux.v
…/MyProj/Main/Main.v (imports Auxiliary/Aux.v)
当我编译文件时,我希望从工作目录MyProj
(通过makefile)编译。但是我还想使用Proof General/Coqtop处理文件,在这种情况下,工作目录默认为文件所在的目录
但这意味着两个上下文之间的加载路径不同,因此库导入所需的逻辑路径也不同如何设置coqc调用、加载路径和导入声明,使它们在两种上下文中都能工作?
我尝试过的每一种方法都会出错。例如,如果我通过调用
coqc -R "." "MyProj" Auxiliary/Aux.v
并在Main.v
中作为
Require Import MyProj.Auxiliary.Aux.
然后,当我用
coqc -R "." "MyProj" Main/Main.v
但在Coqtop中失败,出现错误:在加载路径中找不到库MyProj.Auxiliary.Aux
。另一方面,如果在要求导入之前添加
Add LoadPath ".." as MyProj.
然后这在Coqtop中工作,但在coqc-R下失败
Error: The file […]/MyProj/Auxiliary/Aux.vo contains library
MyProj.Auxiliary.Aux而不是库MyProj.MyProj.Auxiliary.Aux
我正在寻找一种解决方案,它对于与合作者共享的库(希望最终与用户共享)来说是健壮的,因此它不能使用绝对文件路径。目前我发现最好的方法是添加emacs局部变量,以便在Proof General调用Coqtop时设置加载路径:
((coq-mode . ((coq-prog-args . ("-R" ".." "MyProj" "-emacs")))))
但这(a)似乎有点老套,(b)只适用于一般证明,而不适用于Coqide或普通Coqtop。有更好的解决方案吗?我知道您明确要求提供跨不同平台的解决方案,但是已经有了一个比您现有的解决方案更简单的通用解决方案。Proof General称为coq加载路径
,您可以使用局部变量进行设置,就像您对coq prog args
所做的那样。优点是您不必担心需要传递给coqtop
的任何其他参数(例如示例中的-emacs
)。因此,您的.dir locals.el
文件可以有这样一行:
((coq-mode . ((coq-load-path . ((".." "MyProj"))))))
MyProj/Auxiliary/Aux.v
MyProj/Main/Main.v
不幸的是,我不知道任何跨平台工作的东西,尽管我非常确定CoqIDE必须存在一些特定的东西。如果是这种情况,也许您可以设置一个脚本,使这些配置文件在不同的平台上保持更新?如果您使用coq\u makefile
,您可以在系统中安装库
不含蛋白石
要初始化项目,请执行以下操作:
coq_makefile -f _CoqProject -o Makefile
coq_shell_url="https://raw.githubusercontent.com/gares/opam-coq-shell/master/src/opam-coq"
curl -s "${coq_shell_url}" | bash /dev/stdin init 8.4 # Install Coq and its dependencies
eval `opam config env --switch=coq-shell-8.4` # Setup the environment
coq_makefile -f _CoqProject -o Makefile # Generates the makefile
opam pin add coq:YOURLIBRARY . # Add your library to OPAM
与其他项目共享您的库:
make install
含蛋白石
假设您安装了OPAM,您可以使用coqshell
来帮助您处理依赖关系
要设置项目,请执行以下操作:
coq_makefile -f _CoqProject -o Makefile
coq_shell_url="https://raw.githubusercontent.com/gares/opam-coq-shell/master/src/opam-coq"
curl -s "${coq_shell_url}" | bash /dev/stdin init 8.4 # Install Coq and its dependencies
eval `opam config env --switch=coq-shell-8.4` # Setup the environment
coq_makefile -f _CoqProject -o Makefile # Generates the makefile
opam pin add coq:YOURLIBRARY . # Add your library to OPAM
更新库时,应执行以下操作:
opam upgrade coq:YOURLIBRARY
以下是使用OPAM方法的项目示例:
请允许我回避您的问题,提出蒂亚戈暗示的另一个过程
假设项目的树如下所示:
((coq-mode . ((coq-load-path . ((".." "MyProj"))))))
MyProj/Auxiliary/Aux.v
MyProj/Main/Main.v
在MyProj
中,编写一个列有所有Coq文件的_Coq项目文件
-R . ProjectName
Auxiliary/Aux.v
Main/Main.v
当您打开其中一个Coq文件时,emacs将查找_Coq项目并执行正确的操作(tm)
如Tiago所示,coq_makefile
还将免费为您提供一个makefile