Isabelle不允许我只写fun f :: "nat list => nat"
;我必须添加至少一个定义方程,例如where "f [] = 5"
。但是,由于将某些构造函数保留为未定义是可以的,为什么我不能简单地将所有构造函数保留为undefined?然后,没有fun f
的{{1}}将成为where
声明的便捷替代方案。
答案 0 :(得分:2)
首先,我不明白为什么 fun f
没有where
是consts f
的便捷替代品。您可以使用后者(但也必须指定类型),如果必须,请使用它。此外,consts
比definition
,fun
等命令更原始,而且 - 在我看来 - 不应该在生产代码中使用。
关于在fun
ction声明中保留未定义构造函数的注释。措词“未定义”在这里具有误导性,因为例如在
fun f :: "'a list => nat"
where
"f [] = 0"
你可以证明那个
lemma "f (x#xs) = undefined"
by (cases "x#xs" rule: f.elims) simp
因此f (x#xs)
在某种意义上被定义为值undefined
。相反,之后
consts f :: "'a list => nat"
你无法证明f
的任何内容。你刚刚告诉系统某个类型有一个f
的常量,但没有再说些什么。