@@ -64,62 +64,80 @@ by { cases k, refl, }
64
64
/-- An equivalence that removes `i` and maps it to `none`.
65
65
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
- def fin_succ_equiv' {n : ℕ} (i : fin n ) :
67
+ def fin_succ_equiv' {n : ℕ} (i : fin (n + 1 ) ) :
68
68
fin (n + 1 ) ≃ option (fin n) :=
69
- { to_fun := λ x, if x = i.cast_succ then none else some (i.pred_above x),
70
- inv_fun := λ x, x.cases_on' i.cast_succ (fin.succ_above i.cast_succ),
71
- left_inv := λ x, if h : x = i.cast_succ then by simp [h]
72
- else by simp [h, fin.succ_above_ne],
73
- right_inv := λ x, by { cases x; simp [fin.succ_above_ne] }}
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)),
81
+ 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 ] } } } }
74
105
75
106
@[simp] lemma fin_succ_equiv'_at {n : ℕ} (i : fin (n + 1 )) :
76
- (fin_succ_equiv' i) i.cast_succ = none := by simp [fin_succ_equiv']
107
+ (fin_succ_equiv' i) i = none := by simp [fin_succ_equiv']
77
108
78
- lemma fin_succ_equiv'_below {n : ℕ} {i m : fin (n + 1 )} (h : m < i) :
109
+ lemma fin_succ_equiv'_below {n : ℕ} {i : fin (n + 1 )} {m : fin n} (h : m.cast_succ < i) :
79
110
(fin_succ_equiv' i) m.cast_succ = some m :=
80
- begin
81
- have : m.cast_succ ≤ i.cast_succ := h.le,
82
- simp [fin_succ_equiv', h.ne, fin.pred_above_below, this ]
83
- end
111
+ by simp [fin_succ_equiv', dif_neg (not_lt_of_gt h), ne_of_lt h]
84
112
85
- lemma fin_succ_equiv'_above {n : ℕ} {i m : fin (n + 1 )} (h : i ≤ m) :
113
+ lemma fin_succ_equiv'_above {n : ℕ} {i : fin (n + 1 )} {m : fin n} (h : i ≤ m.cast_succ ) :
86
114
(fin_succ_equiv' i) m.succ = some m :=
87
- begin
88
- have : i.cast_succ < m.succ,
89
- { refine (lt_of_le_of_lt _ m.cast_succ_lt_succ), exact h },
90
- simp [fin_succ_equiv', this , fin.pred_above_above, ne_of_gt]
91
- end
115
+ by simp [fin_succ_equiv', fin.le_cast_succ_iff, *] at *
92
116
93
117
@[simp] lemma fin_succ_equiv'_symm_none {n : ℕ} (i : fin (n + 1 )) :
94
- (fin_succ_equiv' i).symm none = i.cast_succ := rfl
118
+ (fin_succ_equiv' i).symm none = i := rfl
95
119
96
- lemma fin_succ_equiv_symm'_some_below {n : ℕ} {i m : fin (n + 1 )} (h : m < i) :
120
+ lemma fin_succ_equiv'_symm_some_below {n : ℕ} {i : fin (n + 1 )} {m : fin n} (h : m.cast_succ < i) :
97
121
(fin_succ_equiv' i).symm (some m) = m.cast_succ :=
98
122
by simp [fin_succ_equiv', ne_of_gt h, fin.succ_above, not_le_of_gt h]
99
123
100
- lemma fin_succ_equiv_symm'_some_above {n : ℕ} {i m : fin (n + 1 )} (h : i ≤ m) :
124
+ lemma fin_succ_equiv'_symm_some_above {n : ℕ} {i : fin (n + 1 )} {m : fin n} (h : i ≤ m.cast_succ ) :
101
125
(fin_succ_equiv' i).symm (some m) = m.succ :=
102
126
by simp [fin_succ_equiv', fin.succ_above, h.not_lt]
103
127
104
- lemma fin_succ_equiv_symm'_coe_below {n : ℕ} {i m : fin (n + 1 )} (h : m < i) :
128
+ lemma fin_succ_equiv'_symm_coe_below {n : ℕ} {i : fin (n + 1 )} {m : fin n} (h : m.cast_succ < i) :
105
129
(fin_succ_equiv' i).symm m = m.cast_succ :=
106
- by { convert fin_succ_equiv_symm'_some_below h; simp }
130
+ fin_succ_equiv'_symm_some_below h
107
131
108
- lemma fin_succ_equiv_symm'_coe_above {n : ℕ} {i m : fin (n + 1 )} (h : i ≤ m) :
132
+ lemma fin_succ_equiv'_symm_coe_above {n : ℕ} {i : fin (n + 1 )} {m : fin n} (h : i ≤ m.cast_succ ) :
109
133
(fin_succ_equiv' i).symm m = m.succ :=
110
- by { convert fin_succ_equiv_symm'_some_above h; simp }
134
+ fin_succ_equiv'_symm_some_above h
111
135
112
136
/-- Equivalence between `fin (n + 1)` and `option (fin n)`.
113
137
This is a version of `fin.pred` that produces `option (fin n)` instead of
114
138
requiring a proof that the input is not `0`. -/
115
- -- TODO: make the `n = 0` case neater
116
139
def fin_succ_equiv (n : ℕ) : fin (n + 1 ) ≃ option (fin n) :=
117
- nat.cases_on n
118
- { to_fun := λ _, none,
119
- inv_fun := λ _, 0 ,
120
- left_inv := λ _, by simp,
121
- right_inv := λ x, by { cases x, simp, exact x.elim0 } }
122
- (λ _, fin_succ_equiv' 0 )
140
+ fin_succ_equiv' 0
123
141
124
142
@[simp] lemma fin_succ_equiv_zero {n : ℕ} :
125
143
(fin_succ_equiv n) 0 = none :=
@@ -129,7 +147,7 @@ by cases n; refl
129
147
(fin_succ_equiv n) m.succ = some m :=
130
148
begin
131
149
cases n, { exact m.elim0 },
132
- convert fin_succ_equiv'_above m .zero_le
150
+ rw [ fin_succ_equiv, fin_succ_equiv '_above (fin .zero_le _)],
133
151
end
134
152
135
153
@[simp] lemma fin_succ_equiv_symm_none {n : ℕ} :
@@ -140,7 +158,7 @@ by cases n; refl
140
158
(fin_succ_equiv n).symm (some m) = m.succ :=
141
159
begin
142
160
cases n, { exact m.elim0 },
143
- convert fin_succ_equiv_symm'_some_above m .zero_le
161
+ rw [fin_succ_equiv, fin_succ_equiv'_symm_some_above (fin .zero_le _)],
144
162
end
145
163
146
164
@[simp] lemma fin_succ_equiv_symm_coe {n : ℕ} (m : fin n) :
@@ -149,7 +167,31 @@ fin_succ_equiv_symm_some m
149
167
150
168
/-- The equiv version of `fin.pred_above_zero`. -/
151
169
lemma fin_succ_equiv'_zero {n : ℕ} :
152
- fin_succ_equiv' (0 : fin (n + 1 )) = fin_succ_equiv (n + 1 ) := rfl
170
+ fin_succ_equiv' (0 : fin (n + 1 )) = fin_succ_equiv n := rfl
171
+
172
+ /-- `equiv` between `fin (n + 1)` and `option (fin n)` sending `fin.last n` to `none` -/
173
+ def fin_succ_equiv_last {n : ℕ} : fin (n + 1 ) ≃ option (fin n) :=
174
+ fin_succ_equiv' (fin.last n)
175
+
176
+ @[simp] lemma fin_succ_equiv_last_cast_succ {n : ℕ} (i : fin n) :
177
+ fin_succ_equiv_last i.cast_succ = some i :=
178
+ fin_succ_equiv'_below i.2
179
+
180
+ @[simp] lemma fin_succ_equiv_last_last {n : ℕ} :
181
+ fin_succ_equiv_last (fin.last n) = none :=
182
+ by simp [fin_succ_equiv_last]
183
+
184
+ @[simp] lemma fin_succ_equiv_last_symm_some {n : ℕ} (i : fin n) :
185
+ fin_succ_equiv_last.symm (some i) = i.cast_succ :=
186
+ fin_succ_equiv'_symm_some_below i.2
187
+
188
+ @[simp] lemma fin_succ_equiv_last_symm_coe {n : ℕ} (i : fin n) :
189
+ fin_succ_equiv_last.symm ↑i = i.cast_succ :=
190
+ fin_succ_equiv'_symm_some_below i.2
191
+
192
+ @[simp] lemma fin_succ_equiv_last_symm_none {n : ℕ} :
193
+ fin_succ_equiv_last.symm none = fin.last n :=
194
+ fin_succ_equiv'_symm_none _
153
195
154
196
/-- Equivalence between `fin m ⊕ fin n` and `fin (m + n)` -/
155
197
def fin_sum_fin_equiv : fin m ⊕ fin n ≃ fin (m + n) :=
0 commit comments