Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 伊莎贝尔被以前的引理搞糊涂了?_Debugging_Isabelle - Fatal编程技术网

Debugging 伊莎贝尔被以前的引理搞糊涂了?

Debugging 伊莎贝尔被以前的引理搞糊涂了?,debugging,isabelle,Debugging,Isabelle,我在做具体语义学书的练习2.5时发现了一些奇怪的东西。基本上,我们必须证明著名的n个整数和的高斯公式。这是我的密码: fun sum_upto :: "nat ⇒ nat" where "sum_upto 0 = 0" | "sum_upto (Suc n) = (Suc n) + (sum_upto n)" lemma gauss: "sum_upto n = (n * (n + 1)) div 2" apply(induction n) apply(auto) done 这不会继续,至

我在做具体语义学书的练习2.5时发现了一些奇怪的东西。基本上,我们必须证明著名的n个整数和的高斯公式。这是我的密码:

fun sum_upto :: "nat ⇒ nat" where
"sum_upto 0 = 0" |
"sum_upto (Suc n) = (Suc n) + (sum_upto n)"

lemma gauss: "sum_upto n = (n * (n + 1)) div 2"
apply(induction n)
apply(auto)
done 
这不会继续,至少我从练习2.3中删除了前面的引理:

fun double :: "nat ⇒ nat" where
"double 0 = 0" |
"double (Suc n) = add (double n) 2"

lemma double_succ [simp]: "Suc (Suc (m)) = add m 2"
apply(induction m)
apply(auto)
done

lemma double_add: "double m = add m m"
apply(induction m)
apply(auto)
done
这里的add是一个用户定义的加法函数。我已经找到了其他的解,我对double的定义被Suc(Suc(double n))替换了,在这种情况下,下一个引理是不必要的,高斯误差消失了


然而,我想知道为什么会发生这种情况,因为原则上这两个问题都没有使用任何公共结构

此处的
[simp]
有故障。尝试移除它,看看是否有帮助

根本原因是
[simp]
将向所谓的simpset添加一条规则,并将由
simp
auto
等方法自动使用。因此,在将引理声明为
[simp]
之前需要非常小心


在您的例子中,问题是
Suc(Suc m)=add m2
不是simpset的好规则。它将用
addm2
替换
Suc(Suc m)
的所有实例,这可能与您想要的方向相反。

这不是您在第二段代码开头寻找的double的定义吗?非常感谢你的回答,我将好奇地进行实验,不删除simp(原则上,我需要它来证明以前的引理),但颠倒引理的顺序添加m2=Succ(Succ m)做了三角,我不知怎么地忽略了这个定义。是的,你的另一个解决方案也会起作用。