我有以下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。希望有人能帮助我!
答案 0 :(得分:1)
我在计算机上运行了函数定义,并且最终完成了。
提供fun
的函数包将您的函数定义重写为可以在Isabelle证明中使用的方程式。为此,它必须检查您的定义和左侧的模式是否不重叠。如果存在重叠(此处就是这种情况),则必须将定义重写为非重叠的定义 1 。鉴于您的定义很复杂,需要很长时间。
1 另请参阅以下Manuel Eberl的评论。