libisabelle 与现有的 Isabelle 安装

libisabelle with existing Isabelle installation

我想使用 libisabelle to invoke Isabelle from Scala. However, by default (i.e., using the invocation as described in the tutorial),libisabelle 将下载全新的 Isabelle 安装。

我希望改用现有的(只读)Isabelle 配置。我尝试了以下方法:

val path = "/opt/Isabelle2016-1"
val setup = Setup.detect(Platform.genericPlatform(new File(path).toPath), Version.Stable("2016-1")).right.get
val resources = Resources.dumpIsabelleResources().right.get
val environment = Await.result(setup.makeEnvironment(resources), Duration.Inf)
val config = Configuration.simple("Example")
System.build(environment,config)
val system = System.create(environment,config)

我不确定这是否是我应该设置的方式,但无论如何,它不起作用:

java.nio.file.AccessDeniedException: /opt/Isabelle2016-1/.lock

所以 libisabelle 想要写入 Isabelle 安装。我希望代码即使在只读安装下也能正常工作。

如何让 libisabelle 在上述情况下工作?

Setup.detect 将尝试锁定安装,这样任何两个进程都不能同时写入它们。

使用 genericPlatform 可能不会像你想的那样,因为你通过那里的路径将用于 一切 libisabelle 从磁盘获取或写入磁盘,包括资源。

幸运的是,手动实例化一个 Setup 非常简单:

val setup = Setup(
  Paths.get("/opt/Isabelle2016-1"),
  Platform.guess.get,
  Version.Stable("2016-1")
)

有了这个咒语,您将在 /opt/Isabelle2016-1 中使用全局安装,但那里什么也没有写。 $ISABELLE_HOME_USER 等将指向 Linux 上的 ~/.local/share/libisabelle