Isabelle/HOL 理论 (HOL.Imperative_HOL.ex.Imperative_Quicksort) as Json with scala-isablle and lift framework

Isabelle/HOL theory (HOL.Imperative_HOL.ex.Imperative_Quicksort) as Json with scala-isablle and lift framework

我正在使用 https://github.com/dominique-unruh/scala-isabelle/ to digest Isabelle/HOL formalization of quicksort algorithm https://isabelle.in.tum.de/library/HOL/HOL-Imperative_HOL/Imperative_Quicksort.html。我设法通过

将 Quicksort 理论导入 Context
val ctxt = Context("HOL.Imperative_HOL.ex.Imperative_Quicksort")

现在我希望 ctxt 包含 Impeartive_Quicksort.thy 的 AST,所以我希望它能转换成 JSON 对象树。为此,我正在使用 Lift 框架。我的 buil.sbt 包含

libraryDependencies ++= {
    val liftVersion = "3.4.3"
    Seq(
        "net.liftweb"       %% "lift-webkit" % liftVersion % "compile",
        "ch.qos.logback" % "logback-classic" % "1.2.3"
    )
}

密码是

val ctxt = Context("HOL.Imperative_HOL.ex.Imperative_Quicksort")

import net.liftweb.json._
import net.liftweb.json.Serialization.write

implicit val formats = net.liftweb.json.DefaultFormats
val jsonString = write(ctxt)
println("before jsonString")
println(jsonString)
println("after jsonString")

给出的输出数量很少:

before jsonString
{"mlValue":{"id":{"_fun":{},"_ec":{},"_arg":null,"_xform":2}}}
after jsonString

我猜 - 这是 JSON 序列化问题。 Ctxt 确实包含 Impeartive_Quicksort 理论,但是 JSON.

的转换存在一些问题

如何将整个理论输出为 Imperative_Quicksort.thy 的 AST 的 JOSN 对象树?

这种方法有几个问题:

使用 Lift 翻译 scala-isabelle 对象: 这通常行不通。我假设 Lift 使用反射(我不知道是运行时还是编译时)来序列化对象的内部结构。 (它甚至对私有字段进行编码,即不属于 API。)然而,scala-isabelle 中的许多对象(包括 ContextTerm)具有更复杂的内部结构.例如,Context 仅包含对存储在 Isabelle 进程中的对象的引用。 (我猜 "_xform":2 是引用 Isabelle 进程内部对象的 ID。)Isabelle 上下文原则上不可序列化(它是一种包含闭包的数据类型),访问它的唯一方法是应用各种Isabelle 提供的 ML 功能(并且可以在 Scala 端进行镜像)。另一方面,Term 可以序列化。在 Isabelle 方面,它是一种简单的数据类型。但是,出于效率原因,scala-isabelle Term 有点复杂。来自 Isabelle 流程的数据仅按需传输。这就是为什么简单地使用反射的东西除非已经被转移,否则不会得到整个术语。您可以通过使用模式匹配编写简单的递归函数来序列化 Term(请参阅 doc)。但是,请注意,一个术语可能是一个巨大的数据结构,其中有很多重复:例如,类型信息一遍又一遍地重复,并把这个术语夸大了。

获取伊莎贝尔理论的 AST: 我觉得这里对伊莎贝尔语境是什么存在误解。它不包含理论的 AST(或与理论源代码相关的任何内容)。相反,它是评估理论中命令的结果。 Isabelle 处理模型的工作原理大致如下:理论文件被分成命令(例如,lemma ...apply ... 等)。每个命令都带有自己的解析器,returns 一个函数(一个闭包),而不是一个 AST。然后将此函数应用于 theory/proof 的当前状态并对其进行转换(例如,向其添加新定义)。任何时候都不会生成 AST。 (这个处理的状态在scala-isabelle中是ToplevelState,它可能包含上下文或理论或其他取决于最后一个命令的东西。)所以,我怀疑是否有办法获得AST任何方式的理论(无论是否使用 scala-isabelle 或是否直接在 Isabelle/ML 中完成)。据我所知,唯一的方法是实现您自己的解析器,该解析器不完全模仿 Isabelle 的解析并构建 AST。