如何在 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
。在许多情况下,最好使用派生属性而不是一直扩展定义。定义有时可以包含技术细节,例如“函数在错误输入时的表现如何”(例如除以零或负数的对数),并且通常最好避免任何时候证明对此类细节的依赖可能。
伊莎贝尔证明助手(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
。在许多情况下,最好使用派生属性而不是一直扩展定义。定义有时可以包含技术细节,例如“函数在错误输入时的表现如何”(例如除以零或负数的对数),并且通常最好避免任何时候证明对此类细节的依赖可能。