@@ -120,19 +120,58 @@ end
120
120
121
121
/-- Recurse on an `n+1`-tuple by splitting it into a single element and an `n`-tuple. -/
122
122
@[elab_as_eliminator]
123
- def cons_induction {P : (Π i : fin n.succ, α i) → Sort v}
123
+ def cons_cases {P : (Π i : fin n.succ, α i) → Sort v}
124
124
(h : ∀ x₀ x, P (fin.cons x₀ x)) (x : (Π i : fin n.succ, α i)) : P x :=
125
125
_root_.cast (by rw cons_self_tail) $ h (x 0 ) (tail x)
126
126
127
- @[simp] lemma cons_induction_cons {P : (Π i : fin n.succ, α i) → Sort v}
127
+ @[simp] lemma cons_cases_cons {P : (Π i : fin n.succ, α i) → Sort v}
128
128
(h : Π x₀ x, P (fin.cons x₀ x)) (x₀ : α 0 ) (x : Π i : fin n, α i.succ) :
129
- @cons_induction _ _ _ h (cons x₀ x) = h x₀ x :=
129
+ @cons_cases _ _ _ h (cons x₀ x) = h x₀ x :=
130
130
begin
131
- rw [cons_induction , cast_eq],
131
+ rw [cons_cases , cast_eq],
132
132
congr',
133
133
exact tail_cons _ _
134
134
end
135
135
136
+ /-- Recurse on an tuple by splitting into `fin.elim0` and `fin.cons`. -/
137
+ @[elab_as_eliminator]
138
+ def cons_induction {α : Type *} {P : Π {n : ℕ}, (fin n → α) → Sort v}
139
+ (h0 : P fin.elim0)
140
+ (h : ∀ {n} x₀ (x : fin n → α), P x → P (fin.cons x₀ x)) : Π {n : ℕ} (x : fin n → α), P x
141
+ | 0 x := by convert h0
142
+ | (n + 1 ) x := cons_cases (λ x₀ x, h _ _ $ cons_induction _) x
143
+
144
+ lemma cons_injective_of_injective {α} {x₀ : α} {x : fin n → α} (hx₀ : x₀ ∉ set.range x)
145
+ (hx : function.injective x) :
146
+ function.injective (cons x₀ x : fin n.succ → α) :=
147
+ begin
148
+ refine fin.cases _ _,
149
+ { refine fin.cases _ _,
150
+ { intro _,
151
+ refl },
152
+ { intros j h,
153
+ rw [cons_zero, cons_succ] at h,
154
+ exact hx₀.elim ⟨_, h.symm⟩ } },
155
+ { intro i,
156
+ refine fin.cases _ _,
157
+ { intro h,
158
+ rw [cons_zero, cons_succ] at h,
159
+ exact hx₀.elim ⟨_, h⟩ },
160
+ { intros j h,
161
+ rw [cons_succ, cons_succ] at h,
162
+ exact congr_arg _ (hx h), } },
163
+ end
164
+
165
+ lemma cons_injective_iff {α} {x₀ : α} {x : fin n → α} :
166
+ function.injective (cons x₀ x : fin n.succ → α) ↔ x₀ ∉ set.range x ∧ function.injective x :=
167
+ begin
168
+ refine ⟨λ h, ⟨_, _⟩, and.rec cons_injective_of_injective⟩,
169
+ { rintros ⟨i, hi⟩,
170
+ replace h := @h i.succ 0 ,
171
+ simpa [hi, succ_ne_zero] using h, },
172
+ { simpa [function.comp] using h.comp (fin.succ_injective _) },
173
+ end
174
+
136
175
@[simp] lemma forall_fin_zero_pi {α : fin 0 → Sort *} {P : (Π i, α i) → Prop } :
137
176
(∀ x, P x) ↔ P fin_zero_elim :=
138
177
⟨λ h, h _, λ h x, subsingleton.elim fin_zero_elim x ▸ h⟩
143
182
144
183
lemma forall_fin_succ_pi {P : (Π i, α i) → Prop } :
145
184
(∀ x, P x) ↔ (∀ a v, P (fin.cons a v)) :=
146
- ⟨λ h a v, h (fin.cons a v), cons_induction ⟩
185
+ ⟨λ h a v, h (fin.cons a v), cons_cases ⟩
147
186
148
187
lemma exists_fin_succ_pi {P : (Π i, α i) → Prop } :
149
188
(∃ x, P x) ↔ (∃ a v, P (fin.cons a v)) :=
0 commit comments