@@ -30,46 +30,48 @@ variable (d : α)
3030theorem getD_eq_getElem {n : ℕ} (hn : n < l.length) : l.getD n d = l[n] := by
3131 grind
3232
33- theorem getD_map {n : ℕ} (f : α → β) : (map f l).getD n (f d) = f (l.getD n d) := by simp
33+ theorem getD_eq_getElem? (l : List α) (d : α) (i : Fin l.length) :
34+ l.getD i d = l[i]?.get (by simp) := by
35+ simp
36+
37+ theorem getD_eq_get (l : List α) (d : α) (i : Fin l.length) : l.getD i d = l.get i := by
38+ simp
39+
40+ theorem getD_map {n : ℕ} (f : α → β) : (map f l).getD n (f d) = f (l.getD n d) := by
41+ simp
3442
3543theorem getD_eq_default {n : ℕ} (hn : l.length ≤ n) : l.getD n d = d := by
3644 grind
3745
3846theorem getD_reverse {l : List α} (i) (h : i < length l) :
3947 getD l.reverse i = getD l (l.length - 1 - i) := by
40- funext a
41- rwa [List.getD_eq_getElem?_getD, List.getElem?_reverse, ← List.getD_eq_getElem?_getD]
48+ grind
4249
4350/-- An empty list can always be decidably checked for the presence of an element.
4451Not an instance because it would clash with `DecidableEq α`. -/
45- def decidableGetDNilNe (a : α) : DecidablePred fun i : ℕ => getD ([] : List α) i a ≠ a :=
52+ def decidableGetDNilNe (a : α) : DecidablePred fun i : ℕ => getD nil i a ≠ a :=
4653 fun _ => isFalse fun H => H getD_nil
4754
4855@[simp]
49- theorem getElem?_getD_singleton_default_eq (n : ℕ) : [d][n]?.getD d = d := by cases n <;> simp
56+ theorem getElem?_getD_singleton_default_eq (n : ℕ) : [d][n]?.getD d = d := by
57+ grind
5058
5159@[simp]
5260theorem getElem?_getD_replicate_default_eq (r n : ℕ) : (replicate r d)[n]?.getD d = d := by
5361 grind
5462
55- theorem getD_replicate {y i n} (h : i < n) :
56- getD (replicate n x) i y = x := by
57- rw [getD_eq_getElem, getElem_replicate]
58- rwa [length_replicate]
63+ theorem getD_replicate {y i n} (h : i < n) : getD (replicate n x) i y = x := by
64+ grind
5965
6066theorem getD_append (l l' : List α) (d : α) (n : ℕ) (h : n < l.length) :
6167 (l ++ l').getD n d = l.getD n d := by
62- rw [getD_eq_getElem _ _ (Nat.lt_of_lt_of_le h (length_append ▸ Nat.le_add_right _ _)),
63- getElem_append_left h, getD_eq_getElem]
68+ grind
6469
6570theorem getD_append_right (l l' : List α) (d : α) (n : ℕ) (h : l.length ≤ n) :
6671 (l ++ l').getD n d = l'.getD (n - l.length) d := by
6772 grind
6873
69- theorem getD_eq_getD_getElem? (n : ℕ) : l.getD n d = l[n]?.getD d := by
70- cases Nat.lt_or_ge n l.length with
71- | inl h => rw [getD_eq_getElem _ _ h, getElem?_eq_getElem h, Option.getD_some]
72- | inr h => rw [getD_eq_default _ _ h, getElem?_eq_none_iff.mpr h, Option.getD_none]
74+ theorem getD_eq_getD_getElem? (n : ℕ) : l.getD n d = l[n]?.getD d := rfl
7375
7476end getD
7577
@@ -106,7 +108,7 @@ theorem getI_append_right (l l' : List α) (n : ℕ) (h : l.length ≤ n) :
106108 getD_append_right _ _ _ _ h
107109
108110theorem getI_eq_iget_getElem? (n : ℕ) : l.getI n = l[n]?.iget := by
109- rw [← getD_default_eq_getI, getD_eq_getD_getElem? , Option.getD_default_eq_iget]
111+ simp [← getD_default_eq_getI, Option.getD_default_eq_iget]
110112
111113theorem getI_zero_eq_headI : l.getI 0 = l.headI := by cases l <;> rfl
112114
0 commit comments