Zulip Chat Archive
Stream: Is there code for X?
Topic: (l₁ S).map σ ≤ l₂ (S.map ⇑σ)
Kevin Buzzard (Dec 28 2021 at 19:55):
Much to my annoyance I'm stuck on both of these, although I can prove that each implies the other.
import field_theory.galois
import topology.algebra.filter_basis
lemma foo {K L : Type*} [field K] [field L] [algebra K L]
(S : set L) {M : Type*} [field M] [algebra K M] (σ : L →ₐ[K] M) :
(intermediate_field.adjoin K S).map σ ≤
intermediate_field.adjoin K (σ '' S) := sorry -- they're equal but I can do ≥
lemma foo2 {K L : Type*} [field K] [field L] [algebra K L]
(S : set L) {M : Type*} [field M] [algebra K M] (σ : L →ₐ[K] M) :
∀ (F : intermediate_field K M),
σ '' S ⊆ F → (intermediate_field.adjoin K S).map σ ≤ F := sorry -- this is
-- an iff but the other way is easy
-- Note we have `intermediate_field.gi`
The Galois insertion info:
-- α is set L or set M
-- β is intermediate_field L or intermediate_field M
-- l is `adjoin K`
-- u is `coe`
I don't know if there's a general statement about Galois insertions. Here there are two involved.
Andrew Yang (Dec 28 2021 at 19:59):
Is docs#intermediate_field.adjoin_map what you are looking for?
Patrick Massot (Dec 28 2021 at 20:04):
Yes, this is what he is looking for
Patrick Massot (Dec 28 2021 at 20:04):
But the Galois connection magic he is asking for is also interesting, I think we still miss the relevant lemma.
Patrick Massot (Dec 28 2021 at 20:28):
@Kevin Buzzard is docs#intermediate_field.map part of a Galois connection?
Patrick Massot (Dec 28 2021 at 21:13):
@Kevin Buzzard I wrote what I think is a bit of Galois connection magic that mathlib is missing, together with a sample application (I could have used your example if you had answered my previous message).
import group_theory.subgroup.basic
variables
{X : Type*} [partial_order X] {Y : Type*} [partial_order Y]
lemma galois_connection.eq_l {l : X → Y} {u : Y → X} (h : galois_connection l u) {x : X} {z : Y} :
l x = z ↔ ∀ y, z ≤ y ↔ x ≤ u y :=
begin
split,
{ rintros rfl y,
exact h x y },
{ intros H,
exact ((h _ _).mpr $ (H z).mp le_rfl).antisymm ((H $ l x).mpr (h.le_u_l x)) }
end
lemma galois_connection.eq_u {l : X → Y} {u : Y → X} (h : galois_connection l u) {z : X} {y : Y} :
u y = z ↔ ∀ x, x ≤ z ↔ l x ≤ y :=
begin
split,
{ rintros rfl x,
exact (h x y).symm },
{ intros H,
exact ((H $ u y).mpr (h.l_u_le y)).antisymm ((h _ _).mp $ (H z).mp le_rfl) }
end
variables
{Z : Type*} [partial_order Z] {W : Type*} [partial_order W]
lemma gc_magic
{lYX : X → Y} {rXY : Y → X} (hXY : galois_connection lYX rXY)
{lWZ : Z → W} {rZW : W → Z} (hZW : galois_connection lWZ rZW)
{lWY : Y → W} {rYW : W → Y} (hWY : galois_connection lWY rYW)
{lZX : X → Z} {rXZ : Z → X} (hXZ : galois_connection lZX rXZ)
(h : rXY ∘ rYW = rXZ ∘ rZW) : lWZ ∘ lZX = lWY ∘ lYX :=
begin
ext x,
rw hZW.eq_l,
intros w,
calc
lWY (lYX x) ≤ w ↔ lYX x ≤ rYW w : by rw hWY
... ↔ x ≤ rXY (rYW w) : by rw ← hXY
... ↔ x ≤ rXY (rYW w) : by rw ← hXY
... ↔ x ≤ rXZ (rZW w) : by rw show rXY (rYW w) = rXZ (rZW w), from congr_fun h w
... ↔ lZX x ≤ rZW w : by rw hXZ
end
open subgroup set
/- We can now reprove: -/
#check @monoid_hom.map_closure
/-- The image by a group morphism of the subgroup generated by a set is the subgroup generated by
the image of this set. -/
example {G H : Type*} [group G] [group H] (f : G →* H) :
map f ∘ closure = closure ∘ (image f) :=
gc_magic set.image_preimage (gc_map_comap f) (subgroup.gi H).gc (subgroup.gi G).gc rfl
Patrick Massot (Dec 28 2021 at 21:14):
Note that I don't use galois_connection.eq_u
and I was too lazy to derive it using the previous one and order_dual
.
Patrick Massot (Dec 28 2021 at 21:15):
Those lemmas prove that both sides of a Galois adjunction are characterized by their universal property, this bit already seems to be missing. But the part I really like is gc_magic
.
Patrick Massot (Dec 28 2021 at 21:16):
@Yaël Dillies do you know whether this is already somewhere?
Eric Wieser (Dec 28 2021 at 21:17):
gc_magic
looks new to me, I think docs#galois_connection.composw was the only lemma I found about more than one connection
Yaël Dillies (Dec 28 2021 at 21:17):
If eq_u
and eq_l
exist, I know where to find them.
Eric Wieser (Dec 28 2021 at 21:18):
Do they exist as l_eq
?
Patrick Massot (Dec 28 2021 at 21:19):
No.
Patrick Massot (Dec 28 2021 at 21:19):
And I should indeed rename those lemmas, I switched sides after naming them.
Yaël Dillies (Dec 28 2021 at 21:19):
What about docs#galois_connection.is_least_l ?
Patrick Massot (Dec 28 2021 at 21:20):
It should certainly help
Yaël Dillies (Dec 28 2021 at 21:22):
But indeed those specific lemmas eem to be missing, maybe because you're meant to go through the lemma I just gave + the correct is_least
/is_greatest
lemma (which don't seem to exist either? :thinking:)
Patrick Massot (Dec 28 2021 at 21:22):
At least it would help if it had correct binders :angry:
Patrick Massot (Dec 28 2021 at 21:52):
I don't think the "correct is_least
/is_greatest
lemma" can exist. Here we also need to use that the set appearing in docs#galois_connection.is_least_l is upward closed.
Bhavik Mehta (Dec 28 2021 at 22:11):
Here's another way to show gc_magic
:
lemma gc_magic
{lYX : X → Y} {rXY : Y → X} (hXY : galois_connection lYX rXY)
{lWZ : Z → W} {rZW : W → Z} (hZW : galois_connection lWZ rZW)
{lWY : Y → W} {rYW : W → Y} (hWY : galois_connection lWY rYW)
{lZX : X → Z} {rXZ : Z → X} (hXZ : galois_connection lZX rXZ)
(h : rXY ∘ rYW = rXZ ∘ rZW) : lWZ ∘ lZX = lWY ∘ lYX :=
funext $ λ x, (hXZ.compose hZW).is_least_l.unique (h ▸ (hXY.compose hWY).is_least_l)
Patrick Massot (Dec 28 2021 at 22:16):
This is nice but less fun in my opinion.
Bhavik Mehta (Dec 28 2021 at 22:19):
The proofs are ultimately the same; they're both an easy case of a general category theory fact. is_least_l
characterises the left side of a Galois connection already.
Patrick Massot (Dec 28 2021 at 22:19):
Yes, I understand.
Patrick Massot (Dec 28 2021 at 22:19):
But I like the calc
block
Patrick Massot (Dec 28 2021 at 22:35):
Actually the result is even closer to be already here:
import order.galois_connection
variables
{X : Type*} [partial_order X] {Y : Type*} [partial_order Y]
variables
{Z : Type*} [partial_order Z] {W : Type*} [partial_order W]
lemma l_comm_of_u_comm
{lYX : X → Y} {uXY : Y → X} (hXY : galois_connection lYX uXY)
{lWZ : Z → W} {uZW : W → Z} (hZW : galois_connection lWZ uZW)
{lWY : Y → W} {uYW : W → Y} (hWY : galois_connection lWY uYW)
{lZX : X → Z} {uXZ : Z → X} (hXZ : galois_connection lZX uXZ)
(h : uXY ∘ uYW = uXZ ∘ uZW) : lWZ ∘ lZX = lWY ∘ lYX :=
funext $ λ x, (hXZ.compose hZW).l_unique (hXY.compose hWY) (λ b, congr_fun h.symm b)
Patrick Massot (Dec 28 2021 at 22:38):
And if we go for an applied version and commute some equality we get to:
import order.galois_connection
variables
{X : Type*} [partial_order X] {Y : Type*} [partial_order Y]
variables
{Z : Type*} [partial_order Z] {W : Type*} [partial_order W]
lemma l_comm_of_u_comm
{lYX : X → Y} {uXY : Y → X} (hXY : galois_connection lYX uXY)
{lWZ : Z → W} {uZW : W → Z} (hZW : galois_connection lWZ uZW)
{lWY : Y → W} {uYW : W → Y} (hWY : galois_connection lWY uYW)
{lZX : X → Z} {uXZ : Z → X} (hXZ : galois_connection lZX uXZ)
(h : ∀ w, uXZ (uZW w) = uXY (uYW w)) {x : X} : lWZ (lZX x) = lWY (lYX x) :=
(hXZ.compose hZW).l_unique (hXY.compose hWY) h
Patrick Massot (Dec 28 2021 at 22:39):
Maybe I'm starting to like that way of telling the story.
Patrick Massot (Dec 28 2021 at 22:46):
Fun fact: X and Z only need preorders here.
Patrick Massot (Dec 28 2021 at 22:47):
Clearly I'm having way too much fun with this stuff. I should stop and go to bed.
Patrick Massot (Dec 28 2021 at 22:53):
#11114. I still kept my le_eq
and u_eq
lemmas just in case they turn out to be useful for something else. Concerning applications, I only replaced the subgroup proof.
Kevin Buzzard (Dec 28 2021 at 23:31):
This is really nice. Thanks!
Last updated: Dec 20 2023 at 11:08 UTC