Skip to content

Commit 2f6bd4e

Browse files
committed
feat(Data/List/GetD): golf and add lemmas for get and getElem?
1 parent a2df56f commit 2f6bd4e

1 file changed

Lines changed: 18 additions & 16 deletions

File tree

Mathlib/Data/List/GetD.lean

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,46 +30,48 @@ variable (d : α)
3030
theorem 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

3543
theorem getD_eq_default {n : ℕ} (hn : l.length ≤ n) : l.getD n d = d := by
3644
grind
3745

3846
theorem 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.
4451
Not 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]
5260
theorem 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

6066
theorem 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

6570
theorem 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

7476
end getD
7577

@@ -106,7 +108,7 @@ theorem getI_append_right (l l' : List α) (n : ℕ) (h : l.length ≤ n) :
106108
getD_append_right _ _ _ _ h
107109

108110
theorem 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

111113
theorem getI_zero_eq_headI : l.getI 0 = l.headI := by cases l <;> rfl
112114

0 commit comments

Comments
 (0)