Isabelle/Isar(その29)

 Isarの証明は対話的,つまりシステムが生成するサブゴールを次の目標とするのが基本ですが,過信は禁物です.例えば

lemma
  fixes a b :: "real"
  assumes "a + b = 0"
  shows "a < 0 | b <= 0"
proof

に対するOutputは

proof (state): step 1

goal (1 subgoal):
1. a < (0∷real)
variables:
a, b :: real

となり,確かに十分条件ではありますが,無理な相談です.これはproofによるイニシャルプルーフが(rule disjI1)となることが原因なので,人間が方針を決めねばなりません.

 まずは,プルーバーに任せてみましょう.

lemma
  fixes a b :: "real"
  assumes "a + b = 0"
  shows "a < 0 | b <= 0"
using assms by arith

通りました.simpには無理ですが,auto,forceなどでも通ります.

 次に,aについて場合を分けて見ます.つまり,a<0がTrue,Falseで分ける訳です.

lemma
  fixes a b :: "real"
  assumes "a + b = 0"
  shows "a < 0 | b <= 0"
proof (cases "a < 0")
  case True
  thus ?thesis ..
next
  case False
  hence "0 <= a" by simp
  with assms have "b <= 0" by simp
  thus ?thesis ..
qed

?thesisはシステムが結論に付ける別名で,caseの名前はprint_casesとすれば見られます.

 今度は,背理法です.

lemma
  fixes a b :: "real"
  assumes "a + b = 0"
  shows "a < 0 | b <= 0"
proof (rule ccontr)
  assume "~?thesis"
  hence "0 <= a & 0 < b" by simp
  hence "0 < a + b" by simp
  thus False using assms by simp
qed

 3つの場合を敢えて場合分けで処理するなら

lemma
  fixes a b c :: "real"
  assumes "a + b + c = 0"
  shows "a < 0 | b < 0 | c <= 0"
proof (cases "a < 0")
  case True thus ?thesis ..
next
  case False note na = this thus ?thesis
  proof (cases "b < 0")
    case True thus ?thesis
      by (intro disj_assoc disjI1 disjI2)
  next
    case False
    with na assms have "c <= 0" by arith
    thus ?thesis
      by (intro disj_assoc disjI2)
  qed
qed

2つ目,3つ目の?thesisの証明は勿論by simpでも構いません.