Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Algebra.Groups.Group. Require Import Algebra.Groups.Subgroup. Require Import Algebra.Groups.QuotientGroup. Require Import Spaces.Finite.Finite. Require Import Spaces.Nat.Core. (** ** Lagrange's theorem *) Local Open Scope mc_scope. Local Open Scope nat_scope.
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H

nat
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H

nat
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H

Finite (Quotient (in_cosetL H))
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H

Finite G
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
is_mere_relation G (in_cosetL H)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
Reflexive (in_cosetL H)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
Transitive (in_cosetL H)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
Symmetric (in_cosetL H)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
forall x y : G, Decidable (in_cosetL H x y)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H

forall x y : G, Decidable (in_cosetL H x y)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
x, y: G

Decidable (in_cosetL H x y)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
x, y: G
dec_H:= detachable_finite_subset H: forall x : G, Decidable (H x)

Decidable (in_cosetL H x y)
apply dec_H. Defined. (** Given a finite group G and a finite subgroup H of G, the order of H divides the order of G. Note that constructively, a subgroup of a finite group cannot be shown to be finite without exlcluded middle. We therefore have to assume it is. This in turn implies that the subgroup is decidable. *)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H

{d : nat & d * fcard H = fcard G}
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H

{d : nat & d * fcard H = fcard G}
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H

subgroup_index G H fin_G fin_H * fcard H = fcard G
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H

fcard G = subgroup_index G H fin_G fin_H * fcard H
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H

finadd (fun z : Quotient (in_cosetL H) => fcard {x : G & (fun x0 : G => trunctype_type (in_class (in_cosetL H) z x0)) x}) = subgroup_index G H fin_G fin_H * fcard H
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H

finadd (fun z : Quotient (in_cosetL H) => fcard {x : G & (fun x0 : G => trunctype_type (in_class (in_cosetL H) z x0)) x}) = finadd (fun _ : Quotient (in_cosetL H) => fcard H)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H

(fun z : Quotient (in_cosetL H) => fcard {x : G & (fun x0 : G => trunctype_type (in_class (in_cosetL H) z x0)) x}) == (fun _ : Quotient (in_cosetL H) => fcard H)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H

forall x : G, (fun q : Quotient (in_cosetL H) => (fun z : Quotient (in_cosetL H) => fcard {x0 : G & (fun x1 : G => trunctype_type (in_class (in_cosetL H) z x1)) x0}) q = (fun _ : Quotient (in_cosetL H) => fcard H) q) (class_of (in_cosetL H) x)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H

forall x : G, fcard {x0 : G & (fun x1 : G => H (sg_op (- x) x1)) x0} = fcard H
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
x: G

fcard {x0 : G & (fun x1 : G => H (sg_op (- x) x1)) x0} = fcard H
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
x: G

{x0 : G & H (sg_op (- x) x0)} <~> H
(** Now we must show that cosets are all equivalent as types. *)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
x: G

{x0 : G & H (sg_op (- x) x0)} <~> {x : _ & H x}
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
x: G

G -> G
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
x: G
IsEquiv ?f
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
x: G
forall a : G, (fun x0 : G => H (sg_op (- x) x0)) a -> H (?f a)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
x: G
forall a : G, IsEquiv (?g a)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
x: G

forall a : G, (fun x0 : G => H (sg_op (- x) x0)) a -> H (sg_op (- x) a)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
x: G
forall a : G, IsEquiv (?g a)
U: Univalence
G: Group
H: Subgroup G
fin_G: Finite G
fin_H: Finite H
x: G

forall a : G, IsEquiv (((fun a0 : G => idmap) : forall a0 : G, (fun x0 : G => H (sg_op (- x) x0)) a0 -> H (sg_op (- x) a0)) a)
exact _. Defined.
U: Univalence
G: Group
H: NormalSubgroup G
fin_G: Finite G
fin_H: Finite H

fcard (QuotientGroup G H) * fcard H = fcard G
U: Univalence
G: Group
H: NormalSubgroup G
fin_G: Finite G
fin_H: Finite H

fcard (QuotientGroup G H) * fcard H = fcard G
apply lagrange. Defined.