Coq:使用子目录管理项目中的加载路径

Coq:使用子目录管理项目中的加载路径,coq,Coq,我有一个Coq项目,它的库被组织成子目录,比如: …/MyProj/Auxiliary/Aux.v …/MyProj/Main/Main.v (imports Auxiliary/Aux.v) 当我编译文件时,我希望从工作目录MyProj(通过makefile)编译。但是我还想使用Proof General/Coqtop处理文件,在这种情况下,工作目录默认为文件所在的目录 但这意味着两个上下文之间的加载路径不同,因此库导入所需的逻辑路径也不同如何设置coqc调用、加载路径和导入声明,使它们在

我有一个Coq项目,它的库被组织成子目录,比如:

…/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