Coq 中同一个库的不同版本

Posted

技术标签:

【中文标题】Coq 中同一个库的不同版本【英文标题】:Diffent versions of same library in Coq 【发布时间】:2018-10-28 16:39:50 【问题描述】:

是否可以在 Coq 中安装同一个库的多个版本?如果是,我该如何选择要使用的版本?

我在 Windows 中工作,因此任何使用 OPAM 的解决方案都对我没有帮助。

【问题讨论】:

您是指不同版本的 Coq(8.4、8.5、8.8 等)还是某些开发的不同版本(Coq 读取的.v 文件)?对于后者,只需将它们放在不同的目录中并指定 LoadPath。 我的意思是一组 .v 文件的不同版本。如果我不走运,我还需要更改为旧版本的 Coq,但我希望 Coq 足够向后兼容。当您说“指定加载路径”时,我是否需要在库的每个 .v 文件中执行此操作,还是可以在安装时以某种方式全局完成?这个库非常大,我想避免手动更改 100 多个文件。 【参考方案1】:

最好的解决方案是将库实际安装在单独的目录中,使用 coq_makefile 中正确的 DESTDIR 变量,然后设置 COQPATH 以包含正确的目录。这就是 Nix 和 OPAM 的风格。

Makefile 来自 coq_makefile 的未经测试的示例:

$ ( cd lib-v1 && DESTDIR=~/coqlib/lib-v1 make install )
$ ( cd lib-v2 && DESTDIR=~/coqlib/lib-v2 make install )

$ export COQPATH=~/coqlib/lib-v1:$COQPATH
$ coqtop

【讨论】:

这听起来像是我正在寻找的东西。然而,我还不太清楚你的意思是什么。图书馆只有makefile,但没有coq_makefile,我需要创建一个吗? “Makefile 来自coq_makefile”是什么意思。我需要在makefile 或控制台中输入命令吗?对不起,如果这些是愚蠢的问题,但整个 makefile 内容目前对我来说只是黑魔法。 我的意思是,如果您使用标准 coq_makefile 设置构建 coq 库 [大多数 coq 库都以这种方式工作],那么 make 将理解 DESTDIR 变量以将库安装在特定目录。【参考方案2】:

您可以使用-R 告诉coq 某个目录对应某个名称空间。 (注意-R两个参数,目录和命名空间!)

让我们创建两个目录,并编译这两个版本。请注意,我们必须在编译时告诉coqc,目录中的文件应该在MyLib 命名空间中,而不是在默认命名空间中。

D1=~/Desktop/libv1
D2=~/Desktop/libv2

mkdir $D1; echo "Definition a:=1." > $D1/MyLib.v
(cd $D1; coqc -R . MyLib MyLib.v)

mkdir $D2; echo "Definition a:=2." > $D2/MyLib.v
(cd $D2; coqc -R . MyLib MyLib.v)

现在将libv1 用于MyLib

echo "Require Import MyLib. Print a." | \
coqtop -R $D1 MyLib

(将打印a := 1.)并将libv2 用于MyLib

echo "Require Import MyLib. Print a." | \
coqtop -R $D2 MyLib

(将打印a := 2.

您也可以将-R 标志及其参数放在_CoqProject 文件中,这样您就不必一直将它放在命令行中。 Proof General 也理解这一点。


编辑:使用 COQPATH 变量而不是 -R 标志:

(cd $D1; coqc MyLib.v) # compile without -R
(cd $D2; coqc MyLib.v)

# specify the dir using COQPATH
echo "Require Import MyLib. Print a." | COQPATH=$D1 coqtop

# or add it to the LoadPath when you're in coqtop interactively
echo "Add LoadPath \"$D1\". Require Import MyLib. Print a." | coqtop

【讨论】:

如果库很好并且打包并带有makefile等,您应该使用@ejgallego的答案。 我认为使用COQPATH而不是-R加载外部库总是更好。特别是,在_CoqProject 中,您只能为您正在编写的库设置-R,而不是它的依赖项。 (详情请参阅this link) 其实我是建议使用-R 编译,COQPATH 引用库。您应该将MyLib.v 放在目录libv1/MyLiblibv2/MyLib 中。然后COQPATH=libv1COQPATH=libv2 允许加载MyLib.MyLib

以上是关于Coq 中同一个库的不同版本的主要内容,如果未能解决你的问题,请参考以下文章

python3.X版本与2.X版本里urllib库的不同

使用不同版本的 Android 支持库的解决方法

python虚拟环境

Android多个Module统一配置相同jar或库的版本号

外部加载的同一版本 jquery 的两个不同变体

.NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化