Isabelle/Isar(その11)

 前回2つのproofコマンドの引数ととしたmethodは,simpとrule 1でした.

 simpは見ての通り計算も出来ますし

lemma "A & B --> A" by simp

のようにロジックも解し,かなり多才ですがあまり深いことは出来ません.例えば

lemma "(0::real) <= x ^ 2 + 1" by simp

は通りますが

lemma "(0::real) <= x ^ 2 + x + 1" by simp

のOutputは

Failed to finish proof

です.なお,simpがどのように証明に成功し,失敗しているかを見るには証明の外,すなわち,theoryモード内で

declare [[simp_trace]]

として,トレースをオンにします.すると1つ目の場合には

[1]SIMPLIFIER INVOKED ON THE FOLLOWING TERM:
0 ≤ x² + 1
[1]Applying instance of rewrite rule "Groups.ordered_comm_monoid_add_class.add_nonneg_nonneg":
0 ≤ ?a1 ⟹ 0 ≤ ?b1 ⟹ 0 ≤ ?a1 + ?b1 ≡ True
[1]Trying to rewrite:
0 ≤ x² ⟹ 0 ≤ 1 ⟹ 0 ≤ x² + 1 ≡ True
simp_trace_depth_limit exceeded!
simp_trace_depth_limit exceeded!
[1]SUCCEEDED
0 ≤ x² + 1 ≡ True

2つ目の場合には

[1]SIMPLIFIER INVOKED ON THE FOLLOWING TERM:
0 ≤ x² + x + 1
[1]Applying instance of rewrite rule "Groups.ordered_comm_monoid_add_class.add_nonneg_nonneg":
0 ≤ ?a1 ⟹ 0 ≤ ?b1 ⟹ 0 ≤ ?a1 + ?b1 ≡ True
[1]Trying to rewrite:
0 ≤ x² + x ⟹ 0 ≤ 1 ⟹ 0 ≤ x² + x + 1 ≡ True
simp_trace_depth_limit exceeded!
[1]FAILED
0 ≤ x² + x ⟹ 0 ≤ 1 ⟹ 0 ≤ x² + x + 1 ≡ True
Failed to apply initial proof method:
goal (1 subgoal):
0 ≤ x² + x + 1
1. 0 ≤ x² + x + 1

と表示されるはずです.同様に今回の証明の各所にあるsimpにカーソルを合わせるとsimpが参照している定理などが表示されますが,トレースの後は

declare [[simp_trace=false]]

としておかないとシステムの負荷が大きくなります.なお,simpの手に余ったこのレンマの証明にはcsdpを用いるか,中間の目標をhaveコマンドで設定,それにグレブナー基底による代数計算methodであるalgebraを適用した後,simpすれば

lemma "(0::real) <= x ^ 2 + x + 1"
proof -
  have "x ^ 2 + x + 1 = (x + 1 / 2) ^ 2 + 3 / 4"
    by algebra
  thus ?thesis by simp
qed

となります.

 もう1つのruleコマンドは,apply-doneスタイルの基本ですが,Isarではsimp add:に吸収されており

proof (simp add: 1)

とすることもできます.