-
-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1257 from lean-ja/Seasawher/issue242
`use` タクティクを紹介する
- Loading branch information
Showing
3 changed files
with
68 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
/- # use | ||
`use` タクティクは、「~を満たす `x` が存在する」という命題を示すために、証拠になる `x` を具体的に示します。 | ||
ゴールが `⊢ ∃ x, P x` のとき、`x : X` がローカルコンテキストにあれば、`use x` によりゴールが `⊢ P x` に変わります。同時に、`P x` が自明な場合は証明が終了します。 | ||
-/ | ||
import Mathlib.Tactic.Use | ||
import Mathlib.Tactic.Linarith | ||
|
||
#guard_msgs (drop warning) in --# | ||
example {α : Type} (P : α → Prop) (x : α) : ∃ y, P y := by | ||
use x | ||
-- ゴールが `P x` に変わる | ||
guard_target =ₛ P x | ||
|
||
sorry | ||
|
||
/- ## exists との違い | ||
これだけの説明だと [`exists`](./Exists.md) タクティクと同じに見えますが、`use` タクティクには `exists` より優れている点があります。 | ||
### discharger が指定できる | ||
`use` は、証拠を与えた後にゴールを閉じるために使うタクティク(`discharger` と呼ばれます)を指定することができます。 | ||
-/ | ||
|
||
example (x : Rat) (h : 3 * x + 6 > 6) : ∃ (y : Rat), y > 0 := by | ||
exists x | ||
linarith | ||
|
||
example (x : Rat) (h : 3 * x + 6 > 6) : ∃ (y : Rat), y > 0 := by | ||
-- `discharger` として `linarith` を指定することができる | ||
use (discharger := linarith) x | ||
|
||
/- ### Exists 以外の構造体にも使用できる | ||
`exists` は、ゴールの型が `Exists` であるという想定をしているため、フィールドの数が3以上であるような構造体に対して使うとエラーになります。 | ||
-/ | ||
|
||
/-- 例示のための構造体。フィールドの数が `Exists` より多い -/ | ||
structure Foo where | ||
x : Int | ||
pos : x > 0 | ||
sq : x ^ 2 = 9 | ||
|
||
/-- `Foo` の項を具体的に与える例 -/ | ||
example : Foo := ⟨3, by simp, by simp⟩ | ||
|
||
/-- | ||
error: invalid constructor ⟨...⟩, insufficient number of arguments, constructs 'Foo.mk' has #3 explicit fields, but only #2 provided | ||
-/ | ||
#guard_msgs in | ||
example : Foo := by | ||
exists 3 | ||
|
||
/- しかし、`use` タクティクであれば対応することができます。 -/ | ||
|
||
example : Foo := by | ||
-- 最初のフィールドを `3` で埋めるように指示する | ||
use 3 | ||
|
||
-- 残りのフィールドは `simp` で証明することができる | ||
all_goals simp | ||
|
||
example : Foo := by | ||
-- `discharger` を指定するバージョン | ||
use (discharger := simp) 3 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters