Skip to content

Commit 9bed6a5

Browse files
committed
feat(Order): more API for krull dimensions (#21800)
Co-authored-by: Andrew Yang <36414270+erdOne@users.noreply.github.com>
1 parent 041e230 commit 9bed6a5

File tree

3 files changed

+78
-0
lines changed

3 files changed

+78
-0
lines changed

Mathlib/Algebra/Order/SuccPred/WithBot.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,8 @@ lemma succ_one : succ (1 : WithBot α) = 2 := by simpa [one_add_one_eq_two] usin
2626
lemma succ_ofNat (n : ℕ) [n.AtLeastTwo] :
2727
succ (ofNat(n) : WithBot α) = ofNat(n) + 1 := succ_natCast n
2828

29+
lemma one_le_iff_pos {α : Type*} [PartialOrder α] [AddMonoidWithOne α]
30+
[ZeroLEOneClass α] [NeZero (1 : α)] [SuccAddOrder α] (a : WithBot α) : 1 ≤ a ↔ 0 < a := by
31+
cases a <;> simp [Order.one_le_iff_pos]
32+
2933
end WithBot

Mathlib/Order/KrullDimension.lean

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,9 +605,41 @@ lemma krullDim_nonpos_of_subsingleton [Subsingleton α] : krullDim α ≤ 0 := b
605605
rw [krullDim_nonpos_iff_forall_isMax]
606606
exact fun x y h ↦ (Subsingleton.elim x y).ge
607607

608+
lemma krullDim_eq_zero [Nonempty α] [Subsingleton α] :
609+
krullDim α = 0 :=
610+
le_antisymm krullDim_nonpos_of_subsingleton krullDim_nonneg
611+
608612
lemma krullDim_eq_zero_of_unique [Unique α] : krullDim α = 0 :=
609613
le_antisymm krullDim_nonpos_of_subsingleton krullDim_nonneg
610614

615+
section PartialOrder
616+
617+
variable {α : Type*} [PartialOrder α]
618+
619+
lemma krullDim_eq_zero_iff_of_orderBot [OrderBot α] :
620+
krullDim α = 0 ↔ Subsingleton α :=
621+
fun H ↦ subsingleton_of_forall_eq ⊥ fun _ ↦ le_bot_iff.mp
622+
(krullDim_nonpos_iff_forall_isMax.mp H.le ⊥ bot_le), fun _ ↦ Order.krullDim_eq_zero⟩
623+
624+
lemma krullDim_pos_iff_of_orderBot [OrderBot α] :
625+
0 < krullDim α ↔ Nontrivial α := by
626+
rw [← not_subsingleton_iff_nontrivial, ← Order.krullDim_eq_zero_iff_of_orderBot,
627+
← ne_eq, ← lt_or_lt_iff_ne, or_iff_right]
628+
simp [Order.krullDim_nonneg]
629+
630+
lemma krullDim_eq_zero_iff_of_orderTop [OrderTop α] :
631+
krullDim α = 0 ↔ Subsingleton α :=
632+
fun H ↦ subsingleton_of_forall_eq ⊤ fun _ ↦ top_le_iff.mp
633+
(krullDim_nonpos_iff_forall_isMin.mp H.le ⊤ le_top), fun _ ↦ Order.krullDim_eq_zero⟩
634+
635+
lemma krullDim_pos_iff_of_orderTop [OrderTop α] :
636+
0 < krullDim α ↔ Nontrivial α := by
637+
rw [← not_subsingleton_iff_nontrivial, ← Order.krullDim_eq_zero_iff_of_orderTop,
638+
← ne_eq, ← lt_or_lt_iff_ne, or_iff_right]
639+
simp [Order.krullDim_nonneg]
640+
641+
end PartialOrder
642+
611643
lemma krullDim_eq_length_of_finiteDimensionalOrder [FiniteDimensionalOrder α] :
612644
krullDim α = (LTSeries.longestOf α).length :=
613645
le_antisymm

Mathlib/Order/RelSeries.lean

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,14 @@ def cons (p : RelSeries r) (newHead : α) (rel : r newHead p.head) : RelSeries r
421421
delta cons
422422
rw [last_append]
423423

424+
lemma cons_cast_succ (s : RelSeries r) (a : α) (h : r a s.head) (i : Fin (s.length + 1)) :
425+
(s.cons a h) (.cast (by simp) (.succ i)) = s i := by
426+
dsimp [cons]
427+
convert append_apply_right (singleton r a) s h i
428+
ext
429+
show i.1 + 1 = _ % _
430+
simpa using (Nat.mod_eq_of_lt (by simp)).symm
431+
424432
/--
425433
Given a series `a₀ -r→ a₁ -r→ ... -r→ aₙ` and an `a` such that `aₙ -r→ a` holds, there is
426434
a series of length `n+1`: `a₀ -r→ a₁ -r→ ... -r→ aₙ -r→ a`.
@@ -436,6 +444,10 @@ def snoc (p : RelSeries r) (newLast : α) (rel : r p.last newLast) : RelSeries r
436444
@[simp] lemma last_snoc (p : RelSeries r) (newLast : α) (rel : r p.last newLast) :
437445
(p.snoc newLast rel).last = newLast := last_append _ _ _
438446

447+
lemma snoc_cast_castSucc (s : RelSeries r) (a : α) (h : r s.last a) (i : Fin (s.length + 1)) :
448+
(s.snoc a h) (.cast (by simp) (.castSucc i)) = s i :=
449+
append_apply_left s (singleton r a) h i
450+
439451
-- This lemma is useful because `last_snoc` is about `Fin.last (p.snoc _ _).length`, but we often
440452
-- see `Fin.last (p.length + 1)` in practice. They are equal by definition, but sometimes simplifier
441453
-- does not pick up `last_snoc`
@@ -656,6 +668,36 @@ lemma Rel.finiteDimensional_or_infiniteDimensional [Nonempty α] :
656668
rw [← not_finiteDimensional_iff]
657669
exact em r.FiniteDimensional
658670

671+
instance Rel.FiniteDimensional.swap [FiniteDimensional r] : FiniteDimensional (Function.swap r) :=
672+
⟨.reverse (.longestOf r), fun s ↦ s.reverse.length_le_length_longestOf⟩
673+
674+
variable {r} in
675+
@[simp]
676+
lemma Rel.finiteDimensional_swap_iff :
677+
FiniteDimensional (Function.swap r) ↔ FiniteDimensional r :=
678+
fun _ ↦ .swap _, fun _ ↦ .swap _⟩
679+
680+
instance Rel.InfiniteDimensional.swap [InfiniteDimensional r] :
681+
InfiniteDimensional (Function.swap r) :=
682+
fun n ↦ ⟨.reverse (.withLength r n), RelSeries.length_withLength r n⟩⟩
683+
684+
variable {r} in
685+
@[simp]
686+
lemma Rel.infiniteDimensional_swap_iff :
687+
InfiniteDimensional (Function.swap r) ↔ InfiniteDimensional r :=
688+
fun _ ↦ .swap _, fun _ ↦ .swap _⟩
689+
690+
lemma Rel.wellFounded_swap_of_finiteDimensional [Rel.FiniteDimensional r] :
691+
WellFounded (Function.swap r) := by
692+
rw [WellFounded.wellFounded_iff_no_descending_seq]
693+
refine ⟨fun ⟨f, hf⟩ ↦ ?_⟩
694+
let s := RelSeries.mk (r := r) ((RelSeries.longestOf r).length + 1) (f ·) (hf ·)
695+
exact (RelSeries.longestOf r).length.lt_succ_self.not_le s.length_le_length_longestOf
696+
697+
lemma Rel.wellFounded_of_finiteDimensional [Rel.FiniteDimensional r] : WellFounded r :=
698+
have : (Rel.FiniteDimensional (Function.swap r)) := Rel.finiteDimensional_swap_iff.mp ‹_›
699+
wellFounded_swap_of_finiteDimensional (Function.swap r)
700+
659701
/-- A type is finite dimensional if its `LTSeries` has bounded length. -/
660702
abbrev FiniteDimensionalOrder (γ : Type*) [Preorder γ] :=
661703
Rel.FiniteDimensional ((· < ·) : γ → γ → Prop)

0 commit comments

Comments
 (0)