From ed05182cece6bb3706e09b2ce14af4a41a2e8141 Mon Sep 17 00:00:00 2001 From: Enrico Tassi Date: Fri, 20 Apr 2018 10:54:22 +0200 Subject: generate the documentation for 1.7 --- docs/htmldoc/mathcomp.fingroup.action.html | 2240 ++++++++++++++++++++++++++++ 1 file changed, 2240 insertions(+) create mode 100644 docs/htmldoc/mathcomp.fingroup.action.html (limited to 'docs/htmldoc/mathcomp.fingroup.action.html') diff --git a/docs/htmldoc/mathcomp.fingroup.action.html b/docs/htmldoc/mathcomp.fingroup.action.html new file mode 100644 index 0000000..4531510 --- /dev/null +++ b/docs/htmldoc/mathcomp.fingroup.action.html @@ -0,0 +1,2240 @@ + + + + + +mathcomp.fingroup.action + + + + +
+ + + +
+ +

Library mathcomp.fingroup.action

+ +
+(* (c) Copyright 2006-2016 Microsoft Corporation and Inria.                  
+ 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 kk 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.
+ +
+
+ +
+ 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.
+
+ +
+ 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.
+ +
+
+ +
+ Warning: this directive depends on names of bound variables in the + definition of injective, in ssrfun.v. +
+
+ +
+Notation "to ^*" := (set_action to) : action_scope.
+ +
+ +
+ +
+Section PartialAction.
+
+ +
+ 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 Cato 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|.
+ +
+
+ +
+ 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].
+ +
+
+ +
+ 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.
+ +
+
+ +
+ 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].
+ +
+
+ +
+ 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.
+ +
+
+ +
+ 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 aif (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.
+
+ +
+ 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.
+
+ +
+ 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 kk 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.
+ +
+
+ +
+ Conjugation and right translation actions. +
+
+Section InternalActionDefs.
+ +
+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.
+ +
+
+ +
+ 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].
+ +
+
+ +
+ 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.
+ +
+
+
+ + + +
+ + + \ No newline at end of file -- cgit v1.2.3