ユニバーサル量指定子
Lars の答えを拡張するには:∀x>0. P x
は∀x. x > 0 ⟶ P x
. 結果として、このようなステートメントを証明したい場合は、最初に で全称量指定子をallI
取り除き、次に で含意を取り除く必要がありimpI
ます。次のようなことができます。
lemma "∀x>0. P x"
proof (rule allI, rule impI)
または、使用できなくなるまでintro
適用するのとほぼ同じです。rule
lemma "∀x>0. P x"
proof (intro allI impI)
または、「安全」とsafe
宣言されているすべての導入ルールを積極的に適用するを使用できます。allI
impI
lemma "∀x>0. P x"
proof safe
いずれにせよ、あなたの新しい証明状態は
proof (state)
goal (1 subgoal):
1. ⋀x. 0 < x ⟹ P x
そして、次のように進めることができます:
lemma "∀x>0. P (x :: nat)"
proof safe
fix x :: nat assume "x > 0"
show "P x"
注釈を追加したことに注意してください。あなたのタイプがわからなかったP
ので、 を使用しnat
ました。Isar で変数を修正し、型が仮定から明確でない場合、新しい自由型変数が導入されたという警告が表示されますが、これは望んでいたものではありません。その警告が表示されたら、fix
上記のように型注釈を追加する必要があります。
存在数量詞
存在量指定子の場合、技術的な理由によりsafe
イントロ ルールが常に安全であるとは限らないため、機能しません。exI
の典型的な証明パターンは次の∃x>0. P x
ようになります。
lemma "∃x>0. P (x :: nat)"
proof -
have "42 > (0 :: nat)" by simp
moreover have "P 42" sorry
ultimately show ?thesis by blast
qed
またはもう少し明示的に:
lemma "∃x>0. P (x :: nat)"
proof -
have "42 > 0 ∧ P 42" sorry
thus ?thesis by (rule exI)
qed
実在の証人 (つまり、この例では 42) がobtain
コマンドから取得した変数に依存しない場合は、より直接的に実行することもできます。
lemma "∃x>0. P (x :: nat)"
proof (intro exI conjI)
これにより、目標?x > 0
とが残りますP ?x
。?x
は、任意に配置できるスキーマ変数であることに注意してください。したがって、次のように証明を完成させることができます。
lemma "∃x>0. P (x :: nat)"
proof (intro exI conjI)
show "42 > (0::nat)" by simp
show "P 42" sorry
qed
私が言ったように、あなたの実存証人が技術的な制限のためにあなたが得たいくつかの変数に依存している場合、これは機能しません. obtain
その場合、私が言及した他の解決策にフォールバックする必要があります。