Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 9a30f8c

Browse files
committed
refactor(data/fin): drop fin.cast_add_right (#9371)
This was a duplicate of `fin.nat_add`. Also simplify some definitions of equivalences.
1 parent 850784c commit 9a30f8c

File tree

2 files changed

+200
-220
lines changed

2 files changed

+200
-220
lines changed

src/data/equiv/fin.lean

Lines changed: 46 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def fin_two_equiv : fin 2 ≃ bool :=
4444

4545
/-- The 'identity' equivalence between `fin n` and `fin m` when `n = m`. -/
4646
def fin_congr {n m : ℕ} (h : n = m) : fin n ≃ fin m :=
47-
equiv.subtype_equiv_right (λ x, by subst h)
47+
(fin.cast h).to_equiv
4848

4949
@[simp] lemma fin_congr_apply_mk {n m : ℕ} (h : n = m) (k : ℕ) (w : k < n) :
5050
fin_congr h ⟨k, w⟩ = ⟨k, by { subst h, exact w }⟩ :=
@@ -66,64 +66,40 @@ This is a version of `fin.pred_above` that produces `option (fin n)` instead of
6666
mapping both `i.cast_succ` and `i.succ` to `i`. -/
6767
def fin_succ_equiv' {n : ℕ} (i : fin (n + 1)) :
6868
fin (n + 1) ≃ option (fin n) :=
69-
have hx0 : ∀ {i x : fin (n + 1)}, i < x → x ≠ 0,
70-
from λ i x hix, ne_of_gt (lt_of_le_of_lt i.zero_le hix),
71-
have hiltx : ∀ {i x : fin (n + 1)}, ¬ i < x → ¬ x = i → x < i,
72-
from λ i x hix hxi, lt_of_le_of_ne (le_of_not_lt hix) hxi,
73-
have hxltn : ∀ {i x : fin (n + 1)}, ¬ i < x → ¬ x = i → (x : ℕ) < n,
74-
from λ i x hix hxi, lt_of_lt_of_le (hiltx hix hxi) (nat.le_of_lt_succ i.2),
75-
{ to_fun := λ x,
76-
if hix : i < x
77-
then some (x.pred (hx0 hix))
78-
else if hxi : x = i
79-
then none
80-
else some (x.cast_lt (hxltn hix hxi)),
69+
{ to_fun := i.insert_nth none some,
8170
inv_fun := λ x, x.cases_on' i (fin.succ_above i),
82-
left_inv := λ x,
83-
if hix : i < x
84-
then
85-
have hi : i ≤ fin.cast_succ (x.pred (hx0 hix)),
86-
by { simp only [fin.le_iff_coe_le_coe, fin.coe_cast_succ, fin.coe_pred],
87-
exact nat.le_pred_of_lt hix },
88-
by simp [dif_pos hix, option.cases_on'_some, fin.succ_above_above _ _ hi, fin.succ_pred]
89-
else if hxi : x = i
90-
then by simp [hxi]
91-
else have hi : fin.cast_succ (x.cast_lt (hxltn hix hxi)) < i,
92-
from lt_of_le_of_ne (le_of_not_gt hix) (by simp [hxi]),
93-
by simp only [dif_neg hix, dif_neg hxi, option.cases_on'_some, fin.succ_above_below _ _ hi,
94-
fin.cast_succ_cast_lt],
95-
right_inv := λ x, by {
96-
cases x,
97-
{ simp },
98-
{ dsimp,
99-
split_ifs,
100-
{ simp [fin.succ_above_above _ _ ((fin.lt_succ_above_iff _ _).1 h)] },
101-
{ simpa [fin.succ_above_ne] using h_1 },
102-
{ have : fin.cast_succ x < i,
103-
{ rwa [fin.lt_succ_above_iff, not_le] at h },
104-
simp [fin.succ_above_below _ _ this] } } } }
71+
left_inv := λ x, fin.succ_above_cases i (by simp) (λ j, by simp) x,
72+
right_inv := λ x, by cases x; dsimp; simp }
10573

10674
@[simp] lemma fin_succ_equiv'_at {n : ℕ} (i : fin (n + 1)) :
10775
(fin_succ_equiv' i) i = none := by simp [fin_succ_equiv']
10876

77+
@[simp] lemma fin_succ_equiv'_succ_above {n : ℕ} (i : fin (n + 1)) (j : fin n) :
78+
fin_succ_equiv' i (i.succ_above j) = some j :=
79+
@fin.insert_nth_apply_succ_above n (λ _, option (fin n)) i _ _ _
80+
10981
lemma fin_succ_equiv'_below {n : ℕ} {i : fin (n + 1)} {m : fin n} (h : m.cast_succ < i) :
11082
(fin_succ_equiv' i) m.cast_succ = some m :=
111-
by simp [fin_succ_equiv', dif_neg (not_lt_of_gt h), ne_of_lt h]
83+
by rw [← fin.succ_above_below _ _ h, fin_succ_equiv'_succ_above]
11284

11385
lemma fin_succ_equiv'_above {n : ℕ} {i : fin (n + 1)} {m : fin n} (h : i ≤ m.cast_succ) :
11486
(fin_succ_equiv' i) m.succ = some m :=
115-
by simp [fin_succ_equiv', fin.le_cast_succ_iff, *] at *
87+
by rw [← fin.succ_above_above _ _ h, fin_succ_equiv'_succ_above]
11688

11789
@[simp] lemma fin_succ_equiv'_symm_none {n : ℕ} (i : fin (n + 1)) :
11890
(fin_succ_equiv' i).symm none = i := rfl
11991

92+
@[simp] lemma fin_succ_equiv'_symm_some {n : ℕ} (i : fin (n + 1)) (j : fin n) :
93+
(fin_succ_equiv' i).symm (some j) = i.succ_above j :=
94+
rfl
95+
12096
lemma fin_succ_equiv'_symm_some_below {n : ℕ} {i : fin (n + 1)} {m : fin n} (h : m.cast_succ < i) :
12197
(fin_succ_equiv' i).symm (some m) = m.cast_succ :=
122-
by simp [fin_succ_equiv', ne_of_gt h, fin.succ_above, not_le_of_gt h]
98+
fin.succ_above_below i m h
12399

124100
lemma fin_succ_equiv'_symm_some_above {n : ℕ} {i : fin (n + 1)} {m : fin n} (h : i ≤ m.cast_succ) :
125101
(fin_succ_equiv' i).symm (some m) = m.succ :=
126-
by simp [fin_succ_equiv', fin.succ_above, h.not_lt]
102+
fin.succ_above_above i m h
127103

128104
lemma fin_succ_equiv'_symm_coe_below {n : ℕ} {i : fin (n + 1)} {m : fin n} (h : m.cast_succ < i) :
129105
(fin_succ_equiv' i).symm m = m.cast_succ :=
@@ -145,21 +121,15 @@ by cases n; refl
145121

146122
@[simp] lemma fin_succ_equiv_succ {n : ℕ} (m : fin n):
147123
(fin_succ_equiv n) m.succ = some m :=
148-
begin
149-
cases n, { exact m.elim0 },
150-
rw [fin_succ_equiv, fin_succ_equiv'_above (fin.zero_le _)],
151-
end
124+
fin_succ_equiv'_above (fin.zero_le _)
152125

153126
@[simp] lemma fin_succ_equiv_symm_none {n : ℕ} :
154127
(fin_succ_equiv n).symm none = 0 :=
155-
by cases n; refl
128+
fin_succ_equiv'_symm_none _
156129

157130
@[simp] lemma fin_succ_equiv_symm_some {n : ℕ} (m : fin n) :
158131
(fin_succ_equiv n).symm (some m) = m.succ :=
159-
begin
160-
cases n, { exact m.elim0 },
161-
rw [fin_succ_equiv, fin_succ_equiv'_symm_some_above (fin.zero_le _)],
162-
end
132+
congr_fun fin.succ_above_zero m
163133

164134
@[simp] lemma fin_succ_equiv_symm_coe {n : ℕ} (m : fin n) :
165135
(fin_succ_equiv n).symm m = m.succ :=
@@ -195,76 +165,49 @@ fin_succ_equiv'_symm_none _
195165

196166
/-- Equivalence between `fin m ⊕ fin n` and `fin (m + n)` -/
197167
def fin_sum_fin_equiv : fin m ⊕ fin n ≃ fin (m + n) :=
198-
{ to_fun := λ x, sum.rec_on x
199-
(λ y, ⟨y.1, nat.lt_of_lt_of_le y.2 $ nat.le_add_right m n⟩)
200-
(λ y, ⟨m + y.1, nat.add_lt_add_left y.2 m⟩),
201-
inv_fun := λ x, if H : x.1 < m
202-
then sum.inl ⟨x.1, H⟩
203-
else sum.inr ⟨x.1 - m, nat.lt_of_add_lt_add_left $
204-
show m + (x.1 - m) < m + n,
205-
from (nat.add_sub_of_le $ le_of_not_gt H).symm ▸ x.2⟩,
206-
left_inv := λ x, begin
207-
cases x with y y,
208-
{ simp [fin.ext_iff, y.is_lt], },
209-
{ have H : ¬m + y.val < m := not_lt_of_ge (nat.le_add_right _ _),
210-
simp [H, nat.add_sub_cancel_left, fin.ext_iff] }
211-
end,
212-
right_inv := λ x, begin
213-
by_cases H : (x:ℕ) < m,
214-
{ dsimp, rw [dif_pos H], simp },
215-
{ dsimp, rw [dif_neg H], simp [fin.ext_iff, nat.add_sub_of_le (le_of_not_gt H)] }
216-
end }
168+
{ to_fun := sum.elim (fin.cast_add n) (fin.nat_add m),
169+
inv_fun := λ i, @fin.add_cases m n (λ _, fin m ⊕ fin n) sum.inl sum.inr i,
170+
left_inv := λ x, by { cases x with y y; dsimp; simp },
171+
right_inv := λ x, by refine fin.add_cases (λ i, _) (λ i, _) x; simp }
217172

218173
@[simp] lemma fin_sum_fin_equiv_apply_left (i : fin m) :
219174
(fin_sum_fin_equiv (sum.inl i) : fin (m + n)) = fin.cast_add n i := rfl
220175

221176
@[simp] lemma fin_sum_fin_equiv_apply_right (i : fin n) :
222-
(fin_sum_fin_equiv (sum.inr i) : fin (m + n)) = fin.cast_add_right m i := rfl
177+
(fin_sum_fin_equiv (sum.inr i) : fin (m + n)) = fin.nat_add m i := rfl
223178

224-
@[simp] lemma fin_sum_fin_equiv_symm_apply_left (x : fin (m + n)) (h : ↑x < m) :
225-
fin_sum_fin_equiv.symm x = sum.inl ⟨x.1, h⟩ :=
226-
by simp [fin_sum_fin_equiv, dif_pos h]
179+
@[simp] lemma fin_sum_fin_equiv_symm_apply_cast_add (x : fin m) :
180+
fin_sum_fin_equiv.symm (fin.cast_add n x) = sum.inl x :=
181+
fin_sum_fin_equiv.symm_apply_apply (sum.inl x)
227182

228-
@[simp] lemma fin_sum_fin_equiv_symm_apply_right (x : fin (m + n)) (h : m ≤ ↑x) :
229-
fin_sum_fin_equiv.symm x = sum.inr ⟨x.1 - m, nat.lt_of_add_lt_add_left $
230-
show m + (x.1 - m) < m + n, from (nat.add_sub_of_le $ h).symm ▸ x.2⟩ :=
231-
by simp [fin_sum_fin_equiv, dif_neg (not_lt.mpr h)]
232-
233-
@[simp] lemma fin_sum_fin_equiv_symm_apply_cast_add {m n : ℕ} (i : fin m) :
234-
fin_sum_fin_equiv.symm (fin.cast_add n i) = sum.inl i :=
235-
begin
236-
rw [fin_sum_fin_equiv_symm_apply_left _ (fin.cast_add_lt _ _)],
237-
simp
238-
end
239-
240-
@[simp] lemma fin_sum_fin_equiv_symm_apply_cast_add_right {m n : ℕ} (i : fin m) :
241-
fin_sum_fin_equiv.symm (fin.cast_add_right n i) = sum.inr i :=
242-
begin
243-
rw [fin_sum_fin_equiv_symm_apply_right _ (fin.le_cast_add_right _ _)],
244-
simp
245-
end
183+
@[simp] lemma fin_sum_fin_equiv_symm_apply_nat_add (x : fin n) :
184+
fin_sum_fin_equiv.symm (fin.nat_add m x) = sum.inr x :=
185+
fin_sum_fin_equiv.symm_apply_apply (sum.inr x)
246186

247187
/-- The equivalence between `fin (m + n)` and `fin (n + m)` which rotates by `n`. -/
248188
def fin_add_flip : fin (m + n) ≃ fin (n + m) :=
249189
(fin_sum_fin_equiv.symm.trans (equiv.sum_comm _ _)).trans fin_sum_fin_equiv
250190

251-
@[simp] lemma fin_add_flip_apply_left {k : ℕ} (h : k < m)
191+
@[simp] lemma fin_add_flip_apply_cast_add (k : fin m) (n : ℕ) :
192+
fin_add_flip (fin.cast_add n k) = fin.nat_add n k :=
193+
by simp [fin_add_flip]
194+
195+
@[simp] lemma fin_add_flip_apply_nat_add (k : fin n) (m : ℕ) :
196+
fin_add_flip (fin.nat_add m k) = fin.cast_add m k :=
197+
by simp [fin_add_flip]
198+
199+
@[simp] lemma fin_add_flip_apply_mk_left {k : ℕ} (h : k < m)
252200
(hk : k < m + n := nat.lt_add_right k m n h)
253201
(hnk : n + k < n + m := add_lt_add_left h n) :
254202
fin_add_flip (⟨k, hk⟩ : fin (m + n)) = ⟨n + k, hnk⟩ :=
255-
begin
256-
dsimp [fin_add_flip, fin_sum_fin_equiv],
257-
rw [dif_pos h],
258-
refl,
259-
end
203+
by convert fin_add_flip_apply_cast_add ⟨k, h⟩ n
260204

261-
@[simp] lemma fin_add_flip_apply_right {k : ℕ} (h₁ : m ≤ k) (h₂ : k < m + n) :
262-
fin_add_flip (⟨k, h₂⟩ : fin (m + n)) =
263-
⟨k - m, lt_of_le_of_lt (nat.sub_le _ _) (by { convert h₂ using 1, simp [add_comm] })⟩ :=
205+
@[simp] lemma fin_add_flip_apply_mk_right {k : ℕ} (h₁ : m ≤ k) (h₂ : k < m + n) :
206+
fin_add_flip (⟨k, h₂⟩ : fin (m + n)) = ⟨k - m, sub_le_self'.trans_lt $ add_comm m n ▸ h₂⟩ :=
264207
begin
265-
dsimp [fin_add_flip, fin_sum_fin_equiv],
266-
rw [dif_neg (not_lt.mpr h₁)],
267-
refl,
208+
convert fin_add_flip_apply_nat_add ⟨k - m, (sub_lt_iff_right h₁).2 _⟩ m,
209+
{ simp [nat.add_sub_cancel' h₁] },
210+
{ rwa add_comm }
268211
end
269212

270213
/-- Rotate `fin n` one step to the right. -/
@@ -282,7 +225,7 @@ end
282225
lemma fin_rotate_last' : fin_rotate (n+1) ⟨n, lt_add_one _⟩ = ⟨0, nat.zero_lt_succ _⟩ :=
283226
begin
284227
dsimp [fin_rotate],
285-
rw fin_add_flip_apply_right,
228+
rw fin_add_flip_apply_mk_right,
286229
simp,
287230
end
288231

0 commit comments

Comments
 (0)