函数定义不会终止...?

时间:2019-04-05 07:38:20

标签: 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)" |
"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_plus不会递归...?我已经在程序中添加了declare [[simp_trace]],但这只会产生很长的(对我来说,是初学者)难以理解的跟踪。如果有人想看到它,我可以在这里发布,但是它很长。

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

1 个答案:

答案 0 :(得分:1)

我在计算机上运行了函数定义,并且最终完成了。

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

简而言之,定义左侧的模式太复杂了,而且有很多重叠之处。尝试简化它们。


1 另请参阅以下Manuel Eberl的评论。