与Isabelle重温高斯总和

时间:2019-05-27 16:57:37

标签: isabelle

我对稳定的论点的变化感兴趣:

"(∑ i=1..k . i) = k*(k+1) div 2"

我们知道这是通过简单的归纳得出的,但直觉有些不同。查看此公式的一种方法是,如果将数字序列1..k的极值相加,则会得到

1+k = 2 + (k-1) = ...

然后您只需乘以正确的次数即可获得完整的总和。

我想重现此参数以显示以下不平等现象:

"(∑n = 1..k - 1. cmod (f (int n))) ≤ 2 * (∑n ≤ k div 2. cmod (f (int n)))"

在这里,我知道每cmod (f (int k - n)) = cmod (cnj (f n))n

您看到伊莎贝尔(Isabelle)证明这一点的优雅方式吗?

1 个答案:

答案 0 :(得分:2)

以一种优雅的方式进行证明的技巧是认识到∑i=1..k. i∑i=1..k. k + 1 - i相同,然后将其添加到原始总和中以使i被取消。这是一个简单的重新索引参数:

lemma "(∑i=1..k. i :: nat) = k * (k + 1) div 2"
proof -
  have "(∑i=1..k. i) = (∑i=1..k. k + 1 - i)"
    by (rule sum.reindex_bij_witness[of _ "λi. k + 1 - i" "λi. k + 1 - i"]) auto
  hence "2 * (∑i=1..k. i) = (∑i=1..k. i) + (∑i=1..k. k + 1 - i)"
    by simp
  also have "… = k * (k + 1)"
    by (simp add: sum.distrib [symmetric])
  finally show ?thesis by simp
qed

对于您提到的另一件事,我认为做到这一点的最佳方法是先将总和拆分为少于k div 2的元素和其余元素。然后,您可以像上面的一样重新索引第二个总和。然后出现不平等部分,因为如果k为奇数,您可能会在中间有一个多余的剩余元素,而必须将其丢弃。

证明重要部分的简要草图:

lemma
  assumes "⋀i. f i ≥ 0"
  shows   "(∑i=1..<k. f (i::nat) :: real) = T"
proof -
  (* Separate summation domain into two disjoint parts *)
  have "(∑i=1..<k. f i) = (∑i∈{1..k div 2}∪{k div 2<..<k}. f i)"
    by (intro sum.cong) auto
  (* Pull sum apart *)
  also have "… = (∑i∈{1..k div 2}. f i) + (∑i∈{k div 2<..<k}. f i)"
    by (subst sum.union_disjoint) auto
  (* Reindex the second sum *)
  also have "(∑i∈{k div 2<..<k}. f i) = (∑i∈{1..<k - k div 2}. f (k - i))"
    by (rule sum.reindex_bij_witness[of _ "λi. k - i" "λi. k - i"]) auto
  (* Throw away the element in the middle if k is odd *)
  also have "… ≤ (∑i∈{1..k div 2}. f (k - i))"
    using assms by (intro sum_mono2) auto
  finally have "(∑i=1..<k. f i) ≤ (∑i=1..k div 2. f i + f (k - i))"
    by (simp add: sum.distrib)

弄清楚如何在Isabelle中惯用地进行这些求和运算需要一些经验。 sum.reindex_bij_witness是一个非常有用的规则(如您所见)。 sum.mono_neutral_left/right之类的东西也可以提供很多帮助。