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

时间:2015-01-23 15:52:32

标签: isabelle

当我尝试写

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

Isabelle抱怨"功能没有参数"。为什么是这样?没有参数的fun有什么问题?我知道我可以将fun更改为abbreviationdefinition,一切都很好。但是破坏我的.thy文件的统一性似乎是一种耻辱,其中每个其他定义都用fun声明。

2 个答案:

答案 0 :(得分:2)

由于似乎没有其他答案正在进行中,让我重复并继续我之前的评论。在Isabelle / HOL中,有三种定义函数的方法:

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

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

  • fun用于一般递归函数。

primrecfun都期望至少有一个参数。对于前者,自动检查其中一个参数对应于数据类型上的原始递归的语法模式,而对于后者,证明“终止”(或者更确切地说是调用图的有效性)的任务将被委托给困难的用户。

无论如何,当然可以将primrecfun转发给definition,以便在没有参数的情况下轻松处理,但至少对我来说这似乎是为用户混淆了一些事情。而不是清理它们。

答案 1 :(得分:2)

Isabelle / HOL的当代funfunction的作者Alex Krauss对此有特别的看法,也可能是正式理由说出"功能&# 34;真的需要有争论。在SML中,你实际上有类似的情况:"常数"没有参数的是val而不是fun

在极少数情况下,在Isabelle / HOL中需要零参数函数时,除了内部生成的关键定理的名称之外,使用definition [simp] "c = t获得大致相同的结果是非常容易的:{ {1}}与c_def

我认为c.simps在这方面的主要不便和偶然的陷阱是它的辅助function暴露在应用中并不意味着:它展现了功能规范背后的内部结构,而不是它的主要特征方程式。