Skip to content

Commit 7b98344

Browse files
committed
feat(Algebra/Order): ArchimedeanClass ball (#27885)
Part of #27043 (Hahn embedding theorem). For concepts in this part, I don't find good names from literature, so I took inspiration from #27451 (`Valuation.ball`) and `Metric.ball` / `Metric.closedBall` (`ArchimedeanClass M` actually becomes a `Valuation` when `M` is a ring so these names make sense).
1 parent 291974e commit 7b98344

File tree

2 files changed

+122
-0
lines changed

2 files changed

+122
-0
lines changed

Mathlib/Algebra/Order/Archimedean/Class.lean

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Weiyi Wang
55
-/
66
import Mathlib.Algebra.BigOperators.Group.Finset.Basic
7+
import Mathlib.Algebra.Group.Subgroup.Lattice
78
import Mathlib.Algebra.Order.Archimedean.Basic
89
import Mathlib.Algebra.Order.Hom.Monoid
910
import Mathlib.Data.Finset.Max
1011
import Mathlib.Order.Antisymmetrization
12+
import Mathlib.Order.UpperLower.CompleteLattice
13+
import Mathlib.Order.UpperLower.Principal
1114

1215
/-!
1316
# Archimedean classes of a linearly ordered group
@@ -24,6 +27,10 @@ is "infinitesimal" to `b` in the sense that `n • |a| < |b|` for all natural nu
2427
* `MulArchimedeanClass` is the archimedean class for multiplicative linearly ordered group.
2528
* `ArchimedeanClass.orderHom` and `MulArchimedeanClass.orderHom` are `OrderHom` over
2629
archimedean classes lifted from ordered group homomorphisms.
30+
* `ArchimedeanClass.ballAddSubgroup` and `MulArchimedeanClass.ballSubgroup` are subgroups
31+
formed by an open interval of archimedean classes
32+
* `ArchimedeanClass.closedBallAddSubgroup` and `MulArchimedeanClass.closedBallSubgroup` are
33+
subgroups formed by a closed interval of archimedean classes.
2734
2835
## Main statements
2936
@@ -452,4 +459,111 @@ theorem liftOrderHom_mk (f : M → α) (h : ∀ a b, mk a ≤ mk b → f a ≤ f
452459

453460
end LiftHom
454461

462+
/-- Given a `UpperSet` of `MulArchimedeanClass`,
463+
all group elements belonging to these classes form a subsemigroup.
464+
This is not yet a subgroup because it doesn't contain the identity if `s = ⊤`. -/
465+
@[to_additive /-- Given a `UpperSet` of `ArchimedeanClass`,
466+
all group elements belonging to these classes form a subsemigroup.
467+
This is not yet a subgroup because it doesn't contain the identity if `s = ⊤`. -/]
468+
def subsemigroup (s : UpperSet (MulArchimedeanClass M)) : Subsemigroup M where
469+
carrier := mk ⁻¹' s
470+
mul_mem' {a b} ha hb := by
471+
rw [Set.mem_preimage] at ha hb ⊢
472+
obtain h | h := min_le_iff.mp (min_le_mk_mul a b)
473+
· exact s.upper h ha
474+
· exact s.upper h hb
475+
476+
/-- Make `MulArchimedeanClass.subsemigroup` a subgroup by assigning
477+
s = ⊤ with a junk value ⊥. -/
478+
@[to_additive /-- Make `ArchimedeanClass.subsemigroup` a subgroup by assigning
479+
s = ⊤ with a junk value ⊥. -/]
480+
noncomputable
481+
def subgroup (s : UpperSet (MulArchimedeanClass M)) : Subgroup M :=
482+
open Classical in
483+
if hs : s = ⊤ then
484+
485+
else {
486+
subsemigroup s with
487+
one_mem' := by
488+
rw [subsemigroup, Set.mem_preimage]
489+
obtain ⟨u, hu⟩ := UpperSet.coe_nonempty.mpr hs
490+
simpa using s.upper (by simp) hu
491+
inv_mem' := by simp [subsemigroup]
492+
}
493+
494+
variable {s : UpperSet (MulArchimedeanClass M)}
495+
496+
@[to_additive]
497+
theorem subsemigroup_eq_subgroup_of_ne_top (hs : s ≠ ⊤) :
498+
subsemigroup s = (subgroup s : Set M) := by
499+
simp [subgroup, hs]
500+
501+
variable (M) in
502+
@[to_additive (attr := simp)]
503+
theorem subgroup_eq_bot : subgroup (M := M) ⊤ = ⊥ := by
504+
simp [subgroup]
505+
506+
@[to_additive (attr := simp)]
507+
theorem mem_subgroup_iff (hs : s ≠ ⊤) : a ∈ subgroup s ↔ mk a ∈ s := by
508+
simp [subgroup, subsemigroup, hs]
509+
510+
@[to_additive]
511+
theorem subgroup_strictAntiOn : StrictAntiOn (subgroup (M := M)) (Set.Iio ⊤) := by
512+
intro s hs t ht hst
513+
rw [← SetLike.coe_ssubset_coe]
514+
rw [← subsemigroup_eq_subgroup_of_ne_top (Set.mem_Iio.mp hs).ne_top]
515+
rw [← subsemigroup_eq_subgroup_of_ne_top (Set.mem_Iio.mp ht).ne_top]
516+
refine Set.ssubset_iff_subset_ne.mpr ⟨by simpa [subsemigroup] using hst.le, ?_⟩
517+
contrapose! hst with heq
518+
apply le_of_eq
519+
simpa [mk_surjective, subsemigroup] using heq
520+
521+
@[to_additive]
522+
theorem subgroup_antitone : Antitone (subgroup (M := M)) := by
523+
intro s t hst
524+
obtain rfl | hs := eq_or_ne s ⊤
525+
· rw [eq_top_iff.mpr hst]
526+
obtain rfl | ht := eq_or_ne t ⊤
527+
· simp
528+
rwa [subgroup_strictAntiOn.le_iff_ge ht.lt_top hs.lt_top]
529+
530+
/-- An open ball defined by `MulArchimedeanClass.subgroup` of `UpperSet.Ioi c`.
531+
For `c = ⊤`, we assign the junk value `⊥`. -/
532+
@[to_additive /--An open ball defined by `ArchimedeanClass.addSubgroup` of `UpperSet.Ioi c`.
533+
For `c = ⊤`, we assign the junk value `⊥`. -/]
534+
noncomputable
535+
abbrev ballSubgroup (c : MulArchimedeanClass M) := subgroup (UpperSet.Ioi c)
536+
537+
/-- A closed ball defined by `MulArchimedeanClass.subgroup` of `UpperSet.Ici c`. -/
538+
@[to_additive /-- A closed ball defined by `ArchimedeanClass.addSubgroup` of `UpperSet.Ici c`. -/]
539+
noncomputable
540+
abbrev closedBallSubgroup (c : MulArchimedeanClass M) := subgroup (UpperSet.Ici c)
541+
542+
@[to_additive]
543+
theorem mem_ballSubgroup_iff {a : M} {c : MulArchimedeanClass M} (hA : c ≠ ⊤) :
544+
a ∈ ballSubgroup c ↔ c < mk a := by
545+
simp [hA]
546+
547+
@[to_additive]
548+
theorem mem_closedBallSubgroup_iff {a : M} {c : MulArchimedeanClass M} :
549+
a ∈ closedBallSubgroup c ↔ c ≤ mk a := by
550+
simp
551+
552+
variable (M) in
553+
@[to_additive (attr := simp)]
554+
theorem ballSubgroup_top : ballSubgroup (M := M) ⊤ = ⊥ := by
555+
convert subgroup_eq_bot M
556+
simp
557+
558+
variable (M) in
559+
@[to_additive (attr := simp)]
560+
theorem closedBallSubgroup_top : closedBallSubgroup (M := M) ⊤ = ⊥ := by
561+
ext
562+
simp
563+
564+
@[to_additive]
565+
theorem ballSubgroup_antitone : Antitone (ballSubgroup (M := M)) := by
566+
intro _ _ h
567+
exact subgroup_antitone <| (UpperSet.Ioi_strictMono _).monotone h
568+
455569
end MulArchimedeanClass

Mathlib/Order/UpperLower/Principal.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ nonrec lemma Ici_injective : Injective (Ici : α → UpperSet α) := fun _a _b h
9898

9999
lemma Ici_ne_Ici : Ici a ≠ Ici b ↔ a ≠ b := Ici_inj.not
100100

101+
@[simp]
102+
theorem Ioi_eq_top [OrderTop α] {a : α} : Ioi a = ⊤ ↔ a = ⊤ := by
103+
simp [UpperSet.ext_iff]
104+
101105
end PartialOrder
102106

103107
@[simp]
@@ -197,6 +201,10 @@ nonrec lemma Iic_injective : Injective (Iic : α → LowerSet α) := fun _a _b h
197201

198202
lemma Iic_ne_Iic : Iic a ≠ Iic b ↔ a ≠ b := Iic_inj.not
199203

204+
@[simp]
205+
theorem Iio_eq_bot [OrderBot α] {a : α} : Iio a = ⊥ ↔ a = ⊥ := by
206+
simp [LowerSet.ext_iff]
207+
200208
end PartialOrder
201209

202210
@[simp]

0 commit comments

Comments
 (0)