Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

push_cast を紹介する #1223

Merged
merged 1 commit into from
Dec 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions LeanByExample/Tactic/PushCast.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/- # push_cast

`push_cast` タクティクは、ゴールや仮定に含まれる型強制(型キャスト)を「内側へ押し込む」はたらきをします。
-/
import Mathlib.Tactic

example (m n : ℕ) (h : m ≥ n) : n + ((m - n) : ℕ) = (m : ℤ) := by
-- 示すべき命題には `m - n : ℕ` を整数 `ℤ` に型キャストしたものが含まれている。
guard_target =ₛ ↑n + ↑(m - n) = (m : ℤ)

-- この状態では整数と自然数の演算が混ざっていてややこしいので、
-- `ring` だけで示すことはできない。
fail_if_success solve
| ring

-- 自然数の引き算は整数での引き算とは異なる定義がされているが、
-- この場合は `h : m ≥ n` という仮定があるので、`m - n : ℤ` と一致する。
-- この変換を `push_cast` タクティックで行うことができる。
push_cast [h]

-- 型キャストが「内側に押し込まれ」て、整数の話になった。
show ↑n + (↑m - ↑n) = (m : ℤ)

-- `ring` で示せるようになった!
ring

/- [`norm_cast`](./NormCast.md) や [`zify`](./Zify.md) などの型キャスト系のタクティクと併用されることもあります。-/

example (m n : ℕ) (h : n ≥ m) : (n + m) * (n - m) = n * n - m * m := by
-- 整数にキャストする
zify

-- 自然数の引き算が含まれているので、`ring` では示せない
fail_if_success solve
| ring

-- 仮定 `h : n ≥ m` を使って、`n - m` と `n * n - m * m` を整数にキャストする
push_cast [h, show n * n ≥ m * m from by bound]

-- `ring` で示せるようになった!
ring
1 change: 1 addition & 0 deletions booksrc/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@
- [omega: 自然数の線形計画を解く](./Tactic/Omega.md)
- [plausible: 反例を見つける](./Tactic/Plausible.md)
- [positivity: 正値性を示す](./Tactic/Positivity.md)
- [push_cast: 型キャストを内側へ](./Tactic/PushCast.md)
- [push_neg: ドモルガン](./Tactic/PushNeg.md)
- [qify: 有理数にキャストする](./Tactic/Qify.md)
- [rcases: パターン分解](./Tactic/Rcases.md)
Expand Down
Loading