Lean migration: Phase 4 (IterProd + FiniteMap lattices)
- Spa.Lattice.IterProd: k-fold product, recursive Lattice instance,
fixed height k*hA + hB, bot = build of bottoms
- Spa.Lattice.FiniteMap: spine-pinned assoc lists ({l // l.map fst = ks});
with = the 1100-line Map.agda collapses into positional 'combine'.
Same lemma inventory (membership, locate, updating, GeneralizedUpdate,
valuesAt, Provenance-union, le_of_mem_mem) — Nodup is now an explicit
hypothesis where the Agda Map carried it intrinsically. Fixed height
|ks|*hB still via transport along the IterProd isomorphism, which no
longer needs Unique ks (representation is canonical).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -103,6 +103,21 @@ theorem BoundedChains.no_longer {α : Type*} [Preorder α] {n : ℕ}
|
||||
(h : BoundedChains α n) (c : LTSeries α) : c.length ≠ n + 1 :=
|
||||
fun hc => absurd (h c) (by omega)
|
||||
|
||||
/-- Re-index a `FixedHeight` along an equality of heights (used where Agda
|
||||
just rewrites with arithmetic identities). -/
|
||||
def FixedHeight.cast {α : Type*} [Preorder α] {m n : ℕ} (h : m = n)
|
||||
(fh : FixedHeight α m) : FixedHeight α n where
|
||||
bot := fh.bot
|
||||
top := fh.top
|
||||
longestChain := fh.longestChain
|
||||
head_longestChain := fh.head_longestChain
|
||||
last_longestChain := fh.last_longestChain
|
||||
length_longestChain := h ▸ fh.length_longestChain
|
||||
bounded := h ▸ fh.bounded
|
||||
|
||||
@[simp] theorem FixedHeight.cast_bot {α : Type*} [Preorder α] {m n : ℕ}
|
||||
(h : m = n) (fh : FixedHeight α m) : (fh.cast h).bot = fh.bot := rfl
|
||||
|
||||
/-- Agda: `IsFiniteHeightLattice` / `FiniteHeightLattice` (bundled). -/
|
||||
class FiniteHeightLattice (α : Type*) [Lattice α] where
|
||||
height : ℕ
|
||||
|
||||
Reference in New Issue
Block a user