This PR changes the signature of `Array.get` to take a Nat and a proof, rather than a `Fin`, for consistency with the rest of the (planned) Array API. Note that because of bootstrapping issues we can't provide `get_elem_tactic` as an autoparameter for the proof. As users will mostly use the `xs[i]` notation provided by `GetElem`, this hopefully isn't a problem. We may restore `Fin` based versions, either here or downstream, as needed, but they won't be the "main" functions. --------- Co-authored-by: David Thrane Christiansen <david@davidchristiansen.dk>
25 lines
843 B
Text
25 lines
843 B
Text
-- Extracted from Mathlib.Data.UnionFind.
|
||
-- This file was failing in Mathlib during development of #3124.
|
||
|
||
section Mathlib.Data.UnionFind
|
||
|
||
structure UFNode (α : Type _) where
|
||
parent : Nat
|
||
value : α
|
||
rank : Nat
|
||
|
||
structure UnionFind (α) where
|
||
arr : Array (UFNode α)
|
||
|
||
-- The `PANIC` can be avoided by turning `simprocs` off:
|
||
-- set_option simprocs false
|
||
|
||
def rankMaxAux (self : UnionFind α) : ∀ (i : Nat),
|
||
{k : Nat // ∀ j, j < i → ∀ h, self.arr[j].rank ≤ k}
|
||
| 0 => ⟨0, fun j hj => nomatch hj⟩
|
||
| i+1 => by
|
||
let ⟨k, H⟩ := rankMaxAux self i
|
||
refine ⟨max k (if h : _ then self.arr[i].rank else 0), fun j hj h ↦ ?_⟩
|
||
match j, Nat.lt_or_eq_of_le (Nat.le_of_lt_succ hj) with
|
||
| j, Or.inl hj => exact Nat.le_trans (H _ hj h) (Nat.le_max_left _ _)
|
||
| _, Or.inr rfl => simp [h, Nat.le_max_right]
|