如何在 Isabelle 中显示函数的定义

How to show the defintion of functions in Isabelle

伊莎贝尔证明助手(2020)有没有办法检查预定义函数的定义,比如div(或者缩写等定义)?

在学习 Isabelle 的过程中,我发现了解 div 这样的函数的定义方式很有帮助。 我知道您可以在 Coq 中打印或检查,但无法在 Isabelle 中找到定义。

我试图将鼠标悬停在 Isabelle/jEdit 中的上下文菜单上,但找不到任何东西。在互联网上搜索似乎也没有任何相关内容。

常量上的

Ctrl+Click 通常会将您带到它的定义(无论常量是通过什么方式定义的,无论是 definition 还是 inductive 还是 fun) .这也适用于类型和定理!

但是,对于在类型 class 中定义的 div 之类的内容,这会将您带到声明处。还有一些其他情况(例如,来自语言环境解释的常量,如 sum),您也不会在您想要的地方结束。

我不知道有任何统一的机制来访问定义(至少在不深入了解 Isabelle 的 ML 接口的情况下)。

然而,典型的情况如下(假设你的常量被称为foo):

  • 对于“正常”定义(使用 definition 命令),定理简称为 foo_def。对于其他一些工具,如 primrec_def 定理也可用。
  • 对于 class 类型的常量,例如 (+)(*)(-)(div)(mod)gcd, size, 名称是 foo_type_def, 其中 type 是有问题的类型。例如参见 [​​=32=]、size_list_def.
  • 对于用fun/function/等定义的函数,_def定理是隐藏的,因为它来自复杂的内部结构,只会让用户感到困惑,而且非常无用。我认为它在内部构建某种调用图,然后通过它定义函数——我不确定细节。在任何情况下,对于 fun,您应该将 foo.simps 引理视为定义(或者 foo.psimps,如果函数没有在任何地方终止)。
  • (Co-)归纳谓词(用 inductive/coinductive 定义)的特征在于它们的 foo.intros 规则。不过他们也有foo.simps
  • 一些常量(例如数据类型构造函数)根本没有可见的定义。我建议你只是像对待它们一样神奇地从天上掉下来,并具有它们的特征(内射性、穷举性等)。 ;)

对于像 (+) 这样语法奇特的函数,你可以用鼠标 Ctrl+hovering 找到基础常量的名称,或者(在大多数情况下)Ctrl+clicking 就可以了。

如果一切都失败了,您还可以像这样查看常量的内部表示:

ML_val ‹@{term "(+)"}›

这将输出以下内容:

val it = Const ("Groups.plus_class.plus", "'a ⇒ 'a ⇒ 'a"): term

所以你可以看到常量的名字是plus(它的全名是Groups.plus_class.plus)。事实上,plus_nat_def 给出了自然数加法的定义。

最后,请注意,有时人们会以一种方式定义事物,然后通过仅显示等式来添加其他“替代”定义,例如is_singleton_def 对比 is_singleton_altdef。在许多情况下,最好使用派生属性而不是一直扩展定义。定义有时可以包含技术细节,例如“函数在错误输入时的表现如何”(例如除以零或负数的对数),并且通常最好避免任何时候证明对此类细节的依赖可能。