我们如何使用 python 程序访问 Coq 或 Isabelle/HOL?
How we can access Coq or Isabelle/HOL using python program?
我想使用我的 python 程序访问 Coq 或 Isabelle/HOL 交互式定理证明器。有没有 python 包可用?请推荐
我不是 Isabelle 方面的专家,但我相信最常用的界面是 IDE 使用的 Scala API,不幸的是,我不能说更多。
关于 Coq,多年来的标准交互方式一直是与终端 REPL 界面对话。那不是很方便。您有更新的 IDE protocol,但是我不建议对其进行大量投资,因为它很快就会进行重大修订,(希望对其进行改进 :))
一个不成熟但可行的替代方案是 SerAPI,[免责声明我是作者],它提供了协议中接下来会发生什么的一瞥。取决于您想做什么,它可能会起作用。不幸的是,没有 Python 绑定,因为我无法弄清楚如何最好地进行异步编程,但是欢迎 help/PRs。
最后,您当然可以直接使用 OCaml 从 Python 与 Coq 对话。同样,根据您的用例,它会很有趣或非常具有挑战性。
这是关于如何启动 Isabelle 实例并从 Python:
执行 RPC 调用的非常粗略的草稿
import $ivy.`info.hupel::libisabelle-setup:0.9.2`
import $ivy.`org.python:jython-standalone:2.7.1`
import javax.script.ScriptEngineManager
val python = """
|from info.hupel.isabelle.api import Configuration, Version
|from info.hupel.isabelle.japi import JResources, JSetup, JSystem, Operations
|res = JResources.dumpIsabelleResources()
|print res
|config = Configuration.simple("Protocol")
|print config
|env = JSetup.makeEnvironment(JSetup.defaultSetup(Version.Stable("2016-1")), res)
|print env
|sys = JSystem.create(env, config)
|print sys
|response = sys.invoke(Operations.HELLO, "world")
|print response
|sys.dispose()""".stripMargin
new ScriptEngineManager().getEngineByName("python").eval(python)
这是用 Scala 代码包装的,原因很简单,因为这是让 Jython 工作的最简单方法。
要执行上面的脚本,请将其保存为文件(例如 isa.sc
),为 Scala 下载 the Ammonite REPL,然后 运行 就像 ammonite isa.sc
一样。这应该需要一些时间来做一些设置,最后,应该会出现这样的东西:
info.hupel.isabelle.japi.JResources@59d0fac9
session Protocol
<Isabelle2016-1> at /home/lars/.local/share/libisabelle/setups/Isabelle2016-1
info.hupel.isabelle.japi.JSystem@138a952f
Hello world
这演示了来自 Python 的非常简单的 Isabelle 引导。
我想使用我的 python 程序访问 Coq 或 Isabelle/HOL 交互式定理证明器。有没有 python 包可用?请推荐
我不是 Isabelle 方面的专家,但我相信最常用的界面是 IDE 使用的 Scala API,不幸的是,我不能说更多。
关于 Coq,多年来的标准交互方式一直是与终端 REPL 界面对话。那不是很方便。您有更新的 IDE protocol,但是我不建议对其进行大量投资,因为它很快就会进行重大修订,(希望对其进行改进 :))
一个不成熟但可行的替代方案是 SerAPI,[免责声明我是作者],它提供了协议中接下来会发生什么的一瞥。取决于您想做什么,它可能会起作用。不幸的是,没有 Python 绑定,因为我无法弄清楚如何最好地进行异步编程,但是欢迎 help/PRs。
最后,您当然可以直接使用 OCaml 从 Python 与 Coq 对话。同样,根据您的用例,它会很有趣或非常具有挑战性。
这是关于如何启动 Isabelle 实例并从 Python:
执行 RPC 调用的非常粗略的草稿import $ivy.`info.hupel::libisabelle-setup:0.9.2`
import $ivy.`org.python:jython-standalone:2.7.1`
import javax.script.ScriptEngineManager
val python = """
|from info.hupel.isabelle.api import Configuration, Version
|from info.hupel.isabelle.japi import JResources, JSetup, JSystem, Operations
|res = JResources.dumpIsabelleResources()
|print res
|config = Configuration.simple("Protocol")
|print config
|env = JSetup.makeEnvironment(JSetup.defaultSetup(Version.Stable("2016-1")), res)
|print env
|sys = JSystem.create(env, config)
|print sys
|response = sys.invoke(Operations.HELLO, "world")
|print response
|sys.dispose()""".stripMargin
new ScriptEngineManager().getEngineByName("python").eval(python)
这是用 Scala 代码包装的,原因很简单,因为这是让 Jython 工作的最简单方法。
要执行上面的脚本,请将其保存为文件(例如 isa.sc
),为 Scala 下载 the Ammonite REPL,然后 运行 就像 ammonite isa.sc
一样。这应该需要一些时间来做一些设置,最后,应该会出现这样的东西:
info.hupel.isabelle.japi.JResources@59d0fac9
session Protocol
<Isabelle2016-1> at /home/lars/.local/share/libisabelle/setups/Isabelle2016-1
info.hupel.isabelle.japi.JSystem@138a952f
Hello world
这演示了来自 Python 的非常简单的 Isabelle 引导。