Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Isabelle/HOL理论(HOL.private\u HOL.ex.private\u Quicksort)作为Json与scala Isabelle和lift框架_Scala_Isabelle_Lift Json - Fatal编程技术网

Isabelle/HOL理论(HOL.private\u HOL.ex.private\u Quicksort)作为Json与scala Isabelle和lift框架

Isabelle/HOL理论(HOL.private\u HOL.ex.private\u Quicksort)作为Json与scala Isabelle和lift框架,scala,isabelle,lift-json,Scala,Isabelle,Lift Json,我用它来消化快速排序算法的Isabelle/HOL形式化。我设法通过以下方式将快速排序理论导入到上下文中: val ctxt = Context("HOL.Imperative_HOL.ex.Imperative_Quicksort") 现在我希望ctxt包含impartive_Quicksort.thy的AST,所以我希望将其转换为JSON对象树。我正在使用升降机框架。我的buil.sbt包含 libraryDependencies ++= { val liftV

我用它来消化快速排序算法的Isabelle/HOL形式化。我设法通过以下方式将快速排序理论导入到上下文中:

val ctxt = Context("HOL.Imperative_HOL.ex.Imperative_Quicksort")
现在我希望ctxt包含impartive_Quicksort.thy的AST,所以我希望将其转换为JSON对象树。我正在使用升降机框架。我的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肯定包含了不完整的快速排序理论,但是JSON的transaltion存在一些问题


如何将整个理论输出为命令式快速排序AST的JOSN对象树。这种方法有几个问题:

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

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

这种方法有几个问题:

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

了解伊莎贝尔理论: 我觉得这里有一个关于什么是伊莎贝尔语境的误解。它不包含理论的AST(或与理论源代码相关的任何内容)。相反,它是在理论中评估命令的结果。Isabelle处理模型的工作原理大致如下:理论文件被分成命令(例如,
lemma…
apply…
等)。每个命令都有自己的解析器,它返回一个函数(闭包),而不是AST。然后将此函数应用于理论/证明的当前状态,并对其进行转换(例如,为其添加新定义)。在任何时候都不会生成AST。(在scala isabelle中,此处理的状态为
ToplevelState
,它可能包含上下文、理论或其他内容,具体取决于最后一个co