Isabelle的简化器:它如何选择适用的规则? [具体例子]

时间:2017-01-16 14:46:01

标签: isabelle

我最近开始使用Isabelle,目前我对研究和理解简化器如何工作感兴趣。

所以,我开始做一些简单的证明并分析简化器的痕迹。

我的问题与简化器在证明期间选择应用哪些规则的方式有关。

以下是我怀疑的具体例子:

我通过归纳证明,前n个自然的总和等于n *(n + 1)/ 2。 在n = 0的情况下,[这是我的本案例代码]

    lemma
    fixes n :: nat
    shows "(∑ i=0..n. i) = n * (n + 1) div 2"
    proof (induct n)
    case 0
    have "(∑ i=0..0. i) = (0::nat)" using [[simp_trace_new mode=full]] by simp
    also have " ... = 0 * (0 + 1) div 2" using [[simp_trace_new mode=full]] by simp
    finally show ?case . 

[并且线路的简化器跟踪的相关部分“也有”... = 0 *(0 + 1)div 2“使用[[simp_trace_new mode = full]] by simp”]

Simplifier invoked 
  0 = 0 * (0 + 1) div 2 
    Apply rewrite rule? 
      Instance of Nat.One_nat_def: 1 ≡ Suc 0
      Trying to rewrite: 1 
        Successfully rewrote 
          1 ≡ Suc 0 
    Apply rewrite rule? 
      Instance of Nat.add_Suc_right: 0 + Suc 0 ≡ Suc (0 + 0)
      Trying to rewrite: 0 + Suc 0 
        Successfully rewrote 
          0 + Suc 0 ≡ Suc (0 + 0) 
    Apply rewrite rule? 
      Instance of Groups.monoid_add_class.add.right_neutral: 0 + 0 ≡ 0
      Trying to rewrite: 0 + 0 
        Successfully rewrote 
          0 + 0 ≡ 0 
    **Apply rewrite rule? 
      Instance of Nat.mult_Suc_right: 0 * Suc 0 ≡ 0 + 0 * 0
      Trying to rewrite: 0 * Suc 0 
        Successfully rewrote 
          0 * Suc 0 ≡ 0 + 0 * 0** 

我不明白为什么使用规则

  

Nat.mult_Suc_right:“m * Suc n = m +(m * n)”

证明0 * Suc0≡0+ 0 * 0,而不是使用规则

  

Nat.times_nat.mult_0:“0 * n =(0 :: nat)”

直接得出0 * Suc0≡0?

2 个答案:

答案 0 :(得分:1)

源代码似乎位于文件Nat.thy(第265-273行)中,在HOL中:

primrec times_nat where
  mult_0: "0 * n = (0::nat)"
| mult_Suc: "Suc m * n = n + (m * n)"

lemma mult_0_right [simp]: "(m::nat) * 0 = 0"
  by (induct m) simp_all

lemma mult_Suc_right [simp]: "m * Suc n = m + (m * n)"
 by (induct m) (simp_all add: add.left_commute)

并且规则mult_0在times_nat的定义中,首先出现。因此ML实现不遵循访问规则的声明顺序。

答案 1 :(得分:0)

简化器在这方面非常简单:它基本上选择匹配的第一个规则并应用它。