Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 66e955e

Browse files
committed
feat(algebra/lie/basic): results relating Lie algebra morphisms and ideal operations (#5778)
The key results are `lie_ideal.comap_bracket_eq` and its corollary `lie_ideal.comap_bracket_incl`
1 parent 9381e37 commit 66e955e

File tree

1 file changed

+237
-18
lines changed

1 file changed

+237
-18
lines changed

src/algebra/lie/basic.lean

Lines changed: 237 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -570,21 +570,36 @@ instance lie_subalgebra_lie_ring (L' : lie_subalgebra R L) : lie_ring L' :=
570570
instance lie_subalgebra_lie_algebra (L' : lie_subalgebra R L) : lie_algebra R L' :=
571571
{ lie_smul := by { intros, apply set_coe.ext, apply lie_smul } }
572572

573-
@[simp] lemma lie_subalgebra.mem_coe {L' : lie_subalgebra R L} {x : L} :
573+
namespace lie_subalgebra
574+
575+
@[simp] lemma mem_coe {L' : lie_subalgebra R L} {x : L} :
574576
x ∈ (L' : set L) ↔ x ∈ L' := iff.rfl
575577

576-
@[simp] lemma lie_subalgebra.mem_coe' {L' : lie_subalgebra R L} {x : L} :
578+
@[simp] lemma mem_coe' {L' : lie_subalgebra R L} {x : L} :
577579
x ∈ (L' : submodule R L) ↔ x ∈ L' := iff.rfl
578580

579-
@[simp, norm_cast] lemma lie_subalgebra.coe_bracket (L' : lie_subalgebra R L) (x y : L') :
581+
@[simp, norm_cast] lemma coe_bracket (L' : lie_subalgebra R L) (x y : L') :
580582
(↑⁅x, y⁆ : L) = ⁅(↑x : L), ↑y⁆ := rfl
581583

582-
@[ext] lemma lie_subalgebra.ext (L₁' L₂' : lie_subalgebra R L) (h : ∀ x, x ∈ L₁' ↔ x ∈ L₂') :
584+
@[ext] lemma ext (L₁' L₂' : lie_subalgebra R L) (h : ∀ x, x ∈ L₁' ↔ x ∈ L₂') :
583585
L₁' = L₂' :=
584586
by { cases L₁', cases L₂', simp only [], ext x, exact h x, }
585587

586-
lemma lie_subalgebra.ext_iff (L₁' L₂' : lie_subalgebra R L) : L₁' = L₂' ↔ ∀ x, x ∈ L₁' ↔ x ∈ L₂' :=
587-
⟨λ h x, by rw h, lie_subalgebra.ext R L L₁' L₂'⟩
588+
lemma ext_iff (L₁' L₂' : lie_subalgebra R L) : L₁' = L₂' ↔ ∀ x, x ∈ L₁' ↔ x ∈ L₂' :=
589+
⟨λ h x, by rw h, ext R L L₁' L₂'⟩
590+
591+
@[simp] lemma coe_to_set_mk (S : set L) (h₁ h₂ h₃ h₄) :
592+
((⟨S, h₁, h₂, h₃, h₄⟩ : lie_subalgebra R L) : set L) = S := rfl
593+
594+
@[simp, norm_cast] theorem coe_set_eq_iff (L₁' L₂' : lie_subalgebra R L) :
595+
(L₁' : set L) = L₂' ↔ L₁' = L₂' :=
596+
by { cases L₁'; cases L₂'; simp, }
597+
598+
@[simp] lemma coe_to_submodule_eq_iff (L₁' L₂' : lie_subalgebra R L) :
599+
(L₁' : submodule R L) = (L₂' : submodule R L) ↔ L₁' = L₂' :=
600+
by { rw [← coe_set_eq_iff, submodule.ext'_iff], exact iff.rfl, }
601+
602+
end lie_subalgebra
588603

589604
/-- A subalgebra of an associative algebra is a Lie subalgebra of the associated Lie algebra. -/
590605
def lie_subalgebra_of_subalgebra (A : Type v) [ring A] [algebra R A]
@@ -619,6 +634,9 @@ def lie_algebra.morphism.range : lie_subalgebra R L₂ :=
619634
@[simp] lemma lie_algebra.morphism.range_coe : (f.range : set L₂) = set.range f :=
620635
linear_map.range_coe ↑f
621636

637+
@[simp] lemma lie_subalgebra.range_incl (L' : lie_subalgebra R L) : L'.incl.range = L' :=
638+
by { rw ← lie_subalgebra.coe_to_submodule_eq_iff, exact (L' : submodule R L).range_subtype, }
639+
622640
/-- The image of a Lie subalgebra under a Lie algebra morphism is a Lie subalgebra of the
623641
codomain. -/
624642
def lie_subalgebra.map (L' : lie_subalgebra R L) : lie_subalgebra R L₂ :=
@@ -778,7 +796,7 @@ def lie_ideal_subalgebra (I : lie_ideal R L) : lie_subalgebra R L :=
778796

779797
instance : has_coe (lie_ideal R L) (lie_subalgebra R L) := ⟨λ I, lie_ideal_subalgebra R L I⟩
780798

781-
@[norm_cast] lemma coe_to_subalgebra (I : lie_ideal R L) :
799+
@[norm_cast] lemma lie_ideal.coe_to_subalgebra (I : lie_ideal R L) :
782800
((I : lie_subalgebra R L) : set L) = I := rfl
783801

784802
end lie_ideal
@@ -1267,34 +1285,235 @@ end lie_submodule
12671285

12681286
namespace lie_ideal
12691287

1288+
variables (f : L →ₗ⁅R⁆ L') (I : lie_ideal R L) (J : lie_ideal R L')
1289+
12701290
/-- A morphism of Lie algebras `f : L → L'` pushes forward Lie ideals of `L` to Lie ideals of `L'`.
12711291
12721292
Note that unlike `lie_submodule.map`, we must take the `lie_span` of the image. Mathematically
12731293
this is because although `f` makes `L'` into a Lie module over `L`, in general the `L` submodules of
12741294
`L'` are not the same as the ideals of `L'`. -/
1275-
def map (f : L →ₗ⁅R⁆ L') (I : lie_ideal R L) : lie_ideal R L' :=
1276-
lie_submodule.lie_span R L' (f '' I)
1295+
def map : lie_ideal R L' := lie_submodule.lie_span R L' (f '' I)
12771296

12781297
/-- A morphism of Lie algebras `f : L → L'` pulls back Lie ideals of `L'` to Lie ideals of `L`.
12791298
12801299
Note that `f` makes `L'` into a Lie module over `L` (turning `f` into a morphism of Lie modules)
12811300
and so this is a special case of `lie_submodule.comap` but we do not exploit this fact. -/
1282-
def comap (f : L →ₗ⁅R⁆ L') (I : lie_ideal R L') : lie_ideal R L :=
1283-
{ lie_mem := λ x y h, by { suffices : ⁅f x, f y⁆ ∈ I, { simp [this], }, apply I.lie_mem h, },
1284-
..(I : submodule R L').comap (f : L →ₗ[R] L') }
1301+
def comap : lie_ideal R L :=
1302+
{ lie_mem := λ x y h, by { suffices : ⁅f x, f y⁆ ∈ J, { simp [this], }, apply J.lie_mem h, },
1303+
..(J : submodule R L').comap (f : L →ₗ[R] L') }
1304+
1305+
@[simp] lemma map_coe_submodule (h : ↑(map f I) = f '' I) :
1306+
(map f I : submodule R L') = (I : submodule R L).map f :=
1307+
by { rw [submodule.ext'_iff, lie_submodule.coe_to_submodule, h, submodule.map_coe], refl, }
1308+
1309+
@[simp] lemma comap_coe_submodule : (comap f J : submodule R L) = (J : submodule R L').comap f :=
1310+
rfl
12851311

1286-
lemma map_le_iff_le_comap {f : L →ₗ⁅R⁆ L'} {I : lie_ideal R L} {I' : lie_ideal R L'} :
1287-
map f I ≤ I' ↔ I ≤ comap f I' :=
1288-
by { erw lie_submodule.lie_span_le, exact set.image_subset_iff, }
1312+
lemma map_le : map f I ≤ J ↔ f '' I ⊆ J := lie_submodule.lie_span_le
12891313

1290-
lemma gc_map_comap (f : L →ₗ⁅R⁆ L') : galois_connection (map f) (comap f) :=
1314+
variables {f I J}
1315+
1316+
lemma mem_map {x : L} (hx : x ∈ I) : f x ∈ map f I :=
1317+
by { apply lie_submodule.subset_lie_span, use x, exact ⟨hx, rfl⟩, }
1318+
1319+
@[simp] lemma mem_comap {x : L} : x ∈ comap f J ↔ f x ∈ J := iff.rfl
1320+
1321+
lemma map_le_iff_le_comap : map f I ≤ J ↔ I ≤ comap f J :=
1322+
by { rw map_le, exact set.image_subset_iff, }
1323+
1324+
lemma gc_map_comap : galois_connection (map f) (comap f) :=
12911325
λ I I', map_le_iff_le_comap
12921326

1327+
lemma map_comap_le : map f (comap f J) ≤ J :=
1328+
by { rw map_le_iff_le_comap, apply le_refl _, }
1329+
1330+
/-- See also `map_comap_eq` below. -/
1331+
lemma comap_map_le : I ≤ comap f (map f I) :=
1332+
by { rw ← map_le_iff_le_comap, apply le_refl _, }
1333+
1334+
lemma map_mono {I₁ I₂ : lie_ideal R L} (h : I₁ ≤ I₂) : map f I₁ ≤ map f I₂ :=
1335+
by { rw lie_submodule.le_def at h, apply lie_submodule.lie_span_mono (set.image_subset ⇑f h), }
1336+
1337+
lemma comap_mono {J₁ J₂ : lie_ideal R L'} (h : J₁ ≤ J₂) : comap f J₁ ≤ comap f J₂ :=
1338+
by { rw lie_submodule.le_def at h ⊢, exact set.preimage_mono h, }
1339+
1340+
lemma map_of_image (h : f '' I = J) : I.map f = J :=
1341+
begin
1342+
apply le_antisymm,
1343+
{ erw [lie_submodule.lie_span_le, h], },
1344+
{ rw [lie_submodule.le_def, ← h], exact lie_submodule.subset_lie_span, },
1345+
end
1346+
1347+
end lie_ideal
1348+
1349+
namespace lie_algebra.morphism
1350+
1351+
variables (f : L →ₗ⁅R⁆ L') (I : lie_ideal R L) (J : lie_ideal R L')
1352+
1353+
/-- The kernel of a morphism of Lie algebras, as an ideal in the domain. -/
1354+
def ker : lie_ideal R L := lie_ideal.comap f ⊥
1355+
1356+
/-- The range of a morphism of Lie algebras as an ideal in the codomain. -/
1357+
def ideal_range : lie_ideal R L' := lie_ideal.map f ⊤
1358+
1359+
/-- The condition that the image of a morphism of Lie algebras is an ideal. -/
1360+
def is_ideal_morphism : Prop := (f.ideal_range : lie_subalgebra R L') = f.range
1361+
1362+
@[simp] lemma is_ideal_morphism_def :
1363+
f.is_ideal_morphism ↔ (f.ideal_range : lie_subalgebra R L') = f.range := iff.rfl
1364+
1365+
lemma range_subset_ideal_range : (f.range : set L') ⊆ f.ideal_range := lie_submodule.subset_lie_span
1366+
1367+
lemma map_le_ideal_range : I.map f ≤ f.ideal_range := lie_ideal.map_mono le_top
1368+
1369+
lemma ker_le_comap : f.ker ≤ J.comap f := lie_ideal.comap_mono bot_le
1370+
1371+
@[simp] lemma mem_ker {x : L} (h : x ∈ ker f) : f x = 0 :=
1372+
begin
1373+
change x ∈ lie_ideal.comap f ⊥ at h,
1374+
rw [lie_ideal.mem_comap, lie_submodule.mem_bot] at h, exact h,
1375+
end
1376+
1377+
lemma mem_ideal_range {x : L} : f x ∈ ideal_range f := lie_ideal.mem_map (lie_submodule.mem_top x)
1378+
1379+
@[simp] lemma mem_ideal_range_iff (h : is_ideal_morphism f) {y : L'} :
1380+
y ∈ ideal_range f ↔ ∃ (x : L), f x = y :=
1381+
begin
1382+
rw f.is_ideal_morphism_def at h,
1383+
rw [← lie_submodule.mem_coe, ← lie_ideal.coe_to_subalgebra, h, f.range_coe, set.mem_range],
1384+
end
1385+
1386+
1387+
@[simp] lemma ker_coe_submodule : (ker f : submodule R L) = (f : L →ₗ[R] L').ker := rfl
1388+
1389+
end lie_algebra.morphism
1390+
1391+
namespace lie_ideal
1392+
1393+
variables {f : L →ₗ⁅R⁆ L'} {I : lie_ideal R L} {J : lie_ideal R L'}
1394+
1395+
lemma map_sup_ker_eq_map : lie_ideal.map f (I ⊔ f.ker) = lie_ideal.map f I :=
1396+
begin
1397+
suffices : lie_ideal.map f (I ⊔ f.ker) ≤ lie_ideal.map f I,
1398+
{ exact le_antisymm this (lie_ideal.map_mono le_sup_left), },
1399+
apply lie_submodule.lie_span_mono,
1400+
rintros x ⟨y, hy₁, hy₂⟩, rw ← hy₂,
1401+
erw lie_submodule.mem_sup at hy₁, obtain ⟨z₁, hz₁, z₂, hz₂, hy⟩ := hy₁, rw ← hy,
1402+
rw [f.map_add, f.mem_ker hz₂, add_zero], exact ⟨z₁, hz₁, rfl⟩,
1403+
end
1404+
1405+
@[simp] lemma map_comap_eq (h : f.is_ideal_morphism) : map f (comap f J) = f.ideal_range ⊓ J :=
1406+
begin
1407+
apply le_antisymm,
1408+
{ rw le_inf_iff, exact ⟨f.map_le_ideal_range _, map_comap_le⟩, },
1409+
{ rw f.is_ideal_morphism_def at h,
1410+
rw [lie_submodule.le_def, lie_submodule.inf_coe, ← coe_to_subalgebra, h],
1411+
rintros y ⟨⟨x, h₁, h₂⟩, h₃⟩, rw ← h₂ at h₃ ⊢, exact mem_map h₃, },
1412+
end
1413+
1414+
@[simp] lemma comap_map_eq (h : ↑(map f I) = f '' I) : comap f (map f I) = I ⊔ f.ker :=
1415+
by rw [← lie_submodule.coe_to_submodule_eq_iff, comap_coe_submodule, I.map_coe_submodule f h,
1416+
lie_submodule.sup_coe_to_submodule, f.ker_coe_submodule, linear_map.comap_map_eq]
1417+
1418+
variables (f I J)
1419+
12931420
/-- Regarding an ideal `I` as a subalgebra, the inclusion map into its ambient space is a morphism
12941421
of Lie algebras. -/
1295-
def incl (I : lie_ideal R L) : I →ₗ⁅R⁆ L := (I : lie_subalgebra R L).incl
1422+
def incl : I →ₗ⁅R⁆ L := (I : lie_subalgebra R L).incl
1423+
1424+
@[simp] lemma incl_apply (x : I) : I.incl x = x := rfl
1425+
1426+
@[simp] lemma incl_coe : (I.incl : I →ₗ[R] L) = (I : submodule R L).subtype := rfl
1427+
1428+
@[simp] lemma comap_incl_self : comap I.incl I = ⊤ :=
1429+
by { rw ← lie_submodule.coe_to_submodule_eq_iff, exact submodule.comap_subtype_self _, }
1430+
1431+
@[simp] lemma ker_incl : I.incl.ker = ⊥ :=
1432+
by rw [← lie_submodule.coe_to_submodule_eq_iff, I.incl.ker_coe_submodule,
1433+
lie_submodule.bot_coe_submodule, incl_coe, submodule.ker_subtype]
1434+
1435+
@[simp] lemma incl_ideal_range : I.incl.ideal_range = I :=
1436+
begin
1437+
apply le_antisymm,
1438+
{ erw lie_submodule.lie_span_le, intros x hx,
1439+
simp only [true_and, set.mem_image, incl_apply, set.mem_univ, lie_submodule.top_coe] at hx,
1440+
obtain ⟨y, hy⟩ := hx, rw ← hy, exact y.property, },
1441+
{ rw [lie_submodule.le_def, ← lie_ideal.coe_to_subalgebra, ← (I : lie_subalgebra R L).range_incl],
1442+
exact I.incl.range_subset_ideal_range, },
1443+
end
1444+
1445+
lemma incl_is_ideal_morphism : I.incl.is_ideal_morphism :=
1446+
begin
1447+
rw [I.incl.is_ideal_morphism_def, incl_ideal_range],
1448+
exact (I : lie_subalgebra R L).range_incl.symm,
1449+
end
1450+
1451+
open lie_algebra
1452+
1453+
/-- Note that the inequality can be strict; e.g., the inclusion of an Abelian subalgebra of a
1454+
simple algebra. -/
1455+
lemma map_bracket_le {I₁ I₂ : lie_ideal R L} : map f ⁅I₁, I₂⁆ ≤ ⁅map f I₁, map f I₂⁆ :=
1456+
begin
1457+
rw map_le_iff_le_comap, erw lie_submodule.lie_span_le,
1458+
intros x hx, obtain ⟨⟨y₁, hy₁⟩, ⟨y₂, hy₂⟩, hx⟩ := hx, rw ← hx,
1459+
let fy₁ : ↥(map f I₁) := ⟨f y₁, mem_map hy₁⟩,
1460+
let fy₂ : ↥(map f I₂) := ⟨f y₂, mem_map hy₂⟩,
1461+
change _ ∈ comap f ⁅map f I₁, map f I₂⁆,
1462+
simp only [submodule.coe_mk, mem_comap, map_lie],
1463+
exact lie_submodule.lie_mem_lie _ _ fy₁ fy₂,
1464+
end
1465+
1466+
lemma comap_bracket_le {J₁ J₂ : lie_ideal R L'} : ⁅comap f J₁, comap f J₂⁆ ≤ comap f ⁅J₁, J₂⁆ :=
1467+
begin
1468+
rw ← map_le_iff_le_comap,
1469+
exact le_trans (map_bracket_le f) (lie_submodule.mono_lie _ _ _ _ map_comap_le map_comap_le),
1470+
end
1471+
1472+
variables {f}
1473+
1474+
lemma map_comap_incl {I₁ I₂ : lie_ideal R L} : map I₁.incl (comap I₁.incl I₂) = I₁ ⊓ I₂ :=
1475+
by { conv_rhs { rw ← I₁.incl_ideal_range, }, rw ← map_comap_eq, exact I₁.incl_is_ideal_morphism, }
1476+
1477+
lemma comap_bracket_eq {J₁ J₂ : lie_ideal R L'} (h : f.is_ideal_morphism) :
1478+
comap f ⁅f.ideal_range ⊓ J₁, f.ideal_range ⊓ J₂⁆ = ⁅comap f J₁, comap f J₂⁆ ⊔ f.ker :=
1479+
begin
1480+
rw [← lie_submodule.coe_to_submodule_eq_iff, comap_coe_submodule,
1481+
lie_submodule.sup_coe_to_submodule, f.ker_coe_submodule, ← linear_map.comap_map_eq,
1482+
lie_submodule.lie_ideal_oper_eq_linear_span, lie_submodule.lie_ideal_oper_eq_linear_span,
1483+
submodule.map_span],
1484+
congr, simp only [coe_to_linear_map, set.mem_set_of_eq], ext y,
1485+
split,
1486+
{ rintros ⟨⟨x₁, hx₁⟩, ⟨x₂, hx₂⟩, hy⟩, rw ← hy,
1487+
erw [lie_submodule.mem_inf, f.mem_ideal_range_iff h] at hx₁ hx₂,
1488+
obtain ⟨⟨z₁, hz₁⟩, hz₁'⟩ := hx₁, rw ← hz₁ at hz₁',
1489+
obtain ⟨⟨z₂, hz₂⟩, hz₂'⟩ := hx₂, rw ← hz₂ at hz₂',
1490+
use [⁅z₁, z₂⁆, ⟨z₁, hz₁'⟩, ⟨z₂, hz₂'⟩, rfl],
1491+
simp only [hz₁, hz₂, submodule.coe_mk, map_lie], },
1492+
{ rintros ⟨x, ⟨⟨z₁, hz₁⟩, ⟨z₂, hz₂⟩, hx⟩, hy⟩, rw [← hy, ← hx],
1493+
have hz₁' : f z₁ ∈ f.ideal_range ⊓ J₁,
1494+
{ rw lie_submodule.mem_inf, exact ⟨f.mem_ideal_range, hz₁⟩, },
1495+
have hz₂' : f z₂ ∈ f.ideal_range ⊓ J₂,
1496+
{ rw lie_submodule.mem_inf, exact ⟨f.mem_ideal_range, hz₂⟩, },
1497+
use [⟨f z₁, hz₁'⟩, ⟨f z₂, hz₂'⟩], simp only [submodule.coe_mk, map_lie], },
1498+
end
1499+
1500+
lemma map_comap_bracket_eq {J₁ J₂ : lie_ideal R L'} (h : f.is_ideal_morphism) :
1501+
map f ⁅comap f J₁, comap f J₂⁆ = ⁅f.ideal_range ⊓ J₁, f.ideal_range ⊓ J₂⁆ :=
1502+
by { rw [← map_sup_ker_eq_map, ← comap_bracket_eq h, map_comap_eq h, inf_eq_right],
1503+
exact le_trans (lie_submodule.lie_le_left _ _) inf_le_left, }
1504+
1505+
lemma comap_bracket_incl {I₁ I₂ : lie_ideal R L} :
1506+
⁅comap I.incl I₁, comap I.incl I₂⁆ = comap I.incl ⁅I ⊓ I₁, I ⊓ I₂⁆ :=
1507+
begin
1508+
conv_rhs { congr, skip, rw ← I.incl_ideal_range, }, rw comap_bracket_eq,
1509+
simp only [ker_incl, sup_bot_eq], exact I.incl_is_ideal_morphism,
1510+
end
12961511

1297-
@[simp] lemma incl_apply (I : lie_ideal R L) (x : I) : I.incl x = x := rfl
1512+
/-- This is a very useful result; it allows us to use the fact that inclusion distributes over the
1513+
Lie bracket operation on ideals, subject to the conditions shown. -/
1514+
lemma comap_bracket_incl_of_le {I₁ I₂ : lie_ideal R L} (h₁ : I₁ ≤ I) (h₂ : I₂ ≤ I) :
1515+
⁅comap I.incl I₁, comap I.incl I₂⁆ = comap I.incl ⁅I₁, I₂⁆ :=
1516+
by { rw comap_bracket_incl, rw ← inf_eq_right at h₁ h₂, rw [h₁, h₂], }
12981517

12991518
end lie_ideal
13001519

0 commit comments

Comments
 (0)