Isabelle Tutorial その13

5.12 Proving Theorems Using the blast Method

Isabelleのclassical reasonerは自動証明のためのツールの一つであり、その中でも最も重要なメソッドがblastです。

述語論理の例から見ていきます。次の例はAndrew's challengeと呼ばれ、自動証明が難しいとされる定理です。しかし、blastはこれを解くことができます。

lemma "((EX x. ALL y. p(x) = p(y)) = ((EX x. q(x)) = (ALL y. p(y)))) =
       ((EX x. ALL y. q(x) = q(y)) = ((EX x. p(x)) = (ALL y. q(y))))"
by blast

blastは集合にも使えます。次の定理もblastで解くことができます。

lemma "(UN i : I. A(i)) Int (UN j : J. B(j)) =
       (UN i : I. UN j : J. A(i) Int B(j))"
by blast

新しいルールを追加することで、classical reasonerを強化していくことができます。そのためには、導入、除去、破壊の各ルールを理解する必要があります。さらに、safeとunsafeを区別する必要があります。情報を失うことなく適用できるルールをsafeルールといい、情報を失ってしまうルールをunsafeルールといいます。情報を失うため、unsafeルールは適用を間違うと証明が失敗する可能性があります。classical reasonerは自動証明に失敗すると、最後に適用したunsafeルールまでバックトラックし、別の道を探します。

論理的同値にオプションiffを付けることでも、classical reasonerや単純化に新しいルールを追加できます。例として、リストの結合を見てみます。二つのリストを結合した結果が空リストであることと、それぞれのリストが空リストであることは同値です。次の定理を証明することで、classical reasonerと単純化の新しいルール追加されます。

lemma [iff]: "(xs @ ys = []) = (xs = [] & ys = [])"
apply(induct_tac xs)
apply(simp_all)
done

P = Qという定理にiffを付けると、導入規則Q => Pと破壊規則P => Qの二つのルールが作られます。どちらもsafeルールであり、ルールに含まれるPQに置き換えます。また、単純化も同様にPQに置き換えます。単純化とclassical reasonerの違いは、単純化は可能な限り置き換えを繰り返すだけなのに対し、classical reasonerは証明に失敗した場合はバックトラックし、別の道を探すところです。

5.13 Other Classical Reasoning Methods

メソッドclarifyはゴールを複数に分割することなく、safeルールだけを適用します。例えば次の正しくない補題を証明してみます。

lemma "(ALL x. P x) & (EX x. Q x) --> (ALL x. P x & Q x)"
apply clarify

メソッドblastを使用した場合は単に失敗するだけですが、clarifyを使用した場合は次のサブゴールが残ります。

 1. !!x xa. [| ALL x. P x; Q xa |] ==> P x & Q x

前提のQ xaと結論のQ xは変数が異なるため、証明に失敗します。このように、clarifyを使用すると証明がうまくいかない理由のヒントが得られます。

メソッドclarsimpclarifysimpを同時に使用するメソッドです。こちらはsimpによってゴールが複数に分割される場合があります。

メソッドforceはclassical reasonerと単純化を一つのサブゴールにのみ適用します。証明に失敗した場合は単に失敗するのみで、ゴールを変形することはありません。autoもclassical reasonerと単純化の両方を使用しますが、こちらは全てのサブゴールに適用されます。また、証明に失敗した場合も途中経過がサブゴールとして残ります。よってautoは非常に多くの新しいサブゴールに変形してしまう可能性があります。またforceautoよりも深く証明しようと試みるため、終了するまで時間がかかる場合もあります。

メソッドblastが組み込みのfirst-order reasonerを使用して証明しようとするのに対して、fastbestは標準的なIsabelleの推論を使用します。これによって証明が遅くなりますが、Isabelle固有の規則を使えるようになります。例えば、SOMEの導入規則をもう一度見てみます。

?P ?x = (SOME x. ?P x)    (someI)

次の補題を証明してみます。

lemma "[|Q a; P a|] ==> P (SOME x. P x & Q x) & Q (SOME x. P x & Q x)"
apply(rule someI)

someIを使用すると次のサブゴールが残ります。

 1. [| Q a; P a |] ==> P ?x & Q ?x

ここから先の証明は明らかです。この定理を1ステップで証明するにはどうしたらよいでしょうか。blastは高階の単一化ができないためうまくいきません。このような場合はfastを使用します。

apply(fast intro!: someI)

bestも同様に働きますが、fast深さ優先探索で証明できる経路を探すのに対し、bestは最良優先探索で証明しようとします。

5.14 Finding More Theorems

パターンマッチや名前で定理を探す他に、証明しようとしているゴールに適用できるルールを探す方法があります。

introは導入規則として適用できる定理を検索します。例えば次のゴール

 1. A & B

に対してintroとして定理を検索すると、==> ?P & ?Qで終わる定理を探すことができます。

検索条件は単に並べて組み合わせることができます。例えば

"_ @ _" intro

は現在のゴールに適用可能な、関数@に関係する導入規則を検索します。

elimdestは同様にそれぞれ現在のゴールに適用可能な除去規則と破壊規則を検索します。