This file demonstrates how to use the equality between 𝓖 and RSymGroup 𝓖 to make proofs simpler.
Module header
{-# OPTIONS --safe --cubical #-}
module Groups.Properties.Test where
open import Cubical.Foundations.Prelude
open import Cubical.Algebra.Group
open import Groups.Symmetric.Representable
private
variable
ℓ ℓ′ : Level
The best way I have found to structure the proofs is to first list the properties we want to prove.
module _ {ℓ} (𝓖 : Group ℓ) where
open GroupStr (𝓖 .snd)
Cancellativeᵣ : Type ℓ
Cancellativeᵣ = ∀ g h z → g · z ≡ h · z → g ≡ h
Cancellativeₗ : Type ℓ
Cancellativeₗ = ∀ g h z → z · g ≡ z · h → g ≡ h
InvOfComp : Type ℓ
InvOfComp = ∀ g h → inv (g · h) ≡ inv h · inv g
InvInvolution : Type ℓ
InvInvolution = ∀ g → inv (inv g) ≡ g
InvUniqueRight : Type ℓ
InvUniqueRight = ∀ g h → g · h ≡ 1g → h ≡ inv g
InvUniqueLeft : Type ℓ
InvUniqueLeft = ∀ g h → h · g ≡ 1g → h ≡ inv g
We can then we can easily prove these using strictify.
module _ {ℓ} (𝓖 : Group ℓ) where
open import Groups.Reasoning 𝓖
cancelᵣ : Cancellativeᵣ 𝓖
cancelᵣ = strictify Cancellativeᵣ
λ g h z p → begin
g ∘⌊⌋ ≈˘⌊ ·InvR′ z ⌋
⌊ g ∘ z ⌋∘ (z ⁻¹) ≈⌊ p ⌋
h ∘⌊ z ∘ z ⁻¹ ⌋ ≈⌊ ·InvR′ z ⌋
h ∎′
cancelₗ : Cancellativeₗ 𝓖
cancelₗ = strictify Cancellativeₗ
λ g h z p → begin
⌊⌋∘ g ≈˘⌊ ·InvL′ z ⌋
z ⁻¹ ∘⌊ z ∘ g ⌋ ≈⌊ p ⌋
⌊ z ⁻¹ ∘ z ⌋∘ h ≈⌊ ·InvL′ z ⌋
h ∎′
inv-of-comp : InvOfComp 𝓖
inv-of-comp = strictify InvOfComp
λ g h → refl
inv-involution : InvInvolution 𝓖
inv-involution = strictify InvInvolution
λ g → refl
inv-unique-right : InvUniqueRight 𝓖
inv-unique-right = strictify InvUniqueRight
λ g h p → begin
⌊⌋∘ h ≈˘⌊ ·InvL′ g ⌋
g ⁻¹ ∘⌊ g ∘ h ⌋ ≈⌊ p ⌋
g ⁻¹ ∎′
inv-unique-left : InvUniqueLeft 𝓖
inv-unique-left = strictify InvUniqueLeft
λ g h p → begin
h ∘⌊⌋ ≈˘⌊ ·InvR′ g ⌋
⌊ h ∘ g ⌋∘ g ⁻¹ ≈⌊ p ⌋
g ⁻¹ ∎′