Skip to content

Commit

Permalink
Merge pull request #1223 from lean-ja/Seasawher/issue1206
Browse files Browse the repository at this point in the history
`push_cast` を紹介する
  • Loading branch information
Seasawher authored Dec 20, 2024
2 parents dc9b221 + 2493124 commit 540daad
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 0 deletions.
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

0 comments on commit 540daad

Please sign in to comment.