@@ -44,7 +44,7 @@ def fin_two_equiv : fin 2 ≃ bool :=
44
44
45
45
/-- The 'identity' equivalence between `fin n` and `fin m` when `n = m`. -/
46
46
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
48
48
49
49
@[simp] lemma fin_congr_apply_mk {n m : ℕ} (h : n = m) (k : ℕ) (w : k < n) :
50
50
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
66
66
mapping both `i.cast_succ` and `i.succ` to `i`. -/
67
67
def fin_succ_equiv' {n : ℕ} (i : fin (n + 1 )) :
68
68
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,
81
70
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 }
105
73
106
74
@[simp] lemma fin_succ_equiv'_at {n : ℕ} (i : fin (n + 1 )) :
107
75
(fin_succ_equiv' i) i = none := by simp [fin_succ_equiv']
108
76
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
+
109
81
lemma fin_succ_equiv'_below {n : ℕ} {i : fin (n + 1 )} {m : fin n} (h : m.cast_succ < i) :
110
82
(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 ]
112
84
113
85
lemma fin_succ_equiv'_above {n : ℕ} {i : fin (n + 1 )} {m : fin n} (h : i ≤ m.cast_succ) :
114
86
(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]
116
88
117
89
@[simp] lemma fin_succ_equiv'_symm_none {n : ℕ} (i : fin (n + 1 )) :
118
90
(fin_succ_equiv' i).symm none = i := rfl
119
91
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
+
120
96
lemma fin_succ_equiv'_symm_some_below {n : ℕ} {i : fin (n + 1 )} {m : fin n} (h : m.cast_succ < i) :
121
97
(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
123
99
124
100
lemma fin_succ_equiv'_symm_some_above {n : ℕ} {i : fin (n + 1 )} {m : fin n} (h : i ≤ m.cast_succ) :
125
101
(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
127
103
128
104
lemma fin_succ_equiv'_symm_coe_below {n : ℕ} {i : fin (n + 1 )} {m : fin n} (h : m.cast_succ < i) :
129
105
(fin_succ_equiv' i).symm m = m.cast_succ :=
@@ -145,21 +121,15 @@ by cases n; refl
145
121
146
122
@[simp] lemma fin_succ_equiv_succ {n : ℕ} (m : fin n):
147
123
(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 _)
152
125
153
126
@[simp] lemma fin_succ_equiv_symm_none {n : ℕ} :
154
127
(fin_succ_equiv n).symm none = 0 :=
155
- by cases n; refl
128
+ fin_succ_equiv'_symm_none _
156
129
157
130
@[simp] lemma fin_succ_equiv_symm_some {n : ℕ} (m : fin n) :
158
131
(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
163
133
164
134
@[simp] lemma fin_succ_equiv_symm_coe {n : ℕ} (m : fin n) :
165
135
(fin_succ_equiv n).symm m = m.succ :=
@@ -195,76 +165,49 @@ fin_succ_equiv'_symm_none _
195
165
196
166
/-- Equivalence between `fin m ⊕ fin n` and `fin (m + n)` -/
197
167
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 }
217
172
218
173
@[simp] lemma fin_sum_fin_equiv_apply_left (i : fin m) :
219
174
(fin_sum_fin_equiv (sum.inl i) : fin (m + n)) = fin.cast_add n i := rfl
220
175
221
176
@[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
223
178
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)
227
182
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)
246
186
247
187
/-- The equivalence between `fin (m + n)` and `fin (n + m)` which rotates by `n`. -/
248
188
def fin_add_flip : fin (m + n) ≃ fin (n + m) :=
249
189
(fin_sum_fin_equiv.symm.trans (equiv.sum_comm _ _)).trans fin_sum_fin_equiv
250
190
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)
252
200
(hk : k < m + n := nat.lt_add_right k m n h)
253
201
(hnk : n + k < n + m := add_lt_add_left h n) :
254
202
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
260
204
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₂⟩ :=
264
207
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 }
268
211
end
269
212
270
213
/-- Rotate `fin n` one step to the right. -/
282
225
lemma fin_rotate_last' : fin_rotate (n+1 ) ⟨n, lt_add_one _⟩ = ⟨0 , nat.zero_lt_succ _⟩ :=
283
226
begin
284
227
dsimp [fin_rotate],
285
- rw fin_add_flip_apply_right ,
228
+ rw fin_add_flip_apply_mk_right ,
286
229
simp,
287
230
end
288
231
0 commit comments