在Isabelle / HOL中,primrec和fun之间有什么区别?

时间:2015-05-24 02:07:50

标签: isabelle

我正在阅读Isabelle教程并试图清除我对使用primrec和fun的概念。到目前为止我搜索过的内容,包括答案here;据我所知,primrec中的构造函数只能有一个方程式,而且primrec默认有[simp],而fun可以有多个方程式,需要明确指定自动化策略。但是,我仍然很难清楚地理解它。

任何人都可以用一些例子解释一下吗?

1 个答案:

答案 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并手动证明这些事情。终止通常是一个棘手的问题。

funprimrec之间的主要区别在于fun没有我在primrec上面列出的限制。使用fun,几乎所有事情都会发生。据我所知,primrec可以做的所有事情都可以,fun也能做到。

function也可以执行许多其他操作,例如互相递归函数,部分函数(即不在所有输入上终止的函数),条件函数方程等。请参阅{{3}有关此内容的更多信息。

function命令的另一个特性是它为使用它定义的每个函数生成许多有用的规则,例如cases规则,induction规则,{{ 1}}规则等。此外,您可以使用elims命令自动派生专门的消除规则。这也在手册中有描述。

TL; DR:约阿希姆说的话。 fun_cases通常是您想要使用的。如果还不够,请使用fun。您可以将function用于非常简单的功能,但这样做没有任何实际优势。另一个可能对非终止函数感兴趣的替代方法是primrec