我正在阅读Isabelle教程并试图清除我对使用primrec和fun的概念。到目前为止我搜索过的内容,包括答案here;据我所知,primrec中的构造函数只能有一个方程式,而且primrec默认有[simp],而fun可以有多个方程式,需要明确指定自动化策略。但是,我仍然很难清楚地理解它。
任何人都可以用一些例子解释一下吗?
答案 0 :(得分:6)
primrec
在代数数据类型上做primitive recursion(或者设置为看起来像一个的东西,就像自然数;我不太了解它的内部结构)。这意味着您可以在递归方案中有很多限制:
f (x#xs) (y#ys) = …
或f n = (if n = 0 then … else …)
。x # xs
,而不是x # y # xs
)f (Node l r) = … f l … f r …
,而不是f (Node l r) = … f (Node r l) …
。 fun
来自函数包,是function
的简化版本,试图证明模式的详尽性,非重叠性以及自动终止。这适用于实践中出现的大多数功能;如果没有,则必须使用function
并手动证明这些事情。终止通常是一个棘手的问题。
fun
和primrec
之间的主要区别在于fun
没有我在primrec
上面列出的限制。使用fun
,几乎所有事情都会发生。据我所知,primrec
可以做的所有事情都可以,fun
也能做到。
function
也可以执行许多其他操作,例如互相递归函数,部分函数(即不在所有输入上终止的函数),条件函数方程等。请参阅{{3}有关此内容的更多信息。
function
命令的另一个特性是它为使用它定义的每个函数生成许多有用的规则,例如cases
规则,induction
规则,{{ 1}}规则等。此外,您可以使用elims
命令自动派生专门的消除规则。这也在手册中有描述。
TL; DR:约阿希姆说的话。 fun_cases
通常是您想要使用的。如果还不够,请使用fun
。您可以将function
用于非常简单的功能,但这样做没有任何实际优势。另一个可能对非终止函数感兴趣的替代方法是primrec
。