algebra.lie.submodule
⟷
Mathlib.Algebra.Lie.Submodule
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -558,7 +558,7 @@ instance : CompleteLattice (LieSubmodule R L M) :=
le := (· ≤ ·)
lt := (· < ·)
bot := ⊥
- bot_le := fun N _ h => by rw [mem_bot] at h ; rw [h]; exact N.zero_mem'
+ bot_le := fun N _ h => by rw [mem_bot] at h; rw [h]; exact N.zero_mem'
top := ⊤
le_top := fun _ _ _ => trivial
inf := (· ⊓ ·)
@@ -631,7 +631,7 @@ theorem eq_bot_iff : N = ⊥ ↔ ∀ m : M, m ∈ N → m = 0 := by rw [eq_bot_i
instance subsingleton_of_bot : Subsingleton (LieSubmodule R L ↥(⊥ : LieSubmodule R L M)) :=
by
apply subsingleton_of_bot_eq_top
- ext ⟨x, hx⟩; change x ∈ ⊥ at hx ; rw [LieSubmodule.mem_bot] at hx ; subst hx
+ ext ⟨x, hx⟩; change x ∈ ⊥ at hx; rw [LieSubmodule.mem_bot] at hx; subst hx
simp only [true_iff_iff, eq_self_iff_true, Submodule.mk_eq_zero, LieSubmodule.mem_bot]
#align lie_submodule.subsingleton_of_bot LieSubmodule.subsingleton_of_bot
-/
@@ -789,7 +789,7 @@ theorem lieSpan_le {N} : lieSpan R L s ≤ N ↔ s ⊆ N :=
by
constructor
· exact subset.trans subset_lie_span
- · intro hs m hm; rw [mem_lie_span] at hm ; exact hm _ hs
+ · intro hs m hm; rw [mem_lie_span] at hm; exact hm _ hs
#align lie_submodule.lie_span_le LieSubmodule.lieSpan_le
-/
@@ -890,7 +890,7 @@ def map : LieSubmodule R L M' :=
lie_mem := fun x m' h => by
rcases h with ⟨m, hm, hfm⟩; use⁅x, m⁆; constructor
· apply N.lie_mem hm
- · norm_cast at hfm ; simp [hfm] }
+ · norm_cast at hfm; simp [hfm] }
#align lie_submodule.map LieSubmodule.map
-/
@@ -1077,7 +1077,7 @@ theorem comap_map_le : I ≤ comap f (map f I) := by rw [← map_le_iff_le_comap
#print LieIdeal.map_mono /-
@[mono]
-theorem map_mono : Monotone (map f) := fun I₁ I₂ h => by rw [SetLike.le_def] at h ;
+theorem map_mono : Monotone (map f) := fun I₁ I₂ h => by rw [SetLike.le_def] at h;
apply LieSubmodule.lieSpan_mono (Set.image_subset (⇑f) h)
#align lie_ideal.map_mono LieIdeal.map_mono
-/
@@ -1108,7 +1108,7 @@ same as ideals of `L` contained in `I`. -/
instance subsingleton_of_bot : Subsingleton (LieIdeal R (⊥ : LieIdeal R L)) :=
by
apply subsingleton_of_bot_eq_top
- ext ⟨x, hx⟩; change x ∈ ⊥ at hx ; rw [LieSubmodule.mem_bot] at hx ; subst hx
+ ext ⟨x, hx⟩; change x ∈ ⊥ at hx; rw [LieSubmodule.mem_bot] at hx; subst hx
simp only [true_iff_iff, eq_self_iff_true, Submodule.mk_eq_zero, LieSubmodule.mem_bot]
#align lie_ideal.subsingleton_of_bot LieIdeal.subsingleton_of_bot
-/
@@ -1220,7 +1220,7 @@ theorem mem_idealRange {x : L} : f x ∈ idealRange f :=
@[simp]
theorem mem_idealRange_iff (h : IsIdealMorphism f) {y : L'} : y ∈ idealRange f ↔ ∃ x : L, f x = y :=
by
- rw [f.is_ideal_morphism_def] at h
+ rw [f.is_ideal_morphism_def] at h
rw [← LieSubmodule.mem_coe, ← LieIdeal.coe_toSubalgebra, h, f.range_coe, Set.mem_range]
#align lie_hom.mem_ideal_range_iff LieHom.mem_idealRange_iff
-/
@@ -1229,7 +1229,7 @@ theorem mem_idealRange_iff (h : IsIdealMorphism f) {y : L'} : y ∈ idealRange f
theorem le_ker_iff : I ≤ f.ker ↔ ∀ x, x ∈ I → f x = 0 :=
by
constructor <;> intro h x hx
- · specialize h hx; rw [mem_ker] at h ; exact h
+ · specialize h hx; rw [mem_ker] at h; exact h
· rw [mem_ker]; apply h x hx
#align lie_hom.le_ker_iff LieHom.le_ker_iff
-/
@@ -1260,7 +1260,7 @@ theorem range_eq_top : f.range = ⊤ ↔ Function.Surjective f :=
@[simp]
theorem idealRange_eq_top_of_surjective (h : Function.Surjective f) : f.idealRange = ⊤ :=
by
- rw [← f.range_eq_top] at h
+ rw [← f.range_eq_top] at h
rw [ideal_range_eq_lie_span_range, h, ← LieSubalgebra.coe_to_submodule, ←
LieSubmodule.coe_toSubmodule_eq_iff, LieSubmodule.top_coeSubmodule,
LieSubalgebra.top_coe_submodule, LieSubmodule.coe_lieSpan_submodule_eq_iff]
@@ -1314,7 +1314,7 @@ theorem coe_map_of_surjective (h : Function.Surjective f) :
theorem mem_map_of_surjective {y : L'} (h₁ : Function.Surjective f) (h₂ : y ∈ I.map f) :
∃ x : I, f x = y :=
by
- rw [← LieSubmodule.mem_coeSubmodule, coe_map_of_surjective h₁, Submodule.mem_map] at h₂
+ rw [← LieSubmodule.mem_coeSubmodule, coe_map_of_surjective h₁, Submodule.mem_map] at h₂
obtain ⟨x, hx, rfl⟩ := h₂
use⟨x, hx⟩
rfl
@@ -1324,8 +1324,8 @@ theorem mem_map_of_surjective {y : L'} (h₁ : Function.Surjective f) (h₂ : y
#print LieIdeal.bot_of_map_eq_bot /-
theorem bot_of_map_eq_bot {I : LieIdeal R L} (h₁ : Function.Injective f) (h₂ : I.map f = ⊥) :
I = ⊥ := by
- rw [← f.ker_eq_bot] at h₁ ; change comap f ⊥ = ⊥ at h₁
- rw [eq_bot_iff, map_le_iff_le_comap, h₁] at h₂
+ rw [← f.ker_eq_bot] at h₁; change comap f ⊥ = ⊥ at h₁
+ rw [eq_bot_iff, map_le_iff_le_comap, h₁] at h₂
rw [eq_bot_iff]; exact h₂
#align lie_ideal.bot_of_map_eq_bot LieIdeal.bot_of_map_eq_bot
-/
@@ -1367,7 +1367,7 @@ theorem map_sup_ker_eq_map : LieIdeal.map f (I ⊔ f.ker) = LieIdeal.map f I :=
exact le_antisymm this (LieIdeal.map_mono le_sup_left)
apply LieSubmodule.lieSpan_mono
rintro x ⟨y, hy₁, hy₂⟩; rw [← hy₂]
- erw [LieSubmodule.mem_sup] at hy₁ ; obtain ⟨z₁, hz₁, z₂, hz₂, hy⟩ := hy₁; rw [← hy]
+ erw [LieSubmodule.mem_sup] at hy₁; obtain ⟨z₁, hz₁, z₂, hz₂, hy⟩ := hy₁; rw [← hy]
rw [f.coe_to_linear_map, f.map_add, f.mem_ker.mp hz₂, add_zero]; exact ⟨z₁, hz₁, rfl⟩
#align lie_ideal.map_sup_ker_eq_map LieIdeal.map_sup_ker_eq_map
-/
@@ -1378,7 +1378,7 @@ theorem map_comap_eq (h : f.IsIdealMorphism) : map f (comap f J) = f.idealRange
by
apply le_antisymm
· rw [le_inf_iff]; exact ⟨f.map_le_ideal_range _, map_comap_le⟩
- · rw [f.is_ideal_morphism_def] at h
+ · rw [f.is_ideal_morphism_def] at h
rw [← SetLike.coe_subset_coe, LieSubmodule.inf_coe, ← coe_to_subalgebra, h]
rintro y ⟨⟨x, h₁⟩, h₂⟩; rw [← h₁] at h₂ ⊢; exact mem_map h₂
#align lie_ideal.map_comap_eq LieIdeal.map_comap_eq
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -724,30 +724,31 @@ theorem incl_eq_val : (N.incl : N → M) = Subtype.val :=
variable {N N'} (h : N ≤ N')
-#print LieSubmodule.homOfLe /-
+#print LieSubmodule.inclusion /-
/-- Given two nested Lie submodules `N ⊆ N'`, the inclusion `N ↪ N'` is a morphism of Lie modules.-/
-def homOfLe : N →ₗ⁅R,L⁆ N' :=
- { Submodule.ofLe (show N.toSubmodule ≤ N'.toSubmodule from h) with map_lie' := fun x m => rfl }
-#align lie_submodule.hom_of_le LieSubmodule.homOfLe
+def inclusion : N →ₗ⁅R,L⁆ N' :=
+ { Submodule.inclusion (show N.toSubmodule ≤ N'.toSubmodule from h) with
+ map_lie' := fun x m => rfl }
+#align lie_submodule.hom_of_le LieSubmodule.inclusion
-/
-#print LieSubmodule.coe_homOfLe /-
+#print LieSubmodule.coe_inclusion /-
@[simp]
-theorem coe_homOfLe (m : N) : (homOfLe h m : M) = m :=
+theorem coe_inclusion (m : N) : (inclusion h m : M) = m :=
rfl
-#align lie_submodule.coe_hom_of_le LieSubmodule.coe_homOfLe
+#align lie_submodule.coe_hom_of_le LieSubmodule.coe_inclusion
-/
-#print LieSubmodule.homOfLe_apply /-
-theorem homOfLe_apply (m : N) : homOfLe h m = ⟨m.1, h m.2⟩ :=
+#print LieSubmodule.inclusion_apply /-
+theorem inclusion_apply (m : N) : inclusion h m = ⟨m.1, h m.2⟩ :=
rfl
-#align lie_submodule.hom_of_le_apply LieSubmodule.homOfLe_apply
+#align lie_submodule.hom_of_le_apply LieSubmodule.inclusion_apply
-/
-#print LieSubmodule.homOfLe_injective /-
-theorem homOfLe_injective : Function.Injective (homOfLe h) := fun x y => by
+#print LieSubmodule.inclusion_injective /-
+theorem inclusion_injective : Function.Injective (inclusion h) := fun x y => by
simp only [hom_of_le_apply, imp_self, Subtype.mk_eq_mk, SetLike.coe_eq_coe, Subtype.val_eq_coe]
-#align lie_submodule.hom_of_le_injective LieSubmodule.homOfLe_injective
+#align lie_submodule.hom_of_le_injective LieSubmodule.inclusion_injective
-/
end InclusionMaps
@@ -1329,31 +1330,33 @@ theorem bot_of_map_eq_bot {I : LieIdeal R L} (h₁ : Function.Injective f) (h₂
#align lie_ideal.bot_of_map_eq_bot LieIdeal.bot_of_map_eq_bot
-/
-#print LieIdeal.homOfLe /-
+#print LieIdeal.inclusion /-
/-- Given two nested Lie ideals `I₁ ⊆ I₂`, the inclusion `I₁ ↪ I₂` is a morphism of Lie algebras. -/
-def homOfLe {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) : I₁ →ₗ⁅R⁆ I₂ :=
- { Submodule.ofLe (show I₁.toSubmodule ≤ I₂.toSubmodule from h) with map_lie' := fun x y => rfl }
-#align lie_ideal.hom_of_le LieIdeal.homOfLe
+def inclusion {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) : I₁ →ₗ⁅R⁆ I₂ :=
+ { Submodule.inclusion (show I₁.toSubmodule ≤ I₂.toSubmodule from h) with
+ map_lie' := fun x y => rfl }
+#align lie_ideal.hom_of_le LieIdeal.inclusion
-/
-#print LieIdeal.coe_homOfLe /-
+#print LieIdeal.coe_inclusion /-
@[simp]
-theorem coe_homOfLe {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) (x : I₁) : (homOfLe h x : L) = x :=
+theorem coe_inclusion {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) (x : I₁) : (inclusion h x : L) = x :=
rfl
-#align lie_ideal.coe_hom_of_le LieIdeal.coe_homOfLe
+#align lie_ideal.coe_hom_of_le LieIdeal.coe_inclusion
-/
-#print LieIdeal.homOfLe_apply /-
-theorem homOfLe_apply {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) (x : I₁) : homOfLe h x = ⟨x.1, h x.2⟩ :=
+#print LieIdeal.inclusion_apply /-
+theorem inclusion_apply {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) (x : I₁) :
+ inclusion h x = ⟨x.1, h x.2⟩ :=
rfl
-#align lie_ideal.hom_of_le_apply LieIdeal.homOfLe_apply
+#align lie_ideal.hom_of_le_apply LieIdeal.inclusion_apply
-/
-#print LieIdeal.homOfLe_injective /-
-theorem homOfLe_injective {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) : Function.Injective (homOfLe h) :=
- fun x y => by
+#print LieIdeal.inclusion_injective /-
+theorem inclusion_injective {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) :
+ Function.Injective (inclusion h) := fun x y => by
simp only [hom_of_le_apply, imp_self, Subtype.mk_eq_mk, SetLike.coe_eq_coe, Subtype.val_eq_coe]
-#align lie_ideal.hom_of_le_injective LieIdeal.homOfLe_injective
+#align lie_ideal.hom_of_le_injective LieIdeal.inclusion_injective
-/
#print LieIdeal.map_sup_ker_eq_map /-
mathlib commit https://github.com/leanprover-community/mathlib/commit/19c869efa56bbb8b500f2724c0b77261edbfa28c
@@ -540,7 +540,6 @@ theorem sInf_coe (S : Set (LieSubmodule R L M)) : (↑(sInf S) : Set M) = ⋂ s
#align lie_submodule.Inf_coe LieSubmodule.sInf_coe
-/
-#print LieSubmodule.sInf_glb /-
theorem sInf_glb (S : Set (LieSubmodule R L M)) : IsGLB S (sInf S) :=
by
have h : ∀ N N' : LieSubmodule R L M, (N : Set M) ≤ N' ↔ N ≤ N' := by intros; rfl
@@ -548,7 +547,6 @@ theorem sInf_glb (S : Set (LieSubmodule R L M)) : IsGLB S (sInf S) :=
simp only [Inf_coe]
exact isGLB_biInf
#align lie_submodule.Inf_glb LieSubmodule.sInf_glb
--/
/-- The set of Lie submodules of a Lie module form a complete lattice.
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,8 +3,8 @@ Copyright (c) 2021 Oliver Nash. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Oliver Nash
-/
-import Mathbin.Algebra.Lie.Subalgebra
-import Mathbin.RingTheory.Noetherian
+import Algebra.Lie.Subalgebra
+import RingTheory.Noetherian
#align_import algebra.lie.submodule from "leanprover-community/mathlib"@"af471b9e3ce868f296626d33189b4ce730fa4c00"
@@ -500,12 +500,12 @@ instance : Inf (LieSubmodule R L M) :=
{ (N ⊓ N' : Submodule R M) with
lie_mem := fun x m h => mem_inter (N.lie_mem h.1) (N'.lie_mem h.2) }⟩
-/- ./././Mathport/Syntax/Translate/Expr.lean:372:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
+/- ./././Mathport/Syntax/Translate/Expr.lean:373:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
instance : InfSet (LieSubmodule R L M) :=
⟨fun S =>
{
sInf
- "./././Mathport/Syntax/Translate/Expr.lean:372:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" with
+ "./././Mathport/Syntax/Translate/Expr.lean:373:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" with
lie_mem := fun x m h =>
by
simp only [Submodule.mem_carrier, mem_Inter, Submodule.sInf_coe, mem_set_of_eq,
@@ -519,13 +519,13 @@ theorem inf_coe : (↑(N ⊓ N') : Set M) = N ∩ N' :=
#align lie_submodule.inf_coe LieSubmodule.inf_coe
-/
-/- ./././Mathport/Syntax/Translate/Expr.lean:372:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
+/- ./././Mathport/Syntax/Translate/Expr.lean:373:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
#print LieSubmodule.sInf_coe_toSubmodule /-
@[simp]
theorem sInf_coe_toSubmodule (S : Set (LieSubmodule R L M)) :
(↑(sInf S) : Submodule R M) =
sInf
- "./././Mathport/Syntax/Translate/Expr.lean:372:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" :=
+ "./././Mathport/Syntax/Translate/Expr.lean:373:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" :=
rfl
#align lie_submodule.Inf_coe_to_submodule LieSubmodule.sInf_coe_toSubmodule
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/63721b2c3eba6c325ecf8ae8cca27155a4f6306f
@@ -365,7 +365,7 @@ theorem Submodule.exists_lieSubmodule_coe_eq_iff (p : Submodule R M) :
by
constructor
· rintro ⟨N, rfl⟩ _ _; exact N.lie_mem
- · intro h; use { p with lie_mem := h }; exact LieSubmodule.coe_toSubmodule_mk p _
+ · intro h; use{ p with lie_mem := h }; exact LieSubmodule.coe_toSubmodule_mk p _
#align submodule.exists_lie_submodule_coe_eq_iff Submodule.exists_lieSubmodule_coe_eq_iff
-/
@@ -889,7 +889,7 @@ of `M'`. -/
def map : LieSubmodule R L M' :=
{ (N : Submodule R M).map (f : M →ₗ[R] M') with
lie_mem := fun x m' h => by
- rcases h with ⟨m, hm, hfm⟩; use ⁅x, m⁆; constructor
+ rcases h with ⟨m, hm, hfm⟩; use⁅x, m⁆; constructor
· apply N.lie_mem hm
· norm_cast at hfm ; simp [hfm] }
#align lie_submodule.map LieSubmodule.map
@@ -1265,7 +1265,7 @@ theorem idealRange_eq_top_of_surjective (h : Function.Surjective f) : f.idealRan
rw [ideal_range_eq_lie_span_range, h, ← LieSubalgebra.coe_to_submodule, ←
LieSubmodule.coe_toSubmodule_eq_iff, LieSubmodule.top_coeSubmodule,
LieSubalgebra.top_coe_submodule, LieSubmodule.coe_lieSpan_submodule_eq_iff]
- use ⊤
+ use⊤
exact LieSubmodule.top_coeSubmodule
#align lie_hom.ideal_range_eq_top_of_surjective LieHom.idealRange_eq_top_of_surjective
-/
@@ -1303,7 +1303,7 @@ theorem coe_map_of_surjective (h : Function.Surjective f) :
obtain ⟨z₁, rfl⟩ := h x
simp only [LieHom.coe_toLinearMap, SetLike.mem_coe, Set.mem_image,
LieSubmodule.mem_coeSubmodule, Submodule.mem_carrier, Submodule.map_coe]
- use ⁅z₁, z₂⁆
+ use⁅z₁, z₂⁆
exact ⟨I.lie_mem hz₂, f.map_lie z₁ z₂⟩ }
erw [LieSubmodule.coe_lieSpan_submodule_eq_iff]
use J
@@ -1317,7 +1317,7 @@ theorem mem_map_of_surjective {y : L'} (h₁ : Function.Surjective f) (h₂ : y
by
rw [← LieSubmodule.mem_coeSubmodule, coe_map_of_surjective h₁, Submodule.mem_map] at h₂
obtain ⟨x, hx, rfl⟩ := h₂
- use ⟨x, hx⟩
+ use⟨x, hx⟩
rfl
#align lie_ideal.mem_map_of_surjective LieIdeal.mem_map_of_surjective
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,15 +2,12 @@
Copyright (c) 2021 Oliver Nash. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Oliver Nash
-
-! This file was ported from Lean 3 source module algebra.lie.submodule
-! leanprover-community/mathlib commit af471b9e3ce868f296626d33189b4ce730fa4c00
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Algebra.Lie.Subalgebra
import Mathbin.RingTheory.Noetherian
+#align_import algebra.lie.submodule from "leanprover-community/mathlib"@"af471b9e3ce868f296626d33189b4ce730fa4c00"
+
/-!
# Lie submodules of a Lie algebra
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -48,11 +48,13 @@ variable [CommRing R] [LieRing L] [LieAlgebra R L] [AddCommGroup M] [Module R M]
variable [LieRingModule L M] [LieModule R L M]
+#print LieSubmodule /-
/-- A Lie submodule of a Lie module is a submodule that is closed under the Lie bracket.
This is a sufficient condition for the subset itself to form a Lie module. -/
structure LieSubmodule extends Submodule R M where
lie_mem : ∀ {x : L} {m : M}, m ∈ carrier → ⁅x, m⁆ ∈ carrier
#align lie_submodule LieSubmodule
+-/
attribute [nolint doc_blame] LieSubmodule.toSubmodule
@@ -79,76 +81,103 @@ instance : Zero (LieSubmodule R L M) :=
instance : Inhabited (LieSubmodule R L M) :=
⟨0⟩
+#print LieSubmodule.coeSubmodule /-
instance coeSubmodule : Coe (LieSubmodule R L M) (Submodule R M) :=
⟨toSubmodule⟩
#align lie_submodule.coe_submodule LieSubmodule.coeSubmodule
+-/
@[simp]
theorem toSubmodule_eq_coe : N.toSubmodule = N :=
rfl
#align lie_submodule.to_submodule_eq_coe LieSubmodule.toSubmodule_eq_coe
+#print LieSubmodule.coe_toSubmodule /-
@[norm_cast]
theorem coe_toSubmodule : ((N : Submodule R M) : Set M) = N :=
rfl
#align lie_submodule.coe_to_submodule LieSubmodule.coe_toSubmodule
+-/
+#print LieSubmodule.mem_carrier /-
@[simp]
theorem mem_carrier {x : M} : x ∈ N.carrier ↔ x ∈ (N : Set M) :=
Iff.rfl
#align lie_submodule.mem_carrier LieSubmodule.mem_carrier
+-/
+#print LieSubmodule.mem_mk_iff /-
@[simp]
theorem mem_mk_iff (S : Set M) (h₁ h₂ h₃ h₄) {x : M} :
x ∈ (⟨S, h₁, h₂, h₃, h₄⟩ : LieSubmodule R L M) ↔ x ∈ S :=
Iff.rfl
#align lie_submodule.mem_mk_iff LieSubmodule.mem_mk_iff
+-/
+#print LieSubmodule.mem_coeSubmodule /-
@[simp]
theorem mem_coeSubmodule {x : M} : x ∈ (N : Submodule R M) ↔ x ∈ N :=
Iff.rfl
#align lie_submodule.mem_coe_submodule LieSubmodule.mem_coeSubmodule
+-/
+#print LieSubmodule.mem_coe /-
theorem mem_coe {x : M} : x ∈ (N : Set M) ↔ x ∈ N :=
Iff.rfl
#align lie_submodule.mem_coe LieSubmodule.mem_coe
+-/
+#print LieSubmodule.zero_mem /-
@[simp]
protected theorem zero_mem : (0 : M) ∈ N :=
zero_mem N
#align lie_submodule.zero_mem LieSubmodule.zero_mem
+-/
+#print LieSubmodule.mk_eq_zero /-
@[simp]
theorem mk_eq_zero {x} (h : x ∈ N) : (⟨x, h⟩ : N) = 0 ↔ x = 0 :=
Subtype.ext_iff_val
#align lie_submodule.mk_eq_zero LieSubmodule.mk_eq_zero
+-/
+#print LieSubmodule.coe_toSet_mk /-
@[simp]
theorem coe_toSet_mk (S : Set M) (h₁ h₂ h₃ h₄) :
((⟨S, h₁, h₂, h₃, h₄⟩ : LieSubmodule R L M) : Set M) = S :=
rfl
#align lie_submodule.coe_to_set_mk LieSubmodule.coe_toSet_mk
+-/
+#print LieSubmodule.coe_toSubmodule_mk /-
@[simp]
theorem coe_toSubmodule_mk (p : Submodule R M) (h) :
(({ p with lie_mem := h } : LieSubmodule R L M) : Submodule R M) = p := by cases p; rfl
#align lie_submodule.coe_to_submodule_mk LieSubmodule.coe_toSubmodule_mk
+-/
+#print LieSubmodule.coeSubmodule_injective /-
theorem coeSubmodule_injective :
Function.Injective (toSubmodule : LieSubmodule R L M → Submodule R M) := fun x y h => by
cases x; cases y; congr; injection h
#align lie_submodule.coe_submodule_injective LieSubmodule.coeSubmodule_injective
+-/
+#print LieSubmodule.ext /-
@[ext]
theorem ext (h : ∀ m, m ∈ N ↔ m ∈ N') : N = N' :=
SetLike.ext h
#align lie_submodule.ext LieSubmodule.ext
+-/
+#print LieSubmodule.coe_toSubmodule_eq_iff /-
@[simp]
theorem coe_toSubmodule_eq_iff : (N : Submodule R M) = (N' : Submodule R M) ↔ N = N' :=
coeSubmodule_injective.eq_iff
#align lie_submodule.coe_to_submodule_eq_iff LieSubmodule.coe_toSubmodule_eq_iff
+-/
+#print LieSubmodule.copy /-
/-- Copy of a lie_submodule with a new `carrier` equal to the old one. Useful to fix definitional
equalities. -/
protected def copy (s : Set M) (hs : s = ↑N) : LieSubmodule R L M
@@ -159,15 +188,20 @@ protected def copy (s : Set M) (hs : s = ↑N) : LieSubmodule R L M
smul_mem' := hs.symm ▸ N.smul_mem'
lie_mem _ _ := hs.symm ▸ N.lie_mem
#align lie_submodule.copy LieSubmodule.copy
+-/
+#print LieSubmodule.coe_copy /-
@[simp]
theorem coe_copy (S : LieSubmodule R L M) (s : Set M) (hs : s = ↑S) : (S.copy s hs : Set M) = s :=
rfl
#align lie_submodule.coe_copy LieSubmodule.coe_copy
+-/
+#print LieSubmodule.copy_eq /-
theorem copy_eq (S : LieSubmodule R L M) (s : Set M) (hs : s = ↑S) : S.copy s hs = S :=
SetLike.coe_injective hs
#align lie_submodule.copy_eq LieSubmodule.copy_eq
+-/
instance : LieRingModule L N
where
@@ -176,10 +210,12 @@ instance : LieRingModule L N
lie_add := by intro x m n; apply SetCoe.ext; apply lie_add
leibniz_lie := by intro x y m; apply SetCoe.ext; apply leibniz_lie
+#print LieSubmodule.module' /-
instance module' {S : Type _} [Semiring S] [SMul S R] [Module S M] [IsScalarTower S R M] :
Module S N :=
N.toSubmodule.module'
#align lie_submodule.module' LieSubmodule.module'
+-/
instance : Module R N :=
N.toSubmodule.Module
@@ -193,35 +229,47 @@ instance : LieModule R L N
lie_smul := by intro t x y; apply SetCoe.ext; apply lie_smul
smul_lie := by intro t x y; apply SetCoe.ext; apply smul_lie
+#print LieSubmodule.coe_zero /-
@[simp, norm_cast]
theorem coe_zero : ((0 : N) : M) = (0 : M) :=
rfl
#align lie_submodule.coe_zero LieSubmodule.coe_zero
+-/
+#print LieSubmodule.coe_add /-
@[simp, norm_cast]
theorem coe_add (m m' : N) : (↑(m + m') : M) = (m : M) + (m' : M) :=
rfl
#align lie_submodule.coe_add LieSubmodule.coe_add
+-/
+#print LieSubmodule.coe_neg /-
@[simp, norm_cast]
theorem coe_neg (m : N) : (↑(-m) : M) = -(m : M) :=
rfl
#align lie_submodule.coe_neg LieSubmodule.coe_neg
+-/
+#print LieSubmodule.coe_sub /-
@[simp, norm_cast]
theorem coe_sub (m m' : N) : (↑(m - m') : M) = (m : M) - (m' : M) :=
rfl
#align lie_submodule.coe_sub LieSubmodule.coe_sub
+-/
+#print LieSubmodule.coe_smul /-
@[simp, norm_cast]
theorem coe_smul (t : R) (m : N) : (↑(t • m) : M) = t • (m : M) :=
rfl
#align lie_submodule.coe_smul LieSubmodule.coe_smul
+-/
+#print LieSubmodule.coe_bracket /-
@[simp, norm_cast]
theorem coe_bracket (x : L) (m : N) : (↑⁅x, m⁆ : M) = ⁅x, ↑m⁆ :=
rfl
#align lie_submodule.coe_bracket LieSubmodule.coe_bracket
+-/
end LieSubmodule
@@ -295,11 +343,13 @@ instance LieIdeal.lieRingModule {R L : Type _} [CommRing R] [LieRing L] [LieAlge
#align lie_ideal.lie_ring_module LieIdeal.lieRingModule
-/
+#print LieIdeal.coe_bracket_of_module /-
@[simp]
theorem LieIdeal.coe_bracket_of_module {R L : Type _} [CommRing R] [LieRing L] [LieAlgebra R L]
(I : LieIdeal R L) [LieRingModule L M] (x : I) (m : M) : ⁅x, m⁆ = ⁅(↑x : L), m⁆ :=
LieSubalgebra.coe_bracket_of_module (I : LieSubalgebra R L) x m
#align lie_ideal.coe_bracket_of_module LieIdeal.coe_bracket_of_module
+-/
#print LieIdeal.lieModule /-
/-- Transfer the `lie_module` instance from the coercion `lie_ideal → lie_subalgebra`. -/
@@ -312,6 +362,7 @@ end LieIdeal
variable {R M}
+#print Submodule.exists_lieSubmodule_coe_eq_iff /-
theorem Submodule.exists_lieSubmodule_coe_eq_iff (p : Submodule R M) :
(∃ N : LieSubmodule R L M, ↑N = p) ↔ ∀ (x : L) (m : M), m ∈ p → ⁅x, m⁆ ∈ p :=
by
@@ -319,6 +370,7 @@ theorem Submodule.exists_lieSubmodule_coe_eq_iff (p : Submodule R M) :
· rintro ⟨N, rfl⟩ _ _; exact N.lie_mem
· intro h; use { p with lie_mem := h }; exact LieSubmodule.coe_toSubmodule_mk p _
#align submodule.exists_lie_submodule_coe_eq_iff Submodule.exists_lieSubmodule_coe_eq_iff
+-/
namespace LieSubalgebra
@@ -356,6 +408,7 @@ theorem exists_lieIdeal_coe_eq_iff : (∃ I : LieIdeal R L, ↑I = K) ↔ ∀ x
#align lie_subalgebra.exists_lie_ideal_coe_eq_iff LieSubalgebra.exists_lieIdeal_coe_eq_iff
-/
+#print LieSubalgebra.exists_nested_lieIdeal_coe_eq_iff /-
theorem exists_nested_lieIdeal_coe_eq_iff {K' : LieSubalgebra R L} (h : K ≤ K') :
(∃ I : LieIdeal R K', ↑I = ofLe h) ↔ ∀ x y : L, x ∈ K' → y ∈ K → ⁅x, y⁆ ∈ K :=
by
@@ -364,6 +417,7 @@ theorem exists_nested_lieIdeal_coe_eq_iff {K' : LieSubalgebra R L} (h : K ≤ K'
· intro h' x y hx hy; exact h' ⟨x, hx⟩ ⟨y, h hy⟩ hy
· rintro h' ⟨x, hx⟩ ⟨y, hy⟩ hy'; exact h' x y hx hy'
#align lie_subalgebra.exists_nested_lie_ideal_coe_eq_iff LieSubalgebra.exists_nested_lieIdeal_coe_eq_iff
+-/
end LieSubalgebra
@@ -383,50 +437,66 @@ section LatticeStructure
open Set
+#print LieSubmodule.coe_injective /-
theorem coe_injective : Function.Injective (coe : LieSubmodule R L M → Set M) :=
SetLike.coe_injective
#align lie_submodule.coe_injective LieSubmodule.coe_injective
+-/
+#print LieSubmodule.coeSubmodule_le_coeSubmodule /-
@[simp, norm_cast]
theorem coeSubmodule_le_coeSubmodule : (N : Submodule R M) ≤ N' ↔ N ≤ N' :=
Iff.rfl
#align lie_submodule.coe_submodule_le_coe_submodule LieSubmodule.coeSubmodule_le_coeSubmodule
+-/
instance : Bot (LieSubmodule R L M) :=
⟨0⟩
+#print LieSubmodule.bot_coe /-
@[simp]
theorem bot_coe : ((⊥ : LieSubmodule R L M) : Set M) = {0} :=
rfl
#align lie_submodule.bot_coe LieSubmodule.bot_coe
+-/
+#print LieSubmodule.bot_coeSubmodule /-
@[simp]
theorem bot_coeSubmodule : ((⊥ : LieSubmodule R L M) : Submodule R M) = ⊥ :=
rfl
#align lie_submodule.bot_coe_submodule LieSubmodule.bot_coeSubmodule
+-/
+#print LieSubmodule.mem_bot /-
@[simp]
theorem mem_bot (x : M) : x ∈ (⊥ : LieSubmodule R L M) ↔ x = 0 :=
mem_singleton_iff
#align lie_submodule.mem_bot LieSubmodule.mem_bot
+-/
instance : Top (LieSubmodule R L M) :=
⟨{ (⊤ : Submodule R M) with lie_mem := fun x m h => mem_univ ⁅x, m⁆ }⟩
+#print LieSubmodule.top_coe /-
@[simp]
theorem top_coe : ((⊤ : LieSubmodule R L M) : Set M) = univ :=
rfl
#align lie_submodule.top_coe LieSubmodule.top_coe
+-/
+#print LieSubmodule.top_coeSubmodule /-
@[simp]
theorem top_coeSubmodule : ((⊤ : LieSubmodule R L M) : Submodule R M) = ⊤ :=
rfl
#align lie_submodule.top_coe_submodule LieSubmodule.top_coeSubmodule
+-/
+#print LieSubmodule.mem_top /-
@[simp]
theorem mem_top (x : M) : x ∈ (⊤ : LieSubmodule R L M) :=
mem_univ x
#align lie_submodule.mem_top LieSubmodule.mem_top
+-/
instance : Inf (LieSubmodule R L M) :=
⟨fun N N' =>
@@ -445,12 +515,15 @@ instance : InfSet (LieSubmodule R L M) :=
forall_apply_eq_imp_iff₂, exists_imp] at *
intro N hN; apply N.lie_mem (h N hN) }⟩
+#print LieSubmodule.inf_coe /-
@[simp]
theorem inf_coe : (↑(N ⊓ N') : Set M) = N ∩ N' :=
rfl
#align lie_submodule.inf_coe LieSubmodule.inf_coe
+-/
/- ./././Mathport/Syntax/Translate/Expr.lean:372:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
+#print LieSubmodule.sInf_coe_toSubmodule /-
@[simp]
theorem sInf_coe_toSubmodule (S : Set (LieSubmodule R L M)) :
(↑(sInf S) : Submodule R M) =
@@ -458,7 +531,9 @@ theorem sInf_coe_toSubmodule (S : Set (LieSubmodule R L M)) :
"./././Mathport/Syntax/Translate/Expr.lean:372:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" :=
rfl
#align lie_submodule.Inf_coe_to_submodule LieSubmodule.sInf_coe_toSubmodule
+-/
+#print LieSubmodule.sInf_coe /-
@[simp]
theorem sInf_coe (S : Set (LieSubmodule R L M)) : (↑(sInf S) : Set M) = ⋂ s ∈ S, (s : Set M) :=
by
@@ -466,7 +541,9 @@ theorem sInf_coe (S : Set (LieSubmodule R L M)) : (↑(sInf S) : Set M) = ⋂ s
ext m
simpa only [mem_Inter, mem_set_of_eq, forall_apply_eq_imp_iff₂, exists_imp]
#align lie_submodule.Inf_coe LieSubmodule.sInf_coe
+-/
+#print LieSubmodule.sInf_glb /-
theorem sInf_glb (S : Set (LieSubmodule R L M)) : IsGLB S (sInf S) :=
by
have h : ∀ N N' : LieSubmodule R L M, (N : Set M) ≤ N' ↔ N ≤ N' := by intros; rfl
@@ -474,6 +551,7 @@ theorem sInf_glb (S : Set (LieSubmodule R L M)) : IsGLB S (sInf S) :=
simp only [Inf_coe]
exact isGLB_biInf
#align lie_submodule.Inf_glb LieSubmodule.sInf_glb
+-/
/-- The set of Lie submodules of a Lie module form a complete lattice.
@@ -502,11 +580,14 @@ instance : AddCommMonoid (LieSubmodule R L M)
add_zero _ := sup_bot_eq
add_comm _ _ := sup_comm
+#print LieSubmodule.add_eq_sup /-
@[simp]
theorem add_eq_sup : N + N' = N ⊔ N' :=
rfl
#align lie_submodule.add_eq_sup LieSubmodule.add_eq_sup
+-/
+#print LieSubmodule.sup_coe_toSubmodule /-
@[norm_cast, simp]
theorem sup_coe_toSubmodule :
(↑(N ⊔ N') : Submodule R M) = (N : Submodule R M) ⊔ (N' : Submodule R M) :=
@@ -522,32 +603,43 @@ theorem sup_coe_toSubmodule :
coe_submodule_le_coe_submodule, and_self_iff, le_sup_left, le_sup_right]
· simp
#align lie_submodule.sup_coe_to_submodule LieSubmodule.sup_coe_toSubmodule
+-/
+#print LieSubmodule.inf_coe_toSubmodule /-
@[norm_cast, simp]
theorem inf_coe_toSubmodule :
(↑(N ⊓ N') : Submodule R M) = (N : Submodule R M) ⊓ (N' : Submodule R M) :=
rfl
#align lie_submodule.inf_coe_to_submodule LieSubmodule.inf_coe_toSubmodule
+-/
+#print LieSubmodule.mem_inf /-
@[simp]
theorem mem_inf (x : M) : x ∈ N ⊓ N' ↔ x ∈ N ∧ x ∈ N' := by
rw [← mem_coe_submodule, ← mem_coe_submodule, ← mem_coe_submodule, inf_coe_to_submodule,
Submodule.mem_inf]
#align lie_submodule.mem_inf LieSubmodule.mem_inf
+-/
+#print LieSubmodule.mem_sup /-
theorem mem_sup (x : M) : x ∈ N ⊔ N' ↔ ∃ y ∈ N, ∃ z ∈ N', y + z = x := by
rw [← mem_coe_submodule, sup_coe_to_submodule, Submodule.mem_sup]; exact Iff.rfl
#align lie_submodule.mem_sup LieSubmodule.mem_sup
+-/
+#print LieSubmodule.eq_bot_iff /-
theorem eq_bot_iff : N = ⊥ ↔ ∀ m : M, m ∈ N → m = 0 := by rw [eq_bot_iff]; exact Iff.rfl
#align lie_submodule.eq_bot_iff LieSubmodule.eq_bot_iff
+-/
+#print LieSubmodule.subsingleton_of_bot /-
instance subsingleton_of_bot : Subsingleton (LieSubmodule R L ↥(⊥ : LieSubmodule R L M)) :=
by
apply subsingleton_of_bot_eq_top
ext ⟨x, hx⟩; change x ∈ ⊥ at hx ; rw [LieSubmodule.mem_bot] at hx ; subst hx
simp only [true_iff_iff, eq_self_iff_true, Submodule.mk_eq_zero, LieSubmodule.mem_bot]
#align lie_submodule.subsingleton_of_bot LieSubmodule.subsingleton_of_bot
+-/
instance : IsModularLattice (LieSubmodule R L M)
where sup_inf_le_assoc_of_le N₁ N₂ N₃ :=
@@ -557,6 +649,7 @@ instance : IsModularLattice (LieSubmodule R L M)
variable (R L M)
+#print LieSubmodule.wellFounded_of_noetherian /-
theorem wellFounded_of_noetherian [IsNoetherian R M] :
WellFounded ((· > ·) : LieSubmodule R L M → LieSubmodule R L M → Prop) :=
let f :
@@ -566,7 +659,9 @@ theorem wellFounded_of_noetherian [IsNoetherian R M] :
map_rel' := fun N N' h => h }
RelHomClass.wellFounded f (isNoetherian_iff_wellFounded.mp inferInstance)
#align lie_submodule.well_founded_of_noetherian LieSubmodule.wellFounded_of_noetherian
+-/
+#print LieSubmodule.subsingleton_iff /-
@[simp]
theorem subsingleton_iff : Subsingleton (LieSubmodule R L M) ↔ Subsingleton M :=
have h : Subsingleton (LieSubmodule R L M) ↔ Subsingleton (Submodule R M) := by
@@ -574,17 +669,21 @@ theorem subsingleton_iff : Subsingleton (LieSubmodule R L M) ↔ Subsingleton M
top_coe_submodule, bot_coe_submodule]
h.trans <| Submodule.subsingleton_iff R
#align lie_submodule.subsingleton_iff LieSubmodule.subsingleton_iff
+-/
+#print LieSubmodule.nontrivial_iff /-
@[simp]
theorem nontrivial_iff : Nontrivial (LieSubmodule R L M) ↔ Nontrivial M :=
not_iff_not.mp
((not_nontrivial_iff_subsingleton.trans <| subsingleton_iff R L M).trans
not_nontrivial_iff_subsingleton.symm)
#align lie_submodule.nontrivial_iff LieSubmodule.nontrivial_iff
+-/
instance [Nontrivial M] : Nontrivial (LieSubmodule R L M) :=
(nontrivial_iff R L M).mpr ‹_›
+#print LieSubmodule.nontrivial_iff_ne_bot /-
theorem nontrivial_iff_ne_bot {N : LieSubmodule R L M} : Nontrivial N ↔ N ≠ ⊥ :=
by
constructor <;> contrapose!
@@ -595,49 +694,66 @@ theorem nontrivial_iff_ne_bot {N : LieSubmodule R L M} : Nontrivial N ↔ N ≠
rintro ⟨h⟩ m hm
simpa using h ⟨m, hm⟩ ⟨_, N.zero_mem⟩
#align lie_submodule.nontrivial_iff_ne_bot LieSubmodule.nontrivial_iff_ne_bot
+-/
variable {R L M}
section InclusionMaps
+#print LieSubmodule.incl /-
/-- The inclusion of a Lie submodule into its ambient space is a morphism of Lie modules. -/
def incl : N →ₗ⁅R,L⁆ M :=
{ Submodule.subtype (N : Submodule R M) with map_lie' := fun x m => rfl }
#align lie_submodule.incl LieSubmodule.incl
+-/
+#print LieSubmodule.incl_coe /-
@[simp]
theorem incl_coe : (N.incl : N →ₗ[R] M) = (N : Submodule R M).Subtype :=
rfl
#align lie_submodule.incl_coe LieSubmodule.incl_coe
+-/
+#print LieSubmodule.incl_apply /-
@[simp]
theorem incl_apply (m : N) : N.incl m = m :=
rfl
#align lie_submodule.incl_apply LieSubmodule.incl_apply
+-/
+#print LieSubmodule.incl_eq_val /-
theorem incl_eq_val : (N.incl : N → M) = Subtype.val :=
rfl
#align lie_submodule.incl_eq_val LieSubmodule.incl_eq_val
+-/
variable {N N'} (h : N ≤ N')
+#print LieSubmodule.homOfLe /-
/-- Given two nested Lie submodules `N ⊆ N'`, the inclusion `N ↪ N'` is a morphism of Lie modules.-/
def homOfLe : N →ₗ⁅R,L⁆ N' :=
{ Submodule.ofLe (show N.toSubmodule ≤ N'.toSubmodule from h) with map_lie' := fun x m => rfl }
#align lie_submodule.hom_of_le LieSubmodule.homOfLe
+-/
+#print LieSubmodule.coe_homOfLe /-
@[simp]
theorem coe_homOfLe (m : N) : (homOfLe h m : M) = m :=
rfl
#align lie_submodule.coe_hom_of_le LieSubmodule.coe_homOfLe
+-/
+#print LieSubmodule.homOfLe_apply /-
theorem homOfLe_apply (m : N) : homOfLe h m = ⟨m.1, h m.2⟩ :=
rfl
#align lie_submodule.hom_of_le_apply LieSubmodule.homOfLe_apply
+-/
+#print LieSubmodule.homOfLe_injective /-
theorem homOfLe_injective : Function.Injective (homOfLe h) := fun x y => by
simp only [hom_of_le_apply, imp_self, Subtype.mk_eq_mk, SetLike.coe_eq_coe, Subtype.val_eq_coe]
#align lie_submodule.hom_of_le_injective LieSubmodule.homOfLe_injective
+-/
end InclusionMaps
@@ -645,40 +761,55 @@ section LieSpan
variable (R L) (s : Set M)
+#print LieSubmodule.lieSpan /-
/-- The `lie_span` of a set `s ⊆ M` is the smallest Lie submodule of `M` that contains `s`. -/
def lieSpan : LieSubmodule R L M :=
sInf {N | s ⊆ N}
#align lie_submodule.lie_span LieSubmodule.lieSpan
+-/
variable {R L s}
+#print LieSubmodule.mem_lieSpan /-
theorem mem_lieSpan {x : M} : x ∈ lieSpan R L s ↔ ∀ N : LieSubmodule R L M, s ⊆ N → x ∈ N := by
change x ∈ (lie_span R L s : Set M) ↔ _; erw [Inf_coe]; exact mem_Inter₂
#align lie_submodule.mem_lie_span LieSubmodule.mem_lieSpan
+-/
+#print LieSubmodule.subset_lieSpan /-
theorem subset_lieSpan : s ⊆ lieSpan R L s := by intro m hm; erw [mem_lie_span]; intro N hN;
exact hN hm
#align lie_submodule.subset_lie_span LieSubmodule.subset_lieSpan
+-/
+#print LieSubmodule.submodule_span_le_lieSpan /-
theorem submodule_span_le_lieSpan : Submodule.span R s ≤ lieSpan R L s := by rw [Submodule.span_le];
apply subset_lie_span
#align lie_submodule.submodule_span_le_lie_span LieSubmodule.submodule_span_le_lieSpan
+-/
+#print LieSubmodule.lieSpan_le /-
theorem lieSpan_le {N} : lieSpan R L s ≤ N ↔ s ⊆ N :=
by
constructor
· exact subset.trans subset_lie_span
· intro hs m hm; rw [mem_lie_span] at hm ; exact hm _ hs
#align lie_submodule.lie_span_le LieSubmodule.lieSpan_le
+-/
+#print LieSubmodule.lieSpan_mono /-
theorem lieSpan_mono {t : Set M} (h : s ⊆ t) : lieSpan R L s ≤ lieSpan R L t := by rw [lie_span_le];
exact subset.trans h subset_lie_span
#align lie_submodule.lie_span_mono LieSubmodule.lieSpan_mono
+-/
+#print LieSubmodule.lieSpan_eq /-
theorem lieSpan_eq : lieSpan R L (N : Set M) = N :=
le_antisymm (lieSpan_le.mpr rfl.Subset) subset_lieSpan
#align lie_submodule.lie_span_eq LieSubmodule.lieSpan_eq
+-/
+#print LieSubmodule.coe_lieSpan_submodule_eq_iff /-
theorem coe_lieSpan_submodule_eq_iff {p : Submodule R M} :
(lieSpan R L (p : Set M) : Submodule R M) = p ↔ ∃ N : LieSubmodule R L M, ↑N = p :=
by
@@ -686,9 +817,11 @@ theorem coe_lieSpan_submodule_eq_iff {p : Submodule R M} :
· intro x m hm; rw [← h, mem_coe_submodule]; exact lie_mem _ (subset_lie_span hm)
· rw [← coe_to_submodule_mk p h, coe_to_submodule, coe_to_submodule_eq_iff, lie_span_eq]
#align lie_submodule.coe_lie_span_submodule_eq_iff LieSubmodule.coe_lieSpan_submodule_eq_iff
+-/
variable (R L M)
+#print LieSubmodule.gi /-
/-- `lie_span` forms a Galois insertion with the coercion from `lie_submodule` to `set`. -/
protected def gi : GaloisInsertion (lieSpan R L : Set M → LieSubmodule R L M) coe
where
@@ -697,30 +830,41 @@ protected def gi : GaloisInsertion (lieSpan R L : Set M → LieSubmodule R L M)
le_l_u s := subset_lieSpan
choice_eq s h := rfl
#align lie_submodule.gi LieSubmodule.gi
+-/
+#print LieSubmodule.span_empty /-
@[simp]
theorem span_empty : lieSpan R L (∅ : Set M) = ⊥ :=
(LieSubmodule.gi R L M).gc.l_bot
#align lie_submodule.span_empty LieSubmodule.span_empty
+-/
+#print LieSubmodule.span_univ /-
@[simp]
theorem span_univ : lieSpan R L (Set.univ : Set M) = ⊤ :=
eq_top_iff.2 <| SetLike.le_def.2 <| subset_lieSpan
#align lie_submodule.span_univ LieSubmodule.span_univ
+-/
+#print LieSubmodule.lieSpan_eq_bot_iff /-
theorem lieSpan_eq_bot_iff : lieSpan R L s = ⊥ ↔ ∀ m ∈ s, m = (0 : M) := by
rw [_root_.eq_bot_iff, lie_span_le, bot_coe, subset_singleton_iff]
#align lie_submodule.lie_span_eq_bot_iff LieSubmodule.lieSpan_eq_bot_iff
+-/
variable {M}
+#print LieSubmodule.span_union /-
theorem span_union (s t : Set M) : lieSpan R L (s ∪ t) = lieSpan R L s ⊔ lieSpan R L t :=
(LieSubmodule.gi R L M).gc.l_sup
#align lie_submodule.span_union LieSubmodule.span_union
+-/
+#print LieSubmodule.span_iUnion /-
theorem span_iUnion {ι} (s : ι → Set M) : lieSpan R L (⋃ i, s i) = ⨆ i, lieSpan R L (s i) :=
(LieSubmodule.gi R L M).gc.l_iSup
#align lie_submodule.span_Union LieSubmodule.span_iUnion
+-/
end LieSpan
@@ -742,6 +886,7 @@ namespace LieSubmodule
variable (f : M →ₗ⁅R,L⁆ M') (N N₂ : LieSubmodule R L M) (N' : LieSubmodule R L M')
+#print LieSubmodule.map /-
/-- A morphism of Lie modules `f : M → M'` pushes forward Lie submodules of `M` to Lie submodules
of `M'`. -/
def map : LieSubmodule R L M' :=
@@ -751,62 +896,83 @@ def map : LieSubmodule R L M' :=
· apply N.lie_mem hm
· norm_cast at hfm ; simp [hfm] }
#align lie_submodule.map LieSubmodule.map
+-/
+#print LieSubmodule.coeSubmodule_map /-
@[simp]
theorem coeSubmodule_map : (N.map f : Submodule R M') = (N : Submodule R M).map (f : M →ₗ[R] M') :=
rfl
#align lie_submodule.coe_submodule_map LieSubmodule.coeSubmodule_map
+-/
+#print LieSubmodule.comap /-
/-- A morphism of Lie modules `f : M → M'` pulls back Lie submodules of `M'` to Lie submodules of
`M`. -/
def comap : LieSubmodule R L M :=
{ (N' : Submodule R M').comap (f : M →ₗ[R] M') with
lie_mem := fun x m h => by suffices ⁅x, f m⁆ ∈ N' by simp [this]; apply N'.lie_mem h }
#align lie_submodule.comap LieSubmodule.comap
+-/
+#print LieSubmodule.coeSubmodule_comap /-
@[simp]
theorem coeSubmodule_comap :
(N'.comap f : Submodule R M) = (N' : Submodule R M').comap (f : M →ₗ[R] M') :=
rfl
#align lie_submodule.coe_submodule_comap LieSubmodule.coeSubmodule_comap
+-/
variable {f N N₂ N'}
+#print LieSubmodule.map_le_iff_le_comap /-
theorem map_le_iff_le_comap : map f N ≤ N' ↔ N ≤ comap f N' :=
Set.image_subset_iff
#align lie_submodule.map_le_iff_le_comap LieSubmodule.map_le_iff_le_comap
+-/
variable (f)
+#print LieSubmodule.gc_map_comap /-
theorem gc_map_comap : GaloisConnection (map f) (comap f) := fun N N' => map_le_iff_le_comap
#align lie_submodule.gc_map_comap LieSubmodule.gc_map_comap
+-/
variable {f}
+#print LieSubmodule.map_sup /-
@[simp]
theorem map_sup : (N ⊔ N₂).map f = N.map f ⊔ N₂.map f :=
(gc_map_comap f).l_sup
#align lie_submodule.map_sup LieSubmodule.map_sup
+-/
+#print LieSubmodule.mem_map /-
theorem mem_map (m' : M') : m' ∈ N.map f ↔ ∃ m, m ∈ N ∧ f m = m' :=
Submodule.mem_map
#align lie_submodule.mem_map LieSubmodule.mem_map
+-/
+#print LieSubmodule.mem_comap /-
@[simp]
theorem mem_comap {m : M} : m ∈ comap f N' ↔ f m ∈ N' :=
Iff.rfl
#align lie_submodule.mem_comap LieSubmodule.mem_comap
+-/
+#print LieSubmodule.comap_incl_eq_top /-
theorem comap_incl_eq_top : N₂.comap N.incl = ⊤ ↔ N ≤ N₂ := by
simpa only [← LieSubmodule.coe_toSubmodule_eq_iff, LieSubmodule.coeSubmodule_comap,
LieSubmodule.incl_coe, LieSubmodule.top_coeSubmodule, Submodule.comap_subtype_eq_top]
#align lie_submodule.comap_incl_eq_top LieSubmodule.comap_incl_eq_top
+-/
+#print LieSubmodule.comap_incl_eq_bot /-
theorem comap_incl_eq_bot : N₂.comap N.incl = ⊥ ↔ N ⊓ N₂ = ⊥ := by
simpa only [_root_.eq_bot_iff, ← LieSubmodule.coe_toSubmodule_eq_iff,
LieSubmodule.coeSubmodule_comap, LieSubmodule.incl_coe, LieSubmodule.bot_coeSubmodule, ←
Submodule.disjoint_iff_comap_eq_bot, disjoint_iff]
#align lie_submodule.comap_incl_eq_bot LieSubmodule.comap_incl_eq_bot
+-/
end LieSubmodule
@@ -859,9 +1025,11 @@ theorem comap_coeSubmodule :
#align lie_ideal.comap_coe_submodule LieIdeal.comap_coeSubmodule
-/
+#print LieIdeal.map_le /-
theorem map_le : map f I ≤ J ↔ f '' I ⊆ J :=
LieSubmodule.lieSpan_le
#align lie_ideal.map_le LieIdeal.map_le
+-/
variable {f I I₂ J}
@@ -878,9 +1046,11 @@ theorem mem_comap {x : L} : x ∈ comap f J ↔ f x ∈ J :=
#align lie_ideal.mem_comap LieIdeal.mem_comap
-/
+#print LieIdeal.map_le_iff_le_comap /-
theorem map_le_iff_le_comap : map f I ≤ J ↔ I ≤ comap f J := by rw [map_le];
exact Set.image_subset_iff
#align lie_ideal.map_le_iff_le_comap LieIdeal.map_le_iff_le_comap
+-/
variable (f)
@@ -898,12 +1068,16 @@ theorem map_sup : (I ⊔ I₂).map f = I.map f ⊔ I₂.map f :=
#align lie_ideal.map_sup LieIdeal.map_sup
-/
+#print LieIdeal.map_comap_le /-
theorem map_comap_le : map f (comap f J) ≤ J := by rw [map_le_iff_le_comap]; exact le_rfl
#align lie_ideal.map_comap_le LieIdeal.map_comap_le
+-/
+#print LieIdeal.comap_map_le /-
/-- See also `lie_ideal.map_comap_eq`. -/
theorem comap_map_le : I ≤ comap f (map f I) := by rw [← map_le_iff_le_comap]; exact le_rfl
#align lie_ideal.comap_map_le LieIdeal.comap_map_le
+-/
#print LieIdeal.map_mono /-
@[mono]
@@ -989,6 +1163,7 @@ theorem isIdealMorphism_def : f.IsIdealMorphism ↔ (f.idealRange : LieSubalgebr
#align lie_hom.is_ideal_morphism_def LieHom.isIdealMorphism_def
-/
+#print LieHom.isIdealMorphism_iff /-
theorem isIdealMorphism_iff : f.IsIdealMorphism ↔ ∀ (x : L') (y : L), ∃ z : L, ⁅x, f y⁆ = f z :=
by
simp only [is_ideal_morphism_def, ideal_range_eq_lie_span_range, ←
@@ -1000,6 +1175,7 @@ theorem isIdealMorphism_iff : f.IsIdealMorphism ↔ ∀ (x : L') (y : L), ∃ z
· intro h x y; obtain ⟨z, hz⟩ := h x (f y) y rfl; use z; exact hz.symm
· intro h x y z hz; obtain ⟨w, hw⟩ := h x z; use w; rw [← hw, hz]
#align lie_hom.is_ideal_morphism_iff LieHom.isIdealMorphism_iff
+-/
#print LieHom.range_subset_idealRange /-
theorem range_subset_idealRange : (f.range : Set L') ⊆ f.idealRange :=
@@ -1007,15 +1183,19 @@ theorem range_subset_idealRange : (f.range : Set L') ⊆ f.idealRange :=
#align lie_hom.range_subset_ideal_range LieHom.range_subset_idealRange
-/
+#print LieHom.map_le_idealRange /-
theorem map_le_idealRange : I.map f ≤ f.idealRange :=
by
rw [f.ideal_range_eq_map]
exact LieIdeal.map_mono le_top
#align lie_hom.map_le_ideal_range LieHom.map_le_idealRange
+-/
+#print LieHom.ker_le_comap /-
theorem ker_le_comap : f.ker ≤ J.comap f :=
LieIdeal.comap_mono bot_le
#align lie_hom.ker_le_comap LieHom.ker_le_comap
+-/
#print LieHom.ker_coeSubmodule /-
@[simp]
@@ -1049,12 +1229,14 @@ theorem mem_idealRange_iff (h : IsIdealMorphism f) {y : L'} : y ∈ idealRange f
#align lie_hom.mem_ideal_range_iff LieHom.mem_idealRange_iff
-/
+#print LieHom.le_ker_iff /-
theorem le_ker_iff : I ≤ f.ker ↔ ∀ x, x ∈ I → f x = 0 :=
by
constructor <;> intro h x hx
· specialize h hx; rw [mem_ker] at h ; exact h
· rw [mem_ker]; apply h x hx
#align lie_hom.le_ker_iff LieHom.le_ker_iff
+-/
#print LieHom.ker_eq_bot /-
theorem ker_eq_bot : f.ker = ⊥ ↔ Function.Injective f := by
@@ -1070,12 +1252,15 @@ theorem range_coeSubmodule : (f.range : Submodule R L') = (f : L →ₗ[R] L').r
#align lie_hom.range_coe_submodule LieHom.range_coeSubmodule
-/
+#print LieHom.range_eq_top /-
theorem range_eq_top : f.range = ⊤ ↔ Function.Surjective f :=
by
rw [← LieSubalgebra.coe_to_submodule_eq_iff, range_coe_submodule, LieSubalgebra.top_coe_submodule]
exact LinearMap.range_eq_top
#align lie_hom.range_eq_top LieHom.range_eq_top
+-/
+#print LieHom.idealRange_eq_top_of_surjective /-
@[simp]
theorem idealRange_eq_top_of_surjective (h : Function.Surjective f) : f.idealRange = ⊤ :=
by
@@ -1086,11 +1271,14 @@ theorem idealRange_eq_top_of_surjective (h : Function.Surjective f) : f.idealRan
use ⊤
exact LieSubmodule.top_coeSubmodule
#align lie_hom.ideal_range_eq_top_of_surjective LieHom.idealRange_eq_top_of_surjective
+-/
+#print LieHom.isIdealMorphism_of_surjective /-
theorem isIdealMorphism_of_surjective (h : Function.Surjective f) : f.IsIdealMorphism := by
rw [is_ideal_morphism_def, f.ideal_range_eq_top_of_surjective h, f.range_eq_top.mpr h,
LieIdeal.top_coe_lieSubalgebra]
#align lie_hom.is_ideal_morphism_of_surjective LieHom.isIdealMorphism_of_surjective
+-/
end LieHom
@@ -1105,6 +1293,7 @@ theorem map_eq_bot_iff : I.map f = ⊥ ↔ I ≤ f.ker := by rw [← le_bot_iff]
#align lie_ideal.map_eq_bot_iff LieIdeal.map_eq_bot_iff
-/
+#print LieIdeal.coe_map_of_surjective /-
theorem coe_map_of_surjective (h : Function.Surjective f) :
(I.map f : Submodule R L') = (I : Submodule R L).map (f : L →ₗ[R] L') :=
by
@@ -1123,7 +1312,9 @@ theorem coe_map_of_surjective (h : Function.Surjective f) :
use J
apply LieSubmodule.coe_toSubmodule_mk
#align lie_ideal.coe_map_of_surjective LieIdeal.coe_map_of_surjective
+-/
+#print LieIdeal.mem_map_of_surjective /-
theorem mem_map_of_surjective {y : L'} (h₁ : Function.Surjective f) (h₂ : y ∈ I.map f) :
∃ x : I, f x = y :=
by
@@ -1132,32 +1323,43 @@ theorem mem_map_of_surjective {y : L'} (h₁ : Function.Surjective f) (h₂ : y
use ⟨x, hx⟩
rfl
#align lie_ideal.mem_map_of_surjective LieIdeal.mem_map_of_surjective
+-/
+#print LieIdeal.bot_of_map_eq_bot /-
theorem bot_of_map_eq_bot {I : LieIdeal R L} (h₁ : Function.Injective f) (h₂ : I.map f = ⊥) :
I = ⊥ := by
rw [← f.ker_eq_bot] at h₁ ; change comap f ⊥ = ⊥ at h₁
rw [eq_bot_iff, map_le_iff_le_comap, h₁] at h₂
rw [eq_bot_iff]; exact h₂
#align lie_ideal.bot_of_map_eq_bot LieIdeal.bot_of_map_eq_bot
+-/
+#print LieIdeal.homOfLe /-
/-- Given two nested Lie ideals `I₁ ⊆ I₂`, the inclusion `I₁ ↪ I₂` is a morphism of Lie algebras. -/
def homOfLe {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) : I₁ →ₗ⁅R⁆ I₂ :=
{ Submodule.ofLe (show I₁.toSubmodule ≤ I₂.toSubmodule from h) with map_lie' := fun x y => rfl }
#align lie_ideal.hom_of_le LieIdeal.homOfLe
+-/
+#print LieIdeal.coe_homOfLe /-
@[simp]
theorem coe_homOfLe {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) (x : I₁) : (homOfLe h x : L) = x :=
rfl
#align lie_ideal.coe_hom_of_le LieIdeal.coe_homOfLe
+-/
+#print LieIdeal.homOfLe_apply /-
theorem homOfLe_apply {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) (x : I₁) : homOfLe h x = ⟨x.1, h x.2⟩ :=
rfl
#align lie_ideal.hom_of_le_apply LieIdeal.homOfLe_apply
+-/
+#print LieIdeal.homOfLe_injective /-
theorem homOfLe_injective {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) : Function.Injective (homOfLe h) :=
fun x y => by
simp only [hom_of_le_apply, imp_self, Subtype.mk_eq_mk, SetLike.coe_eq_coe, Subtype.val_eq_coe]
#align lie_ideal.hom_of_le_injective LieIdeal.homOfLe_injective
+-/
#print LieIdeal.map_sup_ker_eq_map /-
@[simp]
@@ -1274,66 +1476,90 @@ variable [AddCommGroup N] [Module R N] [LieRingModule L N] [LieModule R L N]
variable (f : M →ₗ⁅R,L⁆ N)
+#print LieModuleHom.ker /-
/-- The kernel of a morphism of Lie algebras, as an ideal in the domain. -/
def ker : LieSubmodule R L M :=
LieSubmodule.comap f ⊥
#align lie_module_hom.ker LieModuleHom.ker
+-/
+#print LieModuleHom.ker_coeSubmodule /-
@[simp]
theorem ker_coeSubmodule : (f.ker : Submodule R M) = (f : M →ₗ[R] N).ker :=
rfl
#align lie_module_hom.ker_coe_submodule LieModuleHom.ker_coeSubmodule
+-/
+#print LieModuleHom.ker_eq_bot /-
theorem ker_eq_bot : f.ker = ⊥ ↔ Function.Injective f := by
rw [← LieSubmodule.coe_toSubmodule_eq_iff, ker_coe_submodule, LieSubmodule.bot_coeSubmodule,
LinearMap.ker_eq_bot, coe_to_linear_map]
#align lie_module_hom.ker_eq_bot LieModuleHom.ker_eq_bot
+-/
variable {f}
+#print LieModuleHom.mem_ker /-
@[simp]
theorem mem_ker (m : M) : m ∈ f.ker ↔ f m = 0 :=
Iff.rfl
#align lie_module_hom.mem_ker LieModuleHom.mem_ker
+-/
+#print LieModuleHom.ker_id /-
@[simp]
theorem ker_id : (LieModuleHom.id : M →ₗ⁅R,L⁆ M).ker = ⊥ :=
rfl
#align lie_module_hom.ker_id LieModuleHom.ker_id
+-/
+#print LieModuleHom.comp_ker_incl /-
@[simp]
theorem comp_ker_incl : f.comp f.ker.incl = 0 := by ext ⟨m, hm⟩; exact (mem_ker m).mp hm
#align lie_module_hom.comp_ker_incl LieModuleHom.comp_ker_incl
+-/
+#print LieModuleHom.le_ker_iff_map /-
theorem le_ker_iff_map (M' : LieSubmodule R L M) : M' ≤ f.ker ↔ LieSubmodule.map f M' = ⊥ := by
rw [ker, eq_bot_iff, LieSubmodule.map_le_iff_le_comap]
#align lie_module_hom.le_ker_iff_map LieModuleHom.le_ker_iff_map
+-/
variable (f)
+#print LieModuleHom.range /-
/-- The range of a morphism of Lie modules `f : M → N` is a Lie submodule of `N`.
See Note [range copy pattern]. -/
def range : LieSubmodule R L N :=
(LieSubmodule.map f ⊤).copy (Set.range f) Set.image_univ.symm
#align lie_module_hom.range LieModuleHom.range
+-/
+#print LieModuleHom.coe_range /-
@[simp]
theorem coe_range : (f.range : Set N) = Set.range f :=
rfl
#align lie_module_hom.coe_range LieModuleHom.coe_range
+-/
+#print LieModuleHom.coeSubmodule_range /-
@[simp]
theorem coeSubmodule_range : (f.range : Submodule R N) = (f : M →ₗ[R] N).range :=
rfl
#align lie_module_hom.coe_submodule_range LieModuleHom.coeSubmodule_range
+-/
+#print LieModuleHom.mem_range /-
@[simp]
theorem mem_range (n : N) : n ∈ f.range ↔ ∃ m, f m = n :=
Iff.rfl
#align lie_module_hom.mem_range LieModuleHom.mem_range
+-/
+#print LieModuleHom.map_top /-
theorem map_top : LieSubmodule.map f ⊤ = f.range := by ext; simp [LieSubmodule.mem_map]
#align lie_module_hom.map_top LieModuleHom.map_top
+-/
end LieModuleHom
@@ -1347,17 +1573,23 @@ variable [AddCommGroup M] [Module R M] [LieRingModule L M] [LieModule R L M]
variable (N : LieSubmodule R L M)
+#print LieSubmodule.ker_incl /-
@[simp]
theorem ker_incl : N.incl.ker = ⊥ := by simp [← LieSubmodule.coe_toSubmodule_eq_iff]
#align lie_submodule.ker_incl LieSubmodule.ker_incl
+-/
+#print LieSubmodule.range_incl /-
@[simp]
theorem range_incl : N.incl.range = N := by simp [← LieSubmodule.coe_toSubmodule_eq_iff]
#align lie_submodule.range_incl LieSubmodule.range_incl
+-/
+#print LieSubmodule.comap_incl_self /-
@[simp]
theorem comap_incl_self : comap N.incl N = ⊤ := by simp [← LieSubmodule.coe_toSubmodule_eq_iff]
#align lie_submodule.comap_incl_self LieSubmodule.comap_incl_self
+-/
end LieSubmodule
@@ -1367,6 +1599,7 @@ variable {R : Type u} {L : Type v}
variable [CommRing R] [LieRing L] [LieAlgebra R L]
+#print LieSubalgebra.topEquiv /-
/-- The natural equivalence between the 'top' Lie subalgebra and the enclosing Lie algebra.
This is the Lie subalgebra version of `submodule.top_equiv`. -/
@@ -1377,11 +1610,14 @@ def LieSubalgebra.topEquiv : (⊤ : LieSubalgebra R L) ≃ₗ⁅R⁆ L :=
left_inv := fun x => by ext; rfl
right_inv := fun x => rfl }
#align lie_subalgebra.top_equiv LieSubalgebra.topEquiv
+-/
+#print LieSubalgebra.topEquiv_apply /-
@[simp]
theorem LieSubalgebra.topEquiv_apply (x : (⊤ : LieSubalgebra R L)) : LieSubalgebra.topEquiv x = x :=
rfl
#align lie_subalgebra.top_equiv_apply LieSubalgebra.topEquiv_apply
+-/
#print LieIdeal.topEquiv /-
/-- The natural equivalence between the 'top' Lie ideal and the enclosing Lie algebra.
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -433,12 +433,12 @@ instance : Inf (LieSubmodule R L M) :=
{ (N ⊓ N' : Submodule R M) with
lie_mem := fun x m h => mem_inter (N.lie_mem h.1) (N'.lie_mem h.2) }⟩
-/- ./././Mathport/Syntax/Translate/Expr.lean:366:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
+/- ./././Mathport/Syntax/Translate/Expr.lean:372:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
instance : InfSet (LieSubmodule R L M) :=
⟨fun S =>
{
sInf
- "./././Mathport/Syntax/Translate/Expr.lean:366:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" with
+ "./././Mathport/Syntax/Translate/Expr.lean:372:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" with
lie_mem := fun x m h =>
by
simp only [Submodule.mem_carrier, mem_Inter, Submodule.sInf_coe, mem_set_of_eq,
@@ -450,12 +450,12 @@ theorem inf_coe : (↑(N ⊓ N') : Set M) = N ∩ N' :=
rfl
#align lie_submodule.inf_coe LieSubmodule.inf_coe
-/- ./././Mathport/Syntax/Translate/Expr.lean:366:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
+/- ./././Mathport/Syntax/Translate/Expr.lean:372:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
@[simp]
theorem sInf_coe_toSubmodule (S : Set (LieSubmodule R L M)) :
(↑(sInf S) : Submodule R M) =
sInf
- "./././Mathport/Syntax/Translate/Expr.lean:366:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" :=
+ "./././Mathport/Syntax/Translate/Expr.lean:372:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" :=
rfl
#align lie_submodule.Inf_coe_to_submodule LieSubmodule.sInf_coe_toSubmodule
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Oliver Nash
! This file was ported from Lean 3 source module algebra.lie.submodule
-! leanprover-community/mathlib commit 9822b65bfc4ac74537d77ae318d27df1df662471
+! leanprover-community/mathlib commit af471b9e3ce868f296626d33189b4ce730fa4c00
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -14,6 +14,9 @@ import Mathbin.RingTheory.Noetherian
/-!
# Lie submodules of a Lie algebra
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
In this file we define Lie submodules and Lie ideals, we construct the lattice structure on Lie
submodules and we use it to define various important operations, notably the Lie span of a subset
of a Lie module.
@@ -86,9 +89,9 @@ theorem toSubmodule_eq_coe : N.toSubmodule = N :=
#align lie_submodule.to_submodule_eq_coe LieSubmodule.toSubmodule_eq_coe
@[norm_cast]
-theorem coe_to_submodule : ((N : Submodule R M) : Set M) = N :=
+theorem coe_toSubmodule : ((N : Submodule R M) : Set M) = N :=
rfl
-#align lie_submodule.coe_to_submodule LieSubmodule.coe_to_submodule
+#align lie_submodule.coe_to_submodule LieSubmodule.coe_toSubmodule
@[simp]
theorem mem_carrier {x : M} : x ∈ N.carrier ↔ x ∈ (N : Set M) :=
@@ -121,20 +124,20 @@ theorem mk_eq_zero {x} (h : x ∈ N) : (⟨x, h⟩ : N) = 0 ↔ x = 0 :=
#align lie_submodule.mk_eq_zero LieSubmodule.mk_eq_zero
@[simp]
-theorem coe_to_set_mk (S : Set M) (h₁ h₂ h₃ h₄) :
+theorem coe_toSet_mk (S : Set M) (h₁ h₂ h₃ h₄) :
((⟨S, h₁, h₂, h₃, h₄⟩ : LieSubmodule R L M) : Set M) = S :=
rfl
-#align lie_submodule.coe_to_set_mk LieSubmodule.coe_to_set_mk
+#align lie_submodule.coe_to_set_mk LieSubmodule.coe_toSet_mk
@[simp]
-theorem coe_to_submodule_mk (p : Submodule R M) (h) :
+theorem coe_toSubmodule_mk (p : Submodule R M) (h) :
(({ p with lie_mem := h } : LieSubmodule R L M) : Submodule R M) = p := by cases p; rfl
-#align lie_submodule.coe_to_submodule_mk LieSubmodule.coe_to_submodule_mk
+#align lie_submodule.coe_to_submodule_mk LieSubmodule.coe_toSubmodule_mk
-theorem coe_submodule_injective :
+theorem coeSubmodule_injective :
Function.Injective (toSubmodule : LieSubmodule R L M → Submodule R M) := fun x y h => by
cases x; cases y; congr; injection h
-#align lie_submodule.coe_submodule_injective LieSubmodule.coe_submodule_injective
+#align lie_submodule.coe_submodule_injective LieSubmodule.coeSubmodule_injective
@[ext]
theorem ext (h : ∀ m, m ∈ N ↔ m ∈ N') : N = N' :=
@@ -142,9 +145,9 @@ theorem ext (h : ∀ m, m ∈ N ↔ m ∈ N') : N = N' :=
#align lie_submodule.ext LieSubmodule.ext
@[simp]
-theorem coe_to_submodule_eq_iff : (N : Submodule R M) = (N' : Submodule R M) ↔ N = N' :=
- coe_submodule_injective.eq_iff
-#align lie_submodule.coe_to_submodule_eq_iff LieSubmodule.coe_to_submodule_eq_iff
+theorem coe_toSubmodule_eq_iff : (N : Submodule R M) = (N' : Submodule R M) ↔ N = N' :=
+ coeSubmodule_injective.eq_iff
+#align lie_submodule.coe_to_submodule_eq_iff LieSubmodule.coe_toSubmodule_eq_iff
/-- Copy of a lie_submodule with a new `carrier` equal to the old one. Useful to fix definitional
equalities. -/
@@ -226,53 +229,71 @@ section LieIdeal
variable (L)
+#print LieIdeal /-
/-- An ideal of a Lie algebra is a Lie submodule of the Lie algebra as a Lie module over itself. -/
abbrev LieIdeal :=
LieSubmodule R L L
#align lie_ideal LieIdeal
+-/
+#print lie_mem_right /-
theorem lie_mem_right (I : LieIdeal R L) (x y : L) (h : y ∈ I) : ⁅x, y⁆ ∈ I :=
I.lie_mem h
#align lie_mem_right lie_mem_right
+-/
+#print lie_mem_left /-
theorem lie_mem_left (I : LieIdeal R L) (x y : L) (h : x ∈ I) : ⁅x, y⁆ ∈ I := by
rw [← lie_skew, ← neg_lie]; apply lie_mem_right; assumption
#align lie_mem_left lie_mem_left
+-/
+#print lieIdealSubalgebra /-
/-- An ideal of a Lie algebra is a Lie subalgebra. -/
def lieIdealSubalgebra (I : LieIdeal R L) : LieSubalgebra R L :=
{ I.toSubmodule with lie_mem' := by intro x y hx hy; apply lie_mem_right; exact hy }
#align lie_ideal_subalgebra lieIdealSubalgebra
+-/
instance : Coe (LieIdeal R L) (LieSubalgebra R L) :=
⟨fun I => lieIdealSubalgebra R L I⟩
+#print LieIdeal.coe_toSubalgebra /-
@[norm_cast]
-theorem LieIdeal.coe_to_subalgebra (I : LieIdeal R L) : ((I : LieSubalgebra R L) : Set L) = I :=
+theorem LieIdeal.coe_toSubalgebra (I : LieIdeal R L) : ((I : LieSubalgebra R L) : Set L) = I :=
rfl
-#align lie_ideal.coe_to_subalgebra LieIdeal.coe_to_subalgebra
+#align lie_ideal.coe_to_subalgebra LieIdeal.coe_toSubalgebra
+-/
+#print LieIdeal.coe_to_lieSubalgebra_to_submodule /-
@[norm_cast]
theorem LieIdeal.coe_to_lieSubalgebra_to_submodule (I : LieIdeal R L) :
((I : LieSubalgebra R L) : Submodule R L) = I :=
rfl
#align lie_ideal.coe_to_lie_subalgebra_to_submodule LieIdeal.coe_to_lieSubalgebra_to_submodule
+-/
+#print LieIdeal.lieRing /-
/-- An ideal of `L` is a Lie subalgebra of `L`, so it is a Lie ring. -/
instance LieIdeal.lieRing (I : LieIdeal R L) : LieRing I :=
LieSubalgebra.lieRing R L ↑I
#align lie_ideal.lie_ring LieIdeal.lieRing
+-/
+#print LieIdeal.lieAlgebra /-
/-- Transfer the `lie_algebra` instance from the coercion `lie_ideal → lie_subalgebra`. -/
instance LieIdeal.lieAlgebra (I : LieIdeal R L) : LieAlgebra R I :=
LieSubalgebra.lieAlgebra R L ↑I
#align lie_ideal.lie_algebra LieIdeal.lieAlgebra
+-/
+#print LieIdeal.lieRingModule /-
/-- Transfer the `lie_module` instance from the coercion `lie_ideal → lie_subalgebra`. -/
instance LieIdeal.lieRingModule {R L : Type _} [CommRing R] [LieRing L] [LieAlgebra R L]
(I : LieIdeal R L) [LieRingModule L M] : LieRingModule I M :=
LieSubalgebra.lieRingModule (I : LieSubalgebra R L)
#align lie_ideal.lie_ring_module LieIdeal.lieRingModule
+-/
@[simp]
theorem LieIdeal.coe_bracket_of_module {R L : Type _} [CommRing R] [LieRing L] [LieAlgebra R L]
@@ -280,10 +301,12 @@ theorem LieIdeal.coe_bracket_of_module {R L : Type _} [CommRing R] [LieRing L] [
LieSubalgebra.coe_bracket_of_module (I : LieSubalgebra R L) x m
#align lie_ideal.coe_bracket_of_module LieIdeal.coe_bracket_of_module
+#print LieIdeal.lieModule /-
/-- Transfer the `lie_module` instance from the coercion `lie_ideal → lie_subalgebra`. -/
instance LieIdeal.lieModule (I : LieIdeal R L) : LieModule R I M :=
LieSubalgebra.lieModule (I : LieSubalgebra R L)
#align lie_ideal.lie_module LieIdeal.lieModule
+-/
end LieIdeal
@@ -294,36 +317,44 @@ theorem Submodule.exists_lieSubmodule_coe_eq_iff (p : Submodule R M) :
by
constructor
· rintro ⟨N, rfl⟩ _ _; exact N.lie_mem
- · intro h; use { p with lie_mem := h }; exact LieSubmodule.coe_to_submodule_mk p _
+ · intro h; use { p with lie_mem := h }; exact LieSubmodule.coe_toSubmodule_mk p _
#align submodule.exists_lie_submodule_coe_eq_iff Submodule.exists_lieSubmodule_coe_eq_iff
namespace LieSubalgebra
variable {L} (K : LieSubalgebra R L)
+#print LieSubalgebra.toLieSubmodule /-
/-- Given a Lie subalgebra `K ⊆ L`, if we view `L` as a `K`-module by restriction, it contains
a distinguished Lie submodule for the action of `K`, namely `K` itself. -/
def toLieSubmodule : LieSubmodule R K L :=
{ (K : Submodule R L) with lie_mem := fun x y hy => K.lie_mem x.property hy }
#align lie_subalgebra.to_lie_submodule LieSubalgebra.toLieSubmodule
+-/
+#print LieSubalgebra.coe_toLieSubmodule /-
@[simp]
theorem coe_toLieSubmodule : (K.toLieSubmodule : Submodule R L) = K := by rcases K with ⟨⟨⟩⟩; rfl
#align lie_subalgebra.coe_to_lie_submodule LieSubalgebra.coe_toLieSubmodule
+-/
variable {K}
+#print LieSubalgebra.mem_toLieSubmodule /-
@[simp]
theorem mem_toLieSubmodule (x : L) : x ∈ K.toLieSubmodule ↔ x ∈ K :=
Iff.rfl
#align lie_subalgebra.mem_to_lie_submodule LieSubalgebra.mem_toLieSubmodule
+-/
+#print LieSubalgebra.exists_lieIdeal_coe_eq_iff /-
theorem exists_lieIdeal_coe_eq_iff : (∃ I : LieIdeal R L, ↑I = K) ↔ ∀ x y : L, y ∈ K → ⁅x, y⁆ ∈ K :=
by
simp only [← coe_to_submodule_eq_iff, LieIdeal.coe_to_lieSubalgebra_to_submodule,
Submodule.exists_lieSubmodule_coe_eq_iff L]
exact Iff.rfl
#align lie_subalgebra.exists_lie_ideal_coe_eq_iff LieSubalgebra.exists_lieIdeal_coe_eq_iff
+-/
theorem exists_nested_lieIdeal_coe_eq_iff {K' : LieSubalgebra R L} (h : K ≤ K') :
(∃ I : LieIdeal R K', ↑I = ofLe h) ↔ ∀ x y : L, x ∈ K' → y ∈ K → ⁅x, y⁆ ∈ K :=
@@ -421,17 +452,17 @@ theorem inf_coe : (↑(N ⊓ N') : Set M) = N ∩ N' :=
/- ./././Mathport/Syntax/Translate/Expr.lean:366:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
@[simp]
-theorem sInf_coe_to_submodule (S : Set (LieSubmodule R L M)) :
+theorem sInf_coe_toSubmodule (S : Set (LieSubmodule R L M)) :
(↑(sInf S) : Submodule R M) =
sInf
"./././Mathport/Syntax/Translate/Expr.lean:366:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" :=
rfl
-#align lie_submodule.Inf_coe_to_submodule LieSubmodule.sInf_coe_to_submodule
+#align lie_submodule.Inf_coe_to_submodule LieSubmodule.sInf_coe_toSubmodule
@[simp]
theorem sInf_coe (S : Set (LieSubmodule R L M)) : (↑(sInf S) : Set M) = ⋂ s ∈ S, (s : Set M) :=
by
- rw [← LieSubmodule.coe_to_submodule, Inf_coe_to_submodule, Submodule.sInf_coe]
+ rw [← LieSubmodule.coe_toSubmodule, Inf_coe_to_submodule, Submodule.sInf_coe]
ext m
simpa only [mem_Inter, mem_set_of_eq, forall_apply_eq_imp_iff₂, exists_imp]
#align lie_submodule.Inf_coe LieSubmodule.sInf_coe
@@ -477,7 +508,7 @@ theorem add_eq_sup : N + N' = N ⊔ N' :=
#align lie_submodule.add_eq_sup LieSubmodule.add_eq_sup
@[norm_cast, simp]
-theorem sup_coe_to_submodule :
+theorem sup_coe_toSubmodule :
(↑(N ⊔ N') : Submodule R M) = (N : Submodule R M) ⊔ (N' : Submodule R M) :=
by
have aux : ∀ (x : L) (m), m ∈ (N ⊔ N' : Submodule R M) → ⁅x, m⁆ ∈ (N ⊔ N' : Submodule R M) :=
@@ -490,13 +521,13 @@ theorem sup_coe_to_submodule :
simp only [exists_prop, and_true_iff, mem_set_of_eq, eq_self_iff_true, coe_to_submodule_mk, ←
coe_submodule_le_coe_submodule, and_self_iff, le_sup_left, le_sup_right]
· simp
-#align lie_submodule.sup_coe_to_submodule LieSubmodule.sup_coe_to_submodule
+#align lie_submodule.sup_coe_to_submodule LieSubmodule.sup_coe_toSubmodule
@[norm_cast, simp]
-theorem inf_coe_to_submodule :
+theorem inf_coe_toSubmodule :
(↑(N ⊓ N') : Submodule R M) = (N : Submodule R M) ⊓ (N' : Submodule R M) :=
rfl
-#align lie_submodule.inf_coe_to_submodule LieSubmodule.inf_coe_to_submodule
+#align lie_submodule.inf_coe_to_submodule LieSubmodule.inf_coe_toSubmodule
@[simp]
theorem mem_inf (x : M) : x ∈ N ⊓ N' ↔ x ∈ N ∧ x ∈ N' := by
@@ -616,7 +647,7 @@ variable (R L) (s : Set M)
/-- The `lie_span` of a set `s ⊆ M` is the smallest Lie submodule of `M` that contains `s`. -/
def lieSpan : LieSubmodule R L M :=
- sInf { N | s ⊆ N }
+ sInf {N | s ⊆ N}
#align lie_submodule.lie_span LieSubmodule.lieSpan
variable {R L s}
@@ -718,7 +749,7 @@ def map : LieSubmodule R L M' :=
lie_mem := fun x m' h => by
rcases h with ⟨m, hm, hfm⟩; use ⁅x, m⁆; constructor
· apply N.lie_mem hm
- · norm_cast at hfm ; simp [hfm] }
+ · norm_cast at hfm ; simp [hfm] }
#align lie_submodule.map LieSubmodule.map
@[simp]
@@ -767,12 +798,12 @@ theorem mem_comap {m : M} : m ∈ comap f N' ↔ f m ∈ N' :=
#align lie_submodule.mem_comap LieSubmodule.mem_comap
theorem comap_incl_eq_top : N₂.comap N.incl = ⊤ ↔ N ≤ N₂ := by
- simpa only [← LieSubmodule.coe_to_submodule_eq_iff, LieSubmodule.coeSubmodule_comap,
+ simpa only [← LieSubmodule.coe_toSubmodule_eq_iff, LieSubmodule.coeSubmodule_comap,
LieSubmodule.incl_coe, LieSubmodule.top_coeSubmodule, Submodule.comap_subtype_eq_top]
#align lie_submodule.comap_incl_eq_top LieSubmodule.comap_incl_eq_top
theorem comap_incl_eq_bot : N₂.comap N.incl = ⊥ ↔ N ⊓ N₂ = ⊥ := by
- simpa only [_root_.eq_bot_iff, ← LieSubmodule.coe_to_submodule_eq_iff,
+ simpa only [_root_.eq_bot_iff, ← LieSubmodule.coe_toSubmodule_eq_iff,
LieSubmodule.coeSubmodule_comap, LieSubmodule.incl_coe, LieSubmodule.bot_coeSubmodule, ←
Submodule.disjoint_iff_comap_eq_bot, disjoint_iff]
#align lie_submodule.comap_incl_eq_bot LieSubmodule.comap_incl_eq_bot
@@ -783,11 +814,14 @@ namespace LieIdeal
variable (f : L →ₗ⁅R⁆ L') (I I₂ : LieIdeal R L) (J : LieIdeal R L')
+#print LieIdeal.top_coe_lieSubalgebra /-
@[simp]
theorem top_coe_lieSubalgebra : ((⊤ : LieIdeal R L) : LieSubalgebra R L) = ⊤ :=
rfl
#align lie_ideal.top_coe_lie_subalgebra LieIdeal.top_coe_lieSubalgebra
+-/
+#print LieIdeal.map /-
/-- A morphism of Lie algebras `f : L → L'` pushes forward Lie ideals of `L` to Lie ideals of `L'`.
Note that unlike `lie_submodule.map`, we must take the `lie_span` of the image. Mathematically
@@ -796,7 +830,9 @@ this is because although `f` makes `L'` into a Lie module over `L`, in general t
def map : LieIdeal R L' :=
LieSubmodule.lieSpan R L' <| (I : Submodule R L).map (f : L →ₗ[R] L')
#align lie_ideal.map LieIdeal.map
+-/
+#print LieIdeal.comap /-
/-- A morphism of Lie algebras `f : L → L'` pulls back Lie ideals of `L'` to Lie ideals of `L`.
Note that `f` makes `L'` into a Lie module over `L` (turning `f` into a morphism of Lie modules)
@@ -805,18 +841,23 @@ def comap : LieIdeal R L :=
{ (J : Submodule R L').comap (f : L →ₗ[R] L') with
lie_mem := fun x y h => by suffices ⁅f x, f y⁆ ∈ J by simp [this]; apply J.lie_mem h }
#align lie_ideal.comap LieIdeal.comap
+-/
+#print LieIdeal.map_coeSubmodule /-
@[simp]
theorem map_coeSubmodule (h : ↑(map f I) = f '' I) :
(map f I : Submodule R L') = (I : Submodule R L).map (f : L →ₗ[R] L') := by
- rw [SetLike.ext'_iff, LieSubmodule.coe_to_submodule, h, Submodule.map_coe]; rfl
+ rw [SetLike.ext'_iff, LieSubmodule.coe_toSubmodule, h, Submodule.map_coe]; rfl
#align lie_ideal.map_coe_submodule LieIdeal.map_coeSubmodule
+-/
+#print LieIdeal.comap_coeSubmodule /-
@[simp]
theorem comap_coeSubmodule :
(comap f J : Submodule R L) = (J : Submodule R L').comap (f : L →ₗ[R] L') :=
rfl
#align lie_ideal.comap_coe_submodule LieIdeal.comap_coeSubmodule
+-/
theorem map_le : map f I ≤ J ↔ f '' I ⊆ J :=
LieSubmodule.lieSpan_le
@@ -824,14 +865,18 @@ theorem map_le : map f I ≤ J ↔ f '' I ⊆ J :=
variable {f I I₂ J}
+#print LieIdeal.mem_map /-
theorem mem_map {x : L} (hx : x ∈ I) : f x ∈ map f I := by apply LieSubmodule.subset_lieSpan; use x;
exact ⟨hx, rfl⟩
#align lie_ideal.mem_map LieIdeal.mem_map
+-/
+#print LieIdeal.mem_comap /-
@[simp]
theorem mem_comap {x : L} : x ∈ comap f J ↔ f x ∈ J :=
Iff.rfl
#align lie_ideal.mem_comap LieIdeal.mem_comap
+-/
theorem map_le_iff_le_comap : map f I ≤ J ↔ I ≤ comap f J := by rw [map_le];
exact Set.image_subset_iff
@@ -839,15 +884,19 @@ theorem map_le_iff_le_comap : map f I ≤ J ↔ I ≤ comap f J := by rw [map_le
variable (f)
+#print LieIdeal.gc_map_comap /-
theorem gc_map_comap : GaloisConnection (map f) (comap f) := fun I I' => map_le_iff_le_comap
#align lie_ideal.gc_map_comap LieIdeal.gc_map_comap
+-/
variable {f}
+#print LieIdeal.map_sup /-
@[simp]
theorem map_sup : (I ⊔ I₂).map f = I.map f ⊔ I₂.map f :=
(gc_map_comap f).l_sup
#align lie_ideal.map_sup LieIdeal.map_sup
+-/
theorem map_comap_le : map f (comap f J) ≤ J := by rw [map_le_iff_le_comap]; exact le_rfl
#align lie_ideal.map_comap_le LieIdeal.map_comap_le
@@ -856,23 +905,30 @@ theorem map_comap_le : map f (comap f J) ≤ J := by rw [map_le_iff_le_comap]; e
theorem comap_map_le : I ≤ comap f (map f I) := by rw [← map_le_iff_le_comap]; exact le_rfl
#align lie_ideal.comap_map_le LieIdeal.comap_map_le
+#print LieIdeal.map_mono /-
@[mono]
theorem map_mono : Monotone (map f) := fun I₁ I₂ h => by rw [SetLike.le_def] at h ;
apply LieSubmodule.lieSpan_mono (Set.image_subset (⇑f) h)
#align lie_ideal.map_mono LieIdeal.map_mono
+-/
+#print LieIdeal.comap_mono /-
@[mono]
theorem comap_mono : Monotone (comap f) := fun J₁ J₂ h => by rw [← SetLike.coe_subset_coe] at h ⊢;
exact Set.preimage_mono h
#align lie_ideal.comap_mono LieIdeal.comap_mono
+-/
+#print LieIdeal.map_of_image /-
theorem map_of_image (h : f '' I = J) : I.map f = J :=
by
apply le_antisymm
· erw [LieSubmodule.lieSpan_le, Submodule.map_coe, h]
· rw [← SetLike.coe_subset_coe, ← h]; exact LieSubmodule.subset_lieSpan
#align lie_ideal.map_of_image LieIdeal.map_of_image
+-/
+#print LieIdeal.subsingleton_of_bot /-
/-- Note that this is not a special case of `lie_submodule.subsingleton_of_bot`. Indeed, given
`I : lie_ideal R L`, in general the two lattices `lie_ideal R I` and `lie_submodule R L I` are
different (though the latter does naturally inject into the former).
@@ -885,6 +941,7 @@ instance subsingleton_of_bot : Subsingleton (LieIdeal R (⊥ : LieIdeal R L)) :=
ext ⟨x, hx⟩; change x ∈ ⊥ at hx ; rw [LieSubmodule.mem_bot] at hx ; subst hx
simp only [true_iff_iff, eq_self_iff_true, Submodule.mk_eq_zero, LieSubmodule.mem_bot]
#align lie_ideal.subsingleton_of_bot LieIdeal.subsingleton_of_bot
+-/
end LieIdeal
@@ -892,33 +949,45 @@ namespace LieHom
variable (f : L →ₗ⁅R⁆ L') (I : LieIdeal R L) (J : LieIdeal R L')
+#print LieHom.ker /-
/-- The kernel of a morphism of Lie algebras, as an ideal in the domain. -/
def ker : LieIdeal R L :=
LieIdeal.comap f ⊥
#align lie_hom.ker LieHom.ker
+-/
+#print LieHom.idealRange /-
/-- The range of a morphism of Lie algebras as an ideal in the codomain. -/
def idealRange : LieIdeal R L' :=
LieSubmodule.lieSpan R L' f.range
#align lie_hom.ideal_range LieHom.idealRange
+-/
+#print LieHom.idealRange_eq_lieSpan_range /-
theorem idealRange_eq_lieSpan_range : f.idealRange = LieSubmodule.lieSpan R L' f.range :=
rfl
#align lie_hom.ideal_range_eq_lie_span_range LieHom.idealRange_eq_lieSpan_range
+-/
+#print LieHom.idealRange_eq_map /-
theorem idealRange_eq_map : f.idealRange = LieIdeal.map f ⊤ := by ext;
simp only [ideal_range, range_eq_map]; rfl
#align lie_hom.ideal_range_eq_map LieHom.idealRange_eq_map
+-/
+#print LieHom.IsIdealMorphism /-
/-- The condition that the image of a morphism of Lie algebras is an ideal. -/
def IsIdealMorphism : Prop :=
(f.idealRange : LieSubalgebra R L') = f.range
#align lie_hom.is_ideal_morphism LieHom.IsIdealMorphism
+-/
+#print LieHom.isIdealMorphism_def /-
@[simp]
theorem isIdealMorphism_def : f.IsIdealMorphism ↔ (f.idealRange : LieSubalgebra R L') = f.range :=
Iff.rfl
#align lie_hom.is_ideal_morphism_def LieHom.isIdealMorphism_def
+-/
theorem isIdealMorphism_iff : f.IsIdealMorphism ↔ ∀ (x : L') (y : L), ∃ z : L, ⁅x, f y⁆ = f z :=
by
@@ -932,9 +1001,11 @@ theorem isIdealMorphism_iff : f.IsIdealMorphism ↔ ∀ (x : L') (y : L), ∃ z
· intro h x y z hz; obtain ⟨w, hw⟩ := h x z; use w; rw [← hw, hz]
#align lie_hom.is_ideal_morphism_iff LieHom.isIdealMorphism_iff
+#print LieHom.range_subset_idealRange /-
theorem range_subset_idealRange : (f.range : Set L') ⊆ f.idealRange :=
LieSubmodule.subset_lieSpan
#align lie_hom.range_subset_ideal_range LieHom.range_subset_idealRange
+-/
theorem map_le_idealRange : I.map f ≤ f.idealRange :=
by
@@ -946,29 +1017,37 @@ theorem ker_le_comap : f.ker ≤ J.comap f :=
LieIdeal.comap_mono bot_le
#align lie_hom.ker_le_comap LieHom.ker_le_comap
+#print LieHom.ker_coeSubmodule /-
@[simp]
theorem ker_coeSubmodule : (ker f : Submodule R L) = (f : L →ₗ[R] L').ker :=
rfl
#align lie_hom.ker_coe_submodule LieHom.ker_coeSubmodule
+-/
+#print LieHom.mem_ker /-
@[simp]
theorem mem_ker {x : L} : x ∈ ker f ↔ f x = 0 :=
show x ∈ (f.ker : Submodule R L) ↔ _ by
simp only [ker_coe_submodule, LinearMap.mem_ker, coe_to_linear_map]
#align lie_hom.mem_ker LieHom.mem_ker
+-/
+#print LieHom.mem_idealRange /-
theorem mem_idealRange {x : L} : f x ∈ idealRange f :=
by
rw [ideal_range_eq_map]
exact LieIdeal.mem_map (LieSubmodule.mem_top x)
#align lie_hom.mem_ideal_range LieHom.mem_idealRange
+-/
+#print LieHom.mem_idealRange_iff /-
@[simp]
theorem mem_idealRange_iff (h : IsIdealMorphism f) {y : L'} : y ∈ idealRange f ↔ ∃ x : L, f x = y :=
by
rw [f.is_ideal_morphism_def] at h
- rw [← LieSubmodule.mem_coe, ← LieIdeal.coe_to_subalgebra, h, f.range_coe, Set.mem_range]
+ rw [← LieSubmodule.mem_coe, ← LieIdeal.coe_toSubalgebra, h, f.range_coe, Set.mem_range]
#align lie_hom.mem_ideal_range_iff LieHom.mem_idealRange_iff
+-/
theorem le_ker_iff : I ≤ f.ker ↔ ∀ x, x ∈ I → f x = 0 :=
by
@@ -977,15 +1056,19 @@ theorem le_ker_iff : I ≤ f.ker ↔ ∀ x, x ∈ I → f x = 0 :=
· rw [mem_ker]; apply h x hx
#align lie_hom.le_ker_iff LieHom.le_ker_iff
+#print LieHom.ker_eq_bot /-
theorem ker_eq_bot : f.ker = ⊥ ↔ Function.Injective f := by
- rw [← LieSubmodule.coe_to_submodule_eq_iff, ker_coe_submodule, LieSubmodule.bot_coeSubmodule,
+ rw [← LieSubmodule.coe_toSubmodule_eq_iff, ker_coe_submodule, LieSubmodule.bot_coeSubmodule,
LinearMap.ker_eq_bot, coe_to_linear_map]
#align lie_hom.ker_eq_bot LieHom.ker_eq_bot
+-/
+#print LieHom.range_coeSubmodule /-
@[simp]
-theorem range_coe_submodule : (f.range : Submodule R L') = (f : L →ₗ[R] L').range :=
+theorem range_coeSubmodule : (f.range : Submodule R L') = (f : L →ₗ[R] L').range :=
rfl
-#align lie_hom.range_coe_submodule LieHom.range_coe_submodule
+#align lie_hom.range_coe_submodule LieHom.range_coeSubmodule
+-/
theorem range_eq_top : f.range = ⊤ ↔ Function.Surjective f :=
by
@@ -998,7 +1081,7 @@ theorem idealRange_eq_top_of_surjective (h : Function.Surjective f) : f.idealRan
by
rw [← f.range_eq_top] at h
rw [ideal_range_eq_lie_span_range, h, ← LieSubalgebra.coe_to_submodule, ←
- LieSubmodule.coe_to_submodule_eq_iff, LieSubmodule.top_coeSubmodule,
+ LieSubmodule.coe_toSubmodule_eq_iff, LieSubmodule.top_coeSubmodule,
LieSubalgebra.top_coe_submodule, LieSubmodule.coe_lieSpan_submodule_eq_iff]
use ⊤
exact LieSubmodule.top_coeSubmodule
@@ -1015,10 +1098,12 @@ namespace LieIdeal
variable {f : L →ₗ⁅R⁆ L'} {I : LieIdeal R L} {J : LieIdeal R L'}
+#print LieIdeal.map_eq_bot_iff /-
@[simp]
theorem map_eq_bot_iff : I.map f = ⊥ ↔ I ≤ f.ker := by rw [← le_bot_iff];
exact LieIdeal.map_le_iff_le_comap
#align lie_ideal.map_eq_bot_iff LieIdeal.map_eq_bot_iff
+-/
theorem coe_map_of_surjective (h : Function.Surjective f) :
(I.map f : Submodule R L') = (I : Submodule R L).map (f : L →ₗ[R] L') :=
@@ -1036,7 +1121,7 @@ theorem coe_map_of_surjective (h : Function.Surjective f) :
exact ⟨I.lie_mem hz₂, f.map_lie z₁ z₂⟩ }
erw [LieSubmodule.coe_lieSpan_submodule_eq_iff]
use J
- apply LieSubmodule.coe_to_submodule_mk
+ apply LieSubmodule.coe_toSubmodule_mk
#align lie_ideal.coe_map_of_surjective LieIdeal.coe_map_of_surjective
theorem mem_map_of_surjective {y : L'} (h₁ : Function.Surjective f) (h₂ : y ∈ I.map f) :
@@ -1074,6 +1159,7 @@ theorem homOfLe_injective {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) : Funct
simp only [hom_of_le_apply, imp_self, Subtype.mk_eq_mk, SetLike.coe_eq_coe, Subtype.val_eq_coe]
#align lie_ideal.hom_of_le_injective LieIdeal.homOfLe_injective
+#print LieIdeal.map_sup_ker_eq_map /-
@[simp]
theorem map_sup_ker_eq_map : LieIdeal.map f (I ⊔ f.ker) = LieIdeal.map f I :=
by
@@ -1084,7 +1170,9 @@ theorem map_sup_ker_eq_map : LieIdeal.map f (I ⊔ f.ker) = LieIdeal.map f I :=
erw [LieSubmodule.mem_sup] at hy₁ ; obtain ⟨z₁, hz₁, z₂, hz₂, hy⟩ := hy₁; rw [← hy]
rw [f.coe_to_linear_map, f.map_add, f.mem_ker.mp hz₂, add_zero]; exact ⟨z₁, hz₁, rfl⟩
#align lie_ideal.map_sup_ker_eq_map LieIdeal.map_sup_ker_eq_map
+-/
+#print LieIdeal.map_comap_eq /-
@[simp]
theorem map_comap_eq (h : f.IsIdealMorphism) : map f (comap f J) = f.idealRange ⊓ J :=
by
@@ -1094,62 +1182,81 @@ theorem map_comap_eq (h : f.IsIdealMorphism) : map f (comap f J) = f.idealRange
rw [← SetLike.coe_subset_coe, LieSubmodule.inf_coe, ← coe_to_subalgebra, h]
rintro y ⟨⟨x, h₁⟩, h₂⟩; rw [← h₁] at h₂ ⊢; exact mem_map h₂
#align lie_ideal.map_comap_eq LieIdeal.map_comap_eq
+-/
+#print LieIdeal.comap_map_eq /-
@[simp]
theorem comap_map_eq (h : ↑(map f I) = f '' I) : comap f (map f I) = I ⊔ f.ker := by
- rw [← LieSubmodule.coe_to_submodule_eq_iff, comap_coe_submodule, I.map_coe_submodule f h,
- LieSubmodule.sup_coe_to_submodule, f.ker_coe_submodule, Submodule.comap_map_eq]
+ rw [← LieSubmodule.coe_toSubmodule_eq_iff, comap_coe_submodule, I.map_coe_submodule f h,
+ LieSubmodule.sup_coe_toSubmodule, f.ker_coe_submodule, Submodule.comap_map_eq]
#align lie_ideal.comap_map_eq LieIdeal.comap_map_eq
+-/
variable (f I J)
+#print LieIdeal.incl /-
/-- Regarding an ideal `I` as a subalgebra, the inclusion map into its ambient space is a morphism
of Lie algebras. -/
def incl : I →ₗ⁅R⁆ L :=
(I : LieSubalgebra R L).incl
#align lie_ideal.incl LieIdeal.incl
+-/
+#print LieIdeal.incl_range /-
@[simp]
theorem incl_range : I.incl.range = I :=
(I : LieSubalgebra R L).incl_range
#align lie_ideal.incl_range LieIdeal.incl_range
+-/
+#print LieIdeal.incl_apply /-
@[simp]
theorem incl_apply (x : I) : I.incl x = x :=
rfl
#align lie_ideal.incl_apply LieIdeal.incl_apply
+-/
+#print LieIdeal.incl_coe /-
@[simp]
theorem incl_coe : (I.incl : I →ₗ[R] L) = (I : Submodule R L).Subtype :=
rfl
#align lie_ideal.incl_coe LieIdeal.incl_coe
+-/
+#print LieIdeal.comap_incl_self /-
@[simp]
theorem comap_incl_self : comap I.incl I = ⊤ := by
- rw [← LieSubmodule.coe_to_submodule_eq_iff, LieSubmodule.top_coeSubmodule,
+ rw [← LieSubmodule.coe_toSubmodule_eq_iff, LieSubmodule.top_coeSubmodule,
LieIdeal.comap_coeSubmodule, LieIdeal.incl_coe, Submodule.comap_subtype_self]
#align lie_ideal.comap_incl_self LieIdeal.comap_incl_self
+-/
+#print LieIdeal.ker_incl /-
@[simp]
theorem ker_incl : I.incl.ker = ⊥ := by
- rw [← LieSubmodule.coe_to_submodule_eq_iff, I.incl.ker_coe_submodule,
+ rw [← LieSubmodule.coe_toSubmodule_eq_iff, I.incl.ker_coe_submodule,
LieSubmodule.bot_coeSubmodule, incl_coe, Submodule.ker_subtype]
#align lie_ideal.ker_incl LieIdeal.ker_incl
+-/
+#print LieIdeal.incl_idealRange /-
@[simp]
theorem incl_idealRange : I.incl.idealRange = I :=
by
rw [LieHom.idealRange_eq_lieSpan_range, ← LieSubalgebra.coe_to_submodule, ←
- LieSubmodule.coe_to_submodule_eq_iff, incl_range, coe_to_lie_subalgebra_to_submodule,
+ LieSubmodule.coe_toSubmodule_eq_iff, incl_range, coe_to_lie_subalgebra_to_submodule,
LieSubmodule.coe_lieSpan_submodule_eq_iff]
use I
#align lie_ideal.incl_ideal_range LieIdeal.incl_idealRange
+-/
+#print LieIdeal.incl_isIdealMorphism /-
theorem incl_isIdealMorphism : I.incl.IsIdealMorphism :=
by
rw [I.incl.is_ideal_morphism_def, incl_ideal_range]
exact (I : LieSubalgebra R L).incl_range.symm
#align lie_ideal.incl_is_ideal_morphism LieIdeal.incl_isIdealMorphism
+-/
end LieIdeal
@@ -1178,7 +1285,7 @@ theorem ker_coeSubmodule : (f.ker : Submodule R M) = (f : M →ₗ[R] N).ker :=
#align lie_module_hom.ker_coe_submodule LieModuleHom.ker_coeSubmodule
theorem ker_eq_bot : f.ker = ⊥ ↔ Function.Injective f := by
- rw [← LieSubmodule.coe_to_submodule_eq_iff, ker_coe_submodule, LieSubmodule.bot_coeSubmodule,
+ rw [← LieSubmodule.coe_toSubmodule_eq_iff, ker_coe_submodule, LieSubmodule.bot_coeSubmodule,
LinearMap.ker_eq_bot, coe_to_linear_map]
#align lie_module_hom.ker_eq_bot LieModuleHom.ker_eq_bot
@@ -1241,15 +1348,15 @@ variable [AddCommGroup M] [Module R M] [LieRingModule L M] [LieModule R L M]
variable (N : LieSubmodule R L M)
@[simp]
-theorem ker_incl : N.incl.ker = ⊥ := by simp [← LieSubmodule.coe_to_submodule_eq_iff]
+theorem ker_incl : N.incl.ker = ⊥ := by simp [← LieSubmodule.coe_toSubmodule_eq_iff]
#align lie_submodule.ker_incl LieSubmodule.ker_incl
@[simp]
-theorem range_incl : N.incl.range = N := by simp [← LieSubmodule.coe_to_submodule_eq_iff]
+theorem range_incl : N.incl.range = N := by simp [← LieSubmodule.coe_toSubmodule_eq_iff]
#align lie_submodule.range_incl LieSubmodule.range_incl
@[simp]
-theorem comap_incl_self : comap N.incl N = ⊤ := by simp [← LieSubmodule.coe_to_submodule_eq_iff]
+theorem comap_incl_self : comap N.incl N = ⊤ := by simp [← LieSubmodule.coe_toSubmodule_eq_iff]
#align lie_submodule.comap_incl_self LieSubmodule.comap_incl_self
end LieSubmodule
@@ -1276,17 +1383,21 @@ theorem LieSubalgebra.topEquiv_apply (x : (⊤ : LieSubalgebra R L)) : LieSubalg
rfl
#align lie_subalgebra.top_equiv_apply LieSubalgebra.topEquiv_apply
+#print LieIdeal.topEquiv /-
/-- The natural equivalence between the 'top' Lie ideal and the enclosing Lie algebra.
This is the Lie ideal version of `submodule.top_equiv`. -/
def LieIdeal.topEquiv : (⊤ : LieIdeal R L) ≃ₗ⁅R⁆ L :=
LieSubalgebra.topEquiv
#align lie_ideal.top_equiv LieIdeal.topEquiv
+-/
+#print LieIdeal.topEquiv_apply /-
@[simp]
theorem LieIdeal.topEquiv_apply (x : (⊤ : LieIdeal R L)) : LieIdeal.topEquiv x = x :=
rfl
#align lie_ideal.top_equiv_apply LieIdeal.topEquiv_apply
+-/
end TopEquiv
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -133,7 +133,7 @@ theorem coe_to_submodule_mk (p : Submodule R M) (h) :
theorem coe_submodule_injective :
Function.Injective (toSubmodule : LieSubmodule R L M → Submodule R M) := fun x y h => by
- cases x; cases y; congr ; injection h
+ cases x; cases y; congr; injection h
#align lie_submodule.coe_submodule_injective LieSubmodule.coe_submodule_injective
@[ext]
@@ -438,7 +438,7 @@ theorem sInf_coe (S : Set (LieSubmodule R L M)) : (↑(sInf S) : Set M) = ⋂ s
theorem sInf_glb (S : Set (LieSubmodule R L M)) : IsGLB S (sInf S) :=
by
- have h : ∀ N N' : LieSubmodule R L M, (N : Set M) ≤ N' ↔ N ≤ N' := by intros ; rfl
+ have h : ∀ N N' : LieSubmodule R L M, (N : Set M) ≤ N' ↔ N ≤ N' := by intros; rfl
apply IsGLB.of_image h
simp only [Inf_coe]
exact isGLB_biInf
@@ -454,7 +454,7 @@ instance : CompleteLattice (LieSubmodule R L M) :=
le := (· ≤ ·)
lt := (· < ·)
bot := ⊥
- bot_le := fun N _ h => by rw [mem_bot] at h; rw [h]; exact N.zero_mem'
+ bot_le := fun N _ h => by rw [mem_bot] at h ; rw [h]; exact N.zero_mem'
top := ⊤
le_top := fun _ _ _ => trivial
inf := (· ⊓ ·)
@@ -514,7 +514,7 @@ theorem eq_bot_iff : N = ⊥ ↔ ∀ m : M, m ∈ N → m = 0 := by rw [eq_bot_i
instance subsingleton_of_bot : Subsingleton (LieSubmodule R L ↥(⊥ : LieSubmodule R L M)) :=
by
apply subsingleton_of_bot_eq_top
- ext ⟨x, hx⟩; change x ∈ ⊥ at hx; rw [LieSubmodule.mem_bot] at hx; subst hx
+ ext ⟨x, hx⟩; change x ∈ ⊥ at hx ; rw [LieSubmodule.mem_bot] at hx ; subst hx
simp only [true_iff_iff, eq_self_iff_true, Submodule.mk_eq_zero, LieSubmodule.mem_bot]
#align lie_submodule.subsingleton_of_bot LieSubmodule.subsingleton_of_bot
@@ -637,7 +637,7 @@ theorem lieSpan_le {N} : lieSpan R L s ≤ N ↔ s ⊆ N :=
by
constructor
· exact subset.trans subset_lie_span
- · intro hs m hm; rw [mem_lie_span] at hm; exact hm _ hs
+ · intro hs m hm; rw [mem_lie_span] at hm ; exact hm _ hs
#align lie_submodule.lie_span_le LieSubmodule.lieSpan_le
theorem lieSpan_mono {t : Set M} (h : s ⊆ t) : lieSpan R L s ≤ lieSpan R L t := by rw [lie_span_le];
@@ -718,7 +718,7 @@ def map : LieSubmodule R L M' :=
lie_mem := fun x m' h => by
rcases h with ⟨m, hm, hfm⟩; use ⁅x, m⁆; constructor
· apply N.lie_mem hm
- · norm_cast at hfm; simp [hfm] }
+ · norm_cast at hfm ; simp [hfm] }
#align lie_submodule.map LieSubmodule.map
@[simp]
@@ -857,12 +857,12 @@ theorem comap_map_le : I ≤ comap f (map f I) := by rw [← map_le_iff_le_comap
#align lie_ideal.comap_map_le LieIdeal.comap_map_le
@[mono]
-theorem map_mono : Monotone (map f) := fun I₁ I₂ h => by rw [SetLike.le_def] at h;
+theorem map_mono : Monotone (map f) := fun I₁ I₂ h => by rw [SetLike.le_def] at h ;
apply LieSubmodule.lieSpan_mono (Set.image_subset (⇑f) h)
#align lie_ideal.map_mono LieIdeal.map_mono
@[mono]
-theorem comap_mono : Monotone (comap f) := fun J₁ J₂ h => by rw [← SetLike.coe_subset_coe] at h⊢;
+theorem comap_mono : Monotone (comap f) := fun J₁ J₂ h => by rw [← SetLike.coe_subset_coe] at h ⊢;
exact Set.preimage_mono h
#align lie_ideal.comap_mono LieIdeal.comap_mono
@@ -882,7 +882,7 @@ same as ideals of `L` contained in `I`. -/
instance subsingleton_of_bot : Subsingleton (LieIdeal R (⊥ : LieIdeal R L)) :=
by
apply subsingleton_of_bot_eq_top
- ext ⟨x, hx⟩; change x ∈ ⊥ at hx; rw [LieSubmodule.mem_bot] at hx; subst hx
+ ext ⟨x, hx⟩; change x ∈ ⊥ at hx ; rw [LieSubmodule.mem_bot] at hx ; subst hx
simp only [true_iff_iff, eq_self_iff_true, Submodule.mk_eq_zero, LieSubmodule.mem_bot]
#align lie_ideal.subsingleton_of_bot LieIdeal.subsingleton_of_bot
@@ -966,14 +966,14 @@ theorem mem_idealRange {x : L} : f x ∈ idealRange f :=
@[simp]
theorem mem_idealRange_iff (h : IsIdealMorphism f) {y : L'} : y ∈ idealRange f ↔ ∃ x : L, f x = y :=
by
- rw [f.is_ideal_morphism_def] at h
+ rw [f.is_ideal_morphism_def] at h
rw [← LieSubmodule.mem_coe, ← LieIdeal.coe_to_subalgebra, h, f.range_coe, Set.mem_range]
#align lie_hom.mem_ideal_range_iff LieHom.mem_idealRange_iff
theorem le_ker_iff : I ≤ f.ker ↔ ∀ x, x ∈ I → f x = 0 :=
by
constructor <;> intro h x hx
- · specialize h hx; rw [mem_ker] at h; exact h
+ · specialize h hx; rw [mem_ker] at h ; exact h
· rw [mem_ker]; apply h x hx
#align lie_hom.le_ker_iff LieHom.le_ker_iff
@@ -996,7 +996,7 @@ theorem range_eq_top : f.range = ⊤ ↔ Function.Surjective f :=
@[simp]
theorem idealRange_eq_top_of_surjective (h : Function.Surjective f) : f.idealRange = ⊤ :=
by
- rw [← f.range_eq_top] at h
+ rw [← f.range_eq_top] at h
rw [ideal_range_eq_lie_span_range, h, ← LieSubalgebra.coe_to_submodule, ←
LieSubmodule.coe_to_submodule_eq_iff, LieSubmodule.top_coeSubmodule,
LieSubalgebra.top_coe_submodule, LieSubmodule.coe_lieSpan_submodule_eq_iff]
@@ -1042,7 +1042,7 @@ theorem coe_map_of_surjective (h : Function.Surjective f) :
theorem mem_map_of_surjective {y : L'} (h₁ : Function.Surjective f) (h₂ : y ∈ I.map f) :
∃ x : I, f x = y :=
by
- rw [← LieSubmodule.mem_coeSubmodule, coe_map_of_surjective h₁, Submodule.mem_map] at h₂
+ rw [← LieSubmodule.mem_coeSubmodule, coe_map_of_surjective h₁, Submodule.mem_map] at h₂
obtain ⟨x, hx, rfl⟩ := h₂
use ⟨x, hx⟩
rfl
@@ -1050,8 +1050,8 @@ theorem mem_map_of_surjective {y : L'} (h₁ : Function.Surjective f) (h₂ : y
theorem bot_of_map_eq_bot {I : LieIdeal R L} (h₁ : Function.Injective f) (h₂ : I.map f = ⊥) :
I = ⊥ := by
- rw [← f.ker_eq_bot] at h₁; change comap f ⊥ = ⊥ at h₁
- rw [eq_bot_iff, map_le_iff_le_comap, h₁] at h₂
+ rw [← f.ker_eq_bot] at h₁ ; change comap f ⊥ = ⊥ at h₁
+ rw [eq_bot_iff, map_le_iff_le_comap, h₁] at h₂
rw [eq_bot_iff]; exact h₂
#align lie_ideal.bot_of_map_eq_bot LieIdeal.bot_of_map_eq_bot
@@ -1081,7 +1081,7 @@ theorem map_sup_ker_eq_map : LieIdeal.map f (I ⊔ f.ker) = LieIdeal.map f I :=
exact le_antisymm this (LieIdeal.map_mono le_sup_left)
apply LieSubmodule.lieSpan_mono
rintro x ⟨y, hy₁, hy₂⟩; rw [← hy₂]
- erw [LieSubmodule.mem_sup] at hy₁; obtain ⟨z₁, hz₁, z₂, hz₂, hy⟩ := hy₁; rw [← hy]
+ erw [LieSubmodule.mem_sup] at hy₁ ; obtain ⟨z₁, hz₁, z₂, hz₂, hy⟩ := hy₁; rw [← hy]
rw [f.coe_to_linear_map, f.map_add, f.mem_ker.mp hz₂, add_zero]; exact ⟨z₁, hz₁, rfl⟩
#align lie_ideal.map_sup_ker_eq_map LieIdeal.map_sup_ker_eq_map
@@ -1090,9 +1090,9 @@ theorem map_comap_eq (h : f.IsIdealMorphism) : map f (comap f J) = f.idealRange
by
apply le_antisymm
· rw [le_inf_iff]; exact ⟨f.map_le_ideal_range _, map_comap_le⟩
- · rw [f.is_ideal_morphism_def] at h
+ · rw [f.is_ideal_morphism_def] at h
rw [← SetLike.coe_subset_coe, LieSubmodule.inf_coe, ← coe_to_subalgebra, h]
- rintro y ⟨⟨x, h₁⟩, h₂⟩; rw [← h₁] at h₂⊢; exact mem_map h₂
+ rintro y ⟨⟨x, h₁⟩, h₂⟩; rw [← h₁] at h₂ ⊢; exact mem_map h₂
#align lie_ideal.map_comap_eq LieIdeal.map_comap_eq
@[simp]
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -71,9 +71,7 @@ instance : AddSubgroupClass (LieSubmodule R L M) M
/-- The zero module is a Lie submodule of any Lie module. -/
instance : Zero (LieSubmodule R L M) :=
⟨{ (0 : Submodule R M) with
- lie_mem := fun x m h => by
- rw [(Submodule.mem_bot R).1 h]
- apply lie_zero }⟩
+ lie_mem := fun x m h => by rw [(Submodule.mem_bot R).1 h]; apply lie_zero }⟩
instance : Inhabited (LieSubmodule R L M) :=
⟨0⟩
@@ -130,19 +128,12 @@ theorem coe_to_set_mk (S : Set M) (h₁ h₂ h₃ h₄) :
@[simp]
theorem coe_to_submodule_mk (p : Submodule R M) (h) :
- (({ p with lie_mem := h } : LieSubmodule R L M) : Submodule R M) = p :=
- by
- cases p
- rfl
+ (({ p with lie_mem := h } : LieSubmodule R L M) : Submodule R M) = p := by cases p; rfl
#align lie_submodule.coe_to_submodule_mk LieSubmodule.coe_to_submodule_mk
theorem coe_submodule_injective :
- Function.Injective (toSubmodule : LieSubmodule R L M → Submodule R M) := fun x y h =>
- by
- cases x
- cases y
- congr
- injection h
+ Function.Injective (toSubmodule : LieSubmodule R L M → Submodule R M) := fun x y h => by
+ cases x; cases y; congr ; injection h
#align lie_submodule.coe_submodule_injective LieSubmodule.coe_submodule_injective
@[ext]
@@ -178,18 +169,9 @@ theorem copy_eq (S : LieSubmodule R L M) (s : Set M) (hs : s = ↑S) : S.copy s
instance : LieRingModule L N
where
bracket (x : L) (m : N) := ⟨⁅x, m.val⁆, N.lie_mem m.property⟩
- add_lie := by
- intro x y m
- apply SetCoe.ext
- apply add_lie
- lie_add := by
- intro x m n
- apply SetCoe.ext
- apply lie_add
- leibniz_lie := by
- intro x y m
- apply SetCoe.ext
- apply leibniz_lie
+ add_lie := by intro x y m; apply SetCoe.ext; apply add_lie
+ lie_add := by intro x m n; apply SetCoe.ext; apply lie_add
+ leibniz_lie := by intro x y m; apply SetCoe.ext; apply leibniz_lie
instance module' {S : Type _} [Semiring S] [SMul S R] [Module S M] [IsScalarTower S R M] :
Module S N :=
@@ -205,14 +187,8 @@ instance {S : Type _} [Semiring S] [SMul S R] [SMul Sᵐᵒᵖ R] [Module S M] [
instance : LieModule R L N
where
- lie_smul := by
- intro t x y
- apply SetCoe.ext
- apply lie_smul
- smul_lie := by
- intro t x y
- apply SetCoe.ext
- apply smul_lie
+ lie_smul := by intro t x y; apply SetCoe.ext; apply lie_smul
+ smul_lie := by intro t x y; apply SetCoe.ext; apply smul_lie
@[simp, norm_cast]
theorem coe_zero : ((0 : N) : M) = (0 : M) :=
@@ -259,20 +235,13 @@ theorem lie_mem_right (I : LieIdeal R L) (x y : L) (h : y ∈ I) : ⁅x, y⁆
I.lie_mem h
#align lie_mem_right lie_mem_right
-theorem lie_mem_left (I : LieIdeal R L) (x y : L) (h : x ∈ I) : ⁅x, y⁆ ∈ I :=
- by
- rw [← lie_skew, ← neg_lie]
- apply lie_mem_right
- assumption
+theorem lie_mem_left (I : LieIdeal R L) (x y : L) (h : x ∈ I) : ⁅x, y⁆ ∈ I := by
+ rw [← lie_skew, ← neg_lie]; apply lie_mem_right; assumption
#align lie_mem_left lie_mem_left
/-- An ideal of a Lie algebra is a Lie subalgebra. -/
def lieIdealSubalgebra (I : LieIdeal R L) : LieSubalgebra R L :=
- { I.toSubmodule with
- lie_mem' := by
- intro x y hx hy
- apply lie_mem_right
- exact hy }
+ { I.toSubmodule with lie_mem' := by intro x y hx hy; apply lie_mem_right; exact hy }
#align lie_ideal_subalgebra lieIdealSubalgebra
instance : Coe (LieIdeal R L) (LieSubalgebra R L) :=
@@ -324,11 +293,8 @@ theorem Submodule.exists_lieSubmodule_coe_eq_iff (p : Submodule R M) :
(∃ N : LieSubmodule R L M, ↑N = p) ↔ ∀ (x : L) (m : M), m ∈ p → ⁅x, m⁆ ∈ p :=
by
constructor
- · rintro ⟨N, rfl⟩ _ _
- exact N.lie_mem
- · intro h
- use { p with lie_mem := h }
- exact LieSubmodule.coe_to_submodule_mk p _
+ · rintro ⟨N, rfl⟩ _ _; exact N.lie_mem
+ · intro h; use { p with lie_mem := h }; exact LieSubmodule.coe_to_submodule_mk p _
#align submodule.exists_lie_submodule_coe_eq_iff Submodule.exists_lieSubmodule_coe_eq_iff
namespace LieSubalgebra
@@ -342,10 +308,7 @@ def toLieSubmodule : LieSubmodule R K L :=
#align lie_subalgebra.to_lie_submodule LieSubalgebra.toLieSubmodule
@[simp]
-theorem coe_toLieSubmodule : (K.toLieSubmodule : Submodule R L) = K :=
- by
- rcases K with ⟨⟨⟩⟩
- rfl
+theorem coe_toLieSubmodule : (K.toLieSubmodule : Submodule R L) = K := by rcases K with ⟨⟨⟩⟩; rfl
#align lie_subalgebra.coe_to_lie_submodule LieSubalgebra.coe_toLieSubmodule
variable {K}
@@ -367,10 +330,8 @@ theorem exists_nested_lieIdeal_coe_eq_iff {K' : LieSubalgebra R L} (h : K ≤ K'
by
simp only [exists_lie_ideal_coe_eq_iff, coe_bracket, mem_of_le]
constructor
- · intro h' x y hx hy
- exact h' ⟨x, hx⟩ ⟨y, h hy⟩ hy
- · rintro h' ⟨x, hx⟩ ⟨y, hy⟩ hy'
- exact h' x y hx hy'
+ · intro h' x y hx hy; exact h' ⟨x, hx⟩ ⟨y, h hy⟩ hy
+ · rintro h' ⟨x, hx⟩ ⟨y, hy⟩ hy'; exact h' x y hx hy'
#align lie_subalgebra.exists_nested_lie_ideal_coe_eq_iff LieSubalgebra.exists_nested_lieIdeal_coe_eq_iff
end LieSubalgebra
@@ -451,8 +412,7 @@ instance : InfSet (LieSubmodule R L M) :=
by
simp only [Submodule.mem_carrier, mem_Inter, Submodule.sInf_coe, mem_set_of_eq,
forall_apply_eq_imp_iff₂, exists_imp] at *
- intro N hN
- apply N.lie_mem (h N hN) }⟩
+ intro N hN; apply N.lie_mem (h N hN) }⟩
@[simp]
theorem inf_coe : (↑(N ⊓ N') : Set M) = N ∩ N' :=
@@ -478,10 +438,7 @@ theorem sInf_coe (S : Set (LieSubmodule R L M)) : (↑(sInf S) : Set M) = ⋂ s
theorem sInf_glb (S : Set (LieSubmodule R L M)) : IsGLB S (sInf S) :=
by
- have h : ∀ N N' : LieSubmodule R L M, (N : Set M) ≤ N' ↔ N ≤ N' :=
- by
- intros
- rfl
+ have h : ∀ N N' : LieSubmodule R L M, (N : Set M) ≤ N' ↔ N ≤ N' := by intros ; rfl
apply IsGLB.of_image h
simp only [Inf_coe]
exact isGLB_biInf
@@ -497,10 +454,7 @@ instance : CompleteLattice (LieSubmodule R L M) :=
le := (· ≤ ·)
lt := (· < ·)
bot := ⊥
- bot_le := fun N _ h => by
- rw [mem_bot] at h
- rw [h]
- exact N.zero_mem'
+ bot_le := fun N _ h => by rw [mem_bot] at h; rw [h]; exact N.zero_mem'
top := ⊤
le_top := fun _ _ _ => trivial
inf := (· ⊓ ·)
@@ -550,16 +504,11 @@ theorem mem_inf (x : M) : x ∈ N ⊓ N' ↔ x ∈ N ∧ x ∈ N' := by
Submodule.mem_inf]
#align lie_submodule.mem_inf LieSubmodule.mem_inf
-theorem mem_sup (x : M) : x ∈ N ⊔ N' ↔ ∃ y ∈ N, ∃ z ∈ N', y + z = x :=
- by
- rw [← mem_coe_submodule, sup_coe_to_submodule, Submodule.mem_sup]
- exact Iff.rfl
+theorem mem_sup (x : M) : x ∈ N ⊔ N' ↔ ∃ y ∈ N, ∃ z ∈ N', y + z = x := by
+ rw [← mem_coe_submodule, sup_coe_to_submodule, Submodule.mem_sup]; exact Iff.rfl
#align lie_submodule.mem_sup LieSubmodule.mem_sup
-theorem eq_bot_iff : N = ⊥ ↔ ∀ m : M, m ∈ N → m = 0 :=
- by
- rw [eq_bot_iff]
- exact Iff.rfl
+theorem eq_bot_iff : N = ⊥ ↔ ∀ m : M, m ∈ N → m = 0 := by rw [eq_bot_iff]; exact Iff.rfl
#align lie_submodule.eq_bot_iff LieSubmodule.eq_bot_iff
instance subsingleton_of_bot : Subsingleton (LieSubmodule R L ↥(⊥ : LieSubmodule R L M)) :=
@@ -672,24 +621,15 @@ def lieSpan : LieSubmodule R L M :=
variable {R L s}
-theorem mem_lieSpan {x : M} : x ∈ lieSpan R L s ↔ ∀ N : LieSubmodule R L M, s ⊆ N → x ∈ N :=
- by
- change x ∈ (lie_span R L s : Set M) ↔ _
- erw [Inf_coe]
- exact mem_Inter₂
+theorem mem_lieSpan {x : M} : x ∈ lieSpan R L s ↔ ∀ N : LieSubmodule R L M, s ⊆ N → x ∈ N := by
+ change x ∈ (lie_span R L s : Set M) ↔ _; erw [Inf_coe]; exact mem_Inter₂
#align lie_submodule.mem_lie_span LieSubmodule.mem_lieSpan
-theorem subset_lieSpan : s ⊆ lieSpan R L s :=
- by
- intro m hm
- erw [mem_lie_span]
- intro N hN
+theorem subset_lieSpan : s ⊆ lieSpan R L s := by intro m hm; erw [mem_lie_span]; intro N hN;
exact hN hm
#align lie_submodule.subset_lie_span LieSubmodule.subset_lieSpan
-theorem submodule_span_le_lieSpan : Submodule.span R s ≤ lieSpan R L s :=
- by
- rw [Submodule.span_le]
+theorem submodule_span_le_lieSpan : Submodule.span R s ≤ lieSpan R L s := by rw [Submodule.span_le];
apply subset_lie_span
#align lie_submodule.submodule_span_le_lie_span LieSubmodule.submodule_span_le_lieSpan
@@ -697,14 +637,10 @@ theorem lieSpan_le {N} : lieSpan R L s ≤ N ↔ s ⊆ N :=
by
constructor
· exact subset.trans subset_lie_span
- · intro hs m hm
- rw [mem_lie_span] at hm
- exact hm _ hs
+ · intro hs m hm; rw [mem_lie_span] at hm; exact hm _ hs
#align lie_submodule.lie_span_le LieSubmodule.lieSpan_le
-theorem lieSpan_mono {t : Set M} (h : s ⊆ t) : lieSpan R L s ≤ lieSpan R L t :=
- by
- rw [lie_span_le]
+theorem lieSpan_mono {t : Set M} (h : s ⊆ t) : lieSpan R L s ≤ lieSpan R L t := by rw [lie_span_le];
exact subset.trans h subset_lie_span
#align lie_submodule.lie_span_mono LieSubmodule.lieSpan_mono
@@ -716,9 +652,7 @@ theorem coe_lieSpan_submodule_eq_iff {p : Submodule R M} :
(lieSpan R L (p : Set M) : Submodule R M) = p ↔ ∃ N : LieSubmodule R L M, ↑N = p :=
by
rw [p.exists_lie_submodule_coe_eq_iff L]; constructor <;> intro h
- · intro x m hm
- rw [← h, mem_coe_submodule]
- exact lie_mem _ (subset_lie_span hm)
+ · intro x m hm; rw [← h, mem_coe_submodule]; exact lie_mem _ (subset_lie_span hm)
· rw [← coe_to_submodule_mk p h, coe_to_submodule, coe_to_submodule_eq_iff, lie_span_eq]
#align lie_submodule.coe_lie_span_submodule_eq_iff LieSubmodule.coe_lieSpan_submodule_eq_iff
@@ -782,12 +716,9 @@ of `M'`. -/
def map : LieSubmodule R L M' :=
{ (N : Submodule R M).map (f : M →ₗ[R] M') with
lie_mem := fun x m' h => by
- rcases h with ⟨m, hm, hfm⟩
- use ⁅x, m⁆
- constructor
+ rcases h with ⟨m, hm, hfm⟩; use ⁅x, m⁆; constructor
· apply N.lie_mem hm
- · norm_cast at hfm
- simp [hfm] }
+ · norm_cast at hfm; simp [hfm] }
#align lie_submodule.map LieSubmodule.map
@[simp]
@@ -799,9 +730,7 @@ theorem coeSubmodule_map : (N.map f : Submodule R M') = (N : Submodule R M).map
`M`. -/
def comap : LieSubmodule R L M :=
{ (N' : Submodule R M').comap (f : M →ₗ[R] M') with
- lie_mem := fun x m h => by
- suffices ⁅x, f m⁆ ∈ N' by simp [this]
- apply N'.lie_mem h }
+ lie_mem := fun x m h => by suffices ⁅x, f m⁆ ∈ N' by simp [this]; apply N'.lie_mem h }
#align lie_submodule.comap LieSubmodule.comap
@[simp]
@@ -874,17 +803,13 @@ Note that `f` makes `L'` into a Lie module over `L` (turning `f` into a morphism
and so this is a special case of `lie_submodule.comap` but we do not exploit this fact. -/
def comap : LieIdeal R L :=
{ (J : Submodule R L').comap (f : L →ₗ[R] L') with
- lie_mem := fun x y h => by
- suffices ⁅f x, f y⁆ ∈ J by simp [this]
- apply J.lie_mem h }
+ lie_mem := fun x y h => by suffices ⁅f x, f y⁆ ∈ J by simp [this]; apply J.lie_mem h }
#align lie_ideal.comap LieIdeal.comap
@[simp]
theorem map_coeSubmodule (h : ↑(map f I) = f '' I) :
- (map f I : Submodule R L') = (I : Submodule R L).map (f : L →ₗ[R] L') :=
- by
- rw [SetLike.ext'_iff, LieSubmodule.coe_to_submodule, h, Submodule.map_coe]
- rfl
+ (map f I : Submodule R L') = (I : Submodule R L).map (f : L →ₗ[R] L') := by
+ rw [SetLike.ext'_iff, LieSubmodule.coe_to_submodule, h, Submodule.map_coe]; rfl
#align lie_ideal.map_coe_submodule LieIdeal.map_coeSubmodule
@[simp]
@@ -899,10 +824,7 @@ theorem map_le : map f I ≤ J ↔ f '' I ⊆ J :=
variable {f I I₂ J}
-theorem mem_map {x : L} (hx : x ∈ I) : f x ∈ map f I :=
- by
- apply LieSubmodule.subset_lieSpan
- use x
+theorem mem_map {x : L} (hx : x ∈ I) : f x ∈ map f I := by apply LieSubmodule.subset_lieSpan; use x;
exact ⟨hx, rfl⟩
#align lie_ideal.mem_map LieIdeal.mem_map
@@ -911,9 +833,7 @@ theorem mem_comap {x : L} : x ∈ comap f J ↔ f x ∈ J :=
Iff.rfl
#align lie_ideal.mem_comap LieIdeal.mem_comap
-theorem map_le_iff_le_comap : map f I ≤ J ↔ I ≤ comap f J :=
- by
- rw [map_le]
+theorem map_le_iff_le_comap : map f I ≤ J ↔ I ≤ comap f J := by rw [map_le];
exact Set.image_subset_iff
#align lie_ideal.map_le_iff_le_comap LieIdeal.map_le_iff_le_comap
@@ -929,30 +849,20 @@ theorem map_sup : (I ⊔ I₂).map f = I.map f ⊔ I₂.map f :=
(gc_map_comap f).l_sup
#align lie_ideal.map_sup LieIdeal.map_sup
-theorem map_comap_le : map f (comap f J) ≤ J :=
- by
- rw [map_le_iff_le_comap]
- exact le_rfl
+theorem map_comap_le : map f (comap f J) ≤ J := by rw [map_le_iff_le_comap]; exact le_rfl
#align lie_ideal.map_comap_le LieIdeal.map_comap_le
/-- See also `lie_ideal.map_comap_eq`. -/
-theorem comap_map_le : I ≤ comap f (map f I) :=
- by
- rw [← map_le_iff_le_comap]
- exact le_rfl
+theorem comap_map_le : I ≤ comap f (map f I) := by rw [← map_le_iff_le_comap]; exact le_rfl
#align lie_ideal.comap_map_le LieIdeal.comap_map_le
@[mono]
-theorem map_mono : Monotone (map f) := fun I₁ I₂ h =>
- by
- rw [SetLike.le_def] at h
+theorem map_mono : Monotone (map f) := fun I₁ I₂ h => by rw [SetLike.le_def] at h;
apply LieSubmodule.lieSpan_mono (Set.image_subset (⇑f) h)
#align lie_ideal.map_mono LieIdeal.map_mono
@[mono]
-theorem comap_mono : Monotone (comap f) := fun J₁ J₂ h =>
- by
- rw [← SetLike.coe_subset_coe] at h⊢
+theorem comap_mono : Monotone (comap f) := fun J₁ J₂ h => by rw [← SetLike.coe_subset_coe] at h⊢;
exact Set.preimage_mono h
#align lie_ideal.comap_mono LieIdeal.comap_mono
@@ -960,8 +870,7 @@ theorem map_of_image (h : f '' I = J) : I.map f = J :=
by
apply le_antisymm
· erw [LieSubmodule.lieSpan_le, Submodule.map_coe, h]
- · rw [← SetLike.coe_subset_coe, ← h]
- exact LieSubmodule.subset_lieSpan
+ · rw [← SetLike.coe_subset_coe, ← h]; exact LieSubmodule.subset_lieSpan
#align lie_ideal.map_of_image LieIdeal.map_of_image
/-- Note that this is not a special case of `lie_submodule.subsingleton_of_bot`. Indeed, given
@@ -997,11 +906,8 @@ theorem idealRange_eq_lieSpan_range : f.idealRange = LieSubmodule.lieSpan R L' f
rfl
#align lie_hom.ideal_range_eq_lie_span_range LieHom.idealRange_eq_lieSpan_range
-theorem idealRange_eq_map : f.idealRange = LieIdeal.map f ⊤ :=
- by
- ext
- simp only [ideal_range, range_eq_map]
- rfl
+theorem idealRange_eq_map : f.idealRange = LieIdeal.map f ⊤ := by ext;
+ simp only [ideal_range, range_eq_map]; rfl
#align lie_hom.ideal_range_eq_map LieHom.idealRange_eq_map
/-- The condition that the image of a morphism of Lie algebras is an ideal. -/
@@ -1022,14 +928,8 @@ theorem isIdealMorphism_iff : f.IsIdealMorphism ↔ ∀ (x : L') (y : L), ∃ z
LieSubalgebra.mem_coe_submodule, mem_range, exists_imp,
Submodule.exists_lieSubmodule_coe_eq_iff]
constructor
- · intro h x y
- obtain ⟨z, hz⟩ := h x (f y) y rfl
- use z
- exact hz.symm
- · intro h x y z hz
- obtain ⟨w, hw⟩ := h x z
- use w
- rw [← hw, hz]
+ · intro h x y; obtain ⟨z, hz⟩ := h x (f y) y rfl; use z; exact hz.symm
+ · intro h x y z hz; obtain ⟨w, hw⟩ := h x z; use w; rw [← hw, hz]
#align lie_hom.is_ideal_morphism_iff LieHom.isIdealMorphism_iff
theorem range_subset_idealRange : (f.range : Set L') ⊆ f.idealRange :=
@@ -1073,11 +973,8 @@ theorem mem_idealRange_iff (h : IsIdealMorphism f) {y : L'} : y ∈ idealRange f
theorem le_ker_iff : I ≤ f.ker ↔ ∀ x, x ∈ I → f x = 0 :=
by
constructor <;> intro h x hx
- · specialize h hx
- rw [mem_ker] at h
- exact h
- · rw [mem_ker]
- apply h x hx
+ · specialize h hx; rw [mem_ker] at h; exact h
+ · rw [mem_ker]; apply h x hx
#align lie_hom.le_ker_iff LieHom.le_ker_iff
theorem ker_eq_bot : f.ker = ⊥ ↔ Function.Injective f := by
@@ -1119,9 +1016,7 @@ namespace LieIdeal
variable {f : L →ₗ⁅R⁆ L'} {I : LieIdeal R L} {J : LieIdeal R L'}
@[simp]
-theorem map_eq_bot_iff : I.map f = ⊥ ↔ I ≤ f.ker :=
- by
- rw [← le_bot_iff]
+theorem map_eq_bot_iff : I.map f = ⊥ ↔ I ≤ f.ker := by rw [← le_bot_iff];
exact LieIdeal.map_le_iff_le_comap
#align lie_ideal.map_eq_bot_iff LieIdeal.map_eq_bot_iff
@@ -1185,26 +1080,19 @@ theorem map_sup_ker_eq_map : LieIdeal.map f (I ⊔ f.ker) = LieIdeal.map f I :=
suffices LieIdeal.map f (I ⊔ f.ker) ≤ LieIdeal.map f I by
exact le_antisymm this (LieIdeal.map_mono le_sup_left)
apply LieSubmodule.lieSpan_mono
- rintro x ⟨y, hy₁, hy₂⟩
- rw [← hy₂]
- erw [LieSubmodule.mem_sup] at hy₁
- obtain ⟨z₁, hz₁, z₂, hz₂, hy⟩ := hy₁
- rw [← hy]
- rw [f.coe_to_linear_map, f.map_add, f.mem_ker.mp hz₂, add_zero]
- exact ⟨z₁, hz₁, rfl⟩
+ rintro x ⟨y, hy₁, hy₂⟩; rw [← hy₂]
+ erw [LieSubmodule.mem_sup] at hy₁; obtain ⟨z₁, hz₁, z₂, hz₂, hy⟩ := hy₁; rw [← hy]
+ rw [f.coe_to_linear_map, f.map_add, f.mem_ker.mp hz₂, add_zero]; exact ⟨z₁, hz₁, rfl⟩
#align lie_ideal.map_sup_ker_eq_map LieIdeal.map_sup_ker_eq_map
@[simp]
theorem map_comap_eq (h : f.IsIdealMorphism) : map f (comap f J) = f.idealRange ⊓ J :=
by
apply le_antisymm
- · rw [le_inf_iff]
- exact ⟨f.map_le_ideal_range _, map_comap_le⟩
+ · rw [le_inf_iff]; exact ⟨f.map_le_ideal_range _, map_comap_le⟩
· rw [f.is_ideal_morphism_def] at h
rw [← SetLike.coe_subset_coe, LieSubmodule.inf_coe, ← coe_to_subalgebra, h]
- rintro y ⟨⟨x, h₁⟩, h₂⟩
- rw [← h₁] at h₂⊢
- exact mem_map h₂
+ rintro y ⟨⟨x, h₁⟩, h₂⟩; rw [← h₁] at h₂⊢; exact mem_map h₂
#align lie_ideal.map_comap_eq LieIdeal.map_comap_eq
@[simp]
@@ -1307,10 +1195,7 @@ theorem ker_id : (LieModuleHom.id : M →ₗ⁅R,L⁆ M).ker = ⊥ :=
#align lie_module_hom.ker_id LieModuleHom.ker_id
@[simp]
-theorem comp_ker_incl : f.comp f.ker.incl = 0 :=
- by
- ext ⟨m, hm⟩
- exact (mem_ker m).mp hm
+theorem comp_ker_incl : f.comp f.ker.incl = 0 := by ext ⟨m, hm⟩; exact (mem_ker m).mp hm
#align lie_module_hom.comp_ker_incl LieModuleHom.comp_ker_incl
theorem le_ker_iff_map (M' : LieSubmodule R L M) : M' ≤ f.ker ↔ LieSubmodule.map f M' = ⊥ := by
@@ -1340,10 +1225,7 @@ theorem mem_range (n : N) : n ∈ f.range ↔ ∃ m, f m = n :=
Iff.rfl
#align lie_module_hom.mem_range LieModuleHom.mem_range
-theorem map_top : LieSubmodule.map f ⊤ = f.range :=
- by
- ext
- simp [LieSubmodule.mem_map]
+theorem map_top : LieSubmodule.map f ⊤ = f.range := by ext; simp [LieSubmodule.mem_map]
#align lie_module_hom.map_top LieModuleHom.map_top
end LieModuleHom
@@ -1385,9 +1267,7 @@ def LieSubalgebra.topEquiv : (⊤ : LieSubalgebra R L) ≃ₗ⁅R⁆ L :=
{
(⊤ : LieSubalgebra R L).incl with
invFun := fun x => ⟨x, Set.mem_univ x⟩
- left_inv := fun x => by
- ext
- rfl
+ left_inv := fun x => by ext; rfl
right_inv := fun x => rfl }
#align lie_subalgebra.top_equiv LieSubalgebra.topEquiv
mathlib commit https://github.com/leanprover-community/mathlib/commit/e3fb84046afd187b710170887195d50bada934ee
@@ -445,11 +445,11 @@ instance : Inf (LieSubmodule R L M) :=
instance : InfSet (LieSubmodule R L M) :=
⟨fun S =>
{
- infₛ
+ sInf
"./././Mathport/Syntax/Translate/Expr.lean:366:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" with
lie_mem := fun x m h =>
by
- simp only [Submodule.mem_carrier, mem_Inter, Submodule.infₛ_coe, mem_set_of_eq,
+ simp only [Submodule.mem_carrier, mem_Inter, Submodule.sInf_coe, mem_set_of_eq,
forall_apply_eq_imp_iff₂, exists_imp] at *
intro N hN
apply N.lie_mem (h N hN) }⟩
@@ -461,22 +461,22 @@ theorem inf_coe : (↑(N ⊓ N') : Set M) = N ∩ N' :=
/- ./././Mathport/Syntax/Translate/Expr.lean:366:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
@[simp]
-theorem infₛ_coe_to_submodule (S : Set (LieSubmodule R L M)) :
- (↑(infₛ S) : Submodule R M) =
- infₛ
+theorem sInf_coe_to_submodule (S : Set (LieSubmodule R L M)) :
+ (↑(sInf S) : Submodule R M) =
+ sInf
"./././Mathport/Syntax/Translate/Expr.lean:366:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" :=
rfl
-#align lie_submodule.Inf_coe_to_submodule LieSubmodule.infₛ_coe_to_submodule
+#align lie_submodule.Inf_coe_to_submodule LieSubmodule.sInf_coe_to_submodule
@[simp]
-theorem infₛ_coe (S : Set (LieSubmodule R L M)) : (↑(infₛ S) : Set M) = ⋂ s ∈ S, (s : Set M) :=
+theorem sInf_coe (S : Set (LieSubmodule R L M)) : (↑(sInf S) : Set M) = ⋂ s ∈ S, (s : Set M) :=
by
- rw [← LieSubmodule.coe_to_submodule, Inf_coe_to_submodule, Submodule.infₛ_coe]
+ rw [← LieSubmodule.coe_to_submodule, Inf_coe_to_submodule, Submodule.sInf_coe]
ext m
simpa only [mem_Inter, mem_set_of_eq, forall_apply_eq_imp_iff₂, exists_imp]
-#align lie_submodule.Inf_coe LieSubmodule.infₛ_coe
+#align lie_submodule.Inf_coe LieSubmodule.sInf_coe
-theorem infₛ_glb (S : Set (LieSubmodule R L M)) : IsGLB S (infₛ S) :=
+theorem sInf_glb (S : Set (LieSubmodule R L M)) : IsGLB S (sInf S) :=
by
have h : ∀ N N' : LieSubmodule R L M, (N : Set M) ≤ N' ↔ N ≤ N' :=
by
@@ -484,8 +484,8 @@ theorem infₛ_glb (S : Set (LieSubmodule R L M)) : IsGLB S (infₛ S) :=
rfl
apply IsGLB.of_image h
simp only [Inf_coe]
- exact isGLB_binfᵢ
-#align lie_submodule.Inf_glb LieSubmodule.infₛ_glb
+ exact isGLB_biInf
+#align lie_submodule.Inf_glb LieSubmodule.sInf_glb
/-- The set of Lie submodules of a Lie module form a complete lattice.
@@ -493,7 +493,7 @@ We provide explicit values for the fields `bot`, `top`, `inf` to get more conven
than we would otherwise obtain from `complete_lattice_of_Inf`. -/
instance : CompleteLattice (LieSubmodule R L M) :=
{ SetLike.partialOrder,
- completeLatticeOfInf _ infₛ_glb with
+ completeLatticeOfInf _ sInf_glb with
le := (· ≤ ·)
lt := (· < ·)
bot := ⊥
@@ -531,7 +531,7 @@ theorem sup_coe_to_submodule :
simp only [Submodule.mem_sup]
rintro x m ⟨y, hy, z, hz, rfl⟩
refine' ⟨⁅x, y⁆, N.lie_mem hy, ⁅x, z⁆, N'.lie_mem hz, (lie_add _ _ _).symm⟩
- refine' le_antisymm (infₛ_le ⟨{ (N ⊔ N' : Submodule R M) with lie_mem := aux }, _⟩) _
+ refine' le_antisymm (sInf_le ⟨{ (N ⊔ N' : Submodule R M) with lie_mem := aux }, _⟩) _
·
simp only [exists_prop, and_true_iff, mem_set_of_eq, eq_self_iff_true, coe_to_submodule_mk, ←
coe_submodule_le_coe_submodule, and_self_iff, le_sup_left, le_sup_right]
@@ -667,7 +667,7 @@ variable (R L) (s : Set M)
/-- The `lie_span` of a set `s ⊆ M` is the smallest Lie submodule of `M` that contains `s`. -/
def lieSpan : LieSubmodule R L M :=
- infₛ { N | s ⊆ N }
+ sInf { N | s ⊆ N }
#align lie_submodule.lie_span LieSubmodule.lieSpan
variable {R L s}
@@ -753,9 +753,9 @@ theorem span_union (s t : Set M) : lieSpan R L (s ∪ t) = lieSpan R L s ⊔ lie
(LieSubmodule.gi R L M).gc.l_sup
#align lie_submodule.span_union LieSubmodule.span_union
-theorem span_unionᵢ {ι} (s : ι → Set M) : lieSpan R L (⋃ i, s i) = ⨆ i, lieSpan R L (s i) :=
- (LieSubmodule.gi R L M).gc.l_supᵢ
-#align lie_submodule.span_Union LieSubmodule.span_unionᵢ
+theorem span_iUnion {ι} (s : ι → Set M) : lieSpan R L (⋃ i, s i) = ⨆ i, lieSpan R L (s i) :=
+ (LieSubmodule.gi R L M).gc.l_iSup
+#align lie_submodule.span_Union LieSubmodule.span_iUnion
end LieSpan
mathlib commit https://github.com/leanprover-community/mathlib/commit/4c586d291f189eecb9d00581aeb3dd998ac34442
@@ -441,12 +441,12 @@ instance : Inf (LieSubmodule R L M) :=
{ (N ⊓ N' : Submodule R M) with
lie_mem := fun x m h => mem_inter (N.lie_mem h.1) (N'.lie_mem h.2) }⟩
-/- ./././Mathport/Syntax/Translate/Expr.lean:370:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
+/- ./././Mathport/Syntax/Translate/Expr.lean:366:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
instance : InfSet (LieSubmodule R L M) :=
⟨fun S =>
{
infₛ
- "./././Mathport/Syntax/Translate/Expr.lean:370:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" with
+ "./././Mathport/Syntax/Translate/Expr.lean:366:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" with
lie_mem := fun x m h =>
by
simp only [Submodule.mem_carrier, mem_Inter, Submodule.infₛ_coe, mem_set_of_eq,
@@ -459,12 +459,12 @@ theorem inf_coe : (↑(N ⊓ N') : Set M) = N ∩ N' :=
rfl
#align lie_submodule.inf_coe LieSubmodule.inf_coe
-/- ./././Mathport/Syntax/Translate/Expr.lean:370:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
+/- ./././Mathport/Syntax/Translate/Expr.lean:366:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S} -/
@[simp]
theorem infₛ_coe_to_submodule (S : Set (LieSubmodule R L M)) :
(↑(infₛ S) : Submodule R M) =
infₛ
- "./././Mathport/Syntax/Translate/Expr.lean:370:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" :=
+ "./././Mathport/Syntax/Translate/Expr.lean:366:4: unsupported set replacement {((s : submodule R M)) | s «expr ∈ » S}" :=
rfl
#align lie_submodule.Inf_coe_to_submodule LieSubmodule.infₛ_coe_to_submodule
mathlib commit https://github.com/leanprover-community/mathlib/commit/9da1b3534b65d9661eb8f42443598a92bbb49211
@@ -436,7 +436,7 @@ theorem mem_top (x : M) : x ∈ (⊤ : LieSubmodule R L M) :=
mem_univ x
#align lie_submodule.mem_top LieSubmodule.mem_top
-instance : HasInf (LieSubmodule R L M) :=
+instance : Inf (LieSubmodule R L M) :=
⟨fun N N' =>
{ (N ⊓ N' : Submodule R M) with
lie_mem := fun x m h => mem_inter (N.lie_mem h.1) (N'.lie_mem h.2) }⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/eb0cb4511aaef0da2462207b67358a0e1fe1e2ee
@@ -1135,7 +1135,7 @@ theorem coe_map_of_surjective (h : Function.Surjective f) :
have hy' : ∃ x : L, x ∈ I ∧ f x = y := by simpa [hy]
obtain ⟨z₂, hz₂, rfl⟩ := hy'
obtain ⟨z₁, rfl⟩ := h x
- simp only [LieHom.coe_to_linearMap, SetLike.mem_coe, Set.mem_image,
+ simp only [LieHom.coe_toLinearMap, SetLike.mem_coe, Set.mem_image,
LieSubmodule.mem_coeSubmodule, Submodule.mem_carrier, Submodule.map_coe]
use ⁅z₁, z₂⁆
exact ⟨I.lie_mem hz₂, f.map_lie z₁ z₂⟩ }
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
This finishes the proof that all derivations in a finite-dimensional Lie algebra with non-degenerate Killing form are inner derivations, a project discussed in this thread with @ocfnash.
Co-authored-by: Oliver Nash <github@olivernash.org>
@@ -1114,6 +1114,9 @@ theorem isIdealMorphism_def : f.IsIdealMorphism ↔ (f.idealRange : LieSubalgebr
Iff.rfl
#align lie_hom.is_ideal_morphism_def LieHom.isIdealMorphism_def
+variable {f} in
+theorem IsIdealMorphism.eq (hf : f.IsIdealMorphism) : f.idealRange = f.range := hf
+
theorem isIdealMorphism_iff : f.IsIdealMorphism ↔ ∀ (x : L') (y : L), ∃ z : L, ⁅x, f y⁆ = f z := by
simp only [isIdealMorphism_def, idealRange_eq_lieSpan_range, ←
LieSubalgebra.coe_to_submodule_eq_iff, ← f.range.coe_to_submodule,
iSup
to Sort (#12114)
This breaks a few simp
proofs which were expecting these lemmas to apply to the data binders but not the prop binders.
@@ -547,7 +547,7 @@ theorem independent_iff_coe_toSubmodule {ι : Type*} {N : ι → LieSubmodule R
CompleteLattice.Independent N ↔ CompleteLattice.Independent fun i ↦ (N i : Submodule R M) := by
simp [CompleteLattice.independent_def, disjoint_iff_coe_toSubmodule]
-theorem iSup_eq_top_iff_coe_toSubmodule {ι : Type*} {N : ι → LieSubmodule R L M} :
+theorem iSup_eq_top_iff_coe_toSubmodule {ι : Sort*} {N : ι → LieSubmodule R L M} :
⨆ i, N i = ⊤ ↔ ⨆ i, (N i : Submodule R M) = ⊤ := by
rw [← iSup_coe_toSubmodule, ← top_coeSubmodule (L := L), coe_toSubmodule_eq_iff]
This defines the adjoint action of a Lie algebra L
on itself, when seen as an homomorphism of Lie algebras from L
to the Lie algebra of its derivations.
The adjoint action was also defined in the Mathlib.Algebra.Lie.OfAssociative.lean
file, under the name LieAlgebra.ad
, as the homomorphism with values in the endormophisms of L
. We make the link between both. This design choice was discussed in this thread.
We also establish elementary properties, such as the fact that the image of the adjoint action is an ideal of the derivations.
This is the penultimate step towards proving that all derivations of a finite-dimensional semisimple Lie algebra are inner, a goal described in this thread.
@@ -1104,7 +1104,7 @@ theorem idealRange_eq_map : f.idealRange = LieIdeal.map f ⊤ := by
rfl
#align lie_hom.ideal_range_eq_map LieHom.idealRange_eq_map
-/-- The condition that the image of a morphism of Lie algebras is an ideal. -/
+/-- The condition that the range of a morphism of Lie algebras is an ideal. -/
def IsIdealMorphism : Prop :=
(f.idealRange : LieSubalgebra R L') = f.range
#align lie_hom.is_ideal_morphism LieHom.IsIdealMorphism
@@ -1149,7 +1149,7 @@ theorem mem_ker {x : L} : x ∈ ker f ↔ f x = 0 :=
simp only [ker_coeSubmodule, LinearMap.mem_ker, coe_toLinearMap]
#align lie_hom.mem_ker LieHom.mem_ker
-theorem mem_idealRange {x : L} : f x ∈ idealRange f := by
+theorem mem_idealRange (x : L) : f x ∈ idealRange f := by
rw [idealRange_eq_map]
exact LieIdeal.mem_map (LieSubmodule.mem_top x)
#align lie_hom.mem_ideal_range LieHom.mem_idealRange
Purely automatic replacement. If this is in any way controversial; I'm happy to just close this PR.
@@ -665,7 +665,8 @@ theorem injective_incl : Function.Injective N.incl := Subtype.coe_injective
variable {N N'} (h : N ≤ N')
-/-- Given two nested Lie submodules `N ⊆ N'`, the inclusion `N ↪ N'` is a morphism of Lie modules.-/
+/-- Given two nested Lie submodules `N ⊆ N'`,
+the inclusion `N ↪ N'` is a morphism of Lie modules. -/
def inclusion : N →ₗ⁅R,L⁆ N' where
__ := Submodule.inclusion (show N.toSubmodule ≤ N'.toSubmodule from h)
map_lie' := rfl
Empty lines were removed by executing the following Python script twice
import os
import re
# Loop through each file in the repository
for dir_path, dirs, files in os.walk('.'):
for filename in files:
if filename.endswith('.lean'):
file_path = os.path.join(dir_path, filename)
# Open the file and read its contents
with open(file_path, 'r') as file:
content = file.read()
# Use a regular expression to replace sequences of "variable" lines separated by empty lines
# with sequences without empty lines
modified_content = re.sub(r'(variable.*\n)\n(variable(?! .* in))', r'\1\2', content)
# Write the modified content back to the file
with open(file_path, 'w') as file:
file.write(modified_content)
@@ -38,9 +38,7 @@ universe u v w w₁ w₂
section LieSubmodule
variable (R : Type u) (L : Type v) (M : Type w)
-
variable [CommRing R] [LieRing L] [LieAlgebra R L] [AddCommGroup M] [Module R M]
-
variable [LieRingModule L M] [LieModule R L M]
/-- A Lie submodule of a Lie module is a submodule that is closed under the Lie bracket.
@@ -340,11 +338,8 @@ end LieSubmodule
namespace LieSubmodule
variable {R : Type u} {L : Type v} {M : Type w}
-
variable [CommRing R] [LieRing L] [LieAlgebra R L] [AddCommGroup M] [Module R M]
-
variable [LieRingModule L M] [LieModule R L M]
-
variable (N N' : LieSubmodule R L M) (I J : LieIdeal R L)
section LatticeStructure
@@ -810,11 +805,8 @@ end LieSubmodule
section LieSubmoduleMapAndComap
variable {R : Type u} {L : Type v} {L' : Type w₂} {M : Type w} {M' : Type w₁}
-
variable [CommRing R] [LieRing L] [LieAlgebra R L] [LieRing L'] [LieAlgebra R L']
-
variable [AddCommGroup M] [Module R M] [LieRingModule L M] [LieModule R L M]
-
variable [AddCommGroup M'] [Module R M'] [LieRingModule L M'] [LieModule R L M']
namespace LieSubmodule
@@ -1356,13 +1348,9 @@ end LieSubmoduleMapAndComap
namespace LieModuleHom
variable {R : Type u} {L : Type v} {M : Type w} {N : Type w₁}
-
variable [CommRing R] [LieRing L] [LieAlgebra R L]
-
variable [AddCommGroup M] [Module R M] [LieRingModule L M] [LieModule R L M]
-
variable [AddCommGroup N] [Module R N] [LieRingModule L N] [LieModule R L N]
-
variable (f : M →ₗ⁅R,L⁆ N)
/-- The kernel of a morphism of Lie algebras, as an ideal in the domain. -/
@@ -1448,11 +1436,8 @@ end LieModuleHom
namespace LieSubmodule
variable {R : Type u} {L : Type v} {M : Type w}
-
variable [CommRing R] [LieRing L] [LieAlgebra R L]
-
variable [AddCommGroup M] [Module R M] [LieRingModule L M] [LieModule R L M]
-
variable (N : LieSubmodule R L M)
@[simp]
@@ -1495,7 +1480,6 @@ end LieSubmodule
section TopEquiv
variable {R : Type u} {L : Type v}
-
variable [CommRing R] [LieRing L] [LieAlgebra R L]
/-- The natural equivalence between the 'top' Lie subalgebra and the enclosing Lie algebra.
nsmul
and zsmul
to default automatically (#6262)
This PR removes the default values for nsmul
and zsmul
, forcing the user to populate them manually.
The previous behavior can be obtained by writing nsmul := nsmulRec
and zsmul := zsmulRec
, which is now in the docstring for these fields.
The motivation here is to make it more obvious when module diamonds are being introduced, or at least where they might be hiding; you can now simply search for nsmulRec
in the source code.
Arguably we should do the same thing for intCast
, natCast
, pow
, and zpow
too, but diamonds are less common in those fields, so I'll leave them to a subsequent PR.
Co-authored-by: Matthew Ballard <matt@mrb.email>
@@ -556,13 +556,16 @@ theorem iSup_eq_top_iff_coe_toSubmodule {ι : Type*} {N : ι → LieSubmodule R
⨆ i, N i = ⊤ ↔ ⨆ i, (N i : Submodule R M) = ⊤ := by
rw [← iSup_coe_toSubmodule, ← top_coeSubmodule (L := L), coe_toSubmodule_eq_iff]
+instance : Add (LieSubmodule R L M) where add := Sup.sup
+
+instance : Zero (LieSubmodule R L M) where zero := ⊥
+
instance : AddCommMonoid (LieSubmodule R L M) where
- add := (· ⊔ ·)
add_assoc := sup_assoc
- zero := ⊥
zero_add := bot_sup_eq
add_zero := sup_bot_eq
add_comm := sup_comm
+ nsmul := nsmulRec
@[simp]
theorem add_eq_sup : N + N' = N ⊔ N' :=
Those lemmas have historically been very annoying to use in rw
since all their arguments were implicit. One too many people complained about it on Zulip, so I'm changing them.
Downstream code broken by this change can fix it by adding appropriately many _
s.
Also marks CauSeq.ext
@[ext]
.
Order.BoundedOrder
top_sup_eq
sup_top_eq
bot_sup_eq
sup_bot_eq
top_inf_eq
inf_top_eq
bot_inf_eq
inf_bot_eq
Order.Lattice
sup_idem
sup_comm
sup_assoc
sup_left_idem
sup_right_idem
inf_idem
inf_comm
inf_assoc
inf_left_idem
inf_right_idem
sup_inf_left
sup_inf_right
inf_sup_left
inf_sup_right
Order.MinMax
max_min_distrib_left
max_min_distrib_right
min_max_distrib_left
min_max_distrib_right
Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -558,11 +558,11 @@ theorem iSup_eq_top_iff_coe_toSubmodule {ι : Type*} {N : ι → LieSubmodule R
instance : AddCommMonoid (LieSubmodule R L M) where
add := (· ⊔ ·)
- add_assoc _ _ _ := sup_assoc
+ add_assoc := sup_assoc
zero := ⊥
- zero_add _ := bot_sup_eq
- add_zero _ := sup_bot_eq
- add_comm _ _ := sup_comm
+ zero_add := bot_sup_eq
+ add_zero := sup_bot_eq
+ add_comm := sup_comm
@[simp]
theorem add_eq_sup : N + N' = N ⊔ N' :=
refine
s (#10762)
I replaced a few "terminal" refine/refine'
s with exact
.
The strategy was very simple-minded: essentially any refine
whose following line had smaller indentation got replaced by exact
and then I cleaned up the mess.
This PR certainly leaves some further terminal refine
s, but maybe the current change is beneficial.
@@ -536,7 +536,7 @@ theorem iSup_induction' {ι} (N : ι → LieSubmodule R L M) {C : (x : M) → (x
· exact ⟨_, hN _ _ hx⟩
· exact ⟨_, h0⟩
· rintro ⟨_, Cx⟩ ⟨_, Cy⟩
- refine' ⟨_, hadd _ _ _ _ Cx Cy⟩
+ exact ⟨_, hadd _ _ _ _ Cx Cy⟩
theorem disjoint_iff_coe_toSubmodule :
Disjoint N N' ↔ Disjoint (N : Submodule R M) (N' : Submodule R M) := by
@@ -89,7 +89,7 @@ theorem coe_toSubmodule : ((N : Submodule R M) : Set M) = N :=
rfl
#align lie_submodule.coe_to_submodule LieSubmodule.coe_toSubmodule
--- Porting note: `simp` can prove this after `mem_coeSubmodule` is added to the simp set,
+-- Porting note (#10618): `simp` can prove this after `mem_coeSubmodule` is added to the simp set,
-- but `dsimp` can't.
@[simp, nolint simpNF]
theorem mem_carrier {x : M} : x ∈ N.carrier ↔ x ∈ (N : Set M) :=
@@ -120,7 +120,7 @@ protected theorem zero_mem : (0 : M) ∈ N :=
zero_mem N
#align lie_submodule.zero_mem LieSubmodule.zero_mem
--- Porting note: @[simp] can prove this
+-- Porting note (#10618): @[simp] can prove this
theorem mk_eq_zero {x} (h : x ∈ N) : (⟨x, h⟩ : N) = 0 ↔ x = 0 :=
Subtype.ext_iff_val
#align lie_submodule.mk_eq_zero LieSubmodule.mk_eq_zero
@@ -66,6 +66,9 @@ instance : AddSubgroupClass (LieSubmodule R L M) M where
zero_mem N := N.zero_mem'
neg_mem {N} x hx := show -x ∈ N.toSubmodule from neg_mem hx
+instance instSmulMemClass : SMulMemClass (LieSubmodule R L M) R M where
+ smul_mem {s} c _ h := s.smul_mem' c h
+
/-- The zero module is a Lie submodule of any Lie module. -/
instance : Zero (LieSubmodule R L M) :=
⟨{ (0 : Submodule R M) with
@@ -1424,6 +1424,19 @@ theorem map_top : LieSubmodule.map f ⊤ = f.range := by ext; simp [LieSubmodule
theorem range_eq_top : f.range = ⊤ ↔ Function.Surjective f := by
rw [SetLike.ext'_iff, coe_range, LieSubmodule.top_coe, Set.range_iff_surjective]
+/-- A morphism of Lie modules `f : M → N` whose values lie in a Lie submodule `P ⊆ N` can be
+restricted to a morphism of Lie modules `M → P`. -/
+def codRestrict (P : LieSubmodule R L N) (f : M →ₗ⁅R,L⁆ N) (h : ∀ m, f m ∈ P) :
+ M →ₗ⁅R,L⁆ P where
+ toFun := f.toLinearMap.codRestrict P h
+ __ := f.toLinearMap.codRestrict P h
+ map_lie' {x m} := by ext; simp
+
+@[simp]
+lemma codRestrict_apply (P : LieSubmodule R L N) (f : M →ₗ⁅R,L⁆ N) (h : ∀ m, f m ∈ P) (m : M) :
+ (f.codRestrict P h m : N) = f m :=
+ rfl
+
end LieModuleHom
namespace LieSubmodule
The FunLike hierarchy is very big and gets scanned through each time we need a coercion (via the CoeFun
instance). It looks like unbundled inheritance suits Lean 4 better here. The only class that still extends FunLike
is EquivLike
, since that has a custom coe_injective'
field that is easier to implement. All other classes should take FunLike
or EquivLike
as a parameter.
Previously, morphism classes would be Type
-valued and extend FunLike
:
/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type*) (A B : outParam <| Type*) [MyClass A] [MyClass B]
extends FunLike F A B :=
(map_op : ∀ (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))
After this PR, they should be Prop
-valued and take FunLike
as a parameter:
/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type*) (A B : outParam <| Type*) [MyClass A] [MyClass B]
[FunLike F A B] : Prop :=
(map_op : ∀ (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))
(Note that A B
stay marked as outParam
even though they are not purely required to be so due to the FunLike
parameter already filling them in. This is required to see through type synonyms, which is important in the category theory library. Also, I think keeping them as outParam
is slightly faster.)
Similarly, MyEquivClass
should take EquivLike
as a parameter.
As a result, every mention of [MyHomClass F A B]
should become [FunLike F A B] [MyHomClass F A B]
.
While overall this gives some great speedups, there are some cases that are noticeably slower. In particular, a failing application of a lemma such as map_mul
is more expensive. This is due to suboptimal processing of arguments. For example:
variable [FunLike F M N] [Mul M] [Mul N] (f : F) (x : M) (y : M)
theorem map_mul [MulHomClass F M N] : f (x * y) = f x * f y
example [AddHomClass F A B] : f (x * y) = f x * f y := map_mul f _ _
Before this PR, applying map_mul f
gives the goals [Mul ?M] [Mul ?N] [MulHomClass F ?M ?N]
. Since M
and N
are out_param
s, [MulHomClass F ?M ?N]
is synthesized first, supplies values for ?M
and ?N
and then the Mul M
and Mul N
instances can be found.
After this PR, the goals become [FunLike F ?M ?N] [Mul ?M] [Mul ?N] [MulHomClass F ?M ?N]
. Now [FunLike F ?M ?N]
is synthesized first, supplies values for ?M
and ?N
and then the Mul M
and Mul N
instances can be found, before trying MulHomClass F M N
which fails. Since the Mul
hierarchy is very big, this can be slow to fail, especially when there is no such Mul
instance.
A long-term but harder to achieve solution would be to specify the order in which instance goals get solved. For example, we'd like to change the arguments to map_mul
to look like [FunLike F M N] [Mul M] [Mul N] [highPriority <| MulHomClass F M N]
because MulHomClass
fails or succeeds much faster than the others.
As a consequence, the simpNF
linter is much slower since by design it tries and fails to apply many map_
lemmas. The same issue occurs a few times in existing calls to simp [map_mul]
, where map_mul
is tried "too soon" and fails. Thanks to the speedup of leanprover/lean4#2478 the impact is very limited, only in files that already were close to the timeout.
simp
not firing sometimesThis affects map_smulₛₗ
and related definitions. For simp
lemmas Lean apparently uses a slightly different mechanism to find instances, so that rw
can find every argument to map_smulₛₗ
successfully but simp
can't: leanprover/lean4#3701.
Especially in the category theory library, we might sometimes have a type A
which is also accessible as a synonym (Bundled A hA).1
. Instance synthesis doesn't always work if we have f : A →* B
but x * y : (Bundled A hA).1
or vice versa. This seems to be mostly fixed by keeping A B
as outParam
s in MulHomClass F A B
. (Presumably because Lean will do a definitional check A =?= (Bundled A hA).1
instead of using the syntax in the discrimination tree.)
The timeouts can be worked around for now by specifying which map_mul
we mean, either as map_mul f
for some explicit f
, or as e.g. MonoidHomClass.map_mul
.
map_smulₛₗ
not firing as simp
lemma can be worked around by going back to the pre-FunLike situation and making LinearMap.map_smulₛₗ
a simp
lemma instead of the generic map_smulₛₗ
. Writing simp [map_smulₛₗ _]
also works.
Co-authored-by: Matthew Ballard <matt@mrb.email> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Scott Morrison <scott@tqft.net> Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>
@@ -944,6 +944,8 @@ variable (N) in
noncomputable def equivMapOfInjective (hf : Function.Injective f) :
N ≃ₗ⁅R,L⁆ N.map f :=
{ Submodule.equivMapOfInjective (f : M →ₗ[R] M') hf N with
+ -- Note: #8386 had to specify `invFun` explicitly this way, otherwise we'd get a type mismatch
+ invFun := by exact DFunLike.coe (Submodule.equivMapOfInjective (f : M →ₗ[R] M') hf N).symm
map_lie' := by rintro x ⟨m, hm : m ∈ N⟩; ext; exact f.map_lie x m }
/-- An equivalence of Lie modules yields an order-preserving equivalence of their lattices of Lie
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Joachim Breitner <mail@joachim-breitner.de>
@@ -128,7 +128,6 @@ theorem coe_toSet_mk (S : Set M) (h₁ h₂ h₃ h₄) :
rfl
#align lie_submodule.coe_to_set_mk LieSubmodule.coe_toSet_mk
-@[simp]
theorem coe_toSubmodule_mk (p : Submodule R M) (h) :
(({ p with lie_mem := h } : LieSubmodule R L M) : Submodule R M) = p := by cases p; rfl
#align lie_submodule.coe_to_submodule_mk LieSubmodule.coe_toSubmodule_mk
@@ -366,15 +366,15 @@ theorem bot_coe : ((⊥ : LieSubmodule R L M) : Set M) = {0} :=
rfl
#align lie_submodule.bot_coe LieSubmodule.bot_coe
-@[simp]
-theorem coeSubmodule_eq_bot_iff : (N : Submodule R M) = ⊥ ↔ N = ⊥ := by
- rw [← coe_toSubmodule_eq_iff]; rfl
-
@[simp]
theorem bot_coeSubmodule : ((⊥ : LieSubmodule R L M) : Submodule R M) = ⊥ :=
rfl
#align lie_submodule.bot_coe_submodule LieSubmodule.bot_coeSubmodule
+@[simp]
+theorem coeSubmodule_eq_bot_iff : (N : Submodule R M) = ⊥ ↔ N = ⊥ := by
+ rw [← coe_toSubmodule_eq_iff, bot_coeSubmodule]
+
@[simp]
theorem mem_bot (x : M) : x ∈ (⊥ : LieSubmodule R L M) ↔ x = 0 :=
mem_singleton_iff
@@ -388,15 +388,15 @@ theorem top_coe : ((⊤ : LieSubmodule R L M) : Set M) = univ :=
rfl
#align lie_submodule.top_coe LieSubmodule.top_coe
-@[simp]
-theorem coeSubmodule_eq_top_iff : (N : Submodule R M) = ⊤ ↔ N = ⊤ := by
- rw [← coe_toSubmodule_eq_iff]; rfl
-
@[simp]
theorem top_coeSubmodule : ((⊤ : LieSubmodule R L M) : Submodule R M) = ⊤ :=
rfl
#align lie_submodule.top_coe_submodule LieSubmodule.top_coeSubmodule
+@[simp]
+theorem coeSubmodule_eq_top_iff : (N : Submodule R M) = ⊤ ↔ N = ⊤ := by
+ rw [← coe_toSubmodule_eq_iff, top_coeSubmodule]
+
@[simp]
theorem mem_top (x : M) : x ∈ (⊤ : LieSubmodule R L M) :=
mem_univ x
@@ -186,7 +186,7 @@ instance {S : Type*} [Semiring S] [SMul S R] [SMul Sᵐᵒᵖ R] [Module S M] [M
[IsScalarTower S R M] [IsScalarTower Sᵐᵒᵖ R M] [IsCentralScalar S M] : IsCentralScalar S N :=
N.toSubmodule.isCentralScalar
-instance : LieModule R L N where
+instance instLieModule : LieModule R L N where
lie_smul := by intro t x y; apply SetCoe.ext; apply lie_smul
smul_lie := by intro t x y; apply SetCoe.ext; apply smul_lie
Note: the proof (due to Zassenhaus) makes no assumption about the characteristic of the coefficients.
@@ -546,6 +546,14 @@ theorem codisjoint_iff_coe_toSubmodule :
rw [codisjoint_iff, codisjoint_iff, ← coe_toSubmodule_eq_iff, sup_coe_toSubmodule,
top_coeSubmodule, ← codisjoint_iff]
+theorem independent_iff_coe_toSubmodule {ι : Type*} {N : ι → LieSubmodule R L M} :
+ CompleteLattice.Independent N ↔ CompleteLattice.Independent fun i ↦ (N i : Submodule R M) := by
+ simp [CompleteLattice.independent_def, disjoint_iff_coe_toSubmodule]
+
+theorem iSup_eq_top_iff_coe_toSubmodule {ι : Type*} {N : ι → LieSubmodule R L M} :
+ ⨆ i, N i = ⊤ ↔ ⨆ i, (N i : Submodule R M) = ⊤ := by
+ rw [← iSup_coe_toSubmodule, ← top_coeSubmodule (L := L), coe_toSubmodule_eq_iff]
+
instance : AddCommMonoid (LieSubmodule R L M) where
add := (· ⊔ ·)
add_assoc _ _ _ := sup_assoc
Submodule.ofLe
to Submodule.inclusion
(#8470)
This matches Set.inclusion
, Subring.inclusion
, Subalgebra.inclusion
, etc.
Also renames the homOfLe
spellings in Algebra/Lie
to match.
Note that we leave LieSubalgebra.ofLe
, as this is a completely different statement!
As requested by @alreadydone.
@@ -658,22 +658,23 @@ theorem injective_incl : Function.Injective N.incl := Subtype.coe_injective
variable {N N'} (h : N ≤ N')
/-- Given two nested Lie submodules `N ⊆ N'`, the inclusion `N ↪ N'` is a morphism of Lie modules.-/
-def homOfLe : N →ₗ⁅R,L⁆ N' :=
- { Submodule.ofLe (show N.toSubmodule ≤ N'.toSubmodule from h) with map_lie' := fun {_ _} ↦ rfl }
-#align lie_submodule.hom_of_le LieSubmodule.homOfLe
+def inclusion : N →ₗ⁅R,L⁆ N' where
+ __ := Submodule.inclusion (show N.toSubmodule ≤ N'.toSubmodule from h)
+ map_lie' := rfl
+#align lie_submodule.hom_of_le LieSubmodule.inclusion
@[simp]
-theorem coe_homOfLe (m : N) : (homOfLe h m : M) = m :=
+theorem coe_inclusion (m : N) : (inclusion h m : M) = m :=
rfl
-#align lie_submodule.coe_hom_of_le LieSubmodule.coe_homOfLe
+#align lie_submodule.coe_hom_of_le LieSubmodule.coe_inclusion
-theorem homOfLe_apply (m : N) : homOfLe h m = ⟨m.1, h m.2⟩ :=
+theorem inclusion_apply (m : N) : inclusion h m = ⟨m.1, h m.2⟩ :=
rfl
-#align lie_submodule.hom_of_le_apply LieSubmodule.homOfLe_apply
+#align lie_submodule.hom_of_le_apply LieSubmodule.inclusion_apply
-theorem homOfLe_injective : Function.Injective (homOfLe h) := fun x y ↦ by
- simp only [homOfLe_apply, imp_self, Subtype.mk_eq_mk, SetLike.coe_eq_coe]
-#align lie_submodule.hom_of_le_injective LieSubmodule.homOfLe_injective
+theorem inclusion_injective : Function.Injective (inclusion h) := fun x y ↦ by
+ simp only [inclusion_apply, imp_self, Subtype.mk_eq_mk, SetLike.coe_eq_coe]
+#align lie_submodule.hom_of_le_injective LieSubmodule.inclusion_injective
end InclusionMaps
@@ -1232,23 +1233,26 @@ theorem bot_of_map_eq_bot {I : LieIdeal R L} (h₁ : Function.Injective f) (h₂
#align lie_ideal.bot_of_map_eq_bot LieIdeal.bot_of_map_eq_bot
/-- Given two nested Lie ideals `I₁ ⊆ I₂`, the inclusion `I₁ ↪ I₂` is a morphism of Lie algebras. -/
-def homOfLe {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) : I₁ →ₗ⁅R⁆ I₂ :=
- { Submodule.ofLe (show I₁.toSubmodule ≤ I₂.toSubmodule from h) with map_lie' := fun {_ _} ↦ rfl }
-#align lie_ideal.hom_of_le LieIdeal.homOfLe
+def inclusion {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) : I₁ →ₗ⁅R⁆ I₂ where
+ __ := Submodule.inclusion (show I₁.toSubmodule ≤ I₂.toSubmodule from h)
+ map_lie' := rfl
+#align lie_ideal.hom_of_le LieIdeal.inclusion
@[simp]
-theorem coe_homOfLe {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) (x : I₁) : (homOfLe h x : L) = x :=
+theorem coe_inclusion {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) (x : I₁) : (inclusion h x : L) = x :=
rfl
-#align lie_ideal.coe_hom_of_le LieIdeal.coe_homOfLe
+#align lie_ideal.coe_hom_of_le LieIdeal.coe_inclusion
-theorem homOfLe_apply {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) (x : I₁) : homOfLe h x = ⟨x.1, h x.2⟩ :=
+theorem inclusion_apply {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) (x : I₁) :
+ inclusion h x = ⟨x.1, h x.2⟩ :=
rfl
-#align lie_ideal.hom_of_le_apply LieIdeal.homOfLe_apply
+#align lie_ideal.hom_of_le_apply LieIdeal.inclusion_apply
-theorem homOfLe_injective {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) : Function.Injective (homOfLe h) :=
+theorem inclusion_injective {I₁ I₂ : LieIdeal R L} (h : I₁ ≤ I₂) :
+ Function.Injective (inclusion h) :=
fun x y ↦ by
- simp only [homOfLe_apply, imp_self, Subtype.mk_eq_mk, SetLike.coe_eq_coe]
-#align lie_ideal.hom_of_le_injective LieIdeal.homOfLe_injective
+ simp only [inclusion_apply, imp_self, Subtype.mk_eq_mk, SetLike.coe_eq_coe]
+#align lie_ideal.hom_of_le_injective LieIdeal.inclusion_injective
-- Porting note: LHS simplifies, so moved @[simp] to new theorem `map_sup_ker_eq_map'`
theorem map_sup_ker_eq_map : LieIdeal.map f (I ⊔ f.ker) = LieIdeal.map f I := by
@@ -366,6 +366,10 @@ theorem bot_coe : ((⊥ : LieSubmodule R L M) : Set M) = {0} :=
rfl
#align lie_submodule.bot_coe LieSubmodule.bot_coe
+@[simp]
+theorem coeSubmodule_eq_bot_iff : (N : Submodule R M) = ⊥ ↔ N = ⊥ := by
+ rw [← coe_toSubmodule_eq_iff]; rfl
+
@[simp]
theorem bot_coeSubmodule : ((⊥ : LieSubmodule R L M) : Submodule R M) = ⊥ :=
rfl
@@ -384,6 +388,10 @@ theorem top_coe : ((⊤ : LieSubmodule R L M) : Set M) = univ :=
rfl
#align lie_submodule.top_coe LieSubmodule.top_coe
+@[simp]
+theorem coeSubmodule_eq_top_iff : (N : Submodule R M) = ⊤ ↔ N = ⊤ := by
+ rw [← coe_toSubmodule_eq_iff]; rfl
+
@[simp]
theorem top_coeSubmodule : ((⊤ : LieSubmodule R L M) : Submodule R M) = ⊤ :=
rfl
@@ -528,6 +536,16 @@ theorem iSup_induction' {ι} (N : ι → LieSubmodule R L M) {C : (x : M) → (x
· rintro ⟨_, Cx⟩ ⟨_, Cy⟩
refine' ⟨_, hadd _ _ _ _ Cx Cy⟩
+theorem disjoint_iff_coe_toSubmodule :
+ Disjoint N N' ↔ Disjoint (N : Submodule R M) (N' : Submodule R M) := by
+ rw [disjoint_iff, disjoint_iff, ← coe_toSubmodule_eq_iff, inf_coe_toSubmodule, bot_coeSubmodule,
+ ← disjoint_iff]
+
+theorem codisjoint_iff_coe_toSubmodule :
+ Codisjoint N N' ↔ Codisjoint (N : Submodule R M) (N' : Submodule R M) := by
+ rw [codisjoint_iff, codisjoint_iff, ← coe_toSubmodule_eq_iff, sup_coe_toSubmodule,
+ top_coeSubmodule, ← codisjoint_iff]
+
instance : AddCommMonoid (LieSubmodule R L M) where
add := (· ⊔ ·)
add_assoc _ _ _ := sup_assoc
@@ -635,6 +653,8 @@ theorem incl_eq_val : (N.incl : N → M) = Subtype.val :=
rfl
#align lie_submodule.incl_eq_val LieSubmodule.incl_eq_val
+theorem injective_incl : Function.Injective N.incl := Subtype.coe_injective
+
variable {N N'} (h : N ≤ N')
/-- Given two nested Lie submodules `N ⊆ N'`, the inclusion `N ↪ N'` is a morphism of Lie modules.-/
@@ -684,6 +704,7 @@ theorem submodule_span_le_lieSpan : Submodule.span R s ≤ lieSpan R L s := by
apply subset_lieSpan
#align lie_submodule.submodule_span_le_lie_span LieSubmodule.submodule_span_le_lieSpan
+@[simp]
theorem lieSpan_le {N} : lieSpan R L s ≤ N ↔ s ⊆ N := by
constructor
· exact Subset.trans subset_lieSpan
@@ -740,6 +761,32 @@ theorem span_iUnion {ι} (s : ι → Set M) : lieSpan R L (⋃ i, s i) = ⨆ i,
(LieSubmodule.gi R L M).gc.l_iSup
#align lie_submodule.span_Union LieSubmodule.span_iUnion
+lemma isCompactElement_lieSpan_singleton (m : M) :
+ CompleteLattice.IsCompactElement (lieSpan R L {m}) := by
+ rw [CompleteLattice.isCompactElement_iff_le_of_directed_sSup_le]
+ intro s hne hdir hsup
+ replace hsup : m ∈ (↑(sSup s) : Set M) := (SetLike.le_def.mp hsup) (subset_lieSpan rfl)
+ suffices (↑(sSup s) : Set M) = ⋃ N ∈ s, ↑N by
+ obtain ⟨N : LieSubmodule R L M, hN : N ∈ s, hN' : m ∈ N⟩ := by
+ simp_rw [this, Set.mem_iUnion, SetLike.mem_coe, exists_prop] at hsup; assumption
+ exact ⟨N, hN, by simpa⟩
+ replace hne : Nonempty s := Set.nonempty_coe_sort.mpr hne
+ have := Submodule.coe_iSup_of_directed _ hdir.directed_val
+ simp_rw [← iSup_coe_toSubmodule, Set.iUnion_coe_set, coe_toSubmodule] at this
+ rw [← this, SetLike.coe_set_eq, sSup_eq_iSup, iSup_subtype]
+
+@[simp]
+lemma sSup_image_lieSpan_singleton : sSup ((fun x ↦ lieSpan R L {x}) '' N) = N := by
+ refine le_antisymm (sSup_le <| by simp) ?_
+ simp_rw [← coeSubmodule_le_coeSubmodule, sSup_coe_toSubmodule, Set.mem_image, SetLike.mem_coe]
+ refine fun m hm ↦ Submodule.mem_sSup.mpr fun N' hN' ↦ ?_
+ replace hN' : ∀ m ∈ N, lieSpan R L {m} ≤ N' := by simpa using hN'
+ exact hN' _ hm (subset_lieSpan rfl)
+
+instance instIsCompactlyGenerated : IsCompactlyGenerated (LieSubmodule R L M) :=
+ ⟨fun N ↦ ⟨(fun x ↦ lieSpan R L {x}) '' N, fun _ ⟨m, _, hm⟩ ↦
+ hm ▸ isCompactElement_lieSpan_singleton R L m, N.sSup_image_lieSpan_singleton⟩⟩
+
end LieSpan
end LatticeStructure
@@ -823,7 +870,7 @@ theorem comap_inf {N₂' : LieSubmodule R L M'} :
rfl
@[simp]
-theorem map_iSup {ι : Type*} (N : ι → LieSubmodule R L M) :
+theorem map_iSup {ι : Sort*} (N : ι → LieSubmodule R L M) :
(⨆ i, N i).map f = ⨆ i, (N i).map f :=
(gc_map_comap f : GaloisConnection (map f) (comap f)).l_iSup
@@ -320,8 +320,7 @@ theorem exists_lieIdeal_coe_eq_iff :
(∃ I : LieIdeal R L, ↑I = K) ↔ ∀ x y : L, y ∈ K → ⁅x, y⁆ ∈ K := by
simp only [← coe_to_submodule_eq_iff, LieIdeal.coe_to_lieSubalgebra_to_submodule,
Submodule.exists_lieSubmodule_coe_eq_iff L]
- -- Porting note: was `exact Iff.rfl`
- simp only [mem_coe_submodule]
+ exact Iff.rfl
#align lie_subalgebra.exists_lie_ideal_coe_eq_iff LieSubalgebra.exists_lieIdeal_coe_eq_iff
theorem exists_nested_lieIdeal_coe_eq_iff {K' : LieSubalgebra R L} (h : K ≤ K') :
@@ -1442,7 +1442,8 @@ def LieIdeal.topEquiv : (⊤ : LieIdeal R L) ≃ₗ⁅R⁆ L :=
LieSubalgebra.topEquiv
#align lie_ideal.top_equiv LieIdeal.topEquiv
-@[simp]
+-- This lemma has always been bad, but leanprover/lean4#2644 made `simp` start noticing
+@[simp, nolint simpNF]
theorem LieIdeal.topEquiv_apply (x : (⊤ : LieIdeal R L)) : LieIdeal.topEquiv x = x :=
rfl
#align lie_ideal.top_equiv_apply LieIdeal.topEquiv_apply
@@ -1455,7 +1456,8 @@ def LieModuleEquiv.ofTop : (⊤ : LieSubmodule R L M) ≃ₗ⁅R,L⁆ M :=
{ LinearEquiv.ofTop ⊤ rfl with
map_lie' := rfl }
-@[simp] lemma LieModuleEquiv.ofTop_apply (x : (⊤ : LieSubmodule R L M)) :
+-- This lemma has always been bad, but leanprover/lean4#2644 made `simp` start noticing
+@[simp, nolint simpNF] lemma LieModuleEquiv.ofTop_apply (x : (⊤ : LieSubmodule R L M)) :
LieModuleEquiv.ofTop R L M x = x :=
rfl
@@ -1442,8 +1442,7 @@ def LieIdeal.topEquiv : (⊤ : LieIdeal R L) ≃ₗ⁅R⁆ L :=
LieSubalgebra.topEquiv
#align lie_ideal.top_equiv LieIdeal.topEquiv
--- This lemma has always been bad, but leanprover/lean4#2644 made `simp` start noticing
-@[simp, nolint simpNF]
+@[simp]
theorem LieIdeal.topEquiv_apply (x : (⊤ : LieIdeal R L)) : LieIdeal.topEquiv x = x :=
rfl
#align lie_ideal.top_equiv_apply LieIdeal.topEquiv_apply
@@ -1456,8 +1455,7 @@ def LieModuleEquiv.ofTop : (⊤ : LieSubmodule R L M) ≃ₗ⁅R,L⁆ M :=
{ LinearEquiv.ofTop ⊤ rfl with
map_lie' := rfl }
--- This lemma has always been bad, but leanprover/lean4#2644 made `simp` start noticing
-@[simp, nolint simpNF] lemma LieModuleEquiv.ofTop_apply (x : (⊤ : LieSubmodule R L M)) :
+@[simp] lemma LieModuleEquiv.ofTop_apply (x : (⊤ : LieSubmodule R L M)) :
LieModuleEquiv.ofTop R L M x = x :=
rfl
@@ -1442,7 +1442,8 @@ def LieIdeal.topEquiv : (⊤ : LieIdeal R L) ≃ₗ⁅R⁆ L :=
LieSubalgebra.topEquiv
#align lie_ideal.top_equiv LieIdeal.topEquiv
-@[simp]
+-- This lemma has always been bad, but leanprover/lean4#2644 made `simp` start noticing
+@[simp, nolint simpNF]
theorem LieIdeal.topEquiv_apply (x : (⊤ : LieIdeal R L)) : LieIdeal.topEquiv x = x :=
rfl
#align lie_ideal.top_equiv_apply LieIdeal.topEquiv_apply
@@ -1455,7 +1456,8 @@ def LieModuleEquiv.ofTop : (⊤ : LieSubmodule R L M) ≃ₗ⁅R,L⁆ M :=
{ LinearEquiv.ofTop ⊤ rfl with
map_lie' := rfl }
-@[simp] lemma LieModuleEquiv.ofTop_apply (x : (⊤ : LieSubmodule R L M)) :
+-- This lemma has always been bad, but leanprover/lean4#2644 made `simp` start noticing
+@[simp, nolint simpNF] lemma LieModuleEquiv.ofTop_apply (x : (⊤ : LieSubmodule R L M)) :
LieModuleEquiv.ofTop R L M x = x :=
rfl
They key addition is the lemma LieAlgebra.IsKilling.ker_restrictBilinear_of_isCartanSubalgebra_eq_bot
.
@@ -238,9 +238,6 @@ theorem lie_mem_left (I : LieIdeal R L) (x y : L) (h : x ∈ I) : ⁅x, y⁆ ∈
#align lie_mem_left lie_mem_left
/-- An ideal of a Lie algebra is a Lie subalgebra. -/
--- Porting note: added `@[coe]` to fix `norm_cast` issues, but this causes bad pretty-printing:
--- `(I : LieSubalgebra R L)` becomes `(↑R L I)`
-@[coe]
def lieIdealSubalgebra (I : LieIdeal R L) : LieSubalgebra R L :=
{ I.toSubmodule with lie_mem' := by intro x y _ hy; apply lie_mem_right; exact hy }
#align lie_ideal_subalgebra lieIdealSubalgebra
@@ -248,14 +245,12 @@ def lieIdealSubalgebra (I : LieIdeal R L) : LieSubalgebra R L :=
instance : Coe (LieIdeal R L) (LieSubalgebra R L) :=
⟨lieIdealSubalgebra R L⟩
-@[norm_cast]
+@[simp]
theorem LieIdeal.coe_toSubalgebra (I : LieIdeal R L) : ((I : LieSubalgebra R L) : Set L) = I :=
rfl
#align lie_ideal.coe_to_subalgebra LieIdeal.coe_toSubalgebra
--- Porting note: here and below, used `LieSubmodule.toSubmodule` rather than coercions, because
--- those are treated like `((I : LieSubalgebra R L) : Submodule R L)` instead.
-@[norm_cast]
+@[simp]
theorem LieIdeal.coe_to_lieSubalgebra_to_submodule (I : LieIdeal R L) :
((I : LieSubalgebra R L) : Submodule R L) = LieSubmodule.toSubmodule I :=
rfl
Sup
and sSup
of LieSubmodule
s (#7608)
The point is that the following four lemmas are now all true by definition:
LieSubmodule.inf_coe_toSubmodule
LieSubmodule.sInf_coe_toSubmodule
LieSubmodule.sup_coe_toSubmodule
[previously existed but not true by definition]LieSubmodule.sSup_coe_toSubmodule
[previously did not exist]@@ -407,7 +407,7 @@ instance : Inf (LieSubmodule R L M) :=
instance : InfSet (LieSubmodule R L M) :=
⟨fun S ↦
- { sInf {((s : Submodule R M)) | s ∈ S} with
+ { toSubmodule := sInf {(s : Submodule R M) | s ∈ S}
lie_mem := fun {x m} h ↦ by
simp only [Submodule.mem_carrier, mem_iInter, Submodule.sInf_coe, mem_setOf_eq,
forall_apply_eq_imp_iff₂, forall_exists_index, and_imp] at h ⊢
@@ -418,12 +418,22 @@ theorem inf_coe : (↑(N ⊓ N') : Set M) = ↑N ∩ ↑N' :=
rfl
#align lie_submodule.inf_coe LieSubmodule.inf_coe
+@[norm_cast, simp]
+theorem inf_coe_toSubmodule :
+ (↑(N ⊓ N') : Submodule R M) = (N : Submodule R M) ⊓ (N' : Submodule R M) :=
+ rfl
+#align lie_submodule.inf_coe_to_submodule LieSubmodule.inf_coe_toSubmodule
+
@[simp]
theorem sInf_coe_toSubmodule (S : Set (LieSubmodule R L M)) :
- (↑(sInf S) : Submodule R M) = sInf {((s : Submodule R M)) | s ∈ S} :=
+ (↑(sInf S) : Submodule R M) = sInf {(s : Submodule R M) | s ∈ S} :=
rfl
#align lie_submodule.Inf_coe_to_submodule LieSubmodule.sInf_coe_toSubmodule
+theorem sInf_coe_toSubmodule' (S : Set (LieSubmodule R L M)) :
+ (↑(sInf S) : Submodule R M) = ⨅ N ∈ S, (N : Submodule R M) := by
+ rw [sInf_coe_toSubmodule, ← Set.image, sInf_image]
+
@[simp]
theorem iInf_coe_toSubmodule {ι} (p : ι → LieSubmodule R L M) :
(↑(⨅ i, p i) : Submodule R M) = ⨅ i, (p i : Submodule R M) := by
@@ -445,30 +455,84 @@ theorem iInf_coe {ι} (p : ι → LieSubmodule R L M) : (↑(⨅ i, p i) : Set M
theorem mem_iInf {ι} (p : ι → LieSubmodule R L M) {x} : (x ∈ ⨅ i, p i) ↔ ∀ i, x ∈ p i := by
rw [← SetLike.mem_coe, iInf_coe, Set.mem_iInter]; rfl
-theorem sInf_glb (S : Set (LieSubmodule R L M)) : IsGLB S (sInf S) := by
- have h : ∀ {N N' : LieSubmodule R L M}, (N : Set M) ≤ N' ↔ N ≤ N' := fun {_ _} ↦ Iff.rfl
- apply IsGLB.of_image h
- simp only [sInf_coe]
- exact isGLB_biInf
-#align lie_submodule.Inf_glb LieSubmodule.sInf_glb
+instance : Sup (LieSubmodule R L M) where
+ sup N N' :=
+ { toSubmodule := (N : Submodule R M) ⊔ (N' : Submodule R M)
+ lie_mem := by
+ rintro x m (hm : m ∈ (N : Submodule R M) ⊔ (N' : Submodule R M))
+ change ⁅x, m⁆ ∈ (N : Submodule R M) ⊔ (N' : Submodule R M)
+ rw [Submodule.mem_sup] at hm ⊢
+ obtain ⟨y, hy, z, hz, rfl⟩ := hm
+ exact ⟨⁅x, y⁆, N.lie_mem hy, ⁅x, z⁆, N'.lie_mem hz, (lie_add _ _ _).symm⟩ }
+
+instance : SupSet (LieSubmodule R L M) where
+ sSup S :=
+ { toSubmodule := sSup {(p : Submodule R M) | p ∈ S}
+ lie_mem := by
+ intro x m (hm : m ∈ sSup {(p : Submodule R M) | p ∈ S})
+ change ⁅x, m⁆ ∈ sSup {(p : Submodule R M) | p ∈ S}
+ obtain ⟨s, hs, hsm⟩ := Submodule.mem_sSup_iff_exists_finset.mp hm
+ clear hm
+ classical
+ induction' s using Finset.induction_on with q t hqt ih generalizing m
+ · replace hsm : m = 0 := by simpa using hsm
+ simp [hsm]
+ · rw [Finset.iSup_insert] at hsm
+ obtain ⟨m', hm', u, hu, rfl⟩ := Submodule.mem_sup.mp hsm
+ rw [lie_add]
+ refine add_mem ?_ (ih (Subset.trans (by simp) hs) hu)
+ obtain ⟨p, hp, rfl⟩ : ∃ p ∈ S, ↑p = q := hs (Finset.mem_insert_self q t)
+ suffices p ≤ sSup {(p : Submodule R M) | p ∈ S} by exact this (p.lie_mem hm')
+ exact le_sSup ⟨p, hp, rfl⟩ }
-/-- The set of Lie submodules of a Lie module form a complete lattice.
+@[norm_cast, simp]
+theorem sup_coe_toSubmodule :
+ (↑(N ⊔ N') : Submodule R M) = (N : Submodule R M) ⊔ (N' : Submodule R M) := by
+ rfl
+#align lie_submodule.sup_coe_to_submodule LieSubmodule.sup_coe_toSubmodule
+
+@[simp]
+theorem sSup_coe_toSubmodule (S : Set (LieSubmodule R L M)) :
+ (↑(sSup S) : Submodule R M) = sSup {(s : Submodule R M) | s ∈ S} :=
+ rfl
-We provide explicit values for the fields `bot`, `top`, `inf` to get more convenient definitions
-than we would otherwise obtain from `completeLatticeOfInf`. -/
+theorem sSup_coe_toSubmodule' (S : Set (LieSubmodule R L M)) :
+ (↑(sSup S) : Submodule R M) = ⨆ N ∈ S, (N : Submodule R M) := by
+ rw [sSup_coe_toSubmodule, ← Set.image, sSup_image]
+
+@[simp]
+theorem iSup_coe_toSubmodule {ι} (p : ι → LieSubmodule R L M) :
+ (↑(⨆ i, p i) : Submodule R M) = ⨆ i, (p i : Submodule R M) := by
+ rw [iSup, sSup_coe_toSubmodule]; ext; simp [Submodule.mem_sSup, Submodule.mem_iSup]
+
+/-- The set of Lie submodules of a Lie module form a complete lattice. -/
instance : CompleteLattice (LieSubmodule R L M) :=
- { SetLike.instPartialOrder,
- completeLatticeOfInf _ sInf_glb with
- le := (· ≤ ·)
- lt := (· < ·)
- bot := ⊥
- bot_le := fun N _ h ↦ by rw [mem_bot] at h; rw [h]; exact N.zero_mem'
- top := ⊤
- le_top := fun _ _ _ ↦ trivial
- inf := (· ⊓ ·)
- le_inf := fun N₁ N₂ N₃ h₁₂ h₁₃ m hm ↦ ⟨h₁₂ hm, h₁₃ hm⟩
- inf_le_left := fun _ _ _ ↦ And.left
- inf_le_right := fun _ _ _ ↦ And.right }
+ { coeSubmodule_injective.completeLattice toSubmodule sup_coe_toSubmodule inf_coe_toSubmodule
+ sSup_coe_toSubmodule' sInf_coe_toSubmodule' rfl rfl with
+ toPartialOrder := SetLike.instPartialOrder }
+
+theorem mem_iSup_of_mem {ι} {b : M} {N : ι → LieSubmodule R L M} (i : ι) (h : b ∈ N i) :
+ b ∈ ⨆ i, N i :=
+ (le_iSup N i) h
+
+lemma iSup_induction {ι} (N : ι → LieSubmodule R L M) {C : M → Prop} {x : M}
+ (hx : x ∈ ⨆ i, N i) (hN : ∀ i, ∀ y ∈ N i, C y) (h0 : C 0)
+ (hadd : ∀ y z, C y → C z → C (y + z)) : C x := by
+ rw [← LieSubmodule.mem_coeSubmodule, LieSubmodule.iSup_coe_toSubmodule] at hx
+ exact Submodule.iSup_induction (C := C) (fun i ↦ (N i : Submodule R M)) hx hN h0 hadd
+
+@[elab_as_elim]
+theorem iSup_induction' {ι} (N : ι → LieSubmodule R L M) {C : (x : M) → (x ∈ ⨆ i, N i) → Prop}
+ (hN : ∀ (i) (x) (hx : x ∈ N i), C x (mem_iSup_of_mem i hx)) (h0 : C 0 (zero_mem _))
+ (hadd : ∀ x y hx hy, C x hx → C y hy → C (x + y) (add_mem ‹_› ‹_›)) {x : M}
+ (hx : x ∈ ⨆ i, N i) : C x hx := by
+ refine' Exists.elim _ fun (hx : x ∈ ⨆ i, N i) (hc : C x hx) => hc
+ refine' iSup_induction N (C := fun x : M ↦ ∃ (hx : x ∈ ⨆ i, N i), C x hx) hx
+ (fun i x hx => _) _ fun x y => _
+ · exact ⟨_, hN _ _ hx⟩
+ · exact ⟨_, h0⟩
+ · rintro ⟨_, Cx⟩ ⟨_, Cy⟩
+ refine' ⟨_, hadd _ _ _ _ Cx Cy⟩
instance : AddCommMonoid (LieSubmodule R L M) where
add := (· ⊔ ·)
@@ -483,26 +547,6 @@ theorem add_eq_sup : N + N' = N ⊔ N' :=
rfl
#align lie_submodule.add_eq_sup LieSubmodule.add_eq_sup
-@[norm_cast, simp]
-theorem sup_coe_toSubmodule :
- (↑(N ⊔ N') : Submodule R M) = (N : Submodule R M) ⊔ (N' : Submodule R M) := by
- have aux : ∀ {x : L} {m}, m ∈ (N ⊔ N' : Submodule R M) → ⁅x, m⁆ ∈ (N ⊔ N' : Submodule R M) := by
- simp only [Submodule.mem_sup]
- rintro x m ⟨y, hy, z, hz, rfl⟩
- refine' ⟨⁅x, y⁆, N.lie_mem hy, ⁅x, z⁆, N'.lie_mem hz, (lie_add _ _ _).symm⟩
- refine' le_antisymm (sInf_le ⟨{ (N ⊔ N' : Submodule R M) with lie_mem := aux }, _⟩) _
- -- Porting note: rewrote proof
- · simp only [← coeSubmodule_le_coeSubmodule, mem_setOf_eq, and_true_iff]
- constructor <;> intro x hx <;> simp [Submodule.mem_sup_left hx, hx, Submodule.mem_sup_right hx]
- · simp
-#align lie_submodule.sup_coe_to_submodule LieSubmodule.sup_coe_toSubmodule
-
-@[norm_cast, simp]
-theorem inf_coe_toSubmodule :
- (↑(N ⊓ N') : Submodule R M) = (N : Submodule R M) ⊓ (N' : Submodule R M) :=
- rfl
-#align lie_submodule.inf_coe_to_submodule LieSubmodule.inf_coe_toSubmodule
-
@[simp]
theorem mem_inf (x : M) : x ∈ N ⊓ N' ↔ x ∈ N ∧ x ∈ N' := by
rw [← mem_coeSubmodule, ← mem_coeSubmodule, ← mem_coeSubmodule, inf_coe_toSubmodule,
These are all motivated by a result I've proved but I believe they make sense in their own right so I have split them out in the hopes of simplifying review.
@@ -5,6 +5,7 @@ Authors: Oliver Nash
-/
import Mathlib.Algebra.Lie.Subalgebra
import Mathlib.RingTheory.Noetherian
+import Mathlib.RingTheory.Artinian
#align_import algebra.lie.submodule from "leanprover-community/mathlib"@"9822b65bfc4ac74537d77ae318d27df1df662471"
@@ -528,16 +529,23 @@ instance : IsModularLattice (LieSubmodule R L M) where
variable (R L M)
+/-- The natural functor that forgets the action of `L` as an order embedding. -/
+@[simps] def toSubmodule_orderEmbedding : LieSubmodule R L M ↪o Submodule R M :=
+ { toFun := (↑)
+ inj' := coeSubmodule_injective
+ map_rel_iff' := Iff.rfl }
+
theorem wellFounded_of_noetherian [IsNoetherian R M] :
WellFounded ((· > ·) : LieSubmodule R L M → LieSubmodule R L M → Prop) :=
- let f :
- ((· > ·) : LieSubmodule R L M → LieSubmodule R L M → Prop) →r
- ((· > ·) : Submodule R M → Submodule R M → Prop) :=
- { toFun := (↑)
- map_rel' := fun h ↦ h }
- RelHomClass.wellFounded f (isNoetherian_iff_wellFounded.mp inferInstance)
+ RelHomClass.wellFounded (toSubmodule_orderEmbedding R L M).dual.ltEmbedding <|
+ isNoetherian_iff_wellFounded.mp inferInstance
#align lie_submodule.well_founded_of_noetherian LieSubmodule.wellFounded_of_noetherian
+theorem wellFounded_of_isArtinian [IsArtinian R M] :
+ WellFounded ((· < ·) : LieSubmodule R L M → LieSubmodule R L M → Prop) :=
+ RelHomClass.wellFounded (toSubmodule_orderEmbedding R L M).ltEmbedding <|
+ IsArtinian.wellFounded_submodule_lt R M
+
@[simp]
theorem subsingleton_iff : Subsingleton (LieSubmodule R L M) ↔ Subsingleton M :=
have h : Subsingleton (LieSubmodule R L M) ↔ Subsingleton (Submodule R M) := by
@@ -724,6 +732,8 @@ def map : LieSubmodule R L M' :=
· norm_cast at hfm; simp [hfm] }
#align lie_submodule.map LieSubmodule.map
+@[simp] theorem coe_map : (N.map f : Set M') = f '' N := rfl
+
@[simp]
theorem coeSubmodule_map : (N.map f : Submodule R M') = (N : Submodule R M).map (f : M →ₗ[R] M') :=
rfl
@@ -757,16 +767,36 @@ theorem gc_map_comap : GaloisConnection (map f) (comap f) := fun _ _ ↦ map_le_
variable {f}
+theorem map_inf_le : (N ⊓ N₂).map f ≤ N.map f ⊓ N₂.map f :=
+ Set.image_inter_subset f N N₂
+
+theorem map_inf (hf : Function.Injective f) :
+ (N ⊓ N₂).map f = N.map f ⊓ N₂.map f :=
+ SetLike.coe_injective <| Set.image_inter hf
+
@[simp]
theorem map_sup : (N ⊔ N₂).map f = N.map f ⊔ N₂.map f :=
(gc_map_comap f).l_sup
#align lie_submodule.map_sup LieSubmodule.map_sup
+@[simp]
+theorem comap_inf {N₂' : LieSubmodule R L M'} :
+ (N' ⊓ N₂').comap f = N'.comap f ⊓ N₂'.comap f :=
+ rfl
+
+@[simp]
+theorem map_iSup {ι : Type*} (N : ι → LieSubmodule R L M) :
+ (⨆ i, N i).map f = ⨆ i, (N i).map f :=
+ (gc_map_comap f : GaloisConnection (map f) (comap f)).l_iSup
+
@[simp]
theorem mem_map (m' : M') : m' ∈ N.map f ↔ ∃ m, m ∈ N ∧ f m = m' :=
Submodule.mem_map
#align lie_submodule.mem_map LieSubmodule.mem_map
+theorem mem_map_of_mem {m : M} (h : m ∈ N) : f m ∈ N.map f :=
+ Set.mem_image_of_mem _ h
+
@[simp]
theorem mem_comap {m : M} : m ∈ comap f N' ↔ f m ∈ N' :=
Iff.rfl
@@ -783,6 +813,56 @@ theorem comap_incl_eq_bot : N₂.comap N.incl = ⊥ ↔ N ⊓ N₂ = ⊥ := by
disjoint_iff, inf_coe_toSubmodule]
#align lie_submodule.comap_incl_eq_bot LieSubmodule.comap_incl_eq_bot
+@[mono]
+theorem map_mono (h : N ≤ N₂) : N.map f ≤ N₂.map f :=
+ Set.image_subset _ h
+
+theorem map_comp
+ {M'' : Type*} [AddCommGroup M''] [Module R M''] [LieRingModule L M''] {g : M' →ₗ⁅R,L⁆ M''} :
+ N.map (g.comp f) = (N.map f).map g :=
+ SetLike.coe_injective <| by
+ simp only [← Set.image_comp, coe_map, LinearMap.coe_comp, LieModuleHom.coe_comp]
+
+@[simp]
+theorem map_id : N.map LieModuleHom.id = N := by ext; simp
+
+@[simp] theorem map_bot :
+ (⊥ : LieSubmodule R L M).map f = ⊥ := by
+ ext m; simp [eq_comm]
+
+lemma map_le_map_iff (hf : Function.Injective f) :
+ N.map f ≤ N₂.map f ↔ N ≤ N₂ :=
+ Set.image_subset_image_iff hf
+
+lemma map_injective_of_injective (hf : Function.Injective f) :
+ Function.Injective (map f) := fun {N N'} h ↦
+ SetLike.coe_injective <| hf.image_injective <| by simp only [← coe_map, h]
+
+/-- An injective morphism of Lie modules embeds the lattice of submodules of the domain into that
+of the target. -/
+@[simps] def mapOrderEmbedding {f : M →ₗ⁅R,L⁆ M'} (hf : Function.Injective f) :
+ LieSubmodule R L M ↪o LieSubmodule R L M' where
+ toFun := LieSubmodule.map f
+ inj' := map_injective_of_injective hf
+ map_rel_iff' := Set.image_subset_image_iff hf
+
+variable (N) in
+/-- For an injective morphism of Lie modules, any Lie submodule is equivalent to its image. -/
+noncomputable def equivMapOfInjective (hf : Function.Injective f) :
+ N ≃ₗ⁅R,L⁆ N.map f :=
+ { Submodule.equivMapOfInjective (f : M →ₗ[R] M') hf N with
+ map_lie' := by rintro x ⟨m, hm : m ∈ N⟩; ext; exact f.map_lie x m }
+
+/-- An equivalence of Lie modules yields an order-preserving equivalence of their lattices of Lie
+Submodules. -/
+@[simps] def orderIsoMapComap (e : M ≃ₗ⁅R,L⁆ M') :
+ LieSubmodule R L M ≃o LieSubmodule R L M' where
+ toFun := map e
+ invFun := comap e
+ left_inv := fun N ↦ by ext; simp
+ right_inv := fun N ↦ by ext; simp [e.apply_eq_iff_eq_symm_apply]
+ map_rel_iff' := fun {N N'} ↦ Set.image_subset_image_iff e.injective
+
end LieSubmodule
namespace LieIdeal
@@ -1239,6 +1319,7 @@ theorem mem_range (n : N) : n ∈ f.range ↔ ∃ m, f m = n :=
Iff.rfl
#align lie_module_hom.mem_range LieModuleHom.mem_range
+@[simp]
theorem map_top : LieSubmodule.map f ⊤ = f.range := by ext; simp [LieSubmodule.mem_map]
#align lie_module_hom.map_top LieModuleHom.map_top
@@ -1269,6 +1350,29 @@ theorem range_incl : N.incl.range = N := by simp [← LieSubmodule.coe_toSubmodu
theorem comap_incl_self : comap N.incl N = ⊤ := by simp [← LieSubmodule.coe_toSubmodule_eq_iff]
#align lie_submodule.comap_incl_self LieSubmodule.comap_incl_self
+theorem map_incl_top : (⊤ : LieSubmodule R L N).map N.incl = N := by simp
+
+variable {N}
+
+@[simp]
+lemma map_le_range {M' : Type*}
+ [AddCommGroup M'] [Module R M'] [LieRingModule L M'] (f : M →ₗ⁅R,L⁆ M') :
+ N.map f ≤ f.range := by
+ rw [← LieModuleHom.map_top]
+ exact LieSubmodule.map_mono le_top
+
+@[simp]
+lemma map_incl_lt_iff_lt_top {N' : LieSubmodule R L N} :
+ N'.map (LieSubmodule.incl N) < N ↔ N' < ⊤ := by
+ convert (LieSubmodule.mapOrderEmbedding (f := N.incl) Subtype.coe_injective).lt_iff_lt
+ simp
+
+@[simp]
+lemma map_incl_le {N' : LieSubmodule R L N} :
+ N'.map N.incl ≤ N := by
+ conv_rhs => rw [← N.map_incl_top]
+ exact LieSubmodule.map_mono le_top
+
end LieSubmodule
section TopEquiv
@@ -1304,4 +1408,22 @@ theorem LieIdeal.topEquiv_apply (x : (⊤ : LieIdeal R L)) : LieIdeal.topEquiv x
rfl
#align lie_ideal.top_equiv_apply LieIdeal.topEquiv_apply
+variable (R L)
+variable (M : Type*) [AddCommGroup M] [Module R M] [LieRingModule L M] [LieModule R L M]
+
+/-- The natural equivalence between the 'top' Lie submodule and the enclosing Lie module. -/
+def LieModuleEquiv.ofTop : (⊤ : LieSubmodule R L M) ≃ₗ⁅R,L⁆ M :=
+ { LinearEquiv.ofTop ⊤ rfl with
+ map_lie' := rfl }
+
+@[simp] lemma LieModuleEquiv.ofTop_apply (x : (⊤ : LieSubmodule R L M)) :
+ LieModuleEquiv.ofTop R L M x = x :=
+ rfl
+
+@[simp] lemma LieModuleEquiv.range_coe {M' : Type*}
+ [AddCommGroup M'] [Module R M'] [LieRingModule L M'] (e : M ≃ₗ⁅R,L⁆ M') :
+ LieModuleHom.range (e : M →ₗ⁅R,L⁆ M') = ⊤ := by
+ rw [LieModuleHom.range_eq_top]
+ exact e.surjective
+
end TopEquiv
@@ -1242,6 +1242,9 @@ theorem mem_range (n : N) : n ∈ f.range ↔ ∃ m, f m = n :=
theorem map_top : LieSubmodule.map f ⊤ = f.range := by ext; simp [LieSubmodule.mem_map]
#align lie_module_hom.map_top LieModuleHom.map_top
+theorem range_eq_top : f.range = ⊤ ↔ Function.Surjective f := by
+ rw [SetLike.ext'_iff, coe_range, LieSubmodule.top_coe, Set.range_iff_surjective]
+
end LieModuleHom
namespace LieSubmodule
The key change is the new definition LieModule.weightSpaceOf
which shows that the eigenspaces of the action of a single element of a Lie algebra on a representation are Lie submodules. I need to use this fact to develop the theory further.
@@ -92,12 +92,16 @@ theorem mem_carrier {x : M} : x ∈ N.carrier ↔ x ∈ (N : Set M) :=
Iff.rfl
#align lie_submodule.mem_carrier LieSubmodule.mem_carrier
-@[simp]
theorem mem_mk_iff (S : Set M) (h₁ h₂ h₃ h₄) {x : M} :
x ∈ (⟨⟨⟨⟨S, h₁⟩, h₂⟩, h₃⟩, h₄⟩ : LieSubmodule R L M) ↔ x ∈ S :=
Iff.rfl
#align lie_submodule.mem_mk_iff LieSubmodule.mem_mk_iff
+@[simp]
+theorem mem_mk_iff' (p : Submodule R M) (h) {x : M} :
+ x ∈ (⟨p, h⟩ : LieSubmodule R L M) ↔ x ∈ p :=
+ Iff.rfl
+
@[simp]
theorem mem_coeSubmodule {x : M} : x ∈ (N : Submodule R M) ↔ x ∈ N :=
Iff.rfl
@@ -419,6 +423,11 @@ theorem sInf_coe_toSubmodule (S : Set (LieSubmodule R L M)) :
rfl
#align lie_submodule.Inf_coe_to_submodule LieSubmodule.sInf_coe_toSubmodule
+@[simp]
+theorem iInf_coe_toSubmodule {ι} (p : ι → LieSubmodule R L M) :
+ (↑(⨅ i, p i) : Submodule R M) = ⨅ i, (p i : Submodule R M) := by
+ rw [iInf, sInf_coe_toSubmodule]; ext; simp
+
@[simp]
theorem sInf_coe (S : Set (LieSubmodule R L M)) : (↑(sInf S) : Set M) = ⋂ s ∈ S, (s : Set M) := by
rw [← LieSubmodule.coe_toSubmodule, sInf_coe_toSubmodule, Submodule.sInf_coe]
@@ -427,6 +436,14 @@ theorem sInf_coe (S : Set (LieSubmodule R L M)) : (↑(sInf S) : Set M) = ⋂ s
and_imp, SetLike.mem_coe, mem_coeSubmodule]
#align lie_submodule.Inf_coe LieSubmodule.sInf_coe
+@[simp]
+theorem iInf_coe {ι} (p : ι → LieSubmodule R L M) : (↑(⨅ i, p i) : Set M) = ⋂ i, ↑(p i) := by
+ rw [iInf, sInf_coe]; simp only [Set.mem_range, Set.iInter_exists, Set.iInter_iInter_eq']
+
+@[simp]
+theorem mem_iInf {ι} (p : ι → LieSubmodule R L M) {x} : (x ∈ ⨅ i, p i) ↔ ∀ i, x ∈ p i := by
+ rw [← SetLike.mem_coe, iInf_coe, Set.mem_iInter]; rfl
+
theorem sInf_glb (S : Set (LieSubmodule R L M)) : IsGLB S (sInf S) := by
have h : ∀ {N N' : LieSubmodule R L M}, (N : Set M) ≤ N' ↔ N ≤ N' := fun {_ _} ↦ Iff.rfl
apply IsGLB.of_image h
@@ -882,8 +882,7 @@ same as ideals of `L` contained in `I`. -/
instance subsingleton_of_bot : Subsingleton (LieIdeal R (⊥ : LieIdeal R L)) := by
apply subsingleton_of_bot_eq_top
ext ⟨x, hx⟩
- change x ∈ (⊥ : LieIdeal _ _) at hx
- rw [LieSubmodule.mem_bot] at hx
+ rw [LieSubmodule.bot_coeSubmodule, Submodule.mem_bot] at hx
subst hx
simp only [Submodule.mk_eq_zero, LieSubmodule.mem_bot, LieSubmodule.mem_top]
#align lie_ideal.subsingleton_of_bot LieIdeal.subsingleton_of_bot
@@ -1040,12 +1039,12 @@ theorem mem_map_of_surjective {y : L'} (h₁ : Function.Surjective f) (h₂ : y
rw [← LieSubmodule.mem_coeSubmodule, coe_map_of_surjective h₁, Submodule.mem_map] at h₂
obtain ⟨x, hx, rfl⟩ := h₂
use ⟨x, hx⟩
- rfl
+ rw [LieHom.coe_toLinearMap]
#align lie_ideal.mem_map_of_surjective LieIdeal.mem_map_of_surjective
theorem bot_of_map_eq_bot {I : LieIdeal R L} (h₁ : Function.Injective f) (h₂ : I.map f = ⊥) :
I = ⊥ := by
- rw [← f.ker_eq_bot] at h₁; change comap f ⊥ = ⊥ at h₁
+ rw [← f.ker_eq_bot, LieHom.ker] at h₁
rw [eq_bot_iff, map_le_iff_le_comap, h₁] at h₂
rw [eq_bot_iff]; exact h₂
#align lie_ideal.bot_of_map_eq_bot LieIdeal.bot_of_map_eq_bot
The mem_map
lemmas were inconsistently either not simp
lemmas at all, simp
lemmas, or simp
lemmas with a lowered priority.
This PR makes them uniformly low priority simp lemmas, and adds a few simp attributes to "better" simp lemmas instead. (However these lemmas are themselves quite inconsistent across different algebraic structures, and I haven't attempted to add missing ones.)
Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
@@ -745,6 +745,7 @@ theorem map_sup : (N ⊔ N₂).map f = N.map f ⊔ N₂.map f :=
(gc_map_comap f).l_sup
#align lie_submodule.map_sup LieSubmodule.map_sup
+@[simp]
theorem mem_map (m' : M') : m' ∈ N.map f ↔ ∃ m, m ∈ N ∧ f m = m' :=
Submodule.mem_map
#align lie_submodule.mem_map LieSubmodule.mem_map
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -169,7 +169,7 @@ instance : LieRingModule L N where
lie_add := by intro x m n; apply SetCoe.ext; apply lie_add
leibniz_lie := by intro x y m; apply SetCoe.ext; apply leibniz_lie
-instance module' {S : Type _} [Semiring S] [SMul S R] [Module S M] [IsScalarTower S R M] :
+instance module' {S : Type*} [Semiring S] [SMul S R] [Module S M] [IsScalarTower S R M] :
Module S N :=
N.toSubmodule.module'
#align lie_submodule.module' LieSubmodule.module'
@@ -177,7 +177,7 @@ instance module' {S : Type _} [Semiring S] [SMul S R] [Module S M] [IsScalarTowe
instance : Module R N :=
N.toSubmodule.module
-instance {S : Type _} [Semiring S] [SMul S R] [SMul Sᵐᵒᵖ R] [Module S M] [Module Sᵐᵒᵖ M]
+instance {S : Type*} [Semiring S] [SMul S R] [SMul Sᵐᵒᵖ R] [Module S M] [Module Sᵐᵒᵖ M]
[IsScalarTower S R M] [IsScalarTower Sᵐᵒᵖ R M] [IsCentralScalar S M] : IsCentralScalar S N :=
N.toSubmodule.isCentralScalar
@@ -267,13 +267,13 @@ instance LieIdeal.lieAlgebra (I : LieIdeal R L) : LieAlgebra R I :=
#align lie_ideal.lie_algebra LieIdeal.lieAlgebra
/-- Transfer the `LieRingModule` instance from the coercion `LieIdeal → LieSubalgebra`. -/
-instance LieIdeal.lieRingModule {R L : Type _} [CommRing R] [LieRing L] [LieAlgebra R L]
+instance LieIdeal.lieRingModule {R L : Type*} [CommRing R] [LieRing L] [LieAlgebra R L]
(I : LieIdeal R L) [LieRingModule L M] : LieRingModule I M :=
LieSubalgebra.lieRingModule (I : LieSubalgebra R L)
#align lie_ideal.lie_ring_module LieIdeal.lieRingModule
@[simp]
-theorem LieIdeal.coe_bracket_of_module {R L : Type _} [CommRing R] [LieRing L] [LieAlgebra R L]
+theorem LieIdeal.coe_bracket_of_module {R L : Type*} [CommRing R] [LieRing L] [LieAlgebra R L]
(I : LieIdeal R L) [LieRingModule L M] (x : I) (m : M) : ⁅x, m⁆ = ⁅(↑x : L), m⁆ :=
LieSubalgebra.coe_bracket_of_module (I : LieSubalgebra R L) x m
#align lie_ideal.coe_bracket_of_module LieIdeal.coe_bracket_of_module
@@ -2,15 +2,12 @@
Copyright (c) 2021 Oliver Nash. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Oliver Nash
-
-! This file was ported from Lean 3 source module algebra.lie.submodule
-! leanprover-community/mathlib commit 9822b65bfc4ac74537d77ae318d27df1df662471
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Algebra.Lie.Subalgebra
import Mathlib.RingTheory.Noetherian
+#align_import algebra.lie.submodule from "leanprover-community/mathlib"@"9822b65bfc4ac74537d77ae318d27df1df662471"
+
/-!
# Lie submodules of a Lie algebra
@@ -498,7 +498,7 @@ theorem mem_sup (x : M) : x ∈ N ⊔ N' ↔ ∃ y ∈ N, ∃ z ∈ N', y + z =
rw [← mem_coeSubmodule, sup_coe_toSubmodule, Submodule.mem_sup]; exact Iff.rfl
#align lie_submodule.mem_sup LieSubmodule.mem_sup
-nonrec theorem eq_bot_iff : N = ⊥ ↔ ∀ m : M, m ∈ N → m = 0 := by rw [eq_bot_iff]; exact Iff.rfl
+nonrec theorem eq_bot_iff : N = ⊥ ↔ ∀ m : M, m ∈ N → m = 0 := by rw [eq_bot_iff]; exact Iff.rfl
#align lie_submodule.eq_bot_iff LieSubmodule.eq_bot_iff
instance subsingleton_of_bot : Subsingleton (LieSubmodule R L ↑(⊥ : LieSubmodule R L M)) := by
at
and goals (#5387)
Changes are of the form
some_tactic at h⊢
-> some_tactic at h ⊢
some_tactic at h
-> some_tactic at h
@@ -408,7 +408,7 @@ instance : InfSet (LieSubmodule R L M) :=
{ sInf {((s : Submodule R M)) | s ∈ S} with
lie_mem := fun {x m} h ↦ by
simp only [Submodule.mem_carrier, mem_iInter, Submodule.sInf_coe, mem_setOf_eq,
- forall_apply_eq_imp_iff₂, forall_exists_index, and_imp] at h⊢
+ forall_apply_eq_imp_iff₂, forall_exists_index, and_imp] at h ⊢
intro N hN; apply N.lie_mem (h N hN) }⟩
@[simp]
@@ -707,7 +707,7 @@ def map : LieSubmodule R L M' :=
lie_mem := fun {x m'} h ↦ by
rcases h with ⟨m, hm, hfm⟩; use ⁅x, m⁆; constructor
· apply N.lie_mem hm
- · norm_cast at hfm; simp [hfm] }
+ · norm_cast at hfm; simp [hfm] }
#align lie_submodule.map LieSubmodule.map
@[simp]
@@ -864,7 +864,7 @@ theorem map_mono : Monotone (map f) := fun I₁ I₂ h ↦ by
@[mono]
theorem comap_mono : Monotone (comap f) := fun J₁ J₂ h ↦ by
- rw [← SetLike.coe_subset_coe] at h⊢
+ rw [← SetLike.coe_subset_coe] at h ⊢
dsimp only [SetLike.coe]
exact Set.preimage_mono h
#align lie_ideal.comap_mono LieIdeal.comap_mono
@@ -1092,7 +1092,7 @@ theorem map_comap_eq (h : f.IsIdealMorphism) : map f (comap f J) = f.idealRange
· rw [le_inf_iff]; exact ⟨f.map_le_idealRange _, map_comap_le⟩
· rw [f.isIdealMorphism_def] at h
rw [← SetLike.coe_subset_coe, LieSubmodule.inf_coe, ← coe_toSubalgebra, h]
- rintro y ⟨⟨x, h₁⟩, h₂⟩; rw [← h₁] at h₂⊢; exact mem_map h₂
+ rintro y ⟨⟨x, h₁⟩, h₂⟩; rw [← h₁] at h₂ ⊢; exact mem_map h₂
#align lie_ideal.map_comap_eq LieIdeal.map_comap_eq
@[simp]
@@ -883,7 +883,10 @@ In other words, in general, ideals of `I`, regarded as a Lie algebra in its own
same as ideals of `L` contained in `I`. -/
instance subsingleton_of_bot : Subsingleton (LieIdeal R (⊥ : LieIdeal R L)) := by
apply subsingleton_of_bot_eq_top
- ext ⟨x, hx⟩; erw [LieSubmodule.mem_bot] at hx; subst hx -- porting note: `erw` for the win.
+ ext ⟨x, hx⟩
+ change x ∈ (⊥ : LieIdeal _ _) at hx
+ rw [LieSubmodule.mem_bot] at hx
+ subst hx
simp only [Submodule.mk_eq_zero, LieSubmodule.mem_bot, LieSubmodule.mem_top]
#align lie_ideal.subsingleton_of_bot LieIdeal.subsingleton_of_bot
The unported dependencies are