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