The notation `a ∈ as` for Arrays was previously only defined with `DecidableEq` on the elements, for (apparently) no good reason. This drops this requirements (by using `a ∈ as.data`), and simplifies a bunch of proofs by simply lifting the corresponding proof from lists. Also, `sizeOf_lt_of_mem` was defined, but not set up to be picked up by `decreasing_trivial` in the same way that the corresponding List lemma was set up, so this adds the tactic setup. The definition for `a ∈ as` is intentionally not defeq to `a ∈ as.data` so that the termination tactics for Arrays don’t spuriously apply when recursing through lists.
12 lines
596 B
Text
12 lines
596 B
Text
theorem Array.sizeOf_lt_of_mem' [DecidableEq α] [SizeOf α] {as : Array α} (h : as.contains a) : sizeOf a < sizeOf as := by
|
||
simp [Membership.mem, contains, any, Id.run, BEq.beq, anyM] at h
|
||
let rec aux (j : Nat) : anyM.loop (m := Id) (fun b => decide (a = b)) as as.size (Nat.le_refl ..) j = true → sizeOf a < sizeOf as := by
|
||
unfold anyM.loop
|
||
intro h
|
||
split at h
|
||
· simp [Bind.bind, pure] at h; split at h
|
||
next he => subst a; apply sizeOf_get_lt
|
||
next => have ih := aux (j+1) h; assumption
|
||
· contradiction
|
||
apply aux 0 h
|
||
termination_by aux j => as.size - j
|