Zulip Chat Archive
Stream: general
Topic: This array lemma should be easier!?
François G. Dorais (Aug 14 2024 at 04:28):
I would have expected this theorem to be easier to state and prove. I'm probably missing something. Ideas?
theorem Array.getElem_append (as bs : Array α) (i) (hi : i < (as ++ bs).size) :
(as ++ bs)[i] = if h : i < as.size then as[i] else
have : i - as.size < bs.size := by
apply Nat.sub_lt_left_of_lt_add
· exact Nat.le_of_not_gt h
· rw [← size_append]; exact hi
bs[i - as.size] := by
rw [getElem_eq_data_getElem]
conv => lhs; arg 1; rw [append_data]
split
· rw [List.getElem_append_left]; rfl
· next h =>
rw [List.getElem_append_right]
rw [size_eq_length_data] at h; rfl
exact h
MohanadAhmed (Aug 14 2024 at 09:44):
Are you trying to simplify the statement or the proof body?
If the later maybe the theorems [get_append_left
and `get_append_right
] might be useful?
MohanadAhmed (Aug 14 2024 at 09:45):
theorem Array.getElem_append (as bs : Array α) (i) (hi : i < (as ++ bs).size) :
(as ++ bs)[i] = if h : i < as.size then as[i] else
have : i - as.size < bs.size := by
apply Nat.sub_lt_left_of_lt_add
· exact Nat.le_of_not_gt h
· rw [← size_append]; exact hi
bs[i - as.size] := by
split
rw [get_append_left]
next h =>
rw [get_append_right];
exact Nat.le_of_not_lt h
Daniel Weber (Aug 14 2024 at 12:48):
Perhaps docs#tacticGet_elem_tactic_trivial should know to use docs#Array.size_append
Daniel Weber (Aug 14 2024 at 12:53):
attribute [simp] Array.size_append
macro_rules
| `(tactic| get_elem_tactic_trivial) => `(tactic| simp_all (config := { arith := true }); try omega; done)
theorem Array.getElem_append (as bs : Array α) (i) (hi : i < (as ++ bs).size) :
(as ++ bs)[i] = if h : i < as.size then as[i] else bs[i - as.size] := by
split
· rw [get_append_left]
· rw [get_append_right]
omega
Yury G. Kudryashov (Aug 24 2024 at 03:40):
I think that it should use a non default simp set. Also, it shouldn't use simp all, because having h : a = a + b - c
in context shouldn't break it.
Last updated: May 02 2025 at 03:31 UTC