当我尝试写
时fun foo :: "nat ⇒ nat"
where "foo = Suc"
Isabelle抱怨"功能没有参数"。为什么是这样?没有参数的fun
有什么问题?我知道我可以将fun
更改为abbreviation
或definition
,一切都很好。但是破坏我的.thy
文件的统一性似乎是一种耻辱,其中每个其他定义都用fun
声明。
答案 0 :(得分:2)
由于似乎没有其他答案正在进行中,让我重复并继续我之前的评论。在Isabelle / HOL中,有三种定义函数的方法:
definition
用于非递归函数(可以看作是作为较长语句的缩写的常量)。
primrec
用于原始递归函数(在每个递归调用中都有一个固定参数,其中删除了数据类型构造函数。)
fun
用于一般递归函数。
primrec
和fun
都期望至少有一个参数。对于前者,自动检查其中一个参数对应于数据类型上的原始递归的语法模式,而对于后者,证明“终止”(或者更确切地说是调用图的有效性)的任务将被委托给困难的用户。
无论如何,当然可以将primrec
和fun
转发给definition
,以便在没有参数的情况下轻松处理,但至少对我来说这似乎是为用户混淆了一些事情。而不是清理它们。
答案 1 :(得分:2)
Isabelle / HOL的当代fun
和function
的作者Alex Krauss对此有特别的看法,也可能是正式理由说出"功能&# 34;真的需要有争论。在SML中,你实际上有类似的情况:"常数"没有参数的是val
而不是fun
。
在极少数情况下,在Isabelle / HOL中需要零参数函数时,除了内部生成的关键定理的名称之外,使用definition [simp] "c = t
获得大致相同的结果是非常容易的:{ {1}}与c_def
。
我认为c.simps
在这方面的主要不便和偶然的陷阱是它的辅助function
暴露在应用中并不意味着:它展现了功能规范背后的内部结构,而不是它的主要特征方程式。