Isabelle/Isar(その17)

 Isarに負けないよう,くどく続けます.

 仮に以上の計算過程を省略するなら,これまでの話から,次のように書けることが判るでしょう.

lemma
  fixes "a" :: "nat => real" and "n" :: "nat"
  assumes "a 0 = 0" and "ALL n. a (Suc n) = 2 * a n + 1"
  shows "a n = 2 ^ n - 1"
proof (induction n)
  show "a 0 = 2 ^ 0 - 1"
    using assms(1) by simp
next
  fix n
  assume "a n = 2 ^ n - 1"
  thus "a (Suc n) = 2 ^ Suc n - 1"
    using assms(2) by simp
qed

先に挙げたものに比べれば簡潔で,処理も統一されています.

 しかし,大きな結論の場合,show,assume,thusの後に,showsのときと同じ形の式を繰り返し入力するのはやはり面倒です.Isarではassumesで設定した仮定をassmsとして参照できるように,マッチングによりshowsで設定した結論の形を証明内で用いることが出来ます.つまり

lemma
  fixes "a" :: "nat => real" and "n" :: "nat"
  assumes "a 0 = 0" and "ALL n. a (Suc n) = 2 * a n + 1"
  shows "a n = 2 ^ n - 1" (is "?P n")
proof (induction n)
  show "?P 0"
    using assms(1) by simp
next
  fix n
  assume "?P n"
  thus "?P (Suc n)"
    using assms(2) by simp
qed

のように「これを ?P n とおくと」というお約束です.設定には利用する形に応じて

  (is "?L n = ?R n")
  (is "_= ?R n")
  (is "?P n" is "?L n = ?R n")
  (is "?P")

のように様々なスタイルが使えます.