Definitions of group actions #
This file defines a hierarchy of group action type-classes on top of the previously defined
notation classes has_scalar
and its additive version has_vadd
:
mul_action M α
and its additive versionadd_action G P
are typeclasses used for actions of multiplicative and additive monoids and groups; they extend notation classeshas_scalar
andhas_vadd
that are defined inalgebra.group.defs
;distrib_mul_action M A
is a typeclass for an action of a multiplicative monoid on an additive monoid such thata • (b + c) = a • b + a • c
anda • 0 = 0
.
The hierarchy is extended further by module
, defined elsewhere.
Also provided are typeclasses for faithful and transitive actions, and typeclasses regarding the interaction of different group actions,
smul_comm_class M N α
and its additive versionvadd_comm_class M N α
;is_scalar_tower M N α
(no additive version).is_central_scalar M α
(no additive version).
Notation #
a • b
is used as notation forhas_scalar.smul a b
.a +ᵥ b
is used as notation forhas_vadd.vadd a b
.
Implementation details #
This file should avoid depending on other parts of group_theory
, to avoid import cycles.
More sophisticated lemmas belong in group_theory.group_action
.
Tags #
group action
Faithful actions #
Typeclass for faithful actions.
Typeclass for faithful actions.
Instances
- function.End.apply_has_faithful_scalar
- add_monoid.End.apply_has_faithful_scalar
- left_cancel_monoid.to_has_faithful_opposite_scalar
- cancel_monoid_with_zero.to_has_faithful_opposite_scalar
- mul_aut.apply_has_faithful_scalar
- add_aut.apply_has_faithful_scalar
- units.has_faithful_scalar
- right_cancel_monoid.to_has_faithful_scalar
- equiv.perm.apply_has_faithful_scalar
- cancel_monoid_with_zero.to_has_faithful_scalar
- ring_hom.apply_has_faithful_scalar
- pi.has_faithful_scalar
- prod.has_faithful_scalar_left
- prod.has_faithful_scalar_right
- submonoid.has_faithful_scalar
- subgroup.has_faithful_scalar
- subsemiring.has_faithful_scalar
- subring.has_faithful_scalar
- linear_map.apply_has_faithful_scalar
- linear_equiv.apply_has_faithful_scalar
- finsupp.has_faithful_scalar
- alg_equiv.apply_has_faithful_scalar
See also monoid.to_mul_action
and mul_zero_class.to_smul_with_zero
.
Equations
- has_mul.to_has_scalar α = {smul := has_mul.mul _inst_1}
Equations
- has_add.to_has_scalar α = {vadd := has_add.add _inst_1}
- to_has_scalar : has_scalar α β
- one_smul : ∀ (b : β), 1 • b = b
- mul_smul : ∀ (x y : α) (b : β), (x * y) • b = x • y • b
Typeclass for multiplicative actions by monoids. This generalizes group actions.
Instances
- distrib_mul_action.to_mul_action
- mul_distrib_mul_action.to_mul_action
- mul_action_with_zero.to_mul_action
- monoid.to_mul_action
- function.End.apply_mul_action
- mul_opposite.mul_action
- monoid.to_opposite_mul_action
- units.mul_action
- units.mul_action'
- equiv.perm.apply_mul_action
- pi.mul_action
- pi.mul_action'
- prod.mul_action
- submonoid.mul_action
- subgroup.mul_action
- mul_action.orbit.mul_action
- mul_action.quotient
- mul_action.mul_left_cosets_comp_subtype_val
- subsemiring.mul_action
- subring.mul_action
- sub_mul_action.mul_action'
- sub_mul_action.mul_action
- punit.mul_action
- nnreal.mul_action
- ennreal.mul_action
- add_submonoid.pointwise_mul_action
- submonoid.pointwise_mul_action
- set.mul_action_set
(Pre)transitive action #
M
acts pretransitively on α
if for any x y
there is g
such that g • x = y
(or g +ᵥ x = y
for an additive action). A transitive action should furthermore have α
nonempty.
In this section we define typeclasses mul_action.is_pretransitive
and
add_action.is_pretransitive
and provide mul_action.exists_smul_eq
/add_action.exists_vadd_eq
,
mul_action.surjective_smul
/add_action.surjective_vadd
as public interface to access this
property. We do not provide typeclasses *_action.is_transitive
; users should assume
[mul_action.is_pretransitive M α] [nonempty α]
instead.
M
acts pretransitively on α
if for any x y
there is g
such that g +ᵥ x = y
.
A transitive action should furthermore have α
nonempty.
M
acts pretransitively on α
if for any x y
there is g
such that g • x = y
.
A transitive action should furthermore have α
nonempty.
The regular action of a group on itself is transitive.
Scalar tower and commuting actions #
A typeclass mixin saying that two additive actions on the same space commute.
Instances
- vadd_comm_class_self
- set.vadd_comm_class_set
- set.vadd_comm_class_set'
- set.vadd_comm_class
- pi.vadd_comm_class
- pi.vadd_comm_class'
- pi.vadd_comm_class''
- prod.vadd_comm_class
- prod.vadd_comm_class_both
- add_submonoid.vadd_comm_class_left
- add_submonoid.vadd_comm_class_right
- add_subgroup.vadd_comm_class_left
- add_subgroup.vadd_comm_class_right
A typeclass mixin saying that two multiplicative actions on the same space commute.
Instances
- has_scalar.comp.smul_comm_class
- has_scalar.comp.smul_comm_class'
- is_scalar_tower.to_smul_comm_class
- is_scalar_tower.to_smul_comm_class'
- smul_comm_class_self
- mul_opposite.smul_comm_class
- semigroup.opposite_smul_comm_class
- semigroup.opposite_smul_comm_class'
- smul_comm_class.opposite_mid
- units.smul_comm_class_left
- units.smul_comm_class_right
- units.smul_comm_class'
- add_comm_monoid.nat_smul_comm_class
- add_comm_monoid.nat_smul_comm_class'
- add_comm_group.int_smul_comm_class
- add_comm_group.int_smul_comm_class'
- smul_comm_class.rat
- smul_comm_class.rat'
- set.smul_comm_class_set
- set.smul_comm_class_set'
- set.smul_comm_class
- pi.smul_comm_class
- pi.smul_comm_class'
- pi.smul_comm_class''
- add_monoid_hom.smul_comm_class
- prod.smul_comm_class
- prod.smul_comm_class_both
- submonoid.smul_comm_class_left
- submonoid.smul_comm_class_right
- subgroup.smul_comm_class_left
- subgroup.smul_comm_class_right
- subsemiring.smul_comm_class_left
- subsemiring.smul_comm_class_right
- subring.smul_comm_class_left
- subring.smul_comm_class_right
- linear_map.smul_comm_class
- module.End.smul_comm_class
- module.End.smul_comm_class'
- linear_map.apply_smul_comm_class
- linear_map.apply_smul_comm_class'
- linear_equiv.apply_smul_comm_class
- linear_equiv.apply_smul_comm_class'
- punit.smul_comm_class
- dfinsupp.smul_comm_class
- finsupp.smul_comm_class
- alg_equiv.apply_smul_comm_class
- alg_equiv.apply_smul_comm_class'
- nnreal.smul_comm_class_left
- nnreal.smul_comm_class_right
- ennreal.smul_comm_class_left
- ennreal.smul_comm_class_right
Commutativity of actions is a symmetric relation. This lemma can't be an instance because this would cause a loop in the instance search graph.
Commutativity of additive actions is a symmetric relation. This lemma can't be an instance because this would cause a loop in the instance search graph.
An instance of is_scalar_tower M N α
states that the multiplicative
action of M
on α
is determined by the multiplicative actions of M
on N
and N
on α
.
Instances
- semigroup.is_scalar_tower
- is_scalar_tower.left
- mul_opposite.is_scalar_tower
- is_scalar_tower.opposite_mid
- units.is_scalar_tower
- units.is_scalar_tower'
- units.is_scalar_tower'_left
- add_comm_monoid.nat_is_scalar_tower
- add_comm_group.int_is_scalar_tower
- is_scalar_tower.rat
- set.is_scalar_tower
- set.is_scalar_tower'
- set.is_scalar_tower''
- pi.is_scalar_tower
- pi.is_scalar_tower'
- pi.is_scalar_tower''
- add_monoid_hom.is_scalar_tower
- prod.is_scalar_tower
- prod.is_scalar_tower_both
- submonoid.is_scalar_tower
- subgroup.is_scalar_tower
- subsemiring.is_scalar_tower
- subring.is_scalar_tower
- linear_map.is_scalar_tower
- module.End.is_scalar_tower
- sub_mul_action.is_scalar_tower
- submodule.is_scalar_tower
- submodule.restrict_scalars.is_scalar_tower
- punit.is_scalar_tower
- dfinsupp.is_scalar_tower
- finsupp.is_scalar_tower
- is_scalar_tower.right
- nnreal.is_scalar_tower
- ennreal.is_scalar_tower
- op_smul_eq_smul : ∀ (m : M) (a : α), mul_opposite.op m • a = m • a
A typeclass indicating that the right (aka mul_opposite
) and left actions by M
on α
are
equal, that is that M
acts centrally on α
. This can be thought of as a version of commutativity
for •
.
Instances
- mul_opposite.is_central_scalar
- comm_semigroup.is_central_scalar
- set.is_central_scalar
- pi.is_central_scalar
- add_monoid_hom.is_central_scalar
- prod.is_central_scalar
- submonoid.pointwise_central_scalar
- add_submonoid.pointwise_central_scalar
- linear_map.is_central_scalar
- sub_mul_action.is_central_scalar
- submodule.is_central_scalar
- dfinsupp.is_central_scalar
- finsupp.is_central_scalar
Auxiliary definition for has_vadd.comp
, add_action.comp_hom
, etc.
Equations
- has_vadd.comp.vadd g n a = g n +ᵥ a
Auxiliary definition for has_scalar.comp
, mul_action.comp_hom
,
distrib_mul_action.comp_hom
, module.comp_hom
, etc.
Equations
- has_scalar.comp.smul g n a = g n • a
An additive action of M
on α
and a function N → M
induces
an additive action of N
on α
Equations
- has_vadd.comp α g = {vadd := has_vadd.comp.vadd g}
An action of M
on α
and a function N → M
induces an action of N
on α
.
See note [reducible non-instances]. Since this is reducible, we make sure to go via
has_scalar.comp.smul
to prevent typeclass inference unfolding too far.
Equations
- has_scalar.comp α g = {smul := has_scalar.comp.smul g}
Given a tower of scalar actions M → α → β
, if we use has_scalar.comp
to pull back both of M
's actions by a map g : N → M
, then we obtain a new
tower of scalar actions N → α → β
.
This cannot be an instance because it can cause infinite loops whenever the has_scalar
arguments
are still metavariables.
Pullback a multiplicative action along an injective map respecting •
.
See note [reducible non-instances].
Equations
- function.injective.mul_action f hf smul = {to_has_scalar := {smul := has_scalar.smul _inst_3}, one_smul := _, mul_smul := _}
Pullback an additive action along an injective map respecting +ᵥ
.
Equations
- function.injective.add_action f hf smul = {to_has_vadd := {vadd := has_vadd.vadd _inst_3}, zero_vadd := _, add_vadd := _}
Pushforward an additive action along a surjective map respecting +ᵥ
.
Equations
- function.surjective.add_action f hf smul = {to_has_vadd := {vadd := has_vadd.vadd _inst_3}, zero_vadd := _, add_vadd := _}
Pushforward a multiplicative action along a surjective map respecting •
.
See note [reducible non-instances].
Equations
- function.surjective.mul_action f hf smul = {to_has_scalar := {smul := has_scalar.smul _inst_3}, one_smul := _, mul_smul := _}
Push forward the action of R
on M
along a compatible surjective map f : R →* S
.
See also function.surjective.distrib_mul_action_left
and function.surjective.module_left
.
Equations
- function.surjective.mul_action_left f hf hsmul = {to_has_scalar := {smul := has_scalar.smul _inst_6}, one_smul := _, mul_smul := _}
Push forward the action of R
on M
along a compatible
surjective map f : R →+ S
.
Equations
- function.surjective.add_action_left f hf hsmul = {to_has_vadd := {vadd := has_vadd.vadd _inst_6}, zero_vadd := _, add_vadd := _}
The regular action of a monoid on itself by left multiplication.
This is promoted to a module by semiring.to_module
.
Equations
- monoid.to_mul_action M = {to_has_scalar := {smul := has_mul.mul (mul_one_class.to_has_mul M)}, one_smul := _, mul_smul := _}
The regular action of a monoid on itself by left addition.
This is promoted to an add_torsor
by add_group_is_add_torsor
.
Equations
- add_monoid.to_add_action M = {to_has_vadd := {vadd := has_add.add (add_zero_class.to_has_add M)}, zero_vadd := _, add_vadd := _}
Note that the smul_comm_class α β β
typeclass argument is usually satisfied by algebra α β
.
Note that the is_scalar_tower α β β
typeclass argument is usually satisfied by algebra α β
.
Note that the is_scalar_tower M α α
and smul_comm_class M α α
typeclass arguments are
usually satisfied by algebra M α
.
Embedding of α
into functions M → α
induced by a multiplicative action of M
on α
.
Embedding of α
into functions M → α
induced by an additive action of M
on α
.
A multiplicative action of M
on α
and a monoid homomorphism N → M
induce
a multiplicative action of N
on α
.
See note [reducible non-instances].
Equations
- mul_action.comp_hom α g = {to_has_scalar := {smul := has_scalar.comp.smul ⇑g}, one_smul := _, mul_smul := _}
An additive action of M
on α
and an additive monoid homomorphism N → M
induce
an additive action of N
on α
.
See note [reducible non-instances].
Equations
- add_action.comp_hom α g = {to_has_vadd := {vadd := has_vadd.comp.vadd ⇑g}, zero_vadd := _, add_vadd := _}
- to_mul_action : mul_action M A
- smul_add : ∀ (r : M) (x y : A), r • (x + y) = r • x + r • y
- smul_zero : ∀ (r : M), r • 0 = 0
Typeclass for multiplicative actions on additive structures. This generalizes group modules.
Instances
- module.to_distrib_mul_action
- mul_semiring_action.to_distrib_mul_action
- add_monoid.End.apply_distrib_mul_action
- mul_opposite.distrib_mul_action
- add_aut.apply_distrib_mul_action
- units.distrib_mul_action
- ring_hom.apply_distrib_mul_action
- pi.distrib_mul_action
- pi.distrib_mul_action'
- add_monoid_hom.distrib_mul_action
- prod.distrib_mul_action
- submonoid.distrib_mul_action
- subgroup.distrib_mul_action
- subsemiring.distrib_mul_action
- subring.distrib_mul_action
- linear_map.distrib_mul_action
- linear_equiv.apply_distrib_mul_action
- punit.distrib_mul_action
- dfinsupp.distrib_mul_action
- finsupp.distrib_mul_action
- nnreal.distrib_mul_action
- ennreal.distrib_mul_action
Pullback a distributive multiplicative action along an injective additive monoid homomorphism. See note [reducible non-instances].
Equations
- function.injective.distrib_mul_action f hf smul = {to_mul_action := {to_has_scalar := {smul := has_scalar.smul _inst_5}, one_smul := _, mul_smul := _}, smul_add := _, smul_zero := _}
Pushforward a distributive multiplicative action along a surjective additive monoid homomorphism. See note [reducible non-instances].
Equations
- function.surjective.distrib_mul_action f hf smul = {to_mul_action := {to_has_scalar := {smul := has_scalar.smul _inst_5}, one_smul := _, mul_smul := _}, smul_add := _, smul_zero := _}
Push forward the action of R
on M
along a compatible surjective map f : R →* S
.
See also function.surjective.mul_action_left
and function.surjective.module_left
.
Equations
- function.surjective.distrib_mul_action_left f hf hsmul = {to_mul_action := {to_has_scalar := {smul := has_scalar.smul _inst_8}, one_smul := _, mul_smul := _}, smul_add := _, smul_zero := _}
Compose a distrib_mul_action
with a monoid_hom
, with action f r' • m
.
See note [reducible non-instances].
Equations
- distrib_mul_action.comp_hom A f = {to_mul_action := {to_has_scalar := {smul := has_scalar.comp.smul ⇑f}, one_smul := _, mul_smul := _}, smul_add := _, smul_zero := _}
Each element of the monoid defines a additive monoid homomorphism.
Equations
- distrib_mul_action.to_add_monoid_hom A x = {to_fun := has_scalar.smul x, map_zero' := _, map_add' := _}
Each element of the monoid defines an additive monoid homomorphism.
Equations
- distrib_mul_action.to_add_monoid_End M A = {to_fun := distrib_mul_action.to_add_monoid_hom A _inst_3, map_one' := _, map_mul' := _}
- to_mul_action : mul_action M A
- smul_mul : ∀ (r : M) (x y : A), r • x * y = (r • x) * r • y
- smul_one : ∀ (r : M), r • 1 = 1
Typeclass for multiplicative actions on multiplicative structures. This generalizes conjugation actions.
Instances
- mul_semiring_action.to_mul_distrib_mul_action
- mul_opposite.mul_distrib_mul_action
- mul_aut.apply_mul_distrib_mul_action
- units.mul_distrib_mul_action
- units.mul_distrib_mul_action'
- pi.mul_distrib_mul_action
- pi.mul_distrib_mul_action'
- prod.mul_distrib_mul_action
- submonoid.mul_distrib_mul_action
- subgroup.mul_distrib_mul_action
- subsemiring.mul_distrib_mul_action
- subring.mul_distrib_mul_action
- punit.mul_distrib_mul_action
Pullback a multiplicative distributive multiplicative action along an injective monoid homomorphism. See note [reducible non-instances].
Equations
- function.injective.mul_distrib_mul_action f hf smul = {to_mul_action := {to_has_scalar := {smul := has_scalar.smul _inst_5}, one_smul := _, mul_smul := _}, smul_mul := _, smul_one := _}
Pushforward a multiplicative distributive multiplicative action along a surjective monoid homomorphism. See note [reducible non-instances].
Equations
- function.surjective.mul_distrib_mul_action f hf smul = {to_mul_action := {to_has_scalar := {smul := has_scalar.smul _inst_5}, one_smul := _, mul_smul := _}, smul_mul := _, smul_one := _}
Compose a mul_distrib_mul_action
with a monoid_hom
, with action f r' • m
.
See note [reducible non-instances].
Equations
- mul_distrib_mul_action.comp_hom A f = {to_mul_action := {to_has_scalar := {smul := has_scalar.comp.smul ⇑f}, one_smul := _, mul_smul := _}, smul_mul := _, smul_one := _}
Scalar multiplication by r
as a monoid_hom
.
Equations
- mul_distrib_mul_action.to_monoid_hom A r = {to_fun := has_scalar.smul r, map_one' := _, map_mul' := _}
Each element of the monoid defines a monoid homomorphism.
Equations
- mul_distrib_mul_action.to_monoid_End M A = {to_fun := mul_distrib_mul_action.to_monoid_hom A _inst_3, map_one' := _, map_mul' := _}
The monoid of endomorphisms.
Note that this is generalized by category_theory.End
to categories other than Type u
.
Equations
- function.End α = (α → α)
Equations
- function.End.monoid α = {mul := function.comp α, mul_assoc := _, one := id α, one_mul := _, mul_one := _, npow := npow_rec (mul_one_class.to_has_mul (function.End α)), npow_zero' := _, npow_succ' := _}
Equations
- function.End.inhabited α = {default := 1}
The tautological action by function.End α
on α
.
This is generalized to bundled endomorphisms by:
equiv.perm.apply_mul_action
add_monoid.End.apply_distrib_mul_action
add_aut.apply_distrib_mul_action
mul_aut.apply_mul_distrib_mul_action
ring_hom.apply_distrib_mul_action
linear_equiv.apply_distrib_mul_action
linear_map.apply_module
ring_hom.apply_mul_semiring_action
alg_equiv.apply_mul_semiring_action
Equations
- function.End.apply_mul_action = {to_has_scalar := {smul := λ (_x : function.End α) (_y : α), _x _y}, one_smul := _, mul_smul := _}
function.End.apply_mul_action
is faithful.
The tautological action by add_monoid.End α
on α
.
This generalizes function.End.apply_mul_action
.
Equations
- add_monoid.End.apply_distrib_mul_action = {to_mul_action := {to_has_scalar := {smul := λ (_x : add_monoid.End α) (_y : α), ⇑_x _y}, one_smul := _, mul_smul := _}, smul_add := _, smul_zero := _}
add_monoid.End.apply_distrib_mul_action
is faithful.
The monoid hom representing a monoid action.
When M
is a group, see mul_action.to_perm_hom
.
Equations
- mul_action.to_End_hom = {to_fun := has_scalar.smul mul_action.to_has_scalar, map_one' := _, map_mul' := _}
The monoid action induced by a monoid hom to function.End α
See note [reducible non-instances].
Equations
The tautological additive action by additive (function.End α)
on α
.
Equations
- add_action.function_End = {to_has_vadd := {vadd := λ (_x : additive (function.End α)) (_y : α), _x _y}, zero_vadd := _, add_vadd := _}
The additive monoid hom representing an additive monoid action.
When M
is a group, see add_action.to_perm_hom
.
Equations
- add_action.to_End_hom = {to_fun := has_vadd.vadd add_action.to_has_vadd, map_zero' := _, map_add' := _}
The additive action induced by a hom to additive (function.End α)
See note [reducible non-instances].