Isabelle/Isar(その16)
では帰納法の2つ目のサブゴールの証明部分を解説しましょう.
まず,1つ目の証明から2つ目に移ることをシステムに告げているのが
next
です.するとIsarは
proof (state): step 14
goal (1 subgoal):
1. ⋀nat. a nat = 2 ^ nat - 1 ⟹ a (Suc nat) = 2 ^ Suc nat - 1
のようにメタレベルの表示で答えますので,これに対応するstatementをfix,assume,showを用いて入力します.
まず,⋀nat. に対するのが
fix n
です(natというのはシステムが設けた束縛変数なので,入力時はnで構いません).次のa nat = 2 ^ nat - 1に対するのが
assume "a n = 2 ^ n - 1"
であり,nや1のタイプを明示しなくて良いのは,aがnatからrealへの写像と固定しているからです.これで「任意に固定した自然数nについて,a n = 2 ^ n - 1と仮定すると」という帰納法のお約束が出来ました.
後はa (Suc n) = 2 ^ (Suc n) - 1をshowするだけなのですが,いきなりでは寂しいので,ステップを設け,結果をalso-finallyで結んでいます.
まず今仮定したthisとassmsの2つ目を
from this and 2
のように参照して,a (Suc n) を n で表わすことを目標にしているのが
have "a (Suc n) = 2 * (2 ^ n - 1) + 1"
です.証明はただ代入だけなので
proof simp
qed
勿論
by simp
でOKです.
そしてこの結果をcalculationとして記憶させているのが
also
で,その右辺がSuc nの形になることを次の目標にしているのが
have "... = 2 ^ (Suc n) - 1"
です.これも簡単な計算なので上と同じくsimpで処理できます.
これで帰納法の結論の形になりましたのでfinallyでcalculationをthisにして参照させれば
show "a (Suc n) = 2 ^ (Suc n) - 1"
というstatementが可能となり,そのままなので
proof this
qed
もしくは
by this
その省略形である
.
で,2つ目サブゴールが
show a (Suc n) = 2 ^ Suc n - 1
Successful attempt to solve goal by exported rule:
(a ?na2 = 2 ^ ?na2 - 1) ⟹ a (Suc ?na2) = 2 ^ Suc ?na2 - 1
proof (state): step 27this:
a (Suc n) = 2 ^ Suc n - 1goal:
No subgoals!
のようになくなります.
最後に,一番外のproofに対するqedを入力,証明が完成します.