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