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)上进行的操作位于哪里?
答案 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
(待续)