Library mathcomp.fingroup.action
+ +
+(* (c) Copyright 2006-2016 Microsoft Corporation and Inria.
+ Distributed under the terms of CeCILL-B. *)
+Require Import mathcomp.ssreflect.ssreflect.
+ +
+
+
++ Distributed under the terms of CeCILL-B. *)
+Require Import mathcomp.ssreflect.ssreflect.
+ +
+
+ Group action: orbits, stabilisers, transitivity.
+ is_action D to == the function to : T -> aT -> T defines an action
+ of D : {set aT} on T.
+ action D T == structure for a function defining an action of D.
+ act_dom to == the domain D of to : action D rT.
+ {action: aT &-> T} == structure for a total action.
+ := action [set: aT] T
+ TotalAction to1 toM == the constructor for total actions; to1 and toM
+ are the proofs of the action identities for 1 and
+ a * b, respectively.
+ is_groupAction R to == to is a group action on range R: for all a in D,
+ the permutation induced by to a is in Aut R. Thus
+ the action of D must be trivial outside R.
+ groupAction D R == the structure for group actions of D on R. This
+ is a telescope on action D rT.
+ gact_range to == the range R of to : groupAction D R.
+ GroupAction toAut == constructs a groupAction for action to from
+ toAut : actm to @* D \subset Aut R (actm to is
+ the morphism to {perm rT} associated to 'to').
+ orbit to A x == the orbit of x under the action of A via to.
+ orbit_transversal to A S == a transversal of the partition orbit to A @: S
+ of S, provided A acts on S via to.
+ amove to A x y == the set of a in A whose action sends x to y.
+ 'C_A[x | to] == the stabiliser of x : rT in A :&: D.
+ 'C_A(S | to) == the pointwise stabiliser of S : {set rT} in D :&: A.
+ 'N_A(S | to) == the global stabiliser of S : {set rT} in D :&: A.
+ 'Fix(S | to) [a] == the set of fixpoints of a in S.
+ 'Fix(S | to)(A) == the set of fixpoints of A in S.
+ In the first three A can be omitted and defaults to the domain D of to;
+ in the last two S can be omitted and defaults to [set: T], so 'Fix_to[a]
+ is the set of all fixpoints of a.
+ The domain restriction ensures that stabilisers have a canonical group
+ structure, but note that 'Fix sets are generally not groups. Indeed, we
+ provide alternative definitions when to is a group action on R:
+ 'C(G | to)(A) == the centraliser in R :&: G of the group action of
+ D :&: A via to
+ 'C(G | to) [a] == the centraliser in R :&: G of a \in D, via to.
+ These sets are groups when G is; G can be omitted: 'C(|to)(A) is the
+ centraliser in R of the action of D :&: A via to.
+ [acts A, on S | to] == A \subset D acts on the set S via to.
+ {acts A, on S | to} == A acts on the set S (Prop statement).
+ {acts A, on group G | to} == [acts A, on S | to] /\ G \subset R, i.e.,
+ A \subset D acts on G \subset R, via
+ to : groupAction D R.
+ [transitive A, on S | to] == A acts transitively on S.
+ [faithful A, on S | to] == A acts faithfully on S.
+ acts_irreducibly to A G == A acts irreducibly via the groupAction to
+ on the nontrivial group G, i.e., A does
+ not act on any nontrivial subgroup of G.
+ Important caveat: the definitions of orbit, amove, 'Fix(S | to)(A),
+ transitive and faithful assume that A is a subset of the domain D. As most
+ of the permutation actions we consider are total this is usually harmless.
+ (Note that the theory of partial actions is only partially developed.)
+ In all of the above, to is expected to be the actual action structure,
+ not merely the function. There is a special scope %act for actions, and
+ constructions and notations for many classical actions:
+ 'P == natural action of a permutation group via aperm.
+ 'J == internal group action (conjugation) via conjg (_ ^ _).
+ 'R == regular group action (right translation) via mulg (_ * _).
+ (However, to limit ambiguity, _ * _ is NOT a canonical action.)
+ to^* == the action induced by to on {set rT} via to^* (== setact to).
+ 'Js == the internal action on subsets via _ :^ _, equivalent to 'J^*.
+ 'Rs == the regular action on subsets via rcoset, equivalent to 'R^*.
+ 'JG == the conjugation action on {group rT} via (_ :^ _)%G.
+ to / H == the action induced by to on coset_of H via qact to H, and
+ restricted to (qact_dom to H) == 'N(rcosets H 'N(H) | to^* ).
+ 'Q == the action induced to cosets by conjugation; the domain is
+ qact_dom 'J H, which is provably equal to 'N(H).
+ to %% A == the action of coset_of A via modact to A, with domain D / A
+ and support restricted to 'C(D :&: A | to).
+ to \ sAD == the action of A via ract to sAD == to, if sAD : A \subset D.
+ [Aut G] == the permutation action restricted to Aut G, via autact G.
+ < [nRA]> == the action of A on R via actby nRA == to in A and on R, and
+ the trivial action elsewhere; here nRA : [acts A, on R | to]
+ or nRA : {acts A, on group R | to}.
+ to^? == the action induced by to on sT : @subType rT P, via subact to
+ with domain subact_dom P to == 'N( [set x | P x] | to).
+ phi == the action of phi : D >-> {perm rT}, via mact phi.
+ to \o f == the composite action (with domain f @*^-1 D) of the action to
+ with f : {morphism G >-> aT}, via comp_act to f. Here f must
+ be the actual morphism object (e.g., coset_morphism H), not
+ the underlying function (e.g., coset H).
+ The explicit application of an action to is usually written (to%act x a),
+ but %act can be omitted if to is an abstract action or a set action to0^*.
+ Note that this form will simplify and expose the acting function.
+ There is a %gact scope for group actions; the notations above are
+ recognised in %gact when they denote canonical group actions.
+ Actions can be used to define morphisms:
+ actperm to == the morphism D >-> {perm rT} induced by to.
+ actm to a == if a \in D the function on D induced by the action to, else
+ the identity function. If to is a group action with range R
+ then actm to a is canonically a morphism on R.
+ We also define here the restriction operation on permutations (the domain
+ of this operations is a stabiliser), and local automorphism groups:
+ restr_perm S p == if p acts on S, the permutation with support in S that
+ coincides with p on S; else the identity. Note that
+ restr_perm is a permutation group morphism that maps
+ Aut G to Aut S when S is a subgroup of G.
+ Aut_in A G == the local permutation group 'N_A(G | 'P) / 'C_A(G | 'P)
+ Usually A is an automorphism group, and then Aut_in A G
+ is isomorphic to a subgroup of Aut G, specifically
+ restr_perm @* A.
+ Finally, gproduct.v will provide a semi-direct group construction that
+ maps an external group action to an internal one; the theory of morphisms
+ between such products makes use of the following definition:
+ morph_act to to' f fA <=> the action of to' on the images of f and fA is
+ the image of the action of to, i.e., for all x and a we
+ have f (to x a) = to' (f x) (fA a). Note that there is
+ no mention of the domains of to and to'; if needed, this
+ predicate should be restricted via the {in ...} notation
+ and domain conditions should be added.
+
+
+
+
+Set Implicit Arguments.
+ +
+Import GroupScope.
+ +
+Section ActionDef.
+ +
+Variables (aT : finGroupType) (D : {set aT}) (rT : Type).
+Implicit Types a b : aT.
+Implicit Type x : rT.
+ +
+Definition act_morph to x := ∀ a b, to x (a × b) = to (to x a) b.
+ +
+Definition is_action to :=
+ left_injective to ∧ ∀ x, {in D &, act_morph to x}.
+ +
+Record action := Action {act :> rT → aT → rT; _ : is_action act}.
+ +
+Definition clone_action to :=
+ let: Action _ toP := to return {type of Action for to} → action in
+ fun k ⇒ k toP.
+ +
+End ActionDef.
+ +
+
+
++Set Implicit Arguments.
+ +
+Import GroupScope.
+ +
+Section ActionDef.
+ +
+Variables (aT : finGroupType) (D : {set aT}) (rT : Type).
+Implicit Types a b : aT.
+Implicit Type x : rT.
+ +
+Definition act_morph to x := ∀ a b, to x (a × b) = to (to x a) b.
+ +
+Definition is_action to :=
+ left_injective to ∧ ∀ x, {in D &, act_morph to x}.
+ +
+Record action := Action {act :> rT → aT → rT; _ : is_action act}.
+ +
+Definition clone_action to :=
+ let: Action _ toP := to return {type of Action for to} → action in
+ fun k ⇒ k toP.
+ +
+End ActionDef.
+ +
+
+ Need to close the Section here to avoid re-declaring all Argument Scopes
+
+
+Delimit Scope action_scope with act.
+ +
+Notation "{ 'action' aT &-> T }" := (action [set: aT] T)
+ (at level 0, format "{ 'action' aT &-> T }") : type_scope.
+ +
+Notation "[ 'action' 'of' to ]" := (clone_action (@Action _ _ _ to))
+ (at level 0, format "[ 'action' 'of' to ]") : form_scope.
+ +
+Definition act_dom aT D rT of @action aT D rT := D.
+ +
+Section TotalAction.
+ +
+Variables (aT : finGroupType) (rT : Type) (to : rT → aT → rT).
+Hypotheses (to1 : to^~ 1 =1 id) (toM : ∀ x, act_morph to x).
+ +
+Lemma is_total_action : is_action setT to.
+ +
+Definition TotalAction := Action is_total_action.
+ +
+End TotalAction.
+ +
+Section ActionDefs.
+ +
+Variables (aT aT' : finGroupType) (D : {set aT}) (D' : {set aT'}).
+ +
+Definition morph_act rT rT' (to : action D rT) (to' : action D' rT') f fA :=
+ ∀ x a, f (to x a) = to' (f x) (fA a).
+ +
+Variable rT : finType. (* Most definitions require a finType structure on rT *)
+Implicit Type to : action D rT.
+Implicit Type A : {set aT}.
+Implicit Type S : {set rT}.
+ +
+Definition actm to a := if a \in D then to^~ a else id.
+ +
+Definition setact to S a := [set to x a | x in S].
+ +
+Definition orbit to A x := to x @: A.
+ +
+Definition amove to A x y := [set a in A | to x a == y].
+ +
+Definition afix to A := [set x | A \subset [set a | to x a == x]].
+ +
+Definition astab S to := D :&: [set a | S \subset [set x | to x a == x]].
+ +
+Definition astabs S to := D :&: [set a | S \subset to^~ a @^-1: S].
+ +
+Definition acts_on A S to := {in A, ∀ a x, (to x a \in S) = (x \in S)}.
+ +
+Definition atrans A S to := S \in orbit to A @: S.
+ +
+Definition faithful A S to := A :&: astab S to \subset [1].
+ +
+End ActionDefs.
+ +
+ +
+Notation "to ^*" := (setact to) (at level 2, format "to ^*") : fun_scope.
+ +
+ +
+Notation "''Fix_' to ( A )" := (afix to A)
+ (at level 8, to at level 2, format "''Fix_' to ( A )") : group_scope.
+ +
+
+
++ +
+Notation "{ 'action' aT &-> T }" := (action [set: aT] T)
+ (at level 0, format "{ 'action' aT &-> T }") : type_scope.
+ +
+Notation "[ 'action' 'of' to ]" := (clone_action (@Action _ _ _ to))
+ (at level 0, format "[ 'action' 'of' to ]") : form_scope.
+ +
+Definition act_dom aT D rT of @action aT D rT := D.
+ +
+Section TotalAction.
+ +
+Variables (aT : finGroupType) (rT : Type) (to : rT → aT → rT).
+Hypotheses (to1 : to^~ 1 =1 id) (toM : ∀ x, act_morph to x).
+ +
+Lemma is_total_action : is_action setT to.
+ +
+Definition TotalAction := Action is_total_action.
+ +
+End TotalAction.
+ +
+Section ActionDefs.
+ +
+Variables (aT aT' : finGroupType) (D : {set aT}) (D' : {set aT'}).
+ +
+Definition morph_act rT rT' (to : action D rT) (to' : action D' rT') f fA :=
+ ∀ x a, f (to x a) = to' (f x) (fA a).
+ +
+Variable rT : finType. (* Most definitions require a finType structure on rT *)
+Implicit Type to : action D rT.
+Implicit Type A : {set aT}.
+Implicit Type S : {set rT}.
+ +
+Definition actm to a := if a \in D then to^~ a else id.
+ +
+Definition setact to S a := [set to x a | x in S].
+ +
+Definition orbit to A x := to x @: A.
+ +
+Definition amove to A x y := [set a in A | to x a == y].
+ +
+Definition afix to A := [set x | A \subset [set a | to x a == x]].
+ +
+Definition astab S to := D :&: [set a | S \subset [set x | to x a == x]].
+ +
+Definition astabs S to := D :&: [set a | S \subset to^~ a @^-1: S].
+ +
+Definition acts_on A S to := {in A, ∀ a x, (to x a \in S) = (x \in S)}.
+ +
+Definition atrans A S to := S \in orbit to A @: S.
+ +
+Definition faithful A S to := A :&: astab S to \subset [1].
+ +
+End ActionDefs.
+ +
+ +
+Notation "to ^*" := (setact to) (at level 2, format "to ^*") : fun_scope.
+ +
+ +
+Notation "''Fix_' to ( A )" := (afix to A)
+ (at level 8, to at level 2, format "''Fix_' to ( A )") : group_scope.
+ +
+
+ camlp4 grammar factoring
+
+
+Notation "''Fix_' ( to ) ( A )" := 'Fix_to(A)
+ (at level 8, only parsing) : group_scope.
+ +
+Notation "''Fix_' ( S | to ) ( A )" := (S :&: 'Fix_to(A))
+ (at level 8, format "''Fix_' ( S | to ) ( A )") : group_scope.
+ +
+Notation "''Fix_' to [ a ]" := ('Fix_to([set a]))
+ (at level 8, to at level 2, format "''Fix_' to [ a ]") : group_scope.
+ +
+Notation "''Fix_' ( S | to ) [ a ]" := (S :&: 'Fix_to[a])
+ (at level 8, format "''Fix_' ( S | to ) [ a ]") : group_scope.
+ +
+Notation "''C' ( S | to )" := (astab S to)
+ (at level 8, format "''C' ( S | to )") : group_scope.
+ +
+Notation "''C_' A ( S | to )" := (A :&: 'C(S | to))
+ (at level 8, A at level 2, format "''C_' A ( S | to )") : group_scope.
+Notation "''C_' ( A ) ( S | to )" := 'C_A(S | to)
+ (at level 8, only parsing) : group_scope.
+ +
+Notation "''C' [ x | to ]" := ('C([set x] | to))
+ (at level 8, format "''C' [ x | to ]") : group_scope.
+ +
+Notation "''C_' A [ x | to ]" := (A :&: 'C[x | to])
+ (at level 8, A at level 2, format "''C_' A [ x | to ]") : group_scope.
+Notation "''C_' ( A ) [ x | to ]" := 'C_A[x | to]
+ (at level 8, only parsing) : group_scope.
+ +
+Notation "''N' ( S | to )" := (astabs S to)
+ (at level 8, format "''N' ( S | to )") : group_scope.
+ +
+Notation "''N_' A ( S | to )" := (A :&: 'N(S | to))
+ (at level 8, A at level 2, format "''N_' A ( S | to )") : group_scope.
+ +
+Notation "[ 'acts' A , 'on' S | to ]" := (A \subset pred_of_set 'N(S | to))
+ (at level 0, format "[ 'acts' A , 'on' S | to ]") : form_scope.
+ +
+Notation "{ 'acts' A , 'on' S | to }" := (acts_on A S to)
+ (at level 0, format "{ 'acts' A , 'on' S | to }") : form_scope.
+ +
+Notation "[ 'transitive' A , 'on' S | to ]" := (atrans A S to)
+ (at level 0, format "[ 'transitive' A , 'on' S | to ]") : form_scope.
+ +
+Notation "[ 'faithful' A , 'on' S | to ]" := (faithful A S to)
+ (at level 0, format "[ 'faithful' A , 'on' S | to ]") : form_scope.
+ +
+Section RawAction.
+
+
++ (at level 8, only parsing) : group_scope.
+ +
+Notation "''Fix_' ( S | to ) ( A )" := (S :&: 'Fix_to(A))
+ (at level 8, format "''Fix_' ( S | to ) ( A )") : group_scope.
+ +
+Notation "''Fix_' to [ a ]" := ('Fix_to([set a]))
+ (at level 8, to at level 2, format "''Fix_' to [ a ]") : group_scope.
+ +
+Notation "''Fix_' ( S | to ) [ a ]" := (S :&: 'Fix_to[a])
+ (at level 8, format "''Fix_' ( S | to ) [ a ]") : group_scope.
+ +
+Notation "''C' ( S | to )" := (astab S to)
+ (at level 8, format "''C' ( S | to )") : group_scope.
+ +
+Notation "''C_' A ( S | to )" := (A :&: 'C(S | to))
+ (at level 8, A at level 2, format "''C_' A ( S | to )") : group_scope.
+Notation "''C_' ( A ) ( S | to )" := 'C_A(S | to)
+ (at level 8, only parsing) : group_scope.
+ +
+Notation "''C' [ x | to ]" := ('C([set x] | to))
+ (at level 8, format "''C' [ x | to ]") : group_scope.
+ +
+Notation "''C_' A [ x | to ]" := (A :&: 'C[x | to])
+ (at level 8, A at level 2, format "''C_' A [ x | to ]") : group_scope.
+Notation "''C_' ( A ) [ x | to ]" := 'C_A[x | to]
+ (at level 8, only parsing) : group_scope.
+ +
+Notation "''N' ( S | to )" := (astabs S to)
+ (at level 8, format "''N' ( S | to )") : group_scope.
+ +
+Notation "''N_' A ( S | to )" := (A :&: 'N(S | to))
+ (at level 8, A at level 2, format "''N_' A ( S | to )") : group_scope.
+ +
+Notation "[ 'acts' A , 'on' S | to ]" := (A \subset pred_of_set 'N(S | to))
+ (at level 0, format "[ 'acts' A , 'on' S | to ]") : form_scope.
+ +
+Notation "{ 'acts' A , 'on' S | to }" := (acts_on A S to)
+ (at level 0, format "{ 'acts' A , 'on' S | to }") : form_scope.
+ +
+Notation "[ 'transitive' A , 'on' S | to ]" := (atrans A S to)
+ (at level 0, format "[ 'transitive' A , 'on' S | to ]") : form_scope.
+ +
+Notation "[ 'faithful' A , 'on' S | to ]" := (faithful A S to)
+ (at level 0, format "[ 'faithful' A , 'on' S | to ]") : form_scope.
+ +
+Section RawAction.
+
+ Lemmas that do not require the group structure on the action domain.
+ Some lemmas like actMin would be actually be valid for arbitrary rT,
+ e.g., for actions on a function type, but would be difficult to use
+ as a view due to the confusion between parameters and assumptions.
+
+
+
+
+Variables (aT : finGroupType) (D : {set aT}) (rT : finType) (to : action D rT).
+ +
+Implicit Types (a : aT) (x y : rT) (A B : {set aT}) (S T : {set rT}).
+ +
+Lemma act_inj : left_injective to.
+ +
+Lemma actMin x : {in D &, act_morph to x}.
+ +
+Lemma actmEfun a : a \in D → actm to a = to^~ a.
+ +
+Lemma actmE a : a \in D → actm to a =1 to^~ a.
+ +
+Lemma setactE S a : to^* S a = [set to x a | x in S].
+ +
+Lemma mem_setact S a x : x \in S → to x a \in to^* S a.
+ +
+Lemma card_setact S a : #|to^* S a| = #|S|.
+ +
+Lemma setact_is_action : is_action D to^*.
+ +
+Canonical set_action := Action setact_is_action.
+ +
+Lemma orbitE A x : orbit to A x = to x @: A.
+ +
+Lemma orbitP A x y :
+ reflect (exists2 a, a \in A & to x a = y) (y \in orbit to A x).
+ +
+Lemma mem_orbit A x a : a \in A → to x a \in orbit to A x.
+ +
+Lemma afixP A x : reflect (∀ a, a \in A → to x a = x) (x \in 'Fix_to(A)).
+ +
+Lemma afixS A B : A \subset B → 'Fix_to(B) \subset 'Fix_to(A).
+ +
+Lemma afixU A B : 'Fix_to(A :|: B) = 'Fix_to(A) :&: 'Fix_to(B).
+ +
+Lemma afix1P a x : reflect (to x a = x) (x \in 'Fix_to[a]).
+ +
+Lemma astabIdom S : 'C_D(S | to) = 'C(S | to).
+ +
+Lemma astab_dom S : {subset 'C(S | to) ≤ D}.
+ +
+Lemma astab_act S a x : a \in 'C(S | to) → x \in S → to x a = x.
+ +
+Lemma astabS S1 S2 : S1 \subset S2 → 'C(S2 | to) \subset 'C(S1 | to).
+ +
+Lemma astabsIdom S : 'N_D(S | to) = 'N(S | to).
+ +
+Lemma astabs_dom S : {subset 'N(S | to) ≤ D}.
+ +
+Lemma astabs_act S a x : a \in 'N(S | to) → (to x a \in S) = (x \in S).
+ +
+Lemma astab_sub S : 'C(S | to) \subset 'N(S | to).
+ +
+Lemma astabsC S : 'N(~: S | to) = 'N(S | to).
+ +
+Lemma astabsI S T : 'N(S | to) :&: 'N(T | to) \subset 'N(S :&: T | to).
+ +
+Lemma astabs_setact S a : a \in 'N(S | to) → to^* S a = S.
+ +
+Lemma astab1_set S : 'C[S | set_action] = 'N(S | to).
+ +
+Lemma astabs_set1 x : 'N([set x] | to) = 'C[x | to].
+ +
+Lemma acts_dom A S : [acts A, on S | to] → A \subset D.
+ +
+Lemma acts_act A S : [acts A, on S | to] → {acts A, on S | to}.
+ +
+Lemma astabCin A S :
+ A \subset D → (A \subset 'C(S | to)) = (S \subset 'Fix_to(A)).
+ +
+Section ActsSetop.
+ +
+Variables (A : {set aT}) (S T : {set rT}).
+Hypotheses (AactS : [acts A, on S | to]) (AactT : [acts A, on T | to]).
+ +
+Lemma astabU : 'C(S :|: T | to) = 'C(S | to) :&: 'C(T | to).
+ +
+Lemma astabsU : 'N(S | to) :&: 'N(T | to) \subset 'N(S :|: T | to).
+ +
+Lemma astabsD : 'N(S | to) :&: 'N(T | to) \subset 'N(S :\: T| to).
+ +
+Lemma actsI : [acts A, on S :&: T | to].
+ +
+Lemma actsU : [acts A, on S :|: T | to].
+ +
+Lemma actsD : [acts A, on S :\: T | to].
+ +
+End ActsSetop.
+ +
+Lemma acts_in_orbit A S x y :
+ [acts A, on S | to] → y \in orbit to A x → x \in S → y \in S.
+ +
+Lemma subset_faithful A B S :
+ B \subset A → [faithful A, on S | to] → [faithful B, on S | to].
+ +
+Section Reindex.
+ +
+Variables (vT : Type) (idx : vT) (op : Monoid.com_law idx) (S : {set rT}).
+ +
+Lemma reindex_astabs a F : a \in 'N(S | to) →
+ \big[op/idx]_(i in S) F i = \big[op/idx]_(i in S) F (to i a).
+ +
+Lemma reindex_acts A a F : [acts A, on S | to] → a \in A →
+ \big[op/idx]_(i in S) F i = \big[op/idx]_(i in S) F (to i a).
+ +
+End Reindex.
+ +
+End RawAction.
+ +
+
+
++Variables (aT : finGroupType) (D : {set aT}) (rT : finType) (to : action D rT).
+ +
+Implicit Types (a : aT) (x y : rT) (A B : {set aT}) (S T : {set rT}).
+ +
+Lemma act_inj : left_injective to.
+ +
+Lemma actMin x : {in D &, act_morph to x}.
+ +
+Lemma actmEfun a : a \in D → actm to a = to^~ a.
+ +
+Lemma actmE a : a \in D → actm to a =1 to^~ a.
+ +
+Lemma setactE S a : to^* S a = [set to x a | x in S].
+ +
+Lemma mem_setact S a x : x \in S → to x a \in to^* S a.
+ +
+Lemma card_setact S a : #|to^* S a| = #|S|.
+ +
+Lemma setact_is_action : is_action D to^*.
+ +
+Canonical set_action := Action setact_is_action.
+ +
+Lemma orbitE A x : orbit to A x = to x @: A.
+ +
+Lemma orbitP A x y :
+ reflect (exists2 a, a \in A & to x a = y) (y \in orbit to A x).
+ +
+Lemma mem_orbit A x a : a \in A → to x a \in orbit to A x.
+ +
+Lemma afixP A x : reflect (∀ a, a \in A → to x a = x) (x \in 'Fix_to(A)).
+ +
+Lemma afixS A B : A \subset B → 'Fix_to(B) \subset 'Fix_to(A).
+ +
+Lemma afixU A B : 'Fix_to(A :|: B) = 'Fix_to(A) :&: 'Fix_to(B).
+ +
+Lemma afix1P a x : reflect (to x a = x) (x \in 'Fix_to[a]).
+ +
+Lemma astabIdom S : 'C_D(S | to) = 'C(S | to).
+ +
+Lemma astab_dom S : {subset 'C(S | to) ≤ D}.
+ +
+Lemma astab_act S a x : a \in 'C(S | to) → x \in S → to x a = x.
+ +
+Lemma astabS S1 S2 : S1 \subset S2 → 'C(S2 | to) \subset 'C(S1 | to).
+ +
+Lemma astabsIdom S : 'N_D(S | to) = 'N(S | to).
+ +
+Lemma astabs_dom S : {subset 'N(S | to) ≤ D}.
+ +
+Lemma astabs_act S a x : a \in 'N(S | to) → (to x a \in S) = (x \in S).
+ +
+Lemma astab_sub S : 'C(S | to) \subset 'N(S | to).
+ +
+Lemma astabsC S : 'N(~: S | to) = 'N(S | to).
+ +
+Lemma astabsI S T : 'N(S | to) :&: 'N(T | to) \subset 'N(S :&: T | to).
+ +
+Lemma astabs_setact S a : a \in 'N(S | to) → to^* S a = S.
+ +
+Lemma astab1_set S : 'C[S | set_action] = 'N(S | to).
+ +
+Lemma astabs_set1 x : 'N([set x] | to) = 'C[x | to].
+ +
+Lemma acts_dom A S : [acts A, on S | to] → A \subset D.
+ +
+Lemma acts_act A S : [acts A, on S | to] → {acts A, on S | to}.
+ +
+Lemma astabCin A S :
+ A \subset D → (A \subset 'C(S | to)) = (S \subset 'Fix_to(A)).
+ +
+Section ActsSetop.
+ +
+Variables (A : {set aT}) (S T : {set rT}).
+Hypotheses (AactS : [acts A, on S | to]) (AactT : [acts A, on T | to]).
+ +
+Lemma astabU : 'C(S :|: T | to) = 'C(S | to) :&: 'C(T | to).
+ +
+Lemma astabsU : 'N(S | to) :&: 'N(T | to) \subset 'N(S :|: T | to).
+ +
+Lemma astabsD : 'N(S | to) :&: 'N(T | to) \subset 'N(S :\: T| to).
+ +
+Lemma actsI : [acts A, on S :&: T | to].
+ +
+Lemma actsU : [acts A, on S :|: T | to].
+ +
+Lemma actsD : [acts A, on S :\: T | to].
+ +
+End ActsSetop.
+ +
+Lemma acts_in_orbit A S x y :
+ [acts A, on S | to] → y \in orbit to A x → x \in S → y \in S.
+ +
+Lemma subset_faithful A B S :
+ B \subset A → [faithful A, on S | to] → [faithful B, on S | to].
+ +
+Section Reindex.
+ +
+Variables (vT : Type) (idx : vT) (op : Monoid.com_law idx) (S : {set rT}).
+ +
+Lemma reindex_astabs a F : a \in 'N(S | to) →
+ \big[op/idx]_(i in S) F i = \big[op/idx]_(i in S) F (to i a).
+ +
+Lemma reindex_acts A a F : [acts A, on S | to] → a \in A →
+ \big[op/idx]_(i in S) F i = \big[op/idx]_(i in S) F (to i a).
+ +
+End Reindex.
+ +
+End RawAction.
+ +
+
+ Warning: this directive depends on names of bound variables in the
+ definition of injective, in ssrfun.v.
+
+
+
+
+ Lemmas that require a (partial) group domain.
+
+
+
+
+Variables (aT : finGroupType) (D : {group aT}) (rT : finType).
+Variable to : action D rT.
+ +
+Implicit Types a : aT.
+Implicit Types x y : rT.
+Implicit Types A B : {set aT}.
+Implicit Types G H : {group aT}.
+Implicit Types S : {set rT}.
+ +
+Lemma act1 x : to x 1 = x.
+ +
+Lemma actKin : {in D, right_loop invg to}.
+ +
+Lemma actKVin : {in D, rev_right_loop invg to}.
+ +
+Lemma setactVin S a : a \in D → to^* S a^-1 = to^~ a @^-1: S.
+ +
+Lemma actXin x a i : a \in D → to x (a ^+ i) = iter i (to^~ a) x.
+ +
+Lemma afix1 : 'Fix_to(1) = setT.
+ +
+Lemma afixD1 G : 'Fix_to(G^#) = 'Fix_to(G).
+ +
+Lemma orbit_refl G x : x \in orbit to G x.
+ +
+ +
+Lemma contra_orbit G x y : x \notin orbit to G y → x != y.
+ +
+Lemma orbit_in_sym G : G \subset D → symmetric (orbit_rel G).
+ +
+Lemma orbit_in_trans G : G \subset D → transitive (orbit_rel G).
+ +
+Lemma orbit_in_eqP G x y :
+ G \subset D → reflect (orbit to G x = orbit to G y) (x \in orbit to G y).
+ +
+Lemma orbit_in_transl G x y z :
+ G \subset D → y \in orbit to G x →
+ (y \in orbit to G z) = (x \in orbit to G z).
+ +
+Lemma orbit_act_in x a G :
+ G \subset D → a \in G → orbit to G (to x a) = orbit to G x.
+ +
+Lemma orbit_actr_in x a G y :
+ G \subset D → a \in G → (to y a \in orbit to G x) = (y \in orbit to G x).
+ +
+Lemma orbit_inv_in A x y :
+ A \subset D → (y \in orbit to A^-1 x) = (x \in orbit to A y).
+ +
+Lemma orbit_lcoset_in A a x :
+ A \subset D → a \in D →
+ orbit to (a *: A) x = orbit to A (to x a).
+ +
+Lemma orbit_rcoset_in A a x y :
+ A \subset D → a \in D →
+ (to y a \in orbit to (A :* a) x) = (y \in orbit to A x).
+ +
+Lemma orbit_conjsg_in A a x y :
+ A \subset D → a \in D →
+ (to y a \in orbit to (A :^ a) (to x a)) = (y \in orbit to A x).
+ +
+Lemma orbit1P G x : reflect (orbit to G x = [set x]) (x \in 'Fix_to(G)).
+ +
+Lemma card_orbit1 G x : #|orbit to G x| = 1%N → orbit to G x = [set x].
+ +
+Lemma orbit_partition G S :
+ [acts G, on S | to] → partition (orbit to G @: S) S.
+ +
+Definition orbit_transversal A S := transversal (orbit to A @: S) S.
+ +
+Lemma orbit_transversalP G S (P := orbit to G @: S)
+ (X := orbit_transversal G S) :
+ [acts G, on S | to] →
+ [/\ is_transversal X P S, X \subset S,
+ {in X &, ∀ x y, (y \in orbit to G x) = (x == y)}
+ & ∀ x, x \in S → exists2 a, a \in G & to x a \in X].
+ +
+Lemma group_set_astab S : group_set 'C(S | to).
+ +
+Canonical astab_group S := group (group_set_astab S).
+ +
+Lemma afix_gen_in A : A \subset D → 'Fix_to(<<A>>) = 'Fix_to(A).
+ +
+Lemma afix_cycle_in a : a \in D → 'Fix_to(<[a]>) = 'Fix_to[a].
+ +
+Lemma afixYin A B :
+ A \subset D → B \subset D → 'Fix_to(A <*> B) = 'Fix_to(A) :&: 'Fix_to(B).
+ +
+Lemma afixMin G H :
+ G \subset D → H \subset D → 'Fix_to(G × H) = 'Fix_to(G) :&: 'Fix_to(H).
+ +
+Lemma sub_astab1_in A x :
+ A \subset D → (A \subset 'C[x | to]) = (x \in 'Fix_to(A)).
+ +
+Lemma group_set_astabs S : group_set 'N(S | to).
+ +
+Canonical astabs_group S := group (group_set_astabs S).
+ +
+Lemma astab_norm S : 'N(S | to) \subset 'N('C(S | to)).
+ +
+Lemma astab_normal S : 'C(S | to) <| 'N(S | to).
+ +
+Lemma acts_sub_orbit G S x :
+ [acts G, on S | to] → (orbit to G x \subset S) = (x \in S).
+ +
+Lemma acts_orbit G x : G \subset D → [acts G, on orbit to G x | to].
+ +
+Lemma acts_subnorm_fix A : [acts 'N_D(A), on 'Fix_to(D :&: A) | to].
+ +
+Lemma atrans_orbit G x : [transitive G, on orbit to G x | to].
+ +
+Section OrbitStabilizer.
+ +
+Variables (G : {group aT}) (x : rT).
+Hypothesis sGD : G \subset D.
+Let ssGD := subsetP sGD.
+ +
+Lemma amove_act a : a \in G → amove to G x (to x a) = 'C_G[x | to] :* a.
+ +
+Lemma amove_orbit : amove to G x @: orbit to G x = rcosets 'C_G[x | to] G.
+ +
+Lemma amoveK :
+ {in orbit to G x, cancel (amove to G x) (fun Ca ⇒ to x (repr Ca))}.
+ +
+Lemma orbit_stabilizer :
+ orbit to G x = [set to x (repr Ca) | Ca in rcosets 'C_G[x | to] G].
+ +
+Lemma act_reprK :
+ {in rcosets 'C_G[x | to] G, cancel (to x \o repr) (amove to G x)}.
+ +
+End OrbitStabilizer.
+ +
+Lemma card_orbit_in G x : G \subset D → #|orbit to G x| = #|G : 'C_G[x | to]|.
+ +
+Lemma card_orbit_in_stab G x :
+ G \subset D → (#|orbit to G x| × #|'C_G[x | to]|)%N = #|G|.
+ +
+Lemma acts_sum_card_orbit G S :
+ [acts G, on S | to] → \sum_(T in orbit to G @: S) #|T| = #|S|.
+ +
+Lemma astab_setact_in S a : a \in D → 'C(to^* S a | to) = 'C(S | to) :^ a.
+ +
+Lemma astab1_act_in x a : a \in D → 'C[to x a | to] = 'C[x | to] :^ a.
+ +
+Theorem Frobenius_Cauchy G S : [acts G, on S | to] →
+ \sum_(a in G) #|'Fix_(S | to)[a]| = (#|orbit to G @: S| × #|G|)%N.
+ +
+Lemma atrans_dvd_index_in G S :
+ G \subset D → [transitive G, on S | to] → #|S| %| #|G : 'C_G(S | to)|.
+ +
+Lemma atrans_dvd_in G S :
+ G \subset D → [transitive G, on S | to] → #|S| %| #|G|.
+ +
+Lemma atransPin G S :
+ G \subset D → [transitive G, on S | to] →
+ ∀ x, x \in S → orbit to G x = S.
+ +
+Lemma atransP2in G S :
+ G \subset D → [transitive G, on S | to] →
+ {in S &, ∀ x y, exists2 a, a \in G & y = to x a}.
+ +
+Lemma atrans_acts_in G S :
+ G \subset D → [transitive G, on S | to] → [acts G, on S | to].
+ +
+Lemma subgroup_transitivePin G H S x :
+ x \in S → H \subset G → G \subset D → [transitive G, on S | to] →
+ reflect ('C_G[x | to] × H = G) [transitive H, on S | to].
+ +
+End PartialAction.
+ +
+ +
+Notation "''C' ( S | to )" := (astab_group to S) : Group_scope.
+Notation "''C_' A ( S | to )" := (setI_group A 'C(S | to)) : Group_scope.
+Notation "''C_' ( A ) ( S | to )" := (setI_group A 'C(S | to))
+ (only parsing) : Group_scope.
+Notation "''C' [ x | to ]" := (astab_group to [set x%g]) : Group_scope.
+Notation "''C_' A [ x | to ]" := (setI_group A 'C[x | to]) : Group_scope.
+Notation "''C_' ( A ) [ x | to ]" := (setI_group A 'C[x | to])
+ (only parsing) : Group_scope.
+Notation "''N' ( S | to )" := (astabs_group to S) : Group_scope.
+Notation "''N_' A ( S | to )" := (setI_group A 'N(S | to)) : Group_scope.
+ +
+Section TotalActions.
+
+
++Variables (aT : finGroupType) (D : {group aT}) (rT : finType).
+Variable to : action D rT.
+ +
+Implicit Types a : aT.
+Implicit Types x y : rT.
+Implicit Types A B : {set aT}.
+Implicit Types G H : {group aT}.
+Implicit Types S : {set rT}.
+ +
+Lemma act1 x : to x 1 = x.
+ +
+Lemma actKin : {in D, right_loop invg to}.
+ +
+Lemma actKVin : {in D, rev_right_loop invg to}.
+ +
+Lemma setactVin S a : a \in D → to^* S a^-1 = to^~ a @^-1: S.
+ +
+Lemma actXin x a i : a \in D → to x (a ^+ i) = iter i (to^~ a) x.
+ +
+Lemma afix1 : 'Fix_to(1) = setT.
+ +
+Lemma afixD1 G : 'Fix_to(G^#) = 'Fix_to(G).
+ +
+Lemma orbit_refl G x : x \in orbit to G x.
+ +
+ +
+Lemma contra_orbit G x y : x \notin orbit to G y → x != y.
+ +
+Lemma orbit_in_sym G : G \subset D → symmetric (orbit_rel G).
+ +
+Lemma orbit_in_trans G : G \subset D → transitive (orbit_rel G).
+ +
+Lemma orbit_in_eqP G x y :
+ G \subset D → reflect (orbit to G x = orbit to G y) (x \in orbit to G y).
+ +
+Lemma orbit_in_transl G x y z :
+ G \subset D → y \in orbit to G x →
+ (y \in orbit to G z) = (x \in orbit to G z).
+ +
+Lemma orbit_act_in x a G :
+ G \subset D → a \in G → orbit to G (to x a) = orbit to G x.
+ +
+Lemma orbit_actr_in x a G y :
+ G \subset D → a \in G → (to y a \in orbit to G x) = (y \in orbit to G x).
+ +
+Lemma orbit_inv_in A x y :
+ A \subset D → (y \in orbit to A^-1 x) = (x \in orbit to A y).
+ +
+Lemma orbit_lcoset_in A a x :
+ A \subset D → a \in D →
+ orbit to (a *: A) x = orbit to A (to x a).
+ +
+Lemma orbit_rcoset_in A a x y :
+ A \subset D → a \in D →
+ (to y a \in orbit to (A :* a) x) = (y \in orbit to A x).
+ +
+Lemma orbit_conjsg_in A a x y :
+ A \subset D → a \in D →
+ (to y a \in orbit to (A :^ a) (to x a)) = (y \in orbit to A x).
+ +
+Lemma orbit1P G x : reflect (orbit to G x = [set x]) (x \in 'Fix_to(G)).
+ +
+Lemma card_orbit1 G x : #|orbit to G x| = 1%N → orbit to G x = [set x].
+ +
+Lemma orbit_partition G S :
+ [acts G, on S | to] → partition (orbit to G @: S) S.
+ +
+Definition orbit_transversal A S := transversal (orbit to A @: S) S.
+ +
+Lemma orbit_transversalP G S (P := orbit to G @: S)
+ (X := orbit_transversal G S) :
+ [acts G, on S | to] →
+ [/\ is_transversal X P S, X \subset S,
+ {in X &, ∀ x y, (y \in orbit to G x) = (x == y)}
+ & ∀ x, x \in S → exists2 a, a \in G & to x a \in X].
+ +
+Lemma group_set_astab S : group_set 'C(S | to).
+ +
+Canonical astab_group S := group (group_set_astab S).
+ +
+Lemma afix_gen_in A : A \subset D → 'Fix_to(<<A>>) = 'Fix_to(A).
+ +
+Lemma afix_cycle_in a : a \in D → 'Fix_to(<[a]>) = 'Fix_to[a].
+ +
+Lemma afixYin A B :
+ A \subset D → B \subset D → 'Fix_to(A <*> B) = 'Fix_to(A) :&: 'Fix_to(B).
+ +
+Lemma afixMin G H :
+ G \subset D → H \subset D → 'Fix_to(G × H) = 'Fix_to(G) :&: 'Fix_to(H).
+ +
+Lemma sub_astab1_in A x :
+ A \subset D → (A \subset 'C[x | to]) = (x \in 'Fix_to(A)).
+ +
+Lemma group_set_astabs S : group_set 'N(S | to).
+ +
+Canonical astabs_group S := group (group_set_astabs S).
+ +
+Lemma astab_norm S : 'N(S | to) \subset 'N('C(S | to)).
+ +
+Lemma astab_normal S : 'C(S | to) <| 'N(S | to).
+ +
+Lemma acts_sub_orbit G S x :
+ [acts G, on S | to] → (orbit to G x \subset S) = (x \in S).
+ +
+Lemma acts_orbit G x : G \subset D → [acts G, on orbit to G x | to].
+ +
+Lemma acts_subnorm_fix A : [acts 'N_D(A), on 'Fix_to(D :&: A) | to].
+ +
+Lemma atrans_orbit G x : [transitive G, on orbit to G x | to].
+ +
+Section OrbitStabilizer.
+ +
+Variables (G : {group aT}) (x : rT).
+Hypothesis sGD : G \subset D.
+Let ssGD := subsetP sGD.
+ +
+Lemma amove_act a : a \in G → amove to G x (to x a) = 'C_G[x | to] :* a.
+ +
+Lemma amove_orbit : amove to G x @: orbit to G x = rcosets 'C_G[x | to] G.
+ +
+Lemma amoveK :
+ {in orbit to G x, cancel (amove to G x) (fun Ca ⇒ to x (repr Ca))}.
+ +
+Lemma orbit_stabilizer :
+ orbit to G x = [set to x (repr Ca) | Ca in rcosets 'C_G[x | to] G].
+ +
+Lemma act_reprK :
+ {in rcosets 'C_G[x | to] G, cancel (to x \o repr) (amove to G x)}.
+ +
+End OrbitStabilizer.
+ +
+Lemma card_orbit_in G x : G \subset D → #|orbit to G x| = #|G : 'C_G[x | to]|.
+ +
+Lemma card_orbit_in_stab G x :
+ G \subset D → (#|orbit to G x| × #|'C_G[x | to]|)%N = #|G|.
+ +
+Lemma acts_sum_card_orbit G S :
+ [acts G, on S | to] → \sum_(T in orbit to G @: S) #|T| = #|S|.
+ +
+Lemma astab_setact_in S a : a \in D → 'C(to^* S a | to) = 'C(S | to) :^ a.
+ +
+Lemma astab1_act_in x a : a \in D → 'C[to x a | to] = 'C[x | to] :^ a.
+ +
+Theorem Frobenius_Cauchy G S : [acts G, on S | to] →
+ \sum_(a in G) #|'Fix_(S | to)[a]| = (#|orbit to G @: S| × #|G|)%N.
+ +
+Lemma atrans_dvd_index_in G S :
+ G \subset D → [transitive G, on S | to] → #|S| %| #|G : 'C_G(S | to)|.
+ +
+Lemma atrans_dvd_in G S :
+ G \subset D → [transitive G, on S | to] → #|S| %| #|G|.
+ +
+Lemma atransPin G S :
+ G \subset D → [transitive G, on S | to] →
+ ∀ x, x \in S → orbit to G x = S.
+ +
+Lemma atransP2in G S :
+ G \subset D → [transitive G, on S | to] →
+ {in S &, ∀ x y, exists2 a, a \in G & y = to x a}.
+ +
+Lemma atrans_acts_in G S :
+ G \subset D → [transitive G, on S | to] → [acts G, on S | to].
+ +
+Lemma subgroup_transitivePin G H S x :
+ x \in S → H \subset G → G \subset D → [transitive G, on S | to] →
+ reflect ('C_G[x | to] × H = G) [transitive H, on S | to].
+ +
+End PartialAction.
+ +
+ +
+Notation "''C' ( S | to )" := (astab_group to S) : Group_scope.
+Notation "''C_' A ( S | to )" := (setI_group A 'C(S | to)) : Group_scope.
+Notation "''C_' ( A ) ( S | to )" := (setI_group A 'C(S | to))
+ (only parsing) : Group_scope.
+Notation "''C' [ x | to ]" := (astab_group to [set x%g]) : Group_scope.
+Notation "''C_' A [ x | to ]" := (setI_group A 'C[x | to]) : Group_scope.
+Notation "''C_' ( A ) [ x | to ]" := (setI_group A 'C[x | to])
+ (only parsing) : Group_scope.
+Notation "''N' ( S | to )" := (astabs_group to S) : Group_scope.
+Notation "''N_' A ( S | to )" := (setI_group A 'N(S | to)) : Group_scope.
+ +
+Section TotalActions.
+
+ These lemmas are only established for total actions (domain = [set: rT])
+
+
+
+
+Variable (aT : finGroupType) (rT : finType).
+ +
+Variable to : {action aT &-> rT}.
+ +
+Implicit Types (a b : aT) (x y z : rT) (A B : {set aT}) (G H : {group aT}).
+Implicit Type S : {set rT}.
+ +
+Lemma actM x a b : to x (a × b) = to (to x a) b.
+ +
+Lemma actK : right_loop invg to.
+ +
+Lemma actKV : rev_right_loop invg to.
+ +
+Lemma actX x a n : to x (a ^+ n) = iter n (to^~ a) x.
+ +
+Lemma actCJ a b x : to (to x a) b = to (to x b) (a ^ b).
+ +
+Lemma actCJV a b x : to (to x a) b = to (to x (b ^ a^-1)) a.
+ +
+Lemma orbit_sym G x y : (x \in orbit to G y) = (y \in orbit to G x).
+ +
+Lemma orbit_trans G x y z :
+ x \in orbit to G y → y \in orbit to G z → x \in orbit to G z.
+ +
+Lemma orbit_eqP G x y :
+ reflect (orbit to G x = orbit to G y) (x \in orbit to G y).
+ +
+Lemma orbit_transl G x y z :
+ y \in orbit to G x → (y \in orbit to G z) = (x \in orbit to G z).
+ +
+Lemma orbit_act G a x: a \in G → orbit to G (to x a) = orbit to G x.
+ +
+Lemma orbit_actr G a x y :
+ a \in G → (to y a \in orbit to G x) = (y \in orbit to G x).
+ +
+Lemma orbit_eq_mem G x y :
+ (orbit to G x == orbit to G y) = (x \in orbit to G y).
+ +
+Lemma orbit_inv A x y : (y \in orbit to A^-1 x) = (x \in orbit to A y).
+ +
+Lemma orbit_lcoset A a x : orbit to (a *: A) x = orbit to A (to x a).
+ +
+Lemma orbit_rcoset A a x y :
+ (to y a \in orbit to (A :* a) x) = (y \in orbit to A x).
+ +
+Lemma orbit_conjsg A a x y :
+ (to y a \in orbit to (A :^ a) (to x a)) = (y \in orbit to A x).
+ +
+Lemma astabP S a : reflect (∀ x, x \in S → to x a = x) (a \in 'C(S | to)).
+ +
+Lemma astab1P x a : reflect (to x a = x) (a \in 'C[x | to]).
+ +
+Lemma sub_astab1 A x : (A \subset 'C[x | to]) = (x \in 'Fix_to(A)).
+ +
+Lemma astabC A S : (A \subset 'C(S | to)) = (S \subset 'Fix_to(A)).
+ +
+Lemma afix_cycle a : 'Fix_to(<[a]>) = 'Fix_to[a].
+ +
+Lemma afix_gen A : 'Fix_to(<<A>>) = 'Fix_to(A).
+ +
+Lemma afixM G H : 'Fix_to(G × H) = 'Fix_to(G) :&: 'Fix_to(H).
+ +
+Lemma astabsP S a :
+ reflect (∀ x, (to x a \in S) = (x \in S)) (a \in 'N(S | to)).
+ +
+Lemma card_orbit G x : #|orbit to G x| = #|G : 'C_G[x | to]|.
+ +
+Lemma dvdn_orbit G x : #|orbit to G x| %| #|G|.
+ +
+Lemma card_orbit_stab G x : (#|orbit to G x| × #|'C_G[x | to]|)%N = #|G|.
+ +
+Lemma actsP A S : reflect {acts A, on S | to} [acts A, on S | to].
+ +
+Lemma setact_orbit A x b : to^* (orbit to A x) b = orbit to (A :^ b) (to x b).
+ +
+Lemma astab_setact S a : 'C(to^* S a | to) = 'C(S | to) :^ a.
+ +
+Lemma astab1_act x a : 'C[to x a | to] = 'C[x | to] :^ a.
+ +
+Lemma atransP G S : [transitive G, on S | to] →
+ ∀ x, x \in S → orbit to G x = S.
+ +
+Lemma atransP2 G S : [transitive G, on S | to] →
+ {in S &, ∀ x y, exists2 a, a \in G & y = to x a}.
+ +
+Lemma atrans_acts G S : [transitive G, on S | to] → [acts G, on S | to].
+ +
+Lemma atrans_supgroup G H S :
+ G \subset H → [transitive G, on S | to] →
+ [transitive H, on S | to] = [acts H, on S | to].
+ +
+Lemma atrans_acts_card G S :
+ [transitive G, on S | to] =
+ [acts G, on S | to] && (#|orbit to G @: S| == 1%N).
+ +
+Lemma atrans_dvd G S : [transitive G, on S | to] → #|S| %| #|G|.
+ +
+
+
++Variable (aT : finGroupType) (rT : finType).
+ +
+Variable to : {action aT &-> rT}.
+ +
+Implicit Types (a b : aT) (x y z : rT) (A B : {set aT}) (G H : {group aT}).
+Implicit Type S : {set rT}.
+ +
+Lemma actM x a b : to x (a × b) = to (to x a) b.
+ +
+Lemma actK : right_loop invg to.
+ +
+Lemma actKV : rev_right_loop invg to.
+ +
+Lemma actX x a n : to x (a ^+ n) = iter n (to^~ a) x.
+ +
+Lemma actCJ a b x : to (to x a) b = to (to x b) (a ^ b).
+ +
+Lemma actCJV a b x : to (to x a) b = to (to x (b ^ a^-1)) a.
+ +
+Lemma orbit_sym G x y : (x \in orbit to G y) = (y \in orbit to G x).
+ +
+Lemma orbit_trans G x y z :
+ x \in orbit to G y → y \in orbit to G z → x \in orbit to G z.
+ +
+Lemma orbit_eqP G x y :
+ reflect (orbit to G x = orbit to G y) (x \in orbit to G y).
+ +
+Lemma orbit_transl G x y z :
+ y \in orbit to G x → (y \in orbit to G z) = (x \in orbit to G z).
+ +
+Lemma orbit_act G a x: a \in G → orbit to G (to x a) = orbit to G x.
+ +
+Lemma orbit_actr G a x y :
+ a \in G → (to y a \in orbit to G x) = (y \in orbit to G x).
+ +
+Lemma orbit_eq_mem G x y :
+ (orbit to G x == orbit to G y) = (x \in orbit to G y).
+ +
+Lemma orbit_inv A x y : (y \in orbit to A^-1 x) = (x \in orbit to A y).
+ +
+Lemma orbit_lcoset A a x : orbit to (a *: A) x = orbit to A (to x a).
+ +
+Lemma orbit_rcoset A a x y :
+ (to y a \in orbit to (A :* a) x) = (y \in orbit to A x).
+ +
+Lemma orbit_conjsg A a x y :
+ (to y a \in orbit to (A :^ a) (to x a)) = (y \in orbit to A x).
+ +
+Lemma astabP S a : reflect (∀ x, x \in S → to x a = x) (a \in 'C(S | to)).
+ +
+Lemma astab1P x a : reflect (to x a = x) (a \in 'C[x | to]).
+ +
+Lemma sub_astab1 A x : (A \subset 'C[x | to]) = (x \in 'Fix_to(A)).
+ +
+Lemma astabC A S : (A \subset 'C(S | to)) = (S \subset 'Fix_to(A)).
+ +
+Lemma afix_cycle a : 'Fix_to(<[a]>) = 'Fix_to[a].
+ +
+Lemma afix_gen A : 'Fix_to(<<A>>) = 'Fix_to(A).
+ +
+Lemma afixM G H : 'Fix_to(G × H) = 'Fix_to(G) :&: 'Fix_to(H).
+ +
+Lemma astabsP S a :
+ reflect (∀ x, (to x a \in S) = (x \in S)) (a \in 'N(S | to)).
+ +
+Lemma card_orbit G x : #|orbit to G x| = #|G : 'C_G[x | to]|.
+ +
+Lemma dvdn_orbit G x : #|orbit to G x| %| #|G|.
+ +
+Lemma card_orbit_stab G x : (#|orbit to G x| × #|'C_G[x | to]|)%N = #|G|.
+ +
+Lemma actsP A S : reflect {acts A, on S | to} [acts A, on S | to].
+ +
+Lemma setact_orbit A x b : to^* (orbit to A x) b = orbit to (A :^ b) (to x b).
+ +
+Lemma astab_setact S a : 'C(to^* S a | to) = 'C(S | to) :^ a.
+ +
+Lemma astab1_act x a : 'C[to x a | to] = 'C[x | to] :^ a.
+ +
+Lemma atransP G S : [transitive G, on S | to] →
+ ∀ x, x \in S → orbit to G x = S.
+ +
+Lemma atransP2 G S : [transitive G, on S | to] →
+ {in S &, ∀ x y, exists2 a, a \in G & y = to x a}.
+ +
+Lemma atrans_acts G S : [transitive G, on S | to] → [acts G, on S | to].
+ +
+Lemma atrans_supgroup G H S :
+ G \subset H → [transitive G, on S | to] →
+ [transitive H, on S | to] = [acts H, on S | to].
+ +
+Lemma atrans_acts_card G S :
+ [transitive G, on S | to] =
+ [acts G, on S | to] && (#|orbit to G @: S| == 1%N).
+ +
+Lemma atrans_dvd G S : [transitive G, on S | to] → #|S| %| #|G|.
+ +
+
+ This is Aschbacher (5.2)
+
+
+Lemma acts_fix_norm A B : A \subset 'N(B) → [acts A, on 'Fix_to(B) | to].
+ +
+Lemma faithfulP A S :
+ reflect (∀ a, a \in A → {in S, to^~ a =1 id} → a = 1)
+ [faithful A, on S | to].
+ +
+
+
++ +
+Lemma faithfulP A S :
+ reflect (∀ a, a \in A → {in S, to^~ a =1 id} → a = 1)
+ [faithful A, on S | to].
+ +
+
+ This is the first part of Aschbacher (5.7)
+
+
+Lemma astab_trans_gcore G S u :
+ [transitive G, on S | to] → u \in S → 'C(S | to) = gcore 'C[u | to] G.
+ +
+
+
++ [transitive G, on S | to] → u \in S → 'C(S | to) = gcore 'C[u | to] G.
+ +
+
+ This is Aschbacher (5.20)
+
+
+Theorem subgroup_transitiveP G H S x :
+ x \in S → H \subset G → [transitive G, on S | to] →
+ reflect ('C_G[x | to] × H = G) [transitive H, on S | to].
+ +
+
+
++ x \in S → H \subset G → [transitive G, on S | to] →
+ reflect ('C_G[x | to] × H = G) [transitive H, on S | to].
+ +
+
+ This is Aschbacher (5.21)
+
+
+Lemma trans_subnorm_fixP x G H S :
+ let C := 'C_G[x | to] in let T := 'Fix_(S | to)(H) in
+ [transitive G, on S | to] → x \in S → H \subset C →
+ reflect ((H :^: G) ::&: C = H :^: C) [transitive 'N_G(H), on T | to].
+ +
+End TotalActions.
+ +
+ +
+Section Restrict.
+ +
+Variables (aT : finGroupType) (D : {set aT}) (rT : Type).
+Variables (to : action D rT) (A : {set aT}).
+ +
+Definition ract of A \subset D := act to.
+ +
+Variable sAD : A \subset D.
+ +
+Lemma ract_is_action : is_action A (ract sAD).
+ +
+Canonical raction := Action ract_is_action.
+ +
+Lemma ractE : raction =1 to.
+ +
+
+
++ let C := 'C_G[x | to] in let T := 'Fix_(S | to)(H) in
+ [transitive G, on S | to] → x \in S → H \subset C →
+ reflect ((H :^: G) ::&: C = H :^: C) [transitive 'N_G(H), on T | to].
+ +
+End TotalActions.
+ +
+ +
+Section Restrict.
+ +
+Variables (aT : finGroupType) (D : {set aT}) (rT : Type).
+Variables (to : action D rT) (A : {set aT}).
+ +
+Definition ract of A \subset D := act to.
+ +
+Variable sAD : A \subset D.
+ +
+Lemma ract_is_action : is_action A (ract sAD).
+ +
+Canonical raction := Action ract_is_action.
+ +
+Lemma ractE : raction =1 to.
+ +
+
+ Other properties of raction need rT : finType; we defer them
+ until after the definition of actperm.
+
+
+
+
+End Restrict.
+ +
+Notation "to \ sAD" := (raction to sAD) (at level 50) : action_scope.
+ +
+Section ActBy.
+ +
+Variables (aT : finGroupType) (D : {set aT}) (rT : finType).
+ +
+Definition actby_cond (A : {set aT}) R (to : action D rT) : Prop :=
+ [acts A, on R | to].
+ +
+Definition actby A R to of actby_cond A R to :=
+ fun x a ⇒ if (x \in R) && (a \in A) then to x a else x.
+ +
+Variables (A : {group aT}) (R : {set rT}) (to : action D rT).
+Hypothesis nRA : actby_cond A R to.
+ +
+Lemma actby_is_action : is_action A (actby nRA).
+ +
+Canonical action_by := Action actby_is_action.
+ +
+Lemma actbyE x a : x \in R → a \in A → <[nRA]>%act x a = to x a.
+ +
+Lemma afix_actby B : 'Fix_<[nRA]>(B) = ~: R :|: 'Fix_to(A :&: B).
+ +
+Lemma astab_actby S : 'C(S | <[nRA]>) = 'C_A(R :&: S | to).
+ +
+Lemma astabs_actby S : 'N(S | <[nRA]>) = 'N_A(R :&: S | to).
+ +
+Lemma acts_actby (B : {set aT}) S :
+ [acts B, on S | <[nRA]>] = (B \subset A) && [acts B, on R :&: S | to].
+ +
+End ActBy.
+ +
+Notation "<[ nRA ] >" := (action_by nRA) : action_scope.
+ +
+Section SubAction.
+ +
+Variables (aT : finGroupType) (D : {group aT}).
+Variables (rT : finType) (sP : pred rT) (sT : subFinType sP) (to : action D rT).
+Implicit Type A : {set aT}.
+Implicit Type u : sT.
+Implicit Type S : {set sT}.
+ +
+Definition subact_dom := 'N([set x | sP x] | to).
+Canonical subact_dom_group := [group of subact_dom].
+ +
+Implicit Type Na : {a | a \in subact_dom}.
+Lemma sub_act_proof u Na : sP (to (val u) (val Na)).
+ +
+Definition subact u a :=
+ if insub a is Some Na then Sub _ (sub_act_proof u Na) else u.
+ +
+Lemma val_subact u a :
+ val (subact u a) = if a \in subact_dom then to (val u) a else val u.
+ +
+Lemma subact_is_action : is_action subact_dom subact.
+ +
+Canonical subaction := Action subact_is_action.
+ +
+Lemma astab_subact S : 'C(S | subaction) = subact_dom :&: 'C(val @: S | to).
+ +
+Lemma astabs_subact S : 'N(S | subaction) = subact_dom :&: 'N(val @: S | to).
+ +
+Lemma afix_subact A :
+ A \subset subact_dom → 'Fix_subaction(A) = val @^-1: 'Fix_to(A).
+ +
+End SubAction.
+ +
+Notation "to ^?" := (subaction _ to)
+ (at level 2, format "to ^?") : action_scope.
+ +
+Section QuotientAction.
+ +
+Variables (aT : finGroupType) (D : {group aT}) (rT : finGroupType).
+Variables (to : action D rT) (H : {group rT}).
+ +
+Definition qact_dom := 'N(rcosets H 'N(H) | to^*).
+Canonical qact_dom_group := [group of qact_dom].
+ +
+Fact qact_subdomE : subdom = qact_dom.
+ Lemma qact_proof : qact_dom \subset subdom.
+ +
+Definition qact : coset_of H → aT → coset_of H := act (to^*^? \ qact_proof).
+ +
+Canonical quotient_action := [action of qact].
+ +
+Lemma acts_qact_dom : [acts qact_dom, on 'N(H) | to].
+ +
+Lemma qactEcond x a :
+ x \in 'N(H) →
+ quotient_action (coset H x) a
+ = coset H (if a \in qact_dom then to x a else x).
+ +
+Lemma qactE x a :
+ x \in 'N(H) → a \in qact_dom →
+ quotient_action (coset H x) a = coset H (to x a).
+ +
+Lemma acts_quotient (A : {set aT}) (B : {set rT}) :
+ A \subset 'N_qact_dom(B | to) → [acts A, on B / H | quotient_action].
+ +
+Lemma astabs_quotient (G : {group rT}) :
+ H <| G → 'N(G / H | quotient_action) = 'N_qact_dom(G | to).
+ +
+End QuotientAction.
+ +
+Notation "to / H" := (quotient_action to H) : action_scope.
+ +
+Section ModAction.
+ +
+Variables (aT : finGroupType) (D : {group aT}) (rT : finType).
+Variable to : action D rT.
+Implicit Types (G : {group aT}) (S : {set rT}).
+ +
+Section GenericMod.
+ +
+Variable H : {group aT}.
+ +
+Let acts_dom : {acts dom, on range | to} := acts_act (acts_subnorm_fix to H).
+ +
+Definition modact x (Ha : coset_of H) :=
+ if x \in range then to x (repr (D :&: Ha)) else x.
+ +
+Lemma modactEcond x a :
+ a \in dom → modact x (coset H a) = (if x \in range then to x a else x).
+ +
+Lemma modactE x a :
+ a \in D → a \in 'N(H) → x \in range → modact x (coset H a) = to x a.
+ +
+Lemma modact_is_action : is_action (D / H) modact.
+ +
+Canonical mod_action := Action modact_is_action.
+ +
+Section Stabilizers.
+ +
+Variable S : {set rT}.
+Hypothesis cSH : H \subset 'C(S | to).
+ +
+Let fixSH : S \subset 'Fix_to(D :&: H).
+ +
+Lemma astabs_mod : 'N(S | mod_action) = 'N(S | to) / H.
+ +
+Lemma astab_mod : 'C(S | mod_action) = 'C(S | to) / H.
+ +
+End Stabilizers.
+ +
+Lemma afix_mod G S :
+ H \subset 'C(S | to) → G \subset 'N_D(H) →
+ 'Fix_(S | mod_action)(G / H) = 'Fix_(S | to)(G).
+ +
+End GenericMod.
+ +
+Lemma modact_faithful G S :
+ [faithful G / 'C_G(S | to), on S | mod_action 'C_G(S | to)].
+ +
+End ModAction.
+ +
+Notation "to %% H" := (mod_action to H) : action_scope.
+ +
+Section ActPerm.
+
+
++End Restrict.
+ +
+Notation "to \ sAD" := (raction to sAD) (at level 50) : action_scope.
+ +
+Section ActBy.
+ +
+Variables (aT : finGroupType) (D : {set aT}) (rT : finType).
+ +
+Definition actby_cond (A : {set aT}) R (to : action D rT) : Prop :=
+ [acts A, on R | to].
+ +
+Definition actby A R to of actby_cond A R to :=
+ fun x a ⇒ if (x \in R) && (a \in A) then to x a else x.
+ +
+Variables (A : {group aT}) (R : {set rT}) (to : action D rT).
+Hypothesis nRA : actby_cond A R to.
+ +
+Lemma actby_is_action : is_action A (actby nRA).
+ +
+Canonical action_by := Action actby_is_action.
+ +
+Lemma actbyE x a : x \in R → a \in A → <[nRA]>%act x a = to x a.
+ +
+Lemma afix_actby B : 'Fix_<[nRA]>(B) = ~: R :|: 'Fix_to(A :&: B).
+ +
+Lemma astab_actby S : 'C(S | <[nRA]>) = 'C_A(R :&: S | to).
+ +
+Lemma astabs_actby S : 'N(S | <[nRA]>) = 'N_A(R :&: S | to).
+ +
+Lemma acts_actby (B : {set aT}) S :
+ [acts B, on S | <[nRA]>] = (B \subset A) && [acts B, on R :&: S | to].
+ +
+End ActBy.
+ +
+Notation "<[ nRA ] >" := (action_by nRA) : action_scope.
+ +
+Section SubAction.
+ +
+Variables (aT : finGroupType) (D : {group aT}).
+Variables (rT : finType) (sP : pred rT) (sT : subFinType sP) (to : action D rT).
+Implicit Type A : {set aT}.
+Implicit Type u : sT.
+Implicit Type S : {set sT}.
+ +
+Definition subact_dom := 'N([set x | sP x] | to).
+Canonical subact_dom_group := [group of subact_dom].
+ +
+Implicit Type Na : {a | a \in subact_dom}.
+Lemma sub_act_proof u Na : sP (to (val u) (val Na)).
+ +
+Definition subact u a :=
+ if insub a is Some Na then Sub _ (sub_act_proof u Na) else u.
+ +
+Lemma val_subact u a :
+ val (subact u a) = if a \in subact_dom then to (val u) a else val u.
+ +
+Lemma subact_is_action : is_action subact_dom subact.
+ +
+Canonical subaction := Action subact_is_action.
+ +
+Lemma astab_subact S : 'C(S | subaction) = subact_dom :&: 'C(val @: S | to).
+ +
+Lemma astabs_subact S : 'N(S | subaction) = subact_dom :&: 'N(val @: S | to).
+ +
+Lemma afix_subact A :
+ A \subset subact_dom → 'Fix_subaction(A) = val @^-1: 'Fix_to(A).
+ +
+End SubAction.
+ +
+Notation "to ^?" := (subaction _ to)
+ (at level 2, format "to ^?") : action_scope.
+ +
+Section QuotientAction.
+ +
+Variables (aT : finGroupType) (D : {group aT}) (rT : finGroupType).
+Variables (to : action D rT) (H : {group rT}).
+ +
+Definition qact_dom := 'N(rcosets H 'N(H) | to^*).
+Canonical qact_dom_group := [group of qact_dom].
+ +
+Fact qact_subdomE : subdom = qact_dom.
+ Lemma qact_proof : qact_dom \subset subdom.
+ +
+Definition qact : coset_of H → aT → coset_of H := act (to^*^? \ qact_proof).
+ +
+Canonical quotient_action := [action of qact].
+ +
+Lemma acts_qact_dom : [acts qact_dom, on 'N(H) | to].
+ +
+Lemma qactEcond x a :
+ x \in 'N(H) →
+ quotient_action (coset H x) a
+ = coset H (if a \in qact_dom then to x a else x).
+ +
+Lemma qactE x a :
+ x \in 'N(H) → a \in qact_dom →
+ quotient_action (coset H x) a = coset H (to x a).
+ +
+Lemma acts_quotient (A : {set aT}) (B : {set rT}) :
+ A \subset 'N_qact_dom(B | to) → [acts A, on B / H | quotient_action].
+ +
+Lemma astabs_quotient (G : {group rT}) :
+ H <| G → 'N(G / H | quotient_action) = 'N_qact_dom(G | to).
+ +
+End QuotientAction.
+ +
+Notation "to / H" := (quotient_action to H) : action_scope.
+ +
+Section ModAction.
+ +
+Variables (aT : finGroupType) (D : {group aT}) (rT : finType).
+Variable to : action D rT.
+Implicit Types (G : {group aT}) (S : {set rT}).
+ +
+Section GenericMod.
+ +
+Variable H : {group aT}.
+ +
+Let acts_dom : {acts dom, on range | to} := acts_act (acts_subnorm_fix to H).
+ +
+Definition modact x (Ha : coset_of H) :=
+ if x \in range then to x (repr (D :&: Ha)) else x.
+ +
+Lemma modactEcond x a :
+ a \in dom → modact x (coset H a) = (if x \in range then to x a else x).
+ +
+Lemma modactE x a :
+ a \in D → a \in 'N(H) → x \in range → modact x (coset H a) = to x a.
+ +
+Lemma modact_is_action : is_action (D / H) modact.
+ +
+Canonical mod_action := Action modact_is_action.
+ +
+Section Stabilizers.
+ +
+Variable S : {set rT}.
+Hypothesis cSH : H \subset 'C(S | to).
+ +
+Let fixSH : S \subset 'Fix_to(D :&: H).
+ +
+Lemma astabs_mod : 'N(S | mod_action) = 'N(S | to) / H.
+ +
+Lemma astab_mod : 'C(S | mod_action) = 'C(S | to) / H.
+ +
+End Stabilizers.
+ +
+Lemma afix_mod G S :
+ H \subset 'C(S | to) → G \subset 'N_D(H) →
+ 'Fix_(S | mod_action)(G / H) = 'Fix_(S | to)(G).
+ +
+End GenericMod.
+ +
+Lemma modact_faithful G S :
+ [faithful G / 'C_G(S | to), on S | mod_action 'C_G(S | to)].
+ +
+End ModAction.
+ +
+Notation "to %% H" := (mod_action to H) : action_scope.
+ +
+Section ActPerm.
+
+ Morphism to permutations induced by an action.
+
+
+
+
+Variables (aT : finGroupType) (D : {set aT}) (rT : finType).
+Variable to : action D rT.
+ +
+Definition actperm a := perm (act_inj to a).
+ +
+Lemma actpermM : {in D &, {morph actperm : a b / a × b}}.
+ +
+Canonical actperm_morphism := Morphism actpermM.
+ +
+Lemma actpermE a x : actperm a x = to x a.
+ +
+Lemma actpermK x a : aperm x (actperm a) = to x a.
+ +
+Lemma ker_actperm : 'ker actperm = 'C(setT | to).
+ +
+End ActPerm.
+ +
+Section RestrictActionTheory.
+ +
+Variables (aT : finGroupType) (D : {set aT}) (rT : finType).
+Variables (to : action D rT).
+ +
+Lemma faithful_isom (A : {group aT}) S (nSA : actby_cond A S to) :
+ [faithful A, on S | to] → isom A (actperm <[nSA]> @* A) (actperm <[nSA]>).
+ +
+Variables (A : {set aT}) (sAD : A \subset D).
+ +
+Lemma ractpermE : actperm (to \ sAD) =1 actperm to.
+ +
+Lemma afix_ract B : 'Fix_(to \ sAD)(B) = 'Fix_to(B).
+ +
+Lemma astab_ract S : 'C(S | to \ sAD) = 'C_A(S | to).
+ +
+Lemma astabs_ract S : 'N(S | to \ sAD) = 'N_A(S | to).
+ +
+Lemma acts_ract (B : {set aT}) S :
+ [acts B, on S | to \ sAD] = (B \subset A) && [acts B, on S | to].
+ +
+End RestrictActionTheory.
+ +
+Section MorphAct.
+
+
++Variables (aT : finGroupType) (D : {set aT}) (rT : finType).
+Variable to : action D rT.
+ +
+Definition actperm a := perm (act_inj to a).
+ +
+Lemma actpermM : {in D &, {morph actperm : a b / a × b}}.
+ +
+Canonical actperm_morphism := Morphism actpermM.
+ +
+Lemma actpermE a x : actperm a x = to x a.
+ +
+Lemma actpermK x a : aperm x (actperm a) = to x a.
+ +
+Lemma ker_actperm : 'ker actperm = 'C(setT | to).
+ +
+End ActPerm.
+ +
+Section RestrictActionTheory.
+ +
+Variables (aT : finGroupType) (D : {set aT}) (rT : finType).
+Variables (to : action D rT).
+ +
+Lemma faithful_isom (A : {group aT}) S (nSA : actby_cond A S to) :
+ [faithful A, on S | to] → isom A (actperm <[nSA]> @* A) (actperm <[nSA]>).
+ +
+Variables (A : {set aT}) (sAD : A \subset D).
+ +
+Lemma ractpermE : actperm (to \ sAD) =1 actperm to.
+ +
+Lemma afix_ract B : 'Fix_(to \ sAD)(B) = 'Fix_to(B).
+ +
+Lemma astab_ract S : 'C(S | to \ sAD) = 'C_A(S | to).
+ +
+Lemma astabs_ract S : 'N(S | to \ sAD) = 'N_A(S | to).
+ +
+Lemma acts_ract (B : {set aT}) S :
+ [acts B, on S | to \ sAD] = (B \subset A) && [acts B, on S | to].
+ +
+End RestrictActionTheory.
+ +
+Section MorphAct.
+
+ Action induced by a morphism to permutations.
+
+
+
+
+Variables (aT : finGroupType) (D : {group aT}) (rT : finType).
+Variable phi : {morphism D >-> {perm rT}}.
+ +
+Definition mact x a := phi a x.
+ +
+Lemma mact_is_action : is_action D mact.
+ +
+Canonical morph_action := Action mact_is_action.
+ +
+Lemma mactE x a : morph_action x a = phi a x.
+ +
+Lemma injm_faithful : 'injm phi → [faithful D, on setT | morph_action].
+ +
+Lemma perm_mact a : actperm morph_action a = phi a.
+ +
+End MorphAct.
+ +
+Notation "<< phi >>" := (morph_action phi) : action_scope.
+ +
+Section CompAct.
+ +
+Variables (gT aT : finGroupType) (rT : finType).
+Variables (D : {set aT}) (to : action D rT).
+Variables (B : {set gT}) (f : {morphism B >-> aT}).
+ +
+Definition comp_act x e := to x (f e).
+Lemma comp_is_action : is_action (f @*^-1 D) comp_act.
+Canonical comp_action := Action comp_is_action.
+ +
+Lemma comp_actE x e : comp_action x e = to x (f e).
+ +
+Lemma afix_comp (A : {set gT}) :
+ A \subset B → 'Fix_comp_action(A) = 'Fix_to(f @* A).
+ +
+Lemma astab_comp S : 'C(S | comp_action) = f @*^-1 'C(S | to).
+ +
+Lemma astabs_comp S : 'N(S | comp_action) = f @*^-1 'N(S | to).
+ +
+End CompAct.
+ +
+Notation "to \o f" := (comp_action to f) : action_scope.
+ +
+Section PermAction.
+
+
++Variables (aT : finGroupType) (D : {group aT}) (rT : finType).
+Variable phi : {morphism D >-> {perm rT}}.
+ +
+Definition mact x a := phi a x.
+ +
+Lemma mact_is_action : is_action D mact.
+ +
+Canonical morph_action := Action mact_is_action.
+ +
+Lemma mactE x a : morph_action x a = phi a x.
+ +
+Lemma injm_faithful : 'injm phi → [faithful D, on setT | morph_action].
+ +
+Lemma perm_mact a : actperm morph_action a = phi a.
+ +
+End MorphAct.
+ +
+Notation "<< phi >>" := (morph_action phi) : action_scope.
+ +
+Section CompAct.
+ +
+Variables (gT aT : finGroupType) (rT : finType).
+Variables (D : {set aT}) (to : action D rT).
+Variables (B : {set gT}) (f : {morphism B >-> aT}).
+ +
+Definition comp_act x e := to x (f e).
+Lemma comp_is_action : is_action (f @*^-1 D) comp_act.
+Canonical comp_action := Action comp_is_action.
+ +
+Lemma comp_actE x e : comp_action x e = to x (f e).
+ +
+Lemma afix_comp (A : {set gT}) :
+ A \subset B → 'Fix_comp_action(A) = 'Fix_to(f @* A).
+ +
+Lemma astab_comp S : 'C(S | comp_action) = f @*^-1 'C(S | to).
+ +
+Lemma astabs_comp S : 'N(S | comp_action) = f @*^-1 'N(S | to).
+ +
+End CompAct.
+ +
+Notation "to \o f" := (comp_action to f) : action_scope.
+ +
+Section PermAction.
+
+ Natural action of permutation groups.
+
+
+
+
+Variable rT : finType.
+Implicit Types a b c : gT.
+ +
+Lemma aperm_is_action : is_action setT (@aperm rT).
+ +
+Canonical perm_action := Action aperm_is_action.
+ +
+Lemma pcycleE a : pcycle a = orbit perm_action <[a]>%g.
+ +
+Lemma perm_act1P a : reflect (∀ x, aperm x a = x) (a == 1).
+ +
+Lemma perm_faithful A : [faithful A, on setT | perm_action].
+ +
+Lemma actperm_id p : actperm perm_action p = p.
+ +
+End PermAction.
+ +
+ +
+Notation "'P" := (perm_action _) (at level 8) : action_scope.
+ +
+Section ActpermOrbits.
+ +
+Variables (aT : finGroupType) (D : {group aT}) (rT : finType).
+Variable to : action D rT.
+ +
+Lemma orbit_morphim_actperm (A : {set aT}) :
+ A \subset D → orbit 'P (actperm to @* A) =1 orbit to A.
+ +
+Lemma pcycle_actperm (a : aT) :
+ a \in D → pcycle (actperm to a) =1 orbit to <[a]>.
+ +
+End ActpermOrbits.
+ +
+Section RestrictPerm.
+ +
+Variables (T : finType) (S : {set T}).
+ +
+Definition restr_perm := actperm (<[subxx 'N(S | 'P)]>).
+Canonical restr_perm_morphism := [morphism of restr_perm].
+ +
+Lemma restr_perm_on p : perm_on S (restr_perm p).
+ +
+Lemma triv_restr_perm p : p \notin 'N(S | 'P) → restr_perm p = 1.
+ +
+Lemma restr_permE : {in 'N(S | 'P) & S, ∀ p, restr_perm p =1 p}.
+ +
+Lemma ker_restr_perm : 'ker restr_perm = 'C(S | 'P).
+ +
+Lemma im_restr_perm p : restr_perm p @: S = S.
+ +
+End RestrictPerm.
+ +
+Section AutIn.
+ +
+Variable gT : finGroupType.
+ +
+Definition Aut_in A (B : {set gT}) := 'N_A(B | 'P) / 'C_A(B | 'P).
+ +
+Variables G H : {group gT}.
+Hypothesis sHG: H \subset G.
+ +
+Lemma Aut_restr_perm a : a \in Aut G → restr_perm H a \in Aut H.
+ +
+Lemma restr_perm_Aut : restr_perm H @* Aut G \subset Aut H.
+ +
+Lemma Aut_in_isog : Aut_in (Aut G) H \isog restr_perm H @* Aut G.
+ +
+Lemma Aut_sub_fullP :
+ reflect (∀ h : {morphism H >-> gT}, 'injm h → h @* H = H →
+ ∃ g : {morphism G >-> gT},
+ [/\ 'injm g, g @* G = G & {in H, g =1 h}])
+ (Aut_in (Aut G) H \isog Aut H).
+ +
+End AutIn.
+ +
+ +
+Section InjmAutIn.
+ +
+Variables (gT rT : finGroupType) (D G H : {group gT}) (f : {morphism D >-> rT}).
+Hypotheses (injf : 'injm f) (sGD : G \subset D) (sHG : H \subset G).
+Let sHD := subset_trans sHG sGD.
+ +
+Lemma astabs_Aut_isom a :
+ a \in Aut G → (fGisom a \in 'N(f @* H | 'P)) = (a \in 'N(H | 'P)).
+ +
+Lemma isom_restr_perm a : a \in Aut G → fHisom (inH a) = infH (fGisom a).
+ +
+Lemma restr_perm_isom : isom (inH @* Aut G) (infH @* Aut (f @* G)) fHisom.
+ +
+Lemma injm_Aut_sub : Aut_in (Aut (f @* G)) (f @* H) \isog Aut_in (Aut G) H.
+ +
+Lemma injm_Aut_full :
+ (Aut_in (Aut (f @* G)) (f @* H) \isog Aut (f @* H))
+ = (Aut_in (Aut G) H \isog Aut H).
+ +
+End InjmAutIn.
+ +
+Section GroupAction.
+ +
+Variables (aT rT : finGroupType) (D : {set aT}) (R : {set rT}).
+ +
+Definition is_groupAction (to : actT) :=
+ {in D, ∀ a, actperm to a \in Aut R}.
+ +
+Structure groupAction := GroupAction {gact :> actT; _ : is_groupAction gact}.
+ +
+Definition clone_groupAction to :=
+ let: GroupAction _ toA := to return {type of GroupAction for to} → _ in
+ fun k ⇒ k toA : groupAction.
+ +
+End GroupAction.
+ +
+Delimit Scope groupAction_scope with gact.
+ +
+ +
+Notation "[ 'groupAction' 'of' to ]" :=
+ (clone_groupAction (@GroupAction _ _ _ _ to))
+ (at level 0, format "[ 'groupAction' 'of' to ]") : form_scope.
+ +
+Section GroupActionDefs.
+ +
+Variables (aT rT : finGroupType) (D : {set aT}) (R : {set rT}).
+Implicit Type A : {set aT}.
+Implicit Type S : {set rT}.
+Implicit Type to : groupAction D R.
+ +
+Definition gact_range of groupAction D R := R.
+ +
+Definition gacent to A := 'Fix_(R | to)(D :&: A).
+ +
+Definition acts_on_group A S to := [acts A, on S | to] ∧ S \subset R.
+ +
+Coercion actby_cond_group A S to : acts_on_group A S to → actby_cond A S to :=
+ @proj1 _ _.
+ +
+Definition acts_irreducibly A S to :=
+ [min S of G | G :!=: 1 & [acts A, on G | to]].
+ +
+End GroupActionDefs.
+ +
+ +
+Notation "''C_' ( | to ) ( A )" := (gacent to A)
+ (at level 8, format "''C_' ( | to ) ( A )") : group_scope.
+Notation "''C_' ( G | to ) ( A )" := (G :&: 'C_(|to)(A))
+ (at level 8, format "''C_' ( G | to ) ( A )") : group_scope.
+Notation "''C_' ( | to ) [ a ]" := 'C_(|to)([set a])
+ (at level 8, format "''C_' ( | to ) [ a ]") : group_scope.
+Notation "''C_' ( G | to ) [ a ]" := 'C_(G | to)([set a])
+ (at level 8, format "''C_' ( G | to ) [ a ]") : group_scope.
+ +
+Notation "{ 'acts' A , 'on' 'group' G | to }" := (acts_on_group A G to)
+ (at level 0, format "{ 'acts' A , 'on' 'group' G | to }") : form_scope.
+ +
+Section RawGroupAction.
+ +
+Variables (aT rT : finGroupType) (D : {set aT}) (R : {set rT}).
+Variable to : groupAction D R.
+ +
+Lemma actperm_Aut : is_groupAction R to.
+ +
+Lemma im_actperm_Aut : actperm to @* D \subset Aut R.
+ +
+Lemma gact_out x a : a \in D → x \notin R → to x a = x.
+ +
+Lemma gactM : {in D, ∀ a, {in R &, {morph to^~ a : x y / x × y}}}.
+ +
+Lemma actmM a : {in R &, {morph actm to a : x y / x × y}}.
+ +
+Canonical act_morphism a := Morphism (actmM a).
+ +
+Lemma morphim_actm :
+ {in D, ∀ a (S : {set rT}), S \subset R → actm to a @* S = to^* S a}.
+ +
+Variables (a : aT) (A B : {set aT}) (S : {set rT}).
+ +
+Lemma gacentIdom : 'C_(|to)(D :&: A) = 'C_(|to)(A).
+ +
+Lemma gacentIim : 'C_(R | to)(A) = 'C_(|to)(A).
+ +
+Lemma gacentS : A \subset B → 'C_(|to)(B) \subset 'C_(|to)(A).
+ +
+Lemma gacentU : 'C_(|to)(A :|: B) = 'C_(|to)(A) :&: 'C_(|to)(B).
+ +
+Hypotheses (Da : a \in D) (sAD : A \subset D) (sSR : S \subset R).
+ +
+Lemma gacentE : 'C_(|to)(A) = 'Fix_(R | to)(A).
+ +
+Lemma gacent1E : 'C_(|to)[a] = 'Fix_(R | to)[a].
+ +
+Lemma subgacentE : 'C_(S | to)(A) = 'Fix_(S | to)(A).
+ +
+Lemma subgacent1E : 'C_(S | to)[a] = 'Fix_(S | to)[a].
+ +
+End RawGroupAction.
+ +
+Section GroupActionTheory.
+ +
+Variables aT rT : finGroupType.
+Variables (D : {group aT}) (R : {group rT}) (to : groupAction D R).
+Implicit Type A B : {set aT}.
+Implicit Types G H : {group aT}.
+Implicit Type S : {set rT}.
+Implicit Types M N : {group rT}.
+ +
+Lemma gact1 : {in D, ∀ a, to 1 a = 1}.
+ +
+Lemma gactV : {in D, ∀ a, {in R, {morph to^~ a : x / x^-1}}}.
+ +
+Lemma gactX : {in D, ∀ a n, {in R, {morph to^~ a : x / x ^+ n}}}.
+ +
+Lemma gactJ : {in D, ∀ a, {in R &, {morph to^~ a : x y / x ^ y}}}.
+ +
+Lemma gactR : {in D, ∀ a, {in R &, {morph to^~ a : x y / [~ x, y]}}}.
+ +
+Lemma gact_stable : {acts D, on R | to}.
+ +
+Lemma group_set_gacent A : group_set 'C_(|to)(A).
+ +
+Canonical gacent_group A := Group (group_set_gacent A).
+ +
+Lemma gacent1 : 'C_(|to)(1) = R.
+ +
+Lemma gacent_gen A : A \subset D → 'C_(|to)(<<A>>) = 'C_(|to)(A).
+ +
+Lemma gacentD1 A : 'C_(|to)(A^#) = 'C_(|to)(A).
+ +
+Lemma gacent_cycle a : a \in D → 'C_(|to)(<[a]>) = 'C_(|to)[a].
+ +
+Lemma gacentY A B :
+ A \subset D → B \subset D → 'C_(|to)(A <*> B) = 'C_(|to)(A) :&: 'C_(|to)(B).
+ +
+Lemma gacentM G H :
+ G \subset D → H \subset D → 'C_(|to)(G × H) = 'C_(|to)(G) :&: 'C_(|to)(H).
+ +
+Lemma astab1 : 'C(1 | to) = D.
+ +
+Lemma astab_range : 'C(R | to) = 'C(setT | to).
+ +
+Lemma gacentC A S :
+ A \subset D → S \subset R →
+ (S \subset 'C_(|to)(A)) = (A \subset 'C(S | to)).
+ +
+Lemma astab_gen S : S \subset R → 'C(<<S>> | to) = 'C(S | to).
+ +
+Lemma astabM M N :
+ M \subset R → N \subset R → 'C(M × N | to) = 'C(M | to) :&: 'C(N | to).
+ +
+Lemma astabs1 : 'N(1 | to) = D.
+ +
+Lemma astabs_range : 'N(R | to) = D.
+ +
+Lemma astabsD1 S : 'N(S^# | to) = 'N(S | to).
+ +
+Lemma gacts_range A : A \subset D → {acts A, on group R | to}.
+ +
+Lemma acts_subnorm_gacent A : A \subset D →
+ [acts 'N_D(A), on 'C_(| to)(A) | to].
+ +
+Lemma acts_subnorm_subgacent A B S :
+ A \subset D → [acts B, on S | to] → [acts 'N_B(A), on 'C_(S | to)(A) | to].
+ +
+Lemma acts_gen A S :
+ S \subset R → [acts A, on S | to] → [acts A, on <<S>> | to].
+ +
+Lemma acts_joing A M N :
+ M \subset R → N \subset R → [acts A, on M | to] → [acts A, on N | to] →
+ [acts A, on M <*> N | to].
+ +
+Lemma injm_actm a : 'injm (actm to a).
+ +
+Lemma im_actm a : actm to a @* R = R.
+ +
+Lemma acts_char G M : G \subset D → M \char R → [acts G, on M | to].
+ +
+Lemma gacts_char G M :
+ G \subset D → M \char R → {acts G, on group M | to}.
+ +
+Section Restrict.
+ +
+Variables (A : {group aT}) (sAD : A \subset D).
+ +
+Lemma ract_is_groupAction : is_groupAction R (to \ sAD).
+ +
+Canonical ract_groupAction := GroupAction ract_is_groupAction.
+ +
+Lemma gacent_ract B : 'C_(|ract_groupAction)(B) = 'C_(|to)(A :&: B).
+ +
+End Restrict.
+ +
+Section ActBy.
+ +
+Variables (A : {group aT}) (G : {group rT}) (nGAg : {acts A, on group G | to}).
+ +
+Lemma actby_is_groupAction : is_groupAction G <[nGAg]>.
+ +
+Canonical actby_groupAction := GroupAction actby_is_groupAction.
+ +
+Lemma gacent_actby B :
+ 'C_(|actby_groupAction)(B) = 'C_(G | to)(A :&: B).
+ +
+End ActBy.
+ +
+Section Quotient.
+ +
+Variable H : {group rT}.
+ +
+Lemma acts_qact_dom_norm : {acts qact_dom to H, on 'N(H) | to}.
+ +
+Lemma qact_is_groupAction : is_groupAction (R / H) (to / H).
+ +
+Canonical quotient_groupAction := GroupAction qact_is_groupAction.
+ +
+Lemma qact_domE : H \subset R → qact_dom to H = 'N(H | to).
+ +
+End Quotient.
+ +
+Section Mod.
+ +
+Variable H : {group aT}.
+ +
+Lemma modact_is_groupAction : is_groupAction 'C_(|to)(H) (to %% H).
+ +
+Canonical mod_groupAction := GroupAction modact_is_groupAction.
+ +
+Lemma modgactE x a :
+ H \subset 'C(R | to) → a \in 'N_D(H) → (to %% H)%act x (coset H a) = to x a.
+ +
+Lemma gacent_mod G M :
+ H \subset 'C(M | to) → G \subset 'N(H) →
+ 'C_(M | mod_groupAction)(G / H) = 'C_(M | to)(G).
+ +
+Lemma acts_irr_mod G M :
+ H \subset 'C(M | to) → G \subset 'N(H) → acts_irreducibly G M to →
+ acts_irreducibly (G / H) M mod_groupAction.
+ +
+End Mod.
+ +
+Lemma modact_coset_astab x a :
+ a \in D → (to %% 'C(R | to))%act x (coset _ a) = to x a.
+ +
+Lemma acts_irr_mod_astab G M :
+ acts_irreducibly G M to →
+ acts_irreducibly (G / 'C_G(M | to)) M (mod_groupAction _).
+ +
+Section CompAct.
+ +
+Variables (gT : finGroupType) (G : {group gT}) (f : {morphism G >-> aT}).
+ +
+Lemma comp_is_groupAction : is_groupAction R (comp_action to f).
+Canonical comp_groupAction := GroupAction comp_is_groupAction.
+ +
+Lemma gacent_comp U : 'C_(|comp_groupAction)(U) = 'C_(|to)(f @* U).
+ +
+End CompAct.
+ +
+End GroupActionTheory.
+ +
+Notation "''C_' ( | to ) ( A )" := (gacent_group to A) : Group_scope.
+Notation "''C_' ( G | to ) ( A )" :=
+ (setI_group G 'C_(|to)(A)) : Group_scope.
+Notation "''C_' ( | to ) [ a ]" := (gacent_group to [set a%g]) : Group_scope.
+Notation "''C_' ( G | to ) [ a ]" :=
+ (setI_group G 'C_(|to)[a]) : Group_scope.
+ +
+Notation "to \ sAD" := (ract_groupAction to sAD) : groupAction_scope.
+Notation "<[ nGA ] >" := (actby_groupAction nGA) : groupAction_scope.
+Notation "to / H" := (quotient_groupAction to H) : groupAction_scope.
+Notation "to %% H" := (mod_groupAction to H) : groupAction_scope.
+Notation "to \o f" := (comp_groupAction to f) : groupAction_scope.
+ +
+
+
++Variable rT : finType.
+Implicit Types a b c : gT.
+ +
+Lemma aperm_is_action : is_action setT (@aperm rT).
+ +
+Canonical perm_action := Action aperm_is_action.
+ +
+Lemma pcycleE a : pcycle a = orbit perm_action <[a]>%g.
+ +
+Lemma perm_act1P a : reflect (∀ x, aperm x a = x) (a == 1).
+ +
+Lemma perm_faithful A : [faithful A, on setT | perm_action].
+ +
+Lemma actperm_id p : actperm perm_action p = p.
+ +
+End PermAction.
+ +
+ +
+Notation "'P" := (perm_action _) (at level 8) : action_scope.
+ +
+Section ActpermOrbits.
+ +
+Variables (aT : finGroupType) (D : {group aT}) (rT : finType).
+Variable to : action D rT.
+ +
+Lemma orbit_morphim_actperm (A : {set aT}) :
+ A \subset D → orbit 'P (actperm to @* A) =1 orbit to A.
+ +
+Lemma pcycle_actperm (a : aT) :
+ a \in D → pcycle (actperm to a) =1 orbit to <[a]>.
+ +
+End ActpermOrbits.
+ +
+Section RestrictPerm.
+ +
+Variables (T : finType) (S : {set T}).
+ +
+Definition restr_perm := actperm (<[subxx 'N(S | 'P)]>).
+Canonical restr_perm_morphism := [morphism of restr_perm].
+ +
+Lemma restr_perm_on p : perm_on S (restr_perm p).
+ +
+Lemma triv_restr_perm p : p \notin 'N(S | 'P) → restr_perm p = 1.
+ +
+Lemma restr_permE : {in 'N(S | 'P) & S, ∀ p, restr_perm p =1 p}.
+ +
+Lemma ker_restr_perm : 'ker restr_perm = 'C(S | 'P).
+ +
+Lemma im_restr_perm p : restr_perm p @: S = S.
+ +
+End RestrictPerm.
+ +
+Section AutIn.
+ +
+Variable gT : finGroupType.
+ +
+Definition Aut_in A (B : {set gT}) := 'N_A(B | 'P) / 'C_A(B | 'P).
+ +
+Variables G H : {group gT}.
+Hypothesis sHG: H \subset G.
+ +
+Lemma Aut_restr_perm a : a \in Aut G → restr_perm H a \in Aut H.
+ +
+Lemma restr_perm_Aut : restr_perm H @* Aut G \subset Aut H.
+ +
+Lemma Aut_in_isog : Aut_in (Aut G) H \isog restr_perm H @* Aut G.
+ +
+Lemma Aut_sub_fullP :
+ reflect (∀ h : {morphism H >-> gT}, 'injm h → h @* H = H →
+ ∃ g : {morphism G >-> gT},
+ [/\ 'injm g, g @* G = G & {in H, g =1 h}])
+ (Aut_in (Aut G) H \isog Aut H).
+ +
+End AutIn.
+ +
+ +
+Section InjmAutIn.
+ +
+Variables (gT rT : finGroupType) (D G H : {group gT}) (f : {morphism D >-> rT}).
+Hypotheses (injf : 'injm f) (sGD : G \subset D) (sHG : H \subset G).
+Let sHD := subset_trans sHG sGD.
+ +
+Lemma astabs_Aut_isom a :
+ a \in Aut G → (fGisom a \in 'N(f @* H | 'P)) = (a \in 'N(H | 'P)).
+ +
+Lemma isom_restr_perm a : a \in Aut G → fHisom (inH a) = infH (fGisom a).
+ +
+Lemma restr_perm_isom : isom (inH @* Aut G) (infH @* Aut (f @* G)) fHisom.
+ +
+Lemma injm_Aut_sub : Aut_in (Aut (f @* G)) (f @* H) \isog Aut_in (Aut G) H.
+ +
+Lemma injm_Aut_full :
+ (Aut_in (Aut (f @* G)) (f @* H) \isog Aut (f @* H))
+ = (Aut_in (Aut G) H \isog Aut H).
+ +
+End InjmAutIn.
+ +
+Section GroupAction.
+ +
+Variables (aT rT : finGroupType) (D : {set aT}) (R : {set rT}).
+ +
+Definition is_groupAction (to : actT) :=
+ {in D, ∀ a, actperm to a \in Aut R}.
+ +
+Structure groupAction := GroupAction {gact :> actT; _ : is_groupAction gact}.
+ +
+Definition clone_groupAction to :=
+ let: GroupAction _ toA := to return {type of GroupAction for to} → _ in
+ fun k ⇒ k toA : groupAction.
+ +
+End GroupAction.
+ +
+Delimit Scope groupAction_scope with gact.
+ +
+ +
+Notation "[ 'groupAction' 'of' to ]" :=
+ (clone_groupAction (@GroupAction _ _ _ _ to))
+ (at level 0, format "[ 'groupAction' 'of' to ]") : form_scope.
+ +
+Section GroupActionDefs.
+ +
+Variables (aT rT : finGroupType) (D : {set aT}) (R : {set rT}).
+Implicit Type A : {set aT}.
+Implicit Type S : {set rT}.
+Implicit Type to : groupAction D R.
+ +
+Definition gact_range of groupAction D R := R.
+ +
+Definition gacent to A := 'Fix_(R | to)(D :&: A).
+ +
+Definition acts_on_group A S to := [acts A, on S | to] ∧ S \subset R.
+ +
+Coercion actby_cond_group A S to : acts_on_group A S to → actby_cond A S to :=
+ @proj1 _ _.
+ +
+Definition acts_irreducibly A S to :=
+ [min S of G | G :!=: 1 & [acts A, on G | to]].
+ +
+End GroupActionDefs.
+ +
+ +
+Notation "''C_' ( | to ) ( A )" := (gacent to A)
+ (at level 8, format "''C_' ( | to ) ( A )") : group_scope.
+Notation "''C_' ( G | to ) ( A )" := (G :&: 'C_(|to)(A))
+ (at level 8, format "''C_' ( G | to ) ( A )") : group_scope.
+Notation "''C_' ( | to ) [ a ]" := 'C_(|to)([set a])
+ (at level 8, format "''C_' ( | to ) [ a ]") : group_scope.
+Notation "''C_' ( G | to ) [ a ]" := 'C_(G | to)([set a])
+ (at level 8, format "''C_' ( G | to ) [ a ]") : group_scope.
+ +
+Notation "{ 'acts' A , 'on' 'group' G | to }" := (acts_on_group A G to)
+ (at level 0, format "{ 'acts' A , 'on' 'group' G | to }") : form_scope.
+ +
+Section RawGroupAction.
+ +
+Variables (aT rT : finGroupType) (D : {set aT}) (R : {set rT}).
+Variable to : groupAction D R.
+ +
+Lemma actperm_Aut : is_groupAction R to.
+ +
+Lemma im_actperm_Aut : actperm to @* D \subset Aut R.
+ +
+Lemma gact_out x a : a \in D → x \notin R → to x a = x.
+ +
+Lemma gactM : {in D, ∀ a, {in R &, {morph to^~ a : x y / x × y}}}.
+ +
+Lemma actmM a : {in R &, {morph actm to a : x y / x × y}}.
+ +
+Canonical act_morphism a := Morphism (actmM a).
+ +
+Lemma morphim_actm :
+ {in D, ∀ a (S : {set rT}), S \subset R → actm to a @* S = to^* S a}.
+ +
+Variables (a : aT) (A B : {set aT}) (S : {set rT}).
+ +
+Lemma gacentIdom : 'C_(|to)(D :&: A) = 'C_(|to)(A).
+ +
+Lemma gacentIim : 'C_(R | to)(A) = 'C_(|to)(A).
+ +
+Lemma gacentS : A \subset B → 'C_(|to)(B) \subset 'C_(|to)(A).
+ +
+Lemma gacentU : 'C_(|to)(A :|: B) = 'C_(|to)(A) :&: 'C_(|to)(B).
+ +
+Hypotheses (Da : a \in D) (sAD : A \subset D) (sSR : S \subset R).
+ +
+Lemma gacentE : 'C_(|to)(A) = 'Fix_(R | to)(A).
+ +
+Lemma gacent1E : 'C_(|to)[a] = 'Fix_(R | to)[a].
+ +
+Lemma subgacentE : 'C_(S | to)(A) = 'Fix_(S | to)(A).
+ +
+Lemma subgacent1E : 'C_(S | to)[a] = 'Fix_(S | to)[a].
+ +
+End RawGroupAction.
+ +
+Section GroupActionTheory.
+ +
+Variables aT rT : finGroupType.
+Variables (D : {group aT}) (R : {group rT}) (to : groupAction D R).
+Implicit Type A B : {set aT}.
+Implicit Types G H : {group aT}.
+Implicit Type S : {set rT}.
+Implicit Types M N : {group rT}.
+ +
+Lemma gact1 : {in D, ∀ a, to 1 a = 1}.
+ +
+Lemma gactV : {in D, ∀ a, {in R, {morph to^~ a : x / x^-1}}}.
+ +
+Lemma gactX : {in D, ∀ a n, {in R, {morph to^~ a : x / x ^+ n}}}.
+ +
+Lemma gactJ : {in D, ∀ a, {in R &, {morph to^~ a : x y / x ^ y}}}.
+ +
+Lemma gactR : {in D, ∀ a, {in R &, {morph to^~ a : x y / [~ x, y]}}}.
+ +
+Lemma gact_stable : {acts D, on R | to}.
+ +
+Lemma group_set_gacent A : group_set 'C_(|to)(A).
+ +
+Canonical gacent_group A := Group (group_set_gacent A).
+ +
+Lemma gacent1 : 'C_(|to)(1) = R.
+ +
+Lemma gacent_gen A : A \subset D → 'C_(|to)(<<A>>) = 'C_(|to)(A).
+ +
+Lemma gacentD1 A : 'C_(|to)(A^#) = 'C_(|to)(A).
+ +
+Lemma gacent_cycle a : a \in D → 'C_(|to)(<[a]>) = 'C_(|to)[a].
+ +
+Lemma gacentY A B :
+ A \subset D → B \subset D → 'C_(|to)(A <*> B) = 'C_(|to)(A) :&: 'C_(|to)(B).
+ +
+Lemma gacentM G H :
+ G \subset D → H \subset D → 'C_(|to)(G × H) = 'C_(|to)(G) :&: 'C_(|to)(H).
+ +
+Lemma astab1 : 'C(1 | to) = D.
+ +
+Lemma astab_range : 'C(R | to) = 'C(setT | to).
+ +
+Lemma gacentC A S :
+ A \subset D → S \subset R →
+ (S \subset 'C_(|to)(A)) = (A \subset 'C(S | to)).
+ +
+Lemma astab_gen S : S \subset R → 'C(<<S>> | to) = 'C(S | to).
+ +
+Lemma astabM M N :
+ M \subset R → N \subset R → 'C(M × N | to) = 'C(M | to) :&: 'C(N | to).
+ +
+Lemma astabs1 : 'N(1 | to) = D.
+ +
+Lemma astabs_range : 'N(R | to) = D.
+ +
+Lemma astabsD1 S : 'N(S^# | to) = 'N(S | to).
+ +
+Lemma gacts_range A : A \subset D → {acts A, on group R | to}.
+ +
+Lemma acts_subnorm_gacent A : A \subset D →
+ [acts 'N_D(A), on 'C_(| to)(A) | to].
+ +
+Lemma acts_subnorm_subgacent A B S :
+ A \subset D → [acts B, on S | to] → [acts 'N_B(A), on 'C_(S | to)(A) | to].
+ +
+Lemma acts_gen A S :
+ S \subset R → [acts A, on S | to] → [acts A, on <<S>> | to].
+ +
+Lemma acts_joing A M N :
+ M \subset R → N \subset R → [acts A, on M | to] → [acts A, on N | to] →
+ [acts A, on M <*> N | to].
+ +
+Lemma injm_actm a : 'injm (actm to a).
+ +
+Lemma im_actm a : actm to a @* R = R.
+ +
+Lemma acts_char G M : G \subset D → M \char R → [acts G, on M | to].
+ +
+Lemma gacts_char G M :
+ G \subset D → M \char R → {acts G, on group M | to}.
+ +
+Section Restrict.
+ +
+Variables (A : {group aT}) (sAD : A \subset D).
+ +
+Lemma ract_is_groupAction : is_groupAction R (to \ sAD).
+ +
+Canonical ract_groupAction := GroupAction ract_is_groupAction.
+ +
+Lemma gacent_ract B : 'C_(|ract_groupAction)(B) = 'C_(|to)(A :&: B).
+ +
+End Restrict.
+ +
+Section ActBy.
+ +
+Variables (A : {group aT}) (G : {group rT}) (nGAg : {acts A, on group G | to}).
+ +
+Lemma actby_is_groupAction : is_groupAction G <[nGAg]>.
+ +
+Canonical actby_groupAction := GroupAction actby_is_groupAction.
+ +
+Lemma gacent_actby B :
+ 'C_(|actby_groupAction)(B) = 'C_(G | to)(A :&: B).
+ +
+End ActBy.
+ +
+Section Quotient.
+ +
+Variable H : {group rT}.
+ +
+Lemma acts_qact_dom_norm : {acts qact_dom to H, on 'N(H) | to}.
+ +
+Lemma qact_is_groupAction : is_groupAction (R / H) (to / H).
+ +
+Canonical quotient_groupAction := GroupAction qact_is_groupAction.
+ +
+Lemma qact_domE : H \subset R → qact_dom to H = 'N(H | to).
+ +
+End Quotient.
+ +
+Section Mod.
+ +
+Variable H : {group aT}.
+ +
+Lemma modact_is_groupAction : is_groupAction 'C_(|to)(H) (to %% H).
+ +
+Canonical mod_groupAction := GroupAction modact_is_groupAction.
+ +
+Lemma modgactE x a :
+ H \subset 'C(R | to) → a \in 'N_D(H) → (to %% H)%act x (coset H a) = to x a.
+ +
+Lemma gacent_mod G M :
+ H \subset 'C(M | to) → G \subset 'N(H) →
+ 'C_(M | mod_groupAction)(G / H) = 'C_(M | to)(G).
+ +
+Lemma acts_irr_mod G M :
+ H \subset 'C(M | to) → G \subset 'N(H) → acts_irreducibly G M to →
+ acts_irreducibly (G / H) M mod_groupAction.
+ +
+End Mod.
+ +
+Lemma modact_coset_astab x a :
+ a \in D → (to %% 'C(R | to))%act x (coset _ a) = to x a.
+ +
+Lemma acts_irr_mod_astab G M :
+ acts_irreducibly G M to →
+ acts_irreducibly (G / 'C_G(M | to)) M (mod_groupAction _).
+ +
+Section CompAct.
+ +
+Variables (gT : finGroupType) (G : {group gT}) (f : {morphism G >-> aT}).
+ +
+Lemma comp_is_groupAction : is_groupAction R (comp_action to f).
+Canonical comp_groupAction := GroupAction comp_is_groupAction.
+ +
+Lemma gacent_comp U : 'C_(|comp_groupAction)(U) = 'C_(|to)(f @* U).
+ +
+End CompAct.
+ +
+End GroupActionTheory.
+ +
+Notation "''C_' ( | to ) ( A )" := (gacent_group to A) : Group_scope.
+Notation "''C_' ( G | to ) ( A )" :=
+ (setI_group G 'C_(|to)(A)) : Group_scope.
+Notation "''C_' ( | to ) [ a ]" := (gacent_group to [set a%g]) : Group_scope.
+Notation "''C_' ( G | to ) [ a ]" :=
+ (setI_group G 'C_(|to)[a]) : Group_scope.
+ +
+Notation "to \ sAD" := (ract_groupAction to sAD) : groupAction_scope.
+Notation "<[ nGA ] >" := (actby_groupAction nGA) : groupAction_scope.
+Notation "to / H" := (quotient_groupAction to H) : groupAction_scope.
+Notation "to %% H" := (mod_groupAction to H) : groupAction_scope.
+Notation "to \o f" := (comp_groupAction to f) : groupAction_scope.
+ +
+
+ Operator group isomorphism.
+
+
+Section MorphAction.
+ +
+Variables (aT1 aT2 : finGroupType) (rT1 rT2 : finType).
+Variables (D1 : {group aT1}) (D2 : {group aT2}).
+Variables (to1 : action D1 rT1) (to2 : action D2 rT2).
+Variables (A : {set aT1}) (R S : {set rT1}).
+Variables (h : rT1 → rT2) (f : {morphism D1 >-> aT2}).
+Hypotheses (actsDR : {acts D1, on R | to1}) (injh : {in R &, injective h}).
+Hypothesis defD2 : f @* D1 = D2.
+Hypotheses (sSR : S \subset R) (sAD1 : A \subset D1).
+Hypothesis hfJ : {in S & D1, morph_act to1 to2 h f}.
+ +
+Lemma morph_astabs : f @* 'N(S | to1) = 'N(h @: S | to2).
+ +
+Lemma morph_astab : f @* 'C(S | to1) = 'C(h @: S | to2).
+ +
+Lemma morph_afix : h @: 'Fix_(S | to1)(A) = 'Fix_(h @: S | to2)(f @* A).
+ +
+End MorphAction.
+ +
+Section MorphGroupAction.
+ +
+Variables (aT1 aT2 rT1 rT2 : finGroupType).
+Variables (D1 : {group aT1}) (D2 : {group aT2}).
+Variables (R1 : {group rT1}) (R2 : {group rT2}).
+Variables (to1 : groupAction D1 R1) (to2 : groupAction D2 R2).
+Variables (h : {morphism R1 >-> rT2}) (f : {morphism D1 >-> aT2}).
+Hypotheses (iso_h : isom R1 R2 h) (iso_f : isom D1 D2 f).
+Hypothesis hfJ : {in R1 & D1, morph_act to1 to2 h f}.
+Implicit Types (A : {set aT1}) (S : {set rT1}) (M : {group rT1}).
+ +
+Lemma morph_gastabs S : S \subset R1 → f @* 'N(S | to1) = 'N(h @* S | to2).
+ +
+Lemma morph_gastab S : S \subset R1 → f @* 'C(S | to1) = 'C(h @* S | to2).
+ +
+Lemma morph_gacent A : A \subset D1 → h @* 'C_(|to1)(A) = 'C_(|to2)(f @* A).
+ +
+Lemma morph_gact_irr A M :
+ A \subset D1 → M \subset R1 →
+ acts_irreducibly (f @* A) (h @* M) to2 = acts_irreducibly A M to1.
+ +
+End MorphGroupAction.
+ +
+
+
++ +
+Variables (aT1 aT2 : finGroupType) (rT1 rT2 : finType).
+Variables (D1 : {group aT1}) (D2 : {group aT2}).
+Variables (to1 : action D1 rT1) (to2 : action D2 rT2).
+Variables (A : {set aT1}) (R S : {set rT1}).
+Variables (h : rT1 → rT2) (f : {morphism D1 >-> aT2}).
+Hypotheses (actsDR : {acts D1, on R | to1}) (injh : {in R &, injective h}).
+Hypothesis defD2 : f @* D1 = D2.
+Hypotheses (sSR : S \subset R) (sAD1 : A \subset D1).
+Hypothesis hfJ : {in S & D1, morph_act to1 to2 h f}.
+ +
+Lemma morph_astabs : f @* 'N(S | to1) = 'N(h @: S | to2).
+ +
+Lemma morph_astab : f @* 'C(S | to1) = 'C(h @: S | to2).
+ +
+Lemma morph_afix : h @: 'Fix_(S | to1)(A) = 'Fix_(h @: S | to2)(f @* A).
+ +
+End MorphAction.
+ +
+Section MorphGroupAction.
+ +
+Variables (aT1 aT2 rT1 rT2 : finGroupType).
+Variables (D1 : {group aT1}) (D2 : {group aT2}).
+Variables (R1 : {group rT1}) (R2 : {group rT2}).
+Variables (to1 : groupAction D1 R1) (to2 : groupAction D2 R2).
+Variables (h : {morphism R1 >-> rT2}) (f : {morphism D1 >-> aT2}).
+Hypotheses (iso_h : isom R1 R2 h) (iso_f : isom D1 D2 f).
+Hypothesis hfJ : {in R1 & D1, morph_act to1 to2 h f}.
+Implicit Types (A : {set aT1}) (S : {set rT1}) (M : {group rT1}).
+ +
+Lemma morph_gastabs S : S \subset R1 → f @* 'N(S | to1) = 'N(h @* S | to2).
+ +
+Lemma morph_gastab S : S \subset R1 → f @* 'C(S | to1) = 'C(h @* S | to2).
+ +
+Lemma morph_gacent A : A \subset D1 → h @* 'C_(|to1)(A) = 'C_(|to2)(f @* A).
+ +
+Lemma morph_gact_irr A M :
+ A \subset D1 → M \subset R1 →
+ acts_irreducibly (f @* A) (h @* M) to2 = acts_irreducibly A M to1.
+ +
+End MorphGroupAction.
+ +
+
+ Conjugation and right translation actions.
+
+
+Section InternalActionDefs.
+ +
+Variable gT : finGroupType.
+Implicit Type A : {set gT}.
+Implicit Type G : {group gT}.
+ +
+
+
++ +
+Variable gT : finGroupType.
+Implicit Type A : {set gT}.
+Implicit Type G : {group gT}.
+ +
+
+ This is not a Canonical action because it is seldom used, and it would
+ cause too many spurious matches (any group product would be viewed as an
+ action!).
+
+
+Definition mulgr_action := TotalAction (@mulg1 gT) (@mulgA gT).
+ +
+Canonical conjg_action := TotalAction (@conjg1 gT) (@conjgM gT).
+ +
+Lemma conjg_is_groupAction : is_groupAction setT conjg_action.
+ +
+Canonical conjg_groupAction := GroupAction conjg_is_groupAction.
+ +
+Lemma rcoset_is_action : is_action setT (@rcoset gT).
+ +
+Canonical rcoset_action := Action rcoset_is_action.
+ +
+Canonical conjsg_action := TotalAction (@conjsg1 gT) (@conjsgM gT).
+ +
+Lemma conjG_is_action : is_action setT (@conjG_group gT).
+ +
+Definition conjG_action := Action conjG_is_action.
+ +
+End InternalActionDefs.
+ +
+Notation "'R" := (@mulgr_action _) (at level 8) : action_scope.
+Notation "'Rs" := (@rcoset_action _) (at level 8) : action_scope.
+Notation "'J" := (@conjg_action _) (at level 8) : action_scope.
+Notation "'J" := (@conjg_groupAction _) (at level 8) : groupAction_scope.
+Notation "'Js" := (@conjsg_action _) (at level 8) : action_scope.
+Notation "'JG" := (@conjG_action _) (at level 8) : action_scope.
+Notation "'Q" := ('J / _)%act (at level 8) : action_scope.
+Notation "'Q" := ('J / _)%gact (at level 8) : groupAction_scope.
+ +
+Section InternalGroupAction.
+ +
+Variable gT : finGroupType.
+Implicit Types A B : {set gT}.
+Implicit Types G H : {group gT}.
+Implicit Type x : gT.
+ +
+
+
++ +
+Canonical conjg_action := TotalAction (@conjg1 gT) (@conjgM gT).
+ +
+Lemma conjg_is_groupAction : is_groupAction setT conjg_action.
+ +
+Canonical conjg_groupAction := GroupAction conjg_is_groupAction.
+ +
+Lemma rcoset_is_action : is_action setT (@rcoset gT).
+ +
+Canonical rcoset_action := Action rcoset_is_action.
+ +
+Canonical conjsg_action := TotalAction (@conjsg1 gT) (@conjsgM gT).
+ +
+Lemma conjG_is_action : is_action setT (@conjG_group gT).
+ +
+Definition conjG_action := Action conjG_is_action.
+ +
+End InternalActionDefs.
+ +
+Notation "'R" := (@mulgr_action _) (at level 8) : action_scope.
+Notation "'Rs" := (@rcoset_action _) (at level 8) : action_scope.
+Notation "'J" := (@conjg_action _) (at level 8) : action_scope.
+Notation "'J" := (@conjg_groupAction _) (at level 8) : groupAction_scope.
+Notation "'Js" := (@conjsg_action _) (at level 8) : action_scope.
+Notation "'JG" := (@conjG_action _) (at level 8) : action_scope.
+Notation "'Q" := ('J / _)%act (at level 8) : action_scope.
+Notation "'Q" := ('J / _)%gact (at level 8) : groupAction_scope.
+ +
+Section InternalGroupAction.
+ +
+Variable gT : finGroupType.
+Implicit Types A B : {set gT}.
+Implicit Types G H : {group gT}.
+Implicit Type x : gT.
+ +
+
+ Various identities for actions on groups.
+
+
+
+
+Lemma orbitR G x : orbit 'R G x = x *: G.
+ +
+Lemma astab1R x : 'C[x | 'R] = 1.
+ +
+Lemma astabR G : 'C(G | 'R) = 1.
+ +
+Lemma astabsR G : 'N(G | 'R) = G.
+ +
+Lemma atransR G : [transitive G, on G | 'R].
+ +
+Lemma faithfulR G : [faithful G, on G | 'R].
+ +
+Definition Cayley_repr G := actperm <[atrans_acts (atransR G)]>.
+ +
+Theorem Cayley_isom G : isom G (Cayley_repr G @* G) (Cayley_repr G).
+ +
+Theorem Cayley_isog G : G \isog Cayley_repr G @* G.
+ +
+Lemma orbitJ G x : orbit 'J G x = x ^: G.
+ +
+Lemma afixJ A : 'Fix_('J)(A) = 'C(A).
+ +
+Lemma astabJ A : 'C(A |'J) = 'C(A).
+ +
+Lemma astab1J x : 'C[x |'J] = 'C[x].
+ +
+Lemma astabsJ A : 'N(A | 'J) = 'N(A).
+ +
+Lemma setactJ A x : 'J^*%act A x = A :^ x.
+ +
+Lemma gacentJ A : 'C_(|'J)(A) = 'C(A).
+ +
+Lemma orbitRs G A : orbit 'Rs G A = rcosets A G.
+ +
+Lemma sub_afixRs_norms G x A : (G :* x \in 'Fix_('Rs)(A)) = (A \subset G :^ x).
+ +
+Lemma sub_afixRs_norm G x : (G :* x \in 'Fix_('Rs)(G)) = (x \in 'N(G)).
+ +
+Lemma afixRs_rcosets A G : 'Fix_(rcosets G A | 'Rs)(G) = rcosets G 'N_A(G).
+ +
+Lemma astab1Rs G : 'C[G : {set gT} | 'Rs] = G.
+ +
+Lemma actsRs_rcosets H G : [acts G, on rcosets H G | 'Rs].
+ +
+Lemma transRs_rcosets H G : [transitive G, on rcosets H G | 'Rs].
+ +
+
+
++Lemma orbitR G x : orbit 'R G x = x *: G.
+ +
+Lemma astab1R x : 'C[x | 'R] = 1.
+ +
+Lemma astabR G : 'C(G | 'R) = 1.
+ +
+Lemma astabsR G : 'N(G | 'R) = G.
+ +
+Lemma atransR G : [transitive G, on G | 'R].
+ +
+Lemma faithfulR G : [faithful G, on G | 'R].
+ +
+Definition Cayley_repr G := actperm <[atrans_acts (atransR G)]>.
+ +
+Theorem Cayley_isom G : isom G (Cayley_repr G @* G) (Cayley_repr G).
+ +
+Theorem Cayley_isog G : G \isog Cayley_repr G @* G.
+ +
+Lemma orbitJ G x : orbit 'J G x = x ^: G.
+ +
+Lemma afixJ A : 'Fix_('J)(A) = 'C(A).
+ +
+Lemma astabJ A : 'C(A |'J) = 'C(A).
+ +
+Lemma astab1J x : 'C[x |'J] = 'C[x].
+ +
+Lemma astabsJ A : 'N(A | 'J) = 'N(A).
+ +
+Lemma setactJ A x : 'J^*%act A x = A :^ x.
+ +
+Lemma gacentJ A : 'C_(|'J)(A) = 'C(A).
+ +
+Lemma orbitRs G A : orbit 'Rs G A = rcosets A G.
+ +
+Lemma sub_afixRs_norms G x A : (G :* x \in 'Fix_('Rs)(A)) = (A \subset G :^ x).
+ +
+Lemma sub_afixRs_norm G x : (G :* x \in 'Fix_('Rs)(G)) = (x \in 'N(G)).
+ +
+Lemma afixRs_rcosets A G : 'Fix_(rcosets G A | 'Rs)(G) = rcosets G 'N_A(G).
+ +
+Lemma astab1Rs G : 'C[G : {set gT} | 'Rs] = G.
+ +
+Lemma actsRs_rcosets H G : [acts G, on rcosets H G | 'Rs].
+ +
+Lemma transRs_rcosets H G : [transitive G, on rcosets H G | 'Rs].
+ +
+
+ This is the second part of Aschbacher (5.7)
+
+
+Lemma astabRs_rcosets H G : 'C(rcosets H G | 'Rs) = gcore H G.
+ +
+Lemma orbitJs G A : orbit 'Js G A = A :^: G.
+ +
+Lemma astab1Js A : 'C[A | 'Js] = 'N(A).
+ +
+Lemma card_conjugates A G : #|A :^: G| = #|G : 'N_G(A)|.
+ +
+Lemma afixJG G A : (G \in 'Fix_('JG)(A)) = (A \subset 'N(G)).
+ +
+Lemma astab1JG G : 'C[G | 'JG] = 'N(G).
+ +
+Lemma dom_qactJ H : qact_dom 'J H = 'N(H).
+ +
+Lemma qactJ H (Hy : coset_of H) x :
+ 'Q%act Hy x = if x \in 'N(H) then Hy ^ coset H x else Hy.
+ +
+Lemma actsQ A B H :
+ A \subset 'N(H) → A \subset 'N(B) → [acts A, on B / H | 'Q].
+ +
+Lemma astabsQ G H : H <| G → 'N(G / H | 'Q) = 'N(H) :&: 'N(G).
+ +
+Lemma astabQ H Abar : 'C(Abar |'Q) = coset H @*^-1 'C(Abar).
+ +
+Lemma sub_astabQ A H Bbar :
+ (A \subset 'C(Bbar | 'Q)) = (A \subset 'N(H)) && (A / H \subset 'C(Bbar)).
+ +
+Lemma sub_astabQR A B H :
+ A \subset 'N(H) → B \subset 'N(H) →
+ (A \subset 'C(B / H | 'Q)) = ([~: A, B] \subset H).
+ +
+Lemma astabQR A H : A \subset 'N(H) →
+ 'C(A / H | 'Q) = [set x in 'N(H) | [~: [set x], A] \subset H].
+ +
+Lemma quotient_astabQ H Abar : 'C(Abar | 'Q) / H = 'C(Abar).
+ +
+Lemma conj_astabQ A H x :
+ x \in 'N(H) → 'C(A / H | 'Q) :^ x = 'C(A :^ x / H | 'Q).
+ +
+Section CardClass.
+ +
+Variable G : {group gT}.
+ +
+Lemma index_cent1 x : #|G : 'C_G[x]| = #|x ^: G|.
+ +
+Lemma classes_partition : partition (classes G) G.
+ +
+Lemma sum_card_class : \sum_(C in classes G) #|C| = #|G|.
+ +
+Lemma class_formula : \sum_(C in classes G) #|G : 'C_G[repr C]| = #|G|.
+ +
+Lemma abelian_classP : reflect {in G, ∀ x, x ^: G = [set x]} (abelian G).
+ +
+Lemma card_classes_abelian : abelian G = (#|classes G| == #|G|).
+ +
+End CardClass.
+ +
+End InternalGroupAction.
+ +
+Lemma gacentQ (gT : finGroupType) (H : {group gT}) (A : {set gT}) :
+ 'C_(|'Q)(A) = 'C(A / H).
+ +
+Section AutAct.
+ +
+Variable (gT : finGroupType) (G : {set gT}).
+ +
+Definition autact := act ('P \ subsetT (Aut G)).
+Canonical aut_action := [action of autact].
+ +
+Lemma autactK a : actperm aut_action a = a.
+ +
+Lemma autact_is_groupAction : is_groupAction G aut_action.
+ Canonical aut_groupAction := GroupAction autact_is_groupAction.
+ +
+End AutAct.
+ +
+Notation "[ 'Aut' G ]" := (aut_action G) : action_scope.
+Notation "[ 'Aut' G ]" := (aut_groupAction G) : groupAction_scope.
+ +
+
++ +
+Lemma orbitJs G A : orbit 'Js G A = A :^: G.
+ +
+Lemma astab1Js A : 'C[A | 'Js] = 'N(A).
+ +
+Lemma card_conjugates A G : #|A :^: G| = #|G : 'N_G(A)|.
+ +
+Lemma afixJG G A : (G \in 'Fix_('JG)(A)) = (A \subset 'N(G)).
+ +
+Lemma astab1JG G : 'C[G | 'JG] = 'N(G).
+ +
+Lemma dom_qactJ H : qact_dom 'J H = 'N(H).
+ +
+Lemma qactJ H (Hy : coset_of H) x :
+ 'Q%act Hy x = if x \in 'N(H) then Hy ^ coset H x else Hy.
+ +
+Lemma actsQ A B H :
+ A \subset 'N(H) → A \subset 'N(B) → [acts A, on B / H | 'Q].
+ +
+Lemma astabsQ G H : H <| G → 'N(G / H | 'Q) = 'N(H) :&: 'N(G).
+ +
+Lemma astabQ H Abar : 'C(Abar |'Q) = coset H @*^-1 'C(Abar).
+ +
+Lemma sub_astabQ A H Bbar :
+ (A \subset 'C(Bbar | 'Q)) = (A \subset 'N(H)) && (A / H \subset 'C(Bbar)).
+ +
+Lemma sub_astabQR A B H :
+ A \subset 'N(H) → B \subset 'N(H) →
+ (A \subset 'C(B / H | 'Q)) = ([~: A, B] \subset H).
+ +
+Lemma astabQR A H : A \subset 'N(H) →
+ 'C(A / H | 'Q) = [set x in 'N(H) | [~: [set x], A] \subset H].
+ +
+Lemma quotient_astabQ H Abar : 'C(Abar | 'Q) / H = 'C(Abar).
+ +
+Lemma conj_astabQ A H x :
+ x \in 'N(H) → 'C(A / H | 'Q) :^ x = 'C(A :^ x / H | 'Q).
+ +
+Section CardClass.
+ +
+Variable G : {group gT}.
+ +
+Lemma index_cent1 x : #|G : 'C_G[x]| = #|x ^: G|.
+ +
+Lemma classes_partition : partition (classes G) G.
+ +
+Lemma sum_card_class : \sum_(C in classes G) #|C| = #|G|.
+ +
+Lemma class_formula : \sum_(C in classes G) #|G : 'C_G[repr C]| = #|G|.
+ +
+Lemma abelian_classP : reflect {in G, ∀ x, x ^: G = [set x]} (abelian G).
+ +
+Lemma card_classes_abelian : abelian G = (#|classes G| == #|G|).
+ +
+End CardClass.
+ +
+End InternalGroupAction.
+ +
+Lemma gacentQ (gT : finGroupType) (H : {group gT}) (A : {set gT}) :
+ 'C_(|'Q)(A) = 'C(A / H).
+ +
+Section AutAct.
+ +
+Variable (gT : finGroupType) (G : {set gT}).
+ +
+Definition autact := act ('P \ subsetT (Aut G)).
+Canonical aut_action := [action of autact].
+ +
+Lemma autactK a : actperm aut_action a = a.
+ +
+Lemma autact_is_groupAction : is_groupAction G aut_action.
+ Canonical aut_groupAction := GroupAction autact_is_groupAction.
+ +
+End AutAct.
+ +
+Notation "[ 'Aut' G ]" := (aut_action G) : action_scope.
+Notation "[ 'Aut' G ]" := (aut_groupAction G) : groupAction_scope.
+ +
+