39 lines
1.4 KiB
Lean4
39 lines
1.4 KiB
Lean4
|
|
import Spa.Lattice
|
|||
|
|
import Mathlib.Data.Finset.Lattice.Basic
|
|||
|
|
import Mathlib.Data.Fintype.Lattice
|
|||
|
|
import Mathlib.Data.Fintype.Card
|
|||
|
|
|
|||
|
|
/-! # Power Sets of Finite Type
|
|||
|
|
|
|||
|
|
For a `Fintype α`, `Finset α` is the power-set lattice: `⊔` is union, `⊓` is
|
|||
|
|
intersection, `⊥ = ∅`, `⊤ = univ`. This lattice also has a finite height.
|
|||
|
|
|
|||
|
|
The `Finset α` representation s isomorphic to `Fin α → Bool`, but far more
|
|||
|
|
efficient because it avoids building up stacks of layered closures. -/
|
|||
|
|
|
|||
|
|
namespace Spa
|
|||
|
|
|
|||
|
|
variable {α : Type*} [Fintype α] [DecidableEq α]
|
|||
|
|
|
|||
|
|
omit [Fintype α] [DecidableEq α] in
|
|||
|
|
private lemma finset_card_strictMono : StrictMono (Finset.card : Finset α → ℕ) :=
|
|||
|
|
fun _ _ h => Finset.card_lt_card h
|
|||
|
|
|
|||
|
|
omit [DecidableEq α] in
|
|||
|
|
/-- A strictly increasing chain of finsets grows its cardinality by at least one
|
|||
|
|
each step, and cardinality is capped by `Fintype.card α`. -/
|
|||
|
|
lemma finset_boundedChains : BoundedChains (Finset α) (Fintype.card α) := fun c => by
|
|||
|
|
have h := LTSeries.head_add_length_le_nat (c.map Finset.card finset_card_strictMono)
|
|||
|
|
rw [LTSeries.head_map, LTSeries.last_map, LTSeries.map_length] at h
|
|||
|
|
have h2 : c.last.card ≤ Fintype.card α := Finset.card_le_univ _
|
|||
|
|
omega
|
|||
|
|
|
|||
|
|
instance instFiniteHeightFinset : FiniteHeightLattice (Finset α) where
|
|||
|
|
toLattice := inferInstance
|
|||
|
|
toOrderBot := inferInstance
|
|||
|
|
toOrderTop := inferInstance
|
|||
|
|
height := Fintype.card α
|
|||
|
|
chains_bounded := finset_boundedChains
|
|||
|
|
|
|||
|
|
end Spa
|