为什么 Isabelle 函数必须至少有一个参数?

Why must Isabelle functions have at least one argument?

当我尝试写

fun foo :: "nat ⇒ nat"  
where "foo = Suc"

伊莎贝尔抱怨 "Function has no arguments"。为什么是这样? fun 没有参数有什么问题?我知道我可以将 fun 更改为 abbreviationdefinition,一切都很好。但是破坏我的 .thy 文件的一致性似乎是一种耻辱,其中每个其他定义都用 fun.

声明

由于似乎没有其他答案,所以让我重复并扩展我之前的评论。在Isabelle/HOL中定义函数的三种方式:

  • definition 用于非递归函数(可以将其视为用作较长语句缩写的常量)。

  • primrec 用于原始递归函数(在每个递归调用中都有一个固定参数,其中数据类型构造函数被删除)。

  • fun 用于一般递归函数。

primrecfun 都需要至少一个参数。对于前者,它会自动检查它的一个参数是否对应于数据类型上原始递归的句法模式,而对于后者,证明 "termination" (或者更确切地说调用图的充分性)的任务将是在困难的情况下委托给用户。

无论如何,对于没有参数的简单情况,当然可以将 primrecfun 中继到 definition,但至少对我来说,这似乎混淆了一些东西用户而不是清除它们。

Isabelle/HOL 中当代 funfunction 的作者亚历克斯·克劳斯 (Alex Krauss) 对此有特殊的看法,并且可能还有充分的正式理由说 "function" 真的需要有论据。在 SML 中,您实际上遇到了类似的情况:没有参数的 "constants" 是通过 val 而不是 fun.

定义的

在极少数情况下,在 Isabelle/HOL 中需要零参数函数,使用 definition [simp] "c = t 很容易得到几乎相同的结果,除了关键定理的名称内部制作:c_def 对比 c.simps.

我认为 function 在这方面的主要不便和偶尔的陷阱是它暴露了不打算在应用程序中使用的辅助 c_def :它展开了背后的内部结构函数规范,而不是其主要特征方程。