什么是cterm?

时间:2019-10-23 12:34:48

标签: isabelle ml

Isabelle实施手册说:

  

类型ctyp和cterm分别表示认证的类型和术语。这些是抽象数据类型,可确保其值相对于背景理论中的类型构造函数,常量等的声明而言,已通过完整的格式正确(和类型正确)检查。

我的理解是:当我写cterm t时,伊莎贝尔(Isabelle)会根据该词所依据的理论来检查该词是否构造合理。

  

抽象类型ctyp和cterm是主要负责thm的同一推理内核的一部分。因此,即使定理,对ctyp和cterm的语法运算也位于Thm模块中   在那个阶段还没有参与。

我的理解是:如果要在ML级别修改cterm,我将使用Thm模块的操作(在哪里可以找到该模块?)

此外,看起来cterm t是一个将理论级别的术语转换为ML级别的术语的实体。因此,我检查了声明中的cterm代码:

ML_val ‹
  some_simproc @{context} @{cterm "some_term"}
›

并进入ml_antiquotations.ML:

ML_Antiquotation.value \<^binding>‹cterm› (Args.term >> (fn t =>
    "Thm.cterm_of ML_context " ^ ML_Syntax.atomic (ML_Syntax.print_term t))) #>

根据我目前的知识,这行代码对我来说是不可读的。

我想知道是否有人可以对cterm进行更好的底层解释。下面的代码是什么意思? cterm对理论术语执行的检查位于何处?我们可以在cterms(上面的模块Thm)上进行的操作位于哪里?

2 个答案:

答案 0 :(得分:1)

“ c”代表“已认证”(或“已检查”?不确定)。 cterm基本上是经过检查的术语。 @{cterm …}反引号允许您简单地写下术语并在各种上下文中直接获得cterm(在这种情况下,可能是ML的上下文,即您直接获得具有预期内容的cterm值)。常规术语,即@{term …}也是如此。

您可以使用Thm结构中的函数直接操作cterms(顺便说一下,可以在~~/src/Pure/thm.ML中找到;大多数基本ML文件位于Pure目录中) 。但是,根据我的经验,通常更容易地将cterm转换为正则项(使用Thm.term_of –与Thm.cterm_of不同,这是非常便宜的操作),然后改为使用该项。直接操作cterms仅在最后需要另一个cterm时才有意义,因为重新认证术语非常昂贵(不过,除非经常调用您的代码,否则可能并不是性能问题。)

在大多数情况下,我会说工作流程是这样的:如果将cterm作为输入,则将其转换为常规术语。您可以轻松地检查/拆解/任何东西。在某个时候,您可能不得不再次将其转换为cterm(例如,因为您要使用它实例化某些定理或以其他涉及内核的方式使用它),然后只需使用Thm.cterm_of即可

我不确切地知道 @{cterm …}反引号在内部的作用,但我可以想象到最终,它只是将其参数解析为Isabelle术语,然后使用类似@{context}的东西在当前上下文(即Thm.cterm_of)中对其进行认证。

答案 1 :(得分:0)

为了收集有关cterms的发现,我发布了答案。

这是cterm在Pure中的样子:

order by test1 desc

(待续)