Isabelle 简化器不';不能与大于10的常数一起工作?
为什么伊莎贝尔简化者拒绝证明下面的引理Isabelle 简化器不';不能与大于10的常数一起工作?,isabelle,Isabelle,为什么伊莎贝尔简化者拒绝证明下面的引理 lemma "n ≠ counter ⟹ n ≠ Suc counter ⟹ n ≠ Suc (Suc counter) ⟹ n ≠ counter + 3 ⟹ n ≠ counter + 4 ⟹ n ≠ counter + 5 ⟹ n ≠ counter + 6 ⟹ n ≠ counter + 7 ⟹ n ≠ counter + 8 ⟹ n ≠ counter + 9 ⟹ counter ≤ n ⟹ n <
lemma "n ≠ counter ⟹
n ≠ Suc counter ⟹
n ≠ Suc (Suc counter) ⟹
n ≠ counter + 3 ⟹
n ≠ counter + 4 ⟹
n ≠ counter + 5 ⟹
n ≠ counter + 6 ⟹
n ≠ counter + 7 ⟹
n ≠ counter + 8 ⟹
n ≠ counter + 9 ⟹
counter ≤ n ⟹ n < counter + 10 ⟹ False"
by simp
引理≠ 柜台⟹
N≠ Suc计数器⟹
N≠ Suc(Suc计数器)⟹
N≠ 计数器+3⟹
N≠ 计数器+4⟹
N≠ 计数器+5⟹
N≠ 计数器+6⟹
N≠ 计数器+7⟹
N≠ 计数器+8⟹
N≠ 计数器+9⟹
柜台≤ N⟹ n<计数器+10⟹ 假“
按simp
虽然它证明了一个稍小的引理
lemma "n ≠ counter ⟹
n ≠ Suc counter ⟹
n ≠ Suc (Suc counter) ⟹
n ≠ counter + 3 ⟹
n ≠ counter + 4 ⟹
n ≠ counter + 5 ⟹
n ≠ counter + 6 ⟹
n ≠ counter + 7 ⟹
n ≠ counter + 8 ⟹
counter ≤ n ⟹ n < counter + 9 ⟹ False"
by simp
引理≠ 柜台⟹
N≠ Suc计数器⟹
N≠ Suc(Suc计数器)⟹
N≠ 计数器+3⟹
N≠ 计数器+4⟹
N≠ 计数器+5⟹
N≠ 计数器+6⟹
N≠ 计数器+7⟹
N≠ 计数器+8⟹
柜台≤ N⟹ n<计数器+9⟹ 假“
按simp
在我看来,常数10对于简化器来说太大了。是否有增加最大处理常数的选项或其他解决方法来证明第一个引理?要回答该解决方法,您可以使用“arith”或“presburger”方法: 引理≠ 柜台⟹ N≠ Suc计数器⟹ N≠ Suc(Suc计数器)⟹ N≠ 计数器+3⟹ N≠ 计数器+4⟹ N≠ 计数器+5⟹ N≠ 计数器+6⟹ N≠ 计数器+7⟹ N≠ 计数器+8⟹ N≠ 计数器+9⟹ 柜台≤ N⟹ n<计数器+10⟹ 假“ 按presburger(*或按arith*) arith也可以工作,但在这种情况下会发出警告(linarith失败),而对于较小的引理,该警告不会出现。应该有某种关联,但我不知道simp方法失败的确切原因
您可以通过使用命令“try”或“try0”来发现这一点,这些命令可以尝试多种验证程序和方法 要解决此问题,可以使用“arith”或“presburger”方法: 引理≠ 柜台⟹ N≠ Suc计数器⟹ N≠ Suc(Suc计数器)⟹ N≠ 计数器+3⟹ N≠ 计数器+4⟹ N≠ 计数器+5⟹ N≠ 计数器+6⟹ N≠ 计数器+7⟹ N≠ 计数器+8⟹ N≠ 计数器+9⟹ 柜台≤ N⟹ n<计数器+10⟹ 假“ 按presburger(*或按arith*) arith也可以工作,但在这种情况下会发出警告(linarith失败),而对于较小的引理,该警告不会出现。应该有某种关联,但我不知道simp方法失败的确切原因
您可以通过使用命令“try”或“try0”来发现这一点,这些命令可以尝试多种验证程序和方法 感谢另一个答案,它表明
arith
可以用来证明定理,因为arith
不是try0
方法之一
显然,linarith_trace
的这条消息为您提供了答案:
neq_limit exceeded (current value is 9), ignoring all inequalities
值10起作用不是因为您使用的是常量10
,而是因为您使用的是10个不等式,如下所示。和往常一样,因为我无法向某人验证(通过查看源文件)似乎显而易见的内容,所以我可能是错的
我在Isabelle2013-2/src
中搜索了neq_limit
,它显示在两个文件中。还有一个适用的示例理论:
[[simp\u trace,linarith\u trace]]
,无论我使用apply(simp only:)
还是apply(arith)
,在simp
和各种线性算术方法之间都有很多交互作用
我删除了我的第一个答案。如果有人想看看我对(仅限simp:)
所说的话,以及其他有关跟踪内容的内容,您可以单击下面的编辑
,查看旧条目
如下所示,无论我使用apply(仅simp:)
还是apply(arith)
,我都会收到上面的neq\u限制超限的跟踪消息
我推测差异在于fast\u lin\u arith.ML
和lin\u arith.ML
之间。在fast\u lin\u arith.ML
中,第788行有一个检查,它不在lin\u arith.ML
中
val split_neq = count is_neq (map (LA_Data.decomp ctxt) Hs') <= neq_limit
in
if split_neq then ()
else
trace_msg ctxt ("neq_limit exceeded (current value is " ^
一般来说,simp
和线性算术自动证明方法之间有很多交互作用,如Arith\u Examples.thy
中的注释所示
The @{text arith} method combines them both, and tries other methods
(e.g.~@{text presburger}) as well. This is the one that you should use
in your proofs!
现在,我去掉了计数器+10
引理中的一个不相等引理(因为它是多余的),它允许simp
来证明它
(*_SRC.0_*)
(*If we get rid of one inequality, and change the <= to <, it works.*)
lemma "(*n ≠ counter ==> *)
counter < n ==>
n ≠ Suc counter ==>
n ≠ Suc (Suc counter) ==>
n ≠ counter + 3 ==>
n ≠ counter + 4 ==>
n ≠ counter + 5 ==>
n ≠ counter + 6 ==>
n ≠ counter + 7 ==>
n ≠ counter + 8 ==>
n ≠ counter + 9 ==>
n < counter + 10 ==> False"
by(simp)
我表明,对于apply(仅simp:)
和apply(arith)
,您都会得到关于neq\u limit
的相同跟踪消息,但有一个证明通过了,而另一个则没有。显然,simp
使用一种形式的线性算术策略,arith
使用另一种形式
(*_SRC.2_*)
lemma "n ≠ counter ==>
n ≠ Suc counter ==>
n ≠ Suc (Suc counter) ==>
n ≠ counter + 3 ==>
n ≠ counter + 4 ==>
n ≠ counter + 5 ==>
n ≠ counter + 6 ==>
n ≠ counter + 7 ==>
n ≠ counter + 8 ==>
n ≠ counter + 9 ==>
counter ≤ n ==>
n < counter + 10 ==> False"
using[[linarith_trace]]
apply(simp only:)
(*Gets the following error message, and it goes no further:
Trying to refute subgoal 1...
neq_limit exceeded (current value is 9), ignoring all inequalities
*)
oops
(*_SRC.3_*)
lemma "n ≠ counter ==>
n ≠ Suc counter ==>
n ≠ Suc (Suc counter) ==>
n ≠ counter + 3 ==>
n ≠ counter + 4 ==>
n ≠ counter + 5 ==>
n ≠ counter + 6 ==>
n ≠ counter + 7 ==>
n ≠ counter + 8 ==>
n ≠ counter + 9 ==>
counter ≤ n ==>
n < counter + 10 ==> False"
using[[simp_trace, linarith_trace]]
apply(arith)
(*Same complaint about "9", but the proof will go through if there's no trace:
Trying to refute subgoal 1...
neq_limit exceeded (current value is 9), ignoring all inequalities
*)
oops
(*\u SRC.2)
引理≠ 计数器==>
N≠ Suc计数器==>
N≠ Suc(Suc计数器)==>
N≠ 计数器+3==>
N≠ 计数器+4==>
N≠ 计数器+5==>
N≠ 计数器+6==>
N≠ 计数器+7==>
N≠ 计数器+8==>
N≠ 计数器+9==>
柜台≤ n==>
n<计数器+10==>False“
使用[[linarith_trace]]
应用(仅simp:)
(*获取以下错误消息,不再进一步:
试图反驳子目标1。。。
超过neq_限制(当前值为9),忽略所有不平等
*)
哎呀
(*_SRC.3_*)
引理≠ 计数器==>
N≠ Suc计数器==>
N≠ Suc(Suc计数器)==>
N≠ 计数器+3==>
N≠ 计数器+4==>
N≠ 计数器+5==>
N≠ 计数器+6==>
N≠ 计数器+7==>
N≠ 计数器+8==>
N≠ 计数器+9==>
柜台≤ n==>
n<计数器+10==>False“
使用[[simp_trace,linarith_trace]]
应用(arith)
(*关于“9”的投诉相同,但如果没有任何痕迹,则证明将通过:
试图反驳子目标1。。。
超出neq_限制(当前值为9),点火
(*_SRC.0_*)
(*If we get rid of one inequality, and change the <= to <, it works.*)
lemma "(*n ≠ counter ==> *)
counter < n ==>
n ≠ Suc counter ==>
n ≠ Suc (Suc counter) ==>
n ≠ counter + 3 ==>
n ≠ counter + 4 ==>
n ≠ counter + 5 ==>
n ≠ counter + 6 ==>
n ≠ counter + 7 ==>
n ≠ counter + 8 ==>
n ≠ counter + 9 ==>
n < counter + 10 ==> False"
by(simp)
(*_SRC.1_*)
lemma "
n ≠ counter ==>
n ≠ Suc counter ==>
n ≠ Suc (Suc counter) ==>
counter ≤ n ==>
n < counter + 3 ==> False"
using[[simp_trace, linarith_trace]]
(*Click "1000" at the bottom of the output panel to get it to finish.
The trace shows that `arith` is called very soon, but that there's also
a lot of simp rule rewriting, such as with the rule `Groups.add_ac_2`.*)
apply(simp only:)
done
(*_SRC.2_*)
lemma "n ≠ counter ==>
n ≠ Suc counter ==>
n ≠ Suc (Suc counter) ==>
n ≠ counter + 3 ==>
n ≠ counter + 4 ==>
n ≠ counter + 5 ==>
n ≠ counter + 6 ==>
n ≠ counter + 7 ==>
n ≠ counter + 8 ==>
n ≠ counter + 9 ==>
counter ≤ n ==>
n < counter + 10 ==> False"
using[[linarith_trace]]
apply(simp only:)
(*Gets the following error message, and it goes no further:
Trying to refute subgoal 1...
neq_limit exceeded (current value is 9), ignoring all inequalities
*)
oops
(*_SRC.3_*)
lemma "n ≠ counter ==>
n ≠ Suc counter ==>
n ≠ Suc (Suc counter) ==>
n ≠ counter + 3 ==>
n ≠ counter + 4 ==>
n ≠ counter + 5 ==>
n ≠ counter + 6 ==>
n ≠ counter + 7 ==>
n ≠ counter + 8 ==>
n ≠ counter + 9 ==>
counter ≤ n ==>
n < counter + 10 ==> False"
using[[simp_trace, linarith_trace]]
apply(arith)
(*Same complaint about "9", but the proof will go through if there's no trace:
Trying to refute subgoal 1...
neq_limit exceeded (current value is 9), ignoring all inequalities
*)
oops