Isabelle Tutorial その12

5.10 Description Operators

HOLには二つの記述演算子があります。確定記述はその式を満たす唯一の値を表わします。不確定記述はその式を満たす任意の値を表わします。

5.10.1 Definite Description

確定記述は伝統的にιx. P(x)と書きます。これは、P(x)を満たす値が唯一ならばその値を、それ以外の場合は任意の値を表わします。IsabelleではιのかわりにTHEを使用します。THEについて、次の規則があります。

[|?P ?a; !!x. ?P x ==> x = ?a|] ==> (THE x. ?P x) = ?a    (the_equality)

Pを満たす最小の値を表わす演算子は次のように定義できます。

(LEAST x. P x) = (THE x. P x & (ALL y. P y --> x <= y))

次の定理を証明してみます。

theorem Least_equality: "[|P (k::nat); ALL x. P x --> k <= x|] ==> (LEAST x. P x) = k"
apply(simp add: Least_def)

最初のステップはLEASTの定義を展開しただけです。

 1. [| P k; ALL x. P x --> k <= x |]
    ==> (THE x. P x & (ALL y. P y --> x <= y)) = k

次に、the_equalityを使用します。

apply(rule the_equality)
 1. [| P k; ALL x. P x --> k <= x |] ==> P k & (ALL y. P y --> k <= y)
 2. !!x. [| P k; ALL x. P x --> k <= x; P x & (ALL y. P y --> x <= y) |]
         ==> x = k

the_equalityを使用すると、サブゴールは解が存在することと、それが唯一であることの二つとなります。一つ目の証明は自明です。二つ目の証明には反対称性に関する次の定理が必要です。

[|?x <= ?y; ?y <= ?x|] ==> ?x = ?y    (order_antisym)

次のステップで証明が完了します。

by(auto intro: order_antisym)
5.10.2 Indefinite Description

不確定記述は伝統的にεx. P(x)と書き、P(x)を満たす値が存在するならばその中の任意の値を表わします。IsabelleではεのかわりにSOMEを使用します。

逆関数を表わすinvSOMEを使用して定義されています。

inv f == % y. SOME x. f x = y    (inv_def)

f単射ではない場合もあるので、THEではなくSOMEを使用しなければなりません。例えば、inv SucSuc逆関数になっていることを次のように証明できます。

lemma "inv Suc (Suc n) = n"
by(simp add: inv_def)

左辺は展開され、SOME x. Suc x = Suc nになり、SOME x. x = n、さらにはnになります。この証明では値が唯一に決まるため、SOMEを確定記述として扱っています。実際、SOMEには次の規則があります。

[|?P ?a; !!x. ?P x ==> x = ?a|] ==> (SOME x. ?P x) = ?a    (some_equality)

また、SOMEには次の規則もあります。

?P ?x ==> ?P (SOME x. ?P x)                (someI)
[|?P ?a; !!x. ?P x ==> ?Q x|] ==> ?Q (SOME x. ?P x)    (someI2)

次に、例として選択公理を証明します。

theorem axiom_of_choice: "(ALL x. EX y. P x y) ==> EX f. ALL x. P x (f x)"
apply(rule exI, rule allI)
 1. !!x. ALL x. EX y. P x y ==> P x (?f x)

導入規則を適用しました。続けて除去規則も適用します。

apply(drule spec, erule exE)
 1. !!x y. P (?x2 x) y ==> P x (?f x)

someIを使用すると?f% x. SOME y. P x yとなります。さらに、?x2 xxとすることで、証明が完了します。

by(rule someI)

5.11 Some Proofs That Fail

正しくない定理を証明することで、どのように証明が失敗するかを見てみます。まずは、存在限量子と論理積の分配法則を証明してみます。

lemma "(EX x. P x) & (EX x. Q x) ==> EX x. P x & Q x"

まずは前提の論理積と存在限量子を除去します。

apply(erule conjE)
apply(erule exE)
 1. !!x. [| EX x. Q x; P x |] ==> EX x. P x & Q x

さらに存在限量子を除去すると、存在限量子の除去規則の条件により、新たな束縛変数が導入されます。

apply(erule exE)
 1. !!x xa. [| P x; Q xa |] ==> EX x. P x & Q x

結論の存在限量子に導入規則を適用するとスキーム変数が二カ所に現れますが、同じスキーム変数は同じ値と単一化しなければなりません。

apply(rule exI)
apply(rule conjI)
 1. !!x xa. [| P x; Q xa |] ==> P (?x3 x xa)
 2. !!x xa. [| P x; Q xa |] ==> Q (?x3 x xa)

一つ目のサブゴールにassumptionを適用すると、?x3 x xaxに束縛され、二つ目のサブゴールは証明できなくなります。

apply assumption
 1. !!x xa. [| P x; Q xa |] ==> Q x

次は、束縛変数とスキーム変数の関係を見てみます。

lemma "ALL y. R y y ==> EX x. ALL y. R x y"

まず、exIを適用します。サブゴールには、スキーム変数?xが含まれています。

apply(rule exI)
 1. ALL y. R y y ==> ALL y. R ?x y

一見assumptionを適用できそうに見えますが、束縛変数が補足されるため、?xyと単一化することはできません。証明を続けてみます。allIを使用して結論から全称限量子とともにyも取り除こうとしますが、yは今度はメタ全称限量子の束縛変数となります。

apply(rule allI)
 1. !!y. ALL y. R y y ==> R ?x y

specを適用すると、次のサブゴールが残ります。

apply(drule spec)
 1. !!y. R (?z2 y) (?z2 y) ==> R ?x y

明らかに?z2 yyと単一化しなければなりませんが、前と同じようにy?xを単一化することはできません。よってこの定理は証明できません。