amgm_2

 それでは2のべき乗の場合を証明していきます.lemmaの名前とstatementは

lemma amgm_2:
  fixes a m n
  shows "ALL k. 0 <= a k ==> GM a m (2 ^ n) <= AM a m (2 ^ n)"

証明は項数についての帰納法ですが,数列はaとして固定し,その隣接する任意の2^N項についての成立から,隣接する任意の2^(N+1)項についての成立を導きます.その位置の任意性は m の任意性に他ならないので,イニシャルプルーフメソッドには arbitrary: m を付して

proof (induct n arbitrary: m)

と指定します.するとOutputは

proof (state): step 1

goal (2 subgoals):
1. ⋀m. ∀k. 0 ≤ a k ⟹ GM a m (2 ^ 0) ≤ AM a m (2 ^ 0)
2. ⋀n m.
(⋀m. ∀k. 0 ≤ a k ⟹ GM a m (2 ^ n) ≤ AM a m (2 ^ n)) ⟹
∀k. 0 ≤ a k ⟹ GM a m (2 ^ Suc n) ≤ AM a m (2 ^ Suc n)

となり,各サブゴール全体と仮定がmについて全称量化されることが判ります.

 では証明です.まずprint_casesで場合分けの設定を確認します.

cases:
0:
fix m
let "?case" = "GM a m (2 ^ 0) ≤ AM a m (2 ^ 0)"
assume 0.prems: "∀k. 0 ≤ a k"
Suc:
fix n_ m
let "?case" = "GM a m (2 ^ Suc n_) ≤ AM a m (2 ^ Suc n_)"
assume Suc.hyps: "⋀m. ∀k. 0 ≤ a k ⟹ GM a m (2 ^ n_) ≤ AM a m (2 ^ n_)"
and Suc.prems: "∀k. 0 ≤ a k"

 case 0のサブゴールは

  case 0 then show ?case by simp

で解決です.実際

have "GM a m (2 ^ 0) = a (Suc m)" by simp
have "AM a m (2 ^ 0) = a (Suc m)" by simp

が確認できます.

 次は case Suc です.帰納法の変数は上記の通りNにします.

next
  case (Suc N)

この後もprint_casesでは(生成時の)n_のままですが,print_factsを用いると

facts:
:
∀k. 0 ≤ a k
∀k. 0 ≤ a k ⟹ GM a ?m (2 ^ N) ≤ AM a ?m (2 ^ N)
Suc:
∀k. 0 ≤ a k ⟹ GM a ?m (2 ^ N) ≤ AM a ?m (2 ^ N)
∀k. 0 ≤ a k
Suc.hyps: ∀k. 0 ≤ a k ⟹ GM a ?m (2 ^ N) ≤ AM a ?m (2 ^ N)
Suc.prems: ∀k. 0 ≤ a k
assms:
this:
∀k. 0 ≤ a k ⟹ GM a ?m (2 ^ N) ≤ AM a ?m (2 ^ N)
∀k. 0 ≤ a k

のようにNになっています.で,目標は

GM a m (2 ^ Suc N) ≤ AM a m (2 ^ Suc N)

なので,この左辺を GM a m (2^N) と GM a (m+2^N) (2^N) の相乗平均として,項数が2の場合の補題を適用,得られた相加平均の分子の2項に帰納法の仮定を用いれば,AM a m (2^Suc N)となる仕組みです.

 従ってスタートは

  have "GM a m (2 ^ Suc N) = root 2 (GM a m (2 ^ N) * GM a (m + 2 ^ N) (2 ^ N))"

なのですが,どう証明するか...こんなときは

 simpやautoの手に余る部分を定理で補う

のが基本です.そこで,まず

proof simp

と試してみると

goal (1 subgoal):
 1. root (2 * 2 ^ N) (setprod a {Suc m..m + 2 * 2 ^ N}) =
    root 2
     (root (2 ^ N) (setprod a {Suc m..m + 2 ^ N}) *
      root (2 ^ N) (setprod a {Suc (m + 2 ^ N)..m + 2 ^ N + 2 ^ N}))

まではやってくれますので,根号を消去するための定理を

find_theorems "root (?m * ?n)"
find_theorems "root _ (?x * ?y)"

により

0 < ?m ⟹ 0 < ?n ⟹ root (?m * ?n) ?x = root ?m (root ?n ?x)
0 < ?n ⟹ root ?n (?x * ?y) = root ?n ?x * root ?n ?y

のように見つけ,イニシャルプルーフ

proof (simp add: real_root_mult_exp real_root_mult [symmetric])

と改めれば,サブゴールが根号の付く前の

goal (1 subgoal):
 1. setprod a {Suc m..m + 2 * 2 ^ N} =
    setprod a {Suc m..m + 2 ^ N} *
    setprod a {Suc (m + 2 ^ N)..m + 2 ^ N + 2 ^ N}

まで遡れます.