Function 函数定义不终止。。。?

Function 函数定义不终止。。。?,function,isabelle,termination,Function,Isabelle,Termination,我有以下isabelle代码片段: type_synonym vname = string datatype aexp = N int | V vname | Plus aexp aexp fun full_plus :: "aexp ⇒ aexp ⇒ aexp" where "full_plus (N n⇩1) (N n⇩2) = N (n⇩1+n⇩2)" | "full_plus (N n⇩1) (Plus (N n⇩2) a) = (Plus (N (n⇩1+n⇩2)) a)" | "f

我有以下isabelle代码片段:

type_synonym vname = string
datatype aexp = N int | V vname | Plus aexp aexp

fun full_plus :: "aexp ⇒ aexp ⇒ aexp" where
"full_plus (N n⇩1) (N n⇩2) = N (n⇩1+n⇩2)" |
"full_plus (N n⇩1) (Plus (N n⇩2) a) = (Plus (N (n⇩1+n⇩2)) a)" |
"full_plus (N n⇩1) (Plus a (N n⇩2)) = (Plus (N (n⇩1+n⇩2)) a)" |
"full_plus (Plus (N n⇩1) a) (N n⇩2) = (Plus (N (n⇩1+n⇩2)) a)" |
"full_plus (Plus a (N n⇩1)) (N n⇩2) = (Plus (N (n⇩1+n⇩2)) a)" |
"full_plus (Plus a⇩1 (N n⇩1)) (Plus a⇩2 (N n⇩2)) = (Plus (N (n⇩1+n⇩2)) (Plus a⇩1 a⇩2))" |
"full_plus (Plus a⇩1 (N n⇩1)) (Plus (N n⇩2) a⇩2) = (Plus (N (n⇩1+n⇩2)) (Plus a⇩1 a⇩2))" |
"full_plus (Plus (N n⇩1) a⇩1) (Plus a⇩2 (N n⇩2)) = (Plus (N (n⇩1+n⇩2)) (Plus a⇩1 a⇩2))" |
"full_plus (Plus (N n⇩1) a⇩1) (Plus (N n⇩2) a⇩2) = (Plus (N (n⇩1+n⇩2)) (Plus a⇩1 a⇩2))" |
"full_plus a⇩1 a⇩2 = Plus a⇩1 a⇩2"
但是,函数定义在jEdit中变为紫色。当我将递归引理标记为
[simp]
时,我看到过这种情况,所以我假设这意味着后端冻结或陷入无限循环,但决不使用函数。在我看来,
full\u plus
似乎不会再出现。。。?我在程序中添加了
declare[[simp_trace]]
,但这只会产生一个很长且(对我来说,是初学者)无法理解的跟踪。如果有人想看,我可以把它贴在这里,但是它很长


作为参考,这是免费的在线具体语义书中的练习3.2。希望有人能帮助我

我在我的计算机上运行了你的函数定义,它最终完成了

提供
fun
的函数包将函数定义重写为可用于Isabelle证明的方程。为此,它必须检查您的定义和左侧的模式是否不重叠。如果存在重叠(这里就是这种情况),则必须将定义重写为不重叠的定义1。考虑到你复杂的定义,这需要很长时间

简言之,定义左侧的模式太复杂,重叠很多。尽量简化它们



1另请参见下面曼努埃尔·埃贝尔的评论。

谢谢!我在我的笔记本电脑上运行它,它确实在那里终止了。我要重新考虑我的方法。你确定吗?据我所知,“乐趣”只是通过总是选择第一个匹配的方程式(“顺序模式”)来处理重叠模式。爆炸可能来自将重叠模式匹配扩展为非重叠模式匹配。因为定义是非递归的,所以我建议使用“case”操作符来定义。