Isabelle 《伊莎贝尔/霍尔》中的primrec和fun有什么区别?

Isabelle 《伊莎贝尔/霍尔》中的primrec和fun有什么区别?,isabelle,Isabelle,我正在阅读伊莎贝尔教程,并试图澄清我对primrec和fun使用的概念。用我迄今为止所寻找的,包括答案;我知道primrec中的构造函数只能有一个等式,primrec默认有[simp],而fun可以有多个等式,需要明确指定自动化策略。然而,我仍然难以清楚地理解它 有人愿意用一些例子来解释吗?primrec对代数数据类型(或设置为类似于自然数的数据类型;我不太了解它的内部结构)进行解释。这意味着在递归方案中有很多限制: 左侧只能有一个非变量参数(即,只有一个参数可以进行模式匹配)。您不能执行类似

我正在阅读伊莎贝尔教程,并试图澄清我对primrec和fun使用的概念。用我迄今为止所寻找的,包括答案;我知道primrec中的构造函数只能有一个等式,primrec默认有[simp],而fun可以有多个等式,需要明确指定自动化策略。然而,我仍然难以清楚地理解它

有人愿意用一些例子来解释吗?

primrec
对代数数据类型(或设置为类似于自然数的数据类型;我不太了解它的内部结构)进行解释。这意味着在递归方案中有很多限制:

  • 左侧只能有一个非变量参数(即,只有一个参数可以进行模式匹配)。您不能执行类似于
    f(x#xs)(y#ys)=…
    fn=(如果n=0,则…否则…)
  • 只能在单个构造函数上进行模式匹配(即
    x#xs
    ,但不能
    x#y#xs
  • 只能对左侧匹配的变量递归调用函数,即
    f(Node l r)=…f l…f r…
    ,但不能
    f(Node l r)=…f(Node r l)
  • 嵌套递归只有在镜像数据类型的定义时才可能
fun
来自函数包,是
function
的简化版本,它试图证明模式的详尽性、不重叠性和自动终止性。这适用于实践中出现的大多数功能;如果没有,则必须使用
函数
并手动证明这些东西。终止通常是一个棘手的问题

fun
primrec
之间的主要区别在于
fun
没有我上面为
primrec
列出的限制。有了
乐趣
,几乎一切都会顺利进行。据我所知,一切
primrec
都可以做,
fun
也可以做

函数
还可以执行许多其他操作,如相互递归函数、部分函数(即不在所有输入端终止的函数)、条件函数方程等。有关此操作的更多信息,请参阅

函数
命令的另一个功能是,它为使用它定义的每个函数生成许多有用的规则,例如
案例
规则、
归纳
规则、
elims
规则等。此外,您还可以使用
有趣案例
命令自动派生专门的消除规则。手册中也对此进行了说明


TL;约阿希姆说的<代码>乐趣
通常是您想要使用的。如果还不够,请使用
功能
。对于非常简单的函数,可以使用
primrec
,但这样做并没有真正的好处。对于可能的非终止函数来说,另一个有趣的选择是
归纳的

太懒了,无法编造示例,所以这只是一个注释:从从业者的角度来看,
primrec
是一个较低级别的工具,您通常不需要担心,只需始终使用
fun
。轻微更正:
fun
还支持相互递归,不仅仅是
函数
。哦,的确如此。直到。对于没有
size
函数的代数数据类型(例如无限分支树),
primrec
优于
fun
,因为自动终止验证方法(内部调用
fun
)需要
size
函数。在这种情况下,您必须手动进行终止证明,这可能会非常繁琐。