-
Notifications
You must be signed in to change notification settings - Fork 145
/
Copy pathSymmetricGroup.agda
90 lines (71 loc) · 3.11 KB
/
SymmetricGroup.agda
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
{-# OPTIONS --safe #-}
module Cubical.Algebra.SymmetricGroup where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Function
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.Univalence
open import Cubical.Foundations.Structure
open import Cubical.Data.Sigma
open import Cubical.Data.Nat
open import Cubical.Data.SumFin
open import Cubical.Data.Empty as Empty
open import Cubical.Data.Bool
open import Cubical.Data.Unit
open import Cubical.Algebra.Group
open import Cubical.Algebra.Group.Morphisms
open import Cubical.Algebra.Group.MorphismProperties
open import Cubical.Algebra.Group.GroupPath
open import Cubical.Algebra.Group.Instances.Bool
open import Cubical.Algebra.Group.Instances.Unit
private variable
ℓ ℓ' : Level
X Y : Type ℓ
SymGroup : (X : Type ℓ) → isSet X → Group ℓ
SymGroup X isSetX = makeGroup {G = X ≃ X} (idEquiv X) compEquiv invEquiv
(isOfHLevel≃ 2 isSetX isSetX)
compEquiv-assoc
compEquivEquivId
compEquivIdEquiv
invEquiv-is-rinv
invEquiv-is-linv
FinSymGroup : ℕ → Group₀
FinSymGroup n = SymGroup (Fin n) isSetFin
Sym0≃1 : GroupEquiv (FinSymGroup 0) UnitGroup₀
Sym0≃1 = contrGroupEquivUnit $ inhProp→isContr (idEquiv _) $ isOfHLevel≃ 1 isProp⊥ isProp⊥
Sym0≡1 : FinSymGroup 0 ≡ UnitGroup₀
Sym0≡1 = uaGroup Sym0≃1
Sym1≃1 : GroupEquiv (FinSymGroup 1) UnitGroup₀
Sym1≃1 = contrGroupEquivUnit $ isOfHLevel≃ 0 isContrSumFin1 isContrSumFin1
Sym1≡1 : FinSymGroup 1 ≡ UnitGroup₀
Sym1≡1 = uaGroup Sym1≃1
Sym2≃Bool : GroupEquiv (FinSymGroup 2) BoolGroup
Sym2≃Bool = GroupIso→GroupEquiv $ invGroupIso $ ≅Bool $
Fin 2 ≃ Fin 2 Iso⟨ equivCompIso SumFin2≃Bool SumFin2≃Bool ⟩
Bool ≃ Bool Iso⟨ invIso univalenceIso ⟩
Bool ≡ Bool Iso⟨ invIso reflectIso ⟩
Bool ∎Iso
where open BoolReflection
Sym2≡Bool : FinSymGroup 2 ≡ BoolGroup
Sym2≡Bool = uaGroup Sym2≃Bool
SymUnit≃Unit : GroupEquiv (SymGroup Unit isSetUnit) UnitGroup₀
SymUnit≃Unit = contrGroupEquivUnit $ isOfHLevel≃ 0 isContrUnit isContrUnit
SymUnit≡Unit : SymGroup Unit isSetUnit ≡ UnitGroup₀
SymUnit≡Unit = uaGroup SymUnit≃Unit
SymBool≃Bool : GroupEquiv (SymGroup Bool isSetBool) BoolGroup
SymBool≃Bool = GroupIso→GroupEquiv $ invGroupIso $ ≅Bool $
Bool ≃ Bool Iso⟨ invIso univalenceIso ⟩
Bool ≡ Bool Iso⟨ invIso reflectIso ⟩
Bool ∎Iso
where open BoolReflection
SymBool≡Bool : SymGroup Bool isSetBool ≡ BoolGroup
SymBool≡Bool = uaGroup SymBool≃Bool
module _ (n : ℕ) where
⟨Sym⟩≃factorial : ⟨ FinSymGroup n ⟩ ≃ Fin (n !)
⟨Sym⟩≃factorial = SumFin≃≃ n
⟨Sym⟩≡factorial : ⟨ FinSymGroup n ⟩ ≡ Fin (n !)
⟨Sym⟩≡factorial = ua ⟨Sym⟩≃factorial
Sym-cong-≃ : ∀ isSetX isSetY → X ≃ Y → GroupEquiv (SymGroup X isSetX) (SymGroup Y isSetY)
Sym-cong-≃ isSetX isSetY e .fst = equivComp e e
Sym-cong-≃ isSetX isSetY e .snd = makeIsGroupHom λ g h → sym $ equivEq $ funExt λ x → cong (e .fst ∘ h .fst) (retEq e _)