Built with
doc-gen4 , running Lean4.
Bubbles (
) indicate interactive fragments: hover for details, tap to reveal contents.
Use
Ctrl+β Ctrl+β to navigate,
Ctrl+π±οΈ to focus.
On Mac, use
Cmd instead of
Ctrl .
/-
Copyright (c) 2020 Eric Wieser. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Wieser
! This file was ported from Lean 3 source module group_theory.group_action.sub_mul_action
! leanprover-community/mathlib commit feb99064803fd3108e37c18b0f77d0a8344677a3
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.Hom.GroupAction
import Mathlib.Algebra.Module.Basic
import Mathlib.Data.SetLike.Basic
import Mathlib.GroupTheory.GroupAction.Basic
/-!
# Sets invariant to a `MulAction`
In this file we define `SubMulAction R M`; a subset of a `MulAction R M` which is closed with
respect to scalar multiplication.
For most uses, typically `Submodule R M` is more powerful.
## Main definitions
* `SubMulAction.mulAction` - the `MulAction R M` transferred to the subtype.
* `SubMulAction.mulAction'` - the `MulAction S M` transferred to the subtype when
`IsScalarTower S R M`.
* `SubMulAction.isScalarTower` - the `IsScalarTower S R M` transferred to the subtype.
## Tags
submodule, mul_action
-/
open Function
universe u u' u'' v
variable { S : Type u' } { T : Type u'' } { R : Type u } { M : Type v }
/-- `SMulMemClass S R M` says `S` is a type of subsets `s β€ M` that are closed under the
scalar action of `R` on `M`.
Note that only `R` is marked as an `outParam` here, since `M` is supplied by the `SetLike`
class instead.
-/
class SMulMemClass ( S : Type _ ) ( R : outParam <| Type _ ) ( M : Type _ ) [ SMul R M ] [ SetLike S M ] where
/-- Multiplication by a scalar on an element of the set remains in the set. -/
smul_mem : β { s : S } ( r : R ) { m : M }, m β s β r β’ m β s
#align smul_mem_class SMulMemClass
/-- `VAddMemClass S R M` says `S` is a type of subsets `s β€ M` that are closed under the
additive action of `R` on `M`.
Note that only `R` is marked as an `outParam` here, since `M` is supplied by the `SetLike`
class instead. -/
class VAddMemClass ( S : Type _ ) ( R : outParam <| Type _ ) ( M : Type _ ) [ VAdd : Type ?u.174 β Type ?u.173 β Type (max?u.174?u.173) VAdd R M ] [ SetLike S M ] where
/-- Addition by a scalar with an element of the set remains in the set. -/
vadd_mem : β { s : S } ( r : R ) { m : M }, m β s β r +α΅₯ m β s
#align vadd_mem_class VAddMemClass
attribute [ to_additive ] SMulMemClass
namespace SetLike
variable [ SMul : Type ?u.1093 β Type ?u.1092 β Type (max?u.1093?u.1092) SMul R M ] [ SetLike S M ] [ hS : SMulMemClass S R M ] ( s : S )
open SMulMemClass
-- lower priority so other instances are found first
/-- A subset closed under the scalar action inherits that action. -/
@[ to_additive "A subset closed under the additive action inherits that action."]
instance ( priority := 900) smul : SMul : Type ?u.386 β Type ?u.385 β Type (max?u.386?u.385) SMul R s :=
β¨ fun r x => β¨ r β’ x . 1 , smul_mem r x . 2 β©β©
#align set_like.has_smul SetLike.smul
#align set_like.has_vadd SetLike.vadd
-- Porting note: TODO lower priority not actually there
-- lower priority so later simp lemmas are used first; to appease simp_nf
@[ to_additive ( attr := simp , norm_cast )]
protected theorem val_smul : β (r : R ) (x : { x // x β s } ), β(r β’ x ) = r β’ βx val_smul ( r : R ) ( x : s ) : (β( r β’ x ) : M ) = r β’ ( x : M ) :=
rfl : β {Ξ± : Sort ?u.3246} {a : Ξ± }, a = a rfl
#align set_like.coe_smul SetLike.val_smul
#align set_like.coe_vadd SetLike.val_vadd
-- Porting note: TODO lower priority not actually there
-- lower priority so later simp lemmas are used first; to appease simp_nf
@[ to_additive ( attr := simp )]
theorem mk_smul_mk ( r : R ) ( x : M ) ( hx : x β s ) : r β’ (β¨ x , hx β© : s ) = β¨ r β’ x , smul_mem r hx β© :=
rfl : β {Ξ± : Sort ?u.5764} {a : Ξ± }, a = a rfl
#align set_like.mk_smul_mk SetLike.mk_smul_mk : β {S : Type u'} {R : Type u} {M : Type v} [inst : SMul R M ] [inst_1 : SetLike S M ] [hS : SMulMemClass S R M ] (s : S )
(r : R ) (x : M ) (hx : x β s ), r β’ { val := x , property := hx } = { val := r β’ x , property := (_ : r β’ x β s ) } SetLike.mk_smul_mk
#align set_like.mk_vadd_mk SetLike.mk_vadd_mk
@[ to_additive ]
theorem smul_def : β (r : R ) (x : { x // x β s } ), r β’ x = { val := β(r β’ x ) , property := (_ : r β’ βx β s ) } smul_def ( r : R ) ( x : s ) : r β’ x = β¨ r β’ x , smul_mem r x . 2 β© :=
rfl : β {Ξ± : Sort ?u.9691} {a : Ξ± }, a = a rfl
#align set_like.smul_def SetLike.smul_def
#align set_like.vadd_def SetLike.vadd_def
@[ simp ]
theorem forall_smul_mem_iff { R M S : Type _ } [ Monoid R ] [ MulAction : (Ξ± : Type ?u.9806) β Type ?u.9805 β [inst : Monoid Ξ± ] β Type (max?u.9806?u.9805) MulAction R M ] [ SetLike S M ]
[ SMulMemClass S R M ] { N : S } { x : M } : (β a : R , a β’ x β N ) β x β N :=
β¨ fun h => by simpa using h 1 , fun h a => SMulMemClass.smul_mem a h β©
#align set_like.forall_smul_mem_iff SetLike.forall_smul_mem_iff
end SetLike
/-- A SubMulAction is a set which is closed under scalar multiplication. -/
structure SubMulAction ( R : Type u ) ( M : Type v ) [ SMul : Type ?u.12566 β Type ?u.12565 β Type (max?u.12566?u.12565) SMul R M ] : Type v where
/-- The underlying set of a `SubMulAction`. -/
carrier : Set M
/-- The carrier set is closed under scalar multiplication. -/
smul_mem' : β ( c : R ) { x : M }, x β carrier β c β’ x β carrier
#align sub_mul_action SubMulAction
namespace SubMulAction
variable [ SMul : Type ?u.13591 β Type ?u.13590 β Type (max?u.13591?u.13590) SMul R M ]
instance : SetLike ( SubMulAction : (R : Type ?u.13100) β (M : Type ?u.13099) β [inst : SMul R M ] β Type ?u.13099 SubMulAction R M ) M :=
β¨ SubMulAction.carrier , fun p q h => by cases p S : Type u'T : Type u''R : Type uM : Type vinstβ : SMul R M q : SubMulAction R M carrierβ : Set M smul_mem'β : β (c : R ) {x : M }, x β carrierβ β c β’ x β carrierβ h : { carrier := carrierβ , smul_mem' := smul_mem'β } .carrier = q .carriermk { carrier := carrierβ , smul_mem' := smul_mem'β } = q ; S : Type u'T : Type u''R : Type uM : Type vinstβ : SMul R M q : SubMulAction R M carrierβ : Set M smul_mem'β : β (c : R ) {x : M }, x β carrierβ β c β’ x β carrierβ h : { carrier := carrierβ , smul_mem' := smul_mem'β } .carrier = q .carriermk { carrier := carrierβ , smul_mem' := smul_mem'β } = q cases q S : Type u'T : Type u''R : Type uM : Type vinstβ : SMul R M carrierβΒΉ : Set M smul_mem'βΒΉ : β (c : R ) {x : M }, x β carrierβΒΉ β c β’ x β carrierβΒΉ carrierβ : Set M smul_mem'β : β (c : R ) {x : M }, x β carrierβ β c β’ x β carrierβ h : { carrier := carrierβΒΉ , smul_mem' := smul_mem'βΒΉ } .carrier = { carrier := carrierβ , smul_mem' := smul_mem'β } .carriermk.mk { carrier := carrierβΒΉ , smul_mem' := smul_mem'βΒΉ } = { carrier := carrierβ , smul_mem' := smul_mem'β } ; S : Type u'T : Type u''R : Type uM : Type vinstβ : SMul R M carrierβΒΉ : Set M smul_mem'βΒΉ : β (c : R ) {x : M }, x β carrierβΒΉ β c β’ x β carrierβΒΉ carrierβ : Set M smul_mem'β : β (c : R ) {x : M }, x β carrierβ β c β’ x β carrierβ h : { carrier := carrierβΒΉ , smul_mem' := smul_mem'βΒΉ } .carrier = { carrier := carrierβ , smul_mem' := smul_mem'β } .carriermk.mk { carrier := carrierβΒΉ , smul_mem' := smul_mem'βΒΉ } = { carrier := carrierβ , smul_mem' := smul_mem'β } congr β©
instance : SMulMemClass ( SubMulAction : (R : Type ?u.13598) β (M : Type ?u.13597) β [inst : SMul R M ] β Type ?u.13597 SubMulAction R M ) R M where smul_mem := smul_mem' _
@[ simp ]
theorem mem_carrier { p : SubMulAction : (R : Type ?u.13808) β (M : Type ?u.13807) β [inst : SMul R M ] β Type ?u.13807 SubMulAction R M } { x : M } : x β p . carrier β x β ( p : Set M ) :=
Iff.rfl
#align sub_mul_action.mem_carrier SubMulAction.mem_carrier
@[ ext ]
theorem ext { p q : SubMulAction : (R : Type ?u.14021) β (M : Type ?u.14020) β [inst : SMul R M ] β Type ?u.14020 SubMulAction R M } ( h : β x , x β p β x β q ) : p = q :=
SetLike.ext : β {A : Type ?u.14096} {B : Type ?u.14095} [i : SetLike A B ] {p q : A }, (β (x : B ), x β p β x β q ) β p = q SetLike.ext h
#align sub_mul_action.ext SubMulAction.ext
/-- Copy of a sub_mul_action with a new `carrier` equal to the old one. Useful to fix definitional
equalities.-/
protected def copy ( p : SubMulAction : (R : Type ?u.14169) β (M : Type ?u.14168) β [inst : SMul R M ] β Type ?u.14168 SubMulAction R M ) ( s : Set M ) ( hs : s = β p ) : SubMulAction : (R : Type ?u.14293) β (M : Type ?u.14292) β [inst : SMul R M ] β Type ?u.14292 SubMulAction R M
where
carrier := s
smul_mem' := hs . symm : β {Ξ± : Sort ?u.14306} {a b : Ξ± }, a = b β b = a symm βΈ p . smul_mem'
#align sub_mul_action.copy SubMulAction.copy
@[ simp ]
theorem coe_copy ( p : SubMulAction : (R : Type ?u.14437) β (M : Type ?u.14436) β [inst : SMul R M ] β Type ?u.14436 SubMulAction R M ) ( s : Set M ) ( hs : s = β p ) : ( p . copy s hs : Set M ) = s :=
rfl : β {Ξ± : Sort ?u.14653} {a : Ξ± }, a = a rfl
#align sub_mul_action.coe_copy SubMulAction.coe_copy
theorem copy_eq ( p : SubMulAction : (R : Type ?u.14702) β (M : Type ?u.14701) β [inst : SMul R M ] β Type ?u.14701 SubMulAction R M ) ( s : Set M ) ( hs : s = β p ) : p . copy s hs = p :=
SetLike.coe_injective hs
#align sub_mul_action.copy_eq SubMulAction.copy_eq
instance : Bot ( SubMulAction : (R : Type ?u.14910) β (M : Type ?u.14909) β [inst : SMul R M ] β Type ?u.14909 SubMulAction R M ) where
bot :=
{ carrier := β
smul_mem' := fun _c h => Set.not_mem_empty : β {Ξ± : Type ?u.14986} (x : Ξ± ), Β¬ x β β
Set.not_mem_empty h }
instance : Inhabited : Sort ?u.15062 β Sort (max1?u.15062) Inhabited ( SubMulAction : (R : Type ?u.15064) β (M : Type ?u.15063) β [inst : SMul R M ] β Type ?u.15063 SubMulAction R M ) :=
β¨ β₯ β©
end SubMulAction
namespace SubMulAction
section SMul
variable [ SMul : Type ?u.15434 β Type ?u.15433 β Type (max?u.15434?u.15433) SMul R M ]
variable ( p : SubMulAction : (R : Type ?u.15890) β (M : Type ?u.15889) β [inst : SMul R M ] β Type ?u.15889 SubMulAction R M )
variable { r : R } { x : M }
theorem smul_mem : β (r : R ), x β p β r β’ x β p smul_mem ( r : R ) ( h : x β p ) : r β’ x β p :=
p . smul_mem' r h
#align sub_mul_action.smul_mem SubMulAction.smul_mem
instance : SMul : Type ?u.15457 β Type ?u.15456 β Type (max?u.15457?u.15456) SMul R p where smul c x := β¨ c β’ x . 1 , smul_mem _ c x . 2 : β {Ξ± : Sort ?u.15719} {p : Ξ± β Prop } (self : Subtype p ), p βself 2β©
variable { p }
@[ simp , norm_cast ]
theorem val_smul ( r : R ) ( x : p ) : (β( r β’ x ) : M ) = r β’ ( x : M ) :=
rfl : β {Ξ± : Sort ?u.16235} {a : Ξ± }, a = a rfl
#align sub_mul_action.coe_smul SubMulAction.val_smul
-- porting note: no longer needed because of defeq structure eta
#noalign sub_mul_action.coe_mk
variable ( p )
/-- Embedding of a submodule `p` to the ambient space `M`. -/
protected def subtype : p β[ R ] M := by refine' { toFun := Subtype.val : {Ξ± : Sort ?u.16650} β {p : Ξ± β Prop } β Subtype p β Ξ± Subtype.val.. } β (m : R ) (x : { x // x β p } ), β(m β’ x ) = m β’ βx ; β (m : R ) (x : { x // x β p } ), β(m β’ x ) = m β’ βx simp [ val_smul ]
#align sub_mul_action.subtype SubMulAction.subtype
@[ simp ]
theorem subtype_apply ( x : p ) : p . subtype x = x :=
rfl : β {Ξ± : Sort ?u.20896} {a : Ξ± }, a = a rfl
#align sub_mul_action.subtype_apply SubMulAction.subtype_apply
theorem subtype_eq_val : ( SubMulAction.subtype p : p β M ) = Subtype.val : {Ξ± : Sort ?u.21158} β {p : Ξ± β Prop } β Subtype p β Ξ± Subtype.val :=
rfl : β {Ξ± : Sort ?u.21211} {a : Ξ± }, a = a rfl
#align sub_mul_action.subtype_eq_val SubMulAction.subtype_eq_val
end SMul
namespace SMulMemClass
variable [ Monoid R ] [ MulAction : (Ξ± : Type ?u.26484) β Type ?u.26483 β [inst : Monoid Ξ± ] β Type (max?u.26484?u.26483) MulAction R M ] { A : Type _ : Type (?u.21253+1) Type _} [ SetLike A M ]
variable [ hA : SMulMemClass A R M ] ( S' : A )
-- Prefer subclasses of `MulAction` over `SMulMemClass`.
/-- A `SubMulAction` of a `MulAction` is a `MulAction`. -/
instance ( priority := 75) toMulAction : MulAction : (Ξ± : Type ?u.22757) β Type ?u.22756 β [inst : Monoid Ξ± ] β Type (max?u.22757?u.22756) MulAction R S' :=
Subtype.coe_injective : β {Ξ± : Sort ?u.22905} {p : Ξ± β Prop }, Injective fun a => βa Subtype.coe_injective. mulAction Subtype.val : {Ξ± : Sort ?u.23043} β {p : Ξ± β Prop } β Subtype p β Ξ± Subtype.val ( SetLike.val_smul S' )
#align sub_mul_action.smul_mem_class.to_mul_action SubMulAction.SMulMemClass.toMulAction
/-- The natural `MulActionHom` over `R` from a `SubMulAction` of `M` to `M`. -/
protected def subtype : S' β[ R ] M :=
β¨ Subtype.val : {Ξ± : Sort ?u.30272} β {p : Ξ± β Prop } β Subtype p β Ξ± Subtype.val, fun _ _ => rfl : β {Ξ± : Sort ?u.30289} {a : Ξ± }, a = a rflβ©
#align sub_mul_action.smul_mem_class.subtype SubMulAction.SMulMemClass.subtype
@[ simp ]
protected theorem coeSubtype : ( SMulMemClass.subtype S' : S' β M ) = Subtype.val : {Ξ± : Sort ?u.31432} β {p : Ξ± β Prop } β Subtype p β Ξ± Subtype.val :=
rfl : β {Ξ± : Sort ?u.31493} {a : Ξ± }, a = a rfl
#align sub_mul_action.smul_mem_class.coe_subtype SubMulAction.SMulMemClass.coeSubtype
end SMulMemClass
section MulActionMonoid
variable [ Monoid R ] [ MulAction : (Ξ± : Type ?u.42602) β Type ?u.42601 β [inst : Monoid Ξ± ] β Type (max?u.42602?u.42601) MulAction R M ]
section
variable [ SMul : Type ?u.42615 β Type ?u.42614 β Type (max?u.42615?u.42614) SMul S R ] [ SMul : Type ?u.33688 β Type ?u.33687 β Type (max?u.33688?u.33687) SMul S M ] [ IsScalarTower : (M : Type ?u.33693) β
(N : Type ?u.33692) β (Ξ± : Type ?u.33691) β [inst : SMul M N ] β [inst : SMul N Ξ± ] β [inst : SMul M Ξ± ] β Prop IsScalarTower S R M ]
variable ( p : SubMulAction : (R : Type ?u.33105) β (M : Type ?u.33104) β [inst : SMul R M ] β Type ?u.33104 SubMulAction R M )
theorem smul_of_tower_mem ( s : S ) { x : M } ( h : x β p ) : s β’ x β p := by
rw [ β one_smul R x , β smul_assoc ]
exact p . smul_mem _ h
#align sub_mul_action.smul_of_tower_mem SubMulAction.smul_of_tower_mem
instance smul' : SMul : Type ?u.37675 β Type ?u.37674 β Type (max?u.37675?u.37674) SMul S p where smul c x := β¨ c β’ x . 1 , smul_of_tower_mem _ c x . 2 : β {Ξ± : Sort ?u.38112} {p : Ξ± β Prop } (self : Subtype p ), p βself 2β©
#align sub_mul_action.has_smul' SubMulAction.smul'
instance isScalarTower : IsScalarTower : (M : Type ?u.39695) β
(N : Type ?u.39694) β (Ξ± : Type ?u.39693) β [inst : SMul M N ] β [inst : SMul N Ξ± ] β [inst : SMul M Ξ± ] β Prop IsScalarTower S R p where
smul_assoc s r x := Subtype.ext : β {Ξ± : Sort ?u.41816} {p : Ξ± β Prop } {a1 a2 : { x // p x } }, βa1 = βa2 β a1 = a2 Subtype.ext <| smul_assoc s r ( x : M )
#align sub_mul_action.is_scalar_tower SubMulAction.isScalarTower
instance isScalarTower' { S' : Type _ : Type (?u.43907+1) Type _} [ SMul : Type ?u.43911 β Type ?u.43910 β Type (max?u.43911?u.43910) SMul S' R ] [ SMul : Type ?u.43915 β Type ?u.43914 β Type (max?u.43915?u.43914) SMul S' S ] [ SMul : Type ?u.43919 β Type ?u.43918 β Type (max?u.43919?u.43918) SMul S' M ] [ IsScalarTower : (M : Type ?u.43924) β
(N : Type ?u.43923) β (Ξ± : Type ?u.43922) β [inst : SMul M N ] β [inst : SMul N Ξ± ] β [inst : SMul M Ξ± ] β Prop IsScalarTower S' R M ]
[ IsScalarTower : (M : Type ?u.44656) β
(N : Type ?u.44655) β (Ξ± : Type ?u.44654) β [inst : SMul M N ] β [inst : SMul N Ξ± ] β [inst : SMul M Ξ± ] β Prop IsScalarTower S' S M ] : IsScalarTower : (M : Type ?u.44690) β
(N : Type ?u.44689) β (Ξ± : Type ?u.44688) β [inst : SMul M N ] β [inst : SMul N Ξ± ] β [inst : SMul M Ξ± ] β Prop IsScalarTower S' S p
where smul_assoc s r x := Subtype.ext : β {Ξ± : Sort ?u.45149} {p : Ξ± β Prop } {a1 a2 : { x // p x } }, βa1 = βa2 β a1 = a2 Subtype.ext <| smul_assoc s r ( x : M )
#align sub_mul_action.is_scalar_tower' SubMulAction.isScalarTower'
@[ simp , norm_cast ]
theorem val_smul_of_tower ( s : S ) ( x : p ) : (( s β’ x : p ) : M ) = s β’ ( x : M ) :=
rfl : β {Ξ± : Sort ?u.47137} {a : Ξ± }, a = a rfl
#align sub_mul_action.coe_smul_of_tower SubMulAction.val_smul_of_tower
@[ simp ]
theorem smul_mem_iff' { G } [ Group G ] [ SMul : Type ?u.48659 β Type ?u.48658 β Type (max?u.48659?u.48658) SMul G R ] [ MulAction : (Ξ± : Type ?u.48663) β Type ?u.48662 β [inst : Monoid Ξ± ] β Type (max?u.48663?u.48662) MulAction G M ] [ IsScalarTower : (M : Type ?u.48953) β
(N : Type ?u.48952) β (Ξ± : Type ?u.48951) β [inst : SMul M N ] β [inst : SMul N Ξ± ] β [inst : SMul M Ξ± ] β Prop IsScalarTower G R M ] ( g : G )
{ x : M } : g β’ x β p β x β p :=
β¨ fun h => inv_smul_smul g x βΈ p . smul_of_tower_mem g β»ΒΉ h , p . smul_of_tower_mem g β©
#align sub_mul_action.smul_mem_iff' SubMulAction.smul_mem_iff'
instance isCentralScalar [ SMul : Type ?u.53809 β Type ?u.53808 β Type (max?u.53809?u.53808) SMul S α΅α΅α΅ R ] [ SMul : Type ?u.53814 β Type ?u.53813 β Type (max?u.53814?u.53813) SMul S α΅α΅α΅ M ] [ IsScalarTower : (M : Type ?u.53820) β
(N : Type ?u.53819) β (Ξ± : Type ?u.53818) β [inst : SMul M N ] β [inst : SMul N Ξ± ] β [inst : SMul M Ξ± ] β Prop IsScalarTower S α΅α΅α΅ R M ]
[ IsCentralScalar S M ] :
IsCentralScalar S p where
op_smul_eq_smul r x := Subtype.ext : β {Ξ± : Sort ?u.55000} {p : Ξ± β Prop } {a1 a2 : { x // p x } }, βa1 = βa2 β a1 = a2 Subtype.ext <| op_smul_eq_smul r ( x : M )
end
section
variable [ Monoid S ] [ SMul : Type ?u.58492 β Type ?u.58491 β Type (max?u.58492?u.58491) SMul S R ] [ MulAction : (Ξ± : Type ?u.55285) β Type ?u.55284 β [inst : Monoid Ξ± ] β Type (max?u.55285?u.55284) MulAction S M ] [ IsScalarTower : (M : Type ?u.56627) β
(N : Type ?u.56626) β (Ξ± : Type ?u.56625) β [inst : SMul M N ] β [inst : SMul N Ξ± ] β [inst : SMul M Ξ± ] β Prop IsScalarTower S R M ]
variable ( p : SubMulAction : (R : Type ?u.59793) β (M : Type ?u.59792) β [inst : SMul R M ] β Type ?u.59792 SubMulAction R M )
/-- If the scalar product forms a `MulAction`, then the subset inherits this action -/
instance mulAction' : MulAction : (Ξ± : Type ?u.60348) β Type ?u.60347 β [inst : Monoid Ξ± ] β Type (max?u.60348?u.60347) MulAction S p where
smul := (Β· β’ Β·) : S β { x // x β p } β { x // x β p } (Β· β’ Β·)
one_smul x := Subtype.ext : β {Ξ± : Sort ?u.61354} {p : Ξ± β Prop } {a1 a2 : { x // p x } }, βa1 = βa2 β a1 = a2 Subtype.ext <| one_smul _ ( x : M )
mul_smul cβ cβ x := Subtype.ext : β {Ξ± : Sort ?u.61553} {p : Ξ± β Prop } {a1 a2 : { x // p x } }, βa1 = βa2 β a1 = a2 Subtype.ext <| mul_smul cβ cβ ( x : M )
#align sub_mul_action.mul_action' SubMulAction.mulAction'
instance mulAction : MulAction : (Ξ± : Type ?u.63716) β Type ?u.63715 β [inst : Monoid Ξ± ] β Type (max?u.63716?u.63715) MulAction R p :=
p . mulAction'
#align sub_mul_action.mul_action SubMulAction.mulAction
end
/-- Orbits in a `SubMulAction` coincide with orbits in the ambient space. -/
theorem val_image_orbit { p : SubMulAction : (R : Type ?u.65229) β (M : Type ?u.65228) β [inst : SMul R M ] β Type ?u.65228 SubMulAction R M } ( m : p ) :
Subtype.val : {Ξ± : Sort ?u.65975} β {p : Ξ± β Prop } β Subtype p β Ξ± Subtype.val '' MulAction.orbit : (Ξ± : Type ?u.65985) β {Ξ² : Type ?u.65984} β [inst : Monoid Ξ± ] β [inst : MulAction Ξ± Ξ² ] β Ξ² β Set Ξ² MulAction.orbit R m = MulAction.orbit : (Ξ± : Type ?u.66083) β {Ξ² : Type ?u.66082} β [inst : Monoid Ξ± ] β [inst : MulAction Ξ± Ξ² ] β Ξ² β Set Ξ² MulAction.orbit R ( m : M ) :=
( Set.range_comp _ _ ). symm : β {Ξ± : Sort ?u.66207} {a b : Ξ± }, a = b β b = a symm
#align sub_mul_action.coe_image_orbit SubMulAction.val_image_orbit
/- -- Previously, the relatively useless :
lemma orbit_of_sub_mul {p : SubMulAction R M} (m : p) :
(mul_action.orbit R m : set M) = MulAction.orbit R (m : M) := rfl
-/
/-- Stabilizers in monoid SubMulAction coincide with stabilizers in the ambient space -/
theorem stabilizer_of_subMul.submonoid { p : SubMulAction : (R : Type ?u.66278) β (M : Type ?u.66277) β [inst : SMul R M ] β Type ?u.66277 SubMulAction R M } ( m : p ) :
MulAction.Stabilizer.submonoid R m = MulAction.Stabilizer.submonoid R ( m : M ) := by
ext
simp only [ MulAction.mem_stabilizer_submonoid_iff , β SubMulAction.val_smul , SetLike.coe_eq_coe : β {A : Type ?u.67597} {B : Type ?u.67596} [i : SetLike A B ] {p : A } {x y : { x // x β p } }, βx = βy β x = y SetLike.coe_eq_coe]
#align sub_mul_action.stabilizer_of_sub_mul.submonoid SubMulAction.stabilizer_of_subMul.submonoid
end MulActionMonoid
section MulActionGroup
variable [ Group R ] [ MulAction : (Ξ± : Type ?u.68994) β Type ?u.68993 β [inst : Monoid Ξ± ] β Type (max?u.68994?u.68993) MulAction R M ]
/-- Stabilizers in group SubMulAction coincide with stabilizers in the ambient space -/
theorem stabilizer_of_subMul { p : SubMulAction : (R : Type ?u.69284) β (M : Type ?u.69283) β [inst : SMul R M ] β Type ?u.69283 SubMulAction R M } ( m : p ) :
MulAction.stabilizer R m = MulAction.stabilizer R ( m : M ) := by
rw [ β Subgroup.toSubmonoid_eq : β {G : Type ?u.70702} [inst : Group G ] {p q : Subgroup G }, p .toSubmonoid = q .toSubmonoid β p = q Subgroup.toSubmonoid_eq]
exact stabilizer_of_subMul.submonoid m
#align sub_mul_action.stabilizer_of_sub_mul SubMulAction.stabilizer_of_subMul
end MulActionGroup
section Module
variable [ Semiring : Type ?u.70828 β Type ?u.70828 Semiring R ] [ AddCommMonoid : Type ?u.70831 β Type ?u.70831 AddCommMonoid M ]
variable [ Module R M ]
variable ( p : SubMulAction : (R : Type ?u.71787) β (M : Type ?u.71786) β [inst : SMul R M ] β Type ?u.71786 SubMulAction R M )
theorem zero_mem ( h : ( p : Set M ). Nonempty ) : ( 0 : M ) β p :=
let β¨ x , hx β© := h
zero_smul R ( x : M ) βΈ p . smul_mem 0 hx
#align sub_mul_action.zero_mem SubMulAction.zero_mem
/-- If the scalar product forms a `Module`, and the `SubMulAction` is not `β₯`, then the
subset inherits the zero. -/
instance [ n_empty : Nonempty p ] : Zero p where
zero := β¨ 0 , n_empty . elim fun x => p . zero_mem β¨ x , x . prop β©β©
end Module
section AddCommGroup
variable [ Ring R ] [ AddCommGroup : Type ?u.77082 β Type ?u.77082 AddCommGroup M ]
variable [ Module R M ]
variable ( p p' : SubMulAction : (R : Type ?u.79277) β (M : Type ?u.79276) β [inst : SMul R M ] β Type ?u.79276 SubMulAction R M )
variable { r : R } { x y : M }
theorem neg_mem ( hx : x β p ) : - x β p := by
rw [ β neg_one_smul R ]
exact p . smul_mem _ hx
#align sub_mul_action.neg_mem SubMulAction.neg_mem
@[ simp ]
theorem neg_mem_iff : - x β p β x β p :=
β¨ fun h => by
rw [ β neg_neg x ]
exact neg_mem _ h , neg_mem _ β©
#align sub_mul_action.neg_mem_iff SubMulAction.neg_mem_iff
instance : Neg p :=
β¨ fun x => β¨- x . 1 , neg_mem _ x . 2 : β {Ξ± : Sort ?u.88837} {p : Ξ± β Prop } (self : Subtype p ), p βself 2β©β©
@[ simp , norm_cast ]
theorem val_neg : β (x : { x // x β p } ), β(- x ) = - βx val_neg ( x : p ) : ((- x : p ) : M ) = - x :=
rfl : β {Ξ± : Sort ?u.91230} {a : Ξ± }, a = a rfl
#align sub_mul_action.coe_neg SubMulAction.val_neg
end AddCommGroup
end SubMulAction
namespace SubMulAction
variable [ GroupWithZero : Type ?u.95321 β Type ?u.95321 GroupWithZero S ] [ Monoid R ] [ MulAction : (Ξ± : Type ?u.91395) β Type ?u.91394 β [inst : Monoid Ξ± ] β Type (max?u.91395?u.91394) MulAction R M ]
variable [ SMul : Type ?u.93094 β Type ?u.93093 β Type (max?u.93094?u.93093) SMul S R ] [ MulAction : (Ξ± : Type ?u.95345) β Type ?u.95344 β [inst : Monoid Ξ± ] β Type (max?u.95345?u.95344) MulAction S M ] [ IsScalarTower : (M : Type ?u.91629) β
(N : Type ?u.91628) β (Ξ± : Type ?u.91627) β [inst : SMul M N ] β [inst : SMul N Ξ± ] β [inst : SMul M Ξ± ] β Prop IsScalarTower S R M ]
variable ( p : SubMulAction : (R : Type ?u.97000) β (M : Type ?u.96999) β [inst : SMul R M ] β Type ?u.96999 SubMulAction R M ) { s : S } { x y : M }
theorem smul_mem_iff ( s0 : s β 0 ) : s β’ x β p β x β p :=
p . smul_mem_iff' ( Units.mk0 s s0 )
#align sub_mul_action.smul_mem_iff SubMulAction.smul_mem_iff
end SubMulAction